From fc58236a564c024ebe7fda5496c1b09f815c9c20 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Wed, 31 Jan 2024 00:04:48 +0100 Subject: fix(build): avoid cyclic dependency IntelliJ can handle dependencies between test configurations going in the reverse direction compared to dependencies between main configurations, but Eclipse can't. Manually copy some code over to break the reverse dependency. --- subprojects/language-semantics/build.gradle.kts | 1 - .../language/semantics/SolutionSerializerTest.java | 42 +++++++++++++++++----- 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/subprojects/language-semantics/build.gradle.kts b/subprojects/language-semantics/build.gradle.kts index 777ef993..689f621e 100644 --- a/subprojects/language-semantics/build.gradle.kts +++ b/subprojects/language-semantics/build.gradle.kts @@ -16,7 +16,6 @@ dependencies { api(project(":refinery-store-reasoning")) implementation(project(":refinery-store-reasoning-scope")) runtimeOnly(libs.eclipseCollections) - testImplementation(project(":refinery-generator")) testImplementation(project(":refinery-store-dse-visualization")) testImplementation(project(":refinery-store-query-interpreter")) testImplementation(testFixtures(project(":refinery-language"))) diff --git a/subprojects/language-semantics/src/test/java/tools/refinery/language/semantics/SolutionSerializerTest.java b/subprojects/language-semantics/src/test/java/tools/refinery/language/semantics/SolutionSerializerTest.java index 2d759c86..8ef449b0 100644 --- a/subprojects/language-semantics/src/test/java/tools/refinery/language/semantics/SolutionSerializerTest.java +++ b/subprojects/language-semantics/src/test/java/tools/refinery/language/semantics/SolutionSerializerTest.java @@ -6,19 +6,29 @@ package tools.refinery.language.semantics; import com.google.inject.Inject; +import com.google.inject.Provider; import org.eclipse.xtext.testing.InjectWith; import org.eclipse.xtext.testing.extensions.InjectionExtension; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import tools.refinery.generator.ModelGeneratorFactory; -import tools.refinery.generator.ProblemLoader; +import tools.refinery.language.model.tests.utils.ProblemParseHelper; import tools.refinery.language.tests.ProblemInjectorProvider; +import tools.refinery.store.dse.propagation.PropagationAdapter; +import tools.refinery.store.dse.strategy.BestFirstStoreManager; +import tools.refinery.store.dse.transition.DesignSpaceExplorationAdapter; +import tools.refinery.store.model.ModelStore; +import tools.refinery.store.query.interpreter.QueryInterpreterAdapter; +import tools.refinery.store.reasoning.ReasoningAdapter; +import tools.refinery.store.reasoning.ReasoningStoreAdapter; +import tools.refinery.store.reasoning.literal.Concreteness; +import tools.refinery.store.statecoding.StateCoderAdapter; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Map; +import java.util.Set; import java.util.stream.Stream; import static org.hamcrest.MatcherAssert.assertThat; @@ -28,21 +38,35 @@ import static org.hamcrest.Matchers.is; @InjectWith(ProblemInjectorProvider.class) class SolutionSerializerTest { @Inject - ProblemLoader loader; + private ProblemParseHelper parseHelper; @Inject - ModelGeneratorFactory generatorFactory; + private Provider initializerProvider; @Inject - SolutionSerializer serializer; + private Provider serializerProvider; @ParameterizedTest @MethodSource void solutionSerializerTest(String prefix, String input, String expectedOutput) throws IOException { - var problem = loader.loadString(prefix + "\n" + input); - var generator = generatorFactory.createGenerator(problem); - generator.generate(); - var solution = serializer.serializeSolution(generator.getProblemTrace(), generator.getModel()); + var problem = parseHelper.parse(prefix + "\n" + input).problem(); + var storeBuilder = ModelStore.builder() + .with(QueryInterpreterAdapter.builder()) + .with(PropagationAdapter.builder()) + .with(StateCoderAdapter.builder()) + .with(DesignSpaceExplorationAdapter.builder()) + .with(ReasoningAdapter.builder() + .requiredInterpretations(Set.of(Concreteness.CANDIDATE))); + var initializer = initializerProvider.get(); + var modelSeed = initializer.createModel(problem, storeBuilder); + var store = storeBuilder.build(); + var model = store.getAdapter(ReasoningStoreAdapter.class).createInitialModel(modelSeed); + var initialVersion = model.commit(); + var bestFirst = new BestFirstStoreManager(store, 1); + bestFirst.startExploration(initialVersion, 0); + model.restore(bestFirst.getSolutionStore().getSolutions().getFirst().version()); + var serializer = serializerProvider.get(); + var solution = serializer.serializeSolution(initializer.getProblemTrace(), model); String actualOutput; try (var outputStream = new ByteArrayOutputStream()) { solution.eResource().save(outputStream, Map.of()); -- cgit v1.2.3-54-g00ecf From c63126d2f1ce5f571c316b37e00fb43d2da7c7d3 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Wed, 31 Jan 2024 02:00:09 +0100 Subject: refactor(language): module and node declarations * New default file extension: .refinery (.problem is also supported). * Add module keyword for self-contained modules. * Rename indiv declarations to atom declaration. * Add node and multi declarations for explicitly declared nodes and multi-objects, respectively. --- subprojects/frontend/src/editor/EditorTheme.ts | 2 +- subprojects/frontend/src/language/problem.grammar | 13 +- .../src/language/problemLanguageSupport.ts | 11 +- .../ProblemSemanticHighlightingCalculator.java | 8 +- subprojects/language-model/problem.aird | 178 +++++++++++++++++---- .../src/main/resources/model/problem.ecore | 13 +- .../src/main/resources/model/problem.genmodel | 15 +- .../language/semantics/ModelInitializer.java | 120 ++++++++------ .../language/semantics/SolutionSerializer.java | 7 +- .../language/semantics/SolutionSerializerTest.java | 43 +++++ .../web/semantics/metadata/MetadataCreator.java | 8 +- .../ProblemWebSocketServletIntegrationTest.java | 2 +- .../web/xtext/servlet/TransactionExecutorTest.java | 2 +- .../tools/refinery/language/GenerateProblem.mwe2 | 2 +- .../java/tools/refinery/language/Problem.xtext | 17 +- .../language/formatting2/ProblemFormatter.java | 10 +- .../resource/ProblemLocationInFileProvider.java | 4 +- .../ProblemResourceDescriptionStrategy.java | 6 +- .../tools/refinery/language/utils/ProblemUtil.java | 20 ++- .../language/validation/ProblemValidator.java | 12 +- .../language/tests/ProblemParsingTest.java | 2 +- .../tests/formatting2/ProblemFormatterTest.java | 8 +- .../language/tests/scoping/NodeScopingTest.java | 26 +-- .../tests/serializer/ProblemSerializerTest.java | 18 ++- .../language/model/tests/utils/WrappedProblem.java | 5 +- 25 files changed, 391 insertions(+), 161 deletions(-) diff --git a/subprojects/frontend/src/editor/EditorTheme.ts b/subprojects/frontend/src/editor/EditorTheme.ts index 1cad4a36..f499b0d9 100644 --- a/subprojects/frontend/src/editor/EditorTheme.ts +++ b/subprojects/frontend/src/editor/EditorTheme.ts @@ -126,7 +126,7 @@ export default styled('div', { color: theme.palette.text.secondary, }, }, - '.tok-problem-individual': { + '.tok-problem-atom': { '&, & .tok-variableName': { color: theme.palette.text.primary, }, diff --git a/subprojects/frontend/src/language/problem.grammar b/subprojects/frontend/src/language/problem.grammar index ce3baa02..b08a9c36 100644 --- a/subprojects/frontend/src/language/problem.grammar +++ b/subprojects/frontend/src/language/problem.grammar @@ -28,7 +28,7 @@ statement { (":" Expr)? "." } | ProblemDeclaration { - kw<"problem"> QualifiedName "." + (ckw<"module"> | kw<"problem">) QualifiedName "." } | ClassDefinition { kw<"abstract">? kw<"class"> RelationName @@ -37,7 +37,7 @@ statement { } | EnumDefinition { kw<"enum"> RelationName - (EnumBody { "{" sep<",", IndividualNodeName> "}" } | ".") + (EnumBody { "{" sep<",", AtomNodeName> "}" } | ".") } | PredicateDefinition { ( @@ -56,8 +56,11 @@ statement { // RuleName ParameterList? // RuleBody { ":" sep "==>" sep "." } //} | - IndividualDeclaration { - kw<"indiv"> sep<",", IndividualNodeName> "." + AtomDeclaration { + ckw<"atom"> sep<",", AtomNodeName> "." + } | + NodeDeclaration { + (ckw<"node"> | ckw<"multi">) sep<",", NodeName> "." } | ScopeDeclaration { kw<"scope"> sep<",", ScopeElement> "." @@ -161,7 +164,7 @@ RelationName { QualifiedName ~name } //RuleName { QualifiedName } -IndividualNodeName { QualifiedName } +AtomNodeName { QualifiedName } VariableName[@dynamicPrecedence=10] { QualifiedName ~name } diff --git a/subprojects/frontend/src/language/problemLanguageSupport.ts b/subprojects/frontend/src/language/problemLanguageSupport.ts index 2121e05f..3847fdd8 100644 --- a/subprojects/frontend/src/language/problemLanguageSupport.ts +++ b/subprojects/frontend/src/language/problemLanguageSupport.ts @@ -27,7 +27,8 @@ const parserWithMetadata = parser.configure({ styleTags({ LineComment: t.lineComment, BlockComment: t.blockComment, - 'problem class enum pred fn indiv scope': t.definitionKeyword, + 'module problem class enum pred fn scope': t.definitionKeyword, + 'node atom multi': t.definitionKeyword, 'abstract extends refers contains container opposite': t.modifier, 'default error contained containment': t.modifier, 'true false unknown error': t.keyword, @@ -44,7 +45,7 @@ const parserWithMetadata = parser.configure({ String: t.string, 'RelationName/QualifiedName': t.typeName, // 'RuleName/QualifiedName': t.typeName, - 'IndividualNodeName/QualifiedName': t.atom, + 'AtomNodeName/QualifiedName': t.atom, 'VariableName/QualifiedName': t.variableName, '{ }': t.brace, '( )': t.paren, @@ -54,7 +55,8 @@ const parserWithMetadata = parser.configure({ }), indentNodeProp.add({ ProblemDeclaration: indentDeclaration, - UniqueDeclaration: indentDeclaration, + AtomDeclaration: indentDeclaration, + NodeDeclaration: indentDeclaration, ScopeDeclaration: indentDeclaration, PredicateBody: indentPredicateOrRule, FunctionBody: indentPredicateOrRule, @@ -70,7 +72,8 @@ const parserWithMetadata = parser.configure({ // RuleBody: foldInside, Conjunction: foldConjunction, // Consequent: foldWholeNode, - UniqueDeclaration: foldDeclaration, + AtomDeclaration: foldDeclaration, + NodeDeclaration: foldDeclaration, ScopeDeclaration: foldDeclaration, BlockComment: foldBlockComment, }), diff --git a/subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java b/subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java index f64d4066..94a61c4f 100644 --- a/subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java +++ b/subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java @@ -29,7 +29,7 @@ public class ProblemSemanticHighlightingCalculator extends DefaultSemanticHighli private static final String CONTAINMENT_CLASS = "containment"; private static final String ERROR_CLASS = "error"; private static final String NODE_CLASS = "node"; - private static final String INDIVIDUAL_NODE_CLASS = "individual"; + private static final String ATOM_NODE_CLASS = "atom"; private static final String NEW_NODE_CLASS = "new"; @Inject @@ -137,10 +137,10 @@ public class ProblemSemanticHighlightingCalculator extends DefaultSemanticHighli if (reference == ProblemPackage.Literals.VARIABLE_OR_NODE_EXPR__VARIABLE_OR_NODE) { classesBuilder.add(NODE_CLASS); } - if (ProblemUtil.isIndividualNode(node)) { - classesBuilder.add(INDIVIDUAL_NODE_CLASS); + if (ProblemUtil.isAtomNode(node)) { + classesBuilder.add(ATOM_NODE_CLASS); } - if (ProblemUtil.isNewNode(node)) { + if (ProblemUtil.isMultiNode(node)) { classesBuilder.add(NEW_NODE_CLASS); } } diff --git a/subprojects/language-model/problem.aird b/subprojects/language-model/problem.aird index a307ae83..a3420a04 100644 --- a/subprojects/language-model/problem.aird +++ b/subprojects/language-model/problem.aird @@ -1,25 +1,25 @@ - + src/main/resources/model/problem.ecore src/main/resources/model/problem.genmodel build/resources/main/model/problem.ecore build/resources/main/model/problem.genmodel - + - + - + - + @@ -31,6 +31,10 @@ + + + + @@ -216,11 +220,15 @@ + + + + - + @@ -432,6 +440,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -675,18 +721,18 @@ - + - + - + - - + + @@ -750,7 +796,7 @@ - + @@ -1332,10 +1378,18 @@ KEEP_LOCATION KEEP_SIZE KEEP_RATIO - + + + + + + + + + @@ -1728,12 +1782,12 @@ - + - + italic - + @@ -1857,32 +1911,40 @@ - - - + + + KEEP_LOCATION KEEP_SIZE KEEP_RATIO - + + + + + + + + + - - - + + + - + italic - + - - + + labelSize @@ -2560,6 +2622,68 @@ + + + + KEEP_LOCATION + KEEP_SIZE + KEEP_RATIO + + + + + + + + + + + + + + + + + + + + + + + + + KEEP_LOCATION + KEEP_SIZE + KEEP_RATIO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/subprojects/language-model/src/main/resources/model/problem.ecore b/subprojects/language-model/src/main/resources/model/problem.ecore index 74229a89..aa05a2fe 100644 --- a/subprojects/language-model/src/main/resources/model/problem.ecore +++ b/subprojects/language-model/src/main/resources/model/problem.ecore @@ -6,6 +6,7 @@ eType="#//Node" transient="true" containment="true"/> + @@ -109,9 +110,10 @@ - + + + + + + + + + + + diff --git a/subprojects/language-model/src/main/resources/model/problem.genmodel b/subprojects/language-model/src/main/resources/model/problem.genmodel index b5aa81c4..be8b62eb 100644 --- a/subprojects/language-model/src/main/resources/model/problem.genmodel +++ b/subprojects/language-model/src/main/resources/model/problem.genmodel @@ -64,9 +64,19 @@ + + + + + + + + + + @@ -144,8 +154,9 @@ - - + + + diff --git a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ModelInitializer.java b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ModelInitializer.java index 38bf5a61..b462fd70 100644 --- a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ModelInitializer.java +++ b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ModelInitializer.java @@ -169,9 +169,9 @@ public class ModelInitializer { private void collectNodes() { for (var statement : problem.getStatements()) { - if (statement instanceof IndividualDeclaration individualDeclaration) { - for (var individual : individualDeclaration.getNodes()) { - collectNode(individual); + if (statement instanceof NodeDeclaration nodeDeclaration) { + for (var node : nodeDeclaration.getNodes()) { + collectNode(node); } } else if (statement instanceof ClassDeclaration classDeclaration) { var newNode = classDeclaration.getNewNode(); @@ -355,10 +355,8 @@ public class ModelInitializer { collectClassDeclarationAssertions(classDeclaration); } else if (statement instanceof EnumDeclaration enumDeclaration) { collectEnumAssertions(enumDeclaration); - } else if (statement instanceof IndividualDeclaration individualDeclaration) { - for (var individual : individualDeclaration.getNodes()) { - collectIndividualAssertions(individual); - } + } else if (statement instanceof NodeDeclaration nodeDeclaration) { + collectNodeDeclarationAssertions(nodeDeclaration); } else if (statement instanceof Assertion assertion) { collectAssertion(assertion); } @@ -379,7 +377,7 @@ public class ModelInitializer { private void collectEnumAssertions(EnumDeclaration enumDeclaration) { var overlay = MutableSeed.of(1, null); for (var literal : enumDeclaration.getLiterals()) { - collectIndividualAssertions(literal); + collectCardinalityAssertions(literal, TruthValue.TRUE); var nodeId = getNodeId(literal); overlay.mergeValue(Tuple.of(nodeId), TruthValue.TRUE); } @@ -387,9 +385,25 @@ public class ModelInitializer { info.assertions().overwriteValues(overlay); } - private void collectIndividualAssertions(Node node) { + private void collectNodeDeclarationAssertions(NodeDeclaration nodeDeclaration) { + var kind = nodeDeclaration.getKind(); + TruthValue value; + switch (kind) { + case ATOM -> value = TruthValue.TRUE; + case MULTI -> value = TruthValue.UNKNOWN; + case NODE -> { + return; + } + default -> throw new IllegalArgumentException("Unknown node kind: " + kind); + } + for (var node : nodeDeclaration.getNodes()) { + collectCardinalityAssertions(node, value); + } + } + + private void collectCardinalityAssertions(Node node, TruthValue value) { var nodeId = getNodeId(node); - collectCardinalityAssertions(nodeId, TruthValue.TRUE); + collectCardinalityAssertions(nodeId, value); } private void collectCardinalityAssertions(int nodeId, TruthValue value) { @@ -587,47 +601,51 @@ public class ModelInitializer { private void toLiterals(Expr expr, Map localScope, List literals) { - if (expr instanceof LogicConstant logicConstant) { - switch (logicConstant.getLogicValue()) { - case TRUE -> literals.add(BooleanLiteral.TRUE); - case FALSE -> literals.add(BooleanLiteral.FALSE); - default -> throw new TracedException(logicConstant, "Unsupported literal"); - } - } else if (expr instanceof Atom atom) { - var target = getPartialRelation(atom.getRelation()); - var polarity = atom.isTransitiveClosure() ? CallPolarity.TRANSITIVE : CallPolarity.POSITIVE; - var argumentList = toArgumentList(atom.getArguments(), localScope, literals); - literals.add(target.call(polarity, argumentList)); - } else if (expr instanceof NegationExpr negationExpr) { - var body = negationExpr.getBody(); - if (!(body instanceof Atom atom)) { - throw new TracedException(body, "Cannot negate literal"); - } - var target = getPartialRelation(atom.getRelation()); - Constraint constraint; - if (atom.isTransitiveClosure()) { - constraint = Query.of(target.name() + "#transitive", (builder, p1, p2) -> builder.clause( - target.callTransitive(p1, p2) - )).getDnf(); - } else { - constraint = target; - } - var negatedScope = extendScope(localScope, negationExpr.getImplicitVariables()); - var argumentList = toArgumentList(atom.getArguments(), negatedScope, literals); - literals.add(constraint.call(CallPolarity.NEGATIVE, argumentList)); - } else if (expr instanceof ComparisonExpr comparisonExpr) { - var argumentList = toArgumentList(List.of(comparisonExpr.getLeft(), comparisonExpr.getRight()), - localScope, literals); - boolean positive = switch (comparisonExpr.getOp()) { - case EQ -> true; - case NOT_EQ -> false; - default -> throw new TracedException( - comparisonExpr, "Unsupported operator"); - }; - literals.add(new EquivalenceLiteral(positive, argumentList.get(0), argumentList.get(1))); - } else { - throw new TracedException(expr, "Unsupported literal"); - } + switch (expr) { + case LogicConstant logicConstant -> { + switch (logicConstant.getLogicValue()) { + case TRUE -> literals.add(BooleanLiteral.TRUE); + case FALSE -> literals.add(BooleanLiteral.FALSE); + default -> throw new TracedException(logicConstant, "Unsupported literal"); + } + } + case Atom atom -> { + var target = getPartialRelation(atom.getRelation()); + var polarity = atom.isTransitiveClosure() ? CallPolarity.TRANSITIVE : CallPolarity.POSITIVE; + var argumentList = toArgumentList(atom.getArguments(), localScope, literals); + literals.add(target.call(polarity, argumentList)); + } + case NegationExpr negationExpr -> { + var body = negationExpr.getBody(); + if (!(body instanceof Atom atom)) { + throw new TracedException(body, "Cannot negate literal"); + } + var target = getPartialRelation(atom.getRelation()); + Constraint constraint; + if (atom.isTransitiveClosure()) { + constraint = Query.of(target.name() + "#transitive", (builder, p1, p2) -> builder.clause( + target.callTransitive(p1, p2) + )).getDnf(); + } else { + constraint = target; + } + var negatedScope = extendScope(localScope, negationExpr.getImplicitVariables()); + var argumentList = toArgumentList(atom.getArguments(), negatedScope, literals); + literals.add(constraint.call(CallPolarity.NEGATIVE, argumentList)); + } + case ComparisonExpr comparisonExpr -> { + var argumentList = toArgumentList(List.of(comparisonExpr.getLeft(), comparisonExpr.getRight()), + localScope, literals); + boolean positive = switch (comparisonExpr.getOp()) { + case EQ -> true; + case NOT_EQ -> false; + default -> throw new TracedException( + comparisonExpr, "Unsupported operator"); + }; + literals.add(new EquivalenceLiteral(positive, argumentList.get(0), argumentList.get(1))); + } + default -> throw new TracedException(expr, "Unsupported literal"); + } } private List toArgumentList( diff --git a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SolutionSerializer.java b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SolutionSerializer.java index 09ba34fc..537d94ca 100644 --- a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SolutionSerializer.java +++ b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SolutionSerializer.java @@ -197,9 +197,10 @@ public class SolutionSerializer { var originalNode = pair.getOne(); int nodeId = pair.getTwo(); var newNode = findNode(originalNode); - // Since all implicit nodes that do not exist has already been remove in serializeSolution, - // we only need to add !exists assertions to ::new nodes (nodes marked as an individual must always exist). - if (ProblemUtil.isNewNode(originalNode)) { + // Since all implicit nodes that do not exist has already been removed in serializeSolution, + // we only need to add !exists assertions to ::new nodes and explicitly declared nodes that do not exist. + if (ProblemUtil.isMultiNode(originalNode) || + (ProblemUtil.isDeclaredNode(originalNode) && !isExistingNode(nodeId))) { sortedNewNodes.put(nodeId, newNode); } else { nodes.put(nodeId, newNode); diff --git a/subprojects/language-semantics/src/test/java/tools/refinery/language/semantics/SolutionSerializerTest.java b/subprojects/language-semantics/src/test/java/tools/refinery/language/semantics/SolutionSerializerTest.java index 8ef449b0..b682a7d6 100644 --- a/subprojects/language-semantics/src/test/java/tools/refinery/language/semantics/SolutionSerializerTest.java +++ b/subprojects/language-semantics/src/test/java/tools/refinery/language/semantics/SolutionSerializerTest.java @@ -183,6 +183,49 @@ class SolutionSerializerTest { !exists(Foo::new). Foo(a). default !ref(*, *). + """), Arguments.of(""" + atom a. + class Foo. + """, """ + Foo(a). + scope Foo += 0. + """, """ + !exists(Foo::new). + Foo(a). + """), Arguments.of(""" + multi a. + class Foo. + """, """ + Foo(a). + !exists(Foo::new). + scope Foo = 2. + """, """ + !exists(a). + !exists(Foo::new). + Foo(foo1). + Foo(foo2). + """), Arguments.of(""" + node a. + class Foo. + """, """ + Foo(a). + ?exists(a). + scope Foo = 2, Foo += 1. + """, """ + !exists(Foo::new). + Foo(a). + Foo(foo1). + """), Arguments.of(""" + node a. + class Foo. + """, """ + Foo(a). + ?exists(a). + scope Foo = 1, Foo += 1. + """, """ + !exists(a). + !exists(Foo::new). + Foo(foo1). """)); } } diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/MetadataCreator.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/MetadataCreator.java index f05abc45..1f49b0d0 100644 --- a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/MetadataCreator.java +++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/MetadataCreator.java @@ -87,14 +87,12 @@ public class MetadataCreator { } private NodeKind getNodeKind(Node node) { - if (ProblemUtil.isImplicitNode(node)) { - return NodeKind.IMPLICIT; - } else if (ProblemUtil.isIndividualNode(node)) { + if (ProblemUtil.isAtomNode(node)) { return NodeKind.INDIVIDUAL; - } else if (ProblemUtil.isNewNode(node)) { + } else if (ProblemUtil.isMultiNode(node)) { return NodeKind.NEW; } else { - throw new TracedException(node, "Unknown node type"); + return NodeKind.IMPLICIT; } } diff --git a/subprojects/language-web/src/test/java/tools/refinery/language/web/ProblemWebSocketServletIntegrationTest.java b/subprojects/language-web/src/test/java/tools/refinery/language/web/ProblemWebSocketServletIntegrationTest.java index 889a55cb..dd5d8a03 100644 --- a/subprojects/language-web/src/test/java/tools/refinery/language/web/ProblemWebSocketServletIntegrationTest.java +++ b/subprojects/language-web/src/test/java/tools/refinery/language/web/ProblemWebSocketServletIntegrationTest.java @@ -129,7 +129,7 @@ class ProblemWebSocketServletIntegrationTest { case 4 -> //noinspection TextBlockMigration session.sendText( "{\"id\":\"bar\",\"request\":{\"resource\":\"test.problem\",\"serviceType\":\"update\"," + - "\"requiredStateId\":\"-80000000\",\"deltaText\":\"indiv q.\nnode(q).\n\"," + + "\"requiredStateId\":\"-80000000\",\"deltaText\":\"atom q.\nnode(q).\n\"," + "\"deltaOffset\":\"0\",\"deltaReplaceLength\":\"0\"}}", Callback.NOOP ); diff --git a/subprojects/language-web/src/test/java/tools/refinery/language/web/xtext/servlet/TransactionExecutorTest.java b/subprojects/language-web/src/test/java/tools/refinery/language/web/xtext/servlet/TransactionExecutorTest.java index 22ce1b47..265723ff 100644 --- a/subprojects/language-web/src/test/java/tools/refinery/language/web/xtext/servlet/TransactionExecutorTest.java +++ b/subprojects/language-web/src/test/java/tools/refinery/language/web/xtext/servlet/TransactionExecutorTest.java @@ -97,7 +97,7 @@ class TransactionExecutorTest { var stateId = updateFullText(); var responseHandler = sendRequestAndWaitForAllResponses( new XtextWebRequest("bar", Map.of("resource", RESOURCE_NAME, "serviceType", "update", "requiredStateId", - stateId, "deltaText", "indiv q.\nnode(q).\n", "deltaOffset", "0", "deltaReplaceLength", + stateId, "deltaText", "atom q.\nnode(q).\n", "deltaOffset", "0", "deltaReplaceLength", "0"))); var captor = newCaptor(); diff --git a/subprojects/language/src/main/java/tools/refinery/language/GenerateProblem.mwe2 b/subprojects/language/src/main/java/tools/refinery/language/GenerateProblem.mwe2 index 59eba8f7..863e55d4 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/GenerateProblem.mwe2 +++ b/subprojects/language/src/main/java/tools/refinery/language/GenerateProblem.mwe2 @@ -51,7 +51,7 @@ Workflow { language = StandardLanguage { name = 'tools.refinery.language.Problem' - fileExtensions = 'problem' + fileExtensions = 'refinery,problem' referencedResource = 'platform:/resource/tools.refinery.refinery-language-model/model/problem.genmodel' serializer = { generateStub = false diff --git a/subprojects/language/src/main/java/tools/refinery/language/Problem.xtext b/subprojects/language/src/main/java/tools/refinery/language/Problem.xtext index 0fb96954..c5c42ebe 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/Problem.xtext +++ b/subprojects/language/src/main/java/tools/refinery/language/Problem.xtext @@ -9,13 +9,16 @@ import "http://www.eclipse.org/emf/2002/Ecore" as ecore import "https://refinery.tools/emf/2021/Problem" Problem: - ("problem" name=Identifier ".")? + (kind=ModuleKind name=QualifiedName? ".")? statements+=Statement*; +enum ModuleKind: + PROBLEM="problem" | MODULE="module"; + Statement: Assertion | ClassDeclaration | EnumDeclaration | PredicateDefinition | /* FunctionDefinition | RuleDefinition | */ - ScopeDeclaration | IndividualDeclaration; + ScopeDeclaration | NodeDeclaration; ClassDeclaration: abstract?="abstract"? "class" @@ -252,8 +255,11 @@ RangeMultiplicity: ExactMultiplicity: exactValue=INT; -IndividualDeclaration: - "indiv" nodes+=EnumLiteral ("," nodes+=EnumLiteral)* "."; +NodeDeclaration: + kind=NodeKind nodes+=EnumLiteral ("," nodes+=EnumLiteral)* "."; + +enum NodeKind: + NODE="node" | ATOM="atom" | MULTI="multi"; UpperBound returns ecore::EInt: INT | "*"; @@ -268,7 +274,8 @@ Identifier: NonContainmentIdentifier | "contains" | "container"; NonContainmentIdentifier: - ID | "contained" | "sum" | "prod" | "min" | "max"; + ID | "node" | "atom" | "multi" | "contained" | + "sum" | "prod" | "min" | "max" | "problem" | "module"; Real returns ecore::EDouble: EXPONENTIAL | INT "." (INT | EXPONENTIAL); diff --git a/subprojects/language/src/main/java/tools/refinery/language/formatting2/ProblemFormatter.java b/subprojects/language/src/main/java/tools/refinery/language/formatting2/ProblemFormatter.java index 0f3bd3ee..0b87e8bb 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/formatting2/ProblemFormatter.java +++ b/subprojects/language/src/main/java/tools/refinery/language/formatting2/ProblemFormatter.java @@ -23,7 +23,7 @@ public class ProblemFormatter extends AbstractJavaFormatter { protected void format(Problem problem, IFormattableDocument doc) { doc.prepend(problem, this::noSpace); var region = regionFor(problem); - doc.append(region.keyword("problem"), this::oneSpace); + doc.append(region.feature(ProblemPackage.Literals.PROBLEM__KIND), this::oneSpace); doc.prepend(region.keyword("."), this::noSpace); appendNewLines(doc, region.keyword("."), this::twoNewLines); for (var statement : problem.getStatements()) { @@ -132,10 +132,10 @@ public class ProblemFormatter extends AbstractJavaFormatter { } } - protected void format(IndividualDeclaration individualDeclaration, IFormattableDocument doc) { - surroundNewLines(doc, individualDeclaration, this::singleNewLine); - var region = regionFor(individualDeclaration); - doc.append(region.keyword("indiv"), this::oneSpace); + protected void format(NodeDeclaration nodeDeclaration, IFormattableDocument doc) { + surroundNewLines(doc, nodeDeclaration, this::singleNewLine); + var region = regionFor(nodeDeclaration); + doc.append(region.feature(ProblemPackage.Literals.NODE_DECLARATION__KIND), this::oneSpace); formatList(region, ",", doc); doc.prepend(region.keyword("."), this::noSpace); } diff --git a/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemLocationInFileProvider.java b/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemLocationInFileProvider.java index 29eaad84..c81431e5 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemLocationInFileProvider.java +++ b/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemLocationInFileProvider.java @@ -25,10 +25,10 @@ public class ProblemLocationInFileProvider extends DefaultLocationInFileProvider } protected ITextRegion getNodeTextRegion(Node node, RegionDescription query) { - if (ProblemUtil.isIndividualNode(node)) { + if (ProblemUtil.isDeclaredNode(node)) { return super.doGetTextRegion(node, query); } - if (ProblemUtil.isNewNode(node)) { + if (ProblemUtil.isMultiNode(node)) { EObject container = node.eContainer(); return doGetTextRegion(container, query); } diff --git a/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java b/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java index c04c7d09..79dad6e7 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java +++ b/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java @@ -91,8 +91,7 @@ public class ProblemResourceDescriptionStrategy extends DefaultResourceDescripti return false; } if (eObject instanceof Node node) { - // Only enum literals and new nodes are visible across problem files. - return ProblemUtil.isIndividualNode(node) || ProblemUtil.isNewNode(node); + return !ProblemUtil.isImplicitNode(node); } return true; } @@ -111,7 +110,7 @@ public class ProblemResourceDescriptionStrategy extends DefaultResourceDescripti protected boolean shouldExportSimpleName(EObject eObject) { if (eObject instanceof Node node) { - return !ProblemUtil.isNewNode(node); + return !ProblemUtil.isMultiNode(node); } if (eObject instanceof PredicateDefinition predicateDefinition) { return !ProblemUtil.isInvalidMultiplicityConstraint(predicateDefinition); @@ -146,6 +145,5 @@ public class ProblemResourceDescriptionStrategy extends DefaultResourceDescripti return false; } return eObject instanceof ClassDeclaration || eObject instanceof EnumDeclaration; - } } diff --git a/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemUtil.java b/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemUtil.java index 7b6407e1..ee0e141d 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemUtil.java +++ b/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemUtil.java @@ -54,14 +54,24 @@ public final class ProblemUtil { return eObject instanceof PredicateDefinition predicateDefinition && predicateDefinition.isError(); } - public static boolean isIndividualNode(Node node) { + public static boolean isAtomNode(Node node) { var containingFeature = node.eContainingFeature(); - return containingFeature == ProblemPackage.Literals.INDIVIDUAL_DECLARATION__NODES - || containingFeature == ProblemPackage.Literals.ENUM_DECLARATION__LITERALS; + if (containingFeature == ProblemPackage.Literals.NODE_DECLARATION__NODES) { + return ((NodeDeclaration) node.eContainer()).getKind() == NodeKind.ATOM; + } + return containingFeature == ProblemPackage.Literals.ENUM_DECLARATION__LITERALS; + } + + public static boolean isMultiNode(Node node) { + var containingFeature = node.eContainingFeature(); + if (containingFeature == ProblemPackage.Literals.NODE_DECLARATION__NODES) { + return ((NodeDeclaration) node.eContainer()).getKind() == NodeKind.MULTI; + } + return containingFeature == ProblemPackage.Literals.CLASS_DECLARATION__NEW_NODE; } - public static boolean isNewNode(Node node) { - return node.eContainingFeature() == ProblemPackage.Literals.CLASS_DECLARATION__NEW_NODE; + public static boolean isDeclaredNode(Node node) { + return node.eContainingFeature() == ProblemPackage.Literals.NODE_DECLARATION__NODES; } public static boolean isInvalidMultiplicityConstraint(PredicateDefinition predicateDefinition) { diff --git a/subprojects/language/src/main/java/tools/refinery/language/validation/ProblemValidator.java b/subprojects/language/src/main/java/tools/refinery/language/validation/ProblemValidator.java index 8bda4b95..a95e8b3c 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/validation/ProblemValidator.java +++ b/subprojects/language/src/main/java/tools/refinery/language/validation/ProblemValidator.java @@ -84,7 +84,7 @@ public class ProblemValidator extends AbstractProblemValidator { @Check public void checkNodeConstants(VariableOrNodeExpr expr) { var variableOrNode = expr.getVariableOrNode(); - if (variableOrNode instanceof Node node && !ProblemUtil.isIndividualNode(node)) { + if (variableOrNode instanceof Node node && !ProblemUtil.isAtomNode(node)) { var name = node.getName(); var message = ("Only individuals can be referenced in predicates. " + "Mark '%s' as individual with the declaration 'indiv %s.'").formatted(name, name); @@ -96,16 +96,16 @@ public class ProblemValidator extends AbstractProblemValidator { @Check public void checkUniqueDeclarations(Problem problem) { var relations = new ArrayList(); - var individuals = new ArrayList(); + var nodes = new ArrayList(); for (var statement : problem.getStatements()) { if (statement instanceof Relation relation) { relations.add(relation); - } else if (statement instanceof IndividualDeclaration individualDeclaration) { - individuals.addAll(individualDeclaration.getNodes()); + } else if (statement instanceof NodeDeclaration nodeDeclaration) { + nodes.addAll(nodeDeclaration.getNodes()); } } checkUniqueSimpleNames(relations); - checkUniqueSimpleNames(individuals); + checkUniqueSimpleNames(nodes); } @Check @@ -362,7 +362,7 @@ public class ProblemValidator extends AbstractProblemValidator { return; } var node = getNodeArgumentForMultiObjectAssertion(arguments.get(0)); - if (node != null && !node.eIsProxy() && ProblemUtil.isIndividualNode(node)) { + if (node != null && !node.eIsProxy() && ProblemUtil.isAtomNode(node)) { acceptError("Individual nodes must exist.", assertion, null, 0, UNSUPPORTED_ASSERTION_ISSUE); } } diff --git a/subprojects/language/src/test/java/tools/refinery/language/tests/ProblemParsingTest.java b/subprojects/language/src/test/java/tools/refinery/language/tests/ProblemParsingTest.java index 72d57f54..17ae5fbb 100644 --- a/subprojects/language/src/test/java/tools/refinery/language/tests/ProblemParsingTest.java +++ b/subprojects/language/src/test/java/tools/refinery/language/tests/ProblemParsingTest.java @@ -42,7 +42,7 @@ class ProblemParsingTest { error invalidTaxStatus(Person p) <-> taxStatus(p, CHILD), children(p, _q). - indiv family. + atom family. Family(family). members(family, anne): true. members(family, bob). diff --git a/subprojects/language/src/test/java/tools/refinery/language/tests/formatting2/ProblemFormatterTest.java b/subprojects/language/src/test/java/tools/refinery/language/tests/formatting2/ProblemFormatterTest.java index f688d970..4a15f9de 100644 --- a/subprojects/language/src/test/java/tools/refinery/language/tests/formatting2/ProblemFormatterTest.java +++ b/subprojects/language/src/test/java/tools/refinery/language/tests/formatting2/ProblemFormatterTest.java @@ -183,8 +183,8 @@ class ProblemFormatterTest { } @Test - void individualDeclarationTest() { - testFormatter(" indiv a , b . ", "indiv a, b.\n"); + void atomDeclarationTest() { + testFormatter(" atom a , b . ", "atom a, b.\n"); } @Test @@ -194,7 +194,7 @@ class ProblemFormatterTest { pred foo(node a). class Foo. foo(n1, n2). - indiv i1. + atom i1. !foo(i1, n1). pred bar(node a, node b). pred quux(). @@ -207,7 +207,7 @@ class ProblemFormatterTest { class Foo. foo(n1, n2). - indiv i1. + atom i1. !foo(i1, n1). pred bar(node a, node b). diff --git a/subprojects/language/src/test/java/tools/refinery/language/tests/scoping/NodeScopingTest.java b/subprojects/language/src/test/java/tools/refinery/language/tests/scoping/NodeScopingTest.java index e76d2993..bc0320a6 100644 --- a/subprojects/language/src/test/java/tools/refinery/language/tests/scoping/NodeScopingTest.java +++ b/subprojects/language/src/test/java/tools/refinery/language/tests/scoping/NodeScopingTest.java @@ -69,35 +69,35 @@ class NodeScopingTest { } @ParameterizedTest - @MethodSource("individualNodeReferenceSource") - void individualNodeInAssertionTest(String qualifiedNamePrefix, boolean namedProblem) { + @MethodSource("atomNodeReferenceSource") + void atomNodeInAssertionTest(String qualifiedNamePrefix, boolean namedProblem) { var problem = parse(""" - indiv a, b. + atom a, b. pred predicate(node x, node y) <-> node(x). predicate({PARAM}a, {PARAM}a). ?predicate({PARAM}a, {PARAM}b). """, qualifiedNamePrefix, namedProblem); assertThat(problem.getResourceErrors(), empty()); assertThat(problem.nodeNames(), empty()); - assertThat(problem.assertion(0).arg(0).node(), equalTo(problem.individualNode("a"))); - assertThat(problem.assertion(0).arg(1).node(), equalTo(problem.individualNode("a"))); - assertThat(problem.assertion(1).arg(0).node(), equalTo(problem.individualNode("a"))); - assertThat(problem.assertion(1).arg(1).node(), equalTo(problem.individualNode("b"))); + assertThat(problem.assertion(0).arg(0).node(), equalTo(problem.atomNode("a"))); + assertThat(problem.assertion(0).arg(1).node(), equalTo(problem.atomNode("a"))); + assertThat(problem.assertion(1).arg(0).node(), equalTo(problem.atomNode("a"))); + assertThat(problem.assertion(1).arg(1).node(), equalTo(problem.atomNode("b"))); } @ParameterizedTest - @MethodSource("individualNodeReferenceSource") - void individualNodeInPredicateTest(String qualifiedNamePrefix, boolean namedProblem) { + @MethodSource("atomNodeReferenceSource") + void atomNodeInPredicateTest(String qualifiedNamePrefix, boolean namedProblem) { var problem = parse(""" - indiv b. + atom b. pred predicate(node a) <-> node({PARAM}b). - """); + """, qualifiedNamePrefix, namedProblem); assertThat(problem.getResourceErrors(), empty()); assertThat(problem.nodeNames(), empty()); - assertThat(problem.pred("predicate").conj(0).lit(0).arg(0).node(), equalTo(problem.individualNode("b"))); + assertThat(problem.pred("predicate").conj(0).lit(0).arg(0).node(), equalTo(problem.atomNode("b"))); } - static Stream individualNodeReferenceSource() { + static Stream atomNodeReferenceSource() { return Stream.of(Arguments.of("", false), Arguments.of("", true), Arguments.of("test::", true)); } diff --git a/subprojects/language/src/test/java/tools/refinery/language/tests/serializer/ProblemSerializerTest.java b/subprojects/language/src/test/java/tools/refinery/language/tests/serializer/ProblemSerializerTest.java index 65675b6b..ad583f8e 100644 --- a/subprojects/language/src/test/java/tools/refinery/language/tests/serializer/ProblemSerializerTest.java +++ b/subprojects/language/src/test/java/tools/refinery/language/tests/serializer/ProblemSerializerTest.java @@ -56,15 +56,16 @@ class ProblemSerializerTest { var pred = createPred(); var node = ProblemFactory.eINSTANCE.createNode(); node.setName("a"); - var individualDeclaration = ProblemFactory.eINSTANCE.createIndividualDeclaration(); - individualDeclaration.getNodes().add(node); - problem.getStatements().add(individualDeclaration); + var atomDeclaration = ProblemFactory.eINSTANCE.createNodeDeclaration(); + atomDeclaration.setKind(NodeKind.ATOM); + atomDeclaration.getNodes().add(node); + problem.getStatements().add(atomDeclaration); createAssertion(pred, node, value); assertSerializedResult(""" pred foo(node p). - indiv a. + atom a. """ + serializedAssertion + "\n"); } @@ -79,15 +80,16 @@ class ProblemSerializerTest { var pred = createPred(); var node = ProblemFactory.eINSTANCE.createNode(); node.setName("a"); - var individualDeclaration = ProblemFactory.eINSTANCE.createIndividualDeclaration(); - individualDeclaration.getNodes().add(node); - problem.getStatements().add(individualDeclaration); + var atomDeclaration = ProblemFactory.eINSTANCE.createNodeDeclaration(); + atomDeclaration.setKind(NodeKind.ATOM); + atomDeclaration.getNodes().add(node); + problem.getStatements().add(atomDeclaration); createAssertion(pred, node, value, true); assertSerializedResult(""" pred foo(node p). - indiv a. + atom a. default\040""" + serializedAssertion + "\n"); } diff --git a/subprojects/language/src/testFixtures/java/tools/refinery/language/model/tests/utils/WrappedProblem.java b/subprojects/language/src/testFixtures/java/tools/refinery/language/model/tests/utils/WrappedProblem.java index fc51ff57..58bfce44 100644 --- a/subprojects/language/src/testFixtures/java/tools/refinery/language/model/tests/utils/WrappedProblem.java +++ b/subprojects/language/src/testFixtures/java/tools/refinery/language/model/tests/utils/WrappedProblem.java @@ -67,8 +67,9 @@ public record WrappedProblem(Problem problem) { return ProblemNavigationUtil.named(problem.getNodes(), name); } - public Node individualNode(String name) { - var uniqueNodes = statementsOfType(IndividualDeclaration.class) + public Node atomNode(String name) { + var uniqueNodes = statementsOfType(NodeDeclaration.class) + .filter(declaration -> declaration.getKind() == NodeKind.ATOM) .flatMap(declaration -> declaration.getNodes().stream()); return ProblemNavigationUtil.named(uniqueNodes, name); } -- cgit v1.2.3-54-g00ecf From a2a92561f7b612b472b5b7e49a2d5ca86802092f Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Wed, 31 Jan 2024 17:10:28 +0100 Subject: feat(language): validate module isolation --- subprojects/frontend/src/language/problem.grammar | 4 +- .../src/language/problemLanguageSupport.ts | 2 +- .../java/tools/refinery/language/Problem.xtext | 7 +- .../language/formatting2/ProblemFormatter.java | 3 +- .../tools/refinery/language/utils/ProblemUtil.java | 6 + .../language/validation/ProblemValidator.java | 46 +++++-- .../tests/validation/AssertionValidationTest.java | 1 - .../tests/validation/ModuleValidationTest.java | 145 +++++++++++++++++++++ 8 files changed, 198 insertions(+), 16 deletions(-) create mode 100644 subprojects/language/src/test/java/tools/refinery/language/tests/validation/ModuleValidationTest.java diff --git a/subprojects/frontend/src/language/problem.grammar b/subprojects/frontend/src/language/problem.grammar index b08a9c36..ac451e7a 100644 --- a/subprojects/frontend/src/language/problem.grammar +++ b/subprojects/frontend/src/language/problem.grammar @@ -57,10 +57,10 @@ statement { // RuleBody { ":" sep "==>" sep "." } //} | AtomDeclaration { - ckw<"atom"> sep<",", AtomNodeName> "." + kw<"declare">? ckw<"atom"> sep<",", AtomNodeName> "." } | NodeDeclaration { - (ckw<"node"> | ckw<"multi">) sep<",", NodeName> "." + (kw<"declare"> | kw<"declare">? ckw<"multi">) sep<",", NodeName> "." } | ScopeDeclaration { kw<"scope"> sep<",", ScopeElement> "." diff --git a/subprojects/frontend/src/language/problemLanguageSupport.ts b/subprojects/frontend/src/language/problemLanguageSupport.ts index 3847fdd8..2483c2e3 100644 --- a/subprojects/frontend/src/language/problemLanguageSupport.ts +++ b/subprojects/frontend/src/language/problemLanguageSupport.ts @@ -28,7 +28,7 @@ const parserWithMetadata = parser.configure({ LineComment: t.lineComment, BlockComment: t.blockComment, 'module problem class enum pred fn scope': t.definitionKeyword, - 'node atom multi': t.definitionKeyword, + 'declare atom multi': t.definitionKeyword, 'abstract extends refers contains container opposite': t.modifier, 'default error contained containment': t.modifier, 'true false unknown error': t.keyword, diff --git a/subprojects/language/src/main/java/tools/refinery/language/Problem.xtext b/subprojects/language/src/main/java/tools/refinery/language/Problem.xtext index c5c42ebe..4ce3fae1 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/Problem.xtext +++ b/subprojects/language/src/main/java/tools/refinery/language/Problem.xtext @@ -256,10 +256,11 @@ ExactMultiplicity: exactValue=INT; NodeDeclaration: - kind=NodeKind nodes+=EnumLiteral ("," nodes+=EnumLiteral)* "."; + ("declare" | "declare"? kind=NodeKind) + nodes+=EnumLiteral ("," nodes+=EnumLiteral)* "."; enum NodeKind: - NODE="node" | ATOM="atom" | MULTI="multi"; + ATOM="atom" | MULTI="multi"; UpperBound returns ecore::EInt: INT | "*"; @@ -274,7 +275,7 @@ Identifier: NonContainmentIdentifier | "contains" | "container"; NonContainmentIdentifier: - ID | "node" | "atom" | "multi" | "contained" | + ID | "atom" | "multi" | "contained" | "sum" | "prod" | "min" | "max" | "problem" | "module"; Real returns ecore::EDouble: diff --git a/subprojects/language/src/main/java/tools/refinery/language/formatting2/ProblemFormatter.java b/subprojects/language/src/main/java/tools/refinery/language/formatting2/ProblemFormatter.java index 0b87e8bb..d6ece1ea 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/formatting2/ProblemFormatter.java +++ b/subprojects/language/src/main/java/tools/refinery/language/formatting2/ProblemFormatter.java @@ -23,7 +23,7 @@ public class ProblemFormatter extends AbstractJavaFormatter { protected void format(Problem problem, IFormattableDocument doc) { doc.prepend(problem, this::noSpace); var region = regionFor(problem); - doc.append(region.feature(ProblemPackage.Literals.PROBLEM__KIND), this::oneSpace); + doc.prepend(region.feature(ProblemPackage.Literals.NAMED_ELEMENT__NAME), this::oneSpace); doc.prepend(region.keyword("."), this::noSpace); appendNewLines(doc, region.keyword("."), this::twoNewLines); for (var statement : problem.getStatements()) { @@ -135,6 +135,7 @@ public class ProblemFormatter extends AbstractJavaFormatter { protected void format(NodeDeclaration nodeDeclaration, IFormattableDocument doc) { surroundNewLines(doc, nodeDeclaration, this::singleNewLine); var region = regionFor(nodeDeclaration); + doc.append(region.keyword("declare"), this::oneSpace); doc.append(region.feature(ProblemPackage.Literals.NODE_DECLARATION__KIND), this::oneSpace); formatList(region, ",", doc); doc.prepend(region.keyword("."), this::noSpace); diff --git a/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemUtil.java b/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemUtil.java index ee0e141d..0f87c04b 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemUtil.java +++ b/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemUtil.java @@ -8,6 +8,7 @@ package tools.refinery.language.utils; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.util.EcoreUtil; +import org.eclipse.xtext.EcoreUtil2; import tools.refinery.language.model.problem.*; public final class ProblemUtil { @@ -126,6 +127,11 @@ public final class ProblemUtil { }; } + public static boolean isInModule(EObject eObject) { + var problem = EcoreUtil2.getContainerOfType(eObject, Problem.class); + return problem != null && problem.getKind() == ModuleKind.MODULE; + } + private static URI getLibraryUri() { var libraryResource = ProblemUtil.class.getClassLoader() .getResource("tools/refinery/language/%s.problem".formatted(BUILTIN_LIBRARY_NAME)); diff --git a/subprojects/language/src/main/java/tools/refinery/language/validation/ProblemValidator.java b/subprojects/language/src/main/java/tools/refinery/language/validation/ProblemValidator.java index a95e8b3c..4cbb02c2 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/validation/ProblemValidator.java +++ b/subprojects/language/src/main/java/tools/refinery/language/validation/ProblemValidator.java @@ -86,8 +86,8 @@ public class ProblemValidator extends AbstractProblemValidator { var variableOrNode = expr.getVariableOrNode(); if (variableOrNode instanceof Node node && !ProblemUtil.isAtomNode(node)) { var name = node.getName(); - var message = ("Only individuals can be referenced in predicates. " + - "Mark '%s' as individual with the declaration 'indiv %s.'").formatted(name, name); + var message = ("Only atoms can be referenced in predicates. " + + "Mark '%s' as an atom with the declaration 'atom %s.'").formatted(name, name); error(message, expr, ProblemPackage.Literals.VARIABLE_OR_NODE_EXPR__VARIABLE_OR_NODE, INSIGNIFICANT_INDEX, NODE_CONSTANT_ISSUE); } @@ -302,6 +302,10 @@ public class ProblemValidator extends AbstractProblemValidator { @Check public void checkTypeScope(TypeScope typeScope) { checkArity(typeScope, ProblemPackage.Literals.TYPE_SCOPE__TARGET_TYPE, 1); + if (typeScope.isIncrement() && ProblemUtil.isInModule(typeScope)) { + acceptError("Incremental type scopes are not supported in modules", typeScope, null, 0, + INVALID_MULTIPLICITY_ISSUE); + } } private void checkArity(EObject eObject, EReference reference, int expectedArity) { @@ -351,9 +355,9 @@ public class ProblemValidator extends AbstractProblemValidator { } private void checkExistsAssertion(Assertion assertion, LogicValue value) { - if (value == LogicValue.TRUE || value == LogicValue.UNKNOWN) { - // {@code true} is always a valid value for {@code exists}, while {@code unknown} values may always be - // refined to {@code true} if necessary (e.g., for individual nodes). + if (value == LogicValue.UNKNOWN) { + // {@code unknown} values may always be refined to {@code true} of {@code false} if necessary (e.g., for + // atom nodes or removed multi-objects). return; } var arguments = assertion.getArguments(); @@ -361,9 +365,16 @@ public class ProblemValidator extends AbstractProblemValidator { // We already report an error on invalid arity. return; } - var node = getNodeArgumentForMultiObjectAssertion(arguments.get(0)); - if (node != null && !node.eIsProxy() && ProblemUtil.isAtomNode(node)) { - acceptError("Individual nodes must exist.", assertion, null, 0, UNSUPPORTED_ASSERTION_ISSUE); + var node = getNodeArgumentForMultiObjectAssertion(arguments.getFirst()); + if (node == null || node.eIsProxy()) { + return; + } + if (ProblemUtil.isAtomNode(node) && value != LogicValue.TRUE) { + acceptError("Atom nodes must exist.", assertion, null, 0, UNSUPPORTED_ASSERTION_ISSUE); + } + if (ProblemUtil.isMultiNode(node) && value != LogicValue.FALSE && ProblemUtil.isInModule(node)) { + acceptError("Multi-objects in modules cannot be required to exist.", assertion, null, 0, + UNSUPPORTED_ASSERTION_ISSUE); } } @@ -403,4 +414,23 @@ public class ProblemValidator extends AbstractProblemValidator { } throw new IllegalArgumentException("Unknown assertion argument: " + argument); } + + @Check + private void checkImplicitNodeInModule(Assertion assertion) { + if (!ProblemUtil.isInModule(assertion)) { + return; + } + for (var argument : assertion.getArguments()) { + if (argument instanceof NodeAssertionArgument nodeAssertionArgument) { + var node = nodeAssertionArgument.getNode(); + if (node != null && !node.eIsProxy() && ProblemUtil.isImplicitNode(node)) { + var name = node.getName(); + var message = ("Implicit nodes are not allowed in modules. Explicitly declare '%s' as a node " + + "with the declaration 'declare %s.'").formatted(name, name); + acceptError(message, nodeAssertionArgument, ProblemPackage.Literals.NODE_ASSERTION_ARGUMENT__NODE, + 0, UNSUPPORTED_ASSERTION_ISSUE); + } + } + } + } } diff --git a/subprojects/language/src/test/java/tools/refinery/language/tests/validation/AssertionValidationTest.java b/subprojects/language/src/test/java/tools/refinery/language/tests/validation/AssertionValidationTest.java index 82dea31b..1fb08845 100644 --- a/subprojects/language/src/test/java/tools/refinery/language/tests/validation/AssertionValidationTest.java +++ b/subprojects/language/src/test/java/tools/refinery/language/tests/validation/AssertionValidationTest.java @@ -82,7 +82,6 @@ class AssertionValidationTest { "exists(n).", "?exists(n).", "!exists(n).", - "exists(*).", "?exists(*).", "exists(Foo::new).", "?exists(Foo::new).", diff --git a/subprojects/language/src/test/java/tools/refinery/language/tests/validation/ModuleValidationTest.java b/subprojects/language/src/test/java/tools/refinery/language/tests/validation/ModuleValidationTest.java new file mode 100644 index 00000000..00ad051b --- /dev/null +++ b/subprojects/language/src/test/java/tools/refinery/language/tests/validation/ModuleValidationTest.java @@ -0,0 +1,145 @@ +/* + * SPDX-FileCopyrightText: 2024 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.language.tests.validation; + +import com.google.inject.Inject; +import org.eclipse.xtext.testing.InjectWith; +import org.eclipse.xtext.testing.extensions.InjectionExtension; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import tools.refinery.language.model.tests.utils.ProblemParseHelper; +import tools.refinery.language.tests.ProblemInjectorProvider; +import tools.refinery.language.validation.ProblemValidator; + +import java.util.stream.Stream; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; + +@ExtendWith(InjectionExtension.class) +@InjectWith(ProblemInjectorProvider.class) +class ModuleValidationTest { + @Inject + private ProblemParseHelper parseHelper; + + @ParameterizedTest + @MethodSource + void invalidMultiObjectExistsTest(String invalidDeclaration) { + var problem = parseHelper.parse(""" + module. + + %s + """.formatted(invalidDeclaration)); + var issues = problem.validate(); + assertThat(issues, hasItem(hasProperty("issueCode", + is(ProblemValidator.UNSUPPORTED_ASSERTION_ISSUE)))); + } + + static Stream invalidMultiObjectExistsTest() { + return Stream.of( + Arguments.of(""" + class Foo. + exists(Foo::new). + """), + Arguments.of(""" + multi m. + exists(m). + """)); + } + + @Test + void invalidScopeTest() { + var problem = parseHelper.parse(""" + module. + + class Foo. + scope Foo += 1. + """); + var issues = problem.validate(); + assertThat(issues, hasItem(hasProperty("issueCode", + is(ProblemValidator.INVALID_MULTIPLICITY_ISSUE)))); + } + + @Test + void invalidAssertionArgumentTest() { + var problem = parseHelper.parse(""" + module. + + class Foo. + Foo(foo1). + """); + var issues = problem.validate(); + assertThat(issues, hasItem(allOf( + hasProperty("issueCode", is(ProblemValidator.UNSUPPORTED_ASSERTION_ISSUE)), + hasProperty("message", containsString("foo1"))))); + } + + @ParameterizedTest + @MethodSource + void validDeclarationTest(String validDeclaration) { + var problem = parseHelper.parse(validDeclaration); + var issues = problem.validate(); + assertThat(issues, hasSize(0)); + } + + static Stream validDeclarationTest() { + return Stream.concat( + invalidMultiObjectExistsTest(), + Stream.of( + Arguments.of(""" + class Foo. + scope Foo += 1. + """), + Arguments.of(""" + module. + + class Foo. + scope Foo = 1. + """), + Arguments.of(""" + class Foo. + Foo(foo1). + """), + Arguments.of(""" + module. + + class Foo. + multi foo1. + Foo(foo1). + """), + Arguments.of(""" + module. + + class Foo. + atom foo1. + Foo(foo1). + """), + Arguments.of(""" + module. + + class Foo. + declare foo1. + Foo(foo1). + """), + Arguments.of(""" + module. + + enum Foo { foo1 } + Foo(foo1). + """), + Arguments.of(""" + module. + + class Foo. + Foo(Foo::new). + """) + ) + ); + } +} -- cgit v1.2.3-54-g00ecf From 286b6de0e20fedeb3cede1b90f4f728be3fdb74a Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Wed, 31 Jan 2024 18:26:32 +0100 Subject: refactor: serialize solutions as modules --- .../language/semantics/SolutionSerializer.java | 18 ++++++++++++++---- .../language/semantics/SolutionSerializerTest.java | 16 +++++++++++++--- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SolutionSerializer.java b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SolutionSerializer.java index 537d94ca..1bd419d8 100644 --- a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SolutionSerializer.java +++ b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SolutionSerializer.java @@ -68,7 +68,9 @@ public class SolutionSerializer { private Model model; private ReasoningAdapter reasoningAdapter; private PartialInterpretation existsInterpretation; + private Problem originalProblem; private Problem problem; + private NodeDeclaration nodeDeclaration; private final MutableIntObjectMap nodes = IntObjectMaps.mutable.empty(); @Inject @@ -87,14 +89,22 @@ public class SolutionSerializer { reasoningAdapter = model.getAdapter(ReasoningAdapter.class); existsInterpretation = reasoningAdapter.getPartialInterpretation(Concreteness.CANDIDATE, ReasoningAdapter.EXISTS_SYMBOL); - var originalProblem = trace.getProblem(); + originalProblem = trace.getProblem(); problem = copyProblem(originalProblem, uri); + problem.setKind(ModuleKind.MODULE); problem.getStatements().removeIf(SolutionSerializer::shouldRemoveStatement); problem.getNodes().removeIf(this::shouldRemoveNode); + nodeDeclaration = ProblemFactory.eINSTANCE.createNodeDeclaration(); + nodeDeclaration.setKind(NodeKind.NODE); + nodeDeclaration.getNodes().addAll(problem.getNodes()); + problem.getStatements().add(nodeDeclaration); nameProvider.setProblem(problem); addExistsAssertions(); addClassAssertions(); addReferenceAssertions(); + if (nodeDeclaration.getNodes().isEmpty()) { + problem.getStatements().remove(nodeDeclaration); + } return problem; } @@ -104,8 +114,8 @@ public class SolutionSerializer { private boolean shouldRemoveNode(Node newNode) { var qualifiedName = qualifiedNameProvider.getFullyQualifiedName(newNode); - var scope = scopeProvider.getScope(trace.getProblem(), ProblemPackage.Literals.ASSERTION__RELATION); - var originalNode = semanticsUtils.maybeGetElement(problem, scope, qualifiedName, Node.class); + var scope = scopeProvider.getScope(originalProblem, ProblemPackage.Literals.NODE_ASSERTION_ARGUMENT__NODE); + var originalNode = semanticsUtils.maybeGetElement(originalProblem, scope, qualifiedName, Node.class); if (originalNode == null) { return false; } @@ -238,7 +248,7 @@ public class SolutionSerializer { var nodeName = nameProvider.getNextName(typeName); node = ProblemFactory.eINSTANCE.createNode(); node.setName(nodeName); - problem.getNodes().add(node); + nodeDeclaration.getNodes().add(node); nodes.put(nodeId, node); } addAssertion(candidateRelation, LogicValue.TRUE, node); diff --git a/subprojects/language-semantics/src/test/java/tools/refinery/language/semantics/SolutionSerializerTest.java b/subprojects/language-semantics/src/test/java/tools/refinery/language/semantics/SolutionSerializerTest.java index b682a7d6..949b7047 100644 --- a/subprojects/language-semantics/src/test/java/tools/refinery/language/semantics/SolutionSerializerTest.java +++ b/subprojects/language-semantics/src/test/java/tools/refinery/language/semantics/SolutionSerializerTest.java @@ -72,7 +72,7 @@ class SolutionSerializerTest { solution.eResource().save(outputStream, Map.of()); actualOutput = outputStream.toString(); } - assertThat(actualOutput, is(prefix + "\n" + expectedOutput)); + assertThat(actualOutput, is("module.\n\n" + prefix + "\n" + expectedOutput)); } static Stream solutionSerializerTest() { @@ -81,6 +81,7 @@ class SolutionSerializerTest { """, """ scope Foo = 3. """, """ + declare foo1, foo2, foo3. !exists(Foo::new). Foo(foo1). Foo(foo2). @@ -94,6 +95,7 @@ class SolutionSerializerTest { """, """ scope Foo = 1. """, """ + declare foo1, bar1, bar2. !exists(Foo::new). !exists(Bar::new). Foo(foo1). @@ -112,6 +114,7 @@ class SolutionSerializerTest { """, """ scope Foo = 1, Bar = 2. """, """ + declare foo1, bar1, bar2. !exists(Foo::new). !exists(Bar::new). Foo(foo1). @@ -131,6 +134,7 @@ class SolutionSerializerTest { scope Person += 0. """, """ + declare a, b, c. !exists(Person::new). Person(a). Person(b). @@ -156,6 +160,7 @@ class SolutionSerializerTest { scope Foo += 0. """, """ + declare foo. !exists(Foo::new). Foo(foo). default !bar(*, *). @@ -166,6 +171,7 @@ class SolutionSerializerTest { """, """ scope Foo = 1, Bar = 0. """, """ + declare foo1. !exists(Foo::new). !exists(Bar::new). Foo(foo1). @@ -180,6 +186,7 @@ class SolutionSerializerTest { scope Foo += 0. """, """ + declare a. !exists(Foo::new). Foo(a). default !ref(*, *). @@ -200,29 +207,32 @@ class SolutionSerializerTest { !exists(Foo::new). scope Foo = 2. """, """ + declare foo1, foo2. !exists(a). !exists(Foo::new). Foo(foo1). Foo(foo2). """), Arguments.of(""" - node a. + declare a. class Foo. """, """ Foo(a). ?exists(a). scope Foo = 2, Foo += 1. """, """ + declare foo1. !exists(Foo::new). Foo(a). Foo(foo1). """), Arguments.of(""" - node a. + declare a. class Foo. """, """ Foo(a). ?exists(a). scope Foo = 1, Foo += 1. """, """ + declare foo1. !exists(a). !exists(Foo::new). Foo(foo1). -- cgit v1.2.3-54-g00ecf From 2dfcb286216419976368ad926f8ac7f018aa2bf9 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Fri, 2 Feb 2024 16:28:19 +0100 Subject: refactor(language): name disambiguation * Use fully qualified names starting with :: (as in C++) to unambiguously refer to an element. * Name shadowing within modules. --- subprojects/frontend/src/editor/EditorTheme.ts | 4 +- subprojects/frontend/src/language/problem.grammar | 11 +- .../src/language/problemLanguageSupport.ts | 4 +- subprojects/frontend/src/language/tokens.ts | 46 ++++++++ .../frontend/src/xtext/ContentAssistService.ts | 8 +- subprojects/frontend/types/grammar.d.ts | 6 +- .../ProblemCrossrefProposalProvider.java | 22 ++-- .../ProblemSemanticHighlightingCalculator.java | 2 +- subprojects/language-model/problem.aird | 92 +++++++++++++++- subprojects/language-model/problem.aird.license | 2 +- .../src/main/resources/model/problem.ecore | 4 + .../src/main/resources/model/problem.ecore.license | 2 +- .../src/main/resources/model/problem.genmodel | 4 + .../main/resources/model/problem.genmodel.license | 2 +- .../language/semantics/ModelInitializer.java | 4 +- .../language/semantics/ProblemTraceImpl.java | 4 +- .../language/semantics/SemanticsUtils.java | 10 +- .../web/semantics/PartialInterpretation2Json.java | 4 +- .../web/semantics/metadata/MetadataCreator.java | 21 ++-- .../java/tools/refinery/language/Problem.xtext | 14 ++- .../refinery/language/ProblemRuntimeModule.java | 23 +++- .../tools/refinery/language/naming/NamingUtil.java | 33 +++++- .../ProblemDelegateQualifiedNameProvider.java | 18 +++ .../naming/ProblemQualifiedNameConverter.java | 2 +- .../naming/ProblemQualifiedNameProvider.java | 41 +++++++ .../parser/antlr/IdentifierTokenProvider.java | 25 ++--- .../language/parser/antlr/ProblemTokenSource.java | 38 ++++--- .../resource/ProblemResourceDescription.java | 106 ++++++++++++++++++ .../ProblemResourceDescriptionManager.java | 19 ++++ .../ProblemResourceDescriptionStrategy.java | 62 +++++++++-- .../language/scoping/NormalizedSelectable.java | 122 +++++++++++++++++++++ .../scoping/ProblemGlobalScopeProvider.java | 23 +++- .../scoping/ProblemLocalScopeProvider.java | 49 ++++----- 33 files changed, 697 insertions(+), 130 deletions(-) create mode 100644 subprojects/frontend/src/language/tokens.ts create mode 100644 subprojects/language/src/main/java/tools/refinery/language/naming/ProblemDelegateQualifiedNameProvider.java create mode 100644 subprojects/language/src/main/java/tools/refinery/language/naming/ProblemQualifiedNameProvider.java create mode 100644 subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescription.java create mode 100644 subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionManager.java create mode 100644 subprojects/language/src/main/java/tools/refinery/language/scoping/NormalizedSelectable.java diff --git a/subprojects/frontend/src/editor/EditorTheme.ts b/subprojects/frontend/src/editor/EditorTheme.ts index f499b0d9..4978c7f7 100644 --- a/subprojects/frontend/src/editor/EditorTheme.ts +++ b/subprojects/frontend/src/editor/EditorTheme.ts @@ -40,7 +40,9 @@ function createTypeHashStyles( export default styled('div', { name: 'EditorTheme', shouldForwardProp: (propName) => - propName !== 'showLineNumbers' && propName !== 'showActiveLine', + propName !== 'showLineNumbers' && + propName !== 'showActiveLine' && + propName !== 'colorIdentifiers', })<{ showLineNumbers: boolean; showActiveLine: boolean; diff --git a/subprojects/frontend/src/language/problem.grammar b/subprojects/frontend/src/language/problem.grammar index ac451e7a..e39ce102 100644 --- a/subprojects/frontend/src/language/problem.grammar +++ b/subprojects/frontend/src/language/problem.grammar @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors + * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors * * SPDX-License-Identifier: EPL-2.0 */ @@ -22,6 +22,9 @@ @top Problem { statement* } statement { + ImportStatement { + kw<"import"> QualifiedName (kw<"as"> identifier)? "." + } | Assertion { kw<"default">? (NotOp | UnknownOp)? RelationName ParameterList @@ -170,7 +173,7 @@ VariableName[@dynamicPrecedence=10] { QualifiedName ~name } NodeName { QualifiedName } -QualifiedName[implicitCompletion=true] { identifier ("::" identifier)* } +QualifiedName[implicitCompletion=true] { "::"? identifier (QualifiedNameSeparator "::" identifier)* } kw { @specialize[@name={term},implicitCompletion=true] } @@ -184,6 +187,10 @@ sep1 { content (separator content)* } @skip { LineComment | BlockComment | whitespace } +@external tokens qualifiedNameSeparator from "./tokens" { + QualifiedNameSeparator +} + @tokens { whitespace { std.whitespace+ } diff --git a/subprojects/frontend/src/language/problemLanguageSupport.ts b/subprojects/frontend/src/language/problemLanguageSupport.ts index 2483c2e3..aebccfa4 100644 --- a/subprojects/frontend/src/language/problemLanguageSupport.ts +++ b/subprojects/frontend/src/language/problemLanguageSupport.ts @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors + * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors * * SPDX-License-Identifier: EPL-2.0 */ @@ -28,7 +28,7 @@ const parserWithMetadata = parser.configure({ LineComment: t.lineComment, BlockComment: t.blockComment, 'module problem class enum pred fn scope': t.definitionKeyword, - 'declare atom multi': t.definitionKeyword, + 'import as declare atom multi': t.definitionKeyword, 'abstract extends refers contains container opposite': t.modifier, 'default error contained containment': t.modifier, 'true false unknown error': t.keyword, diff --git a/subprojects/frontend/src/language/tokens.ts b/subprojects/frontend/src/language/tokens.ts new file mode 100644 index 00000000..b5d022f1 --- /dev/null +++ b/subprojects/frontend/src/language/tokens.ts @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2018-2024 by Marijn Haverbeke and others + * Copyright (C) 2024 The Refinery Authors + * + * SPDX-License-Identifier: MIT AND EPL-2.0 + * + * Based on the CSS tokenizer at + * https://github.com/lezer-parser/css/blob/790568c968a660a94bf0fbd97a86c66da1c529e5/src/tokens.js + */ + +import { ExternalTokenizer } from '@lezer/lr'; + +/* eslint-disable-next-line import/no-unresolved -- + Synthetic import from `@lezer/generator/rollup` cannot be found by ESLint. +*/ +import { QualifiedNameSeparator } from './problem.grammar.terms'; + +const colon = 58; +const underscore = 95; + +function isAlpha(ch: number) { + return (ch >= 65 && ch <= 90) || (ch >= 97 && ch <= 122) || ch >= 161; +} + +function isDigit(ch: number) { + return ch >= 48 && ch <= 57; +} + +function isIdentifier(ch: number) { + return isAlpha(ch) || isDigit(ch) || ch === underscore; +} + +/* eslint-disable-next-line import/prefer-default-export -- + Lezer requires a named export. +*/ +export const qualifiedNameSeparator = new ExternalTokenizer((input) => { + if (input.peek(0) === colon && input.peek(1) === colon) { + const previous = input.peek(-1); + if (isIdentifier(previous)) { + // Inject an extra 0-length token into the token stream to let Lezer + // consume the `::` on its own. Explicitly consuming 2 characters here + // leads to inconsistent highlighting of qualified names. + input.acceptToken(QualifiedNameSeparator); + } + } +}); diff --git a/subprojects/frontend/src/xtext/ContentAssistService.ts b/subprojects/frontend/src/xtext/ContentAssistService.ts index ac8ab36a..d42dde14 100644 --- a/subprojects/frontend/src/xtext/ContentAssistService.ts +++ b/subprojects/frontend/src/xtext/ContentAssistService.ts @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors + * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors * * SPDX-License-Identifier: EPL-2.0 */ @@ -108,7 +108,11 @@ function createCompletion(entry: ContentAssistEntry): Completion { boost = -90; break; default: - { + if (entry.proposal.startsWith('::')) { + // Move absolute names below relative names, + // they should only be preferred if no relative name is available. + boost = -60; + } else { // Penalize qualified names (vs available unqualified names). const extraSegments = entry.proposal.match(/::/g)?.length || 0; boost = Math.max(-5 * extraSegments, -50); diff --git a/subprojects/frontend/types/grammar.d.ts b/subprojects/frontend/types/grammar.d.ts index 92f99ec3..c7848e33 100644 --- a/subprojects/frontend/types/grammar.d.ts +++ b/subprojects/frontend/types/grammar.d.ts @@ -1,6 +1,6 @@ /* * Copyright (C) 2018 by Marijn Haverbeke and others - * Copyright (C) 2021-2023 The Refinery Authors + * Copyright (C) 2021-2024 The Refinery Authors * * SPDX-License-Identifier: MIT */ @@ -10,3 +10,7 @@ declare module '*.grammar' { export const parser: LRParser; } + +declare module '*.terms' { + export const QualifiedNameSeparator: number; +} diff --git a/subprojects/language-ide/src/main/java/tools/refinery/language/ide/contentassist/ProblemCrossrefProposalProvider.java b/subprojects/language-ide/src/main/java/tools/refinery/language/ide/contentassist/ProblemCrossrefProposalProvider.java index 166b4400..fa04a012 100644 --- a/subprojects/language-ide/src/main/java/tools/refinery/language/ide/contentassist/ProblemCrossrefProposalProvider.java +++ b/subprojects/language-ide/src/main/java/tools/refinery/language/ide/contentassist/ProblemCrossrefProposalProvider.java @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors + * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors * * SPDX-License-Identifier: EPL-2.0 */ @@ -15,13 +15,14 @@ import org.eclipse.xtext.EcoreUtil2; import org.eclipse.xtext.GrammarUtil; import org.eclipse.xtext.ide.editor.contentassist.ContentAssistContext; import org.eclipse.xtext.ide.editor.contentassist.IdeCrossrefProposalProvider; -import org.eclipse.xtext.naming.QualifiedName; import org.eclipse.xtext.nodemodel.util.NodeModelUtils; import org.eclipse.xtext.resource.IEObjectDescription; import org.eclipse.xtext.scoping.IScope; import org.eclipse.xtext.xtext.CurrentTypeFinder; import org.jetbrains.annotations.Nullable; import tools.refinery.language.model.problem.*; +import tools.refinery.language.naming.NamingUtil; +import tools.refinery.language.naming.ProblemQualifiedNameConverter; import tools.refinery.language.resource.ProblemResourceDescriptionStrategy; import tools.refinery.language.utils.BuiltinSymbols; import tools.refinery.language.utils.ProblemDesugarer; @@ -46,14 +47,12 @@ public class ProblemCrossrefProposalProvider extends IdeCrossrefProposalProvider @Override protected Iterable queryScope(IScope scope, CrossReference crossReference, ContentAssistContext context) { - var eObjectDescriptionsByName = new HashMap>(); + var eObjectDescriptionsByName = new HashMap>(); for (var candidate : super.queryScope(scope, crossReference, context)) { if (isExistingObject(candidate, crossReference, context)) { - // {@code getQualifiedName()} will refer to the full name for objects that are loaded from the global - // scope, but {@code getName()} returns the qualified name that we set in - // {@code ProblemResourceDescriptionStrategy}. - var qualifiedName = candidate.getName(); - var candidateList = eObjectDescriptionsByName.computeIfAbsent(qualifiedName, + var shadowingKey = ProblemResourceDescriptionStrategy.getShadowingKey(candidate); + var candidateList = eObjectDescriptionsByName.computeIfAbsent(shadowingKey, ignored -> new ArrayList<>()); candidateList.add(candidate); } @@ -61,7 +60,7 @@ public class ProblemCrossrefProposalProvider extends IdeCrossrefProposalProvider var eObjectDescriptions = new ArrayList(); for (var candidates : eObjectDescriptionsByName.values()) { if (candidates.size() == 1) { - var candidate = candidates.get(0); + var candidate = candidates.getFirst(); if (shouldBeVisible(candidate, crossReference, context)) { eObjectDescriptions.add(candidate); } @@ -96,6 +95,11 @@ public class ProblemCrossrefProposalProvider extends IdeCrossrefProposalProvider protected boolean shouldBeVisible(IEObjectDescription candidate, CrossReference crossReference, ContentAssistContext context) { + if (NamingUtil.isFullyQualified(candidate.getName()) && + !context.getPrefix().startsWith(ProblemQualifiedNameConverter.DELIMITER)) { + // Do not propose names with a root prefix unless explicitly asked for. + return false; + } var errorPredicate = candidate.getUserData(ProblemResourceDescriptionStrategy.ERROR_PREDICATE); if (ProblemResourceDescriptionStrategy.ERROR_PREDICATE_TRUE.equals(errorPredicate)) { return false; diff --git a/subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java b/subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java index 94a61c4f..891c73c7 100644 --- a/subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java +++ b/subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java @@ -99,7 +99,7 @@ public class ProblemSemanticHighlightingCalculator extends DefaultSemanticHighli protected String[] getHighlightClass(EObject eObject, EReference reference) { boolean isError = ProblemUtil.isError(eObject); - if (ProblemUtil.isBuiltIn(eObject)) { + if (ProblemUtil.isBuiltIn(eObject) && !(eObject instanceof Problem)) { var className = isError ? ERROR_CLASS : BUILTIN_CLASS; return new String[]{className}; } diff --git a/subprojects/language-model/problem.aird b/subprojects/language-model/problem.aird index a3420a04..6583d364 100644 --- a/subprojects/language-model/problem.aird +++ b/subprojects/language-model/problem.aird @@ -7,7 +7,7 @@ build/resources/main/model/problem.genmodel - + @@ -478,6 +478,19 @@ + + + + + + + + + + + + + @@ -1357,6 +1370,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1372,7 +1417,7 @@ - + KEEP_LOCATION @@ -1578,7 +1623,7 @@ - + KEEP_LOCATION @@ -2684,6 +2729,47 @@ + + + + KEEP_LOCATION + KEEP_SIZE + KEEP_RATIO + + + + + + + + + + + + + + + + + + + + italic + + + + + + + + + + + + + + + diff --git a/subprojects/language-model/problem.aird.license b/subprojects/language-model/problem.aird.license index e5db6ccd..a73a3364 100644 --- a/subprojects/language-model/problem.aird.license +++ b/subprojects/language-model/problem.aird.license @@ -1,3 +1,3 @@ -SPDX-FileCopyrightText: 2021-2023 The Refinery Authors +SPDX-FileCopyrightText: 2021-2024 The Refinery Authors SPDX-License-Identifier: EPL-2.0 diff --git a/subprojects/language-model/src/main/resources/model/problem.ecore b/subprojects/language-model/src/main/resources/model/problem.ecore index aa05a2fe..f7c85290 100644 --- a/subprojects/language-model/src/main/resources/model/problem.ecore +++ b/subprojects/language-model/src/main/resources/model/problem.ecore @@ -270,4 +270,8 @@ + + + + diff --git a/subprojects/language-model/src/main/resources/model/problem.ecore.license b/subprojects/language-model/src/main/resources/model/problem.ecore.license index e5db6ccd..a73a3364 100644 --- a/subprojects/language-model/src/main/resources/model/problem.ecore.license +++ b/subprojects/language-model/src/main/resources/model/problem.ecore.license @@ -1,3 +1,3 @@ -SPDX-FileCopyrightText: 2021-2023 The Refinery Authors +SPDX-FileCopyrightText: 2021-2024 The Refinery Authors SPDX-License-Identifier: EPL-2.0 diff --git a/subprojects/language-model/src/main/resources/model/problem.genmodel b/subprojects/language-model/src/main/resources/model/problem.genmodel index be8b62eb..85cd802b 100644 --- a/subprojects/language-model/src/main/resources/model/problem.genmodel +++ b/subprojects/language-model/src/main/resources/model/problem.genmodel @@ -238,5 +238,9 @@ + + + + diff --git a/subprojects/language-model/src/main/resources/model/problem.genmodel.license b/subprojects/language-model/src/main/resources/model/problem.genmodel.license index e5db6ccd..a73a3364 100644 --- a/subprojects/language-model/src/main/resources/model/problem.genmodel.license +++ b/subprojects/language-model/src/main/resources/model/problem.genmodel.license @@ -1,3 +1,3 @@ -SPDX-FileCopyrightText: 2021-2023 The Refinery Authors +SPDX-FileCopyrightText: 2021-2024 The Refinery Authors SPDX-License-Identifier: EPL-2.0 diff --git a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ModelInitializer.java b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ModelInitializer.java index b462fd70..7c649232 100644 --- a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ModelInitializer.java +++ b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ModelInitializer.java @@ -247,7 +247,7 @@ public class ModelInitializer { } private String getName(Relation relation) { - return semanticsUtils.getName(relation).orElseGet(() -> "::" + relationInfoMap.size()); + return semanticsUtils.getNameWithoutRootPrefix(relation).orElseGet(() -> "::" + relationInfoMap.size()); } private void collectMetamodel() { @@ -659,7 +659,7 @@ public class ModelInitializer { var variableOrNode = variableOrNodeExpr.getVariableOrNode(); if (variableOrNode instanceof Node node) { int nodeId = getNodeId(node); - var tempVariable = Variable.of(semanticsUtils.getName(node).orElse("_" + nodeId)); + var tempVariable = Variable.of(semanticsUtils.getNameWithoutRootPrefix(node).orElse("_" + nodeId)); literals.add(new ConstantLiteral(tempVariable, nodeId)); argumentList.add(tempVariable); } else if (variableOrNode instanceof tools.refinery.language.model.problem.Variable problemVariable) { diff --git a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ProblemTraceImpl.java b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ProblemTraceImpl.java index f686e980..aef0fd89 100644 --- a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ProblemTraceImpl.java +++ b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ProblemTraceImpl.java @@ -79,7 +79,7 @@ class ProblemTraceImpl implements ProblemTrace { try { return nodeTrace.getOrThrow(node); } catch (IllegalStateException e) { - var qualifiedName = semanticsUtils.getName(node); + var qualifiedName = semanticsUtils.getNameWithoutRootPrefix(node); throw new TracedException(node, "No node ID for " + qualifiedName, e); } } @@ -144,7 +144,7 @@ class ProblemTraceImpl implements ProblemTrace { public PartialRelation getPartialRelation(Relation relation) { var partialRelation = mutableRelationTrace.get(relation); if (partialRelation == null) { - var qualifiedName = semanticsUtils.getName(relation); + var qualifiedName = semanticsUtils.getNameWithoutRootPrefix(relation); throw new TracedException(relation, "No partial relation for " + qualifiedName); } return partialRelation; diff --git a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SemanticsUtils.java b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SemanticsUtils.java index b72ba697..110295b2 100644 --- a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SemanticsUtils.java +++ b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SemanticsUtils.java @@ -7,6 +7,7 @@ package tools.refinery.language.semantics; import com.google.inject.Inject; import com.google.inject.Singleton; +import com.google.inject.name.Named; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.xtext.naming.IQualifiedNameConverter; @@ -16,6 +17,7 @@ import org.eclipse.xtext.scoping.IScope; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import tools.refinery.language.model.problem.Problem; +import tools.refinery.language.naming.ProblemQualifiedNameProvider; import java.util.Optional; @@ -24,11 +26,15 @@ public class SemanticsUtils { @Inject private IQualifiedNameProvider qualifiedNameProvider; + @Inject + @Named(ProblemQualifiedNameProvider.NAMED_DELEGATE) + private IQualifiedNameProvider delegateQualifiedNameProvider; + @Inject private IQualifiedNameConverter qualifiedNameConverter; - public Optional getName(EObject eObject) { - var qualifiedName = qualifiedNameProvider.getFullyQualifiedName(eObject); + public Optional getNameWithoutRootPrefix(EObject eObject) { + var qualifiedName = delegateQualifiedNameProvider.getFullyQualifiedName(eObject); if (qualifiedName == null) { return Optional.empty(); } diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/PartialInterpretation2Json.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/PartialInterpretation2Json.java index efe04592..ff811033 100644 --- a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/PartialInterpretation2Json.java +++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/PartialInterpretation2Json.java @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2023 The Refinery Authors + * SPDX-FileCopyrightText: 2023-2024 The Refinery Authors * * SPDX-License-Identifier: EPL-2.0 */ @@ -32,7 +32,7 @@ public class PartialInterpretation2Json { var relation = entry.getKey(); var partialSymbol = entry.getValue(); var tuples = getTuplesJson(facade, partialSymbol); - var name = semanticsUtils.getName(relation).orElse(partialSymbol.name()); + var name = semanticsUtils.getNameWithoutRootPrefix(relation).orElse(partialSymbol.name()); json.add(name, tuples); cancellationToken.checkCancelled(); } diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/MetadataCreator.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/MetadataCreator.java index 1f49b0d0..1858fc87 100644 --- a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/MetadataCreator.java +++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/MetadataCreator.java @@ -7,6 +7,7 @@ package tools.refinery.language.web.semantics.metadata; import com.google.inject.Inject; import com.google.inject.Provider; +import com.google.inject.name.Named; import org.eclipse.emf.ecore.EObject; import org.eclipse.xtext.naming.IQualifiedNameConverter; import org.eclipse.xtext.naming.IQualifiedNameProvider; @@ -14,6 +15,7 @@ import org.eclipse.xtext.naming.QualifiedName; import org.eclipse.xtext.scoping.IScope; import org.eclipse.xtext.scoping.IScopeProvider; import tools.refinery.language.model.problem.*; +import tools.refinery.language.naming.ProblemQualifiedNameProvider; import tools.refinery.language.semantics.ProblemTrace; import tools.refinery.language.semantics.TracedException; import tools.refinery.language.utils.ProblemUtil; @@ -32,6 +34,7 @@ public class MetadataCreator { private IScopeProvider scopeProvider; @Inject + @Named(ProblemQualifiedNameProvider.NAMED_DELEGATE) private IQualifiedNameProvider qualifiedNameProvider; @Inject @@ -122,17 +125,13 @@ public class MetadataCreator { if (ProblemUtil.isBuiltIn(relation) && !ProblemUtil.isError(relation)) { return getBuiltInDetail(); } - if (relation instanceof ClassDeclaration classDeclaration) { - return getClassDetail(classDeclaration); - } else if (relation instanceof ReferenceDeclaration) { - return getReferenceDetail(partialRelation); - } else if (relation instanceof EnumDeclaration) { - return getEnumDetail(); - } else if (relation instanceof PredicateDefinition predicateDefinition) { - return getPredicateDetail(predicateDefinition); - } else { - throw new TracedException(relation, "Unknown relation"); - } + return switch (relation) { + case ClassDeclaration classDeclaration -> getClassDetail(classDeclaration); + case ReferenceDeclaration ignored -> getReferenceDetail(partialRelation); + case EnumDeclaration ignored -> getEnumDetail(); + case PredicateDefinition predicateDefinition -> getPredicateDetail(predicateDefinition); + default -> throw new TracedException(relation, "Unknown relation"); + }; } private RelationDetail getBuiltInDetail() { diff --git a/subprojects/language/src/main/java/tools/refinery/language/Problem.xtext b/subprojects/language/src/main/java/tools/refinery/language/Problem.xtext index 4ce3fae1..f0d6c38c 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/Problem.xtext +++ b/subprojects/language/src/main/java/tools/refinery/language/Problem.xtext @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors + * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors * * SPDX-License-Identifier: EPL-2.0 */ @@ -16,10 +16,13 @@ enum ModuleKind: PROBLEM="problem" | MODULE="module"; Statement: - Assertion | ClassDeclaration | EnumDeclaration | + ImportStatement | Assertion | ClassDeclaration | EnumDeclaration | PredicateDefinition | /* FunctionDefinition | RuleDefinition | */ ScopeDeclaration | NodeDeclaration; +ImportStatement: + "import" importedModule=[Problem|QualifiedName] ("as" alias=ID)? "."; + ClassDeclaration: abstract?="abstract"? "class" name=Identifier @@ -266,10 +269,10 @@ UpperBound returns ecore::EInt: INT | "*"; QualifiedName hidden(): - Identifier ("::" Identifier)*; + "::"? Identifier (QUALIFIED_NAME_SEPARATOR Identifier)*; NonContainmentQualifiedName hidden(): - NonContainmentIdentifier ("::" Identifier)*; + (NonContainmentIdentifier | "::" Identifier) (QUALIFIED_NAME_SEPARATOR Identifier)*; Identifier: NonContainmentIdentifier | "contains" | "container"; @@ -284,6 +287,9 @@ Real returns ecore::EDouble: terminal TRANSITIVE_CLOSURE: "synthetic:TRANSITIVE_CLOSURE"; +terminal QUALIFIED_NAME_SEPARATOR: + "synthetic::QUALIFIED_NAME_SEPARATOR"; + @Override terminal ID: ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '_' | '0'..'9')*; diff --git a/subprojects/language/src/main/java/tools/refinery/language/ProblemRuntimeModule.java b/subprojects/language/src/main/java/tools/refinery/language/ProblemRuntimeModule.java index 00dd3de3..19816da4 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/ProblemRuntimeModule.java +++ b/subprojects/language/src/main/java/tools/refinery/language/ProblemRuntimeModule.java @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors + * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors * * SPDX-License-Identifier: EPL-2.0 */ @@ -14,6 +14,7 @@ import com.google.inject.name.Names; import org.eclipse.xtext.conversion.IValueConverterService; import org.eclipse.xtext.linking.ILinkingService; import org.eclipse.xtext.naming.IQualifiedNameConverter; +import org.eclipse.xtext.naming.IQualifiedNameProvider; import org.eclipse.xtext.parser.IParser; import org.eclipse.xtext.resource.*; import org.eclipse.xtext.scoping.IGlobalScopeProvider; @@ -26,12 +27,11 @@ import org.eclipse.xtext.validation.IResourceValidator; import org.eclipse.xtext.xbase.annotations.validation.DerivedStateAwareResourceValidator; import tools.refinery.language.conversion.ProblemValueConverterService; import tools.refinery.language.linking.ProblemLinkingService; +import tools.refinery.language.naming.ProblemDelegateQualifiedNameProvider; import tools.refinery.language.naming.ProblemQualifiedNameConverter; +import tools.refinery.language.naming.ProblemQualifiedNameProvider; import tools.refinery.language.parser.antlr.TokenSourceInjectingProblemParser; -import tools.refinery.language.resource.ProblemDerivedStateComputer; -import tools.refinery.language.resource.ProblemLocationInFileProvider; -import tools.refinery.language.resource.ProblemResource; -import tools.refinery.language.resource.ProblemResourceDescriptionStrategy; +import tools.refinery.language.resource.*; import tools.refinery.language.scoping.ProblemGlobalScopeProvider; import tools.refinery.language.scoping.ProblemLocalScopeProvider; import tools.refinery.language.serializer.PreferShortAssertionsProblemSemanticSequencer; @@ -54,6 +54,17 @@ public class ProblemRuntimeModule extends AbstractProblemRuntimeModule { return ProblemQualifiedNameConverter.class; } + public void configureIQualifiedNameProviderDelegate(Binder binder) { + binder.bind(IQualifiedNameProvider.class) + .annotatedWith(Names.named(ProblemQualifiedNameProvider.NAMED_DELEGATE)) + .to(ProblemDelegateQualifiedNameProvider.class); + } + + @Override + public Class bindIQualifiedNameProvider() { + return ProblemQualifiedNameProvider.class; + } + public Class bindIDefaultResourceDescriptionStrategy() { return ProblemResourceDescriptionStrategy.class; } @@ -87,7 +98,7 @@ public class ProblemRuntimeModule extends AbstractProblemRuntimeModule { // Method name follows Xtext convention. @SuppressWarnings("squid:S100") public Class bindIResourceDescription$Manager() { - return DerivedStateAwareResourceDescriptionManager.class; + return ProblemResourceDescriptionManager.class; } public Class bindIResourceValidator() { diff --git a/subprojects/language/src/main/java/tools/refinery/language/naming/NamingUtil.java b/subprojects/language/src/main/java/tools/refinery/language/naming/NamingUtil.java index 1647d4e7..feae5ebb 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/naming/NamingUtil.java +++ b/subprojects/language/src/main/java/tools/refinery/language/naming/NamingUtil.java @@ -1,21 +1,24 @@ /* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors + * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors * * SPDX-License-Identifier: EPL-2.0 */ package tools.refinery.language.naming; +import org.eclipse.xtext.naming.QualifiedName; + import java.util.regex.Pattern; public final class NamingUtil { private static final String SINGLETON_VARIABLE_PREFIX = "_"; - - private static final Pattern ID_REGEX = Pattern.compile("[_a-zA-Z][_0-9a-zA-Z]*"); + public static final QualifiedName ROOT_NAME = QualifiedName.create(""); + + private static final Pattern ID_REGEX = Pattern.compile("[_a-zA-Z]\\w*"); private NamingUtil() { throw new IllegalStateException("This is a static utility class and should not be instantiated directly"); } - + public static boolean isNullOrEmpty(String name) { return name == null || name.isEmpty(); } @@ -23,8 +26,28 @@ public final class NamingUtil { public static boolean isSingletonVariableName(String name) { return name != null && name.startsWith(SINGLETON_VARIABLE_PREFIX); } - + + // This method name only makes sense if it checks for the positive case. + @SuppressWarnings("BooleanMethodIsAlwaysInverted") public static boolean isValidId(String name) { return name != null && ID_REGEX.matcher(name).matches(); } + + public static boolean isFullyQualified(QualifiedName name) { + return name.startsWith(ROOT_NAME); + } + + public static QualifiedName stripRootPrefix(QualifiedName name) { + if (name == null) { + return null; + } + return isFullyQualified(name) ? name.skipFirst(ROOT_NAME.getSegmentCount()) : name; + } + + public static QualifiedName addRootPrefix(QualifiedName name) { + if (name == null) { + return null; + } + return isFullyQualified(name) ? name : ROOT_NAME.append(name); + } } diff --git a/subprojects/language/src/main/java/tools/refinery/language/naming/ProblemDelegateQualifiedNameProvider.java b/subprojects/language/src/main/java/tools/refinery/language/naming/ProblemDelegateQualifiedNameProvider.java new file mode 100644 index 00000000..1e78cee1 --- /dev/null +++ b/subprojects/language/src/main/java/tools/refinery/language/naming/ProblemDelegateQualifiedNameProvider.java @@ -0,0 +1,18 @@ +/* + * SPDX-FileCopyrightText: 2024 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.language.naming; + +import org.eclipse.xtext.naming.DefaultDeclarativeQualifiedNameProvider; +import org.eclipse.xtext.naming.QualifiedName; +import tools.refinery.language.model.problem.Problem; + +public class ProblemDelegateQualifiedNameProvider extends DefaultDeclarativeQualifiedNameProvider { + protected QualifiedName qualifiedName(Problem ele) { + var qualifiedName = computeFullyQualifiedNameFromNameAttribute(ele); + // Strip the root prefix even if explicitly provided. + return NamingUtil.stripRootPrefix(qualifiedName); + } +} diff --git a/subprojects/language/src/main/java/tools/refinery/language/naming/ProblemQualifiedNameConverter.java b/subprojects/language/src/main/java/tools/refinery/language/naming/ProblemQualifiedNameConverter.java index 74b4e208..88a0fe9a 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/naming/ProblemQualifiedNameConverter.java +++ b/subprojects/language/src/main/java/tools/refinery/language/naming/ProblemQualifiedNameConverter.java @@ -12,7 +12,7 @@ import com.google.inject.Singleton; @Singleton public class ProblemQualifiedNameConverter extends IQualifiedNameConverter.DefaultImpl { public static final String DELIMITER = "::"; - + @Override public String getDelimiter() { return DELIMITER; diff --git a/subprojects/language/src/main/java/tools/refinery/language/naming/ProblemQualifiedNameProvider.java b/subprojects/language/src/main/java/tools/refinery/language/naming/ProblemQualifiedNameProvider.java new file mode 100644 index 00000000..5b682058 --- /dev/null +++ b/subprojects/language/src/main/java/tools/refinery/language/naming/ProblemQualifiedNameProvider.java @@ -0,0 +1,41 @@ +/* + * SPDX-FileCopyrightText: 2024 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.language.naming; + +import com.google.inject.Inject; +import com.google.inject.name.Named; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.xtext.naming.IQualifiedNameProvider; +import org.eclipse.xtext.naming.QualifiedName; +import org.eclipse.xtext.util.IResourceScopeCache; +import org.eclipse.xtext.util.Tuples; +import tools.refinery.language.resource.ProblemResourceDescriptionStrategy; + +public class ProblemQualifiedNameProvider extends IQualifiedNameProvider.AbstractImpl { + private static final String PREFIX = "tools.refinery.language.naming.ProblemQualifiedNameProvider."; + public static final String NAMED_DELEGATE = PREFIX + "NAMED_DELEGATE"; + public static final String CACHE_KEY = PREFIX + "CACHE_KEY"; + + @Inject + @Named(NAMED_DELEGATE) + private IQualifiedNameProvider delegate; + + @Inject + private IResourceScopeCache cache = IResourceScopeCache.NullImpl.INSTANCE; + + @Override + public QualifiedName getFullyQualifiedName(EObject obj) { + return cache.get(Tuples.pair(obj, CACHE_KEY), obj.eResource(), () -> computeFullyQualifiedName(obj)); + } + + public QualifiedName computeFullyQualifiedName(EObject obj) { + var qualifiedName = delegate.getFullyQualifiedName(obj); + if (qualifiedName != null && ProblemResourceDescriptionStrategy.shouldExport(obj)) { + return NamingUtil.addRootPrefix(qualifiedName); + } + return qualifiedName; + } +} diff --git a/subprojects/language/src/main/java/tools/refinery/language/parser/antlr/IdentifierTokenProvider.java b/subprojects/language/src/main/java/tools/refinery/language/parser/antlr/IdentifierTokenProvider.java index 306a86fc..0e19357f 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/parser/antlr/IdentifierTokenProvider.java +++ b/subprojects/language/src/main/java/tools/refinery/language/parser/antlr/IdentifierTokenProvider.java @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors + * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors * * SPDX-License-Identifier: EPL-2.0 */ @@ -59,7 +59,7 @@ public class IdentifierTokenProvider { private void createValueToTokenIdMap() { var tokenIdToValueMap = tokenDefProvider.getTokenDefMap(); - valueToTokenIdMap = new HashMap<>(tokenIdToValueMap.size()); + valueToTokenIdMap = HashMap.newHashMap(tokenIdToValueMap.size()); for (var entry : tokenIdToValueMap.entrySet()) { valueToTokenIdMap.put(entry.getValue(), entry.getKey()); } @@ -74,17 +74,16 @@ public class IdentifierTokenProvider { } private void collectIdentifierTokensFromElement(AbstractElement element) { - if (element instanceof Alternatives alternatives) { - for (var alternative : alternatives.getElements()) { - collectIdentifierTokensFromElement(alternative); - } - } else if (element instanceof RuleCall ruleCall) { - collectIdentifierTokensFromRule(ruleCall.getRule()); - } else if (element instanceof Keyword keyword) { - collectToken("'" + keyword.getValue() + "'"); - } else { - throw new IllegalArgumentException("Unknown Xtext grammar element: " + element); - } + switch (element) { + case Alternatives alternatives -> { + for (var alternative : alternatives.getElements()) { + collectIdentifierTokensFromElement(alternative); + } + } + case RuleCall ruleCall -> collectIdentifierTokensFromRule(ruleCall.getRule()); + case Keyword keyword -> collectToken("'" + keyword.getValue() + "'"); + default -> throw new IllegalArgumentException("Unknown Xtext grammar element: " + element); + } } private void collectToken(String value) { diff --git a/subprojects/language/src/main/java/tools/refinery/language/parser/antlr/ProblemTokenSource.java b/subprojects/language/src/main/java/tools/refinery/language/parser/antlr/ProblemTokenSource.java index 5b91a6cc..487e4ceb 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/parser/antlr/ProblemTokenSource.java +++ b/subprojects/language/src/main/java/tools/refinery/language/parser/antlr/ProblemTokenSource.java @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors + * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors * * SPDX-License-Identifier: EPL-2.0 */ @@ -28,6 +28,8 @@ public class ProblemTokenSource implements TokenSource { private boolean seenId; + private boolean lastVisible; + public ProblemTokenSource(TokenSource delegate) { this.delegate = delegate; } @@ -47,18 +49,18 @@ public class ProblemTokenSource implements TokenSource { @Override public Token nextToken() { - if (!buffer.isEmpty()) { - return buffer.removeFirst(); - } - var token = delegate.nextToken(); - if (isIdentifier(token)) { - seenId = true; - } else if (seenId && isPlusOrTransitiveClosure(token)) { - if (peekForTransitiveClosure()) { + boolean fromStream = buffer.isEmpty(); + var token = fromStream ? delegate.nextToken() : buffer.removeFirst(); + if (seenId) { + if (fromStream && isPlusOrTransitiveClosure(token) && peekForTransitiveClosure()) { token.setType(InternalProblemParser.RULE_TRANSITIVE_CLOSURE); + } else if (lastVisible && isQualifiedNameSeparator(token)) { + token.setType(InternalProblemParser.RULE_QUALIFIED_NAME_SEPARATOR); } - } else if (isVisibleToken(token)) { - seenId = false; + } + lastVisible = isVisibleToken(token); + if (lastVisible) { + seenId = isIdentifier(token); } return token; } @@ -76,6 +78,10 @@ public class ProblemTokenSource implements TokenSource { return token.getType() == InternalProblemParser.PlusSign; } + protected boolean isQualifiedNameSeparator(Token token) { + return token.getType() == InternalProblemParser.ColonColon; + } + protected boolean isVisibleToken(Token token) { int tokenId = token.getType(); return tokenId != InternalProblemParser.RULE_WS && tokenId != InternalProblemParser.RULE_SL_COMMENT && @@ -87,11 +93,16 @@ public class ProblemTokenSource implements TokenSource { if (token.getType() != InternalProblemParser.LeftParenthesis) { return false; } + boolean allowFullyQualifiedName = true; while (true) { token = peekWithSkipWhitespace(); + if (allowFullyQualifiedName && token.getType() == InternalProblemParser.ColonColon) { + token = peekWithSkipWhitespace(); + } if (!isIdentifier(token)) { return false; } + allowFullyQualifiedName = false; token = peekWithSkipWhitespace(); switch (token.getType()) { case InternalProblemParser.Comma: @@ -112,11 +123,6 @@ public class ProblemTokenSource implements TokenSource { protected Token peekToken() { var token = delegate.nextToken(); - if (isIdentifier(token)) { - seenId = true; - } else if (isVisibleToken(token)) { - seenId = false; - } buffer.addLast(token); return token; } diff --git a/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescription.java b/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescription.java new file mode 100644 index 00000000..498a7c57 --- /dev/null +++ b/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescription.java @@ -0,0 +1,106 @@ +/******************************************************************************* + * Copyright (c) 2009, 2011 itemis AG (http://www.itemis.eu) and others. + * Copyright (c) 2024 The Refinery Authors + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0. + * SPDX-License-Identifier: EPL-2.0 + *******************************************************************************/ +package tools.refinery.language.resource; + +import org.apache.log4j.Logger; +import org.eclipse.emf.common.util.TreeIterator; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.emf.ecore.util.EcoreUtil; +import org.eclipse.xtext.resource.IDefaultResourceDescriptionStrategy; +import org.eclipse.xtext.resource.IEObjectDescription; +import org.eclipse.xtext.resource.impl.DefaultResourceDescription; +import org.eclipse.xtext.resource.impl.EObjectDescriptionLookUp; +import org.eclipse.xtext.util.IAcceptor; +import tools.refinery.language.naming.NamingUtil; + +import java.io.IOException; +import java.util.*; + +/** + * A resource description that takes {@link ProblemResourceDescriptionStrategy#SHADOWING_KEY} into account when + * describing EObjects. + *

+ * Based on {@link DefaultResourceDescription}. + */ +public class ProblemResourceDescription extends DefaultResourceDescription { + private static final Logger log = Logger.getLogger(ProblemResourceDescription.class); + + private final IDefaultResourceDescriptionStrategy strategy; + + public ProblemResourceDescription(Resource resource, IDefaultResourceDescriptionStrategy strategy) { + super(resource, strategy); + this.strategy = strategy; + } + + /** + * Based on {@link DefaultResourceDescription#computeExportedObjects()}. + * + * @return The computed exported objects, taking shadowing into account. + */ + @Override + protected List computeExportedObjects() { + if (!getResource().isLoaded()) { + try { + getResource().load(null); + } catch (IOException e) { + log.error(e.getMessage(), e); + return Collections.emptyList(); + } + } + final Map> nameToDescriptionsMap = + new LinkedHashMap<>(); + IAcceptor acceptor = eObjectDescription -> { + var key = ProblemResourceDescriptionStrategy.getShadowingKey(eObjectDescription); + var descriptions = nameToDescriptionsMap.computeIfAbsent(key, ignored -> new ArrayList<>()); + descriptions.add(eObjectDescription); + }; + TreeIterator allProperContents = EcoreUtil.getAllProperContents(getResource(), false); + while (allProperContents.hasNext()) { + EObject content = allProperContents.next(); + if (!strategy.createEObjectDescriptions(content, acceptor)) { + allProperContents.prune(); + } + } + return omitShadowedNames(nameToDescriptionsMap); + } + + private static List omitShadowedNames( + Map> nameToDescriptionsMap) { + final List exportedEObjects = new ArrayList<>(); + for (var entry : nameToDescriptionsMap.entrySet()) { + var descriptions = entry.getValue(); + if (NamingUtil.isFullyQualified(entry.getKey().name())) { + exportedEObjects.addAll(descriptions); + } else { + boolean foundPreferred = false; + for (var description : descriptions) { + if (ProblemResourceDescriptionStrategy.PREFERRED_NAME_TRUE.equals( + description.getUserData(ProblemResourceDescriptionStrategy.PREFERRED_NAME))) { + exportedEObjects.add(description); + foundPreferred = true; + } + } + if (!foundPreferred) { + exportedEObjects.addAll(descriptions); + } + } + } + return exportedEObjects; + } + + // Based on {@code DerivedStateAwareResourceDescriptionManager#createResourceDescription}. + @Override + protected EObjectDescriptionLookUp getLookUp() { + if (lookup == null) { + lookup = new EObjectDescriptionLookUp(computeExportedObjects()); + } + return lookup; + } +} diff --git a/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionManager.java b/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionManager.java new file mode 100644 index 00000000..23ca139a --- /dev/null +++ b/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionManager.java @@ -0,0 +1,19 @@ +/* + * SPDX-FileCopyrightText: 2024 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.language.resource; + +import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.xtext.resource.DerivedStateAwareResourceDescriptionManager; +import org.eclipse.xtext.resource.IDefaultResourceDescriptionStrategy; +import org.eclipse.xtext.resource.IResourceDescription; + +public class ProblemResourceDescriptionManager extends DerivedStateAwareResourceDescriptionManager { + @Override + protected IResourceDescription createResourceDescription(Resource resource, + IDefaultResourceDescriptionStrategy strategy) { + return new ProblemResourceDescription(resource, strategy); + } +} diff --git a/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java b/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java index 79dad6e7..76fd5852 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java +++ b/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java @@ -25,9 +25,16 @@ import java.util.Map; @Singleton public class ProblemResourceDescriptionStrategy extends DefaultResourceDescriptionStrategy { private static final String DATA_PREFIX = "tools.refinery.language.resource.ProblemResourceDescriptionStrategy."; + public static final String ARITY = DATA_PREFIX + "ARITY"; public static final String ERROR_PREDICATE = DATA_PREFIX + "ERROR_PREDICATE"; public static final String ERROR_PREDICATE_TRUE = "true"; + public static final String SHADOWING_KEY = DATA_PREFIX + "SHADOWING_KEY"; + public static final String SHADOWING_KEY_PROBLEM = "problem"; + public static final String SHADOWING_KEY_NODE = "node"; + public static final String SHADOWING_KEY_RELATION = "relation"; + public static final String PREFERRED_NAME = DATA_PREFIX + "PREFERRED_NAME"; + public static final String PREFERRED_NAME_TRUE = "true"; public static final String COLOR_RELATION = DATA_PREFIX + "COLOR_RELATION"; public static final String COLOR_RELATION_TRUE = "true"; @@ -44,8 +51,12 @@ public class ProblemResourceDescriptionStrategy extends DefaultResourceDescripti return true; } var problem = EcoreUtil2.getContainerOfType(eObject, Problem.class); - var problemQualifiedName = getNameAsQualifiedName(problem); var userData = getUserData(eObject); + if (eObject.equals(problem)) { + acceptEObjectDescription(eObject, qualifiedName, QualifiedName.EMPTY, userData, true, acceptor); + return true; + } + var problemQualifiedName = getNameAsQualifiedName(problem); QualifiedName lastQualifiedNameToExport = null; if (shouldExportSimpleName(eObject)) { lastQualifiedNameToExport = qualifiedName; @@ -82,10 +93,14 @@ public class ProblemResourceDescriptionStrategy extends DefaultResourceDescripti if (NamingUtil.isNullOrEmpty(name)) { return null; } - return qualifiedNameConverter.toQualifiedName(name); + var qualifiedName = qualifiedNameConverter.toQualifiedName(name); + if (eObject instanceof Problem) { + return NamingUtil.stripRootPrefix(qualifiedName); + } + return qualifiedName; } - protected boolean shouldExport(EObject eObject) { + public static boolean shouldExport(EObject eObject) { if (eObject instanceof Variable) { // Variables are always private to the containing predicate definition. return false; @@ -98,7 +113,12 @@ public class ProblemResourceDescriptionStrategy extends DefaultResourceDescripti protected Map getUserData(EObject eObject) { var builder = ImmutableMap.builder(); - if (eObject instanceof Relation relation) { + if (eObject instanceof Problem) { + builder.put(SHADOWING_KEY, SHADOWING_KEY_PROBLEM); + } else if (eObject instanceof Node) { + builder.put(SHADOWING_KEY, SHADOWING_KEY_NODE); + } else if (eObject instanceof Relation relation) { + builder.put(SHADOWING_KEY, SHADOWING_KEY_RELATION); int arity = ProblemUtil.getArity(relation); builder.put(ARITY, Integer.toString(arity)); } @@ -124,20 +144,31 @@ public class ProblemResourceDescriptionStrategy extends DefaultResourceDescripti } private void acceptEObjectDescription(EObject eObject, QualifiedName prefix, QualifiedName qualifiedName, - Map userData, boolean fullyQualified, + Map userData, boolean preferredName, IAcceptor acceptor) { var qualifiedNameWithPrefix = prefix == null ? qualifiedName : prefix.append(qualifiedName); - Map userDataWithFullyQualified; - if (fullyQualified && shouldColorRelation(eObject)) { - userDataWithFullyQualified = ImmutableMap.builder() + var userDataWithPreference = userData; + if (preferredName) { + userDataWithPreference = ImmutableMap.builder() .putAll(userData) - .put(COLOR_RELATION, COLOR_RELATION_TRUE) + .put(PREFERRED_NAME, PREFERRED_NAME_TRUE) .build(); - } else { - userDataWithFullyQualified = userData; } - var description = EObjectDescription.create(qualifiedNameWithPrefix, eObject, userDataWithFullyQualified); + var description = EObjectDescription.create(qualifiedNameWithPrefix, eObject, userDataWithPreference); acceptor.accept(description); + if (!preferredName) { + return; + } + var userDataWithFullyQualified = userDataWithPreference; + if (shouldColorRelation(eObject)) { + userDataWithFullyQualified = ImmutableMap.builder() + .putAll(userDataWithPreference) + .put(COLOR_RELATION, COLOR_RELATION_TRUE) + .build(); + } + var rootQualifiedName = NamingUtil.addRootPrefix(qualifiedNameWithPrefix); + var rootDescription = EObjectDescription.create(rootQualifiedName, eObject, userDataWithFullyQualified); + acceptor.accept(rootDescription); } private boolean shouldColorRelation(EObject eObject) { @@ -146,4 +177,11 @@ public class ProblemResourceDescriptionStrategy extends DefaultResourceDescripti } return eObject instanceof ClassDeclaration || eObject instanceof EnumDeclaration; } + + public static ShadowingKey getShadowingKey(IEObjectDescription description) { + return new ShadowingKey(description.getName(), description.getUserData(SHADOWING_KEY)); + } + + public record ShadowingKey(QualifiedName name, String shadowingKey) { + } } diff --git a/subprojects/language/src/main/java/tools/refinery/language/scoping/NormalizedSelectable.java b/subprojects/language/src/main/java/tools/refinery/language/scoping/NormalizedSelectable.java new file mode 100644 index 00000000..0c7828d8 --- /dev/null +++ b/subprojects/language/src/main/java/tools/refinery/language/scoping/NormalizedSelectable.java @@ -0,0 +1,122 @@ +/* + * SPDX-FileCopyrightText: 2024 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.language.scoping; + +import com.google.common.collect.Iterables; +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.xtext.naming.QualifiedName; +import org.eclipse.xtext.resource.IEObjectDescription; +import org.eclipse.xtext.resource.ISelectable; +import org.eclipse.xtext.resource.impl.AliasedEObjectDescription; +import org.jetbrains.annotations.NotNull; + +import java.util.Iterator; +import java.util.NoSuchElementException; + +public class NormalizedSelectable implements ISelectable { + private final ISelectable delegateSelectable; + private final QualifiedName originalPrefix; + private final QualifiedName normalizedPrefix; + + private NormalizedSelectable(ISelectable delegateSelectable, QualifiedName originalPrefix, + QualifiedName normalizedPrefix) { + this.delegateSelectable = delegateSelectable; + this.originalPrefix = originalPrefix; + this.normalizedPrefix = normalizedPrefix; + } + + @Override + public boolean isEmpty() { + return delegateSelectable.isEmpty(); + } + + @Override + public Iterable getExportedObjects() { + var delegateIterable = delegateSelectable.getExportedObjects(); + var aliasedIterable = getAliasedElements(delegateIterable); + return Iterables.concat(delegateIterable, aliasedIterable); + } + + @Override + public Iterable getExportedObjects(EClass type, QualifiedName name, boolean ignoreCase) { + var delegateIterable = delegateSelectable.getExportedObjects(type, name, ignoreCase); + boolean startsWith = ignoreCase ? name.startsWithIgnoreCase(normalizedPrefix) : + name.startsWith(normalizedPrefix); + if (startsWith && name.getSegmentCount() > normalizedPrefix.getSegmentCount()) { + var originalName = originalPrefix.append(name.skipFirst(normalizedPrefix.getSegmentCount())); + var originalIterable = Iterables.transform( + delegateSelectable.getExportedObjects(type, originalName, ignoreCase), + description -> { + var normalizedName = normalizedPrefix.append( + description.getName().skipFirst(originalPrefix.getSegmentCount())); + return new AliasedEObjectDescription(normalizedName, description); + }); + return Iterables.concat(originalIterable, delegateIterable); + } + return delegateIterable; + } + + @Override + public Iterable getExportedObjectsByType(EClass type) { + var delegateIterable = delegateSelectable.getExportedObjectsByType(type); + var aliasedIterable = getAliasedElements(delegateIterable); + return Iterables.concat(delegateIterable, aliasedIterable); + } + + @Override + public Iterable getExportedObjectsByObject(EObject object) { + var delegateIterable = delegateSelectable.getExportedObjectsByObject(object); + var aliasedIterable = getAliasedElements(delegateIterable); + return Iterables.concat(delegateIterable, aliasedIterable); + } + + private Iterable getAliasedElements(Iterable delegateIterable) { + return () -> new Iterator<>() { + private final Iterator delegateIterator = delegateIterable.iterator(); + private IEObjectDescription next = computeNext(); + + @Override + public boolean hasNext() { + return next != null; + } + + @Override + public IEObjectDescription next() { + if (!hasNext()) { + throw new NoSuchElementException(); + } + var current = next; + next = computeNext(); + return current; + } + + private IEObjectDescription computeNext() { + while (delegateIterator.hasNext()) { + var description = delegateIterator.next(); + var qualifiedName = description.getName(); + if (qualifiedName.startsWith(originalPrefix) && + qualifiedName.getSegmentCount() > originalPrefix.getSegmentCount()) { + var alias = normalizedPrefix.append(qualifiedName.skipFirst(originalPrefix.getSegmentCount())); + return new AliasedEObjectDescription(alias, description); + } + } + return null; + } + }; + } + + public static ISelectable of(@NotNull ISelectable delegateSelectable, @NotNull QualifiedName originalPrefix, + @NotNull QualifiedName normalizedPrefix) { + if (originalPrefix.equals(normalizedPrefix)) { + return delegateSelectable; + } + if (originalPrefix.equals(QualifiedName.EMPTY)) { + throw new IllegalArgumentException("Cannot normalize empty qualified name prefix"); + } + return new NormalizedSelectable(delegateSelectable, originalPrefix, normalizedPrefix); + } +} diff --git a/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemGlobalScopeProvider.java b/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemGlobalScopeProvider.java index 4d2dd772..37a67c0c 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemGlobalScopeProvider.java +++ b/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemGlobalScopeProvider.java @@ -5,14 +5,21 @@ */ package tools.refinery.language.scoping; -import java.util.LinkedHashSet; - +import com.google.common.base.Predicate; import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.xtext.naming.QualifiedName; +import org.eclipse.xtext.resource.IEObjectDescription; +import org.eclipse.xtext.resource.IResourceDescriptions; +import org.eclipse.xtext.resource.ISelectable; +import org.eclipse.xtext.scoping.IScope; import org.eclipse.xtext.scoping.impl.ImportUriGlobalScopeProvider; - +import org.eclipse.xtext.scoping.impl.SelectableBasedScope; import tools.refinery.language.utils.ProblemUtil; +import java.util.LinkedHashSet; + public class ProblemGlobalScopeProvider extends ImportUriGlobalScopeProvider { @Override protected LinkedHashSet getImportedUris(Resource resource) { @@ -20,4 +27,14 @@ public class ProblemGlobalScopeProvider extends ImportUriGlobalScopeProvider { importedUris.add(ProblemUtil.BUILTIN_LIBRARY_URI); return importedUris; } + + @Override + protected IScope createLazyResourceScope(IScope parent, URI uri, IResourceDescriptions descriptions, EClass type, + Predicate filter, boolean ignoreCase) { + ISelectable description = descriptions.getResourceDescription(uri); + if (description != null && ProblemUtil.BUILTIN_LIBRARY_URI.equals(uri)) { + description = NormalizedSelectable.of(description, QualifiedName.create("builtin"), QualifiedName.EMPTY); + } + return SelectableBasedScope.createScope(parent, description, filter, type, ignoreCase); + } } diff --git a/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemLocalScopeProvider.java b/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemLocalScopeProvider.java index 229960a0..9be32636 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemLocalScopeProvider.java +++ b/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemLocalScopeProvider.java @@ -1,47 +1,42 @@ /* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors + * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors * * SPDX-License-Identifier: EPL-2.0 */ package tools.refinery.language.scoping; -import java.util.List; - -import org.eclipse.emf.ecore.EObject; +import com.google.inject.Inject; import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.xtext.naming.IQualifiedNameProvider; import org.eclipse.xtext.naming.QualifiedName; -import org.eclipse.xtext.resource.IResourceDescriptions; import org.eclipse.xtext.resource.IResourceDescriptionsProvider; import org.eclipse.xtext.resource.ISelectable; -import org.eclipse.xtext.scoping.impl.ImportNormalizer; -import org.eclipse.xtext.scoping.impl.ImportedNamespaceAwareLocalScopeProvider; - -import com.google.inject.Inject; - -import tools.refinery.language.utils.ProblemUtil; +import org.eclipse.xtext.scoping.impl.SimpleLocalScopeProvider; +import tools.refinery.language.naming.NamingUtil; -public class ProblemLocalScopeProvider extends ImportedNamespaceAwareLocalScopeProvider { - private static final QualifiedName BUILTIN_LIBRARY_QUALIFIED_NAME = QualifiedName - .create(ProblemUtil.BUILTIN_LIBRARY_NAME); +public class ProblemLocalScopeProvider extends SimpleLocalScopeProvider { + @Inject + private IQualifiedNameProvider qualifiedNameProvider; @Inject private IResourceDescriptionsProvider resourceDescriptionsProvider; @Override - protected List getImplicitImports(boolean ignoreCase) { - return List.of(doCreateImportNormalizer(BUILTIN_LIBRARY_QUALIFIED_NAME, true, ignoreCase)); - } - - @Override - protected List getImportedNamespaceResolvers(EObject context, boolean ignoreCase) { - return List.of(); - } - - @Override - protected ISelectable internalGetAllDescriptions(Resource resource) { + protected ISelectable getAllDescriptions(Resource resource) { // Force the use of ProblemResourceDescriptionStrategy to include all QualifiedNames of objects. - IResourceDescriptions resourceDescriptions = resourceDescriptionsProvider + var resourceDescriptions = resourceDescriptionsProvider .getResourceDescriptions(resource.getResourceSet()); - return resourceDescriptions.getResourceDescription(resource.getURI()); + var resourceDescription = resourceDescriptions.getResourceDescription(resource.getURI()); + if (resourceDescription != null && !resource.getContents().isEmpty()) { + var rootElement = resource.getContents().getFirst(); + if (rootElement != null) { + var rootName = NamingUtil.stripRootPrefix(qualifiedNameProvider.getFullyQualifiedName(rootElement)); + if (rootName == null) { + return resourceDescription; + } + return NormalizedSelectable.of(resourceDescription, rootName, QualifiedName.EMPTY); + } + } + return resourceDescription; } } -- cgit v1.2.3-54-g00ecf From d5654f1ae03bec95c08e69a19a116c9825a27098 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Sat, 3 Feb 2024 01:39:11 +0100 Subject: feat(language): import resolution --- .../language/semantics/ModelInitializer.java | 230 ++++++++++++--------- .../refinery/language/ProblemRuntimeModule.java | 1 + .../refinery/language/library/BuiltinLibrary.java | 41 ++++ .../language/library/RefineryLibraries.java | 54 +++++ .../refinery/language/library/RefineryLibrary.java | 20 ++ .../language/resource/DerivedVariableComputer.java | 130 ------------ .../language/resource/ImplicitVariableScope.java | 143 ------------- .../LoadOnDemandResourceDescriptionProvider.java | 49 +++++ .../language/resource/NodeNameCollector.java | 79 ------- .../resource/ProblemDerivedStateComputer.java | 222 -------------------- .../ProblemResourceDescriptionStrategy.java | 12 ++ .../resource/state/DerivedVariableComputer.java | 130 ++++++++++++ .../resource/state/ImplicitVariableScope.java | 143 +++++++++++++ .../language/resource/state/NodeNameCollector.java | 79 +++++++ .../state/ProblemDerivedStateComputer.java | 222 ++++++++++++++++++++ .../language/scoping/CompositeSelectable.java | 62 ++++++ .../language/scoping/NormalizedSelectable.java | 37 ++-- .../scoping/ProblemGlobalScopeProvider.java | 84 ++++++-- .../scoping/ProblemLocalScopeProvider.java | 65 ++++-- .../refinery/language/scoping/imports/Import.java | 12 ++ .../language/scoping/imports/ImportCollection.java | 76 +++++++ .../language/scoping/imports/ImportCollector.java | 138 +++++++++++++ .../language/scoping/imports/NamedImport.java | 22 ++ .../language/scoping/imports/TransitiveImport.java | 11 + .../refinery/language/utils/ProblemDesugarer.java | 7 +- .../tools/refinery/language/utils/ProblemUtil.java | 16 +- ...tools.refinery.language.library.RefineryLibrary | 4 + .../tools/refinery/language/builtin.problem | 16 -- .../refinery/language/library/builtin.refinery | 16 ++ 29 files changed, 1365 insertions(+), 756 deletions(-) create mode 100644 subprojects/language/src/main/java/tools/refinery/language/library/BuiltinLibrary.java create mode 100644 subprojects/language/src/main/java/tools/refinery/language/library/RefineryLibraries.java create mode 100644 subprojects/language/src/main/java/tools/refinery/language/library/RefineryLibrary.java delete mode 100644 subprojects/language/src/main/java/tools/refinery/language/resource/DerivedVariableComputer.java delete mode 100644 subprojects/language/src/main/java/tools/refinery/language/resource/ImplicitVariableScope.java create mode 100644 subprojects/language/src/main/java/tools/refinery/language/resource/LoadOnDemandResourceDescriptionProvider.java delete mode 100644 subprojects/language/src/main/java/tools/refinery/language/resource/NodeNameCollector.java delete mode 100644 subprojects/language/src/main/java/tools/refinery/language/resource/ProblemDerivedStateComputer.java create mode 100644 subprojects/language/src/main/java/tools/refinery/language/resource/state/DerivedVariableComputer.java create mode 100644 subprojects/language/src/main/java/tools/refinery/language/resource/state/ImplicitVariableScope.java create mode 100644 subprojects/language/src/main/java/tools/refinery/language/resource/state/NodeNameCollector.java create mode 100644 subprojects/language/src/main/java/tools/refinery/language/resource/state/ProblemDerivedStateComputer.java create mode 100644 subprojects/language/src/main/java/tools/refinery/language/scoping/CompositeSelectable.java create mode 100644 subprojects/language/src/main/java/tools/refinery/language/scoping/imports/Import.java create mode 100644 subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportCollection.java create mode 100644 subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportCollector.java create mode 100644 subprojects/language/src/main/java/tools/refinery/language/scoping/imports/NamedImport.java create mode 100644 subprojects/language/src/main/java/tools/refinery/language/scoping/imports/TransitiveImport.java create mode 100644 subprojects/language/src/main/resources/META-INF/services/tools.refinery.language.library.RefineryLibrary delete mode 100644 subprojects/language/src/main/resources/tools/refinery/language/builtin.problem create mode 100644 subprojects/language/src/main/resources/tools/refinery/language/library/builtin.refinery diff --git a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ModelInitializer.java b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ModelInitializer.java index 7c649232..c2bca2a5 100644 --- a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ModelInitializer.java +++ b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ModelInitializer.java @@ -6,7 +6,9 @@ package tools.refinery.language.semantics; import com.google.inject.Inject; +import tools.refinery.language.library.BuiltinLibrary; import tools.refinery.language.model.problem.*; +import tools.refinery.language.scoping.imports.ImportCollector; import tools.refinery.language.semantics.internal.MutableSeed; import tools.refinery.language.utils.BuiltinSymbols; import tools.refinery.language.utils.ProblemDesugarer; @@ -51,8 +53,13 @@ public class ModelInitializer { @Inject private ProblemTraceImpl problemTrace; + @Inject + private ImportCollector importCollector; + private Problem problem; + private final Set importedProblems = new HashSet<>(); + private BuiltinSymbols builtinSymbols; private PartialRelation nodeRelation; @@ -82,6 +89,8 @@ public class ModelInitializer { throw new IllegalArgumentException("Problem was already set"); } this.problem = problem; + loadImportedProblems(); + importedProblems.add(problem); problemTrace.setProblem(problem); try { builtinSymbols = desugarer.getBuiltinSymbols(problem).orElseThrow(() -> new IllegalArgumentException( @@ -128,6 +137,29 @@ public class ModelInitializer { } } + private void loadImportedProblems() { + var resource = problem.eResource(); + if (resource == null) { + return; + } + var resourceSet = resource.getResourceSet(); + if (resourceSet == null) { + return; + } + var importedUris = importCollector.getAllImports(resource).toUriSet(); + for (var uri : importedUris) { + if (BuiltinLibrary.BUILTIN_LIBRARY_URI.equals(uri)) { + // We hard-code the behavior of the builtin library. + continue; + } + var importedResource = resourceSet.getResource(uri, false); + if (importedResource != null && !importedResource.getContents().isEmpty() && + importedResource.getContents().getFirst() instanceof Problem importedProblem) { + importedProblems.add(importedProblem); + } + } + } + public void configureStoreBuilder(ModelStoreBuilder storeBuilder) { checkProblem(); try { @@ -168,19 +200,21 @@ public class ModelInitializer { } private void collectNodes() { - for (var statement : problem.getStatements()) { - if (statement instanceof NodeDeclaration nodeDeclaration) { - for (var node : nodeDeclaration.getNodes()) { - collectNode(node); - } - } else if (statement instanceof ClassDeclaration classDeclaration) { - var newNode = classDeclaration.getNewNode(); - if (newNode != null) { - collectNode(newNode); - } - } else if (statement instanceof EnumDeclaration enumDeclaration) { - for (var literal : enumDeclaration.getLiterals()) { - collectNode(literal); + for (var importedProblem : importedProblems) { + for (var statement : importedProblem.getStatements()) { + if (statement instanceof NodeDeclaration nodeDeclaration) { + for (var node : nodeDeclaration.getNodes()) { + collectNode(node); + } + } else if (statement instanceof ClassDeclaration classDeclaration) { + var newNode = classDeclaration.getNewNode(); + if (newNode != null) { + collectNode(newNode); + } + } else if (statement instanceof EnumDeclaration enumDeclaration) { + for (var literal : enumDeclaration.getLiterals()) { + collectNode(literal); + } } } } @@ -194,13 +228,15 @@ public class ModelInitializer { } private void collectPartialSymbols() { - for (var statement : problem.getStatements()) { - if (statement instanceof ClassDeclaration classDeclaration) { - collectClassDeclarationSymbols(classDeclaration); - } else if (statement instanceof EnumDeclaration enumDeclaration) { - collectPartialRelation(enumDeclaration, 1, TruthValue.FALSE, TruthValue.FALSE); - } else if (statement instanceof PredicateDefinition predicateDefinition) { - collectPredicateDefinitionSymbol(predicateDefinition); + for (var importedProblem : importedProblems) { + for (var statement : importedProblem.getStatements()) { + if (statement instanceof ClassDeclaration classDeclaration) { + collectClassDeclarationSymbols(classDeclaration); + } else if (statement instanceof EnumDeclaration enumDeclaration) { + collectPartialRelation(enumDeclaration, 1, TruthValue.FALSE, TruthValue.FALSE); + } else if (statement instanceof PredicateDefinition predicateDefinition) { + collectPredicateDefinitionSymbol(predicateDefinition); + } } } } @@ -251,11 +287,13 @@ public class ModelInitializer { } private void collectMetamodel() { - for (var statement : problem.getStatements()) { - if (statement instanceof ClassDeclaration classDeclaration) { - collectClassDeclarationMetamodel(classDeclaration); - } else if (statement instanceof EnumDeclaration enumDeclaration) { - collectEnumMetamodel(enumDeclaration); + for (var importedProblem : importedProblems) { + for (var statement : importedProblem.getStatements()) { + if (statement instanceof ClassDeclaration classDeclaration) { + collectClassDeclarationMetamodel(classDeclaration); + } else if (statement instanceof EnumDeclaration enumDeclaration) { + collectEnumMetamodel(enumDeclaration); + } } } } @@ -350,15 +388,17 @@ public class ModelInitializer { } private void collectAssertions() { - for (var statement : problem.getStatements()) { - if (statement instanceof ClassDeclaration classDeclaration) { - collectClassDeclarationAssertions(classDeclaration); - } else if (statement instanceof EnumDeclaration enumDeclaration) { - collectEnumAssertions(enumDeclaration); - } else if (statement instanceof NodeDeclaration nodeDeclaration) { - collectNodeDeclarationAssertions(nodeDeclaration); - } else if (statement instanceof Assertion assertion) { - collectAssertion(assertion); + for (var importedProblem : importedProblems) { + for (var statement : importedProblem.getStatements()) { + if (statement instanceof ClassDeclaration classDeclaration) { + collectClassDeclarationAssertions(classDeclaration); + } else if (statement instanceof EnumDeclaration enumDeclaration) { + collectEnumAssertions(enumDeclaration); + } else if (statement instanceof NodeDeclaration nodeDeclaration) { + collectNodeDeclarationAssertions(nodeDeclaration); + } else if (statement instanceof Assertion assertion) { + collectAssertion(assertion); + } } } } @@ -429,9 +469,11 @@ public class ModelInitializer { } private void fixClassDeclarationAssertions() { - for (var statement : problem.getStatements()) { - if (statement instanceof ClassDeclaration classDeclaration) { - fixClassDeclarationAssertions(classDeclaration); + for (var importedProblem : importedProblems) { + for (var statement : importedProblem.getStatements()) { + if (statement instanceof ClassDeclaration classDeclaration) { + fixClassDeclarationAssertions(classDeclaration); + } } } } @@ -499,9 +541,11 @@ public class ModelInitializer { } private void collectPredicates(ModelStoreBuilder storeBuilder) { - for (var statement : problem.getStatements()) { - if (statement instanceof PredicateDefinition predicateDefinition) { - collectPredicateDefinitionTraced(predicateDefinition, storeBuilder); + for (var importedProblem : importedProblems) { + for (var statement : importedProblem.getStatements()) { + if (statement instanceof PredicateDefinition predicateDefinition) { + collectPredicateDefinitionTraced(predicateDefinition, storeBuilder); + } } } } @@ -601,51 +645,51 @@ public class ModelInitializer { private void toLiterals(Expr expr, Map localScope, List literals) { - switch (expr) { - case LogicConstant logicConstant -> { - switch (logicConstant.getLogicValue()) { - case TRUE -> literals.add(BooleanLiteral.TRUE); - case FALSE -> literals.add(BooleanLiteral.FALSE); - default -> throw new TracedException(logicConstant, "Unsupported literal"); - } - } - case Atom atom -> { - var target = getPartialRelation(atom.getRelation()); - var polarity = atom.isTransitiveClosure() ? CallPolarity.TRANSITIVE : CallPolarity.POSITIVE; - var argumentList = toArgumentList(atom.getArguments(), localScope, literals); - literals.add(target.call(polarity, argumentList)); - } - case NegationExpr negationExpr -> { - var body = negationExpr.getBody(); - if (!(body instanceof Atom atom)) { - throw new TracedException(body, "Cannot negate literal"); - } - var target = getPartialRelation(atom.getRelation()); - Constraint constraint; - if (atom.isTransitiveClosure()) { - constraint = Query.of(target.name() + "#transitive", (builder, p1, p2) -> builder.clause( - target.callTransitive(p1, p2) - )).getDnf(); - } else { - constraint = target; - } - var negatedScope = extendScope(localScope, negationExpr.getImplicitVariables()); - var argumentList = toArgumentList(atom.getArguments(), negatedScope, literals); - literals.add(constraint.call(CallPolarity.NEGATIVE, argumentList)); - } - case ComparisonExpr comparisonExpr -> { - var argumentList = toArgumentList(List.of(comparisonExpr.getLeft(), comparisonExpr.getRight()), - localScope, literals); - boolean positive = switch (comparisonExpr.getOp()) { - case EQ -> true; - case NOT_EQ -> false; - default -> throw new TracedException( - comparisonExpr, "Unsupported operator"); - }; - literals.add(new EquivalenceLiteral(positive, argumentList.get(0), argumentList.get(1))); - } - default -> throw new TracedException(expr, "Unsupported literal"); - } + switch (expr) { + case LogicConstant logicConstant -> { + switch (logicConstant.getLogicValue()) { + case TRUE -> literals.add(BooleanLiteral.TRUE); + case FALSE -> literals.add(BooleanLiteral.FALSE); + default -> throw new TracedException(logicConstant, "Unsupported literal"); + } + } + case Atom atom -> { + var target = getPartialRelation(atom.getRelation()); + var polarity = atom.isTransitiveClosure() ? CallPolarity.TRANSITIVE : CallPolarity.POSITIVE; + var argumentList = toArgumentList(atom.getArguments(), localScope, literals); + literals.add(target.call(polarity, argumentList)); + } + case NegationExpr negationExpr -> { + var body = negationExpr.getBody(); + if (!(body instanceof Atom atom)) { + throw new TracedException(body, "Cannot negate literal"); + } + var target = getPartialRelation(atom.getRelation()); + Constraint constraint; + if (atom.isTransitiveClosure()) { + constraint = Query.of(target.name() + "#transitive", (builder, p1, p2) -> builder.clause( + target.callTransitive(p1, p2) + )).getDnf(); + } else { + constraint = target; + } + var negatedScope = extendScope(localScope, negationExpr.getImplicitVariables()); + var argumentList = toArgumentList(atom.getArguments(), negatedScope, literals); + literals.add(constraint.call(CallPolarity.NEGATIVE, argumentList)); + } + case ComparisonExpr comparisonExpr -> { + var argumentList = toArgumentList(List.of(comparisonExpr.getLeft(), comparisonExpr.getRight()), + localScope, literals); + boolean positive = switch (comparisonExpr.getOp()) { + case EQ -> true; + case NOT_EQ -> false; + default -> throw new TracedException( + comparisonExpr, "Unsupported operator"); + }; + literals.add(new EquivalenceLiteral(positive, argumentList.get(0), argumentList.get(1))); + } + default -> throw new TracedException(expr, "Unsupported literal"); + } } private List toArgumentList( @@ -680,13 +724,15 @@ public class ModelInitializer { } private void collectScopes() { - for (var statement : problem.getStatements()) { - if (statement instanceof ScopeDeclaration scopeDeclaration) { - for (var typeScope : scopeDeclaration.getTypeScopes()) { - if (typeScope.isIncrement()) { - collectTypeScopeIncrement(typeScope); - } else { - collectTypeScope(typeScope); + for (var importedProblem : importedProblems) { + for (var statement : importedProblem.getStatements()) { + if (statement instanceof ScopeDeclaration scopeDeclaration) { + for (var typeScope : scopeDeclaration.getTypeScopes()) { + if (typeScope.isIncrement()) { + collectTypeScopeIncrement(typeScope); + } else { + collectTypeScope(typeScope); + } } } } diff --git a/subprojects/language/src/main/java/tools/refinery/language/ProblemRuntimeModule.java b/subprojects/language/src/main/java/tools/refinery/language/ProblemRuntimeModule.java index 19816da4..a846e265 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/ProblemRuntimeModule.java +++ b/subprojects/language/src/main/java/tools/refinery/language/ProblemRuntimeModule.java @@ -32,6 +32,7 @@ import tools.refinery.language.naming.ProblemQualifiedNameConverter; import tools.refinery.language.naming.ProblemQualifiedNameProvider; import tools.refinery.language.parser.antlr.TokenSourceInjectingProblemParser; import tools.refinery.language.resource.*; +import tools.refinery.language.resource.state.ProblemDerivedStateComputer; import tools.refinery.language.scoping.ProblemGlobalScopeProvider; import tools.refinery.language.scoping.ProblemLocalScopeProvider; import tools.refinery.language.serializer.PreferShortAssertionsProblemSemanticSequencer; diff --git a/subprojects/language/src/main/java/tools/refinery/language/library/BuiltinLibrary.java b/subprojects/language/src/main/java/tools/refinery/language/library/BuiltinLibrary.java new file mode 100644 index 00000000..0fb4cd2c --- /dev/null +++ b/subprojects/language/src/main/java/tools/refinery/language/library/BuiltinLibrary.java @@ -0,0 +1,41 @@ +/* + * SPDX-FileCopyrightText: 2024 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.language.library; + +import org.eclipse.emf.common.util.URI; +import org.eclipse.xtext.naming.QualifiedName; + +import java.util.List; +import java.util.Optional; + +public class BuiltinLibrary implements RefineryLibrary { + public static final QualifiedName BUILTIN_LIBRARY_NAME = QualifiedName.create("builtin"); + public static final URI BUILTIN_LIBRARY_URI = getLibraryUri(BUILTIN_LIBRARY_NAME).orElseThrow( + () -> new IllegalStateException("Builtin library was not found")); + + @Override + public List getAutomaticImports() { + return List.of(BUILTIN_LIBRARY_NAME); + } + + @Override + public Optional resolveQualifiedName(QualifiedName qualifiedName) { + if (qualifiedName.startsWith(BUILTIN_LIBRARY_NAME)) { + return getLibraryUri(qualifiedName); + } + return Optional.empty(); + } + + private static Optional getLibraryUri(QualifiedName qualifiedName) { + var libraryPath = String.join("/", qualifiedName.getSegments()); + var libraryResource = BuiltinLibrary.class.getClassLoader() + .getResource("tools/refinery/language/library/%s.refinery".formatted(libraryPath)); + if (libraryResource == null) { + return Optional.empty(); + } + return Optional.of(URI.createURI(libraryResource.toString())); + } +} diff --git a/subprojects/language/src/main/java/tools/refinery/language/library/RefineryLibraries.java b/subprojects/language/src/main/java/tools/refinery/language/library/RefineryLibraries.java new file mode 100644 index 00000000..0efca199 --- /dev/null +++ b/subprojects/language/src/main/java/tools/refinery/language/library/RefineryLibraries.java @@ -0,0 +1,54 @@ +/* + * SPDX-FileCopyrightText: 2024 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.language.library; + +import org.eclipse.emf.common.util.URI; +import org.eclipse.xtext.naming.QualifiedName; +import tools.refinery.language.scoping.imports.NamedImport; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Optional; +import java.util.ServiceLoader; + +public final class RefineryLibraries { + private static final ServiceLoader SERVICE_LOADER = ServiceLoader.load(RefineryLibrary.class); + private static final List AUTOMATIC_IMPORTS; + + static { + var imports = new LinkedHashMap(); + for (var service : SERVICE_LOADER) { + for (var qualifiedName : service.getAutomaticImports()) { + var uri = service.resolveQualifiedName(qualifiedName).orElseThrow( + () -> new IllegalStateException("Automatic import %s was not found".formatted(qualifiedName))); + if (imports.put(qualifiedName, uri) != null) { + throw new IllegalStateException("Duplicate automatic import " + qualifiedName); + } + } + } + AUTOMATIC_IMPORTS = imports.entrySet().stream() + .map(entry -> NamedImport.implicit(entry.getValue(), entry.getKey())) + .toList(); + } + + private RefineryLibraries() { + throw new IllegalStateException("This is a static utility class and should not be instantiated directly"); + } + + public static List getAutomaticImports() { + return AUTOMATIC_IMPORTS; + } + + public static Optional resolveQualifiedName(QualifiedName qualifiedName) { + for (var service : SERVICE_LOADER) { + var result = service.resolveQualifiedName(qualifiedName); + if (result.isPresent()) { + return result; + } + } + return Optional.empty(); + } +} diff --git a/subprojects/language/src/main/java/tools/refinery/language/library/RefineryLibrary.java b/subprojects/language/src/main/java/tools/refinery/language/library/RefineryLibrary.java new file mode 100644 index 00000000..9db2900e --- /dev/null +++ b/subprojects/language/src/main/java/tools/refinery/language/library/RefineryLibrary.java @@ -0,0 +1,20 @@ +/* + * SPDX-FileCopyrightText: 2024 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.language.library; + +import org.eclipse.emf.common.util.URI; +import org.eclipse.xtext.naming.QualifiedName; + +import java.util.List; +import java.util.Optional; + +public interface RefineryLibrary { + default List getAutomaticImports() { + return List.of(); + } + + Optional resolveQualifiedName(QualifiedName qualifiedName); +} diff --git a/subprojects/language/src/main/java/tools/refinery/language/resource/DerivedVariableComputer.java b/subprojects/language/src/main/java/tools/refinery/language/resource/DerivedVariableComputer.java deleted file mode 100644 index 07c5da41..00000000 --- a/subprojects/language/src/main/java/tools/refinery/language/resource/DerivedVariableComputer.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.language.resource; - -import com.google.inject.Inject; -import com.google.inject.Singleton; -import com.google.inject.name.Named; -import org.eclipse.xtext.linking.impl.LinkingHelper; -import org.eclipse.xtext.naming.IQualifiedNameConverter; -import org.eclipse.xtext.scoping.IScopeProvider; -import org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider; -import tools.refinery.language.model.problem.*; - -import java.util.*; - -@Singleton -public class DerivedVariableComputer { - @Inject - private LinkingHelper linkingHelper; - - @Inject - private IQualifiedNameConverter qualifiedNameConverter; - - @Inject - @Named(AbstractDeclarativeScopeProvider.NAMED_DELEGATE) - private IScopeProvider scopeProvider; - - public void installDerivedVariables(Problem problem, Set nodeNames) { - for (Statement statement : problem.getStatements()) { - if (statement instanceof ParametricDefinition definition) { - installDerivedParametricDefinitionState(definition, nodeNames); - } - } - } - - protected void installDerivedParametricDefinitionState(ParametricDefinition definition, Set nodeNames) { - Set knownVariables = new HashSet<>(nodeNames); - for (Parameter parameter : definition.getParameters()) { - String name = parameter.getName(); - if (name != null) { - knownVariables.add(name); - } - } - if (definition instanceof PredicateDefinition predicateDefinition) { - installDerivedPredicateDefinitionState(predicateDefinition, knownVariables); - } else if (definition instanceof FunctionDefinition functionDefinition) { - installDerivedFunctionDefinitionState(functionDefinition, knownVariables); - } else if (definition instanceof RuleDefinition ruleDefinition) { - installDerivedRuleDefinitionState(ruleDefinition, knownVariables); - } else { - throw new IllegalArgumentException("Unknown ParametricDefinition: " + definition); - } - } - - protected void installDerivedPredicateDefinitionState(PredicateDefinition definition, Set knownVariables) { - for (Conjunction body : definition.getBodies()) { - createVariablesForScope(new ImplicitVariableScope(body, knownVariables)); - } - } - - protected void installDerivedFunctionDefinitionState(FunctionDefinition definition, Set knownVariables) { - for (Case body : definition.getCases()) { - if (body instanceof Conjunction conjunction) { - createVariablesForScope(new ImplicitVariableScope(conjunction, knownVariables)); - } else if (body instanceof Match match) { - var condition = match.getCondition(); - if (condition != null) { - createVariablesForScope(new ImplicitVariableScope(match, match.getCondition(), knownVariables)); - } - } else { - throw new IllegalArgumentException("Unknown Case: " + body); - } - } - } - - protected void installDerivedRuleDefinitionState(RuleDefinition definition, Set knownVariables) { - for (Conjunction precondition : definition.getPreconditions()) { - createVariablesForScope(new ImplicitVariableScope(precondition, knownVariables)); - } - } - - protected void createVariablesForScope(ImplicitVariableScope scope) { - var queue = new ArrayDeque(); - queue.addLast(scope); - while (!queue.isEmpty()) { - var nextScope = queue.removeFirst(); - nextScope.createVariables(scopeProvider, linkingHelper, qualifiedNameConverter, queue); - } - } - - public void discardDerivedVariables(Problem problem) { - for (Statement statement : problem.getStatements()) { - if (statement instanceof ParametricDefinition parametricDefinition) { - discardParametricDefinitionState(parametricDefinition); - } - } - } - - protected void discardParametricDefinitionState(ParametricDefinition definition) { - List existentialQuantifiers = new ArrayList<>(); - List variableOrNodeExprs = new ArrayList<>(); - var treeIterator = definition.eAllContents(); - // We must collect the nodes where we are discarding derived state and only discard them after the iteration, - // because modifying the containment hierarchy during iteration causes the TreeIterator to fail with - // IndexOutOfBoundsException. - while (treeIterator.hasNext()) { - var child = treeIterator.next(); - var containingFeature = child.eContainingFeature(); - if (containingFeature == ProblemPackage.Literals.EXISTENTIAL_QUANTIFIER__IMPLICIT_VARIABLES || - containingFeature == ProblemPackage.Literals.VARIABLE_OR_NODE_EXPR__SINGLETON_VARIABLE) { - treeIterator.prune(); - } else if (child instanceof ExistentialQuantifier existentialQuantifier && - !existentialQuantifier.getImplicitVariables().isEmpty()) { - existentialQuantifiers.add(existentialQuantifier); - } else if (child instanceof VariableOrNodeExpr variableOrNodeExpr && - variableOrNodeExpr.getSingletonVariable() != null) { - variableOrNodeExprs.add(variableOrNodeExpr); - } - } - for (var existentialQuantifier : existentialQuantifiers) { - existentialQuantifier.getImplicitVariables().clear(); - } - for (var variableOrNodeExpr : variableOrNodeExprs) { - variableOrNodeExpr.setSingletonVariable(null); - } - } -} diff --git a/subprojects/language/src/main/java/tools/refinery/language/resource/ImplicitVariableScope.java b/subprojects/language/src/main/java/tools/refinery/language/resource/ImplicitVariableScope.java deleted file mode 100644 index e97c8287..00000000 --- a/subprojects/language/src/main/java/tools/refinery/language/resource/ImplicitVariableScope.java +++ /dev/null @@ -1,143 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.language.resource; - -import org.eclipse.emf.ecore.EObject; -import org.eclipse.xtext.linking.impl.LinkingHelper; -import org.eclipse.xtext.naming.IQualifiedNameConverter; -import org.eclipse.xtext.naming.QualifiedName; -import org.eclipse.xtext.nodemodel.INode; -import org.eclipse.xtext.nodemodel.util.NodeModelUtils; -import org.eclipse.xtext.scoping.IScope; -import org.eclipse.xtext.scoping.IScopeProvider; -import tools.refinery.language.model.problem.*; -import tools.refinery.language.naming.NamingUtil; - -import java.util.Deque; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -public class ImplicitVariableScope { - private final EObject root; - - private final ExistentialQuantifier quantifier; - - private final ImplicitVariableScope parent; - - private Set knownVariables; - - private ImplicitVariableScope(ExistentialQuantifier quantifier, ImplicitVariableScope parent) { - this.root = quantifier; - this.quantifier = quantifier; - this.parent = parent; - this.knownVariables = null; - } - - public ImplicitVariableScope(EObject root, ExistentialQuantifier quantifier, Set knownVariables) { - this.root = root; - this.quantifier = quantifier; - this.parent = null; - this.knownVariables = new HashSet<>(knownVariables); - } - - public ImplicitVariableScope(ExistentialQuantifier root, Set knownVariables) { - this(root, root, knownVariables); - } - - public void createVariables(IScopeProvider scopeProvider, LinkingHelper linkingHelper, - IQualifiedNameConverter qualifiedNameConverter, - Deque scopeQueue) { - initializeKnownVariables(); - processEObject(root, scopeProvider, linkingHelper, qualifiedNameConverter); - var treeIterator = root.eAllContents(); - while (treeIterator.hasNext()) { - var child = treeIterator.next(); - if (child instanceof ExistentialQuantifier nestedQuantifier) { - scopeQueue.addLast(new ImplicitVariableScope(nestedQuantifier, this)); - treeIterator.prune(); - } else { - processEObject(child, scopeProvider, linkingHelper, qualifiedNameConverter); - } - } - } - - private void initializeKnownVariables() { - boolean hasKnownVariables = knownVariables != null; - boolean hasParent = parent != null; - if ((hasKnownVariables && hasParent) || (!hasKnownVariables && !hasParent)) { - throw new IllegalStateException("Either known variables or parent must be provided, but not both"); - } - if (hasKnownVariables) { - return; - } - if (parent.knownVariables == null) { - throw new IllegalStateException("Parent scope must be processed before current scope"); - } - knownVariables = new HashSet<>(parent.knownVariables); - } - - private void processEObject(EObject eObject, IScopeProvider scopeProvider, LinkingHelper linkingHelper, - IQualifiedNameConverter qualifiedNameConverter) { - if (!(eObject instanceof VariableOrNodeExpr variableOrNodeExpr)) { - return; - } - IScope scope = scopeProvider.getScope(variableOrNodeExpr, - ProblemPackage.Literals.VARIABLE_OR_NODE_EXPR__VARIABLE_OR_NODE); - List nodes = NodeModelUtils.findNodesForFeature(variableOrNodeExpr, - ProblemPackage.Literals.VARIABLE_OR_NODE_EXPR__VARIABLE_OR_NODE); - for (INode node : nodes) { - var variableName = linkingHelper.getCrossRefNodeAsString(node, true); - var created = tryCreateVariableForArgument(variableOrNodeExpr, variableName, qualifiedNameConverter, - scope); - if (created) { - break; - } - } - } - - protected boolean tryCreateVariableForArgument(VariableOrNodeExpr variableOrNodeExpr, String variableName, - IQualifiedNameConverter qualifiedNameConverter, IScope scope) { - if (!NamingUtil.isValidId(variableName)) { - return false; - } - QualifiedName qualifiedName; - try { - qualifiedName = qualifiedNameConverter.toQualifiedName(variableName); - } catch (IllegalArgumentException e) { - return false; - } - if (scope.getSingleElement(qualifiedName) != null) { - return false; - } - if (NamingUtil.isSingletonVariableName(variableName)) { - createSingletonVariable(variableOrNodeExpr, variableName); - return true; - } - if (!knownVariables.contains(variableName)) { - createVariable(variableName); - return true; - } - return false; - } - - protected void createVariable(String variableName) { - knownVariables.add(variableName); - ImplicitVariable variable = createNamedVariable(variableName); - quantifier.getImplicitVariables().add(variable); - } - - protected void createSingletonVariable(VariableOrNodeExpr variableOrNodeExpr, String variableName) { - ImplicitVariable variable = createNamedVariable(variableName); - variableOrNodeExpr.setSingletonVariable(variable); - } - - protected ImplicitVariable createNamedVariable(String variableName) { - var variable = ProblemFactory.eINSTANCE.createImplicitVariable(); - variable.setName(variableName); - return variable; - } -} diff --git a/subprojects/language/src/main/java/tools/refinery/language/resource/LoadOnDemandResourceDescriptionProvider.java b/subprojects/language/src/main/java/tools/refinery/language/resource/LoadOnDemandResourceDescriptionProvider.java new file mode 100644 index 00000000..373a32f2 --- /dev/null +++ b/subprojects/language/src/main/java/tools/refinery/language/resource/LoadOnDemandResourceDescriptionProvider.java @@ -0,0 +1,49 @@ +/* + * SPDX-FileCopyrightText: 2024 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.language.resource; + +import com.google.inject.Inject; +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.xtext.EcoreUtil2; +import org.eclipse.xtext.resource.IResourceDescription; +import org.eclipse.xtext.resource.IResourceDescriptions; +import org.eclipse.xtext.resource.IResourceDescriptionsProvider; +import org.eclipse.xtext.scoping.impl.GlobalResourceDescriptionProvider; + +public class LoadOnDemandResourceDescriptionProvider { + @Inject + private IResourceDescriptionsProvider resourceDescriptionsProvider; + + @Inject + private GlobalResourceDescriptionProvider globalResourceDescriptionProvider; + + private Resource context; + private IResourceDescriptions resourceDescriptions; + + public void setContext(Resource context) { + if (this.context != null) { + throw new IllegalStateException("Context was already set"); + } + this.context = context; + resourceDescriptions = resourceDescriptionsProvider.getResourceDescriptions(context.getResourceSet()); + } + + public IResourceDescription getResourceDescription(URI uri) { + if (this.context == null) { + throw new IllegalStateException("Context was not set"); + } + var resourceDescription = resourceDescriptions.getResourceDescription(uri); + if (resourceDescription != null) { + return resourceDescription; + } + var importedResource = EcoreUtil2.getResource(context, uri.toString()); + if (importedResource == null) { + return null; + } + return globalResourceDescriptionProvider.getResourceDescription(importedResource); + } +} diff --git a/subprojects/language/src/main/java/tools/refinery/language/resource/NodeNameCollector.java b/subprojects/language/src/main/java/tools/refinery/language/resource/NodeNameCollector.java deleted file mode 100644 index e5deca4d..00000000 --- a/subprojects/language/src/main/java/tools/refinery/language/resource/NodeNameCollector.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.language.resource; - -import com.google.common.collect.ImmutableSet; -import com.google.inject.Inject; -import com.google.inject.name.Named; -import org.eclipse.emf.ecore.EObject; -import org.eclipse.xtext.linking.impl.LinkingHelper; -import org.eclipse.xtext.naming.IQualifiedNameConverter; -import org.eclipse.xtext.nodemodel.INode; -import org.eclipse.xtext.nodemodel.util.NodeModelUtils; -import org.eclipse.xtext.scoping.IScope; -import org.eclipse.xtext.scoping.IScopeProvider; -import org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider; -import tools.refinery.language.model.problem.*; -import tools.refinery.language.naming.NamingUtil; - -import java.util.List; -import java.util.Set; - -public class NodeNameCollector { - @Inject - private LinkingHelper linkingHelper; - - @Inject - private IQualifiedNameConverter qualifiedNameConverter; - - @Inject - @Named(AbstractDeclarativeScopeProvider.NAMED_DELEGATE) - private IScopeProvider scopeProvider; - - private final ImmutableSet.Builder nodeNames = ImmutableSet.builder(); - - private IScope nodeScope; - - public Set getNodeNames() { - return nodeNames.build(); - } - - public void collectNodeNames(Problem problem) { - nodeScope = scopeProvider.getScope(problem, ProblemPackage.Literals.NODE_ASSERTION_ARGUMENT__NODE); - for (Statement statement : problem.getStatements()) { - collectStatementNodeNames(statement); - } - } - - protected void collectStatementNodeNames(Statement statement) { - if (statement instanceof Assertion assertion) { - collectAssertionNodeNames(assertion); - } - } - - protected void collectAssertionNodeNames(Assertion assertion) { - for (AssertionArgument argument : assertion.getArguments()) { - if (argument instanceof NodeAssertionArgument) { - collectNodeNames(argument); - } - } - } - - private void collectNodeNames(EObject eObject) { - List nodes = NodeModelUtils.findNodesForFeature(eObject, - ProblemPackage.Literals.NODE_ASSERTION_ARGUMENT__NODE); - for (INode node : nodes) { - var nodeName = linkingHelper.getCrossRefNodeAsString(node, true); - if (!NamingUtil.isValidId(nodeName)) { - continue; - } - var qualifiedName = qualifiedNameConverter.toQualifiedName(nodeName); - if (nodeScope.getSingleElement(qualifiedName) == null) { - nodeNames.add(nodeName); - } - } - } -} diff --git a/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemDerivedStateComputer.java b/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemDerivedStateComputer.java deleted file mode 100644 index 31eb55a6..00000000 --- a/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemDerivedStateComputer.java +++ /dev/null @@ -1,222 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.language.resource; - -import com.google.inject.Inject; -import com.google.inject.Provider; -import com.google.inject.Singleton; -import com.google.inject.name.Named; -import org.eclipse.emf.common.notify.impl.AdapterImpl; -import org.eclipse.emf.ecore.EObject; -import org.eclipse.emf.ecore.resource.Resource; -import org.eclipse.emf.ecore.util.EcoreUtil; -import org.eclipse.xtext.Constants; -import org.eclipse.xtext.resource.DerivedStateAwareResource; -import org.eclipse.xtext.resource.IDerivedStateComputer; -import org.eclipse.xtext.resource.XtextResource; -import tools.refinery.language.model.problem.*; -import tools.refinery.language.utils.ProblemUtil; - -import java.util.*; -import java.util.function.Function; - -@Singleton -public class ProblemDerivedStateComputer implements IDerivedStateComputer { - public static final String NEW_NODE = "new"; - - @Inject - @Named(Constants.LANGUAGE_NAME) - private String languageName; - - @Inject - private Provider nodeNameCollectorProvider; - - @Inject - private DerivedVariableComputer derivedVariableComputer; - - @Override - public void installDerivedState(DerivedStateAwareResource resource, boolean preLinkingPhase) { - var problem = getProblem(resource); - if (problem != null) { - var adapter = getOrInstallAdapter(resource); - installDerivedProblemState(problem, adapter, preLinkingPhase); - } - } - - protected Problem getProblem(Resource resource) { - List contents = resource.getContents(); - if (contents.isEmpty()) { - return null; - } - EObject object = contents.get(0); - if (object instanceof Problem problem) { - return problem; - } - return null; - } - - protected void installDerivedProblemState(Problem problem, Adapter adapter, boolean preLinkingPhase) { - installDerivedClassDeclarationState(problem, adapter); - if (preLinkingPhase) { - return; - } - Set nodeNames = installDerivedNodes(problem); - derivedVariableComputer.installDerivedVariables(problem, nodeNames); - } - - protected void installDerivedClassDeclarationState(Problem problem, Adapter adapter) { - for (var statement : problem.getStatements()) { - if (statement instanceof ClassDeclaration classDeclaration) { - installOrRemoveNewNode(adapter, classDeclaration); - for (var featureDeclaration : classDeclaration.getFeatureDeclarations()) { - if (featureDeclaration instanceof ReferenceDeclaration referenceDeclaration) { - installOrRemoveInvalidMultiplicityPredicate(adapter, classDeclaration, referenceDeclaration); - } - } - } - } - } - - protected void installOrRemoveNewNode(Adapter adapter, ClassDeclaration declaration) { - if (declaration.isAbstract()) { - var newNode = declaration.getNewNode(); - if (newNode != null) { - declaration.setNewNode(null); - adapter.removeNewNode(declaration); - } - } else { - if (declaration.getNewNode() == null) { - var newNode = adapter.createNewNodeIfAbsent(declaration, key -> createNode(NEW_NODE)); - declaration.setNewNode(newNode); - } - } - } - - protected void installOrRemoveInvalidMultiplicityPredicate( - Adapter adapter, ClassDeclaration containingClassDeclaration, ReferenceDeclaration declaration) { - if (ProblemUtil.hasMultiplicityConstraint(declaration)) { - if (declaration.getInvalidMultiplicity() == null) { - var invalidMultiplicity = adapter.createInvalidMultiplicityPredicateIfAbsent(declaration, key -> { - var predicate = ProblemFactory.eINSTANCE.createPredicateDefinition(); - predicate.setError(true); - predicate.setName("invalidMultiplicity"); - var parameter = ProblemFactory.eINSTANCE.createParameter(); - parameter.setParameterType(containingClassDeclaration); - parameter.setName("node"); - predicate.getParameters().add(parameter); - return predicate; - }); - declaration.setInvalidMultiplicity(invalidMultiplicity); - } - } else { - var invalidMultiplicity = declaration.getInvalidMultiplicity(); - if (invalidMultiplicity != null) { - declaration.setInvalidMultiplicity(null); - adapter.removeInvalidMultiplicityPredicate(declaration); - } - } - } - - protected Set installDerivedNodes(Problem problem) { - var collector = nodeNameCollectorProvider.get(); - collector.collectNodeNames(problem); - Set nodeNames = collector.getNodeNames(); - List graphNodes = problem.getNodes(); - for (String nodeName : nodeNames) { - var graphNode = createNode(nodeName); - graphNodes.add(graphNode); - } - return nodeNames; - } - - protected Node createNode(String name) { - var node = ProblemFactory.eINSTANCE.createNode(); - node.setName(name); - return node; - } - - @Override - public void discardDerivedState(DerivedStateAwareResource resource) { - var problem = getProblem(resource); - if (problem != null) { - var adapter = getOrInstallAdapter(resource); - discardDerivedProblemState(problem, adapter); - } - } - - protected void discardDerivedProblemState(Problem problem, Adapter adapter) { - var abstractClassDeclarations = new HashSet(); - var referenceDeclarationsWithMultiplicity = new HashSet(); - problem.getNodes().clear(); - for (var statement : problem.getStatements()) { - if (statement instanceof ClassDeclaration classDeclaration) { - classDeclaration.setNewNode(null); - if (classDeclaration.isAbstract()) { - abstractClassDeclarations.add(classDeclaration); - } - for (var featureDeclaration : classDeclaration.getFeatureDeclarations()) { - if (featureDeclaration instanceof ReferenceDeclaration referenceDeclaration && - ProblemUtil.hasMultiplicityConstraint(referenceDeclaration)) { - referenceDeclarationsWithMultiplicity.add(referenceDeclaration); - } - } - } - } - adapter.retainAll(abstractClassDeclarations, referenceDeclarationsWithMultiplicity); - derivedVariableComputer.discardDerivedVariables(problem); - } - - protected Adapter getOrInstallAdapter(Resource resource) { - if (!(resource instanceof XtextResource)) { - return new Adapter(); - } - String resourceLanguageName = ((XtextResource) resource).getLanguageName(); - if (!languageName.equals(resourceLanguageName)) { - return new Adapter(); - } - var adapter = (Adapter) EcoreUtil.getAdapter(resource.eAdapters(), Adapter.class); - if (adapter == null) { - adapter = new Adapter(); - resource.eAdapters().add(adapter); - } - return adapter; - } - - protected static class Adapter extends AdapterImpl { - private final Map newNodes = new HashMap<>(); - private final Map invalidMultiplicityPredicates = new HashMap<>(); - - public Node createNewNodeIfAbsent(ClassDeclaration classDeclaration, - Function createNode) { - return newNodes.computeIfAbsent(classDeclaration, createNode); - } - - public void removeNewNode(ClassDeclaration classDeclaration) { - newNodes.remove(classDeclaration); - } - - public PredicateDefinition createInvalidMultiplicityPredicateIfAbsent( - ReferenceDeclaration referenceDeclaration, - Function createPredicate) { - return invalidMultiplicityPredicates.computeIfAbsent(referenceDeclaration, createPredicate); - } - - public void removeInvalidMultiplicityPredicate(ReferenceDeclaration referenceDeclaration) { - invalidMultiplicityPredicates.remove(referenceDeclaration); - } - - public void retainAll(Collection abstractClassDeclarations, - Collection referenceDeclarationsWithMultiplicity) { - newNodes.keySet().retainAll(abstractClassDeclarations); - invalidMultiplicityPredicates.keySet().retainAll(referenceDeclarationsWithMultiplicity); - } - - @Override - public boolean isAdapterForType(Object type) { - return Adapter.class == type; - } - } -} diff --git a/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java b/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java index 76fd5852..a2ec7ed0 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java +++ b/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java @@ -16,11 +16,13 @@ import org.eclipse.xtext.resource.EObjectDescription; import org.eclipse.xtext.resource.IEObjectDescription; import org.eclipse.xtext.resource.impl.DefaultResourceDescriptionStrategy; import org.eclipse.xtext.util.IAcceptor; +import tools.refinery.language.scoping.imports.ImportCollector; import tools.refinery.language.model.problem.*; import tools.refinery.language.naming.NamingUtil; import tools.refinery.language.utils.ProblemUtil; import java.util.Map; +import java.util.stream.Collectors; @Singleton public class ProblemResourceDescriptionStrategy extends DefaultResourceDescriptionStrategy { @@ -35,12 +37,17 @@ public class ProblemResourceDescriptionStrategy extends DefaultResourceDescripti public static final String SHADOWING_KEY_RELATION = "relation"; public static final String PREFERRED_NAME = DATA_PREFIX + "PREFERRED_NAME"; public static final String PREFERRED_NAME_TRUE = "true"; + public static final String IMPORTS = DATA_PREFIX + "IMPORTS"; + public static final String IMPORTS_SEPARATOR = "|"; public static final String COLOR_RELATION = DATA_PREFIX + "COLOR_RELATION"; public static final String COLOR_RELATION_TRUE = "true"; @Inject private IQualifiedNameConverter qualifiedNameConverter; + @Inject + private ImportCollector importCollector; + @Override public boolean createEObjectDescriptions(EObject eObject, IAcceptor acceptor) { if (!shouldExport(eObject)) { @@ -115,6 +122,11 @@ public class ProblemResourceDescriptionStrategy extends DefaultResourceDescripti var builder = ImmutableMap.builder(); if (eObject instanceof Problem) { builder.put(SHADOWING_KEY, SHADOWING_KEY_PROBLEM); + var explicitImports = importCollector.getDirectImports(eObject.eResource()); + var importsString = explicitImports.toList().stream() + .map(importEntry -> importEntry.uri().toString()) + .collect(Collectors.joining(IMPORTS_SEPARATOR)); + builder.put(IMPORTS, importsString); } else if (eObject instanceof Node) { builder.put(SHADOWING_KEY, SHADOWING_KEY_NODE); } else if (eObject instanceof Relation relation) { diff --git a/subprojects/language/src/main/java/tools/refinery/language/resource/state/DerivedVariableComputer.java b/subprojects/language/src/main/java/tools/refinery/language/resource/state/DerivedVariableComputer.java new file mode 100644 index 00000000..f0baf35f --- /dev/null +++ b/subprojects/language/src/main/java/tools/refinery/language/resource/state/DerivedVariableComputer.java @@ -0,0 +1,130 @@ +/* + * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.language.resource.state; + +import com.google.inject.Inject; +import com.google.inject.Singleton; +import com.google.inject.name.Named; +import org.eclipse.xtext.linking.impl.LinkingHelper; +import org.eclipse.xtext.naming.IQualifiedNameConverter; +import org.eclipse.xtext.scoping.IScopeProvider; +import org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider; +import tools.refinery.language.model.problem.*; + +import java.util.*; + +@Singleton +public class DerivedVariableComputer { + @Inject + private LinkingHelper linkingHelper; + + @Inject + private IQualifiedNameConverter qualifiedNameConverter; + + @Inject + @Named(AbstractDeclarativeScopeProvider.NAMED_DELEGATE) + private IScopeProvider scopeProvider; + + public void installDerivedVariables(Problem problem, Set nodeNames) { + for (Statement statement : problem.getStatements()) { + if (statement instanceof ParametricDefinition definition) { + installDerivedParametricDefinitionState(definition, nodeNames); + } + } + } + + protected void installDerivedParametricDefinitionState(ParametricDefinition definition, Set nodeNames) { + Set knownVariables = new HashSet<>(nodeNames); + for (Parameter parameter : definition.getParameters()) { + String name = parameter.getName(); + if (name != null) { + knownVariables.add(name); + } + } + if (definition instanceof PredicateDefinition predicateDefinition) { + installDerivedPredicateDefinitionState(predicateDefinition, knownVariables); + } else if (definition instanceof FunctionDefinition functionDefinition) { + installDerivedFunctionDefinitionState(functionDefinition, knownVariables); + } else if (definition instanceof RuleDefinition ruleDefinition) { + installDerivedRuleDefinitionState(ruleDefinition, knownVariables); + } else { + throw new IllegalArgumentException("Unknown ParametricDefinition: " + definition); + } + } + + protected void installDerivedPredicateDefinitionState(PredicateDefinition definition, Set knownVariables) { + for (Conjunction body : definition.getBodies()) { + createVariablesForScope(new ImplicitVariableScope(body, knownVariables)); + } + } + + protected void installDerivedFunctionDefinitionState(FunctionDefinition definition, Set knownVariables) { + for (Case body : definition.getCases()) { + if (body instanceof Conjunction conjunction) { + createVariablesForScope(new ImplicitVariableScope(conjunction, knownVariables)); + } else if (body instanceof Match match) { + var condition = match.getCondition(); + if (condition != null) { + createVariablesForScope(new ImplicitVariableScope(match, match.getCondition(), knownVariables)); + } + } else { + throw new IllegalArgumentException("Unknown Case: " + body); + } + } + } + + protected void installDerivedRuleDefinitionState(RuleDefinition definition, Set knownVariables) { + for (Conjunction precondition : definition.getPreconditions()) { + createVariablesForScope(new ImplicitVariableScope(precondition, knownVariables)); + } + } + + protected void createVariablesForScope(ImplicitVariableScope scope) { + var queue = new ArrayDeque(); + queue.addLast(scope); + while (!queue.isEmpty()) { + var nextScope = queue.removeFirst(); + nextScope.createVariables(scopeProvider, linkingHelper, qualifiedNameConverter, queue); + } + } + + public void discardDerivedVariables(Problem problem) { + for (Statement statement : problem.getStatements()) { + if (statement instanceof ParametricDefinition parametricDefinition) { + discardParametricDefinitionState(parametricDefinition); + } + } + } + + protected void discardParametricDefinitionState(ParametricDefinition definition) { + List existentialQuantifiers = new ArrayList<>(); + List variableOrNodeExprs = new ArrayList<>(); + var treeIterator = definition.eAllContents(); + // We must collect the nodes where we are discarding derived state and only discard them after the iteration, + // because modifying the containment hierarchy during iteration causes the TreeIterator to fail with + // IndexOutOfBoundsException. + while (treeIterator.hasNext()) { + var child = treeIterator.next(); + var containingFeature = child.eContainingFeature(); + if (containingFeature == ProblemPackage.Literals.EXISTENTIAL_QUANTIFIER__IMPLICIT_VARIABLES || + containingFeature == ProblemPackage.Literals.VARIABLE_OR_NODE_EXPR__SINGLETON_VARIABLE) { + treeIterator.prune(); + } else if (child instanceof ExistentialQuantifier existentialQuantifier && + !existentialQuantifier.getImplicitVariables().isEmpty()) { + existentialQuantifiers.add(existentialQuantifier); + } else if (child instanceof VariableOrNodeExpr variableOrNodeExpr && + variableOrNodeExpr.getSingletonVariable() != null) { + variableOrNodeExprs.add(variableOrNodeExpr); + } + } + for (var existentialQuantifier : existentialQuantifiers) { + existentialQuantifier.getImplicitVariables().clear(); + } + for (var variableOrNodeExpr : variableOrNodeExprs) { + variableOrNodeExpr.setSingletonVariable(null); + } + } +} diff --git a/subprojects/language/src/main/java/tools/refinery/language/resource/state/ImplicitVariableScope.java b/subprojects/language/src/main/java/tools/refinery/language/resource/state/ImplicitVariableScope.java new file mode 100644 index 00000000..e25887ad --- /dev/null +++ b/subprojects/language/src/main/java/tools/refinery/language/resource/state/ImplicitVariableScope.java @@ -0,0 +1,143 @@ +/* + * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.language.resource.state; + +import org.eclipse.emf.ecore.EObject; +import org.eclipse.xtext.linking.impl.LinkingHelper; +import org.eclipse.xtext.naming.IQualifiedNameConverter; +import org.eclipse.xtext.naming.QualifiedName; +import org.eclipse.xtext.nodemodel.INode; +import org.eclipse.xtext.nodemodel.util.NodeModelUtils; +import org.eclipse.xtext.scoping.IScope; +import org.eclipse.xtext.scoping.IScopeProvider; +import tools.refinery.language.model.problem.*; +import tools.refinery.language.naming.NamingUtil; + +import java.util.Deque; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class ImplicitVariableScope { + private final EObject root; + + private final ExistentialQuantifier quantifier; + + private final ImplicitVariableScope parent; + + private Set knownVariables; + + private ImplicitVariableScope(ExistentialQuantifier quantifier, ImplicitVariableScope parent) { + this.root = quantifier; + this.quantifier = quantifier; + this.parent = parent; + this.knownVariables = null; + } + + public ImplicitVariableScope(EObject root, ExistentialQuantifier quantifier, Set knownVariables) { + this.root = root; + this.quantifier = quantifier; + this.parent = null; + this.knownVariables = new HashSet<>(knownVariables); + } + + public ImplicitVariableScope(ExistentialQuantifier root, Set knownVariables) { + this(root, root, knownVariables); + } + + public void createVariables(IScopeProvider scopeProvider, LinkingHelper linkingHelper, + IQualifiedNameConverter qualifiedNameConverter, + Deque scopeQueue) { + initializeKnownVariables(); + processEObject(root, scopeProvider, linkingHelper, qualifiedNameConverter); + var treeIterator = root.eAllContents(); + while (treeIterator.hasNext()) { + var child = treeIterator.next(); + if (child instanceof ExistentialQuantifier nestedQuantifier) { + scopeQueue.addLast(new ImplicitVariableScope(nestedQuantifier, this)); + treeIterator.prune(); + } else { + processEObject(child, scopeProvider, linkingHelper, qualifiedNameConverter); + } + } + } + + private void initializeKnownVariables() { + boolean hasKnownVariables = knownVariables != null; + boolean hasParent = parent != null; + if ((hasKnownVariables && hasParent) || (!hasKnownVariables && !hasParent)) { + throw new IllegalStateException("Either known variables or parent must be provided, but not both"); + } + if (hasKnownVariables) { + return; + } + if (parent.knownVariables == null) { + throw new IllegalStateException("Parent scope must be processed before current scope"); + } + knownVariables = new HashSet<>(parent.knownVariables); + } + + private void processEObject(EObject eObject, IScopeProvider scopeProvider, LinkingHelper linkingHelper, + IQualifiedNameConverter qualifiedNameConverter) { + if (!(eObject instanceof VariableOrNodeExpr variableOrNodeExpr)) { + return; + } + IScope scope = scopeProvider.getScope(variableOrNodeExpr, + ProblemPackage.Literals.VARIABLE_OR_NODE_EXPR__VARIABLE_OR_NODE); + List nodes = NodeModelUtils.findNodesForFeature(variableOrNodeExpr, + ProblemPackage.Literals.VARIABLE_OR_NODE_EXPR__VARIABLE_OR_NODE); + for (INode node : nodes) { + var variableName = linkingHelper.getCrossRefNodeAsString(node, true); + var created = tryCreateVariableForArgument(variableOrNodeExpr, variableName, qualifiedNameConverter, + scope); + if (created) { + break; + } + } + } + + protected boolean tryCreateVariableForArgument(VariableOrNodeExpr variableOrNodeExpr, String variableName, + IQualifiedNameConverter qualifiedNameConverter, IScope scope) { + if (!NamingUtil.isValidId(variableName)) { + return false; + } + QualifiedName qualifiedName; + try { + qualifiedName = qualifiedNameConverter.toQualifiedName(variableName); + } catch (IllegalArgumentException e) { + return false; + } + if (scope.getSingleElement(qualifiedName) != null) { + return false; + } + if (NamingUtil.isSingletonVariableName(variableName)) { + createSingletonVariable(variableOrNodeExpr, variableName); + return true; + } + if (!knownVariables.contains(variableName)) { + createVariable(variableName); + return true; + } + return false; + } + + protected void createVariable(String variableName) { + knownVariables.add(variableName); + ImplicitVariable variable = createNamedVariable(variableName); + quantifier.getImplicitVariables().add(variable); + } + + protected void createSingletonVariable(VariableOrNodeExpr variableOrNodeExpr, String variableName) { + ImplicitVariable variable = createNamedVariable(variableName); + variableOrNodeExpr.setSingletonVariable(variable); + } + + protected ImplicitVariable createNamedVariable(String variableName) { + var variable = ProblemFactory.eINSTANCE.createImplicitVariable(); + variable.setName(variableName); + return variable; + } +} diff --git a/subprojects/language/src/main/java/tools/refinery/language/resource/state/NodeNameCollector.java b/subprojects/language/src/main/java/tools/refinery/language/resource/state/NodeNameCollector.java new file mode 100644 index 00000000..de4a607c --- /dev/null +++ b/subprojects/language/src/main/java/tools/refinery/language/resource/state/NodeNameCollector.java @@ -0,0 +1,79 @@ +/* + * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.language.resource.state; + +import com.google.common.collect.ImmutableSet; +import com.google.inject.Inject; +import com.google.inject.name.Named; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.xtext.linking.impl.LinkingHelper; +import org.eclipse.xtext.naming.IQualifiedNameConverter; +import org.eclipse.xtext.nodemodel.INode; +import org.eclipse.xtext.nodemodel.util.NodeModelUtils; +import org.eclipse.xtext.scoping.IScope; +import org.eclipse.xtext.scoping.IScopeProvider; +import org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider; +import tools.refinery.language.model.problem.*; +import tools.refinery.language.naming.NamingUtil; + +import java.util.List; +import java.util.Set; + +public class NodeNameCollector { + @Inject + private LinkingHelper linkingHelper; + + @Inject + private IQualifiedNameConverter qualifiedNameConverter; + + @Inject + @Named(AbstractDeclarativeScopeProvider.NAMED_DELEGATE) + private IScopeProvider scopeProvider; + + private final ImmutableSet.Builder nodeNames = ImmutableSet.builder(); + + private IScope nodeScope; + + public Set getNodeNames() { + return nodeNames.build(); + } + + public void collectNodeNames(Problem problem) { + nodeScope = scopeProvider.getScope(problem, ProblemPackage.Literals.NODE_ASSERTION_ARGUMENT__NODE); + for (Statement statement : problem.getStatements()) { + collectStatementNodeNames(statement); + } + } + + protected void collectStatementNodeNames(Statement statement) { + if (statement instanceof Assertion assertion) { + collectAssertionNodeNames(assertion); + } + } + + protected void collectAssertionNodeNames(Assertion assertion) { + for (AssertionArgument argument : assertion.getArguments()) { + if (argument instanceof NodeAssertionArgument) { + collectNodeNames(argument); + } + } + } + + private void collectNodeNames(EObject eObject) { + List nodes = NodeModelUtils.findNodesForFeature(eObject, + ProblemPackage.Literals.NODE_ASSERTION_ARGUMENT__NODE); + for (INode node : nodes) { + var nodeName = linkingHelper.getCrossRefNodeAsString(node, true); + if (!NamingUtil.isValidId(nodeName)) { + continue; + } + var qualifiedName = qualifiedNameConverter.toQualifiedName(nodeName); + if (nodeScope.getSingleElement(qualifiedName) == null) { + nodeNames.add(nodeName); + } + } + } +} diff --git a/subprojects/language/src/main/java/tools/refinery/language/resource/state/ProblemDerivedStateComputer.java b/subprojects/language/src/main/java/tools/refinery/language/resource/state/ProblemDerivedStateComputer.java new file mode 100644 index 00000000..d905aa9a --- /dev/null +++ b/subprojects/language/src/main/java/tools/refinery/language/resource/state/ProblemDerivedStateComputer.java @@ -0,0 +1,222 @@ +/* + * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.language.resource.state; + +import com.google.inject.Inject; +import com.google.inject.Provider; +import com.google.inject.Singleton; +import com.google.inject.name.Named; +import org.eclipse.emf.common.notify.impl.AdapterImpl; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.emf.ecore.util.EcoreUtil; +import org.eclipse.xtext.Constants; +import org.eclipse.xtext.resource.DerivedStateAwareResource; +import org.eclipse.xtext.resource.IDerivedStateComputer; +import org.eclipse.xtext.resource.XtextResource; +import tools.refinery.language.model.problem.*; +import tools.refinery.language.utils.ProblemUtil; + +import java.util.*; +import java.util.function.Function; + +@Singleton +public class ProblemDerivedStateComputer implements IDerivedStateComputer { + public static final String NEW_NODE = "new"; + + @Inject + @Named(Constants.LANGUAGE_NAME) + private String languageName; + + @Inject + private Provider nodeNameCollectorProvider; + + @Inject + private DerivedVariableComputer derivedVariableComputer; + + @Override + public void installDerivedState(DerivedStateAwareResource resource, boolean preLinkingPhase) { + var problem = getProblem(resource); + if (problem != null) { + var adapter = getOrInstallAdapter(resource); + installDerivedProblemState(problem, adapter, preLinkingPhase); + } + } + + protected Problem getProblem(Resource resource) { + List contents = resource.getContents(); + if (contents.isEmpty()) { + return null; + } + EObject object = contents.get(0); + if (object instanceof Problem problem) { + return problem; + } + return null; + } + + protected void installDerivedProblemState(Problem problem, Adapter adapter, boolean preLinkingPhase) { + installDerivedClassDeclarationState(problem, adapter); + if (preLinkingPhase) { + return; + } + Set nodeNames = installDerivedNodes(problem); + derivedVariableComputer.installDerivedVariables(problem, nodeNames); + } + + protected void installDerivedClassDeclarationState(Problem problem, Adapter adapter) { + for (var statement : problem.getStatements()) { + if (statement instanceof ClassDeclaration classDeclaration) { + installOrRemoveNewNode(adapter, classDeclaration); + for (var featureDeclaration : classDeclaration.getFeatureDeclarations()) { + if (featureDeclaration instanceof ReferenceDeclaration referenceDeclaration) { + installOrRemoveInvalidMultiplicityPredicate(adapter, classDeclaration, referenceDeclaration); + } + } + } + } + } + + protected void installOrRemoveNewNode(Adapter adapter, ClassDeclaration declaration) { + if (declaration.isAbstract()) { + var newNode = declaration.getNewNode(); + if (newNode != null) { + declaration.setNewNode(null); + adapter.removeNewNode(declaration); + } + } else { + if (declaration.getNewNode() == null) { + var newNode = adapter.createNewNodeIfAbsent(declaration, key -> createNode(NEW_NODE)); + declaration.setNewNode(newNode); + } + } + } + + protected void installOrRemoveInvalidMultiplicityPredicate( + Adapter adapter, ClassDeclaration containingClassDeclaration, ReferenceDeclaration declaration) { + if (ProblemUtil.hasMultiplicityConstraint(declaration)) { + if (declaration.getInvalidMultiplicity() == null) { + var invalidMultiplicity = adapter.createInvalidMultiplicityPredicateIfAbsent(declaration, key -> { + var predicate = ProblemFactory.eINSTANCE.createPredicateDefinition(); + predicate.setError(true); + predicate.setName("invalidMultiplicity"); + var parameter = ProblemFactory.eINSTANCE.createParameter(); + parameter.setParameterType(containingClassDeclaration); + parameter.setName("node"); + predicate.getParameters().add(parameter); + return predicate; + }); + declaration.setInvalidMultiplicity(invalidMultiplicity); + } + } else { + var invalidMultiplicity = declaration.getInvalidMultiplicity(); + if (invalidMultiplicity != null) { + declaration.setInvalidMultiplicity(null); + adapter.removeInvalidMultiplicityPredicate(declaration); + } + } + } + + protected Set installDerivedNodes(Problem problem) { + var collector = nodeNameCollectorProvider.get(); + collector.collectNodeNames(problem); + Set nodeNames = collector.getNodeNames(); + List graphNodes = problem.getNodes(); + for (String nodeName : nodeNames) { + var graphNode = createNode(nodeName); + graphNodes.add(graphNode); + } + return nodeNames; + } + + protected Node createNode(String name) { + var node = ProblemFactory.eINSTANCE.createNode(); + node.setName(name); + return node; + } + + @Override + public void discardDerivedState(DerivedStateAwareResource resource) { + var problem = getProblem(resource); + if (problem != null) { + var adapter = getOrInstallAdapter(resource); + discardDerivedProblemState(problem, adapter); + } + } + + protected void discardDerivedProblemState(Problem problem, Adapter adapter) { + var abstractClassDeclarations = new HashSet(); + var referenceDeclarationsWithMultiplicity = new HashSet(); + problem.getNodes().clear(); + for (var statement : problem.getStatements()) { + if (statement instanceof ClassDeclaration classDeclaration) { + classDeclaration.setNewNode(null); + if (classDeclaration.isAbstract()) { + abstractClassDeclarations.add(classDeclaration); + } + for (var featureDeclaration : classDeclaration.getFeatureDeclarations()) { + if (featureDeclaration instanceof ReferenceDeclaration referenceDeclaration && + ProblemUtil.hasMultiplicityConstraint(referenceDeclaration)) { + referenceDeclarationsWithMultiplicity.add(referenceDeclaration); + } + } + } + } + adapter.retainAll(abstractClassDeclarations, referenceDeclarationsWithMultiplicity); + derivedVariableComputer.discardDerivedVariables(problem); + } + + protected Adapter getOrInstallAdapter(Resource resource) { + if (!(resource instanceof XtextResource)) { + return new Adapter(); + } + String resourceLanguageName = ((XtextResource) resource).getLanguageName(); + if (!languageName.equals(resourceLanguageName)) { + return new Adapter(); + } + var adapter = (Adapter) EcoreUtil.getAdapter(resource.eAdapters(), Adapter.class); + if (adapter == null) { + adapter = new Adapter(); + resource.eAdapters().add(adapter); + } + return adapter; + } + + protected static class Adapter extends AdapterImpl { + private final Map newNodes = new HashMap<>(); + private final Map invalidMultiplicityPredicates = new HashMap<>(); + + public Node createNewNodeIfAbsent(ClassDeclaration classDeclaration, + Function createNode) { + return newNodes.computeIfAbsent(classDeclaration, createNode); + } + + public void removeNewNode(ClassDeclaration classDeclaration) { + newNodes.remove(classDeclaration); + } + + public PredicateDefinition createInvalidMultiplicityPredicateIfAbsent( + ReferenceDeclaration referenceDeclaration, + Function createPredicate) { + return invalidMultiplicityPredicates.computeIfAbsent(referenceDeclaration, createPredicate); + } + + public void removeInvalidMultiplicityPredicate(ReferenceDeclaration referenceDeclaration) { + invalidMultiplicityPredicates.remove(referenceDeclaration); + } + + public void retainAll(Collection abstractClassDeclarations, + Collection referenceDeclarationsWithMultiplicity) { + newNodes.keySet().retainAll(abstractClassDeclarations); + invalidMultiplicityPredicates.keySet().retainAll(referenceDeclarationsWithMultiplicity); + } + + @Override + public boolean isAdapterForType(Object type) { + return Adapter.class == type; + } + } +} diff --git a/subprojects/language/src/main/java/tools/refinery/language/scoping/CompositeSelectable.java b/subprojects/language/src/main/java/tools/refinery/language/scoping/CompositeSelectable.java new file mode 100644 index 00000000..0fddcaf9 --- /dev/null +++ b/subprojects/language/src/main/java/tools/refinery/language/scoping/CompositeSelectable.java @@ -0,0 +1,62 @@ +/* + * SPDX-FileCopyrightText: 2024 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.language.scoping; + +import com.google.common.collect.Iterables; +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.xtext.naming.QualifiedName; +import org.eclipse.xtext.resource.IEObjectDescription; +import org.eclipse.xtext.resource.ISelectable; + +import java.util.Collection; +import java.util.List; + +class CompositeSelectable implements ISelectable { + private static final CompositeSelectable EMPTY = new CompositeSelectable(List.of()); + + private final List children; + + private CompositeSelectable(List children) { + + this.children = children; + } + + @Override + public boolean isEmpty() { + return children.isEmpty(); + } + + @Override + public Iterable getExportedObjects() { + return Iterables.concat(Iterables.transform(children, ISelectable::getExportedObjects)); + } + + @Override + public Iterable getExportedObjects(EClass type, QualifiedName name, boolean ignoreCase) { + return Iterables.concat(Iterables.transform(children, child -> child.getExportedObjects(type, name, + ignoreCase))); + } + + @Override + public Iterable getExportedObjectsByType(EClass type) { + return Iterables.concat(Iterables.transform(children, child -> child.getExportedObjectsByType(type))); + } + + @Override + public Iterable getExportedObjectsByObject(EObject object) { + return Iterables.concat(Iterables.transform(children, child -> child.getExportedObjectsByObject(object))); + } + + public static ISelectable of(Collection children) { + var filteredChildren = children.stream().filter(selectable -> !selectable.isEmpty()).toList(); + return switch (filteredChildren.size()) { + case 0 -> EMPTY; + case 1 -> filteredChildren.getFirst(); + default -> new CompositeSelectable(filteredChildren); + }; + } +} diff --git a/subprojects/language/src/main/java/tools/refinery/language/scoping/NormalizedSelectable.java b/subprojects/language/src/main/java/tools/refinery/language/scoping/NormalizedSelectable.java index 0c7828d8..09fe4716 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/scoping/NormalizedSelectable.java +++ b/subprojects/language/src/main/java/tools/refinery/language/scoping/NormalizedSelectable.java @@ -12,18 +12,21 @@ import org.eclipse.xtext.naming.QualifiedName; import org.eclipse.xtext.resource.IEObjectDescription; import org.eclipse.xtext.resource.ISelectable; import org.eclipse.xtext.resource.impl.AliasedEObjectDescription; -import org.jetbrains.annotations.NotNull; import java.util.Iterator; +import java.util.List; import java.util.NoSuchElementException; -public class NormalizedSelectable implements ISelectable { +class NormalizedSelectable implements ISelectable { private final ISelectable delegateSelectable; private final QualifiedName originalPrefix; private final QualifiedName normalizedPrefix; - private NormalizedSelectable(ISelectable delegateSelectable, QualifiedName originalPrefix, - QualifiedName normalizedPrefix) { + public NormalizedSelectable(ISelectable delegateSelectable, QualifiedName originalPrefix, + QualifiedName normalizedPrefix) { + if (originalPrefix.equals(QualifiedName.EMPTY)) { + throw new IllegalArgumentException("Cannot normalize empty qualified name prefix"); + } this.delegateSelectable = delegateSelectable; this.originalPrefix = originalPrefix; this.normalizedPrefix = normalizedPrefix; @@ -37,41 +40,36 @@ public class NormalizedSelectable implements ISelectable { @Override public Iterable getExportedObjects() { var delegateIterable = delegateSelectable.getExportedObjects(); - var aliasedIterable = getAliasedElements(delegateIterable); - return Iterables.concat(delegateIterable, aliasedIterable); + return getAliasedElements(delegateIterable); } @Override public Iterable getExportedObjects(EClass type, QualifiedName name, boolean ignoreCase) { - var delegateIterable = delegateSelectable.getExportedObjects(type, name, ignoreCase); boolean startsWith = ignoreCase ? name.startsWithIgnoreCase(normalizedPrefix) : name.startsWith(normalizedPrefix); if (startsWith && name.getSegmentCount() > normalizedPrefix.getSegmentCount()) { var originalName = originalPrefix.append(name.skipFirst(normalizedPrefix.getSegmentCount())); - var originalIterable = Iterables.transform( + return Iterables.transform( delegateSelectable.getExportedObjects(type, originalName, ignoreCase), description -> { var normalizedName = normalizedPrefix.append( description.getName().skipFirst(originalPrefix.getSegmentCount())); return new AliasedEObjectDescription(normalizedName, description); }); - return Iterables.concat(originalIterable, delegateIterable); } - return delegateIterable; + return List.of(); } @Override public Iterable getExportedObjectsByType(EClass type) { var delegateIterable = delegateSelectable.getExportedObjectsByType(type); - var aliasedIterable = getAliasedElements(delegateIterable); - return Iterables.concat(delegateIterable, aliasedIterable); + return getAliasedElements(delegateIterable); } @Override public Iterable getExportedObjectsByObject(EObject object) { var delegateIterable = delegateSelectable.getExportedObjectsByObject(object); - var aliasedIterable = getAliasedElements(delegateIterable); - return Iterables.concat(delegateIterable, aliasedIterable); + return getAliasedElements(delegateIterable); } private Iterable getAliasedElements(Iterable delegateIterable) { @@ -108,15 +106,4 @@ public class NormalizedSelectable implements ISelectable { } }; } - - public static ISelectable of(@NotNull ISelectable delegateSelectable, @NotNull QualifiedName originalPrefix, - @NotNull QualifiedName normalizedPrefix) { - if (originalPrefix.equals(normalizedPrefix)) { - return delegateSelectable; - } - if (originalPrefix.equals(QualifiedName.EMPTY)) { - throw new IllegalArgumentException("Cannot normalize empty qualified name prefix"); - } - return new NormalizedSelectable(delegateSelectable, originalPrefix, normalizedPrefix); - } } diff --git a/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemGlobalScopeProvider.java b/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemGlobalScopeProvider.java index 37a67c0c..dad4e5d0 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemGlobalScopeProvider.java +++ b/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemGlobalScopeProvider.java @@ -6,35 +6,85 @@ package tools.refinery.language.scoping; import com.google.common.base.Predicate; -import org.eclipse.emf.common.util.URI; +import com.google.inject.Inject; +import com.google.inject.Provider; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.xtext.naming.QualifiedName; import org.eclipse.xtext.resource.IEObjectDescription; -import org.eclipse.xtext.resource.IResourceDescriptions; import org.eclipse.xtext.resource.ISelectable; import org.eclipse.xtext.scoping.IScope; -import org.eclipse.xtext.scoping.impl.ImportUriGlobalScopeProvider; +import org.eclipse.xtext.scoping.impl.AbstractGlobalScopeProvider; import org.eclipse.xtext.scoping.impl.SelectableBasedScope; -import tools.refinery.language.utils.ProblemUtil; +import org.eclipse.xtext.util.IResourceScopeCache; +import tools.refinery.language.scoping.imports.ImportCollector; +import tools.refinery.language.resource.LoadOnDemandResourceDescriptionProvider; +import tools.refinery.language.scoping.imports.NamedImport; -import java.util.LinkedHashSet; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; -public class ProblemGlobalScopeProvider extends ImportUriGlobalScopeProvider { +public class ProblemGlobalScopeProvider extends AbstractGlobalScopeProvider { + private static final String CACHE_KEY = "tools.refinery.language.scoping.ProblemGlobalScopeProvider.CACHE_KEY"; + + @Inject + private ImportCollector importCollector; + + @Inject + private Provider loadOnDemandProvider; + + @Inject + private IResourceScopeCache cache; + + // {@link com.google.common.base.Predicate} required by Xtext API. + @SuppressWarnings("squid:S4738") @Override - protected LinkedHashSet getImportedUris(Resource resource) { - LinkedHashSet importedUris = new LinkedHashSet<>(); - importedUris.add(ProblemUtil.BUILTIN_LIBRARY_URI); - return importedUris; + protected IScope getScope(Resource resource, boolean ignoreCase, EClass type, + Predicate filter) { + var loadedImports = cache.get(CACHE_KEY, resource, () -> computeLoadedImports(resource)); + var qualifiedScope = createScope(IScope.NULLSCOPE, loadedImports.qualifiedImports(), type, filter, ignoreCase); + var implicitScope = createScope(qualifiedScope, loadedImports.implicitImports(), type, filter, ignoreCase); + return createScope(implicitScope, loadedImports.explicitImports(), type, filter, ignoreCase); } - @Override - protected IScope createLazyResourceScope(IScope parent, URI uri, IResourceDescriptions descriptions, EClass type, - Predicate filter, boolean ignoreCase) { - ISelectable description = descriptions.getResourceDescription(uri); - if (description != null && ProblemUtil.BUILTIN_LIBRARY_URI.equals(uri)) { - description = NormalizedSelectable.of(description, QualifiedName.create("builtin"), QualifiedName.EMPTY); + protected LoadedImports computeLoadedImports(Resource resource) { + var imports = importCollector.getAllImports(resource); + var loadOnDemand = loadOnDemandProvider.get(); + loadOnDemand.setContext(resource); + var qualifiedImports = new ArrayList(); + var implicitImports = new ArrayList(); + var explicitImports = new ArrayList(); + for (var importEntry : imports.toList()) { + var uri = importEntry.uri(); + var resourceDescription = loadOnDemand.getResourceDescription(uri); + if (resourceDescription == null) { + continue; + } + qualifiedImports.add(resourceDescription); + if (importEntry instanceof NamedImport namedImport) { + var qualifiedName = namedImport.qualifiedName(); + if (namedImport.alsoImplicit()) { + implicitImports.add(new NormalizedSelectable(resourceDescription, qualifiedName, + QualifiedName.EMPTY)); + } + for (var alias : namedImport.aliases()) { + explicitImports.add(new NormalizedSelectable(resourceDescription, qualifiedName, alias)); + } + } } - return SelectableBasedScope.createScope(parent, description, filter, type, ignoreCase); + return new LoadedImports(qualifiedImports, implicitImports, explicitImports); + } + + // {@link com.google.common.base.Predicate} required by Xtext API. + @SuppressWarnings("squid:S4738") + protected IScope createScope(IScope parent, Collection children, EClass type, + Predicate filter, boolean ignoreCase) { + var selectable = CompositeSelectable.of(children); + return SelectableBasedScope.createScope(parent, selectable, filter, type, ignoreCase); + } + + protected record LoadedImports(List qualifiedImports, List implicitImports, + List explicitImports) { } } diff --git a/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemLocalScopeProvider.java b/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemLocalScopeProvider.java index 9be32636..3e00b87e 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemLocalScopeProvider.java +++ b/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemLocalScopeProvider.java @@ -6,37 +6,72 @@ package tools.refinery.language.scoping; import com.google.inject.Inject; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.xtext.naming.IQualifiedNameProvider; import org.eclipse.xtext.naming.QualifiedName; +import org.eclipse.xtext.resource.IResourceDescription; import org.eclipse.xtext.resource.IResourceDescriptionsProvider; import org.eclipse.xtext.resource.ISelectable; -import org.eclipse.xtext.scoping.impl.SimpleLocalScopeProvider; +import org.eclipse.xtext.scoping.IScope; +import org.eclipse.xtext.scoping.impl.AbstractGlobalScopeDelegatingScopeProvider; +import org.eclipse.xtext.scoping.impl.SelectableBasedScope; +import org.eclipse.xtext.util.IResourceScopeCache; import tools.refinery.language.naming.NamingUtil; -public class ProblemLocalScopeProvider extends SimpleLocalScopeProvider { +public class ProblemLocalScopeProvider extends AbstractGlobalScopeDelegatingScopeProvider { + private static final String CACHE_KEY = "tools.refinery.language.scoping.ProblemLocalScopeProvider.CACHE_KEY"; + @Inject private IQualifiedNameProvider qualifiedNameProvider; @Inject private IResourceDescriptionsProvider resourceDescriptionsProvider; + @Inject + private IResourceScopeCache cache; + @Override - protected ISelectable getAllDescriptions(Resource resource) { + public IScope getScope(EObject context, EReference reference) { + var resource = context.eResource(); + if (resource == null) { + return IScope.NULLSCOPE; + } + var localImports = cache.get(CACHE_KEY, resource, () -> computeLocalImports(resource)); + if (localImports.resourceDescription() == null) { + return IScope.NULLSCOPE; + } + var globalScope = getGlobalScope(resource, reference); + var type = reference.getEReferenceType(); + boolean ignoreCase = isIgnoreCase(reference); + var scope = SelectableBasedScope.createScope(globalScope, localImports.resourceDescription(), type, + ignoreCase); + if (localImports.normalizedSelectable() == null) { + return scope; + } + return SelectableBasedScope.createScope(scope, localImports.normalizedSelectable(), type, ignoreCase); + } + + protected LocalImports computeLocalImports(Resource resource) { // Force the use of ProblemResourceDescriptionStrategy to include all QualifiedNames of objects. - var resourceDescriptions = resourceDescriptionsProvider - .getResourceDescriptions(resource.getResourceSet()); + var resourceDescriptions = resourceDescriptionsProvider.getResourceDescriptions(resource.getResourceSet()); var resourceDescription = resourceDescriptions.getResourceDescription(resource.getURI()); - if (resourceDescription != null && !resource.getContents().isEmpty()) { - var rootElement = resource.getContents().getFirst(); - if (rootElement != null) { - var rootName = NamingUtil.stripRootPrefix(qualifiedNameProvider.getFullyQualifiedName(rootElement)); - if (rootName == null) { - return resourceDescription; - } - return NormalizedSelectable.of(resourceDescription, rootName, QualifiedName.EMPTY); - } + if (resourceDescription == null) { + return new LocalImports(null, null); + } + var rootElement = resource.getContents().getFirst(); + if (rootElement == null) { + return new LocalImports(resourceDescription, null); } - return resourceDescription; + var rootName = NamingUtil.stripRootPrefix(qualifiedNameProvider.getFullyQualifiedName(rootElement)); + if (rootName == null) { + return new LocalImports(resourceDescription, null); + } + var normalizedSelectable = new NormalizedSelectable(resourceDescription, rootName, QualifiedName.EMPTY); + return new LocalImports(resourceDescription, normalizedSelectable); + } + + protected record LocalImports(IResourceDescription resourceDescription, ISelectable normalizedSelectable) { } } diff --git a/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/Import.java b/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/Import.java new file mode 100644 index 00000000..e2f0d3d8 --- /dev/null +++ b/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/Import.java @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2024 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.language.scoping.imports; + +import org.eclipse.emf.common.util.URI; + +public sealed interface Import permits NamedImport, TransitiveImport { + URI uri(); +} diff --git a/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportCollection.java b/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportCollection.java new file mode 100644 index 00000000..63171138 --- /dev/null +++ b/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportCollection.java @@ -0,0 +1,76 @@ +/* + * SPDX-FileCopyrightText: 2024 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.language.scoping.imports; + +import org.eclipse.emf.common.util.URI; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +public class ImportCollection { + public static ImportCollection EMPTY = new ImportCollection() { + @Override + public void add(Import importEntry) { + throw new UnsupportedOperationException("Read-only collection"); + } + + @Override + public void remove(URI uri) { + throw new UnsupportedOperationException("Read-only collection"); + } + }; + + private final Map importMap = new HashMap<>(); + + public void add(Import importEntry) { + importMap.compute(importEntry.uri(), (ignored, originalEntry) -> merge(originalEntry, importEntry)); + } + + public void addAll(Iterable imports) { + imports.forEach(this::add); + } + + public void remove(URI uri) { + importMap.remove(uri); + } + + public List toList() { + return List.copyOf(importMap.values()); + } + + public Set toUriSet() { + return new LinkedHashSet<>(importMap.keySet()); + } + + @NotNull + private static Import merge(@Nullable Import left, @NotNull Import right) { + if (left == null) { + return right; + } + if (!left.uri().equals(right.uri())) { + throw new IllegalArgumentException("Expected URIs '%s' and '%s' to be equal".formatted( + left.uri(), right.uri())); + } + return switch (left) { + case TransitiveImport transitiveLeft -> + right instanceof TransitiveImport ? left : merge(right, transitiveLeft); + case NamedImport namedLeft -> switch (right) { + case TransitiveImport ignored -> namedLeft; + case NamedImport namedRight -> { + if (!namedLeft.qualifiedName().equals(namedRight.qualifiedName())) { + throw new IllegalArgumentException("Expected qualified names '%s' and '%s' to be equal" + .formatted(namedLeft.qualifiedName(), namedRight.qualifiedName())); + } + var mergedAliases = new LinkedHashSet<>(namedLeft.aliases()); + mergedAliases.addAll(namedRight.aliases()); + yield new NamedImport(namedLeft.uri(), namedLeft.qualifiedName(), + List.copyOf(mergedAliases), namedLeft.alsoImplicit() || namedRight.alsoImplicit()); + } + }; + }; + } +} diff --git a/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportCollector.java b/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportCollector.java new file mode 100644 index 00000000..cea99f0a --- /dev/null +++ b/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportCollector.java @@ -0,0 +1,138 @@ +/* + * SPDX-FileCopyrightText: 2024 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.language.scoping.imports; + +import com.google.common.base.Splitter; +import com.google.common.base.Strings; +import com.google.inject.Inject; +import com.google.inject.Provider; +import com.google.inject.Singleton; +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.xtext.linking.impl.LinkingHelper; +import org.eclipse.xtext.naming.IQualifiedNameConverter; +import org.eclipse.xtext.naming.QualifiedName; +import org.eclipse.xtext.nodemodel.util.NodeModelUtils; +import org.eclipse.xtext.resource.IEObjectDescription; +import org.eclipse.xtext.util.IResourceScopeCache; +import tools.refinery.language.library.RefineryLibraries; +import tools.refinery.language.model.problem.ImportStatement; +import tools.refinery.language.model.problem.Problem; +import tools.refinery.language.model.problem.ProblemPackage; +import tools.refinery.language.naming.NamingUtil; +import tools.refinery.language.resource.LoadOnDemandResourceDescriptionProvider; +import tools.refinery.language.resource.ProblemResourceDescriptionStrategy; + +import java.util.*; + +@Singleton +public class ImportCollector { + private static final String PREFIX = "tools.refinery.language.imports."; + private static final String DIRECT_IMPORTS_KEY = PREFIX + "DIRECT_IMPORTS"; + private static final String ALL_IMPORTS_KEY = PREFIX + "ALL_IMPORTS"; + + @Inject + private IResourceScopeCache cache; + + @Inject + private LinkingHelper linkingHelper; + + @Inject + private IQualifiedNameConverter qualifiedNameConverter; + + @Inject + private Provider loadOnDemandProvider; + + public ImportCollection getDirectImports(Resource resource) { + return cache.get(DIRECT_IMPORTS_KEY, resource, () -> this.computeDirectImports(resource)); + } + + protected ImportCollection computeDirectImports(Resource resource) { + if (resource.getContents().isEmpty() || !(resource.getContents().getFirst() instanceof Problem problem)) { + return ImportCollection.EMPTY; + } + Map> aliasesMap = new LinkedHashMap<>(); + for (var statement : problem.getStatements()) { + if (statement instanceof ImportStatement importStatement) { + collectImportStatement(importStatement, aliasesMap); + } + } + var collection = new ImportCollection(); + collection.addAll(RefineryLibraries.getAutomaticImports()); + for (var entry : aliasesMap.entrySet()) { + var qualifiedName = entry.getKey(); + RefineryLibraries.resolveQualifiedName(qualifiedName).ifPresent(uri -> { + if (!uri.equals(resource.getURI())) { + var aliases = entry.getValue(); + collection.add(NamedImport.explicit(uri, qualifiedName, List.copyOf(aliases))); + } + }); + } + collection.remove(resource.getURI()); + return collection; + } + + private void collectImportStatement(ImportStatement importStatement, Map> aliasesMap) { + var nodes = NodeModelUtils.findNodesForFeature(importStatement, + ProblemPackage.Literals.IMPORT_STATEMENT__IMPORTED_MODULE); + var aliasString = importStatement.getAlias(); + var alias = Strings.isNullOrEmpty(aliasString) ? QualifiedName.EMPTY : + NamingUtil.stripRootPrefix(qualifiedNameConverter.toQualifiedName(aliasString)); + for (var node : nodes) { + var qualifiedNameString = linkingHelper.getCrossRefNodeAsString(node, true); + if (Strings.isNullOrEmpty(qualifiedNameString)) { + continue; + } + var qualifiedName = NamingUtil.stripRootPrefix( + qualifiedNameConverter.toQualifiedName(qualifiedNameString)); + var aliases = aliasesMap.computeIfAbsent(qualifiedName, ignored -> new LinkedHashSet<>()); + aliases.add(alias); + } + } + + public ImportCollection getAllImports(Resource resource) { + return cache.get(ALL_IMPORTS_KEY, resource, () -> this.computeAllImports(resource)); + } + + protected ImportCollection computeAllImports(Resource resource) { + var collection = new ImportCollection(); + collection.addAll(getDirectImports(resource).toList()); + var loadOnDemand = loadOnDemandProvider.get(); + loadOnDemand.setContext(resource); + var seen = new HashSet(); + seen.add(resource.getURI()); + var queue = new ArrayDeque<>(collection.toUriSet()); + while (!queue.isEmpty()) { + var uri = queue.removeFirst(); + seen.add(uri); + collection.add(new TransitiveImport(uri)); + var resourceDescription = loadOnDemand.getResourceDescription(uri); + if (resourceDescription == null) { + continue; + } + var problemDescriptions = resourceDescription.getExportedObjectsByType(ProblemPackage.Literals.PROBLEM); + for (var eObjectDescription : problemDescriptions) { + for (var importedUri : getImports(eObjectDescription)) { + if (!seen.contains(importedUri)) { + queue.addLast(importedUri); + } + } + } + } + collection.remove(resource.getURI()); + return collection; + } + + protected List getImports(IEObjectDescription eObjectDescription) { + var importString = eObjectDescription.getUserData(ProblemResourceDescriptionStrategy.IMPORTS); + if (importString == null) { + return List.of(); + } + return Splitter.on(ProblemResourceDescriptionStrategy.IMPORTS_SEPARATOR).splitToStream(importString) + .map(URI::createURI) + .toList(); + } +} diff --git a/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/NamedImport.java b/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/NamedImport.java new file mode 100644 index 00000000..f5e89605 --- /dev/null +++ b/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/NamedImport.java @@ -0,0 +1,22 @@ +/* + * SPDX-FileCopyrightText: 2024 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.language.scoping.imports; + +import org.eclipse.emf.common.util.URI; +import org.eclipse.xtext.naming.QualifiedName; + +import java.util.List; + +public record NamedImport(URI uri, QualifiedName qualifiedName, List aliases, + boolean alsoImplicit) implements Import { + public static NamedImport implicit(URI uri, QualifiedName qualifiedName) { + return new NamedImport(uri, qualifiedName, List.of(), true); + } + + public static NamedImport explicit(URI uri, QualifiedName qualifiedName, List aliases) { + return new NamedImport(uri, qualifiedName, aliases, false); + } +} diff --git a/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/TransitiveImport.java b/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/TransitiveImport.java new file mode 100644 index 00000000..6f5ceaa6 --- /dev/null +++ b/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/TransitiveImport.java @@ -0,0 +1,11 @@ +/* + * SPDX-FileCopyrightText: 2024 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.language.scoping.imports; + +import org.eclipse.emf.common.util.URI; + +public record TransitiveImport(URI uri) implements Import { +} diff --git a/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemDesugarer.java b/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemDesugarer.java index 59e26561..0bd1e50b 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemDesugarer.java +++ b/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemDesugarer.java @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors + * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors * * SPDX-License-Identifier: EPL-2.0 */ @@ -11,6 +11,7 @@ import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.xtext.util.IResourceScopeCache; import org.eclipse.xtext.util.Tuples; +import tools.refinery.language.library.BuiltinLibrary; import tools.refinery.language.model.problem.*; import java.util.*; @@ -27,8 +28,8 @@ public class ProblemDesugarer { private Optional doGetBuiltinProblem(Resource resource) { return Optional.ofNullable(resource).map(Resource::getResourceSet) - .map(resourceSet -> resourceSet.getResource(ProblemUtil.BUILTIN_LIBRARY_URI, true)) - .map(Resource::getContents).filter(contents -> !contents.isEmpty()).map(contents -> contents.get(0)) + .map(resourceSet -> resourceSet.getResource(BuiltinLibrary.BUILTIN_LIBRARY_URI, true)) + .map(Resource::getContents).filter(contents -> !contents.isEmpty()).map(List::getFirst) .filter(Problem.class::isInstance).map(Problem.class::cast); } diff --git a/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemUtil.java b/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemUtil.java index 0f87c04b..23ff55e7 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemUtil.java +++ b/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemUtil.java @@ -5,16 +5,13 @@ */ package tools.refinery.language.utils; -import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.xtext.EcoreUtil2; +import tools.refinery.language.library.BuiltinLibrary; import tools.refinery.language.model.problem.*; public final class ProblemUtil { - public static final String BUILTIN_LIBRARY_NAME = "builtin"; - public static final URI BUILTIN_LIBRARY_URI = getLibraryUri(); - private ProblemUtil() { throw new IllegalStateException("This is a static utility class and should not be instantiated directly"); } @@ -23,7 +20,7 @@ public final class ProblemUtil { if (eObject != null) { var eResource = eObject.eResource(); if (eResource != null) { - return ProblemUtil.BUILTIN_LIBRARY_URI.equals(eResource.getURI()); + return BuiltinLibrary.BUILTIN_LIBRARY_URI.equals(eResource.getURI()); } } return false; @@ -131,13 +128,4 @@ public final class ProblemUtil { var problem = EcoreUtil2.getContainerOfType(eObject, Problem.class); return problem != null && problem.getKind() == ModuleKind.MODULE; } - - private static URI getLibraryUri() { - var libraryResource = ProblemUtil.class.getClassLoader() - .getResource("tools/refinery/language/%s.problem".formatted(BUILTIN_LIBRARY_NAME)); - if (libraryResource == null) { - throw new AssertionError("Library '%s' was not found".formatted(BUILTIN_LIBRARY_NAME)); - } - return URI.createURI(libraryResource.toString()); - } } diff --git a/subprojects/language/src/main/resources/META-INF/services/tools.refinery.language.library.RefineryLibrary b/subprojects/language/src/main/resources/META-INF/services/tools.refinery.language.library.RefineryLibrary new file mode 100644 index 00000000..bb7e369d --- /dev/null +++ b/subprojects/language/src/main/resources/META-INF/services/tools.refinery.language.library.RefineryLibrary @@ -0,0 +1,4 @@ +# SPDX-FileCopyrightText: 2024 The Refinery Authors +# +# SPDX-License-Identifier: EPL-2.0 +tools.refinery.language.library.BuiltinLibrary diff --git a/subprojects/language/src/main/resources/tools/refinery/language/builtin.problem b/subprojects/language/src/main/resources/tools/refinery/language/builtin.problem deleted file mode 100644 index 022c3167..00000000 --- a/subprojects/language/src/main/resources/tools/refinery/language/builtin.problem +++ /dev/null @@ -1,16 +0,0 @@ -% SPDX-FileCopyrightText: 2021-2023 The Refinery Authors -% -% SPDX-License-Identifier: EPL-2.0 -problem builtin. - -abstract class node. - -pred exists(node). - -pred equals(left, right). - -abstract class contained extends node. - -pred contains(container, contained contained). - -error invalidContainer(contained contained). diff --git a/subprojects/language/src/main/resources/tools/refinery/language/library/builtin.refinery b/subprojects/language/src/main/resources/tools/refinery/language/library/builtin.refinery new file mode 100644 index 00000000..022c3167 --- /dev/null +++ b/subprojects/language/src/main/resources/tools/refinery/language/library/builtin.refinery @@ -0,0 +1,16 @@ +% SPDX-FileCopyrightText: 2021-2023 The Refinery Authors +% +% SPDX-License-Identifier: EPL-2.0 +problem builtin. + +abstract class node. + +pred exists(node). + +pred equals(left, right). + +abstract class contained extends node. + +pred contains(container, contained contained). + +error invalidContainer(contained contained). -- cgit v1.2.3-54-g00ecf From 4dd2b4e1f45bf940d969181ae9b9176fa353c92e Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Sun, 4 Feb 2024 22:06:56 +0100 Subject: feat: filesystem-level import resolution Modules without an explicitly declared name get a name automatically inferred from their path. --- .../generator/cli/commands/GenerateCommand.java | 1 + .../tools/refinery/generator/ProblemLoader.java | 30 ++- subprojects/language-model/problem.aird | 2 +- .../language/semantics/SolutionSerializer.java | 5 +- .../refinery/language/library/BuiltinLibrary.java | 29 +-- .../language/library/ClasspathBasedLibrary.java | 98 +++++++++ .../refinery/language/library/PathLibrary.java | 90 ++++++++ .../language/library/RefineryLibraries.java | 54 ----- .../refinery/language/library/RefineryLibrary.java | 7 +- .../ProblemDelegateQualifiedNameProvider.java | 34 ++- .../ProblemResourceDescriptionStrategy.java | 27 ++- .../scoping/ProblemLocalScopeProvider.java | 8 +- .../language/scoping/imports/ImportAdapter.java | 230 +++++++++++++++++++++ .../language/scoping/imports/ImportCollector.java | 42 +++- .../tools/refinery/language/utils/ProblemUtil.java | 6 +- ...tools.refinery.language.library.RefineryLibrary | 1 + .../refinery/language/library/builtin.refinery | 4 +- 17 files changed, 556 insertions(+), 112 deletions(-) create mode 100644 subprojects/language/src/main/java/tools/refinery/language/library/ClasspathBasedLibrary.java create mode 100644 subprojects/language/src/main/java/tools/refinery/language/library/PathLibrary.java delete mode 100644 subprojects/language/src/main/java/tools/refinery/language/library/RefineryLibraries.java create mode 100644 subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportAdapter.java diff --git a/subprojects/generator-cli/src/main/java/tools/refinery/generator/cli/commands/GenerateCommand.java b/subprojects/generator-cli/src/main/java/tools/refinery/generator/cli/commands/GenerateCommand.java index b33fce23..b1c28df0 100644 --- a/subprojects/generator-cli/src/main/java/tools/refinery/generator/cli/commands/GenerateCommand.java +++ b/subprojects/generator-cli/src/main/java/tools/refinery/generator/cli/commands/GenerateCommand.java @@ -58,6 +58,7 @@ public class GenerateCommand { } public void run() throws IOException { + loader.extraPath(System.getProperty("user.dir")); var problem = isStandardStream(inputPath) ? loader.loadStream(System.in) : loader.loadFile(inputPath); problem = loader.loadScopeConstraints(problem, scopes, overrideScopes); var generator = generatorFactory.createGenerator(problem); diff --git a/subprojects/generator/src/main/java/tools/refinery/generator/ProblemLoader.java b/subprojects/generator/src/main/java/tools/refinery/generator/ProblemLoader.java index 20ea8132..e44dddc0 100644 --- a/subprojects/generator/src/main/java/tools/refinery/generator/ProblemLoader.java +++ b/subprojects/generator/src/main/java/tools/refinery/generator/ProblemLoader.java @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2023 The Refinery Authors + * SPDX-FileCopyrightText: 2023-2024 The Refinery Authors * * SPDX-License-Identifier: EPL-2.0 */ @@ -19,6 +19,7 @@ import org.eclipse.xtext.validation.IResourceValidator; import tools.refinery.language.model.problem.Problem; import tools.refinery.language.model.problem.Relation; import tools.refinery.language.model.problem.ScopeDeclaration; +import tools.refinery.language.scoping.imports.ImportAdapter; import tools.refinery.store.util.CancellationToken; import java.io.ByteArrayOutputStream; @@ -26,11 +27,14 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; +import java.nio.file.Path; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Map; +// This class is used as a fluent builder. +@SuppressWarnings("UnusedReturnValue") public class ProblemLoader { private String fileExtension; @@ -45,6 +49,8 @@ public class ProblemLoader { private CancellationToken cancellationToken = CancellationToken.NONE; + private final List extraPaths = new ArrayList<>(); + @Inject public void setFileExtensionProvider(FileExtensionProvider fileExtensionProvider) { this.fileExtension = fileExtensionProvider.getPrimaryFileExtension(); @@ -55,6 +61,15 @@ public class ProblemLoader { return this; } + public ProblemLoader extraPath(String path) { + return extraPath(Path.of(path)); + } + + public ProblemLoader extraPath(Path path) { + extraPaths.add(path.toAbsolutePath().normalize()); + return this; + } + public Problem loadString(String problemString, URI uri) throws IOException { try (var stream = new LazyStringInputStream(problemString)) { return loadStream(stream, uri); @@ -66,8 +81,8 @@ public class ProblemLoader { } public Problem loadStream(InputStream inputStream, URI uri) throws IOException { - var resourceSet = resourceSetProvider.get(); - var resourceUri = uri == null ? URI.createFileURI("__synthetic." + fileExtension) : uri; + var resourceSet = createResourceSet(); + var resourceUri = uri == null ? URI.createURI("__synthetic." + fileExtension) : uri; var resource = resourceFactory.createResource(resourceUri); resourceSet.getResources().add(resource); resource.load(inputStream, Map.of()); @@ -87,13 +102,20 @@ public class ProblemLoader { } public Problem loadUri(URI uri) throws IOException { - var resourceSet = resourceSetProvider.get(); + var resourceSet = createResourceSet(); var resource = resourceFactory.createResource(uri); resourceSet.getResources().add(resource); resource.load(Map.of()); return loadResource(resource); } + private XtextResourceSet createResourceSet() { + var resourceSet = resourceSetProvider.get(); + var adapter = ImportAdapter.getOrInstall(resourceSet); + adapter.getLibraryPaths().addAll(0, extraPaths); + return resourceSet; + } + public Problem loadResource(Resource resource) { var issues = resourceValidator.validate(resource, CheckMode.ALL, () -> { cancellationToken.checkCancelled(); diff --git a/subprojects/language-model/problem.aird b/subprojects/language-model/problem.aird index 6583d364..ed3a4b58 100644 --- a/subprojects/language-model/problem.aird +++ b/subprojects/language-model/problem.aird @@ -7,7 +7,7 @@ build/resources/main/model/problem.genmodel - + diff --git a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SolutionSerializer.java b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SolutionSerializer.java index 1bd419d8..dad867b8 100644 --- a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SolutionSerializer.java +++ b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SolutionSerializer.java @@ -19,6 +19,7 @@ import org.eclipse.xtext.resource.XtextResource; import org.eclipse.xtext.resource.XtextResourceSet; import org.eclipse.xtext.scoping.IScopeProvider; import tools.refinery.language.model.problem.*; +import tools.refinery.language.scoping.imports.ImportAdapter; import tools.refinery.language.utils.ProblemDesugarer; import tools.refinery.language.utils.ProblemUtil; import tools.refinery.store.model.Model; @@ -79,7 +80,7 @@ public class SolutionSerializer { } public Problem serializeSolution(ProblemTrace trace, Model model) { - var uri = URI.createFileURI("__synthetic" + fileExtension); + var uri = URI.createURI("__synthetic." + fileExtension); return serializeSolution(trace, model, uri); } @@ -133,6 +134,7 @@ public class SolutionSerializer { private Problem copyProblem(Problem originalProblem, URI uri) { var newResourceSet = resourceSetProvider.get(); + ImportAdapter.copySettings(originalProblem, newResourceSet); if (!fileExtension.equals(uri.fileExtension())) { uri = uri.appendFileExtension(fileExtension); } @@ -153,6 +155,7 @@ public class SolutionSerializer { throw new IllegalStateException("Failed to copy problem", e); } var contents = newResource.getContents(); + EcoreUtil.resolveAll(newResourceSet); if (!contents.isEmpty() && contents.getFirst() instanceof Problem newProblem) { return newProblem; } diff --git a/subprojects/language/src/main/java/tools/refinery/language/library/BuiltinLibrary.java b/subprojects/language/src/main/java/tools/refinery/language/library/BuiltinLibrary.java index 0fb4cd2c..d88d0299 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/library/BuiltinLibrary.java +++ b/subprojects/language/src/main/java/tools/refinery/language/library/BuiltinLibrary.java @@ -9,33 +9,14 @@ import org.eclipse.emf.common.util.URI; import org.eclipse.xtext.naming.QualifiedName; import java.util.List; -import java.util.Optional; -public class BuiltinLibrary implements RefineryLibrary { +public class BuiltinLibrary extends ClasspathBasedLibrary { public static final QualifiedName BUILTIN_LIBRARY_NAME = QualifiedName.create("builtin"); - public static final URI BUILTIN_LIBRARY_URI = getLibraryUri(BUILTIN_LIBRARY_NAME).orElseThrow( + public static final URI BUILTIN_LIBRARY_URI = ClasspathBasedLibrary.getLibraryUri( + BuiltinLibrary.class, BUILTIN_LIBRARY_NAME).orElseThrow( () -> new IllegalStateException("Builtin library was not found")); - @Override - public List getAutomaticImports() { - return List.of(BUILTIN_LIBRARY_NAME); - } - - @Override - public Optional resolveQualifiedName(QualifiedName qualifiedName) { - if (qualifiedName.startsWith(BUILTIN_LIBRARY_NAME)) { - return getLibraryUri(qualifiedName); - } - return Optional.empty(); - } - - private static Optional getLibraryUri(QualifiedName qualifiedName) { - var libraryPath = String.join("/", qualifiedName.getSegments()); - var libraryResource = BuiltinLibrary.class.getClassLoader() - .getResource("tools/refinery/language/library/%s.refinery".formatted(libraryPath)); - if (libraryResource == null) { - return Optional.empty(); - } - return Optional.of(URI.createURI(libraryResource.toString())); + public BuiltinLibrary() { + super(BUILTIN_LIBRARY_NAME, List.of(BUILTIN_LIBRARY_NAME)); } } diff --git a/subprojects/language/src/main/java/tools/refinery/language/library/ClasspathBasedLibrary.java b/subprojects/language/src/main/java/tools/refinery/language/library/ClasspathBasedLibrary.java new file mode 100644 index 00000000..4b748c64 --- /dev/null +++ b/subprojects/language/src/main/java/tools/refinery/language/library/ClasspathBasedLibrary.java @@ -0,0 +1,98 @@ +/* + * SPDX-FileCopyrightText: 2024 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.language.library; + +import org.eclipse.emf.common.util.URI; +import org.eclipse.xtext.naming.QualifiedName; + +import java.nio.file.Path; +import java.util.*; + +public abstract class ClasspathBasedLibrary implements RefineryLibrary { + private final QualifiedName prefix; + private final List automaticImports; + private final URI rootUri; + + protected ClasspathBasedLibrary(QualifiedName prefix, List automaticImports) { + this.prefix = prefix; + this.automaticImports = List.copyOf(automaticImports); + var context = this.getClass(); + var contextPath = context.getCanonicalName().replace('.', '/') + ".class"; + var contextResource = context.getClassLoader().getResource(contextPath); + if (contextResource == null) { + throw new IllegalStateException("Failed to find library context"); + } + var contextUri = URI.createURI(contextResource.toString()); + var segments = Arrays.copyOf(contextUri.segments(), contextUri.segmentCount() - 1); + rootUri = URI.createHierarchicalURI(contextUri.scheme(), contextUri.authority(), contextUri.device(), + segments, null, null); + } + + protected ClasspathBasedLibrary(QualifiedName prefix) { + this(prefix, List.of()); + } + + @Override + public List getAutomaticImports() { + return automaticImports; + } + + @Override + public Optional resolveQualifiedName(QualifiedName qualifiedName, List libraryPaths) { + if (qualifiedName.startsWith(prefix)) { + return getLibraryUri(this.getClass(), qualifiedName); + } + return Optional.empty(); + } + + @Override + public Optional getQualifiedName(URI uri, List libraryPaths) { + if (!uri.isHierarchical() || + !Objects.equals(rootUri.scheme(), uri.scheme()) || + !Objects.equals(rootUri.authority(), uri.authority()) || + !Objects.equals(rootUri.device(), uri.device()) || + rootUri.segmentCount() >= uri.segmentCount()) { + return Optional.empty(); + } + int rootSegmentCount = rootUri.segmentCount(); + int uriSegmentCount = uri.segmentCount(); + if (!uri.segment(uriSegmentCount - 1).endsWith(RefineryLibrary.EXTENSION)) { + return Optional.empty(); + } + var segments = new ArrayList(); + int i = 0; + while (i < rootSegmentCount) { + if (!rootUri.segment(i).equals(uri.segment(i))) { + return Optional.empty(); + } + i++; + } + while (i < uriSegmentCount) { + var segment = uri.segment(i); + if (i == uriSegmentCount - 1) { + segment = segment.substring(0, segment.length() - RefineryLibrary.EXTENSION.length()); + } + segments.add(segment); + i++; + } + var qualifiedName = QualifiedName.create(segments); + if (!qualifiedName.startsWith(prefix)) { + return Optional.empty(); + } + return Optional.of(qualifiedName); + } + + public static Optional getLibraryUri(Class context, QualifiedName qualifiedName) { + var packagePath = context.getPackageName().replace('.', '/'); + var libraryPath = String.join("/", qualifiedName.getSegments()); + var resourceName = "%s/%s%s".formatted(packagePath, libraryPath, RefineryLibrary.EXTENSION); + var resource = context.getClassLoader().getResource(resourceName); + if (resource == null) { + return Optional.empty(); + } + return Optional.of(URI.createURI(resource.toString())); + } +} diff --git a/subprojects/language/src/main/java/tools/refinery/language/library/PathLibrary.java b/subprojects/language/src/main/java/tools/refinery/language/library/PathLibrary.java new file mode 100644 index 00000000..c6f994df --- /dev/null +++ b/subprojects/language/src/main/java/tools/refinery/language/library/PathLibrary.java @@ -0,0 +1,90 @@ +/* + * SPDX-FileCopyrightText: 2024 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.language.library; + +import org.eclipse.emf.common.util.URI; +import org.eclipse.xtext.naming.QualifiedName; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +public final class PathLibrary implements RefineryLibrary { + @Override + public Optional resolveQualifiedName(QualifiedName qualifiedName, List libraryPaths) { + if (libraryPaths.isEmpty()) { + return Optional.empty(); + } + if (qualifiedName.getSegmentCount() == 0) { + return Optional.empty(); + } + var relativePath = qualifiedNameToRelativePath(qualifiedName); + for (var library : libraryPaths) { + var absoluteResolvedPath = library.resolve(relativePath).toAbsolutePath().normalize(); + if (absoluteResolvedPath.startsWith(library) && Files.exists(absoluteResolvedPath)) { + var uri = URI.createFileURI(absoluteResolvedPath.toString()); + return Optional.of(uri); + } + } + return Optional.empty(); + } + + private static Path qualifiedNameToRelativePath(QualifiedName qualifiedName) { + int segmentCount = qualifiedName.getSegmentCount(); + String first = null; + var rest = new String[segmentCount - 1]; + for (var i = 0; i < segmentCount; i++) { + var segment = qualifiedName.getSegment(i); + if (i == segmentCount - 1) { + segment = segment + RefineryLibrary.EXTENSION; + } + if (i == 0) { + first = segment; + } else { + rest[i - 1] = segment; + } + } + if (first == null) { + throw new AssertionError("Expected qualified name to have non-null segments"); + } + return Path.of(first, rest); + } + + @Override + public Optional getQualifiedName(URI uri, List libraryPaths) { + if (libraryPaths.isEmpty()) { + return Optional.empty(); + } + if (!uri.isFile() || !uri.hasAbsolutePath()) { + return Optional.empty(); + } + var path = Path.of(uri.toFileString()); + for (var library : libraryPaths) { + if (path.startsWith(library)) { + return getRelativeQualifiedName(library, path); + } + } + return Optional.empty(); + } + + private static Optional getRelativeQualifiedName(Path library, Path path) { + var relativePath = path.relativize(library); + var segments = new ArrayList(); + for (Path value : relativePath) { + segments.add(value.toString()); + } + int lastIndex = segments.size() - 1; + var lastSegment = segments.get(lastIndex); + if (!lastSegment.endsWith(EXTENSION)) { + return Optional.empty(); + } + lastSegment = lastSegment.substring(0, lastSegment.length() - RefineryLibrary.EXTENSION.length()); + segments.set(lastIndex, lastSegment); + return Optional.of(QualifiedName.create(segments)); + } +} diff --git a/subprojects/language/src/main/java/tools/refinery/language/library/RefineryLibraries.java b/subprojects/language/src/main/java/tools/refinery/language/library/RefineryLibraries.java deleted file mode 100644 index 0efca199..00000000 --- a/subprojects/language/src/main/java/tools/refinery/language/library/RefineryLibraries.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2024 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.language.library; - -import org.eclipse.emf.common.util.URI; -import org.eclipse.xtext.naming.QualifiedName; -import tools.refinery.language.scoping.imports.NamedImport; - -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Optional; -import java.util.ServiceLoader; - -public final class RefineryLibraries { - private static final ServiceLoader SERVICE_LOADER = ServiceLoader.load(RefineryLibrary.class); - private static final List AUTOMATIC_IMPORTS; - - static { - var imports = new LinkedHashMap(); - for (var service : SERVICE_LOADER) { - for (var qualifiedName : service.getAutomaticImports()) { - var uri = service.resolveQualifiedName(qualifiedName).orElseThrow( - () -> new IllegalStateException("Automatic import %s was not found".formatted(qualifiedName))); - if (imports.put(qualifiedName, uri) != null) { - throw new IllegalStateException("Duplicate automatic import " + qualifiedName); - } - } - } - AUTOMATIC_IMPORTS = imports.entrySet().stream() - .map(entry -> NamedImport.implicit(entry.getValue(), entry.getKey())) - .toList(); - } - - private RefineryLibraries() { - throw new IllegalStateException("This is a static utility class and should not be instantiated directly"); - } - - public static List getAutomaticImports() { - return AUTOMATIC_IMPORTS; - } - - public static Optional resolveQualifiedName(QualifiedName qualifiedName) { - for (var service : SERVICE_LOADER) { - var result = service.resolveQualifiedName(qualifiedName); - if (result.isPresent()) { - return result; - } - } - return Optional.empty(); - } -} diff --git a/subprojects/language/src/main/java/tools/refinery/language/library/RefineryLibrary.java b/subprojects/language/src/main/java/tools/refinery/language/library/RefineryLibrary.java index 9db2900e..e1f8d7bc 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/library/RefineryLibrary.java +++ b/subprojects/language/src/main/java/tools/refinery/language/library/RefineryLibrary.java @@ -8,13 +8,18 @@ package tools.refinery.language.library; import org.eclipse.emf.common.util.URI; import org.eclipse.xtext.naming.QualifiedName; +import java.nio.file.Path; import java.util.List; import java.util.Optional; public interface RefineryLibrary { + String EXTENSION = ".refinery"; + default List getAutomaticImports() { return List.of(); } - Optional resolveQualifiedName(QualifiedName qualifiedName); + Optional resolveQualifiedName(QualifiedName qualifiedName, List libraryPaths); + + Optional getQualifiedName(URI uri, List libraryPaths); } diff --git a/subprojects/language/src/main/java/tools/refinery/language/naming/ProblemDelegateQualifiedNameProvider.java b/subprojects/language/src/main/java/tools/refinery/language/naming/ProblemDelegateQualifiedNameProvider.java index 1e78cee1..b3931401 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/naming/ProblemDelegateQualifiedNameProvider.java +++ b/subprojects/language/src/main/java/tools/refinery/language/naming/ProblemDelegateQualifiedNameProvider.java @@ -5,14 +5,40 @@ */ package tools.refinery.language.naming; +import com.google.inject.Inject; import org.eclipse.xtext.naming.DefaultDeclarativeQualifiedNameProvider; +import org.eclipse.xtext.naming.IQualifiedNameConverter; import org.eclipse.xtext.naming.QualifiedName; import tools.refinery.language.model.problem.Problem; +import tools.refinery.language.scoping.imports.ImportAdapter; +import tools.refinery.language.utils.ProblemUtil; public class ProblemDelegateQualifiedNameProvider extends DefaultDeclarativeQualifiedNameProvider { - protected QualifiedName qualifiedName(Problem ele) { - var qualifiedName = computeFullyQualifiedNameFromNameAttribute(ele); - // Strip the root prefix even if explicitly provided. - return NamingUtil.stripRootPrefix(qualifiedName); + @Inject + private IQualifiedNameConverter qualifiedNameConverter; + + protected QualifiedName qualifiedName(Problem problem) { + var qualifiedNameString = problem.getName(); + if (qualifiedNameString != null) { + return NamingUtil.stripRootPrefix(qualifiedNameConverter.toQualifiedName(qualifiedNameString)); + } + if (!ProblemUtil.isModule(problem)) { + return null; + } + var resource = problem.eResource(); + if (resource == null) { + return null; + } + var resourceUri = resource.getURI(); + if (resourceUri == null) { + return null; + } + var resourceSet = resource.getResourceSet(); + if (resourceSet == null) { + return null; + } + var adapter = ImportAdapter.getOrInstall(resourceSet); + // If a module has no explicitly specified name, return the qualified name it was resolved under. + return adapter.getQualifiedName(resourceUri); } } diff --git a/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java b/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java index a2ec7ed0..7d90ea00 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java +++ b/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java @@ -8,14 +8,17 @@ package tools.refinery.language.resource; import com.google.common.collect.ImmutableMap; import com.google.inject.Inject; import com.google.inject.Singleton; +import com.google.inject.name.Named; import org.eclipse.emf.ecore.EObject; import org.eclipse.xtext.EcoreUtil2; import org.eclipse.xtext.naming.IQualifiedNameConverter; +import org.eclipse.xtext.naming.IQualifiedNameProvider; import org.eclipse.xtext.naming.QualifiedName; import org.eclipse.xtext.resource.EObjectDescription; import org.eclipse.xtext.resource.IEObjectDescription; import org.eclipse.xtext.resource.impl.DefaultResourceDescriptionStrategy; import org.eclipse.xtext.util.IAcceptor; +import tools.refinery.language.naming.ProblemQualifiedNameProvider; import tools.refinery.language.scoping.imports.ImportCollector; import tools.refinery.language.model.problem.*; import tools.refinery.language.naming.NamingUtil; @@ -45,6 +48,10 @@ public class ProblemResourceDescriptionStrategy extends DefaultResourceDescripti @Inject private IQualifiedNameConverter qualifiedNameConverter; + @Inject + @Named(ProblemQualifiedNameProvider.NAMED_DELEGATE) + private IQualifiedNameProvider delegateQualifiedNameProvider; + @Inject private ImportCollector importCollector; @@ -53,17 +60,17 @@ public class ProblemResourceDescriptionStrategy extends DefaultResourceDescripti if (!shouldExport(eObject)) { return false; } - var qualifiedName = getNameAsQualifiedName(eObject); - if (qualifiedName == null) { - return true; - } var problem = EcoreUtil2.getContainerOfType(eObject, Problem.class); + var problemQualifiedName = getProblemQualifiedName(problem); var userData = getUserData(eObject); if (eObject.equals(problem)) { - acceptEObjectDescription(eObject, qualifiedName, QualifiedName.EMPTY, userData, true, acceptor); + acceptEObjectDescription(eObject, problemQualifiedName, QualifiedName.EMPTY, userData, true, acceptor); + return true; + } + var qualifiedName = getNameAsQualifiedName(eObject); + if (qualifiedName == null) { return true; } - var problemQualifiedName = getNameAsQualifiedName(problem); QualifiedName lastQualifiedNameToExport = null; if (shouldExportSimpleName(eObject)) { lastQualifiedNameToExport = qualifiedName; @@ -107,6 +114,14 @@ public class ProblemResourceDescriptionStrategy extends DefaultResourceDescripti return qualifiedName; } + protected QualifiedName getProblemQualifiedName(Problem problem) { + if (problem == null) { + return QualifiedName.EMPTY; + } + var qualifiedName = delegateQualifiedNameProvider.getFullyQualifiedName(problem); + return qualifiedName == null ? QualifiedName.EMPTY : qualifiedName; + } + public static boolean shouldExport(EObject eObject) { if (eObject instanceof Variable) { // Variables are always private to the containing predicate definition. diff --git a/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemLocalScopeProvider.java b/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemLocalScopeProvider.java index 3e00b87e..610efc03 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemLocalScopeProvider.java +++ b/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemLocalScopeProvider.java @@ -6,6 +6,7 @@ package tools.refinery.language.scoping; import com.google.inject.Inject; +import com.google.inject.name.Named; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.resource.Resource; @@ -18,13 +19,14 @@ import org.eclipse.xtext.scoping.IScope; import org.eclipse.xtext.scoping.impl.AbstractGlobalScopeDelegatingScopeProvider; import org.eclipse.xtext.scoping.impl.SelectableBasedScope; import org.eclipse.xtext.util.IResourceScopeCache; -import tools.refinery.language.naming.NamingUtil; +import tools.refinery.language.naming.ProblemQualifiedNameProvider; public class ProblemLocalScopeProvider extends AbstractGlobalScopeDelegatingScopeProvider { private static final String CACHE_KEY = "tools.refinery.language.scoping.ProblemLocalScopeProvider.CACHE_KEY"; @Inject - private IQualifiedNameProvider qualifiedNameProvider; + @Named(ProblemQualifiedNameProvider.NAMED_DELEGATE) + private IQualifiedNameProvider delegateQualifiedNameProvider; @Inject private IResourceDescriptionsProvider resourceDescriptionsProvider; @@ -64,7 +66,7 @@ public class ProblemLocalScopeProvider extends AbstractGlobalScopeDelegatingScop if (rootElement == null) { return new LocalImports(resourceDescription, null); } - var rootName = NamingUtil.stripRootPrefix(qualifiedNameProvider.getFullyQualifiedName(rootElement)); + var rootName = delegateQualifiedNameProvider.getFullyQualifiedName(rootElement); if (rootName == null) { return new LocalImports(resourceDescription, null); } diff --git a/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportAdapter.java b/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportAdapter.java new file mode 100644 index 00000000..5a8f7fd7 --- /dev/null +++ b/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportAdapter.java @@ -0,0 +1,230 @@ +/* + * SPDX-FileCopyrightText: 2024 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.language.scoping.imports; + +import com.google.common.base.Splitter; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import org.apache.log4j.Logger; +import org.eclipse.emf.common.notify.Notification; +import org.eclipse.emf.common.notify.impl.AdapterImpl; +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.emf.ecore.resource.ResourceSet; +import org.eclipse.emf.ecore.util.EcoreUtil; +import org.eclipse.xtext.naming.QualifiedName; +import tools.refinery.language.library.RefineryLibrary; + +import java.io.File; +import java.nio.file.Path; +import java.util.*; + +public class ImportAdapter extends AdapterImpl { + private static final Logger LOG = Logger.getLogger(ImportAdapter.class); + private static final List DEFAULT_LIBRARIES; + private static final List DEFAULT_PATHS; + + static { + var serviceLoader = ServiceLoader.load(RefineryLibrary.class); + var defaultLibraries = new ArrayList(); + for (var service : serviceLoader) { + defaultLibraries.add(service); + } + DEFAULT_LIBRARIES = List.copyOf(defaultLibraries); + var pathEnv = System.getenv("REFINERY_LIBRARY_PATH"); + if (pathEnv == null) { + DEFAULT_PATHS = List.of(); + } else { + DEFAULT_PATHS = Splitter.on(File.pathSeparatorChar) + .splitToStream(pathEnv) + .map(pathString -> Path.of(pathString).toAbsolutePath().normalize()) + .toList(); + } + } + + private final List libraries; + private final List libraryPaths; + private final Cache failedResolutions = + CacheBuilder.newBuilder().maximumSize(100).build(); + private final Map qualifiedNameToUriMap = new LinkedHashMap<>(); + private final Map uriToQualifiedNameMap = new LinkedHashMap<>(); + + private ImportAdapter(ResourceSet resourceSet) { + libraries = new ArrayList<>(DEFAULT_LIBRARIES); + libraryPaths = new ArrayList<>(DEFAULT_PATHS); + for (var resource : resourceSet.getResources()) { + resourceAdded(resource); + } + } + + @Override + public boolean isAdapterForType(Object type) { + return type == ImportAdapter.class; + } + + public List getLibraries() { + return libraries; + } + + public List getLibraryPaths() { + return libraryPaths; + } + + public URI resolveQualifiedName(QualifiedName qualifiedName) { + var uri = getResolvedUri(qualifiedName); + if (uri != null) { + return uri; + } + if (isFailed(qualifiedName)) { + return null; + } + for (var library : libraries) { + var result = library.resolveQualifiedName(qualifiedName, libraryPaths); + if (result.isPresent()) { + uri = result.get(); + markAsResolved(qualifiedName, uri); + return uri; + } + } + markAsUnresolved(qualifiedName); + return null; + } + + private URI getResolvedUri(QualifiedName qualifiedName) { + return qualifiedNameToUriMap.get(qualifiedName); + } + + private boolean isFailed(QualifiedName qualifiedName) { + return failedResolutions.getIfPresent(qualifiedName) != null; + } + + private void markAsResolved(QualifiedName qualifiedName, URI uri) { + if (qualifiedNameToUriMap.put(qualifiedName, uri) != null) { + throw new IllegalArgumentException("Already resolved " + qualifiedName); + } + // We don't need to signal an error here, because modules with multiple qualified names will lead to + // validation errors later. + uriToQualifiedNameMap.putIfAbsent(uri, qualifiedName); + failedResolutions.invalidate(qualifiedName); + } + + private void markAsUnresolved(QualifiedName qualifiedName) { + failedResolutions.put(qualifiedName, qualifiedName); + } + + public QualifiedName getQualifiedName(URI uri) { + return uriToQualifiedNameMap.get(uri); + } + + @Override + public void notifyChanged(Notification msg) { + switch (msg.getEventType()) { + case Notification.ADD -> { + if (msg.getNewValue() instanceof Resource resource) { + resourceAdded(resource); + } + } + case Notification.ADD_MANY -> { + if (msg.getNewValue() instanceof List list) { + manyResourcesAdded(list); + } + } + case Notification.REMOVE -> { + if (msg.getOldValue() instanceof Resource resource) { + resourceRemoved(resource); + } + } + case Notification.REMOVE_MANY -> { + if (msg.getOldValue() instanceof List list) { + manyResourcesRemoved(list); + } + } + default -> { + // Nothing to update. + } + } + } + + private void manyResourcesAdded(List list) { + for (var element : list) { + if (element instanceof Resource resource) { + resourceAdded(resource); + } + } + } + + private void manyResourcesRemoved(List list) { + for (var element : list) { + if (element instanceof Resource resource) { + resourceRemoved(resource); + } + } + } + + private void resourceAdded(Resource resource) { + var uri = resource.getURI(); + for (var library : libraries) { + var result = library.getQualifiedName(uri, libraryPaths); + if (result.isPresent()) { + var qualifiedName = result.get(); + var previousQualifiedName = uriToQualifiedNameMap.putIfAbsent(uri, qualifiedName); + if (previousQualifiedName == null) { + if (qualifiedNameToUriMap.put(qualifiedName, uri) != null) { + throw new IllegalArgumentException("Duplicate resource for" + qualifiedName); + } + } else if (!previousQualifiedName.equals(qualifiedName)) { + LOG.warn("Expected %s to have qualified name %s, got %s instead".formatted( + uri, previousQualifiedName, qualifiedName)); + } + } + } + } + + private void resourceRemoved(Resource resource) { + var qualifiedName = uriToQualifiedNameMap.remove(resource.getURI()); + if (qualifiedName != null) { + qualifiedNameToUriMap.remove(qualifiedName); + } + } + + public static ImportAdapter getOrInstall(ResourceSet resourceSet) { + var adapter = getAdapter(resourceSet); + if (adapter == null) { + adapter = new ImportAdapter(resourceSet); + resourceSet.eAdapters().add(adapter); + } + return adapter; + } + + private static ImportAdapter getAdapter(ResourceSet resourceSet) { + return (ImportAdapter) EcoreUtil.getAdapter(resourceSet.eAdapters(), ImportAdapter.class); + } + + public static void copySettings(EObject context, ResourceSet newResourceSet) { + var resource = context.eResource(); + if (resource == null) { + return; + } + var originalResourceSet = resource.getResourceSet(); + if (originalResourceSet == null) { + return; + } + copySettings(originalResourceSet, newResourceSet); + } + + public static void copySettings(ResourceSet originalResourceSet, ResourceSet newResourceSet) { + var originalAdapter = getAdapter(originalResourceSet); + if (originalAdapter == null) { + return; + } + var newAdapter = getOrInstall(newResourceSet); + newAdapter.libraries.clear(); + newAdapter.libraries.addAll(originalAdapter.libraries); + newAdapter.libraryPaths.clear(); + newAdapter.libraryPaths.addAll(originalAdapter.libraryPaths); + } +} diff --git a/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportCollector.java b/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportCollector.java index cea99f0a..6cdfa63e 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportCollector.java +++ b/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportCollector.java @@ -18,7 +18,6 @@ import org.eclipse.xtext.naming.QualifiedName; import org.eclipse.xtext.nodemodel.util.NodeModelUtils; import org.eclipse.xtext.resource.IEObjectDescription; import org.eclipse.xtext.util.IResourceScopeCache; -import tools.refinery.language.library.RefineryLibraries; import tools.refinery.language.model.problem.ImportStatement; import tools.refinery.language.model.problem.Problem; import tools.refinery.language.model.problem.ProblemPackage; @@ -54,28 +53,49 @@ public class ImportCollector { if (resource.getContents().isEmpty() || !(resource.getContents().getFirst() instanceof Problem problem)) { return ImportCollection.EMPTY; } + var resourceSet = resource.getResourceSet(); + if (resourceSet == null) { + return ImportCollection.EMPTY; + } Map> aliasesMap = new LinkedHashMap<>(); for (var statement : problem.getStatements()) { if (statement instanceof ImportStatement importStatement) { collectImportStatement(importStatement, aliasesMap); } } + var adapter = ImportAdapter.getOrInstall(resourceSet); var collection = new ImportCollection(); - collection.addAll(RefineryLibraries.getAutomaticImports()); + collectAutomaticImports(collection, adapter); + collectExplicitImports(aliasesMap, collection, adapter); + collection.remove(resource.getURI()); + return collection; + } + + private void collectAutomaticImports(ImportCollection importCollection, ImportAdapter adapter) { + for (var library : adapter.getLibraries()) { + for (var qualifiedName : library.getAutomaticImports()) { + var uri = adapter.resolveQualifiedName(qualifiedName); + if (uri != null) { + importCollection.add(NamedImport.implicit(uri, qualifiedName)); + } + } + } + } + + private void collectExplicitImports(Map> aliasesMap, + ImportCollection collection, ImportAdapter adapter) { for (var entry : aliasesMap.entrySet()) { var qualifiedName = entry.getKey(); - RefineryLibraries.resolveQualifiedName(qualifiedName).ifPresent(uri -> { - if (!uri.equals(resource.getURI())) { - var aliases = entry.getValue(); - collection.add(NamedImport.explicit(uri, qualifiedName, List.copyOf(aliases))); - } - }); + var uri = adapter.resolveQualifiedName(qualifiedName); + if (uri != null) { + var aliases = entry.getValue(); + collection.add(NamedImport.explicit(uri, qualifiedName, List.copyOf(aliases))); + } } - collection.remove(resource.getURI()); - return collection; } - private void collectImportStatement(ImportStatement importStatement, Map> aliasesMap) { + private void collectImportStatement(ImportStatement importStatement, + Map> aliasesMap) { var nodes = NodeModelUtils.findNodesForFeature(importStatement, ProblemPackage.Literals.IMPORT_STATEMENT__IMPORTED_MODULE); var aliasString = importStatement.getAlias(); diff --git a/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemUtil.java b/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemUtil.java index 23ff55e7..6b48cb5a 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemUtil.java +++ b/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemUtil.java @@ -124,8 +124,12 @@ public final class ProblemUtil { }; } + public static boolean isModule(Problem problem) { + return problem.getKind() == ModuleKind.MODULE; + } + public static boolean isInModule(EObject eObject) { var problem = EcoreUtil2.getContainerOfType(eObject, Problem.class); - return problem != null && problem.getKind() == ModuleKind.MODULE; + return problem != null && isModule(problem); } } diff --git a/subprojects/language/src/main/resources/META-INF/services/tools.refinery.language.library.RefineryLibrary b/subprojects/language/src/main/resources/META-INF/services/tools.refinery.language.library.RefineryLibrary index bb7e369d..8e454ee5 100644 --- a/subprojects/language/src/main/resources/META-INF/services/tools.refinery.language.library.RefineryLibrary +++ b/subprojects/language/src/main/resources/META-INF/services/tools.refinery.language.library.RefineryLibrary @@ -2,3 +2,4 @@ # # SPDX-License-Identifier: EPL-2.0 tools.refinery.language.library.BuiltinLibrary +tools.refinery.language.library.PathLibrary diff --git a/subprojects/language/src/main/resources/tools/refinery/language/library/builtin.refinery b/subprojects/language/src/main/resources/tools/refinery/language/library/builtin.refinery index 022c3167..f9ef959d 100644 --- a/subprojects/language/src/main/resources/tools/refinery/language/library/builtin.refinery +++ b/subprojects/language/src/main/resources/tools/refinery/language/library/builtin.refinery @@ -1,7 +1,7 @@ -% SPDX-FileCopyrightText: 2021-2023 The Refinery Authors +% SPDX-FileCopyrightText: 2021-2024 The Refinery Authors % % SPDX-License-Identifier: EPL-2.0 -problem builtin. +module builtin. abstract class node. -- cgit v1.2.3-54-g00ecf From c6e70f5a01c877b560d4561f22a830c1ce1c6dbe Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Sun, 4 Feb 2024 22:34:18 +0100 Subject: refactor: simplify module name inference We never need to infer names for modules not added by import, because importing a problem (i.e., a Resource manually added into the ResourceSet) is not allowed. --- .../language/library/ClasspathBasedLibrary.java | 48 ------------- .../refinery/language/library/PathLibrary.java | 34 --------- .../refinery/language/library/RefineryLibrary.java | 2 - .../language/scoping/imports/ImportAdapter.java | 84 ++-------------------- 4 files changed, 4 insertions(+), 164 deletions(-) diff --git a/subprojects/language/src/main/java/tools/refinery/language/library/ClasspathBasedLibrary.java b/subprojects/language/src/main/java/tools/refinery/language/library/ClasspathBasedLibrary.java index 4b748c64..bc9ae5ca 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/library/ClasspathBasedLibrary.java +++ b/subprojects/language/src/main/java/tools/refinery/language/library/ClasspathBasedLibrary.java @@ -14,21 +14,10 @@ import java.util.*; public abstract class ClasspathBasedLibrary implements RefineryLibrary { private final QualifiedName prefix; private final List automaticImports; - private final URI rootUri; protected ClasspathBasedLibrary(QualifiedName prefix, List automaticImports) { this.prefix = prefix; this.automaticImports = List.copyOf(automaticImports); - var context = this.getClass(); - var contextPath = context.getCanonicalName().replace('.', '/') + ".class"; - var contextResource = context.getClassLoader().getResource(contextPath); - if (contextResource == null) { - throw new IllegalStateException("Failed to find library context"); - } - var contextUri = URI.createURI(contextResource.toString()); - var segments = Arrays.copyOf(contextUri.segments(), contextUri.segmentCount() - 1); - rootUri = URI.createHierarchicalURI(contextUri.scheme(), contextUri.authority(), contextUri.device(), - segments, null, null); } protected ClasspathBasedLibrary(QualifiedName prefix) { @@ -48,43 +37,6 @@ public abstract class ClasspathBasedLibrary implements RefineryLibrary { return Optional.empty(); } - @Override - public Optional getQualifiedName(URI uri, List libraryPaths) { - if (!uri.isHierarchical() || - !Objects.equals(rootUri.scheme(), uri.scheme()) || - !Objects.equals(rootUri.authority(), uri.authority()) || - !Objects.equals(rootUri.device(), uri.device()) || - rootUri.segmentCount() >= uri.segmentCount()) { - return Optional.empty(); - } - int rootSegmentCount = rootUri.segmentCount(); - int uriSegmentCount = uri.segmentCount(); - if (!uri.segment(uriSegmentCount - 1).endsWith(RefineryLibrary.EXTENSION)) { - return Optional.empty(); - } - var segments = new ArrayList(); - int i = 0; - while (i < rootSegmentCount) { - if (!rootUri.segment(i).equals(uri.segment(i))) { - return Optional.empty(); - } - i++; - } - while (i < uriSegmentCount) { - var segment = uri.segment(i); - if (i == uriSegmentCount - 1) { - segment = segment.substring(0, segment.length() - RefineryLibrary.EXTENSION.length()); - } - segments.add(segment); - i++; - } - var qualifiedName = QualifiedName.create(segments); - if (!qualifiedName.startsWith(prefix)) { - return Optional.empty(); - } - return Optional.of(qualifiedName); - } - public static Optional getLibraryUri(Class context, QualifiedName qualifiedName) { var packagePath = context.getPackageName().replace('.', '/'); var libraryPath = String.join("/", qualifiedName.getSegments()); diff --git a/subprojects/language/src/main/java/tools/refinery/language/library/PathLibrary.java b/subprojects/language/src/main/java/tools/refinery/language/library/PathLibrary.java index c6f994df..6f418492 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/library/PathLibrary.java +++ b/subprojects/language/src/main/java/tools/refinery/language/library/PathLibrary.java @@ -10,7 +10,6 @@ import org.eclipse.xtext.naming.QualifiedName; import java.nio.file.Files; import java.nio.file.Path; -import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -54,37 +53,4 @@ public final class PathLibrary implements RefineryLibrary { } return Path.of(first, rest); } - - @Override - public Optional getQualifiedName(URI uri, List libraryPaths) { - if (libraryPaths.isEmpty()) { - return Optional.empty(); - } - if (!uri.isFile() || !uri.hasAbsolutePath()) { - return Optional.empty(); - } - var path = Path.of(uri.toFileString()); - for (var library : libraryPaths) { - if (path.startsWith(library)) { - return getRelativeQualifiedName(library, path); - } - } - return Optional.empty(); - } - - private static Optional getRelativeQualifiedName(Path library, Path path) { - var relativePath = path.relativize(library); - var segments = new ArrayList(); - for (Path value : relativePath) { - segments.add(value.toString()); - } - int lastIndex = segments.size() - 1; - var lastSegment = segments.get(lastIndex); - if (!lastSegment.endsWith(EXTENSION)) { - return Optional.empty(); - } - lastSegment = lastSegment.substring(0, lastSegment.length() - RefineryLibrary.EXTENSION.length()); - segments.set(lastIndex, lastSegment); - return Optional.of(QualifiedName.create(segments)); - } } diff --git a/subprojects/language/src/main/java/tools/refinery/language/library/RefineryLibrary.java b/subprojects/language/src/main/java/tools/refinery/language/library/RefineryLibrary.java index e1f8d7bc..9c0d72f9 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/library/RefineryLibrary.java +++ b/subprojects/language/src/main/java/tools/refinery/language/library/RefineryLibrary.java @@ -20,6 +20,4 @@ public interface RefineryLibrary { } Optional resolveQualifiedName(QualifiedName qualifiedName, List libraryPaths); - - Optional getQualifiedName(URI uri, List libraryPaths); } diff --git a/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportAdapter.java b/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportAdapter.java index 5a8f7fd7..a34c09cc 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportAdapter.java +++ b/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportAdapter.java @@ -8,12 +8,9 @@ package tools.refinery.language.scoping.imports; import com.google.common.base.Splitter; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; -import org.apache.log4j.Logger; -import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.common.notify.impl.AdapterImpl; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; -import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.xtext.naming.QualifiedName; @@ -24,7 +21,6 @@ import java.nio.file.Path; import java.util.*; public class ImportAdapter extends AdapterImpl { - private static final Logger LOG = Logger.getLogger(ImportAdapter.class); private static final List DEFAULT_LIBRARIES; private static final List DEFAULT_PATHS; @@ -53,12 +49,9 @@ public class ImportAdapter extends AdapterImpl { private final Map qualifiedNameToUriMap = new LinkedHashMap<>(); private final Map uriToQualifiedNameMap = new LinkedHashMap<>(); - private ImportAdapter(ResourceSet resourceSet) { + private ImportAdapter() { libraries = new ArrayList<>(DEFAULT_LIBRARIES); libraryPaths = new ArrayList<>(DEFAULT_PATHS); - for (var resource : resourceSet.getResources()) { - resourceAdded(resource); - } } @Override @@ -120,81 +113,10 @@ public class ImportAdapter extends AdapterImpl { return uriToQualifiedNameMap.get(uri); } - @Override - public void notifyChanged(Notification msg) { - switch (msg.getEventType()) { - case Notification.ADD -> { - if (msg.getNewValue() instanceof Resource resource) { - resourceAdded(resource); - } - } - case Notification.ADD_MANY -> { - if (msg.getNewValue() instanceof List list) { - manyResourcesAdded(list); - } - } - case Notification.REMOVE -> { - if (msg.getOldValue() instanceof Resource resource) { - resourceRemoved(resource); - } - } - case Notification.REMOVE_MANY -> { - if (msg.getOldValue() instanceof List list) { - manyResourcesRemoved(list); - } - } - default -> { - // Nothing to update. - } - } - } - - private void manyResourcesAdded(List list) { - for (var element : list) { - if (element instanceof Resource resource) { - resourceAdded(resource); - } - } - } - - private void manyResourcesRemoved(List list) { - for (var element : list) { - if (element instanceof Resource resource) { - resourceRemoved(resource); - } - } - } - - private void resourceAdded(Resource resource) { - var uri = resource.getURI(); - for (var library : libraries) { - var result = library.getQualifiedName(uri, libraryPaths); - if (result.isPresent()) { - var qualifiedName = result.get(); - var previousQualifiedName = uriToQualifiedNameMap.putIfAbsent(uri, qualifiedName); - if (previousQualifiedName == null) { - if (qualifiedNameToUriMap.put(qualifiedName, uri) != null) { - throw new IllegalArgumentException("Duplicate resource for" + qualifiedName); - } - } else if (!previousQualifiedName.equals(qualifiedName)) { - LOG.warn("Expected %s to have qualified name %s, got %s instead".formatted( - uri, previousQualifiedName, qualifiedName)); - } - } - } - } - - private void resourceRemoved(Resource resource) { - var qualifiedName = uriToQualifiedNameMap.remove(resource.getURI()); - if (qualifiedName != null) { - qualifiedNameToUriMap.remove(qualifiedName); - } - } - public static ImportAdapter getOrInstall(ResourceSet resourceSet) { var adapter = getAdapter(resourceSet); if (adapter == null) { - adapter = new ImportAdapter(resourceSet); + adapter = new ImportAdapter(); resourceSet.eAdapters().add(adapter); } return adapter; @@ -226,5 +148,7 @@ public class ImportAdapter extends AdapterImpl { newAdapter.libraries.addAll(originalAdapter.libraries); newAdapter.libraryPaths.clear(); newAdapter.libraryPaths.addAll(originalAdapter.libraryPaths); + newAdapter.uriToQualifiedNameMap.putAll(originalAdapter.uriToQualifiedNameMap); + newAdapter.qualifiedNameToUriMap.putAll(originalAdapter.qualifiedNameToUriMap); } } -- cgit v1.2.3-54-g00ecf From 48c9f84f10d5fbcbe399a0c3335707167f4e7f0d Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Mon, 5 Feb 2024 15:18:02 +0100 Subject: Revert "refactor: simplify module name inference" This reverts commit c6e70f5a01c877b560d4561f22a830c1ce1c6dbe. --- .../language/library/ClasspathBasedLibrary.java | 48 +++++++++++++ .../refinery/language/library/PathLibrary.java | 34 +++++++++ .../refinery/language/library/RefineryLibrary.java | 2 + .../language/scoping/imports/ImportAdapter.java | 84 ++++++++++++++++++++-- 4 files changed, 164 insertions(+), 4 deletions(-) diff --git a/subprojects/language/src/main/java/tools/refinery/language/library/ClasspathBasedLibrary.java b/subprojects/language/src/main/java/tools/refinery/language/library/ClasspathBasedLibrary.java index bc9ae5ca..4b748c64 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/library/ClasspathBasedLibrary.java +++ b/subprojects/language/src/main/java/tools/refinery/language/library/ClasspathBasedLibrary.java @@ -14,10 +14,21 @@ import java.util.*; public abstract class ClasspathBasedLibrary implements RefineryLibrary { private final QualifiedName prefix; private final List automaticImports; + private final URI rootUri; protected ClasspathBasedLibrary(QualifiedName prefix, List automaticImports) { this.prefix = prefix; this.automaticImports = List.copyOf(automaticImports); + var context = this.getClass(); + var contextPath = context.getCanonicalName().replace('.', '/') + ".class"; + var contextResource = context.getClassLoader().getResource(contextPath); + if (contextResource == null) { + throw new IllegalStateException("Failed to find library context"); + } + var contextUri = URI.createURI(contextResource.toString()); + var segments = Arrays.copyOf(contextUri.segments(), contextUri.segmentCount() - 1); + rootUri = URI.createHierarchicalURI(contextUri.scheme(), contextUri.authority(), contextUri.device(), + segments, null, null); } protected ClasspathBasedLibrary(QualifiedName prefix) { @@ -37,6 +48,43 @@ public abstract class ClasspathBasedLibrary implements RefineryLibrary { return Optional.empty(); } + @Override + public Optional getQualifiedName(URI uri, List libraryPaths) { + if (!uri.isHierarchical() || + !Objects.equals(rootUri.scheme(), uri.scheme()) || + !Objects.equals(rootUri.authority(), uri.authority()) || + !Objects.equals(rootUri.device(), uri.device()) || + rootUri.segmentCount() >= uri.segmentCount()) { + return Optional.empty(); + } + int rootSegmentCount = rootUri.segmentCount(); + int uriSegmentCount = uri.segmentCount(); + if (!uri.segment(uriSegmentCount - 1).endsWith(RefineryLibrary.EXTENSION)) { + return Optional.empty(); + } + var segments = new ArrayList(); + int i = 0; + while (i < rootSegmentCount) { + if (!rootUri.segment(i).equals(uri.segment(i))) { + return Optional.empty(); + } + i++; + } + while (i < uriSegmentCount) { + var segment = uri.segment(i); + if (i == uriSegmentCount - 1) { + segment = segment.substring(0, segment.length() - RefineryLibrary.EXTENSION.length()); + } + segments.add(segment); + i++; + } + var qualifiedName = QualifiedName.create(segments); + if (!qualifiedName.startsWith(prefix)) { + return Optional.empty(); + } + return Optional.of(qualifiedName); + } + public static Optional getLibraryUri(Class context, QualifiedName qualifiedName) { var packagePath = context.getPackageName().replace('.', '/'); var libraryPath = String.join("/", qualifiedName.getSegments()); diff --git a/subprojects/language/src/main/java/tools/refinery/language/library/PathLibrary.java b/subprojects/language/src/main/java/tools/refinery/language/library/PathLibrary.java index 6f418492..c6f994df 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/library/PathLibrary.java +++ b/subprojects/language/src/main/java/tools/refinery/language/library/PathLibrary.java @@ -10,6 +10,7 @@ import org.eclipse.xtext.naming.QualifiedName; import java.nio.file.Files; import java.nio.file.Path; +import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -53,4 +54,37 @@ public final class PathLibrary implements RefineryLibrary { } return Path.of(first, rest); } + + @Override + public Optional getQualifiedName(URI uri, List libraryPaths) { + if (libraryPaths.isEmpty()) { + return Optional.empty(); + } + if (!uri.isFile() || !uri.hasAbsolutePath()) { + return Optional.empty(); + } + var path = Path.of(uri.toFileString()); + for (var library : libraryPaths) { + if (path.startsWith(library)) { + return getRelativeQualifiedName(library, path); + } + } + return Optional.empty(); + } + + private static Optional getRelativeQualifiedName(Path library, Path path) { + var relativePath = path.relativize(library); + var segments = new ArrayList(); + for (Path value : relativePath) { + segments.add(value.toString()); + } + int lastIndex = segments.size() - 1; + var lastSegment = segments.get(lastIndex); + if (!lastSegment.endsWith(EXTENSION)) { + return Optional.empty(); + } + lastSegment = lastSegment.substring(0, lastSegment.length() - RefineryLibrary.EXTENSION.length()); + segments.set(lastIndex, lastSegment); + return Optional.of(QualifiedName.create(segments)); + } } diff --git a/subprojects/language/src/main/java/tools/refinery/language/library/RefineryLibrary.java b/subprojects/language/src/main/java/tools/refinery/language/library/RefineryLibrary.java index 9c0d72f9..e1f8d7bc 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/library/RefineryLibrary.java +++ b/subprojects/language/src/main/java/tools/refinery/language/library/RefineryLibrary.java @@ -20,4 +20,6 @@ public interface RefineryLibrary { } Optional resolveQualifiedName(QualifiedName qualifiedName, List libraryPaths); + + Optional getQualifiedName(URI uri, List libraryPaths); } diff --git a/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportAdapter.java b/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportAdapter.java index a34c09cc..5a8f7fd7 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportAdapter.java +++ b/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportAdapter.java @@ -8,9 +8,12 @@ package tools.refinery.language.scoping.imports; import com.google.common.base.Splitter; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; +import org.apache.log4j.Logger; +import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.common.notify.impl.AdapterImpl; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.xtext.naming.QualifiedName; @@ -21,6 +24,7 @@ import java.nio.file.Path; import java.util.*; public class ImportAdapter extends AdapterImpl { + private static final Logger LOG = Logger.getLogger(ImportAdapter.class); private static final List DEFAULT_LIBRARIES; private static final List DEFAULT_PATHS; @@ -49,9 +53,12 @@ public class ImportAdapter extends AdapterImpl { private final Map qualifiedNameToUriMap = new LinkedHashMap<>(); private final Map uriToQualifiedNameMap = new LinkedHashMap<>(); - private ImportAdapter() { + private ImportAdapter(ResourceSet resourceSet) { libraries = new ArrayList<>(DEFAULT_LIBRARIES); libraryPaths = new ArrayList<>(DEFAULT_PATHS); + for (var resource : resourceSet.getResources()) { + resourceAdded(resource); + } } @Override @@ -113,10 +120,81 @@ public class ImportAdapter extends AdapterImpl { return uriToQualifiedNameMap.get(uri); } + @Override + public void notifyChanged(Notification msg) { + switch (msg.getEventType()) { + case Notification.ADD -> { + if (msg.getNewValue() instanceof Resource resource) { + resourceAdded(resource); + } + } + case Notification.ADD_MANY -> { + if (msg.getNewValue() instanceof List list) { + manyResourcesAdded(list); + } + } + case Notification.REMOVE -> { + if (msg.getOldValue() instanceof Resource resource) { + resourceRemoved(resource); + } + } + case Notification.REMOVE_MANY -> { + if (msg.getOldValue() instanceof List list) { + manyResourcesRemoved(list); + } + } + default -> { + // Nothing to update. + } + } + } + + private void manyResourcesAdded(List list) { + for (var element : list) { + if (element instanceof Resource resource) { + resourceAdded(resource); + } + } + } + + private void manyResourcesRemoved(List list) { + for (var element : list) { + if (element instanceof Resource resource) { + resourceRemoved(resource); + } + } + } + + private void resourceAdded(Resource resource) { + var uri = resource.getURI(); + for (var library : libraries) { + var result = library.getQualifiedName(uri, libraryPaths); + if (result.isPresent()) { + var qualifiedName = result.get(); + var previousQualifiedName = uriToQualifiedNameMap.putIfAbsent(uri, qualifiedName); + if (previousQualifiedName == null) { + if (qualifiedNameToUriMap.put(qualifiedName, uri) != null) { + throw new IllegalArgumentException("Duplicate resource for" + qualifiedName); + } + } else if (!previousQualifiedName.equals(qualifiedName)) { + LOG.warn("Expected %s to have qualified name %s, got %s instead".formatted( + uri, previousQualifiedName, qualifiedName)); + } + } + } + } + + private void resourceRemoved(Resource resource) { + var qualifiedName = uriToQualifiedNameMap.remove(resource.getURI()); + if (qualifiedName != null) { + qualifiedNameToUriMap.remove(qualifiedName); + } + } + public static ImportAdapter getOrInstall(ResourceSet resourceSet) { var adapter = getAdapter(resourceSet); if (adapter == null) { - adapter = new ImportAdapter(); + adapter = new ImportAdapter(resourceSet); resourceSet.eAdapters().add(adapter); } return adapter; @@ -148,7 +226,5 @@ public class ImportAdapter extends AdapterImpl { newAdapter.libraries.addAll(originalAdapter.libraries); newAdapter.libraryPaths.clear(); newAdapter.libraryPaths.addAll(originalAdapter.libraryPaths); - newAdapter.uriToQualifiedNameMap.putAll(originalAdapter.uriToQualifiedNameMap); - newAdapter.qualifiedNameToUriMap.putAll(originalAdapter.qualifiedNameToUriMap); } } -- cgit v1.2.3-54-g00ecf From 1ae461bd5319370e12878785d9c7ec9f89429406 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Mon, 5 Feb 2024 18:54:46 +0100 Subject: feat(language): automatic problem kind inference --- .../language/semantics/SolutionSerializer.java | 14 ++----- .../language/semantics/SolutionSerializerTest.java | 2 +- .../tools/refinery/language/GenerateProblem.mwe2 | 2 +- .../refinery/language/ProblemRuntimeModule.java | 19 ++++++++- .../language/library/ClasspathBasedLibrary.java | 6 +-- .../refinery/language/library/PathLibrary.java | 6 +-- .../refinery/language/library/RefineryLibrary.java | 3 +- .../parser/ProblemEcoreElementFactory.java | 48 ++++++++++++++++++++++ .../language/resource/ProblemResource.java | 24 +++++++++++ .../language/scoping/imports/ImportCollector.java | 40 +++++++++--------- .../serializer/ProblemTransientValueService.java | 25 +++++++++++ .../tools/refinery/language/utils/ProblemUtil.java | 15 +++++++ .../refinery/language/library/builtin.refinery | 1 - 13 files changed, 164 insertions(+), 41 deletions(-) create mode 100644 subprojects/language/src/main/java/tools/refinery/language/parser/ProblemEcoreElementFactory.java create mode 100644 subprojects/language/src/main/java/tools/refinery/language/serializer/ProblemTransientValueService.java diff --git a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SolutionSerializer.java b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SolutionSerializer.java index dad867b8..2fb0a49d 100644 --- a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SolutionSerializer.java +++ b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SolutionSerializer.java @@ -13,7 +13,6 @@ import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.xtext.naming.IQualifiedNameProvider; import org.eclipse.xtext.naming.QualifiedName; -import org.eclipse.xtext.resource.FileExtensionProvider; import org.eclipse.xtext.resource.IResourceFactory; import org.eclipse.xtext.resource.XtextResource; import org.eclipse.xtext.resource.XtextResourceSet; @@ -42,8 +41,6 @@ import java.util.function.Function; import java.util.stream.Collectors; public class SolutionSerializer { - private String fileExtension; - @Inject private Provider resourceSetProvider; @@ -74,13 +71,8 @@ public class SolutionSerializer { private NodeDeclaration nodeDeclaration; private final MutableIntObjectMap nodes = IntObjectMaps.mutable.empty(); - @Inject - public void setFileExtensionProvider(FileExtensionProvider fileExtensionProvider) { - this.fileExtension = fileExtensionProvider.getPrimaryFileExtension(); - } - public Problem serializeSolution(ProblemTrace trace, Model model) { - var uri = URI.createURI("__synthetic." + fileExtension); + var uri = URI.createURI("__synthetic." + ProblemUtil.MODULE_EXTENSION); return serializeSolution(trace, model, uri); } @@ -135,8 +127,8 @@ public class SolutionSerializer { private Problem copyProblem(Problem originalProblem, URI uri) { var newResourceSet = resourceSetProvider.get(); ImportAdapter.copySettings(originalProblem, newResourceSet); - if (!fileExtension.equals(uri.fileExtension())) { - uri = uri.appendFileExtension(fileExtension); + if (!ProblemUtil.MODULE_EXTENSION.equals(uri.fileExtension())) { + uri = uri.appendFileExtension(ProblemUtil.MODULE_EXTENSION); } var newResource = resourceFactory.createResource(uri); newResourceSet.getResources().add(newResource); diff --git a/subprojects/language-semantics/src/test/java/tools/refinery/language/semantics/SolutionSerializerTest.java b/subprojects/language-semantics/src/test/java/tools/refinery/language/semantics/SolutionSerializerTest.java index 949b7047..be675a80 100644 --- a/subprojects/language-semantics/src/test/java/tools/refinery/language/semantics/SolutionSerializerTest.java +++ b/subprojects/language-semantics/src/test/java/tools/refinery/language/semantics/SolutionSerializerTest.java @@ -72,7 +72,7 @@ class SolutionSerializerTest { solution.eResource().save(outputStream, Map.of()); actualOutput = outputStream.toString(); } - assertThat(actualOutput, is("module.\n\n" + prefix + "\n" + expectedOutput)); + assertThat(actualOutput, is(prefix + "\n" + expectedOutput)); } static Stream solutionSerializerTest() { diff --git a/subprojects/language/src/main/java/tools/refinery/language/GenerateProblem.mwe2 b/subprojects/language/src/main/java/tools/refinery/language/GenerateProblem.mwe2 index 863e55d4..46ac18fe 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/GenerateProblem.mwe2 +++ b/subprojects/language/src/main/java/tools/refinery/language/GenerateProblem.mwe2 @@ -51,7 +51,7 @@ Workflow { language = StandardLanguage { name = 'tools.refinery.language.Problem' - fileExtensions = 'refinery,problem' + fileExtensions = 'problem,refinery' referencedResource = 'platform:/resource/tools.refinery.refinery-language-model/model/problem.genmodel' serializer = { generateStub = false diff --git a/subprojects/language/src/main/java/tools/refinery/language/ProblemRuntimeModule.java b/subprojects/language/src/main/java/tools/refinery/language/ProblemRuntimeModule.java index a846e265..f9a564b0 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/ProblemRuntimeModule.java +++ b/subprojects/language/src/main/java/tools/refinery/language/ProblemRuntimeModule.java @@ -15,7 +15,9 @@ import org.eclipse.xtext.conversion.IValueConverterService; import org.eclipse.xtext.linking.ILinkingService; import org.eclipse.xtext.naming.IQualifiedNameConverter; import org.eclipse.xtext.naming.IQualifiedNameProvider; +import org.eclipse.xtext.parser.IAstFactory; import org.eclipse.xtext.parser.IParser; +import org.eclipse.xtext.parsetree.reconstr.ITransientValueService; import org.eclipse.xtext.resource.*; import org.eclipse.xtext.scoping.IGlobalScopeProvider; import org.eclipse.xtext.scoping.IScopeProvider; @@ -30,13 +32,18 @@ import tools.refinery.language.linking.ProblemLinkingService; import tools.refinery.language.naming.ProblemDelegateQualifiedNameProvider; import tools.refinery.language.naming.ProblemQualifiedNameConverter; import tools.refinery.language.naming.ProblemQualifiedNameProvider; +import tools.refinery.language.parser.ProblemEcoreElementFactory; import tools.refinery.language.parser.antlr.TokenSourceInjectingProblemParser; -import tools.refinery.language.resource.*; +import tools.refinery.language.resource.ProblemLocationInFileProvider; +import tools.refinery.language.resource.ProblemResource; +import tools.refinery.language.resource.ProblemResourceDescriptionManager; +import tools.refinery.language.resource.ProblemResourceDescriptionStrategy; import tools.refinery.language.resource.state.ProblemDerivedStateComputer; import tools.refinery.language.scoping.ProblemGlobalScopeProvider; import tools.refinery.language.scoping.ProblemLocalScopeProvider; import tools.refinery.language.serializer.PreferShortAssertionsProblemSemanticSequencer; import tools.refinery.language.serializer.ProblemCrossReferenceSerializer; +import tools.refinery.language.serializer.ProblemTransientValueService; import tools.refinery.language.validation.ProblemDiagnosticConverter; /** @@ -51,6 +58,11 @@ public class ProblemRuntimeModule extends AbstractProblemRuntimeModule { return TokenSourceInjectingProblemParser.class; } + @Override + public Class bindIAstFactory() { + return ProblemEcoreElementFactory.class; + } + public Class bindIQualifiedNameConverter() { return ProblemQualifiedNameConverter.class; } @@ -115,6 +127,11 @@ public class ProblemRuntimeModule extends AbstractProblemRuntimeModule { return ProblemLocationInFileProvider.class; } + @Override + public Class bindITransientValueService() { + return ProblemTransientValueService.class; + } + @Override public Class bindISemanticSequencer() { return PreferShortAssertionsProblemSemanticSequencer.class; diff --git a/subprojects/language/src/main/java/tools/refinery/language/library/ClasspathBasedLibrary.java b/subprojects/language/src/main/java/tools/refinery/language/library/ClasspathBasedLibrary.java index 4b748c64..3a9bb920 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/library/ClasspathBasedLibrary.java +++ b/subprojects/language/src/main/java/tools/refinery/language/library/ClasspathBasedLibrary.java @@ -59,7 +59,7 @@ public abstract class ClasspathBasedLibrary implements RefineryLibrary { } int rootSegmentCount = rootUri.segmentCount(); int uriSegmentCount = uri.segmentCount(); - if (!uri.segment(uriSegmentCount - 1).endsWith(RefineryLibrary.EXTENSION)) { + if (!uri.segment(uriSegmentCount - 1).endsWith(RefineryLibrary.FILE_NAME_SUFFIX)) { return Optional.empty(); } var segments = new ArrayList(); @@ -73,7 +73,7 @@ public abstract class ClasspathBasedLibrary implements RefineryLibrary { while (i < uriSegmentCount) { var segment = uri.segment(i); if (i == uriSegmentCount - 1) { - segment = segment.substring(0, segment.length() - RefineryLibrary.EXTENSION.length()); + segment = segment.substring(0, segment.length() - RefineryLibrary.FILE_NAME_SUFFIX.length()); } segments.add(segment); i++; @@ -88,7 +88,7 @@ public abstract class ClasspathBasedLibrary implements RefineryLibrary { public static Optional getLibraryUri(Class context, QualifiedName qualifiedName) { var packagePath = context.getPackageName().replace('.', '/'); var libraryPath = String.join("/", qualifiedName.getSegments()); - var resourceName = "%s/%s%s".formatted(packagePath, libraryPath, RefineryLibrary.EXTENSION); + var resourceName = "%s/%s%s".formatted(packagePath, libraryPath, RefineryLibrary.FILE_NAME_SUFFIX); var resource = context.getClassLoader().getResource(resourceName); if (resource == null) { return Optional.empty(); diff --git a/subprojects/language/src/main/java/tools/refinery/language/library/PathLibrary.java b/subprojects/language/src/main/java/tools/refinery/language/library/PathLibrary.java index c6f994df..8eaf8458 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/library/PathLibrary.java +++ b/subprojects/language/src/main/java/tools/refinery/language/library/PathLibrary.java @@ -41,7 +41,7 @@ public final class PathLibrary implements RefineryLibrary { for (var i = 0; i < segmentCount; i++) { var segment = qualifiedName.getSegment(i); if (i == segmentCount - 1) { - segment = segment + RefineryLibrary.EXTENSION; + segment = segment + RefineryLibrary.FILE_NAME_SUFFIX; } if (i == 0) { first = segment; @@ -80,10 +80,10 @@ public final class PathLibrary implements RefineryLibrary { } int lastIndex = segments.size() - 1; var lastSegment = segments.get(lastIndex); - if (!lastSegment.endsWith(EXTENSION)) { + if (!lastSegment.endsWith(FILE_NAME_SUFFIX)) { return Optional.empty(); } - lastSegment = lastSegment.substring(0, lastSegment.length() - RefineryLibrary.EXTENSION.length()); + lastSegment = lastSegment.substring(0, lastSegment.length() - RefineryLibrary.FILE_NAME_SUFFIX.length()); segments.set(lastIndex, lastSegment); return Optional.of(QualifiedName.create(segments)); } diff --git a/subprojects/language/src/main/java/tools/refinery/language/library/RefineryLibrary.java b/subprojects/language/src/main/java/tools/refinery/language/library/RefineryLibrary.java index e1f8d7bc..2559749a 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/library/RefineryLibrary.java +++ b/subprojects/language/src/main/java/tools/refinery/language/library/RefineryLibrary.java @@ -7,13 +7,14 @@ package tools.refinery.language.library; import org.eclipse.emf.common.util.URI; import org.eclipse.xtext.naming.QualifiedName; +import tools.refinery.language.utils.ProblemUtil; import java.nio.file.Path; import java.util.List; import java.util.Optional; public interface RefineryLibrary { - String EXTENSION = ".refinery"; + String FILE_NAME_SUFFIX = "." + ProblemUtil.MODULE_EXTENSION; default List getAutomaticImports() { return List.of(); diff --git a/subprojects/language/src/main/java/tools/refinery/language/parser/ProblemEcoreElementFactory.java b/subprojects/language/src/main/java/tools/refinery/language/parser/ProblemEcoreElementFactory.java new file mode 100644 index 00000000..b54c6970 --- /dev/null +++ b/subprojects/language/src/main/java/tools/refinery/language/parser/ProblemEcoreElementFactory.java @@ -0,0 +1,48 @@ +/* + * SPDX-FileCopyrightText: 2024 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.language.parser; + +import org.eclipse.emf.common.notify.impl.AdapterImpl; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.util.EcoreUtil; +import org.eclipse.xtext.conversion.ValueConverterException; +import org.eclipse.xtext.nodemodel.INode; +import org.eclipse.xtext.parser.DefaultEcoreElementFactory; +import tools.refinery.language.model.problem.Problem; +import tools.refinery.language.model.problem.ProblemPackage; + +public class ProblemEcoreElementFactory extends DefaultEcoreElementFactory { + @Override + public void set( + EObject object, String feature, Object value, String ruleName, INode node) throws ValueConverterException { + super.set(object, feature, value, ruleName, node); + if (object instanceof Problem problem && ProblemPackage.Literals.PROBLEM__KIND.getName().equals(feature)) { + ExplicitAssignmentTracker.install(problem); + } + } + + public static boolean hasExplicitlySetProblemKind(Problem problem) { + return ExplicitAssignmentTracker.hasAdapter(problem); + } + + private static class ExplicitAssignmentTracker extends AdapterImpl { + @Override + public boolean isAdapterForType(Object type) { + return type == ExplicitAssignmentTracker.class; + } + + public static boolean hasAdapter(Problem problem) { + return EcoreUtil.getAdapter(problem.eAdapters(), ExplicitAssignmentTracker.class) != null; + } + + public static void install(Problem problem) { + if (hasAdapter(problem)) { + throw new IllegalStateException("Duplicate explicit assignment of module kind"); + } + problem.eAdapters().add(new ExplicitAssignmentTracker()); + } + } +} diff --git a/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResource.java b/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResource.java index 43239ffe..57b7bb45 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResource.java +++ b/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResource.java @@ -20,9 +20,13 @@ import org.eclipse.xtext.linking.impl.IllegalNodeException; import org.eclipse.xtext.linking.impl.XtextLinkingDiagnostic; import org.eclipse.xtext.linking.lazy.LazyLinkingResource; import org.eclipse.xtext.nodemodel.INode; +import org.eclipse.xtext.parser.IParseResult; import org.eclipse.xtext.resource.DerivedStateAwareResource; import org.eclipse.xtext.util.Triple; import org.jetbrains.annotations.Nullable; +import tools.refinery.language.model.problem.Problem; +import tools.refinery.language.parser.ProblemEcoreElementFactory; +import tools.refinery.language.utils.ProblemUtil; import java.util.Arrays; import java.util.List; @@ -40,6 +44,26 @@ public class ProblemResource extends DerivedStateAwareResource { */ private int cyclicLinkingDetectionCounter = 0; + @Override + protected void updateInternalState(IParseResult oldParseResult, IParseResult newParseResult) { + if (isNewRootElement(oldParseResult, newParseResult) && + newParseResult.getRootASTElement() instanceof Problem newRootProblem && + !ProblemEcoreElementFactory.hasExplicitlySetProblemKind(newRootProblem)) { + var defaultModuleKind = ProblemUtil.getDefaultModuleKind(getURI()); + newRootProblem.setKind(defaultModuleKind); + } + super.updateInternalState(oldParseResult, newParseResult); + } + + private boolean isNewRootElement(IParseResult oldParseResult, IParseResult newParseResult) { + if (oldParseResult == null) { + return true; + } + var oldRootAstElement = oldParseResult.getRootASTElement(); + var newRootAstElement = newParseResult.getRootASTElement(); + return oldRootAstElement != newRootAstElement; + } + /** * Tries to resolve a reference and emits a diagnostic if the reference is unresolvable or ambiguous. *

diff --git a/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportCollector.java b/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportCollector.java index 6cdfa63e..fc4ca43c 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportCollector.java +++ b/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportCollector.java @@ -11,6 +11,7 @@ import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.xtext.linking.impl.LinkingHelper; import org.eclipse.xtext.naming.IQualifiedNameConverter; @@ -57,16 +58,10 @@ public class ImportCollector { if (resourceSet == null) { return ImportCollection.EMPTY; } - Map> aliasesMap = new LinkedHashMap<>(); - for (var statement : problem.getStatements()) { - if (statement instanceof ImportStatement importStatement) { - collectImportStatement(importStatement, aliasesMap); - } - } var adapter = ImportAdapter.getOrInstall(resourceSet); var collection = new ImportCollection(); collectAutomaticImports(collection, adapter); - collectExplicitImports(aliasesMap, collection, adapter); + collectExplicitImports(problem, collection, adapter); collection.remove(resource.getURI()); return collection; } @@ -82,25 +77,30 @@ public class ImportCollector { } } - private void collectExplicitImports(Map> aliasesMap, - ImportCollection collection, ImportAdapter adapter) { - for (var entry : aliasesMap.entrySet()) { - var qualifiedName = entry.getKey(); - var uri = adapter.resolveQualifiedName(qualifiedName); - if (uri != null) { - var aliases = entry.getValue(); - collection.add(NamedImport.explicit(uri, qualifiedName, List.copyOf(aliases))); + private void collectExplicitImports(Problem problem, ImportCollection collection, ImportAdapter adapter) { + for (var statement : problem.getStatements()) { + if (statement instanceof ImportStatement importStatement) { + collectImportStatement(importStatement, collection, adapter); } } } - private void collectImportStatement(ImportStatement importStatement, - Map> aliasesMap) { + private void collectImportStatement(ImportStatement importStatement, ImportCollection collection, + ImportAdapter adapter) { var nodes = NodeModelUtils.findNodesForFeature(importStatement, ProblemPackage.Literals.IMPORT_STATEMENT__IMPORTED_MODULE); var aliasString = importStatement.getAlias(); var alias = Strings.isNullOrEmpty(aliasString) ? QualifiedName.EMPTY : NamingUtil.stripRootPrefix(qualifiedNameConverter.toQualifiedName(aliasString)); + var referredProblem = (EObject) importStatement.eGet(ProblemPackage.Literals.IMPORT_STATEMENT__IMPORTED_MODULE, + false); + URI referencedUri = null; + if (referredProblem != null && !referredProblem.eIsProxy()) { + var resource = referredProblem.eResource(); + if (resource != null) { + referencedUri = resource.getURI(); + } + } for (var node : nodes) { var qualifiedNameString = linkingHelper.getCrossRefNodeAsString(node, true); if (Strings.isNullOrEmpty(qualifiedNameString)) { @@ -108,8 +108,10 @@ public class ImportCollector { } var qualifiedName = NamingUtil.stripRootPrefix( qualifiedNameConverter.toQualifiedName(qualifiedNameString)); - var aliases = aliasesMap.computeIfAbsent(qualifiedName, ignored -> new LinkedHashSet<>()); - aliases.add(alias); + var uri = referencedUri == null ? adapter.resolveQualifiedName(qualifiedName) : referencedUri; + if (uri != null) { + collection.add(NamedImport.explicit(uri, qualifiedName, List.of(alias))); + } } } diff --git a/subprojects/language/src/main/java/tools/refinery/language/serializer/ProblemTransientValueService.java b/subprojects/language/src/main/java/tools/refinery/language/serializer/ProblemTransientValueService.java new file mode 100644 index 00000000..c364b30b --- /dev/null +++ b/subprojects/language/src/main/java/tools/refinery/language/serializer/ProblemTransientValueService.java @@ -0,0 +1,25 @@ +/* + * SPDX-FileCopyrightText: 2024 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.language.serializer; + +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EStructuralFeature; +import org.eclipse.xtext.parsetree.reconstr.impl.DefaultTransientValueService; +import tools.refinery.language.model.problem.Problem; +import tools.refinery.language.model.problem.ProblemPackage; +import tools.refinery.language.parser.ProblemEcoreElementFactory; +import tools.refinery.language.utils.ProblemUtil; + +public class ProblemTransientValueService extends DefaultTransientValueService { + @Override + public boolean isTransient(EObject owner, EStructuralFeature feature, int index) { + if (owner instanceof Problem problem && feature == ProblemPackage.Literals.PROBLEM__KIND) { + return problem.getName() == null && problem.getKind() == ProblemUtil.getDefaultModuleKind(problem) && + !ProblemEcoreElementFactory.hasExplicitlySetProblemKind(problem); + } + return super.isTransient(owner, feature, index); + } +} diff --git a/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemUtil.java b/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemUtil.java index 6b48cb5a..f70893e0 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemUtil.java +++ b/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemUtil.java @@ -5,6 +5,7 @@ */ package tools.refinery.language.utils; +import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.xtext.EcoreUtil2; @@ -12,6 +13,8 @@ import tools.refinery.language.library.BuiltinLibrary; import tools.refinery.language.model.problem.*; public final class ProblemUtil { + public static final String MODULE_EXTENSION = "refinery"; + private ProblemUtil() { throw new IllegalStateException("This is a static utility class and should not be instantiated directly"); } @@ -124,6 +127,18 @@ public final class ProblemUtil { }; } + public static ModuleKind getDefaultModuleKind(Problem problem) { + var resource = problem.eResource(); + if (resource == null) { + return ModuleKind.PROBLEM; + } + return getDefaultModuleKind(resource.getURI()); + } + + public static ModuleKind getDefaultModuleKind(URI uri) { + return MODULE_EXTENSION.equals(uri.fileExtension()) ? ModuleKind.MODULE : ModuleKind.PROBLEM; + } + public static boolean isModule(Problem problem) { return problem.getKind() == ModuleKind.MODULE; } diff --git a/subprojects/language/src/main/resources/tools/refinery/language/library/builtin.refinery b/subprojects/language/src/main/resources/tools/refinery/language/library/builtin.refinery index f9ef959d..4e74ca03 100644 --- a/subprojects/language/src/main/resources/tools/refinery/language/library/builtin.refinery +++ b/subprojects/language/src/main/resources/tools/refinery/language/library/builtin.refinery @@ -1,7 +1,6 @@ % SPDX-FileCopyrightText: 2021-2024 The Refinery Authors % % SPDX-License-Identifier: EPL-2.0 -module builtin. abstract class node. -- cgit v1.2.3-54-g00ecf From b64100256d399128fc2373195351d259bd2ab1fb Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Sun, 11 Feb 2024 01:13:13 +0100 Subject: refactor(language): simplify default module kinds Use a transient attribute instead of an adapter. --- subprojects/language-model/problem.aird | 32 +++++++++++++++------- .../src/main/resources/model/problem.ecore | 2 ++ .../src/main/resources/model/problem.genmodel | 1 + .../parser/ProblemEcoreElementFactory.java | 26 +----------------- .../language/resource/ProblemResource.java | 7 +++-- .../serializer/ProblemTransientValueService.java | 3 +- 6 files changed, 32 insertions(+), 39 deletions(-) diff --git a/subprojects/language-model/problem.aird b/subprojects/language-model/problem.aird index ed3a4b58..cbe413cd 100644 --- a/subprojects/language-model/problem.aird +++ b/subprojects/language-model/problem.aird @@ -7,7 +7,7 @@ build/resources/main/model/problem.genmodel - + @@ -35,11 +35,15 @@ + + + + - + @@ -505,7 +509,7 @@ - + @@ -521,7 +525,7 @@ - + @@ -537,7 +541,7 @@ - + @@ -1400,7 +1404,7 @@ - + @@ -1423,7 +1427,7 @@ KEEP_LOCATION KEEP_SIZE KEEP_RATIO - + @@ -1435,6 +1439,14 @@ + + + + + + + + @@ -1827,12 +1839,12 @@ - + - + italic - + diff --git a/subprojects/language-model/src/main/resources/model/problem.ecore b/subprojects/language-model/src/main/resources/model/problem.ecore index f7c85290..97355516 100644 --- a/subprojects/language-model/src/main/resources/model/problem.ecore +++ b/subprojects/language-model/src/main/resources/model/problem.ecore @@ -7,6 +7,8 @@ + diff --git a/subprojects/language-model/src/main/resources/model/problem.genmodel b/subprojects/language-model/src/main/resources/model/problem.genmodel index 85cd802b..23458ee5 100644 --- a/subprojects/language-model/src/main/resources/model/problem.genmodel +++ b/subprojects/language-model/src/main/resources/model/problem.genmodel @@ -77,6 +77,7 @@ + diff --git a/subprojects/language/src/main/java/tools/refinery/language/parser/ProblemEcoreElementFactory.java b/subprojects/language/src/main/java/tools/refinery/language/parser/ProblemEcoreElementFactory.java index b54c6970..7d246117 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/parser/ProblemEcoreElementFactory.java +++ b/subprojects/language/src/main/java/tools/refinery/language/parser/ProblemEcoreElementFactory.java @@ -5,9 +5,7 @@ */ package tools.refinery.language.parser; -import org.eclipse.emf.common.notify.impl.AdapterImpl; import org.eclipse.emf.ecore.EObject; -import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.xtext.conversion.ValueConverterException; import org.eclipse.xtext.nodemodel.INode; import org.eclipse.xtext.parser.DefaultEcoreElementFactory; @@ -20,29 +18,7 @@ public class ProblemEcoreElementFactory extends DefaultEcoreElementFactory { EObject object, String feature, Object value, String ruleName, INode node) throws ValueConverterException { super.set(object, feature, value, ruleName, node); if (object instanceof Problem problem && ProblemPackage.Literals.PROBLEM__KIND.getName().equals(feature)) { - ExplicitAssignmentTracker.install(problem); - } - } - - public static boolean hasExplicitlySetProblemKind(Problem problem) { - return ExplicitAssignmentTracker.hasAdapter(problem); - } - - private static class ExplicitAssignmentTracker extends AdapterImpl { - @Override - public boolean isAdapterForType(Object type) { - return type == ExplicitAssignmentTracker.class; - } - - public static boolean hasAdapter(Problem problem) { - return EcoreUtil.getAdapter(problem.eAdapters(), ExplicitAssignmentTracker.class) != null; - } - - public static void install(Problem problem) { - if (hasAdapter(problem)) { - throw new IllegalStateException("Duplicate explicit assignment of module kind"); - } - problem.eAdapters().add(new ExplicitAssignmentTracker()); + problem.setExplicitKind(true); } } } diff --git a/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResource.java b/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResource.java index 57b7bb45..440a238e 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResource.java +++ b/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResource.java @@ -25,7 +25,6 @@ import org.eclipse.xtext.resource.DerivedStateAwareResource; import org.eclipse.xtext.util.Triple; import org.jetbrains.annotations.Nullable; import tools.refinery.language.model.problem.Problem; -import tools.refinery.language.parser.ProblemEcoreElementFactory; import tools.refinery.language.utils.ProblemUtil; import java.util.Arrays; @@ -48,7 +47,11 @@ public class ProblemResource extends DerivedStateAwareResource { protected void updateInternalState(IParseResult oldParseResult, IParseResult newParseResult) { if (isNewRootElement(oldParseResult, newParseResult) && newParseResult.getRootASTElement() instanceof Problem newRootProblem && - !ProblemEcoreElementFactory.hasExplicitlySetProblemKind(newRootProblem)) { + !newRootProblem.isExplicitKind()) { + // Post-process the parsed model to set its URI-dependent module kind. + // We can't set the default module kind in {@link tools.refinery.language.serializer + // .ProblemTransientValueService}, because the {@link Problem} does not get added into the EMF resource + // before parsing is fully completed. var defaultModuleKind = ProblemUtil.getDefaultModuleKind(getURI()); newRootProblem.setKind(defaultModuleKind); } diff --git a/subprojects/language/src/main/java/tools/refinery/language/serializer/ProblemTransientValueService.java b/subprojects/language/src/main/java/tools/refinery/language/serializer/ProblemTransientValueService.java index c364b30b..269e1243 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/serializer/ProblemTransientValueService.java +++ b/subprojects/language/src/main/java/tools/refinery/language/serializer/ProblemTransientValueService.java @@ -10,7 +10,6 @@ import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.xtext.parsetree.reconstr.impl.DefaultTransientValueService; import tools.refinery.language.model.problem.Problem; import tools.refinery.language.model.problem.ProblemPackage; -import tools.refinery.language.parser.ProblemEcoreElementFactory; import tools.refinery.language.utils.ProblemUtil; public class ProblemTransientValueService extends DefaultTransientValueService { @@ -18,7 +17,7 @@ public class ProblemTransientValueService extends DefaultTransientValueService { public boolean isTransient(EObject owner, EStructuralFeature feature, int index) { if (owner instanceof Problem problem && feature == ProblemPackage.Literals.PROBLEM__KIND) { return problem.getName() == null && problem.getKind() == ProblemUtil.getDefaultModuleKind(problem) && - !ProblemEcoreElementFactory.hasExplicitlySetProblemKind(problem); + !problem.isExplicitKind(); } return super.isTransient(owner, feature, index); } -- cgit v1.2.3-54-g00ecf From fdfc79cb3cfcfb8405de8e1548d1b95a816f616a Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Sun, 11 Feb 2024 22:08:00 +0100 Subject: refactor(language): scope shadowing --- .../scoping/ProblemGlobalScopeProvider.java | 5 +-- .../scoping/ProblemLocalScopeProvider.java | 8 ++-- .../ShadowingKeyAwareSelectableBasedScope.java | 52 ++++++++++++++++++++++ 3 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 subprojects/language/src/main/java/tools/refinery/language/scoping/ShadowingKeyAwareSelectableBasedScope.java diff --git a/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemGlobalScopeProvider.java b/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemGlobalScopeProvider.java index dad4e5d0..65e80a7e 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemGlobalScopeProvider.java +++ b/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemGlobalScopeProvider.java @@ -15,10 +15,9 @@ import org.eclipse.xtext.resource.IEObjectDescription; import org.eclipse.xtext.resource.ISelectable; import org.eclipse.xtext.scoping.IScope; import org.eclipse.xtext.scoping.impl.AbstractGlobalScopeProvider; -import org.eclipse.xtext.scoping.impl.SelectableBasedScope; import org.eclipse.xtext.util.IResourceScopeCache; -import tools.refinery.language.scoping.imports.ImportCollector; import tools.refinery.language.resource.LoadOnDemandResourceDescriptionProvider; +import tools.refinery.language.scoping.imports.ImportCollector; import tools.refinery.language.scoping.imports.NamedImport; import java.util.ArrayList; @@ -81,7 +80,7 @@ public class ProblemGlobalScopeProvider extends AbstractGlobalScopeProvider { protected IScope createScope(IScope parent, Collection children, EClass type, Predicate filter, boolean ignoreCase) { var selectable = CompositeSelectable.of(children); - return SelectableBasedScope.createScope(parent, selectable, filter, type, ignoreCase); + return ShadowingKeyAwareSelectableBasedScope.createScope(parent, selectable, filter, type, ignoreCase); } protected record LoadedImports(List qualifiedImports, List implicitImports, diff --git a/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemLocalScopeProvider.java b/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemLocalScopeProvider.java index 610efc03..1c0c1d86 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemLocalScopeProvider.java +++ b/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemLocalScopeProvider.java @@ -17,7 +17,6 @@ import org.eclipse.xtext.resource.IResourceDescriptionsProvider; import org.eclipse.xtext.resource.ISelectable; import org.eclipse.xtext.scoping.IScope; import org.eclipse.xtext.scoping.impl.AbstractGlobalScopeDelegatingScopeProvider; -import org.eclipse.xtext.scoping.impl.SelectableBasedScope; import org.eclipse.xtext.util.IResourceScopeCache; import tools.refinery.language.naming.ProblemQualifiedNameProvider; @@ -47,12 +46,13 @@ public class ProblemLocalScopeProvider extends AbstractGlobalScopeDelegatingScop var globalScope = getGlobalScope(resource, reference); var type = reference.getEReferenceType(); boolean ignoreCase = isIgnoreCase(reference); - var scope = SelectableBasedScope.createScope(globalScope, localImports.resourceDescription(), type, - ignoreCase); + var scope = ShadowingKeyAwareSelectableBasedScope.createScope(globalScope, localImports.resourceDescription(), + type, ignoreCase); if (localImports.normalizedSelectable() == null) { return scope; } - return SelectableBasedScope.createScope(scope, localImports.normalizedSelectable(), type, ignoreCase); + return ShadowingKeyAwareSelectableBasedScope.createScope(scope, localImports.normalizedSelectable(), type, + ignoreCase); } protected LocalImports computeLocalImports(Resource resource) { diff --git a/subprojects/language/src/main/java/tools/refinery/language/scoping/ShadowingKeyAwareSelectableBasedScope.java b/subprojects/language/src/main/java/tools/refinery/language/scoping/ShadowingKeyAwareSelectableBasedScope.java new file mode 100644 index 00000000..cdef13ad --- /dev/null +++ b/subprojects/language/src/main/java/tools/refinery/language/scoping/ShadowingKeyAwareSelectableBasedScope.java @@ -0,0 +1,52 @@ +/* + * SPDX-FileCopyrightText: 2024 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.language.scoping; + +import com.google.common.base.Predicate; +import org.eclipse.emf.ecore.EClass; +import org.eclipse.xtext.resource.IEObjectDescription; +import org.eclipse.xtext.resource.ISelectable; +import org.eclipse.xtext.scoping.IScope; +import org.eclipse.xtext.scoping.impl.SelectableBasedScope; +import tools.refinery.language.resource.ProblemResourceDescriptionStrategy; + +import java.util.Objects; + +public class ShadowingKeyAwareSelectableBasedScope extends SelectableBasedScope { + public static IScope createScope(IScope outer, ISelectable selectable, EClass type, boolean ignoreCase) { + return createScope(outer, selectable, null, type, ignoreCase); + } + + // {@link com.google.common.base.Predicate} required by Xtext API. + @SuppressWarnings("squid:S4738") + public static IScope createScope(IScope outer, ISelectable selectable, Predicate filter, + EClass type, boolean ignoreCase) { + if (selectable == null || selectable.isEmpty()) + return outer; + return new ShadowingKeyAwareSelectableBasedScope(outer, selectable, filter, type, ignoreCase); + } + + // {@link com.google.common.base.Predicate} required by Xtext API. + @SuppressWarnings("squid:S4738") + protected ShadowingKeyAwareSelectableBasedScope(IScope outer, ISelectable selectable, + Predicate filter, + EClass type, boolean ignoreCase) { + super(outer, selectable, filter, type, ignoreCase); + } + + @Override + protected boolean isShadowed(IEObjectDescription input) { + var shadowingKey = input.getUserData(ProblemResourceDescriptionStrategy.SHADOWING_KEY); + var localElements = getLocalElementsByName(input.getName()); + for (var localElement : localElements) { + var localElementKey = localElement.getUserData(ProblemResourceDescriptionStrategy.SHADOWING_KEY); + if (Objects.equals(shadowingKey, localElementKey)) { + return true; + } + } + return false; + } +} -- cgit v1.2.3-54-g00ecf From 0b7b1b2b5a136e157b733e9d9c7e1d250efae15d Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Sun, 11 Feb 2024 22:28:36 +0100 Subject: feat(language): filter content assist for imports --- .../ProblemCrossrefProposalProvider.java | 22 ++++++++++++++++++++++ .../ProblemResourceDescriptionStrategy.java | 4 +++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/subprojects/language-ide/src/main/java/tools/refinery/language/ide/contentassist/ProblemCrossrefProposalProvider.java b/subprojects/language-ide/src/main/java/tools/refinery/language/ide/contentassist/ProblemCrossrefProposalProvider.java index fa04a012..a09a475b 100644 --- a/subprojects/language-ide/src/main/java/tools/refinery/language/ide/contentassist/ProblemCrossrefProposalProvider.java +++ b/subprojects/language-ide/src/main/java/tools/refinery/language/ide/contentassist/ProblemCrossrefProposalProvider.java @@ -24,6 +24,7 @@ import tools.refinery.language.model.problem.*; import tools.refinery.language.naming.NamingUtil; import tools.refinery.language.naming.ProblemQualifiedNameConverter; import tools.refinery.language.resource.ProblemResourceDescriptionStrategy; +import tools.refinery.language.scoping.imports.ImportCollector; import tools.refinery.language.utils.BuiltinSymbols; import tools.refinery.language.utils.ProblemDesugarer; import tools.refinery.language.utils.ProblemUtil; @@ -44,6 +45,9 @@ public class ProblemCrossrefProposalProvider extends IdeCrossrefProposalProvider @Inject private ProblemDesugarer desugarer; + @Inject + private ImportCollector importCollector; + @Override protected Iterable queryScope(IScope scope, CrossReference crossReference, ContentAssistContext context) { @@ -110,6 +114,10 @@ public class ProblemCrossrefProposalProvider extends IdeCrossrefProposalProvider return true; } + if (eReference == ProblemPackage.Literals.IMPORT_STATEMENT__IMPORTED_MODULE) { + return importedModuleShouldBeVisible(candidate, context); + } + var candidateEObjectOrProxy = candidate.getEObjectOrProxy(); if (eReference.equals(ProblemPackage.Literals.REFERENCE_DECLARATION__OPPOSITE) && @@ -127,6 +135,20 @@ public class ProblemCrossrefProposalProvider extends IdeCrossrefProposalProvider candidateEObjectOrProxy); } + private boolean importedModuleShouldBeVisible(IEObjectDescription candidate, ContentAssistContext context) { + var moduleKind = candidate.getUserData(ProblemResourceDescriptionStrategy.MODULE_KIND); + if (!ModuleKind.MODULE.getName().equals(moduleKind)) { + return false; + } + var resource = context.getResource(); + var candidateResourceUri = candidate.getEObjectURI().trimFragment(); + if (candidateResourceUri.equals(resource.getURI())) { + return false; + } + var imports = importCollector.getDirectImports(resource); + return !imports.toUriSet().contains(candidateResourceUri); + } + private static boolean oppositeShouldBeVisible(ReferenceDeclaration candidateReferenceDeclaration, ContentAssistContext context) { var referenceDeclaration = EcoreUtil2.getContainerOfType(context.getCurrentModel(), diff --git a/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java b/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java index 7d90ea00..3080a78e 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java +++ b/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java @@ -42,6 +42,7 @@ public class ProblemResourceDescriptionStrategy extends DefaultResourceDescripti public static final String PREFERRED_NAME_TRUE = "true"; public static final String IMPORTS = DATA_PREFIX + "IMPORTS"; public static final String IMPORTS_SEPARATOR = "|"; + public static final String MODULE_KIND = DATA_PREFIX + "MODULE_KIND"; public static final String COLOR_RELATION = DATA_PREFIX + "COLOR_RELATION"; public static final String COLOR_RELATION_TRUE = "true"; @@ -135,13 +136,14 @@ public class ProblemResourceDescriptionStrategy extends DefaultResourceDescripti protected Map getUserData(EObject eObject) { var builder = ImmutableMap.builder(); - if (eObject instanceof Problem) { + if (eObject instanceof Problem problem) { builder.put(SHADOWING_KEY, SHADOWING_KEY_PROBLEM); var explicitImports = importCollector.getDirectImports(eObject.eResource()); var importsString = explicitImports.toList().stream() .map(importEntry -> importEntry.uri().toString()) .collect(Collectors.joining(IMPORTS_SEPARATOR)); builder.put(IMPORTS, importsString); + builder.put(MODULE_KIND, problem.getKind().getName()); } else if (eObject instanceof Node) { builder.put(SHADOWING_KEY, SHADOWING_KEY_NODE); } else if (eObject instanceof Relation relation) { -- cgit v1.2.3-54-g00ecf From 6c4d81ba085d24035ad1f2e45d4e731d3b33e6db Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Sun, 18 Feb 2024 20:44:00 +0100 Subject: refactor(language): no fully qualified self import Make sure it is impossible to create clashing fully qualified names when renaming a module by forbidding modules from referring to their own elements with fully qualified names. Therefore, serializing a solution will not create clashing fully qualified names (which would prevent serialization from succeeding). --- .../language/semantics/SemanticsUtils.java | 41 +++++++- .../language/semantics/SolutionSerializer.java | 106 +++++++++++++-------- .../scoping/NoFullyQualifiedNamesSelectable.java | 62 ++++++++++++ .../scoping/ProblemLocalScopeProvider.java | 29 ++---- .../language/scoping/imports/ImportAdapter.java | 25 ----- .../language/tests/scoping/NodeScopingTest.java | 70 +++++--------- 6 files changed, 202 insertions(+), 131 deletions(-) create mode 100644 subprojects/language/src/main/java/tools/refinery/language/scoping/NoFullyQualifiedNamesSelectable.java diff --git a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SemanticsUtils.java b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SemanticsUtils.java index 110295b2..9c40e6df 100644 --- a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SemanticsUtils.java +++ b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SemanticsUtils.java @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2023 The Refinery Authors + * SPDX-FileCopyrightText: 2023-2024 The Refinery Authors * * SPDX-License-Identifier: EPL-2.0 */ @@ -8,11 +8,14 @@ package tools.refinery.language.semantics; import com.google.inject.Inject; import com.google.inject.Singleton; import com.google.inject.name.Named; +import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.xtext.naming.IQualifiedNameConverter; import org.eclipse.xtext.naming.IQualifiedNameProvider; import org.eclipse.xtext.naming.QualifiedName; +import org.eclipse.xtext.resource.IEObjectDescription; +import org.eclipse.xtext.resource.IResourceDescriptionsProvider; import org.eclipse.xtext.scoping.IScope; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -33,6 +36,9 @@ public class SemanticsUtils { @Inject private IQualifiedNameConverter qualifiedNameConverter; + @Inject + private IResourceDescriptionsProvider resourceDescriptionsProvider; + public Optional getNameWithoutRootPrefix(EObject eObject) { var qualifiedName = delegateQualifiedNameProvider.getFullyQualifiedName(eObject); if (qualifiedName == null) { @@ -41,12 +47,32 @@ public class SemanticsUtils { return Optional.of(qualifiedNameConverter.toString(qualifiedName)); } + @Nullable + public T maybeGetLocalElement(Problem problem, QualifiedName qualifiedName, Class type, EClass eClass) { + var resource = problem.eResource(); + var resourceSet = resource.getResourceSet(); + var resourceDescriptions = resourceDescriptionsProvider.getResourceDescriptions(resourceSet); + var resourceDescription = resourceDescriptions.getResourceDescription(resource.getURI()); + if (resourceDescription == null) { + return null; + } + var eObjectDescriptions = resourceDescription.getExportedObjects(eClass, qualifiedName, false); + return maybeGet(problem, eObjectDescriptions, qualifiedName, type); + } + @Nullable public T maybeGetElement(Problem problem, IScope scope, QualifiedName qualifiedName, Class type) { if (qualifiedName == null) { throw new IllegalArgumentException("Element name must not be null"); } - var iterator = scope.getElements(qualifiedName).iterator(); + var eObjectDescriptions = scope.getElements(qualifiedName); + return maybeGet(problem, eObjectDescriptions, qualifiedName, type); + } + + @Nullable + private T maybeGet(Problem problem, Iterable eObjectDescriptions, + QualifiedName qualifiedName, Class type) { + var iterator = eObjectDescriptions.iterator(); if (!iterator.hasNext()) { return null; } @@ -65,9 +91,20 @@ public class SemanticsUtils { return type.cast(eObject); } + @NotNull + public T getLocalElement(Problem problem, QualifiedName qualifiedName, Class type, EClass eClass) { + var element = maybeGetLocalElement(problem, qualifiedName, type, eClass); + return getOrThrow(element, qualifiedName, type); + } + @NotNull public T getElement(Problem problem, IScope scope, QualifiedName qualifiedName, Class type) { var element = maybeGetElement(problem, scope, qualifiedName, type); + return getOrThrow(element, qualifiedName, type); + } + + @NotNull + private T getOrThrow(@Nullable T element, QualifiedName qualifiedName, Class type) { if (element == null) { var qualifiedNameString = qualifiedNameConverter.toString(qualifiedName); throw new IllegalArgumentException("No such %s: %s" diff --git a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SolutionSerializer.java b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SolutionSerializer.java index 2fb0a49d..377a66f3 100644 --- a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SolutionSerializer.java +++ b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SolutionSerializer.java @@ -10,6 +10,8 @@ import com.google.inject.Provider; import org.eclipse.collections.api.factory.primitive.IntObjectMaps; import org.eclipse.collections.api.map.primitive.MutableIntObjectMap; import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.xtext.naming.IQualifiedNameProvider; import org.eclipse.xtext.naming.QualifiedName; @@ -18,7 +20,7 @@ import org.eclipse.xtext.resource.XtextResource; import org.eclipse.xtext.resource.XtextResourceSet; import org.eclipse.xtext.scoping.IScopeProvider; import tools.refinery.language.model.problem.*; -import tools.refinery.language.scoping.imports.ImportAdapter; +import tools.refinery.language.naming.NamingUtil; import tools.refinery.language.utils.ProblemDesugarer; import tools.refinery.language.utils.ProblemUtil; import tools.refinery.store.model.Model; @@ -34,9 +36,7 @@ import tools.refinery.store.tuple.Tuple; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.util.Map; -import java.util.TreeMap; -import java.util.TreeSet; +import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -66,13 +66,17 @@ public class SolutionSerializer { private Model model; private ReasoningAdapter reasoningAdapter; private PartialInterpretation existsInterpretation; + private Resource originalResource; private Problem originalProblem; + private QualifiedName originalProblemName; private Problem problem; + private QualifiedName newProblemName; private NodeDeclaration nodeDeclaration; private final MutableIntObjectMap nodes = IntObjectMaps.mutable.empty(); public Problem serializeSolution(ProblemTrace trace, Model model) { - var uri = URI.createURI("__synthetic." + ProblemUtil.MODULE_EXTENSION); + var uri = URI.createURI("__solution_%s.%s".formatted(UUID.randomUUID().toString().replace('-', '_'), + ProblemUtil.MODULE_EXTENSION)); return serializeSolution(trace, model, uri); } @@ -83,10 +87,14 @@ public class SolutionSerializer { existsInterpretation = reasoningAdapter.getPartialInterpretation(Concreteness.CANDIDATE, ReasoningAdapter.EXISTS_SYMBOL); originalProblem = trace.getProblem(); + originalProblemName = qualifiedNameProvider.getFullyQualifiedName(originalProblem); problem = copyProblem(originalProblem, uri); - problem.setKind(ModuleKind.MODULE); + problem.setKind(ProblemUtil.getDefaultModuleKind(uri)); + problem.setExplicitKind(false); + problem.setName(null); + newProblemName = qualifiedNameProvider.getFullyQualifiedName(originalProblem); problem.getStatements().removeIf(SolutionSerializer::shouldRemoveStatement); - problem.getNodes().removeIf(this::shouldRemoveNode); + removeNonExistentImplicitNodes(); nodeDeclaration = ProblemFactory.eINSTANCE.createNodeDeclaration(); nodeDeclaration.setKind(NodeKind.NODE); nodeDeclaration.getNodes().addAll(problem.getNodes()); @@ -105,15 +113,28 @@ public class SolutionSerializer { return statement instanceof Assertion || statement instanceof ScopeDeclaration; } - private boolean shouldRemoveNode(Node newNode) { - var qualifiedName = qualifiedNameProvider.getFullyQualifiedName(newNode); - var scope = scopeProvider.getScope(originalProblem, ProblemPackage.Literals.NODE_ASSERTION_ARGUMENT__NODE); - var originalNode = semanticsUtils.maybeGetElement(originalProblem, scope, qualifiedName, Node.class); - if (originalNode == null) { - return false; + private void removeNonExistentImplicitNodes() { + var originalImplicitNodes = originalProblem.getNodes(); + var newImplicitNodes = problem.getNodes(); + if (newImplicitNodes.size() != originalImplicitNodes.size()) { + throw new IllegalStateException("Expected %d implicit nodes in problem, but got %d after copying" + .formatted(originalImplicitNodes.size(), newImplicitNodes.size())); + } + var iterator = newImplicitNodes.iterator(); + for (var originalNode : originalImplicitNodes) { + if (!iterator.hasNext()) { + throw new AssertionError("Unexpected end of copied implicit node list"); + } + var newNode = iterator.next(); + if (!Objects.equals(originalNode.getName(), newNode.getName())) { + throw new IllegalStateException("Expected copy of '%s' to have the same name, got '%s' instead" + .formatted(originalNode.getName(), newNode.getName())); + } + int nodeId = trace.getNodeId(originalNode); + if (!isExistingNode(nodeId)) { + iterator.remove(); + } } - int nodeId = trace.getNodeId(originalNode); - return !isExistingNode(nodeId); } private boolean isExistingNode(int nodeId) { @@ -125,14 +146,10 @@ public class SolutionSerializer { } private Problem copyProblem(Problem originalProblem, URI uri) { - var newResourceSet = resourceSetProvider.get(); - ImportAdapter.copySettings(originalProblem, newResourceSet); - if (!ProblemUtil.MODULE_EXTENSION.equals(uri.fileExtension())) { - uri = uri.appendFileExtension(ProblemUtil.MODULE_EXTENSION); - } + originalResource = originalProblem.eResource(); + var resourceSet = originalResource.getResourceSet(); var newResource = resourceFactory.createResource(uri); - newResourceSet.getResources().add(newResource); - var originalResource = originalProblem.eResource(); + resourceSet.getResources().add(newResource); if (originalResource instanceof XtextResource) { byte[] bytes; try { @@ -147,7 +164,7 @@ public class SolutionSerializer { throw new IllegalStateException("Failed to copy problem", e); } var contents = newResource.getContents(); - EcoreUtil.resolveAll(newResourceSet); + EcoreUtil.resolveAll(newResource); if (!contents.isEmpty() && contents.getFirst() instanceof Problem newProblem) { return newProblem; } @@ -159,10 +176,24 @@ public class SolutionSerializer { } } + private QualifiedName getConvertedName(EObject original) { + var qualifiedName = qualifiedNameProvider.getFullyQualifiedName(original); + if (originalProblemName != null && qualifiedName.startsWith(originalProblemName)) { + qualifiedName = qualifiedName.skipFirst(originalProblemName.getSegmentCount()); + } + if (newProblemName != null) { + qualifiedName = newProblemName.append(qualifiedName); + } + return NamingUtil.addRootPrefix(qualifiedName); + } + private Relation findRelation(Relation originalRelation) { - var qualifiedName = qualifiedNameProvider.getFullyQualifiedName(originalRelation); - var scope = scopeProvider.getScope(problem, ProblemPackage.Literals.ASSERTION__RELATION); - return semanticsUtils.getElement(problem, scope, qualifiedName, Relation.class); + if (originalRelation.eResource() != originalResource) { + return originalRelation; + } + var qualifiedName = getConvertedName(originalRelation); + return semanticsUtils.getLocalElement(problem, qualifiedName, Relation.class, + ProblemPackage.Literals.RELATION); } private Relation findPartialRelation(PartialRelation partialRelation) { @@ -170,13 +201,11 @@ public class SolutionSerializer { } private Node findNode(Node originalNode) { - var qualifiedName = qualifiedNameProvider.getFullyQualifiedName(originalNode); - return findNode(qualifiedName); - } - - private Node findNode(QualifiedName qualifiedName) { - var scope = scopeProvider.getScope(problem, ProblemPackage.Literals.NODE_ASSERTION_ARGUMENT__NODE); - return semanticsUtils.maybeGetElement(problem, scope, qualifiedName, Node.class); + if (originalNode.eResource() != originalResource) { + return originalNode; + } + var qualifiedName = getConvertedName(originalNode); + return semanticsUtils.maybeGetLocalElement(problem, qualifiedName, Node.class, ProblemPackage.Literals.NODE); } private void addAssertion(Relation relation, LogicValue value, Node... arguments) { @@ -194,8 +223,8 @@ public class SolutionSerializer { } private void addExistsAssertions() { - var builtinSymbols = desugarer.getBuiltinSymbols(problem) - .orElseThrow(() -> new IllegalStateException("No builtin library in copied problem")); + var builtinSymbols = desugarer.getBuiltinSymbols(problem).orElseThrow(() -> new IllegalStateException("No " + + "builtin library in copied problem")); // Make sure to output exists assertions in a deterministic order. var sortedNewNodes = new TreeMap(); for (var pair : trace.getNodeTrace().keyValuesView()) { @@ -204,8 +233,7 @@ public class SolutionSerializer { var newNode = findNode(originalNode); // Since all implicit nodes that do not exist has already been removed in serializeSolution, // we only need to add !exists assertions to ::new nodes and explicitly declared nodes that do not exist. - if (ProblemUtil.isMultiNode(originalNode) || - (ProblemUtil.isDeclaredNode(originalNode) && !isExistingNode(nodeId))) { + if (ProblemUtil.isMultiNode(originalNode) || (ProblemUtil.isDeclaredNode(originalNode) && !isExistingNode(nodeId))) { sortedNewNodes.put(nodeId, newNode); } else { nodes.put(nodeId, newNode); @@ -218,8 +246,8 @@ public class SolutionSerializer { } private void addClassAssertions() { - var types = trace.getMetamodel().typeHierarchy().getPreservedTypes().keySet().stream() - .collect(Collectors.toMap(Function.identity(), this::findPartialRelation)); + var types = + trace.getMetamodel().typeHierarchy().getPreservedTypes().keySet().stream().collect(Collectors.toMap(Function.identity(), this::findPartialRelation)); var cursor = model.getInterpretation(TypeHierarchyTranslator.TYPE_SYMBOL).getAll(); while (cursor.move()) { var key = cursor.getKey(); diff --git a/subprojects/language/src/main/java/tools/refinery/language/scoping/NoFullyQualifiedNamesSelectable.java b/subprojects/language/src/main/java/tools/refinery/language/scoping/NoFullyQualifiedNamesSelectable.java new file mode 100644 index 00000000..f9405fc1 --- /dev/null +++ b/subprojects/language/src/main/java/tools/refinery/language/scoping/NoFullyQualifiedNamesSelectable.java @@ -0,0 +1,62 @@ +/* + * SPDX-FileCopyrightText: 2024 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.language.scoping; + +import com.google.common.base.Predicate; +import com.google.common.collect.Iterables; +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.xtext.naming.QualifiedName; +import org.eclipse.xtext.resource.IEObjectDescription; +import org.eclipse.xtext.resource.ISelectable; +import tools.refinery.language.naming.NamingUtil; + +import java.util.List; + +public class NoFullyQualifiedNamesSelectable implements ISelectable { + private final ISelectable delegateSelectable; + + // {@link com.google.common.base.Predicate} required by Xtext API. + @SuppressWarnings("squid:S4738") + private final Predicate filter = + eObjectDescription -> !NamingUtil.isFullyQualified(eObjectDescription.getName()); + + public NoFullyQualifiedNamesSelectable(ISelectable delegateSelectable) { + this.delegateSelectable = delegateSelectable; + } + + @Override + public boolean isEmpty() { + return delegateSelectable.isEmpty(); + } + + @Override + public Iterable getExportedObjects() { + return filter(delegateSelectable.getExportedObjects()); + } + + @Override + public Iterable getExportedObjects(EClass type, QualifiedName name, boolean ignoreCase) { + if (NamingUtil.isFullyQualified(name)) { + return List.of(); + } + return delegateSelectable.getExportedObjects(type, name, ignoreCase); + } + + @Override + public Iterable getExportedObjectsByType(EClass type) { + return filter(delegateSelectable.getExportedObjectsByType(type)); + } + + @Override + public Iterable getExportedObjectsByObject(EObject object) { + return filter(delegateSelectable.getExportedObjectsByObject(object)); + } + + private Iterable filter(Iterable eObjectDescriptions) { + return Iterables.filter(eObjectDescriptions, filter); + } +} diff --git a/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemLocalScopeProvider.java b/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemLocalScopeProvider.java index 1c0c1d86..0067bf94 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemLocalScopeProvider.java +++ b/subprojects/language/src/main/java/tools/refinery/language/scoping/ProblemLocalScopeProvider.java @@ -12,7 +12,6 @@ import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.xtext.naming.IQualifiedNameProvider; import org.eclipse.xtext.naming.QualifiedName; -import org.eclipse.xtext.resource.IResourceDescription; import org.eclipse.xtext.resource.IResourceDescriptionsProvider; import org.eclipse.xtext.resource.ISelectable; import org.eclipse.xtext.scoping.IScope; @@ -39,41 +38,31 @@ public class ProblemLocalScopeProvider extends AbstractGlobalScopeDelegatingScop if (resource == null) { return IScope.NULLSCOPE; } + var globalScope = getGlobalScope(resource, reference); var localImports = cache.get(CACHE_KEY, resource, () -> computeLocalImports(resource)); - if (localImports.resourceDescription() == null) { - return IScope.NULLSCOPE; + if (localImports == null) { + return globalScope; } - var globalScope = getGlobalScope(resource, reference); var type = reference.getEReferenceType(); boolean ignoreCase = isIgnoreCase(reference); - var scope = ShadowingKeyAwareSelectableBasedScope.createScope(globalScope, localImports.resourceDescription(), - type, ignoreCase); - if (localImports.normalizedSelectable() == null) { - return scope; - } - return ShadowingKeyAwareSelectableBasedScope.createScope(scope, localImports.normalizedSelectable(), type, - ignoreCase); + return ShadowingKeyAwareSelectableBasedScope.createScope(globalScope, localImports, type, ignoreCase); } - protected LocalImports computeLocalImports(Resource resource) { + protected ISelectable computeLocalImports(Resource resource) { // Force the use of ProblemResourceDescriptionStrategy to include all QualifiedNames of objects. var resourceDescriptions = resourceDescriptionsProvider.getResourceDescriptions(resource.getResourceSet()); var resourceDescription = resourceDescriptions.getResourceDescription(resource.getURI()); if (resourceDescription == null) { - return new LocalImports(null, null); + return null; } var rootElement = resource.getContents().getFirst(); if (rootElement == null) { - return new LocalImports(resourceDescription, null); + return new NoFullyQualifiedNamesSelectable(resourceDescription); } var rootName = delegateQualifiedNameProvider.getFullyQualifiedName(rootElement); if (rootName == null) { - return new LocalImports(resourceDescription, null); + return new NoFullyQualifiedNamesSelectable(resourceDescription); } - var normalizedSelectable = new NormalizedSelectable(resourceDescription, rootName, QualifiedName.EMPTY); - return new LocalImports(resourceDescription, normalizedSelectable); - } - - protected record LocalImports(IResourceDescription resourceDescription, ISelectable normalizedSelectable) { + return new NormalizedSelectable(resourceDescription, rootName, QualifiedName.EMPTY); } } diff --git a/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportAdapter.java b/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportAdapter.java index 5a8f7fd7..d7a5304f 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportAdapter.java +++ b/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportAdapter.java @@ -12,7 +12,6 @@ import org.apache.log4j.Logger; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.common.notify.impl.AdapterImpl; import org.eclipse.emf.common.util.URI; -import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.util.EcoreUtil; @@ -203,28 +202,4 @@ public class ImportAdapter extends AdapterImpl { private static ImportAdapter getAdapter(ResourceSet resourceSet) { return (ImportAdapter) EcoreUtil.getAdapter(resourceSet.eAdapters(), ImportAdapter.class); } - - public static void copySettings(EObject context, ResourceSet newResourceSet) { - var resource = context.eResource(); - if (resource == null) { - return; - } - var originalResourceSet = resource.getResourceSet(); - if (originalResourceSet == null) { - return; - } - copySettings(originalResourceSet, newResourceSet); - } - - public static void copySettings(ResourceSet originalResourceSet, ResourceSet newResourceSet) { - var originalAdapter = getAdapter(originalResourceSet); - if (originalAdapter == null) { - return; - } - var newAdapter = getOrInstall(newResourceSet); - newAdapter.libraries.clear(); - newAdapter.libraries.addAll(originalAdapter.libraries); - newAdapter.libraryPaths.clear(); - newAdapter.libraryPaths.addAll(originalAdapter.libraryPaths); - } } diff --git a/subprojects/language/src/test/java/tools/refinery/language/tests/scoping/NodeScopingTest.java b/subprojects/language/src/test/java/tools/refinery/language/tests/scoping/NodeScopingTest.java index bc0320a6..0704e026 100644 --- a/subprojects/language/src/test/java/tools/refinery/language/tests/scoping/NodeScopingTest.java +++ b/subprojects/language/src/test/java/tools/refinery/language/tests/scoping/NodeScopingTest.java @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors + * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors * * SPDX-License-Identifier: EPL-2.0 */ @@ -68,15 +68,14 @@ class NodeScopingTest { assertThat(problem.assertion(0).arg(0).node(), equalTo(problem.node("b"))); } - @ParameterizedTest - @MethodSource("atomNodeReferenceSource") - void atomNodeInAssertionTest(String qualifiedNamePrefix, boolean namedProblem) { + @Test + void atomNodeInAssertionTest() { var problem = parse(""" atom a, b. pred predicate(node x, node y) <-> node(x). - predicate({PARAM}a, {PARAM}a). - ?predicate({PARAM}a, {PARAM}b). - """, qualifiedNamePrefix, namedProblem); + predicate(a, a). + ?predicate(a, b). + """); assertThat(problem.getResourceErrors(), empty()); assertThat(problem.nodeNames(), empty()); assertThat(problem.assertion(0).arg(0).node(), equalTo(problem.atomNode("a"))); @@ -85,22 +84,17 @@ class NodeScopingTest { assertThat(problem.assertion(1).arg(1).node(), equalTo(problem.atomNode("b"))); } - @ParameterizedTest - @MethodSource("atomNodeReferenceSource") - void atomNodeInPredicateTest(String qualifiedNamePrefix, boolean namedProblem) { + @Test + void atomNodeInPredicateTest() { var problem = parse(""" atom b. - pred predicate(node a) <-> node({PARAM}b). - """, qualifiedNamePrefix, namedProblem); + pred predicate(node a) <-> node(b). + """); assertThat(problem.getResourceErrors(), empty()); assertThat(problem.nodeNames(), empty()); assertThat(problem.pred("predicate").conj(0).lit(0).arg(0).node(), equalTo(problem.atomNode("b"))); } - static Stream atomNodeReferenceSource() { - return Stream.of(Arguments.of("", false), Arguments.of("", true), Arguments.of("test::", true)); - } - @Disabled("No nodes are present in builtin.problem currently") @ParameterizedTest @MethodSource("builtInNodeReferencesSource") @@ -131,37 +125,30 @@ class NodeScopingTest { return Stream.of(Arguments.of("int::new"), Arguments.of("builtin::int::new")); } - @ParameterizedTest - @MethodSource("classNewNodeReferencesSource") - void classNewNodeTest(String qualifiedName, boolean namedProblem) { + @Test + void classNewNodeTest() { var problem = parse(""" class Foo. pred predicate(node x) <-> node(x). - predicate({PARAM}). - """, qualifiedName, namedProblem); + predicate(Foo::new). + """); assertThat(problem.getResourceErrors(), empty()); assertThat(problem.nodeNames(), empty()); assertThat(problem.assertion(0).arg(0).node(), equalTo(problem.findClass("Foo").get().getNewNode())); } - @ParameterizedTest - @MethodSource("classNewNodeReferencesSource") - void classNewNodeInPredicateTest(String qualifiedName, boolean namedProblem) { + @Test + void classNewNodeInPredicateTest() { var problem = parse(""" class Foo. - pred predicate(node x) <-> node({PARAM}). - """, qualifiedName, namedProblem); + pred predicate(node x) <-> node(Foo::new). + """); assertThat(problem.getResourceErrors(), empty()); assertThat(problem.nodeNames(), empty()); assertThat(problem.pred("predicate").conj(0).lit(0).arg(0).node(), equalTo(problem.findClass("Foo").get().getNewNode())); } - static Stream classNewNodeReferencesSource() { - return Stream.of(Arguments.of("Foo::new", false), Arguments.of("Foo::new", true), - Arguments.of("test::Foo::new", true)); - } - @Test void newNodeIsNotSpecial() { var problem = parse(""" @@ -176,12 +163,12 @@ class NodeScopingTest { @ParameterizedTest @MethodSource("enumLiteralReferencesSource") - void enumLiteralTest(String qualifiedName, boolean namedProblem) { + void enumLiteralTest(String qualifiedName) { var problem = parse(""" enum Foo { alpha, beta } pred predicate(Foo a) <-> node(a). predicate({PARAM}). - """, qualifiedName, namedProblem); + """, qualifiedName); assertThat(problem.getResourceErrors(), empty()); assertThat(problem.nodeNames(), empty()); assertThat(problem.assertion(0).arg(0).node(), equalTo(problem.findEnum("Foo").literal("alpha"))); @@ -189,11 +176,11 @@ class NodeScopingTest { @ParameterizedTest @MethodSource("enumLiteralReferencesSource") - void enumLiteralInPredicateTest(String qualifiedName, boolean namedProblem) { + void enumLiteralInPredicateTest(String qualifiedName) { var problem = parse(""" enum Foo { alpha, beta } pred predicate(Foo a) <-> node({PARAM}). - """, qualifiedName, namedProblem); + """, qualifiedName); assertThat(problem.getResourceErrors(), empty()); assertThat(problem.nodeNames(), empty()); assertThat(problem.pred("predicate").conj(0).lit(0).arg(0).node(), @@ -201,9 +188,7 @@ class NodeScopingTest { } static Stream enumLiteralReferencesSource() { - return Stream.of(Arguments.of("alpha", false), Arguments.of("alpha", true), Arguments.of("Foo::alpha", false), - Arguments.of("Foo::alpha", true), Arguments.of("test::alpha", true), - Arguments.of("test::Foo::alpha", true)); + return Stream.of(Arguments.of("alpha"), Arguments.of("Foo::alpha")); } @Disabled("No enum literals are present in builtin.problem currently") @@ -222,7 +207,7 @@ class NodeScopingTest { @Disabled("No enum literals are present in builtin.problem currently") @ParameterizedTest @MethodSource("builtInEnumLiteralReferencesSource") - void bultInEnumLiteralInPredicateTest(String qualifiedName) { + void builtInEnumLiteralInPredicateTest(String qualifiedName) { var problem = parse(""" pred predicate() <-> node({PARAM}). """, qualifiedName); @@ -237,13 +222,8 @@ class NodeScopingTest { Arguments.of("builtin::bool::true")); } - private WrappedProblem parse(String text, String parameter, boolean namedProblem) { - var problemName = namedProblem ? "problem test.\n" : ""; - return parseHelper.parse(problemName + text.replace("{PARAM}", parameter)); - } - private WrappedProblem parse(String text, String parameter) { - return parse(text, parameter, false); + return parseHelper.parse(text.replace("{PARAM}", parameter)); } private WrappedProblem parse(String text) { -- cgit v1.2.3-54-g00ecf From b9bb6816a8806fe4e918c8a2074364676737cc0c Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Sun, 18 Feb 2024 22:19:44 +0100 Subject: feat(language): import validation Validate imports and imported resources. Also fixes a linking error in imported resources by ensuring that imported resources are always fully resolved with all of their derived state. --- .../tools/refinery/generator/ProblemLoader.java | 99 +++++++++++++++++++--- .../LoadOnDemandResourceDescriptionProvider.java | 3 + .../language/scoping/imports/ImportCollector.java | 2 +- .../language/validation/ProblemValidator.java | 69 +++++++++++++-- 4 files changed, 153 insertions(+), 20 deletions(-) diff --git a/subprojects/generator/src/main/java/tools/refinery/generator/ProblemLoader.java b/subprojects/generator/src/main/java/tools/refinery/generator/ProblemLoader.java index e44dddc0..580a87b6 100644 --- a/subprojects/generator/src/main/java/tools/refinery/generator/ProblemLoader.java +++ b/subprojects/generator/src/main/java/tools/refinery/generator/ProblemLoader.java @@ -9,17 +9,24 @@ import com.google.inject.Inject; import com.google.inject.Provider; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.xtext.diagnostics.Severity; -import org.eclipse.xtext.resource.FileExtensionProvider; -import org.eclipse.xtext.resource.IResourceFactory; -import org.eclipse.xtext.resource.XtextResourceSet; +import org.eclipse.xtext.naming.IQualifiedNameConverter; +import org.eclipse.xtext.resource.*; +import org.eclipse.xtext.scoping.impl.GlobalResourceDescriptionProvider; +import org.eclipse.xtext.util.CancelIndicator; import org.eclipse.xtext.util.LazyStringInputStream; import org.eclipse.xtext.validation.CheckMode; import org.eclipse.xtext.validation.IResourceValidator; +import org.eclipse.xtext.validation.Issue; import tools.refinery.language.model.problem.Problem; import tools.refinery.language.model.problem.Relation; import tools.refinery.language.model.problem.ScopeDeclaration; +import tools.refinery.language.naming.NamingUtil; +import tools.refinery.language.resource.ProblemResourceDescriptionStrategy; +import tools.refinery.language.resource.ProblemResourceDescriptionStrategy.ShadowingKey; import tools.refinery.language.scoping.imports.ImportAdapter; +import tools.refinery.language.scoping.imports.ImportCollector; import tools.refinery.store.util.CancellationToken; import java.io.ByteArrayOutputStream; @@ -28,10 +35,8 @@ import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; import java.nio.file.Path; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.stream.Collectors; // This class is used as a fluent builder. @SuppressWarnings("UnusedReturnValue") @@ -47,6 +52,15 @@ public class ProblemLoader { @Inject private IResourceValidator resourceValidator; + @Inject + private ImportCollector importCollector; + + @Inject + private GlobalResourceDescriptionProvider globalResourceDescriptionProvider; + + @Inject + private IQualifiedNameConverter qualifiedNameConverter; + private CancellationToken cancellationToken = CancellationToken.NONE; private final List extraPaths = new ArrayList<>(); @@ -117,14 +131,30 @@ public class ProblemLoader { } public Problem loadResource(Resource resource) { - var issues = resourceValidator.validate(resource, CheckMode.ALL, () -> { + EcoreUtil.resolveAll(resource); + CancelIndicator cancelIndicator = () -> { cancellationToken.checkCancelled(); return Thread.interrupted(); - }); + }; + var shadowedNames = new LinkedHashMap>(); + var issues = new ArrayList(); + validateResource(resource, issues, cancelIndicator); cancellationToken.checkCancelled(); - var errors = issues.stream() - .filter(issue -> issue.getSeverity() == Severity.ERROR) - .toList(); + var resourceSet = resource.getResourceSet(); + if (resourceSet != null) { + var imports = importCollector.getAllImports(resource).toUriSet(); + cancellationToken.checkCancelled(); + for (var importedUri : imports) { + var importedResource = resourceSet.getResource(importedUri, false); + if (importedResource == null) { + throw new IllegalStateException("Unknown imported resource: " + importedUri); + } + findShadowedNames(importedResource, shadowedNames); + validateResource(importedResource, issues, cancelIndicator); + } + } + addNameClashIssues(issues, shadowedNames); + var errors = issues.stream().filter(issue -> issue.getSeverity() == Severity.ERROR).toList(); if (!errors.isEmpty()) { throw new ValidationErrorsException(resource.getURI(), errors); } @@ -134,8 +164,49 @@ public class ProblemLoader { return problem; } - public Problem loadScopeConstraints(Problem problem, List extraScopes, - List overrideScopes) throws IOException { + private void findShadowedNames(Resource importedResource, + LinkedHashMap> shadowedNames) { + var resourceDescription = globalResourceDescriptionProvider.getResourceDescription(importedResource); + for (var eObjectDescription : resourceDescription.getExportedObjects()) { + var name = eObjectDescription.getName(); + if (NamingUtil.isFullyQualified(name)) { + var shadowingKey = ProblemResourceDescriptionStrategy.getShadowingKey(eObjectDescription); + var entries = shadowedNames.computeIfAbsent(shadowingKey, ignored -> new LinkedHashSet<>()); + entries.add(eObjectDescription); + } + } + cancellationToken.checkCancelled(); + } + + private void validateResource(Resource importedResource, ArrayList issues, + CancelIndicator cancelIndicator) { + issues.addAll(resourceValidator.validate(importedResource, CheckMode.ALL, cancelIndicator)); + cancellationToken.checkCancelled(); + } + + private void addNameClashIssues(ArrayList issues, + LinkedHashMap> shadowedNames) { + for (var entry : shadowedNames.entrySet()) { + var eObjectDescriptions = entry.getValue(); + if (eObjectDescriptions.size() <= 1) { + continue; + } + var qualifiedName = qualifiedNameConverter.toString(NamingUtil.stripRootPrefix(entry.getKey().name())); + var uris = eObjectDescriptions.stream() + .map(eObjectDescription -> eObjectDescription.getEObjectURI().trimFragment().toString()) + .collect(Collectors.joining(", ")); + var message = "Object with qualified name %s is also defined in %s".formatted(qualifiedName, uris); + for (var eObjectDescription : eObjectDescriptions) { + var issue = new Issue.IssueImpl(); + issue.setSeverity(Severity.ERROR); + issue.setMessage(message); + issue.setUriToProblem(eObjectDescription.getEObjectURI()); + issues.add(issue); + } + } + } + + public Problem loadScopeConstraints(Problem problem, List extraScopes, List overrideScopes) throws IOException { var allScopes = new ArrayList<>(extraScopes); allScopes.addAll(overrideScopes); if (allScopes.isEmpty()) { diff --git a/subprojects/language/src/main/java/tools/refinery/language/resource/LoadOnDemandResourceDescriptionProvider.java b/subprojects/language/src/main/java/tools/refinery/language/resource/LoadOnDemandResourceDescriptionProvider.java index 373a32f2..ccadb42d 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/resource/LoadOnDemandResourceDescriptionProvider.java +++ b/subprojects/language/src/main/java/tools/refinery/language/resource/LoadOnDemandResourceDescriptionProvider.java @@ -8,6 +8,7 @@ package tools.refinery.language.resource; import com.google.inject.Inject; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.xtext.EcoreUtil2; import org.eclipse.xtext.resource.IResourceDescription; import org.eclipse.xtext.resource.IResourceDescriptions; @@ -44,6 +45,8 @@ public class LoadOnDemandResourceDescriptionProvider { if (importedResource == null) { return null; } + // Force the {@code importedResource} to have all of its derived resource state installed. + EcoreUtil.resolveAll(importedResource); return globalResourceDescriptionProvider.getResourceDescription(importedResource); } } diff --git a/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportCollector.java b/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportCollector.java index fc4ca43c..ac5a92ba 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportCollector.java +++ b/subprojects/language/src/main/java/tools/refinery/language/scoping/imports/ImportCollector.java @@ -150,7 +150,7 @@ public class ImportCollector { protected List getImports(IEObjectDescription eObjectDescription) { var importString = eObjectDescription.getUserData(ProblemResourceDescriptionStrategy.IMPORTS); - if (importString == null) { + if (importString == null || importString.isEmpty()) { return List.of(); } return Splitter.on(ProblemResourceDescriptionStrategy.IMPORTS_SEPARATOR).splitToStream(importString) diff --git a/subprojects/language/src/main/java/tools/refinery/language/validation/ProblemValidator.java b/subprojects/language/src/main/java/tools/refinery/language/validation/ProblemValidator.java index 4cbb02c2..d9eb5fd3 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/validation/ProblemValidator.java +++ b/subprojects/language/src/main/java/tools/refinery/language/validation/ProblemValidator.java @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors + * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors * * SPDX-License-Identifier: EPL-2.0 */ @@ -13,16 +13,16 @@ import com.google.inject.Inject; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; import org.eclipse.xtext.EcoreUtil2; +import org.eclipse.xtext.naming.IQualifiedNameConverter; import org.eclipse.xtext.validation.Check; import org.jetbrains.annotations.Nullable; import tools.refinery.language.model.problem.*; +import tools.refinery.language.naming.NamingUtil; +import tools.refinery.language.scoping.imports.ImportAdapter; import tools.refinery.language.utils.ProblemDesugarer; import tools.refinery.language.utils.ProblemUtil; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.Set; +import java.util.*; /** * This class contains custom validation rules. @@ -33,6 +33,10 @@ import java.util.Set; public class ProblemValidator extends AbstractProblemValidator { private static final String ISSUE_PREFIX = "tools.refinery.language.validation.ProblemValidator."; + public static final String UNEXPECTED_MODULE_NAME_ISSUE = ISSUE_PREFIX + "UNEXPECTED_MODULE_NAME"; + + public static final String INVALID_IMPORT_ISSUE = ISSUE_PREFIX + "INVALID_IMPORT"; + public static final String SINGLETON_VARIABLE_ISSUE = ISSUE_PREFIX + "SINGLETON_VARIABLE"; public static final String NODE_CONSTANT_ISSUE = ISSUE_PREFIX + "NODE_CONSTANT_ISSUE"; @@ -65,6 +69,61 @@ public class ProblemValidator extends AbstractProblemValidator { @Inject private ProblemDesugarer desugarer; + @Inject + private IQualifiedNameConverter qualifiedNameConverter; + + @Check + public void checkModuleName(Problem problem) { + var nameString = problem.getName(); + if (nameString == null) { + return; + } + var resource = problem.eResource(); + if (resource == null) { + return; + } + var resourceSet = resource.getResourceSet(); + if (resourceSet == null) { + return; + } + var adapter = ImportAdapter.getOrInstall(resourceSet); + var expectedName = adapter.getQualifiedName(resource.getURI()); + if (expectedName == null) { + return; + } + var name = NamingUtil.stripRootPrefix(qualifiedNameConverter.toQualifiedName(nameString)); + if (!expectedName.equals(name)) { + var moduleKindName = switch (problem.getKind()) { + case PROBLEM -> "problem"; + case MODULE -> "module"; + }; + var message = "Expected %s to have name '%s', got '%s' instead.".formatted( + moduleKindName, qualifiedNameConverter.toString(expectedName), + qualifiedNameConverter.toString(name)); + error(message, problem, ProblemPackage.Literals.NAMED_ELEMENT__NAME, INSIGNIFICANT_INDEX, + UNEXPECTED_MODULE_NAME_ISSUE); + } + } + + @Check + public void checkImportStatement(ImportStatement importStatement) { + var importedModule = importStatement.getImportedModule(); + if (importedModule == null || importedModule.eIsProxy()) { + return; + } + String message = null; + var problem = EcoreUtil2.getContainerOfType(importStatement, Problem.class); + if (importedModule == problem) { + message = "A module cannot import itself."; + } else if (importedModule.getKind() != ModuleKind.MODULE) { + message = "Only modules can be imported."; + } + if (message != null) { + error(message, importStatement, ProblemPackage.Literals.IMPORT_STATEMENT__IMPORTED_MODULE, + INSIGNIFICANT_INDEX, INVALID_IMPORT_ISSUE); + } + } + @Check public void checkSingletonVariable(VariableOrNodeExpr expr) { var variableOrNode = expr.getVariableOrNode(); -- cgit v1.2.3-54-g00ecf From d29b440879406f035f85ec6ba9472cf10a5af7e3 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Sun, 18 Feb 2024 23:13:00 +0100 Subject: fix(language): type hash colors Make sure type hashes can be computed with the updated scoping rules. --- .../ide/syntaxcoloring/TypeHashProvider.java | 49 +++++++++++++++++++--- 1 file changed, 43 insertions(+), 6 deletions(-) diff --git a/subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/TypeHashProvider.java b/subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/TypeHashProvider.java index f75ecdb2..dd9f1053 100644 --- a/subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/TypeHashProvider.java +++ b/subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/TypeHashProvider.java @@ -11,10 +11,13 @@ import com.google.inject.Singleton; import org.eclipse.xtext.EcoreUtil2; import org.eclipse.xtext.naming.IQualifiedNameConverter; import org.eclipse.xtext.naming.IQualifiedNameProvider; +import org.eclipse.xtext.resource.IResourceDescription; import org.eclipse.xtext.scoping.IScopeProvider; +import org.eclipse.xtext.scoping.impl.GlobalResourceDescriptionProvider; import org.eclipse.xtext.util.IResourceScopeCache; import tools.refinery.language.model.problem.*; import tools.refinery.language.resource.ProblemResourceDescriptionStrategy; +import tools.refinery.language.scoping.imports.ImportCollector; import tools.refinery.language.utils.ProblemUtil; import java.util.*; @@ -36,6 +39,12 @@ public class TypeHashProvider { @Inject private IQualifiedNameConverter qualifiedNameConverter; + @Inject + private ImportCollector importCollector; + + @Inject + private GlobalResourceDescriptionProvider globalResourceDescriptionProvider; + public String getTypeHash(Relation relation) { if (!(relation instanceof ClassDeclaration || relation instanceof EnumDeclaration) || ProblemUtil.isBuiltIn(relation)) { @@ -55,13 +64,15 @@ public class TypeHashProvider { } private Map computeHashes(Problem problem) { + var resourceDescriptions = getResourceDescriptions(problem); var qualifiedNameStrings = new TreeSet(); - var scope = scopeProvider.getScope(problem, ProblemPackage.Literals.ASSERTION__RELATION); - for (var description : scope.getAllElements()) { - if (ProblemResourceDescriptionStrategy.COLOR_RELATION_TRUE.equals( - description.getUserData(ProblemResourceDescriptionStrategy.COLOR_RELATION))) { - var qualifiedNameString = qualifiedNameConverter.toString(description.getQualifiedName()); - qualifiedNameStrings.add(qualifiedNameString); + for (var resourceDescription : resourceDescriptions) { + for (var description : resourceDescription.getExportedObjectsByType(ProblemPackage.Literals.RELATION)) { + if (ProblemResourceDescriptionStrategy.COLOR_RELATION_TRUE.equals( + description.getUserData(ProblemResourceDescriptionStrategy.COLOR_RELATION))) { + var qualifiedNameString = qualifiedNameConverter.toString(description.getQualifiedName()); + qualifiedNameStrings.add(qualifiedNameString); + } } } var stringList = new ArrayList<>(qualifiedNameStrings); @@ -90,4 +101,30 @@ public class TypeHashProvider { } return mapBuilder.build(); } + + private List getResourceDescriptions(Problem problem) { + var resource = problem.eResource(); + if (resource == null) { + return List.of(); + } + var resourceDescriptions = new ArrayList(); + var resourceDescription = globalResourceDescriptionProvider.getResourceDescription(resource); + if (resourceDescription != null) { + resourceDescriptions.add(resourceDescription); + } + var resourceSet = resource.getResourceSet(); + if (resourceSet != null) { + for (var importedUri : importCollector.getAllImports(resource).toUriSet()) { + var importedResource = resourceSet.getResource(importedUri, false); + if (importedResource != null) { + var importedResourceDescription = globalResourceDescriptionProvider.getResourceDescription( + importedResource); + if (importedResourceDescription != null) { + resourceDescriptions.add(importedResourceDescription); + } + } + } + } + return resourceDescriptions; + } } -- cgit v1.2.3-54-g00ecf From fc3c4dabc1a9b3575c9525c362417334da90b6d6 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Sun, 18 Feb 2024 23:52:32 +0100 Subject: fix(frontend): module name highlighting --- subprojects/frontend/src/language/problem.grammar | 6 ++++-- subprojects/frontend/src/language/problemLanguageSupport.ts | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/subprojects/frontend/src/language/problem.grammar b/subprojects/frontend/src/language/problem.grammar index e39ce102..b69ee73f 100644 --- a/subprojects/frontend/src/language/problem.grammar +++ b/subprojects/frontend/src/language/problem.grammar @@ -23,7 +23,7 @@ statement { ImportStatement { - kw<"import"> QualifiedName (kw<"as"> identifier)? "." + kw<"import"> ModuleName (kw<"as"> ModuleName)? "." } | Assertion { kw<"default">? (NotOp | UnknownOp)? RelationName @@ -31,7 +31,7 @@ statement { (":" Expr)? "." } | ProblemDeclaration { - (ckw<"module"> | kw<"problem">) QualifiedName "." + (ckw<"module"> | kw<"problem">) ModuleName "." } | ClassDefinition { kw<"abstract">? kw<"class"> RelationName @@ -173,6 +173,8 @@ VariableName[@dynamicPrecedence=10] { QualifiedName ~name } NodeName { QualifiedName } +ModuleName { QualifiedName } + QualifiedName[implicitCompletion=true] { "::"? identifier (QualifiedNameSeparator "::" identifier)* } kw { @specialize[@name={term},implicitCompletion=true] } diff --git a/subprojects/frontend/src/language/problemLanguageSupport.ts b/subprojects/frontend/src/language/problemLanguageSupport.ts index aebccfa4..14826363 100644 --- a/subprojects/frontend/src/language/problemLanguageSupport.ts +++ b/subprojects/frontend/src/language/problemLanguageSupport.ts @@ -47,6 +47,7 @@ const parserWithMetadata = parser.configure({ // 'RuleName/QualifiedName': t.typeName, 'AtomNodeName/QualifiedName': t.atom, 'VariableName/QualifiedName': t.variableName, + 'ModuleName/QualifiedName': t.typeName, '{ }': t.brace, '( )': t.paren, '[ ]': t.squareBracket, -- cgit v1.2.3-54-g00ecf From 50138f47e078a89901e4e623239e55d60167abed Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Sun, 18 Feb 2024 23:59:01 +0100 Subject: refactor(language): classpath based library context --- .../refinery/language/library/BuiltinLibrary.java | 7 ++++++- .../language/library/ClasspathBasedLibrary.java | 22 ++++++++-------------- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/subprojects/language/src/main/java/tools/refinery/language/library/BuiltinLibrary.java b/subprojects/language/src/main/java/tools/refinery/language/library/BuiltinLibrary.java index d88d0299..ce80504e 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/library/BuiltinLibrary.java +++ b/subprojects/language/src/main/java/tools/refinery/language/library/BuiltinLibrary.java @@ -17,6 +17,11 @@ public class BuiltinLibrary extends ClasspathBasedLibrary { () -> new IllegalStateException("Builtin library was not found")); public BuiltinLibrary() { - super(BUILTIN_LIBRARY_NAME, List.of(BUILTIN_LIBRARY_NAME)); + super(BUILTIN_LIBRARY_NAME); + } + + @Override + public List getAutomaticImports() { + return List.of(BUILTIN_LIBRARY_NAME); } } diff --git a/subprojects/language/src/main/java/tools/refinery/language/library/ClasspathBasedLibrary.java b/subprojects/language/src/main/java/tools/refinery/language/library/ClasspathBasedLibrary.java index 3a9bb920..56bb8b96 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/library/ClasspathBasedLibrary.java +++ b/subprojects/language/src/main/java/tools/refinery/language/library/ClasspathBasedLibrary.java @@ -12,16 +12,15 @@ import java.nio.file.Path; import java.util.*; public abstract class ClasspathBasedLibrary implements RefineryLibrary { + private final Class context; private final QualifiedName prefix; - private final List automaticImports; private final URI rootUri; - protected ClasspathBasedLibrary(QualifiedName prefix, List automaticImports) { - this.prefix = prefix; - this.automaticImports = List.copyOf(automaticImports); - var context = this.getClass(); - var contextPath = context.getCanonicalName().replace('.', '/') + ".class"; - var contextResource = context.getClassLoader().getResource(contextPath); + protected ClasspathBasedLibrary(Class context, QualifiedName prefix) { + this.context = context == null ? getClass() : context; + this.prefix = prefix; + var contextPath = this.context.getCanonicalName().replace('.', '/') + ".class"; + var contextResource = this.context.getClassLoader().getResource(contextPath); if (contextResource == null) { throw new IllegalStateException("Failed to find library context"); } @@ -32,18 +31,13 @@ public abstract class ClasspathBasedLibrary implements RefineryLibrary { } protected ClasspathBasedLibrary(QualifiedName prefix) { - this(prefix, List.of()); - } - - @Override - public List getAutomaticImports() { - return automaticImports; + this(null, prefix); } @Override public Optional resolveQualifiedName(QualifiedName qualifiedName, List libraryPaths) { if (qualifiedName.startsWith(prefix)) { - return getLibraryUri(this.getClass(), qualifiedName); + return getLibraryUri(context, qualifiedName); } return Optional.empty(); } -- cgit v1.2.3-54-g00ecf From 1883ea8736022396024ca8cfd4b97764f5d04ac2 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Mon, 19 Feb 2024 00:30:25 +0100 Subject: chore(deps): bump dependencies --- .../patches/d3-graphviz-npm-5.2.0-161b1fbad4.patch | 95 - .../d3-graphviz-npm-5.2.0-161b1fbad4.patch.license | 14 - .../patches/d3-graphviz-npm-5.3.0-e0eace978a.patch | 95 + .../d3-graphviz-npm-5.3.0-e0eace978a.patch.license | 14 + .yarn/releases/yarn-4.0.2.cjs | Bin 2733890 -> 0 bytes .yarn/releases/yarn-4.1.0.cjs | Bin 0 -> 2735994 bytes .yarnrc.yml | 4 +- gradle.properties | 4 +- gradle/libs.versions.toml | 10 +- gradle/wrapper/gradle-wrapper.jar | Bin 63721 -> 43462 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- package.json | 2 +- subprojects/frontend/package.json | 42 +- yarn.lock | 2062 ++++++++++---------- 14 files changed, 1174 insertions(+), 1170 deletions(-) delete mode 100644 .yarn/patches/d3-graphviz-npm-5.2.0-161b1fbad4.patch delete mode 100644 .yarn/patches/d3-graphviz-npm-5.2.0-161b1fbad4.patch.license create mode 100644 .yarn/patches/d3-graphviz-npm-5.3.0-e0eace978a.patch create mode 100644 .yarn/patches/d3-graphviz-npm-5.3.0-e0eace978a.patch.license delete mode 100755 .yarn/releases/yarn-4.0.2.cjs create mode 100755 .yarn/releases/yarn-4.1.0.cjs diff --git a/.yarn/patches/d3-graphviz-npm-5.2.0-161b1fbad4.patch b/.yarn/patches/d3-graphviz-npm-5.2.0-161b1fbad4.patch deleted file mode 100644 index 0a4110c5..00000000 --- a/.yarn/patches/d3-graphviz-npm-5.2.0-161b1fbad4.patch +++ /dev/null @@ -1,95 +0,0 @@ -diff --git a/src/dot.js b/src/dot.js -index 96ae02b6edd947ac9086f3108986c08d91470cba..c4422b08d73f7fe73dc52ad905cf981d1f3cbcc5 100644 ---- a/src/dot.js -+++ b/src/dot.js -@@ -1,4 +1,3 @@ --import { Graphviz } from "@hpcc-js/wasm/graphviz"; - import * as d3 from "d3-selection"; - import {extractAllElementsData, extractElementData, createElementWithAttributes} from "./element.js"; - import {convertToPathData} from "./svg.js"; -@@ -8,31 +7,6 @@ import {getEdgeTitle} from "./data.js"; - - - export function initViz() { -- -- // force JIT compilation of @hpcc-js/wasm -- try { -- Graphviz.load().then(graphviz => { -- graphviz.layout("", "svg", "dot"); -- this.layoutSync = graphviz.layout.bind(graphviz); -- if (this._worker == null) { -- this._dispatch.call("initEnd", this); -- } -- if (this._afterInit) { -- this._afterInit(); -- } -- }); --// after the port to ESM modules, we don't know how to trigger this so --// we just disable it from coverage --/* c8 ignore start */ -- } catch(error) { -- // we end up here when the the script tag type used to load -- // the "@hpcc-js/wasm" script is not "application/javascript" -- // or "text/javascript", but typically "javascript/worker". In -- // this case the browser does not load the script since it's -- // unnecessary because it's loaded by the web worker -- // instead. This is expected so we just ignore the error. -- } --/* c8 ignore stop */ - if (this._worker != null) { - var vizURL = this._vizURL; - var graphvizInstance = this; -@@ -337,7 +311,8 @@ function layoutDone(svgDoc, callback) { - - var newSvg = newDoc - .select('svg'); -- -+ -+ this._dispatch.call('postProcessSVG', this, newSvg); - var data = extractAllElementsData(newSvg); - this._dispatch.call('dataExtractEnd', this); - postProcessDataPass1Local(data); -diff --git a/src/element.js b/src/element.js -index 5aa398a6cf2550e15f642aea4eaa5a1c69af69ad..5d799e38566e8f847aa1ba80f4c575911e9851cf 100644 ---- a/src/element.js -+++ b/src/element.js -@@ -108,6 +108,8 @@ export function createElement(data) { - return document.createTextNode(""); - } else if (data.tag == '#comment') { - return document.createComment(data.comment); -+ } else if (data.tag == 'div' || data.tag == 'DIV') { -+ return document.createElement('div'); - } else { - return document.createElementNS('http://www.w3.org/2000/svg', data.tag); - } -diff --git a/src/graphviz.js b/src/graphviz.js -index c4638cb0e4042844c59c52dfe4749e13999fef6e..28dcfb71ad787c78645c460a29e9c52295c5f6bf 100644 ---- a/src/graphviz.js -+++ b/src/graphviz.js -@@ -49,7 +49,6 @@ import {drawnNodeSelection} from "./drawNode.js"; - import {workerCode} from "./workerCode.js"; - import {sharedWorkerCode} from "./workerCode.js"; - import {workerCodeBody} from "./workerCode.js"; --import {Graphviz as hpccWasmGraphviz} from "@hpcc-js/wasm/graphviz"; - - export function Graphviz(selection, options) { - this._options = { -@@ -119,10 +118,6 @@ export function Graphviz(selection, options) { - this._workerPort = this._worker; - this._workerPortClose = this._worker.terminate.bind(this._worker); - this._workerCallbacks = []; -- } else { -- hpccWasmGraphviz.load().then(((graphviz) => { -- this._graphvizVersion = graphviz.version(); -- }).bind(this)); - } - this._selection = selection; - this._active = false; -@@ -143,6 +138,7 @@ export function Graphviz(selection, options) { - 'start', - 'layoutStart', - 'layoutEnd', -+ 'postProcessSVG', - 'dataExtractEnd', - 'dataProcessPass1End', - 'dataProcessPass2End', diff --git a/.yarn/patches/d3-graphviz-npm-5.2.0-161b1fbad4.patch.license b/.yarn/patches/d3-graphviz-npm-5.2.0-161b1fbad4.patch.license deleted file mode 100644 index 0c7bddfb..00000000 --- a/.yarn/patches/d3-graphviz-npm-5.2.0-161b1fbad4.patch.license +++ /dev/null @@ -1,14 +0,0 @@ -Copyright 2017, Magnus Jacobsson -Copyright 2023, The Refinery Authors - -SPDX-License-Identifier: BSD-3-Clause - -This file Incorporates patches from the Refinery authors. - -However, but redistribution and use is only permitted if neither -the name of the copyright holder Magnus Jacobsson nor the names of other -contributors to the d3-graphviz project are used to endorse or promote -products derived from this software as per the 3rd clause of the -3-clause BSD license. - -See LICENSES/BSD-3-Clause.txt for more details. diff --git a/.yarn/patches/d3-graphviz-npm-5.3.0-e0eace978a.patch b/.yarn/patches/d3-graphviz-npm-5.3.0-e0eace978a.patch new file mode 100644 index 00000000..17df8108 --- /dev/null +++ b/.yarn/patches/d3-graphviz-npm-5.3.0-e0eace978a.patch @@ -0,0 +1,95 @@ +diff --git a/src/dot.js b/src/dot.js +index 97a0a7dbd3892742fa2b9e6badd4214b06579c13..bac59df04900de140ddd024b5dfac4bc1ad9c572 100644 +--- a/src/dot.js ++++ b/src/dot.js +@@ -1,4 +1,3 @@ +-import { Graphviz } from "@hpcc-js/wasm/graphviz"; + import * as d3 from "d3-selection"; + import {extractAllElementsData, extractElementData, createElementWithAttributes} from "./element.js"; + import {convertToPathData} from "./svg.js"; +@@ -8,31 +7,6 @@ import {getEdgeTitle} from "./data.js"; + + + export function initViz() { +- +- // force JIT compilation of @hpcc-js/wasm +- try { +- Graphviz.load().then(graphviz => { +- graphviz.layout("", "svg", "dot"); +- this.layoutSync = graphviz.layout.bind(graphviz); +- if (this._worker == null) { +- this._dispatch.call("initEnd", this); +- } +- if (this._afterInit) { +- this._afterInit(); +- } +- }); +-// after the port to ESM modules, we don't know how to trigger this so +-// we just disable it from coverage +-/* c8 ignore start */ +- } catch(error) { +- // we end up here when the the script tag type used to load +- // the "@hpcc-js/wasm" script is not "application/javascript" +- // or "text/javascript", but typically "javascript/worker". In +- // this case the browser does not load the script since it's +- // unnecessary because it's loaded by the web worker +- // instead. This is expected so we just ignore the error. +- } +-/* c8 ignore stop */ + if (this._worker != null) { + var vizURL = this._vizURL; + var graphvizInstance = this; +@@ -337,7 +311,8 @@ function layoutDone(svgDoc, callback) { + + var newSvg = newDoc + .select('svg'); +- ++ ++ this._dispatch.call('postProcessSVG', this, newSvg); + var data = extractAllElementsData(newSvg); + this._dispatch.call('dataExtractEnd', this); + postProcessDataPass1Local(data); +diff --git a/src/element.js b/src/element.js +index 5aa398a6cf2550e15f642aea4eaa5a1c69af69ad..5d799e38566e8f847aa1ba80f4c575911e9851cf 100644 +--- a/src/element.js ++++ b/src/element.js +@@ -108,6 +108,8 @@ export function createElement(data) { + return document.createTextNode(""); + } else if (data.tag == '#comment') { + return document.createComment(data.comment); ++ } else if (data.tag == 'div' || data.tag == 'DIV') { ++ return document.createElement('div'); + } else { + return document.createElementNS('http://www.w3.org/2000/svg', data.tag); + } +diff --git a/src/graphviz.js b/src/graphviz.js +index c4638cb0e4042844c59c52dfe4749e13999fef6e..28dcfb71ad787c78645c460a29e9c52295c5f6bf 100644 +--- a/src/graphviz.js ++++ b/src/graphviz.js +@@ -49,7 +49,6 @@ import {drawnNodeSelection} from "./drawNode.js"; + import {workerCode} from "./workerCode.js"; + import {sharedWorkerCode} from "./workerCode.js"; + import {workerCodeBody} from "./workerCode.js"; +-import {Graphviz as hpccWasmGraphviz} from "@hpcc-js/wasm/graphviz"; + + export function Graphviz(selection, options) { + this._options = { +@@ -119,10 +118,6 @@ export function Graphviz(selection, options) { + this._workerPort = this._worker; + this._workerPortClose = this._worker.terminate.bind(this._worker); + this._workerCallbacks = []; +- } else { +- hpccWasmGraphviz.load().then(((graphviz) => { +- this._graphvizVersion = graphviz.version(); +- }).bind(this)); + } + this._selection = selection; + this._active = false; +@@ -143,6 +138,7 @@ export function Graphviz(selection, options) { + 'start', + 'layoutStart', + 'layoutEnd', ++ 'postProcessSVG', + 'dataExtractEnd', + 'dataProcessPass1End', + 'dataProcessPass2End', diff --git a/.yarn/patches/d3-graphviz-npm-5.3.0-e0eace978a.patch.license b/.yarn/patches/d3-graphviz-npm-5.3.0-e0eace978a.patch.license new file mode 100644 index 00000000..b688e137 --- /dev/null +++ b/.yarn/patches/d3-graphviz-npm-5.3.0-e0eace978a.patch.license @@ -0,0 +1,14 @@ +Copyright 2017, Magnus Jacobsson +Copyright 2023-2024, The Refinery Authors + +SPDX-License-Identifier: BSD-3-Clause + +This file Incorporates patches from the Refinery authors. + +However, but redistribution and use is only permitted if neither +the name of the copyright holder Magnus Jacobsson nor the names of other +contributors to the d3-graphviz project are used to endorse or promote +products derived from this software as per the 3rd clause of the +3-clause BSD license. + +See LICENSES/BSD-3-Clause.txt for more details. diff --git a/.yarn/releases/yarn-4.0.2.cjs b/.yarn/releases/yarn-4.0.2.cjs deleted file mode 100755 index f12c120e..00000000 Binary files a/.yarn/releases/yarn-4.0.2.cjs and /dev/null differ diff --git a/.yarn/releases/yarn-4.1.0.cjs b/.yarn/releases/yarn-4.1.0.cjs new file mode 100755 index 00000000..738adce5 Binary files /dev/null and b/.yarn/releases/yarn-4.1.0.cjs differ diff --git a/.yarnrc.yml b/.yarnrc.yml index 736a9c7c..21169436 100644 --- a/.yarnrc.yml +++ b/.yarnrc.yml @@ -4,7 +4,7 @@ enableTelemetry: false logFilters: - level: discard - text: "prettier is listed by your project with version 3.2.4, which doesn't satisfy what @xstate/cli (p3ca24) and other dependencies request (^2.0.0)." + text: "prettier is listed by your project with version 3.2.5, which doesn't satisfy what @xstate/cli (p68591) and other dependencies request (^2.0.0)." nodeLinker: pnp @@ -19,4 +19,4 @@ packageExtensions: peerDependencies: csstype: "*" -yarnPath: .yarn/releases/yarn-4.0.2.cjs +yarnPath: .yarn/releases/yarn-4.1.0.cjs diff --git a/gradle.properties b/gradle.properties index e1d1eedf..7a23c955 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,8 +3,8 @@ # SPDX-License-Identifier: EPL-2.0 file.encoding=UTF-8 -frontend.nodeVersion=20.11.0 -frontend.yarnVersion=4.0.2 +frontend.nodeVersion=20.11.1 +frontend.yarnVersion=4.1.0 frontend.yarn1Version=1.22.21 group=tools.refinery # Set to true once tools.refinery.gradle.frontend-worktree supports the cache. diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e22a3889..df12d2f1 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,12 +4,12 @@ [versions] eclipseCollections = "12.0.0.M3" -jetty = "12.0.5" +jetty = "12.0.6" jmh = "1.37" -junit = "5.10.1" +junit = "5.10.2" mockito = "5.10.0" -mwe2 = "2.17.0.M0" -slf4j = "2.0.11" +mwe2 = "2.17.0.M3" +slf4j = "2.0.12" xtext = "2.34.0.M1" [libraries] @@ -37,7 +37,7 @@ junit-engine = { group = "org.junit.jupiter", name = "junit-jupiter-engine", ver junit-params = { group = "org.junit.jupiter", name = "junit-jupiter-params", version.ref = "junit" } mockito-core = { group = "org.mockito", name = "mockito-core", version.ref = "mockito" } mockito-junit = { group = "org.mockito", name = "mockito-junit-jupiter", version.ref = "mockito" } -mwe-utils = { group = "org.eclipse.emf", name = "org.eclipse.emf.mwe.utils", version = "1.11.0.M0" } +mwe-utils = { group = "org.eclipse.emf", name = "org.eclipse.emf.mwe.utils", version = "1.11.0.M3" } mwe2-launch = { group = "org.eclipse.emf", name = "org.eclipse.emf.mwe2.launch", version.ref = "mwe2" } mwe2-lib = { group = "org.eclipse.emf", name = "org.eclipse.emf.mwe2.lib", version.ref = "mwe2" } ortools = { group = "com.google.ortools", name = "ortools-java", version = "9.8.3296" } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 7f93135c..d64cd491 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 1af9e093..a80b22ce 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/package.json b/package.json index a61c71d4..7822bcc1 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "scripts": { "frontend": "yarn workspace @refinery/frontend" }, - "packageManager": "yarn@4.0.2", + "packageManager": "yarn@4.1.0", "devDependencies": { "eslint": "^8.56.0", "typescript": "5.3.3" diff --git a/subprojects/frontend/package.json b/subprojects/frontend/package.json index 0cd99d74..7d5e19d1 100644 --- a/subprojects/frontend/package.json +++ b/subprojects/frontend/package.json @@ -30,28 +30,28 @@ "dependencies": { "@codemirror/autocomplete": "^6.12.0", "@codemirror/commands": "^6.3.3", - "@codemirror/language": "^6.10.0", - "@codemirror/lint": "^6.4.2", - "@codemirror/search": "^6.5.5", + "@codemirror/language": "^6.10.1", + "@codemirror/lint": "^6.5.0", + "@codemirror/search": "^6.5.6", "@codemirror/state": "^6.4.0", - "@codemirror/view": "^6.23.1", + "@codemirror/view": "^6.24.0", "@emotion/react": "^11.11.3", "@emotion/styled": "^11.11.0", "@fontsource-variable/jetbrains-mono": "^5.0.19", - "@fontsource-variable/open-sans": "^5.0.23", - "@hpcc-js/wasm": "^2.15.3", + "@fontsource-variable/open-sans": "^5.0.25", + "@hpcc-js/wasm": "^2.16.0", "@lezer/common": "^1.2.1", "@lezer/highlight": "^1.2.0", "@lezer/lr": "^1.4.0", "@material-icons/svg": "^1.0.33", - "@mui/icons-material": "^5.15.6", - "@mui/material": "^5.15.6", - "@mui/system": "^5.15.6", - "@mui/x-data-grid": "^6.19.2", + "@mui/icons-material": "^5.15.10", + "@mui/material": "^5.15.10", + "@mui/system": "^5.15.9", + "@mui/x-data-grid": "^6.19.4", "ansi-styles": "^6.2.1", "csstype": "^3.1.3", "d3": "^7.8.5", - "d3-graphviz": "patch:d3-graphviz@npm%3A5.2.0#~/.yarn/patches/d3-graphviz-npm-5.2.0-161b1fbad4.patch", + "d3-graphviz": "patch:d3-graphviz@npm%3A5.3.0#~/.yarn/patches/d3-graphviz-npm-5.3.0-e0eace978a.patch", "d3-selection": "^3.0.0", "d3-zoom": "patch:d3-zoom@npm%3A3.0.0#~/.yarn/patches/d3-zoom-npm-3.0.0-18f706a421.patch", "escape-string-regexp": "^5.0.0", @@ -61,7 +61,7 @@ "mobx": "^6.12.0", "mobx-react-lite": "^4.0.5", "ms": "^2.1.3", - "nanoid": "^5.0.4", + "nanoid": "^5.0.5", "notistack": "^3.0.1", "react": "^18.2.0", "react-dom": "^18.2.0", @@ -80,13 +80,13 @@ "@types/lodash-es": "^4.17.12", "@types/micromatch": "^4.0.6", "@types/ms": "^0.7.34", - "@types/node": "^20.11.10", + "@types/node": "^20.11.19", "@types/pnpapi": "^0.0.5", - "@types/react": "^18.2.48", - "@types/react-dom": "^18.2.18", - "@typescript-eslint/eslint-plugin": "^6.20.0", - "@typescript-eslint/parser": "^6.20.0", - "@vitejs/plugin-react-swc": "^3.5.0", + "@types/react": "^18.2.56", + "@types/react-dom": "^18.2.19", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", + "@vitejs/plugin-react-swc": "^3.6.0", "@xstate/cli": "^0.5.17", "cross-env": "^7.0.3", "eslint": "^8.56.0", @@ -103,10 +103,10 @@ "html-minifier-terser": "^7.2.0", "micromatch": "^4.0.5", "pnpapi": "^0.0.0", - "prettier": "^3.2.4", + "prettier": "^3.2.5", "typescript": "5.3.3", - "vite": "^5.0.12", - "vite-plugin-pwa": "^0.17.5", + "vite": "^5.1.3", + "vite-plugin-pwa": "^0.19.0", "workbox-window": "^7.0.0" } } diff --git a/yarn.lock b/yarn.lock index bb841af1..c55f95d4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8,7 +8,7 @@ __metadata: "@aashutoshrathi/word-wrap@npm:^1.2.3": version: 1.2.6 resolution: "@aashutoshrathi/word-wrap@npm:1.2.6" - checksum: 53c2b231a61a46792b39a0d43bc4f4f776bb4542aa57ee04930676802e5501282c2fc8aac14e4cd1f1120ff8b52616b6ff5ab539ad30aa2277d726444b71619f + checksum: 10c0/53c2b231a61a46792b39a0d43bc4f4f776bb4542aa57ee04930676802e5501282c2fc8aac14e4cd1f1120ff8b52616b6ff5ab539ad30aa2277d726444b71619f languageName: node linkType: hard @@ -18,7 +18,7 @@ __metadata: dependencies: "@jridgewell/gen-mapping": "npm:^0.3.0" "@jridgewell/trace-mapping": "npm:^0.3.9" - checksum: 92ce5915f8901d8c7cd4f4e6e2fe7b9fd335a29955b400caa52e0e5b12ca3796ada7c2f10e78c9c5b0f9c2539dff0ffea7b19850a56e1487aa083531e1e46d43 + checksum: 10c0/92ce5915f8901d8c7cd4f4e6e2fe7b9fd335a29955b400caa52e0e5b12ca3796ada7c2f10e78c9c5b0f9c2539dff0ffea7b19850a56e1487aa083531e1e46d43 languageName: node linkType: hard @@ -31,7 +31,7 @@ __metadata: leven: "npm:^3.1.0" peerDependencies: ajv: ">=8" - checksum: f89a1e16ecbc2ada91c56d4391c8345471e385f0b9c38d62c3bccac40ec94482cdfa496d4c2fe0af411e9851a9931c0d5042a8040f52213f603ba6b6fd7f949b + checksum: 10c0/f89a1e16ecbc2ada91c56d4391c8345471e385f0b9c38d62c3bccac40ec94482cdfa496d4c2fe0af411e9851a9931c0d5042a8040f52213f603ba6b6fd7f949b languageName: node linkType: hard @@ -41,14 +41,14 @@ __metadata: dependencies: "@babel/highlight": "npm:^7.22.13" chalk: "npm:^2.4.2" - checksum: f4cc8ae1000265677daf4845083b72f88d00d311adb1a93c94eb4b07bf0ed6828a81ae4ac43ee7d476775000b93a28a9cddec18fbdc5796212d8dcccd5de72bd + checksum: 10c0/f4cc8ae1000265677daf4845083b72f88d00d311adb1a93c94eb4b07bf0ed6828a81ae4ac43ee7d476775000b93a28a9cddec18fbdc5796212d8dcccd5de72bd languageName: node linkType: hard "@babel/compat-data@npm:^7.17.7, @babel/compat-data@npm:^7.18.8, @babel/compat-data@npm:^7.22.5": version: 7.22.5 resolution: "@babel/compat-data@npm:7.22.5" - checksum: 97f3c24a71b4e7d5f91c5807f6206a9cdb4123e595c51b34a19e9ea22b837003f969f732fde8819928d66e7b64047fd736c6717c8a1b96bf27fbfc30f6834aff + checksum: 10c0/97f3c24a71b4e7d5f91c5807f6206a9cdb4123e595c51b34a19e9ea22b837003f969f732fde8819928d66e7b64047fd736c6717c8a1b96bf27fbfc30f6834aff languageName: node linkType: hard @@ -71,7 +71,7 @@ __metadata: gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.2" semver: "npm:^6.3.0" - checksum: c00e1474a41c18b669511dd1a1bd757d854cc8128218421a73c3b1c76b44fb22a57bbbd29a73b7a156cb1460af7a94602f81bed76b8d78c6ffae4de954b32a50 + checksum: 10c0/c00e1474a41c18b669511dd1a1bd757d854cc8128218421a73c3b1c76b44fb22a57bbbd29a73b7a156cb1460af7a94602f81bed76b8d78c6ffae4de954b32a50 languageName: node linkType: hard @@ -83,7 +83,7 @@ __metadata: "@jridgewell/gen-mapping": "npm:^0.3.2" "@jridgewell/trace-mapping": "npm:^0.3.17" jsesc: "npm:^2.5.1" - checksum: b7d8727c574119b5ef06e5d5d0d8d939527d51537db4b08273caebb18f3f2b1d4517b874776085e161fd47d28f26b22c08e7f270b64f43b2afd4a60c5936d6cd + checksum: 10c0/b7d8727c574119b5ef06e5d5d0d8d939527d51537db4b08273caebb18f3f2b1d4517b874776085e161fd47d28f26b22c08e7f270b64f43b2afd4a60c5936d6cd languageName: node linkType: hard @@ -92,7 +92,7 @@ __metadata: resolution: "@babel/helper-annotate-as-pure@npm:7.18.6" dependencies: "@babel/types": "npm:^7.18.6" - checksum: e413cd022e1e21232c1ce98f3e1198ec5f4774c7eceb81155a45f9cb6d8481f3983c52f83252309856668e728c751f0340d29854b604530a694899208df6bcc3 + checksum: 10c0/e413cd022e1e21232c1ce98f3e1198ec5f4774c7eceb81155a45f9cb6d8481f3983c52f83252309856668e728c751f0340d29854b604530a694899208df6bcc3 languageName: node linkType: hard @@ -102,7 +102,7 @@ __metadata: dependencies: "@babel/helper-explode-assignable-expression": "npm:^7.18.6" "@babel/types": "npm:^7.18.9" - checksum: 8571b3cebdd3b80349aaa04e0c1595d8fc283aea7f3d7153dfba0d5fcb090e53f3fe98ca4c19ffa185e642a14ea2b97f11eccefc9be9185acca8916e68612c3f + checksum: 10c0/8571b3cebdd3b80349aaa04e0c1595d8fc283aea7f3d7153dfba0d5fcb090e53f3fe98ca4c19ffa185e642a14ea2b97f11eccefc9be9185acca8916e68612c3f languageName: node linkType: hard @@ -117,7 +117,7 @@ __metadata: semver: "npm:^6.3.0" peerDependencies: "@babel/core": ^7.0.0 - checksum: f36a2f27d970fa61b32090840ec847f73c6ada50becf7222c8778dd7ae07661c56f83d57e4c18437160e221512f91c442e3b86703741b45fc1277a548a6fd819 + checksum: 10c0/f36a2f27d970fa61b32090840ec847f73c6ada50becf7222c8778dd7ae07661c56f83d57e4c18437160e221512f91c442e3b86703741b45fc1277a548a6fd819 languageName: node linkType: hard @@ -134,7 +134,7 @@ __metadata: "@babel/helper-split-export-declaration": "npm:^7.18.6" peerDependencies: "@babel/core": ^7.0.0 - checksum: a5a10eaa776963c1a93a986f6f6f97d6c522f1c1bb168afae5f35ca1e569f29ecd4b81d70c3d0c41cccae22b5bf8c52a79210537892b9ce6981ddc2b1f835920 + checksum: 10c0/a5a10eaa776963c1a93a986f6f6f97d6c522f1c1bb168afae5f35ca1e569f29ecd4b81d70c3d0c41cccae22b5bf8c52a79210537892b9ce6981ddc2b1f835920 languageName: node linkType: hard @@ -146,7 +146,7 @@ __metadata: regexpu-core: "npm:^5.1.0" peerDependencies: "@babel/core": ^7.0.0 - checksum: 5151ae268376d9cd9a5fd97263dc2cf21f2c5043076331c9d0b4e4d7bbf8ae83ed1b0d366c5ddcb17c06329f9ed38e10e75b1dbc2dc040bbfab7d5604eada886 + checksum: 10c0/5151ae268376d9cd9a5fd97263dc2cf21f2c5043076331c9d0b4e4d7bbf8ae83ed1b0d366c5ddcb17c06329f9ed38e10e75b1dbc2dc040bbfab7d5604eada886 languageName: node linkType: hard @@ -162,14 +162,14 @@ __metadata: semver: "npm:^6.1.2" peerDependencies: "@babel/core": ^7.4.0-0 - checksum: c3668f9ee2b76bfc08398756c504a8823e18bad05d0c2ee039b821c839e2b70f3b6ad8b7a3d3a6be434d981ed2af845a490aafecc50eaefb9b5099f2da156527 + checksum: 10c0/c3668f9ee2b76bfc08398756c504a8823e18bad05d0c2ee039b821c839e2b70f3b6ad8b7a3d3a6be434d981ed2af845a490aafecc50eaefb9b5099f2da156527 languageName: node linkType: hard "@babel/helper-environment-visitor@npm:^7.18.9, @babel/helper-environment-visitor@npm:^7.22.20, @babel/helper-environment-visitor@npm:^7.22.5": version: 7.22.20 resolution: "@babel/helper-environment-visitor@npm:7.22.20" - checksum: e762c2d8f5d423af89bd7ae9abe35bd4836d2eb401af868a63bbb63220c513c783e25ef001019418560b3fdc6d9a6fb67e6c0b650bcdeb3a2ac44b5c3d2bdd94 + checksum: 10c0/e762c2d8f5d423af89bd7ae9abe35bd4836d2eb401af868a63bbb63220c513c783e25ef001019418560b3fdc6d9a6fb67e6c0b650bcdeb3a2ac44b5c3d2bdd94 languageName: node linkType: hard @@ -178,7 +178,7 @@ __metadata: resolution: "@babel/helper-explode-assignable-expression@npm:7.18.6" dependencies: "@babel/types": "npm:^7.18.6" - checksum: 6e2fc5841fd849c840634e55b3a3f373167179bddb3d1c5fa2d7f63c3959425b8f87cd5c5ce5dcbb96e877a5033687840431b84a8e922c323f8e6aac9645db0b + checksum: 10c0/6e2fc5841fd849c840634e55b3a3f373167179bddb3d1c5fa2d7f63c3959425b8f87cd5c5ce5dcbb96e877a5033687840431b84a8e922c323f8e6aac9645db0b languageName: node linkType: hard @@ -188,7 +188,7 @@ __metadata: dependencies: "@babel/template": "npm:^7.22.15" "@babel/types": "npm:^7.23.0" - checksum: d771dd1f3222b120518176733c52b7cadac1c256ff49b1889dbbe5e3fed81db855b8cc4e40d949c9d3eae0e795e8229c1c8c24c0e83f27cfa6ee3766696c6428 + checksum: 10c0/d771dd1f3222b120518176733c52b7cadac1c256ff49b1889dbbe5e3fed81db855b8cc4e40d949c9d3eae0e795e8229c1c8c24c0e83f27cfa6ee3766696c6428 languageName: node linkType: hard @@ -197,7 +197,7 @@ __metadata: resolution: "@babel/helper-hoist-variables@npm:7.22.5" dependencies: "@babel/types": "npm:^7.22.5" - checksum: 60a3077f756a1cd9f14eb89f0037f487d81ede2b7cfe652ea6869cd4ec4c782b0fb1de01b8494b9a2d2050e3d154d7d5ad3be24806790acfb8cbe2073bf1e208 + checksum: 10c0/60a3077f756a1cd9f14eb89f0037f487d81ede2b7cfe652ea6869cd4ec4c782b0fb1de01b8494b9a2d2050e3d154d7d5ad3be24806790acfb8cbe2073bf1e208 languageName: node linkType: hard @@ -206,7 +206,7 @@ __metadata: resolution: "@babel/helper-member-expression-to-functions@npm:7.18.9" dependencies: "@babel/types": "npm:^7.18.9" - checksum: a657703ef57b8932bad7299d9e351afc05b2f80b8380fd12e019651343dfdf2eb3efdaf3758278e19da89b86638b9d0b8023f5b5bc7853e256fe7f6289c18236 + checksum: 10c0/a657703ef57b8932bad7299d9e351afc05b2f80b8380fd12e019651343dfdf2eb3efdaf3758278e19da89b86638b9d0b8023f5b5bc7853e256fe7f6289c18236 languageName: node linkType: hard @@ -215,7 +215,7 @@ __metadata: resolution: "@babel/helper-module-imports@npm:7.22.5" dependencies: "@babel/types": "npm:^7.22.5" - checksum: 04f8c0586c485c33017c63e0fc5fc16bd33b883cef3c88e4b3a8bf7bc807b3f9a7bcb9372fbcc01c0a539a5d1cdb477e7bdec77e250669edab00f796683b6b07 + checksum: 10c0/04f8c0586c485c33017c63e0fc5fc16bd33b883cef3c88e4b3a8bf7bc807b3f9a7bcb9372fbcc01c0a539a5d1cdb477e7bdec77e250669edab00f796683b6b07 languageName: node linkType: hard @@ -231,7 +231,7 @@ __metadata: "@babel/template": "npm:^7.22.5" "@babel/traverse": "npm:^7.22.5" "@babel/types": "npm:^7.22.5" - checksum: a28cf9a91ed657392f75ada08d96a46e8d0df420b7d5d1ac0bb1633d1404807d0cb6e6a3b0666c747d30f378fbb34985d30c6f25e2fcdd69dc58656e47aafe92 + checksum: 10c0/a28cf9a91ed657392f75ada08d96a46e8d0df420b7d5d1ac0bb1633d1404807d0cb6e6a3b0666c747d30f378fbb34985d30c6f25e2fcdd69dc58656e47aafe92 languageName: node linkType: hard @@ -240,14 +240,14 @@ __metadata: resolution: "@babel/helper-optimise-call-expression@npm:7.18.6" dependencies: "@babel/types": "npm:^7.18.6" - checksum: f1352ebc5d9abae6088e7d9b4b6b445c406ba552ef61e967ec77d005ff65752265b002b6faaf16cc293f9e37753760ef05c1f4b26cda1039256917022ba5669c + checksum: 10c0/f1352ebc5d9abae6088e7d9b4b6b445c406ba552ef61e967ec77d005ff65752265b002b6faaf16cc293f9e37753760ef05c1f4b26cda1039256917022ba5669c languageName: node linkType: hard "@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.16.7, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.18.9, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": version: 7.19.0 resolution: "@babel/helper-plugin-utils@npm:7.19.0" - checksum: 9ae9c09cf7e3b6023be2bb66f3ca3b5fa8c2b21b58bd09819d494fcd7ab2a1844056c8dfd609ffb474e3c857a1bc979fa7a60931b0c71d69a3e939ba724498ac + checksum: 10c0/9ae9c09cf7e3b6023be2bb66f3ca3b5fa8c2b21b58bd09819d494fcd7ab2a1844056c8dfd609ffb474e3c857a1bc979fa7a60931b0c71d69a3e939ba724498ac languageName: node linkType: hard @@ -261,7 +261,7 @@ __metadata: "@babel/types": "npm:^7.18.9" peerDependencies: "@babel/core": ^7.0.0 - checksum: e6b2a906bdb3ec40d9cee7b7f8d02a561334603a0c57406a37c77d301ca77412ff33f2cef9d89421d7c3b1359604d613c596621a2ff22129612213198c5d1527 + checksum: 10c0/e6b2a906bdb3ec40d9cee7b7f8d02a561334603a0c57406a37c77d301ca77412ff33f2cef9d89421d7c3b1359604d613c596621a2ff22129612213198c5d1527 languageName: node linkType: hard @@ -274,7 +274,7 @@ __metadata: "@babel/helper-optimise-call-expression": "npm:^7.18.6" "@babel/traverse": "npm:^7.18.9" "@babel/types": "npm:^7.18.9" - checksum: be2f46da56e62300b8c9ff8fab894714f9f914f3c55ae7d0588c6703e944c7bd97eee1c218badf5ec6cf0d1422b2a3659825066c2bee39a308fa090ddd94433a + checksum: 10c0/be2f46da56e62300b8c9ff8fab894714f9f914f3c55ae7d0588c6703e944c7bd97eee1c218badf5ec6cf0d1422b2a3659825066c2bee39a308fa090ddd94433a languageName: node linkType: hard @@ -283,7 +283,7 @@ __metadata: resolution: "@babel/helper-simple-access@npm:7.22.5" dependencies: "@babel/types": "npm:^7.22.5" - checksum: f0cf81a30ba3d09a625fd50e5a9069e575c5b6719234e04ee74247057f8104beca89ed03e9217b6e9b0493434cedc18c5ecca4cea6244990836f1f893e140369 + checksum: 10c0/f0cf81a30ba3d09a625fd50e5a9069e575c5b6719234e04ee74247057f8104beca89ed03e9217b6e9b0493434cedc18c5ecca4cea6244990836f1f893e140369 languageName: node linkType: hard @@ -292,7 +292,7 @@ __metadata: resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.18.9" dependencies: "@babel/types": "npm:^7.18.9" - checksum: 243996398085f93ccde0174beffae3fd1c0d2a762df61713b32f1bd01b16e6eaccb47f38437706b2239e2b26673412e500e380c4b1f2413f801df4c7a6805e78 + checksum: 10c0/243996398085f93ccde0174beffae3fd1c0d2a762df61713b32f1bd01b16e6eaccb47f38437706b2239e2b26673412e500e380c4b1f2413f801df4c7a6805e78 languageName: node linkType: hard @@ -301,28 +301,28 @@ __metadata: resolution: "@babel/helper-split-export-declaration@npm:7.22.6" dependencies: "@babel/types": "npm:^7.22.5" - checksum: d83e4b623eaa9622c267d3c83583b72f3aac567dc393dda18e559d79187961cb29ae9c57b2664137fc3d19508370b12ec6a81d28af73a50e0846819cb21c6e44 + checksum: 10c0/d83e4b623eaa9622c267d3c83583b72f3aac567dc393dda18e559d79187961cb29ae9c57b2664137fc3d19508370b12ec6a81d28af73a50e0846819cb21c6e44 languageName: node linkType: hard "@babel/helper-string-parser@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-string-parser@npm:7.22.5" - checksum: 6b0ff8af724377ec41e5587fffa7605198da74cb8e7d8d48a36826df0c0ba210eb9fedb3d9bef4d541156e0bd11040f021945a6cbb731ccec4aefb4affa17aa4 + checksum: 10c0/6b0ff8af724377ec41e5587fffa7605198da74cb8e7d8d48a36826df0c0ba210eb9fedb3d9bef4d541156e0bd11040f021945a6cbb731ccec4aefb4affa17aa4 languageName: node linkType: hard "@babel/helper-validator-identifier@npm:^7.18.6, @babel/helper-validator-identifier@npm:^7.22.20, @babel/helper-validator-identifier@npm:^7.22.5": version: 7.22.20 resolution: "@babel/helper-validator-identifier@npm:7.22.20" - checksum: dcad63db345fb110e032de46c3688384b0008a42a4845180ce7cd62b1a9c0507a1bed727c4d1060ed1a03ae57b4d918570259f81724aaac1a5b776056f37504e + checksum: 10c0/dcad63db345fb110e032de46c3688384b0008a42a4845180ce7cd62b1a9c0507a1bed727c4d1060ed1a03ae57b4d918570259f81724aaac1a5b776056f37504e languageName: node linkType: hard "@babel/helper-validator-option@npm:^7.18.6, @babel/helper-validator-option@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-validator-option@npm:7.22.5" - checksum: 23e310bf1b90d085b1ae250f31d423fb6cc004da882f0d3409266e5e4c7fd41ed0a172283a6a9a16083c5f2e11f987b32c815c80c60d9a948e23dd6dcf2e0437 + checksum: 10c0/23e310bf1b90d085b1ae250f31d423fb6cc004da882f0d3409266e5e4c7fd41ed0a172283a6a9a16083c5f2e11f987b32c815c80c60d9a948e23dd6dcf2e0437 languageName: node linkType: hard @@ -334,7 +334,7 @@ __metadata: "@babel/template": "npm:^7.18.10" "@babel/traverse": "npm:^7.18.11" "@babel/types": "npm:^7.18.10" - checksum: ea8370f87ad5b25624737320b9e7c9d29f0b772d497ae836a08cf698a396303d0adc19dc2e3eaa46f56be52e4ed2da94363c5fdf7ea45c63081db6a61b66c389 + checksum: 10c0/ea8370f87ad5b25624737320b9e7c9d29f0b772d497ae836a08cf698a396303d0adc19dc2e3eaa46f56be52e4ed2da94363c5fdf7ea45c63081db6a61b66c389 languageName: node linkType: hard @@ -345,7 +345,7 @@ __metadata: "@babel/template": "npm:^7.22.5" "@babel/traverse": "npm:^7.22.5" "@babel/types": "npm:^7.22.5" - checksum: efa2d0fc2107e270782a784af3a52e5e0b97187b7b34feeeeb00454bc322e802ff4007b22410c387c05580c793f517c4bafc8a6a3acfdb0e3a1b349728f270c4 + checksum: 10c0/efa2d0fc2107e270782a784af3a52e5e0b97187b7b34feeeeb00454bc322e802ff4007b22410c387c05580c793f517c4bafc8a6a3acfdb0e3a1b349728f270c4 languageName: node linkType: hard @@ -356,7 +356,7 @@ __metadata: "@babel/helper-validator-identifier": "npm:^7.22.20" chalk: "npm:^2.4.2" js-tokens: "npm:^4.0.0" - checksum: f3c3a193afad23434297d88e81d1d6c0c2cf02423de2139ada7ce0a7fc62d8559abf4cc996533c1a9beca7fc990010eb8d544097f75e818ac113bf39ed810aa2 + checksum: 10c0/f3c3a193afad23434297d88e81d1d6c0c2cf02423de2139ada7ce0a7fc62d8559abf4cc996533c1a9beca7fc990010eb8d544097f75e818ac113bf39ed810aa2 languageName: node linkType: hard @@ -365,7 +365,7 @@ __metadata: resolution: "@babel/parser@npm:7.23.0" bin: parser: ./bin/babel-parser.js - checksum: ab4ea9360ed4ba3c728c5a9bf33035103ebde20a7e943c4ae1d42becb02a313d731d12a93c795c5a19777031e4022e64b92a52262eda902522a1a18649826283 + checksum: 10c0/ab4ea9360ed4ba3c728c5a9bf33035103ebde20a7e943c4ae1d42becb02a313d731d12a93c795c5a19777031e4022e64b92a52262eda902522a1a18649826283 languageName: node linkType: hard @@ -376,7 +376,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.18.6" peerDependencies: "@babel/core": ^7.0.0 - checksum: be2cccfc101824428a860f8c71d2cd118a691a9ace5525197f3f0cba19a522006dc4f870405beece836452353076ac687aefda20d9d1491ea72ce51179057988 + checksum: 10c0/be2cccfc101824428a860f8c71d2cd118a691a9ace5525197f3f0cba19a522006dc4f870405beece836452353076ac687aefda20d9d1491ea72ce51179057988 languageName: node linkType: hard @@ -389,7 +389,7 @@ __metadata: "@babel/plugin-proposal-optional-chaining": "npm:^7.18.9" peerDependencies: "@babel/core": ^7.13.0 - checksum: 09258c9cf1d1303663d9152ca693bc4ff2ef2f9c6c71ce130b32b96c1a199a73da75e38a3b75ff156b9f070aaab2b816891570a8292ce40ff8edf33b567d631d + checksum: 10c0/09258c9cf1d1303663d9152ca693bc4ff2ef2f9c6c71ce130b32b96c1a199a73da75e38a3b75ff156b9f070aaab2b816891570a8292ce40ff8edf33b567d631d languageName: node linkType: hard @@ -403,7 +403,7 @@ __metadata: "@babel/plugin-syntax-async-generators": "npm:^7.8.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 3681e66e993cdc919cc6ed1890c970acce10eaff91d401a2f10cfc1cdc55ed0ef52aecfdf7c587dfc03bb90749efda539b2d62010e406206f82eae502cc56641 + checksum: 10c0/3681e66e993cdc919cc6ed1890c970acce10eaff91d401a2f10cfc1cdc55ed0ef52aecfdf7c587dfc03bb90749efda539b2d62010e406206f82eae502cc56641 languageName: node linkType: hard @@ -415,7 +415,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.18.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: d5172ac6c9948cdfc387e94f3493ad86cb04035cf7433f86b5d358270b1b9752dc25e176db0c5d65892a246aca7bdb4636672e15626d7a7de4bc0bd0040168d9 + checksum: 10c0/d5172ac6c9948cdfc387e94f3493ad86cb04035cf7433f86b5d358270b1b9752dc25e176db0c5d65892a246aca7bdb4636672e15626d7a7de4bc0bd0040168d9 languageName: node linkType: hard @@ -428,7 +428,7 @@ __metadata: "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" peerDependencies: "@babel/core": ^7.12.0 - checksum: 129c6e53d20229a32924fc45fe72597f2c25131fa8c7da51a07d2c8971c7c815703e2a68a645da7872e17a90bb365e63fa813e47f51b62cb61f9e59fefdd71b6 + checksum: 10c0/129c6e53d20229a32924fc45fe72597f2c25131fa8c7da51a07d2c8971c7c815703e2a68a645da7872e17a90bb365e63fa813e47f51b62cb61f9e59fefdd71b6 languageName: node linkType: hard @@ -440,7 +440,7 @@ __metadata: "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 99be9865edfd65a46afb97d877ea247a8e881b4d0246a1ea0adf6db04c92f4f0959bd2f6f706d73248a2a7167c34f2464c4863137ddb94deadc5c7cc8bfc3e72 + checksum: 10c0/99be9865edfd65a46afb97d877ea247a8e881b4d0246a1ea0adf6db04c92f4f0959bd2f6f706d73248a2a7167c34f2464c4863137ddb94deadc5c7cc8bfc3e72 languageName: node linkType: hard @@ -452,7 +452,7 @@ __metadata: "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: b90346bd3628ebd44138d0628a5aba1e6b11748893fb48e87008cac30f3bc7cd3161362e49433156737350318174164436357a66fbbfdbe952606b460bd8a0e4 + checksum: 10c0/b90346bd3628ebd44138d0628a5aba1e6b11748893fb48e87008cac30f3bc7cd3161362e49433156737350318174164436357a66fbbfdbe952606b460bd8a0e4 languageName: node linkType: hard @@ -464,7 +464,7 @@ __metadata: "@babel/plugin-syntax-json-strings": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 83f2ce41262a538ee43450044b9b0de320002473e4849421a7318c0500f9b0385c03d228f1be777ad71fd358aef13392e3551f0be52b5c423b0c34f7c9e5a06d + checksum: 10c0/83f2ce41262a538ee43450044b9b0de320002473e4849421a7318c0500f9b0385c03d228f1be777ad71fd358aef13392e3551f0be52b5c423b0c34f7c9e5a06d languageName: node linkType: hard @@ -476,7 +476,7 @@ __metadata: "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: d7abdc1fa4c2aa1fec2cd7cd649adab313e7837043d9ca166e043d3e1b4ece3b4c2a59b0c1dca2ed5a774b16ab688a407f85ad1d8256af3b2cd040678fc0a4dd + checksum: 10c0/d7abdc1fa4c2aa1fec2cd7cd649adab313e7837043d9ca166e043d3e1b4ece3b4c2a59b0c1dca2ed5a774b16ab688a407f85ad1d8256af3b2cd040678fc0a4dd languageName: node linkType: hard @@ -488,7 +488,7 @@ __metadata: "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: f6629158196ee9f16295d16db75825092ef543f8b98f4dfdd516e642a0430c7b1d69319ee676d35485d9b86a53ade6de0b883490d44de6d4336d38cdeccbe0bf + checksum: 10c0/f6629158196ee9f16295d16db75825092ef543f8b98f4dfdd516e642a0430c7b1d69319ee676d35485d9b86a53ade6de0b883490d44de6d4336d38cdeccbe0bf languageName: node linkType: hard @@ -500,7 +500,7 @@ __metadata: "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: a83a65c6ec0d2293d830e9db61406d246f22d8ea03583d68460cb1b6330c6699320acce1b45f66ba3c357830720e49267e3d99f95088be457c66e6450fbfe3fa + checksum: 10c0/a83a65c6ec0d2293d830e9db61406d246f22d8ea03583d68460cb1b6330c6699320acce1b45f66ba3c357830720e49267e3d99f95088be457c66e6450fbfe3fa languageName: node linkType: hard @@ -515,7 +515,7 @@ __metadata: "@babel/plugin-transform-parameters": "npm:^7.18.8" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 8e58aa40511897256f98dc558003ce3dd41073e30a9a63045eae1d5f4d9a599f5931670e19f3be62099b92be9381ccfa698c261101180dab2c257f23bde89e48 + checksum: 10c0/8e58aa40511897256f98dc558003ce3dd41073e30a9a63045eae1d5f4d9a599f5931670e19f3be62099b92be9381ccfa698c261101180dab2c257f23bde89e48 languageName: node linkType: hard @@ -527,7 +527,7 @@ __metadata: "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: ab20153d9e95e0b73004fdf86b6a2d219be2a0ace9ca76cd9eccddb680c913fec173bca54d761b1bc6044edde0a53811f3e515908c3b16d2d81cfec1e2e17391 + checksum: 10c0/ab20153d9e95e0b73004fdf86b6a2d219be2a0ace9ca76cd9eccddb680c913fec173bca54d761b1bc6044edde0a53811f3e515908c3b16d2d81cfec1e2e17391 languageName: node linkType: hard @@ -540,7 +540,7 @@ __metadata: "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: d28eadd292d615c8c97616b2ccef24ac0eb1fde7264dbd41a46df537b75f0038fd474e52409c5ee0e951e8d619020650c0e1cb47d2f856dae6f93bc1795f7611 + checksum: 10c0/d28eadd292d615c8c97616b2ccef24ac0eb1fde7264dbd41a46df537b75f0038fd474e52409c5ee0e951e8d619020650c0e1cb47d2f856dae6f93bc1795f7611 languageName: node linkType: hard @@ -552,7 +552,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.18.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 1c273d0ec3d49d0fe80bd754ec0191016e5b3ab4fb1e162ac0c014e9d3c1517a5d973afbf8b6dc9f9c98a8605c79e5f9e8b5ee158a4313fa68d1ff7b02084b6a + checksum: 10c0/1c273d0ec3d49d0fe80bd754ec0191016e5b3ab4fb1e162ac0c014e9d3c1517a5d973afbf8b6dc9f9c98a8605c79e5f9e8b5ee158a4313fa68d1ff7b02084b6a languageName: node linkType: hard @@ -566,7 +566,7 @@ __metadata: "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 173496cb8b16879cf3dd09d91bd246c6db3dc2b4320950a5a4dc4d4395e7c9d7407e5e5313242bbafcb9466540ddcb36f7b07f279dd471c6585592a141ddae51 + checksum: 10c0/173496cb8b16879cf3dd09d91bd246c6db3dc2b4320950a5a4dc4d4395e7c9d7407e5e5313242bbafcb9466540ddcb36f7b07f279dd471c6585592a141ddae51 languageName: node linkType: hard @@ -578,7 +578,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.18.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: c68feae57d9b1f4d98ecc2da63bda1993980deb509ccb08f6eace712ece8081032eb6532c304524b544c2dd577e2f9c2fe5c5bfd73d1955c946300def6fc7493 + checksum: 10c0/c68feae57d9b1f4d98ecc2da63bda1993980deb509ccb08f6eace712ece8081032eb6532c304524b544c2dd577e2f9c2fe5c5bfd73d1955c946300def6fc7493 languageName: node linkType: hard @@ -589,7 +589,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.8.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: d13efb282838481348c71073b6be6245b35d4f2f964a8f71e4174f235009f929ef7613df25f8d2338e2d3e44bc4265a9f8638c6aaa136d7a61fe95985f9725c8 + checksum: 10c0/d13efb282838481348c71073b6be6245b35d4f2f964a8f71e4174f235009f929ef7613df25f8d2338e2d3e44bc4265a9f8638c6aaa136d7a61fe95985f9725c8 languageName: node linkType: hard @@ -600,7 +600,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.12.13" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 95168fa186416195280b1264fb18afcdcdcea780b3515537b766cb90de6ce042d42dd6a204a39002f794ae5845b02afb0fd4861a3308a861204a55e68310a120 + checksum: 10c0/95168fa186416195280b1264fb18afcdcdcea780b3515537b766cb90de6ce042d42dd6a204a39002f794ae5845b02afb0fd4861a3308a861204a55e68310a120 languageName: node linkType: hard @@ -611,7 +611,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.14.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 4464bf9115f4a2d02ce1454411baf9cfb665af1da53709c5c56953e5e2913745b0fcce82982a00463d6facbdd93445c691024e310b91431a1e2f024b158f6371 + checksum: 10c0/4464bf9115f4a2d02ce1454411baf9cfb665af1da53709c5c56953e5e2913745b0fcce82982a00463d6facbdd93445c691024e310b91431a1e2f024b158f6371 languageName: node linkType: hard @@ -622,7 +622,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.8.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 9c50927bf71adf63f60c75370e2335879402648f468d0172bc912e303c6a3876927d8eb35807331b57f415392732ed05ab9b42c68ac30a936813ab549e0246c5 + checksum: 10c0/9c50927bf71adf63f60c75370e2335879402648f468d0172bc912e303c6a3876927d8eb35807331b57f415392732ed05ab9b42c68ac30a936813ab549e0246c5 languageName: node linkType: hard @@ -633,7 +633,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.8.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 5100d658ba563829700cd8d001ddc09f4c0187b1a13de300d729c5b3e87503f75a6d6c99c1794182f7f1a9f546ee009df4f15a0ce36376e206ed0012fa7cdc24 + checksum: 10c0/5100d658ba563829700cd8d001ddc09f4c0187b1a13de300d729c5b3e87503f75a6d6c99c1794182f7f1a9f546ee009df4f15a0ce36376e206ed0012fa7cdc24 languageName: node linkType: hard @@ -644,7 +644,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.18.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: b2673462593bac392d09679b3f6273784d2c5b8424d5c9c37cc9318e66d190b585789f0ec8aea76a4eeb945210f3193757461e34f4ffec3a0011d338512f384d + checksum: 10c0/b2673462593bac392d09679b3f6273784d2c5b8424d5c9c37cc9318e66d190b585789f0ec8aea76a4eeb945210f3193757461e34f4ffec3a0011d338512f384d languageName: node linkType: hard @@ -655,7 +655,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.8.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: e98f31b2ec406c57757d115aac81d0336e8434101c224edd9a5c93cefa53faf63eacc69f3138960c8b25401315af03df37f68d316c151c4b933136716ed6906e + checksum: 10c0/e98f31b2ec406c57757d115aac81d0336e8434101c224edd9a5c93cefa53faf63eacc69f3138960c8b25401315af03df37f68d316c151c4b933136716ed6906e languageName: node linkType: hard @@ -666,7 +666,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.10.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 2594cfbe29411ad5bc2ad4058de7b2f6a8c5b86eda525a993959438615479e59c012c14aec979e538d60a584a1a799b60d1b8942c3b18468cb9d99b8fd34cd0b + checksum: 10c0/2594cfbe29411ad5bc2ad4058de7b2f6a8c5b86eda525a993959438615479e59c012c14aec979e538d60a584a1a799b60d1b8942c3b18468cb9d99b8fd34cd0b languageName: node linkType: hard @@ -677,7 +677,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.8.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 2024fbb1162899094cfc81152449b12bd0cc7053c6d4bda8ac2852545c87d0a851b1b72ed9560673cbf3ef6248257262c3c04aabf73117215c1b9cc7dd2542ce + checksum: 10c0/2024fbb1162899094cfc81152449b12bd0cc7053c6d4bda8ac2852545c87d0a851b1b72ed9560673cbf3ef6248257262c3c04aabf73117215c1b9cc7dd2542ce languageName: node linkType: hard @@ -688,7 +688,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.10.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: c55a82b3113480942c6aa2fcbe976ff9caa74b7b1109ff4369641dfbc88d1da348aceb3c31b6ed311c84d1e7c479440b961906c735d0ab494f688bf2fd5b9bb9 + checksum: 10c0/c55a82b3113480942c6aa2fcbe976ff9caa74b7b1109ff4369641dfbc88d1da348aceb3c31b6ed311c84d1e7c479440b961906c735d0ab494f688bf2fd5b9bb9 languageName: node linkType: hard @@ -699,7 +699,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.8.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: ee1eab52ea6437e3101a0a7018b0da698545230015fc8ab129d292980ec6dff94d265e9e90070e8ae5fed42f08f1622c14c94552c77bcac784b37f503a82ff26 + checksum: 10c0/ee1eab52ea6437e3101a0a7018b0da698545230015fc8ab129d292980ec6dff94d265e9e90070e8ae5fed42f08f1622c14c94552c77bcac784b37f503a82ff26 languageName: node linkType: hard @@ -710,7 +710,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.8.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 27e2493ab67a8ea6d693af1287f7e9acec206d1213ff107a928e85e173741e1d594196f99fec50e9dde404b09164f39dec5864c767212154ffe1caa6af0bc5af + checksum: 10c0/27e2493ab67a8ea6d693af1287f7e9acec206d1213ff107a928e85e173741e1d594196f99fec50e9dde404b09164f39dec5864c767212154ffe1caa6af0bc5af languageName: node linkType: hard @@ -721,7 +721,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.8.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 46edddf2faa6ebf94147b8e8540dfc60a5ab718e2de4d01b2c0bdf250a4d642c2bd47cbcbb739febcb2bf75514dbcefad3c52208787994b8d0f8822490f55e81 + checksum: 10c0/46edddf2faa6ebf94147b8e8540dfc60a5ab718e2de4d01b2c0bdf250a4d642c2bd47cbcbb739febcb2bf75514dbcefad3c52208787994b8d0f8822490f55e81 languageName: node linkType: hard @@ -732,7 +732,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.14.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 69822772561706c87f0a65bc92d0772cea74d6bc0911537904a676d5ff496a6d3ac4e05a166d8125fce4a16605bace141afc3611074e170a994e66e5397787f3 + checksum: 10c0/69822772561706c87f0a65bc92d0772cea74d6bc0911537904a676d5ff496a6d3ac4e05a166d8125fce4a16605bace141afc3611074e170a994e66e5397787f3 languageName: node linkType: hard @@ -743,7 +743,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.14.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 14bf6e65d5bc1231ffa9def5f0ef30b19b51c218fcecaa78cd1bdf7939dfdf23f90336080b7f5196916368e399934ce5d581492d8292b46a2fb569d8b2da106f + checksum: 10c0/14bf6e65d5bc1231ffa9def5f0ef30b19b51c218fcecaa78cd1bdf7939dfdf23f90336080b7f5196916368e399934ce5d581492d8292b46a2fb569d8b2da106f languageName: node linkType: hard @@ -754,7 +754,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.18.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 0686ca62e04b8500f0b9238563ed133f796bd6e0f3d38d00e4c7ce1756b51aa13c3f1ee66123d881d3ac4057259325aed104d4db11ded4551ea776af36e4e45b + checksum: 10c0/0686ca62e04b8500f0b9238563ed133f796bd6e0f3d38d00e4c7ce1756b51aa13c3f1ee66123d881d3ac4057259325aed104d4db11ded4551ea776af36e4e45b languageName: node linkType: hard @@ -767,7 +767,7 @@ __metadata: "@babel/helper-remap-async-to-generator": "npm:^7.18.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 988bac0c376b412c3ca1dd24323219d7d2a1145aa58fe38325afb305ead46af65bf9d2145d24545175ddd54235ac94485c90f3fb9778b2088d16a87800f6fe65 + checksum: 10c0/988bac0c376b412c3ca1dd24323219d7d2a1145aa58fe38325afb305ead46af65bf9d2145d24545175ddd54235ac94485c90f3fb9778b2088d16a87800f6fe65 languageName: node linkType: hard @@ -778,7 +778,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.18.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 22e81b52320e6f3929110241d91499a7535d6834b86e8871470f9946b42e093fafc79e1eae4ede376e7c5fe84c5dc5e9fdbe55ff4039b323b5958167202f02e0 + checksum: 10c0/22e81b52320e6f3929110241d91499a7535d6834b86e8871470f9946b42e093fafc79e1eae4ede376e7c5fe84c5dc5e9fdbe55ff4039b323b5958167202f02e0 languageName: node linkType: hard @@ -789,7 +789,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.18.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 1645188b7bd97ee10832607c9072af5184823cfd67cd319b7fb90544d27d45b222e85118dc07581913d14b1c6b36ba100c321ecdd311b107a2fb48427bff762e + checksum: 10c0/1645188b7bd97ee10832607c9072af5184823cfd67cd319b7fb90544d27d45b222e85118dc07581913d14b1c6b36ba100c321ecdd311b107a2fb48427bff762e languageName: node linkType: hard @@ -807,7 +807,7 @@ __metadata: globals: "npm:^11.1.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 792a8dae7dacb3e50021a40c3bb1a928dc9a2c37b3e766c64e7f8e0ab9995c83a74c3e3924f729dc8090185d556851399b99426908f5480f35e43d1ae4b452c2 + checksum: 10c0/792a8dae7dacb3e50021a40c3bb1a928dc9a2c37b3e766c64e7f8e0ab9995c83a74c3e3924f729dc8090185d556851399b99426908f5480f35e43d1ae4b452c2 languageName: node linkType: hard @@ -818,7 +818,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.18.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: badf6d709a32716d90c2042a1999ef008e283d0491a79edb8396d15ebb3261c3a657368dcdc3182fd2060d73ce4a4e5241c0c04bdc1d64a6c101b71ba0a8efc0 + checksum: 10c0/badf6d709a32716d90c2042a1999ef008e283d0491a79edb8396d15ebb3261c3a657368dcdc3182fd2060d73ce4a4e5241c0c04bdc1d64a6c101b71ba0a8efc0 languageName: node linkType: hard @@ -829,7 +829,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.18.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: d894fa122d71e77117957be0fac3d2a7099d2abfae8768f09c0513123ccbf701881f9546204569473b846374b2e72eac0e9bbe7d442e6871bc25e6d20a8b6669 + checksum: 10c0/d894fa122d71e77117957be0fac3d2a7099d2abfae8768f09c0513123ccbf701881f9546204569473b846374b2e72eac0e9bbe7d442e6871bc25e6d20a8b6669 languageName: node linkType: hard @@ -841,7 +841,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.18.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: cf4c3751e603996f3da0b2060c3aab3c95e267cfc702a95d025b2e9684b66ed73a318949524fad5048515f4a5142629f2c0bd3dbb83558bdbab4008486b8d9a0 + checksum: 10c0/cf4c3751e603996f3da0b2060c3aab3c95e267cfc702a95d025b2e9684b66ed73a318949524fad5048515f4a5142629f2c0bd3dbb83558bdbab4008486b8d9a0 languageName: node linkType: hard @@ -852,7 +852,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.18.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: dfb7f7e66c0c862d205fe8f8b87f7ac174549c56937a5186b6e6cf85358ce257115fec0aa55e78fde53e5132d5aae9383e81aba8a4b70faa0e9fb64e3a66ca96 + checksum: 10c0/dfb7f7e66c0c862d205fe8f8b87f7ac174549c56937a5186b6e6cf85358ce257115fec0aa55e78fde53e5132d5aae9383e81aba8a4b70faa0e9fb64e3a66ca96 languageName: node linkType: hard @@ -864,7 +864,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.18.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 96d300ca3e55dbc98609df2d70c2b343202faca307b3152a04eab77600f6b1dc00b5b90fc3999cb9592922583c83ecbb92217e317d7c08602ca0db87a26eeed3 + checksum: 10c0/96d300ca3e55dbc98609df2d70c2b343202faca307b3152a04eab77600f6b1dc00b5b90fc3999cb9592922583c83ecbb92217e317d7c08602ca0db87a26eeed3 languageName: node linkType: hard @@ -875,7 +875,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.18.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 37708653d9ac69af31f0f5d0abebd726d6b92ba630beed8fea8e1538f035b2877abc0013f26f400ebc23af459fb8e629c83847818614d9fcca086fb5bcd35c4d + checksum: 10c0/37708653d9ac69af31f0f5d0abebd726d6b92ba630beed8fea8e1538f035b2877abc0013f26f400ebc23af459fb8e629c83847818614d9fcca086fb5bcd35c4d languageName: node linkType: hard @@ -888,7 +888,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.18.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 95100707fe00b3e388c059700fbdccf83c2cdf3b7fec8035cdd6c01dd80a1d9efb2821fec1357a62533ebbcbb3f6c361666866a3818486f1172e62f2b692de64 + checksum: 10c0/95100707fe00b3e388c059700fbdccf83c2cdf3b7fec8035cdd6c01dd80a1d9efb2821fec1357a62533ebbcbb3f6c361666866a3818486f1172e62f2b692de64 languageName: node linkType: hard @@ -899,7 +899,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.18.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 7b0d59920dd5a1679a2214dde0d785ce7c0ed75cb6d46b618e7822dcd11fb347be2abb99444019262b6561369b85b95ab96603357773a75126b3d1c4c289b822 + checksum: 10c0/7b0d59920dd5a1679a2214dde0d785ce7c0ed75cb6d46b618e7822dcd11fb347be2abb99444019262b6561369b85b95ab96603357773a75126b3d1c4c289b822 languageName: node linkType: hard @@ -910,7 +910,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.18.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 346e5ac45b77f1e58a9b1686eb16c75cca40cbc1de9836b814fbe8ae0767f7d4a0fec5b88fcf26a5e3455af9e33fd3c6424e4f2661d04e38123d80e022ce6e6f + checksum: 10c0/346e5ac45b77f1e58a9b1686eb16c75cca40cbc1de9836b814fbe8ae0767f7d4a0fec5b88fcf26a5e3455af9e33fd3c6424e4f2661d04e38123d80e022ce6e6f languageName: node linkType: hard @@ -923,7 +923,7 @@ __metadata: babel-plugin-dynamic-import-node: "npm:^2.3.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 1391af0dd70959c1a1acb61cd830e18603c06dcc47af811ce06fc321da504993ff72c582e26facef8b55524215ae5ee766ea330498361adc5ad5236835a47bfc + checksum: 10c0/1391af0dd70959c1a1acb61cd830e18603c06dcc47af811ce06fc321da504993ff72c582e26facef8b55524215ae5ee766ea330498361adc5ad5236835a47bfc languageName: node linkType: hard @@ -937,7 +937,7 @@ __metadata: babel-plugin-dynamic-import-node: "npm:^2.3.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: de3850b3e6a6b6ab206414897f451de332ca29713e8083d1d58ae0072516428fb138f418cae806546aef7c5e130a5cecd4bd1d938c93f20fe8c6312ef6546327 + checksum: 10c0/de3850b3e6a6b6ab206414897f451de332ca29713e8083d1d58ae0072516428fb138f418cae806546aef7c5e130a5cecd4bd1d938c93f20fe8c6312ef6546327 languageName: node linkType: hard @@ -952,7 +952,7 @@ __metadata: babel-plugin-dynamic-import-node: "npm:^2.3.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: ab1e10be15a96c9cdaa05f954d5983523c627e9f701c0989fedf9bff8ff5873461f3035a73e87e4546a31b163897c6f36c5c567d4c1c3edc24ec395d56462715 + checksum: 10c0/ab1e10be15a96c9cdaa05f954d5983523c627e9f701c0989fedf9bff8ff5873461f3035a73e87e4546a31b163897c6f36c5c567d4c1c3edc24ec395d56462715 languageName: node linkType: hard @@ -964,7 +964,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.18.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: e3e99aef95a3faa15bc2398a919475c9130b783ee0f2439e1622fe73466c9821a5f74f72a46bb25e84906b650b467d73b43269c8b8c13372e97d3f2d96d109c7 + checksum: 10c0/e3e99aef95a3faa15bc2398a919475c9130b783ee0f2439e1622fe73466c9821a5f74f72a46bb25e84906b650b467d73b43269c8b8c13372e97d3f2d96d109c7 languageName: node linkType: hard @@ -976,7 +976,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.18.6" peerDependencies: "@babel/core": ^7.0.0 - checksum: 6695fc0469fa2dbe8133e36f8f5a281fc67a2b565481a13f5f50b95f86f4967d36c2ef8244d2ade09c0adbcd5dc98fddf8d61dd4bb56d6953c0523d11d9e0e5a + checksum: 10c0/6695fc0469fa2dbe8133e36f8f5a281fc67a2b565481a13f5f50b95f86f4967d36c2ef8244d2ade09c0adbcd5dc98fddf8d61dd4bb56d6953c0523d11d9e0e5a languageName: node linkType: hard @@ -987,7 +987,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.18.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: ea9186087b72d0adff0b9e7ef5769cb7806bc4755ce7b75c323d65053d453fd801a64f97b65c033d89370866e76e8d526dd186acede2fdcd2667fa056b11149b + checksum: 10c0/ea9186087b72d0adff0b9e7ef5769cb7806bc4755ce7b75c323d65053d453fd801a64f97b65c033d89370866e76e8d526dd186acede2fdcd2667fa056b11149b languageName: node linkType: hard @@ -999,7 +999,7 @@ __metadata: "@babel/helper-replace-supers": "npm:^7.18.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 44a1f5a62c6821a4653e23a38a61bed494138a0f12945a1d8b55ff7b83904e7c5615f4ebda8268c6ea877d1ec6b00f7c92a08cf93f4f77dc777e71145342aaf5 + checksum: 10c0/44a1f5a62c6821a4653e23a38a61bed494138a0f12945a1d8b55ff7b83904e7c5615f4ebda8268c6ea877d1ec6b00f7c92a08cf93f4f77dc777e71145342aaf5 languageName: node linkType: hard @@ -1010,7 +1010,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.18.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: ca12c2cdb67012fc7d886941bf194225054cb11a117dd2b6a065ca5433f38368e8cf1e23f0fb81ccfc026991e95c7444a4cb594f4fd27b9e292304c0f96724ca + checksum: 10c0/ca12c2cdb67012fc7d886941bf194225054cb11a117dd2b6a065ca5433f38368e8cf1e23f0fb81ccfc026991e95c7444a4cb594f4fd27b9e292304c0f96724ca languageName: node linkType: hard @@ -1021,7 +1021,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.18.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: b76239098127ee39031db54e4eb9e55cb8a616abc0fc6abba4b22d00e443ec00d7aaa58c7cdef45b224b5e017905fc39a5e1802577a82396acabb32fe9cff7dd + checksum: 10c0/b76239098127ee39031db54e4eb9e55cb8a616abc0fc6abba4b22d00e443ec00d7aaa58c7cdef45b224b5e017905fc39a5e1802577a82396acabb32fe9cff7dd languageName: node linkType: hard @@ -1033,7 +1033,7 @@ __metadata: regenerator-transform: "npm:^0.15.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 74eaaeebd830656c37b11d058c0cae5e93645acdea457e62ea0cc9efb135c4b080df9bb8b453f2b1e0f12c0b38d74628f2807d2de5ca0b9aab0b3ea1c04f9c93 + checksum: 10c0/74eaaeebd830656c37b11d058c0cae5e93645acdea457e62ea0cc9efb135c4b080df9bb8b453f2b1e0f12c0b38d74628f2807d2de5ca0b9aab0b3ea1c04f9c93 languageName: node linkType: hard @@ -1044,7 +1044,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.18.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: cbd6a86743c270a1e2a7caa19f6da22112c9dfa28fe08aea46ec9cb79fc1bc48df6b5b12819ae0e53227d4ca4adaee13f80216c03fff3082d3a88c55b4cddeba + checksum: 10c0/cbd6a86743c270a1e2a7caa19f6da22112c9dfa28fe08aea46ec9cb79fc1bc48df6b5b12819ae0e53227d4ca4adaee13f80216c03fff3082d3a88c55b4cddeba languageName: node linkType: hard @@ -1055,7 +1055,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.18.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: e60e02dca182d6ec0e7b571d7e99a0528743692fb911826600374b77832922bf7c4b154194d4fe4a0e8a15c2acad3ea44dbaff5189aaeab59124e4c7ee0b8c30 + checksum: 10c0/e60e02dca182d6ec0e7b571d7e99a0528743692fb911826600374b77832922bf7c4b154194d4fe4a0e8a15c2acad3ea44dbaff5189aaeab59124e4c7ee0b8c30 languageName: node linkType: hard @@ -1067,7 +1067,7 @@ __metadata: "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.18.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: b208ba03d2e0f4e49d0e634f31ded67cd4a76fafc53838e674b535eb993b2a03a4a87717a241ff5c44d41164b74493d197378811a757965cf9bbc95f32aaab2a + checksum: 10c0/b208ba03d2e0f4e49d0e634f31ded67cd4a76fafc53838e674b535eb993b2a03a4a87717a241ff5c44d41164b74493d197378811a757965cf9bbc95f32aaab2a languageName: node linkType: hard @@ -1078,7 +1078,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.18.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: efbcf8f0acdac5757cce8d79c0259e3e5142cf3c782d71675802e97709dfb3cbc3dc08202c3ea950ddc23c8f74cae7c334aa05ec095e3cc6d642fa8b30d8e31c + checksum: 10c0/efbcf8f0acdac5757cce8d79c0259e3e5142cf3c782d71675802e97709dfb3cbc3dc08202c3ea950ddc23c8f74cae7c334aa05ec095e3cc6d642fa8b30d8e31c languageName: node linkType: hard @@ -1089,7 +1089,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.18.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: d1a5e55ed8c3b1186fbba2a7b3e9d880cb3987b846376f51a73216a8894b9c9d6f6c6e2d3cadb17d76f2477552db5383d817169d5b92fcf08ee0fa5b88213c15 + checksum: 10c0/d1a5e55ed8c3b1186fbba2a7b3e9d880cb3987b846376f51a73216a8894b9c9d6f6c6e2d3cadb17d76f2477552db5383d817169d5b92fcf08ee0fa5b88213c15 languageName: node linkType: hard @@ -1100,7 +1100,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.18.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: c42e00635aa9d1c597d339c9023e0f9bfa3cd7af55c00cb8a6461036102b0facdcd3059456d4fee0a63675aeecca62fc84ee01f28b23139c6ae03e6d61c86906 + checksum: 10c0/c42e00635aa9d1c597d339c9023e0f9bfa3cd7af55c00cb8a6461036102b0facdcd3059456d4fee0a63675aeecca62fc84ee01f28b23139c6ae03e6d61c86906 languageName: node linkType: hard @@ -1111,7 +1111,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.18.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 1587c3497549a4ad1b75d5b63f1d6ced839d4078dc7df3b5df362c8669f3e9cbed975d5c55632bf8c574847d8df03553851e1b85d1e81a568fdfd2466fcd4198 + checksum: 10c0/1587c3497549a4ad1b75d5b63f1d6ced839d4078dc7df3b5df362c8669f3e9cbed975d5c55632bf8c574847d8df03553851e1b85d1e81a568fdfd2466fcd4198 languageName: node linkType: hard @@ -1123,7 +1123,7 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.18.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 2f71b5b79df7f8de81c52011d64203b7021f7d23af2470782aef8e8a3be6ca3a208679de8078a12e707342dde1175e5ab44abf8f63c219c997e147118d356dea + checksum: 10c0/2f71b5b79df7f8de81c52011d64203b7021f7d23af2470782aef8e8a3be6ca3a208679de8078a12e707342dde1175e5ab44abf8f63c219c997e147118d356dea languageName: node linkType: hard @@ -1208,7 +1208,7 @@ __metadata: semver: "npm:^6.3.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 4b7ef515702e8c91aa223f60f8a4c8e28ca202fcc090db5c62135e3af16980d7059ba8dc7faf01ba4b818837187d609fdb4d44a56fffa261aa81bfc3d1fa10c3 + checksum: 10c0/4b7ef515702e8c91aa223f60f8a4c8e28ca202fcc090db5c62135e3af16980d7059ba8dc7faf01ba4b818837187d609fdb4d44a56fffa261aa81bfc3d1fa10c3 languageName: node linkType: hard @@ -1223,23 +1223,23 @@ __metadata: esutils: "npm:^2.0.2" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: bd90081d96b746c1940dc1ce056dee06ed3a128d20936aee1d1795199f789f9a61293ef738343ae10c6d53970c17285d5e147a945dded35423aacb75083b8a89 + checksum: 10c0/bd90081d96b746c1940dc1ce056dee06ed3a128d20936aee1d1795199f789f9a61293ef738343ae10c6d53970c17285d5e147a945dded35423aacb75083b8a89 languageName: node linkType: hard "@babel/regjsgen@npm:^0.8.0": version: 0.8.0 resolution: "@babel/regjsgen@npm:0.8.0" - checksum: 4f3ddd8c7c96d447e05c8304c1d5ba3a83fcabd8a716bc1091c2f31595cdd43a3a055fff7cb5d3042b8cb7d402d78820fcb4e05d896c605a7d8bcf30f2424c4a + checksum: 10c0/4f3ddd8c7c96d447e05c8304c1d5ba3a83fcabd8a716bc1091c2f31595cdd43a3a055fff7cb5d3042b8cb7d402d78820fcb4e05d896c605a7d8bcf30f2424c4a languageName: node linkType: hard -"@babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.23.8, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7": +"@babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.23.9, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7": version: 7.23.9 resolution: "@babel/runtime@npm:7.23.9" dependencies: regenerator-runtime: "npm:^0.14.0" - checksum: e71205fdd7082b2656512cc98e647d9ea7e222e4fe5c36e9e5adc026446fcc3ba7b3cdff8b0b694a0b78bb85db83e7b1e3d4c56ef90726682b74f13249cf952d + checksum: 10c0/e71205fdd7082b2656512cc98e647d9ea7e222e4fe5c36e9e5adc026446fcc3ba7b3cdff8b0b694a0b78bb85db83e7b1e3d4c56ef90726682b74f13249cf952d languageName: node linkType: hard @@ -1250,7 +1250,7 @@ __metadata: "@babel/code-frame": "npm:^7.22.13" "@babel/parser": "npm:^7.22.15" "@babel/types": "npm:^7.22.15" - checksum: 9312edd37cf1311d738907003f2aa321a88a42ba223c69209abe4d7111db019d321805504f606c7fd75f21c6cf9d24d0a8223104cd21ebd207e241b6c551f454 + checksum: 10c0/9312edd37cf1311d738907003f2aa321a88a42ba223c69209abe4d7111db019d321805504f606c7fd75f21c6cf9d24d0a8223104cd21ebd207e241b6c551f454 languageName: node linkType: hard @@ -1268,7 +1268,7 @@ __metadata: "@babel/types": "npm:^7.23.0" debug: "npm:^4.1.0" globals: "npm:^11.1.0" - checksum: d096c7c4bab9262a2f658298a3c630ae4a15a10755bb257ae91d5ab3e3b2877438934859c8d34018b7727379fe6b26c4fa2efc81cf4c462a7fe00caf79fa02ff + checksum: 10c0/d096c7c4bab9262a2f658298a3c630ae4a15a10755bb257ae91d5ab3e3b2877438934859c8d34018b7727379fe6b26c4fa2efc81cf4c462a7fe00caf79fa02ff languageName: node linkType: hard @@ -1279,7 +1279,7 @@ __metadata: "@babel/helper-string-parser": "npm:^7.22.5" "@babel/helper-validator-identifier": "npm:^7.22.20" to-fast-properties: "npm:^2.0.0" - checksum: 70e4db41acb6793d0eb8d81a2fa88f19ee661219b84bd5f703dbdb54eb3a4d3c0dfc55e69034c945b479df9f43fd4b1376480aaccfc19797ce5af1c5d2576b36 + checksum: 10c0/70e4db41acb6793d0eb8d81a2fa88f19ee661219b84bd5f703dbdb54eb3a4d3c0dfc55e69034c945b479df9f43fd4b1376480aaccfc19797ce5af1c5d2576b36 languageName: node linkType: hard @@ -1296,7 +1296,7 @@ __metadata: "@codemirror/state": ^6.0.0 "@codemirror/view": ^6.0.0 "@lezer/common": ^1.0.0 - checksum: 9f627f27e25b83816f3b60fe45285d0c976b6bdc0a4b01e7fc1ab90a536113dc5b6a1adfbe403963b97bdb84343a464e58b1614e8d522a4e937949ec81e227f3 + checksum: 10c0/9f627f27e25b83816f3b60fe45285d0c976b6bdc0a4b01e7fc1ab90a536113dc5b6a1adfbe403963b97bdb84343a464e58b1614e8d522a4e937949ec81e227f3 languageName: node linkType: hard @@ -1308,13 +1308,13 @@ __metadata: "@codemirror/state": "npm:^6.4.0" "@codemirror/view": "npm:^6.0.0" "@lezer/common": "npm:^1.1.0" - checksum: 0b8384e54232c4046a6a1a4fd56081b2040eb072f678b4f6918f0f792c2c66b52540938b7c7cc766e1f9d5173ab0c57707ff486fa351ed60540471ad7ce7dfdd + checksum: 10c0/0b8384e54232c4046a6a1a4fd56081b2040eb072f678b4f6918f0f792c2c66b52540938b7c7cc766e1f9d5173ab0c57707ff486fa351ed60540471ad7ce7dfdd languageName: node linkType: hard -"@codemirror/language@npm:^6.0.0, @codemirror/language@npm:^6.10.0": - version: 6.10.0 - resolution: "@codemirror/language@npm:6.10.0" +"@codemirror/language@npm:^6.0.0, @codemirror/language@npm:^6.10.1": + version: 6.10.1 + resolution: "@codemirror/language@npm:6.10.1" dependencies: "@codemirror/state": "npm:^6.0.0" "@codemirror/view": "npm:^6.23.0" @@ -1322,47 +1322,47 @@ __metadata: "@lezer/highlight": "npm:^1.0.0" "@lezer/lr": "npm:^1.0.0" style-mod: "npm:^4.0.0" - checksum: 7f1f1f0ebd12da87df10ca5d26bc0d0ac0a4e4b85bbbb8e43d334e2c35cf900b6526c6d0d9967b986e75cdb5e5331dfc23f49c50aa9d7836407fe576ccd40346 + checksum: 10c0/b910b7be491d3c73389e31d54a6910ad82b35f8ba7a7a48048ea949d881a16e261789b133bee7d458bc5cb1a14eaa2e18f50ac643da17a29d9323d346d3f2a74 languageName: node linkType: hard -"@codemirror/lint@npm:^6.4.2": - version: 6.4.2 - resolution: "@codemirror/lint@npm:6.4.2" +"@codemirror/lint@npm:^6.5.0": + version: 6.5.0 + resolution: "@codemirror/lint@npm:6.5.0" dependencies: "@codemirror/state": "npm:^6.0.0" "@codemirror/view": "npm:^6.0.0" crelt: "npm:^1.0.5" - checksum: 71c9f93741b339cf8fb5670c60c2e365a0365651fedb2d7b90bb4a5e52aee6493c9f1a8628b860de60621b6a7a328d2a6a43b64f02d71fc16ec072edf6d74553 + checksum: 10c0/5180cc4c56bf8da78d9e506c3f4d281108194103c050a9babd1304bc50a91085d99616cd19cc9fae3c0d55a3288ab5112c1cb4b4b52c4fd032d6396954b0abd8 languageName: node linkType: hard -"@codemirror/search@npm:^6.5.5": - version: 6.5.5 - resolution: "@codemirror/search@npm:6.5.5" +"@codemirror/search@npm:^6.5.6": + version: 6.5.6 + resolution: "@codemirror/search@npm:6.5.6" dependencies: "@codemirror/state": "npm:^6.0.0" "@codemirror/view": "npm:^6.0.0" crelt: "npm:^1.0.5" - checksum: a7b9c4aa55018c2f619b18b34437a80d356755f72b0bb47d6ae7c239bc5060945fe63fc12336526c1445d59bf5490235c26415dc47f0695482c9758498d29c4f + checksum: 10c0/4bb8ca46d105e4b7eb5830c65abc61302f5cc86f0118c5ad3f0fe72d2a7f7309a7394eba8c784a8ac152569e16003f6edf3d69a7da6dac0c7abe96fe5395ed9b languageName: node linkType: hard "@codemirror/state@npm:^6.0.0, @codemirror/state@npm:^6.4.0": version: 6.4.0 resolution: "@codemirror/state@npm:6.4.0" - checksum: f1a94ab45dd5ae067d7f273bbe1a02fb118fa3defae012ff8a18711083bc7fb29436e3a7642c2621bb19a0d51546b398595b63dfdd48e5e15dcf6c629ec81ca1 + checksum: 10c0/f1a94ab45dd5ae067d7f273bbe1a02fb118fa3defae012ff8a18711083bc7fb29436e3a7642c2621bb19a0d51546b398595b63dfdd48e5e15dcf6c629ec81ca1 languageName: node linkType: hard -"@codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.17.0, @codemirror/view@npm:^6.23.0, @codemirror/view@npm:^6.23.1": - version: 6.23.1 - resolution: "@codemirror/view@npm:6.23.1" +"@codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.17.0, @codemirror/view@npm:^6.23.0, @codemirror/view@npm:^6.24.0": + version: 6.24.0 + resolution: "@codemirror/view@npm:6.24.0" dependencies: "@codemirror/state": "npm:^6.4.0" style-mod: "npm:^4.1.0" w3c-keyname: "npm:^2.2.4" - checksum: bda264538b0f979db3fff83e1c62cce39975edde9e719e66caf99a541d3e173a4d2f4c3b7c278a51495d040d12881b351824233431927e208b6a39365d5fb12a + checksum: 10c0/27ab6fb82093a533b0a1a2f032b4a0f5707ae85513d21350fb05e1e03c3284a8bb278054c1a77317a6ae512f491a466337f7e35a32eadfb4da33f7efa1b6dcde languageName: node linkType: hard @@ -1381,7 +1381,7 @@ __metadata: find-root: "npm:^1.1.0" source-map: "npm:^0.5.7" stylis: "npm:4.2.0" - checksum: 89cbb6ec0e52c8ee9c2a4b9889ccd4fc3a75d28091d835bfac6d7c4565d3338621e23af0a85f3bcd133e1cae795c692e1dadada015784d4b0554aa5bb111df43 + checksum: 10c0/89cbb6ec0e52c8ee9c2a4b9889ccd4fc3a75d28091d835bfac6d7c4565d3338621e23af0a85f3bcd133e1cae795c692e1dadada015784d4b0554aa5bb111df43 languageName: node linkType: hard @@ -1394,14 +1394,14 @@ __metadata: "@emotion/utils": "npm:^1.2.1" "@emotion/weak-memoize": "npm:^0.3.1" stylis: "npm:4.2.0" - checksum: a23ab5ab2fd08e904698106d58ad3536fed51cc1aa0ef228e95bb640eaf11f560dbd91a395477b0d84e1e3c20150263764b4558517cf6576a89d2d6cc5253688 + checksum: 10c0/a23ab5ab2fd08e904698106d58ad3536fed51cc1aa0ef228e95bb640eaf11f560dbd91a395477b0d84e1e3c20150263764b4558517cf6576a89d2d6cc5253688 languageName: node linkType: hard "@emotion/hash@npm:^0.9.1": version: 0.9.1 resolution: "@emotion/hash@npm:0.9.1" - checksum: cdafe5da63fc1137f3db6e232fdcde9188b2b47ee66c56c29137199642a4086f42382d866911cfb4833cae2cc00271ab45cad3946b024f67b527bb7fac7f4c9d + checksum: 10c0/cdafe5da63fc1137f3db6e232fdcde9188b2b47ee66c56c29137199642a4086f42382d866911cfb4833cae2cc00271ab45cad3946b024f67b527bb7fac7f4c9d languageName: node linkType: hard @@ -1410,14 +1410,14 @@ __metadata: resolution: "@emotion/is-prop-valid@npm:1.2.1" dependencies: "@emotion/memoize": "npm:^0.8.1" - checksum: 7c2aabdf0ca9986ca25abc9dae711348308cf18d418d64ffa4c8ffd2114806c47f2e06ba8ee769f38ec67d65bd59ec73f34d94023e81baa1c43510ac86ccd5e6 + checksum: 10c0/7c2aabdf0ca9986ca25abc9dae711348308cf18d418d64ffa4c8ffd2114806c47f2e06ba8ee769f38ec67d65bd59ec73f34d94023e81baa1c43510ac86ccd5e6 languageName: node linkType: hard "@emotion/memoize@npm:^0.8.1": version: 0.8.1 resolution: "@emotion/memoize@npm:0.8.1" - checksum: dffed372fc3b9fa2ba411e76af22b6bb686fb0cb07694fdfaa6dd2baeb0d5e4968c1a7caa472bfcf06a5997d5e7c7d16b90e993f9a6ffae79a2c3dbdc76dfe78 + checksum: 10c0/dffed372fc3b9fa2ba411e76af22b6bb686fb0cb07694fdfaa6dd2baeb0d5e4968c1a7caa472bfcf06a5997d5e7c7d16b90e993f9a6ffae79a2c3dbdc76dfe78 languageName: node linkType: hard @@ -1438,7 +1438,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: ce995395b8714343715284beb8478afdfa72b89ed83981a15a170ca0f4a2f77d7a4a198fd50c1f9c6efcd0535768d168ff88c5921dc5f90bb33134c7a75f9455 + checksum: 10c0/ce995395b8714343715284beb8478afdfa72b89ed83981a15a170ca0f4a2f77d7a4a198fd50c1f9c6efcd0535768d168ff88c5921dc5f90bb33134c7a75f9455 languageName: node linkType: hard @@ -1451,14 +1451,14 @@ __metadata: "@emotion/unitless": "npm:^0.8.1" "@emotion/utils": "npm:^1.2.1" csstype: "npm:^3.0.2" - checksum: 875241eafaa30e7d3b7cf9b585d8c1f224cbf627a674e87eb1d7662dafa76a8c8d67f14a79dbf7d1eaa017e9f68389962990fbcc699d5ad65035a1a047432a3f + checksum: 10c0/875241eafaa30e7d3b7cf9b585d8c1f224cbf627a674e87eb1d7662dafa76a8c8d67f14a79dbf7d1eaa017e9f68389962990fbcc699d5ad65035a1a047432a3f languageName: node linkType: hard "@emotion/sheet@npm:^1.2.2": version: 1.2.2 resolution: "@emotion/sheet@npm:1.2.2" - checksum: 69827a1bfa43d7b188f1d8cea42163143a36312543fdade5257c459a2b3efd7ce386aac84ba152bc2517a4f7e54384c04800b26adb382bb284ac7e4ad40e584b + checksum: 10c0/69827a1bfa43d7b188f1d8cea42163143a36312543fdade5257c459a2b3efd7ce386aac84ba152bc2517a4f7e54384c04800b26adb382bb284ac7e4ad40e584b languageName: node linkType: hard @@ -1478,14 +1478,14 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: a168bd7a8a6f254e54a321be4c7b7dd4bf65815e6570ba7c5a435b7d5aeebd76434e04886db7799a955817c8d5bf0103a3dcc3c785fba2bb53922320dda59a10 + checksum: 10c0/a168bd7a8a6f254e54a321be4c7b7dd4bf65815e6570ba7c5a435b7d5aeebd76434e04886db7799a955817c8d5bf0103a3dcc3c785fba2bb53922320dda59a10 languageName: node linkType: hard "@emotion/unitless@npm:^0.8.1": version: 0.8.1 resolution: "@emotion/unitless@npm:0.8.1" - checksum: a1ed508628288f40bfe6dd17d431ed899c067a899fa293a13afe3aed1d70fac0412b8a215fafab0b42829360db687fecd763e5f01a64ddc4a4b58ec3112ff548 + checksum: 10c0/a1ed508628288f40bfe6dd17d431ed899c067a899fa293a13afe3aed1d70fac0412b8a215fafab0b42829360db687fecd763e5f01a64ddc4a4b58ec3112ff548 languageName: node linkType: hard @@ -1494,21 +1494,21 @@ __metadata: resolution: "@emotion/use-insertion-effect-with-fallbacks@npm:1.0.1" peerDependencies: react: ">=16.8.0" - checksum: a15b2167940e3a908160687b73fc4fcd81e59ab45136b6967f02c7c419d9a149acd22a416b325c389642d4f1c3d33cf4196cad6b618128b55b7c74f6807a240b + checksum: 10c0/a15b2167940e3a908160687b73fc4fcd81e59ab45136b6967f02c7c419d9a149acd22a416b325c389642d4f1c3d33cf4196cad6b618128b55b7c74f6807a240b languageName: node linkType: hard "@emotion/utils@npm:^1.2.1": version: 1.2.1 resolution: "@emotion/utils@npm:1.2.1" - checksum: db43ca803361740c14dfb1cca1464d10d27f4c8b40d3e8864e6932ccf375d1450778ff4e4eadee03fb97f2aeb18de9fae98294905596a12ff7d4cd1910414d8d + checksum: 10c0/db43ca803361740c14dfb1cca1464d10d27f4c8b40d3e8864e6932ccf375d1450778ff4e4eadee03fb97f2aeb18de9fae98294905596a12ff7d4cd1910414d8d languageName: node linkType: hard "@emotion/weak-memoize@npm:^0.3.1": version: 0.3.1 resolution: "@emotion/weak-memoize@npm:0.3.1" - checksum: ed514b3cb94bbacece4ac2450d98898066c0a0698bdeda256e312405ca53634cb83c75889b25cd8bbbe185c80f4c05a1f0a0091e1875460ba6be61d0334f0b8a + checksum: 10c0/ed514b3cb94bbacece4ac2450d98898066c0a0698bdeda256e312405ca53634cb83c75889b25cd8bbbe185c80f4c05a1f0a0091e1875460ba6be61d0334f0b8a languageName: node linkType: hard @@ -1673,14 +1673,14 @@ __metadata: eslint-visitor-keys: "npm:^3.3.0" peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: 7e559c4ce59cd3a06b1b5a517b593912e680a7f981ae7affab0d01d709e99cd5647019be8fafa38c350305bc32f1f7d42c7073edde2ab536c745e365f37b607e + checksum: 10c0/7e559c4ce59cd3a06b1b5a517b593912e680a7f981ae7affab0d01d709e99cd5647019be8fafa38c350305bc32f1f7d42c7073edde2ab536c745e365f37b607e languageName: node linkType: hard "@eslint-community/regexpp@npm:^4.5.1, @eslint-community/regexpp@npm:^4.6.1": version: 4.6.2 resolution: "@eslint-community/regexpp@npm:4.6.2" - checksum: da800788298f8419f4c4e04eaa4e3c97e7f57537e822e7b150de662e420e3d437816b863e490807bd0b00e715b0989f9d8864bf54357cbcfa84e4255b910789d + checksum: 10c0/da800788298f8419f4c4e04eaa4e3c97e7f57537e822e7b150de662e420e3d437816b863e490807bd0b00e715b0989f9d8864bf54357cbcfa84e4255b910789d languageName: node linkType: hard @@ -1697,14 +1697,14 @@ __metadata: js-yaml: "npm:^4.1.0" minimatch: "npm:^3.1.2" strip-json-comments: "npm:^3.1.1" - checksum: 32f67052b81768ae876c84569ffd562491ec5a5091b0c1e1ca1e0f3c24fb42f804952fdd0a137873bc64303ba368a71ba079a6f691cee25beee9722d94cc8573 + checksum: 10c0/32f67052b81768ae876c84569ffd562491ec5a5091b0c1e1ca1e0f3c24fb42f804952fdd0a137873bc64303ba368a71ba079a6f691cee25beee9722d94cc8573 languageName: node linkType: hard "@eslint/js@npm:8.56.0": version: 8.56.0 resolution: "@eslint/js@npm:8.56.0" - checksum: 60b3a1cf240e2479cec9742424224465dc50e46d781da1b7f5ef240501b2d1202c225bd456207faac4b34a64f4765833345bc4ddffd00395e1db40fa8c426f5a + checksum: 10c0/60b3a1cf240e2479cec9742424224465dc50e46d781da1b7f5ef240501b2d1202c225bd456207faac4b34a64f4765833345bc4ddffd00395e1db40fa8c426f5a languageName: node linkType: hard @@ -1713,7 +1713,7 @@ __metadata: resolution: "@floating-ui/core@npm:1.6.0" dependencies: "@floating-ui/utils": "npm:^0.2.1" - checksum: 667a68036f7dd5ed19442c7792a6002ca02d1799221c4396691bbe0b6008b48f6ccad581225e81fa266bb91232f6c66838a5f825f554217e1ec886178b93381b + checksum: 10c0/667a68036f7dd5ed19442c7792a6002ca02d1799221c4396691bbe0b6008b48f6ccad581225e81fa266bb91232f6c66838a5f825f554217e1ec886178b93381b languageName: node linkType: hard @@ -1723,11 +1723,11 @@ __metadata: dependencies: "@floating-ui/core": "npm:^1.6.0" "@floating-ui/utils": "npm:^0.2.1" - checksum: f810ab62280e86f5f9199cf7f6123b1dd2a7b44b3b273caa7d3a23cf70ad12c3fb689053e6d3db7acf4f724dbd6d43693e2fc538e5d30d805dcabb9647f8f494 + checksum: 10c0/f810ab62280e86f5f9199cf7f6123b1dd2a7b44b3b273caa7d3a23cf70ad12c3fb689053e6d3db7acf4f724dbd6d43693e2fc538e5d30d805dcabb9647f8f494 languageName: node linkType: hard -"@floating-ui/react-dom@npm:^2.0.6": +"@floating-ui/react-dom@npm:^2.0.8": version: 2.0.8 resolution: "@floating-ui/react-dom@npm:2.0.8" dependencies: @@ -1735,39 +1735,39 @@ __metadata: peerDependencies: react: ">=16.8.0" react-dom: ">=16.8.0" - checksum: 4d87451e2dcc54b4753a0d81181036e47821cfd0d4c23f7e9c31590c7c91fb15fb0a5a458969a5ddabd61601eca5875ebd4e40bff37cee31f373b8f1ccc64518 + checksum: 10c0/4d87451e2dcc54b4753a0d81181036e47821cfd0d4c23f7e9c31590c7c91fb15fb0a5a458969a5ddabd61601eca5875ebd4e40bff37cee31f373b8f1ccc64518 languageName: node linkType: hard "@floating-ui/utils@npm:^0.2.1": version: 0.2.1 resolution: "@floating-ui/utils@npm:0.2.1" - checksum: ee77756712cf5b000c6bacf11992ffb364f3ea2d0d51cc45197a7e646a17aeb86ea4b192c0b42f3fbb29487aee918a565e84f710b8c3645827767f406a6b4cc9 + checksum: 10c0/ee77756712cf5b000c6bacf11992ffb364f3ea2d0d51cc45197a7e646a17aeb86ea4b192c0b42f3fbb29487aee918a565e84f710b8c3645827767f406a6b4cc9 languageName: node linkType: hard "@fontsource-variable/jetbrains-mono@npm:^5.0.19": version: 5.0.19 resolution: "@fontsource-variable/jetbrains-mono@npm:5.0.19" - checksum: 93622a6af324be162f028b974bd61f10530df30a1332dded4915509c0a21d80435ad623fb45325dd175afaa095ca6650f2de9da295b2bc9dea85474050d1a46b + checksum: 10c0/93622a6af324be162f028b974bd61f10530df30a1332dded4915509c0a21d80435ad623fb45325dd175afaa095ca6650f2de9da295b2bc9dea85474050d1a46b languageName: node linkType: hard -"@fontsource-variable/open-sans@npm:^5.0.23": - version: 5.0.23 - resolution: "@fontsource-variable/open-sans@npm:5.0.23" - checksum: d6c3e8981d91f20102f8b8c25b76ee9259496c31e3003b78e2330b1b6c90fdd73151e09e7a8e9431bda840786cd68c6948b4fc3e99f57b1959690ad1eabd8013 +"@fontsource-variable/open-sans@npm:^5.0.25": + version: 5.0.25 + resolution: "@fontsource-variable/open-sans@npm:5.0.25" + checksum: 10c0/12b854d4d4979d9acc94a7625c26832c6ee3f084418fa0e5b09e6046414647fe88f0e1faae9cf726289e2bf10e60bd4d39a665a7c1ba7fe12eab02bcdb99a531 languageName: node linkType: hard -"@hpcc-js/wasm@npm:^2.14.1, @hpcc-js/wasm@npm:^2.15.3": - version: 2.15.3 - resolution: "@hpcc-js/wasm@npm:2.15.3" +"@hpcc-js/wasm@npm:^2.16.0": + version: 2.16.0 + resolution: "@hpcc-js/wasm@npm:2.16.0" dependencies: yargs: "npm:17.7.2" bin: dot-wasm: bin/dot-wasm.js - checksum: 9e4474329f191d93cd4029afe4a5e83732bec732a7c83a913fefe64e08a82deb59dbdc33d42c92e4c8eb4df5853c8cbe10d8d53d7db5204d8c9919af082f64b1 + checksum: 10c0/b9e8d7fe05124aff496c4e417cab9e974b5b7fac0b9d6d58027c2186f30d8c0dcabf71d6c50bff089a98a3c584683725fcd885640b55b623a682f308e26cb507 languageName: node linkType: hard @@ -1778,21 +1778,21 @@ __metadata: "@humanwhocodes/object-schema": "npm:^2.0.1" debug: "npm:^4.1.1" minimatch: "npm:^3.0.5" - checksum: d76ca802d853366094d0e98ff0d0994117fc8eff96649cd357b15e469e428228f597cd2e929d54ab089051684949955f16ee905bb19f7b2f0446fb377157be7a + checksum: 10c0/d76ca802d853366094d0e98ff0d0994117fc8eff96649cd357b15e469e428228f597cd2e929d54ab089051684949955f16ee905bb19f7b2f0446fb377157be7a languageName: node linkType: hard "@humanwhocodes/module-importer@npm:^1.0.1": version: 1.0.1 resolution: "@humanwhocodes/module-importer@npm:1.0.1" - checksum: 909b69c3b86d482c26b3359db16e46a32e0fb30bd306a3c176b8313b9e7313dba0f37f519de6aa8b0a1921349e505f259d19475e123182416a506d7f87e7f529 + checksum: 10c0/909b69c3b86d482c26b3359db16e46a32e0fb30bd306a3c176b8313b9e7313dba0f37f519de6aa8b0a1921349e505f259d19475e123182416a506d7f87e7f529 languageName: node linkType: hard "@humanwhocodes/object-schema@npm:^2.0.1": version: 2.0.1 resolution: "@humanwhocodes/object-schema@npm:2.0.1" - checksum: 9dba24e59fdb4041829d92b693aacb778add3b6f612aaa9c0774f3b650c11a378cc64f042a59da85c11dae33df456580a3c36837b953541aed6ff94294f97fac + checksum: 10c0/9dba24e59fdb4041829d92b693aacb778add3b6f612aaa9c0774f3b650c11a378cc64f042a59da85c11dae33df456580a3c36837b953541aed6ff94294f97fac languageName: node linkType: hard @@ -1806,7 +1806,7 @@ __metadata: strip-ansi-cjs: "npm:strip-ansi@^6.0.1" wrap-ansi: "npm:^8.1.0" wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" - checksum: b1bf42535d49f11dc137f18d5e4e63a28c5569de438a221c369483731e9dac9fb797af554e8bf02b6192d1e5eba6e6402cf93900c3d0ac86391d00d04876789e + checksum: 10c0/b1bf42535d49f11dc137f18d5e4e63a28c5569de438a221c369483731e9dac9fb797af554e8bf02b6192d1e5eba6e6402cf93900c3d0ac86391d00d04876789e languageName: node linkType: hard @@ -1817,21 +1817,21 @@ __metadata: "@jridgewell/set-array": "npm:^1.0.1" "@jridgewell/sourcemap-codec": "npm:^1.4.10" "@jridgewell/trace-mapping": "npm:^0.3.9" - checksum: 82685c8735c63fe388badee45e2970a6bc83eed1c84d46d8652863bafeca22a6c6cc15812f5999a4535366f4668ccc9ba6d5c67dfb72e846fa8a063806f10afd + checksum: 10c0/82685c8735c63fe388badee45e2970a6bc83eed1c84d46d8652863bafeca22a6c6cc15812f5999a4535366f4668ccc9ba6d5c67dfb72e846fa8a063806f10afd languageName: node linkType: hard "@jridgewell/resolve-uri@npm:3.1.0": version: 3.1.0 resolution: "@jridgewell/resolve-uri@npm:3.1.0" - checksum: 78055e2526108331126366572045355051a930f017d1904a4f753d3f4acee8d92a14854948095626f6163cffc24ea4e3efa30637417bb866b84743dec7ef6fd9 + checksum: 10c0/78055e2526108331126366572045355051a930f017d1904a4f753d3f4acee8d92a14854948095626f6163cffc24ea4e3efa30637417bb866b84743dec7ef6fd9 languageName: node linkType: hard "@jridgewell/set-array@npm:^1.0.1": version: 1.1.2 resolution: "@jridgewell/set-array@npm:1.1.2" - checksum: bc7ab4c4c00470de4e7562ecac3c0c84f53e7ee8a711e546d67c47da7febe7c45cd67d4d84ee3c9b2c05ae8e872656cdded8a707a283d30bd54fbc65aef821ab + checksum: 10c0/bc7ab4c4c00470de4e7562ecac3c0c84f53e7ee8a711e546d67c47da7febe7c45cd67d4d84ee3c9b2c05ae8e872656cdded8a707a283d30bd54fbc65aef821ab languageName: node linkType: hard @@ -1841,14 +1841,14 @@ __metadata: dependencies: "@jridgewell/gen-mapping": "npm:^0.3.0" "@jridgewell/trace-mapping": "npm:^0.3.9" - checksum: f341e3ed1e9dfe5ae95201e9e820bee7c0518f20f2831b9964ce6c4bfe59477fb7e3257a45fac193cb4aea0019f0a4f8ed68abb12fd3956610317946f7341e3f + checksum: 10c0/f341e3ed1e9dfe5ae95201e9e820bee7c0518f20f2831b9964ce6c4bfe59477fb7e3257a45fac193cb4aea0019f0a4f8ed68abb12fd3956610317946f7341e3f languageName: node linkType: hard "@jridgewell/sourcemap-codec@npm:1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.10": version: 1.4.14 resolution: "@jridgewell/sourcemap-codec@npm:1.4.14" - checksum: 3fbaff1387c1338b097eeb6ff92890d7838f7de0dde259e4983763b44540bfd5ca6a1f7644dc8ad003a57f7e80670d5b96a8402f1386ba9aee074743ae9bad51 + checksum: 10c0/3fbaff1387c1338b097eeb6ff92890d7838f7de0dde259e4983763b44540bfd5ca6a1f7644dc8ad003a57f7e80670d5b96a8402f1386ba9aee074743ae9bad51 languageName: node linkType: hard @@ -1858,14 +1858,14 @@ __metadata: dependencies: "@jridgewell/resolve-uri": "npm:3.1.0" "@jridgewell/sourcemap-codec": "npm:1.4.14" - checksum: e5045775f076022b6c7cc64a7b55742faa5442301cb3389fd0e6712fafc46a2bb13c68fa1ffaf7b8bb665a91196f050b4115885fc802094ebc06a1cf665935ac + checksum: 10c0/e5045775f076022b6c7cc64a7b55742faa5442301cb3389fd0e6712fafc46a2bb13c68fa1ffaf7b8bb665a91196f050b4115885fc802094ebc06a1cf665935ac languageName: node linkType: hard "@lezer/common@npm:^1.0.0, @lezer/common@npm:^1.1.0, @lezer/common@npm:^1.2.1": version: 1.2.1 resolution: "@lezer/common@npm:1.2.1" - checksum: af61436dc026f8deebaded13d8e1beea2ae307cbbfb270116cdedadb8208f0674da9c3b5963128a2b1cd4072b4e90bc8128133f4feaf31b6e801e4568f1a15a6 + checksum: 10c0/af61436dc026f8deebaded13d8e1beea2ae307cbbfb270116cdedadb8208f0674da9c3b5963128a2b1cd4072b4e90bc8128133f4feaf31b6e801e4568f1a15a6 languageName: node linkType: hard @@ -1877,7 +1877,7 @@ __metadata: "@lezer/lr": "npm:^1.3.0" bin: lezer-generator: src/lezer-generator.cjs - checksum: 252291af9efef025aeacce8e084a75e1354a9ad78547ae10961797a334243c74f088f46e567f9109cc9366dbefc5faec75a172d079628d27a42ee96cf92a68ab + checksum: 10c0/252291af9efef025aeacce8e084a75e1354a9ad78547ae10961797a334243c74f088f46e567f9109cc9366dbefc5faec75a172d079628d27a42ee96cf92a68ab languageName: node linkType: hard @@ -1886,7 +1886,7 @@ __metadata: resolution: "@lezer/highlight@npm:1.2.0" dependencies: "@lezer/common": "npm:^1.0.0" - checksum: d4312f95b78e4b6f10833b1cf99601c6381c22b755bbf60fd61d6fe9b4cf7780650e2e2dadf75beb8d94824dcb5ec81da5cfc9ca54122688a482e488103105aa + checksum: 10c0/d4312f95b78e4b6f10833b1cf99601c6381c22b755bbf60fd61d6fe9b4cf7780650e2e2dadf75beb8d94824dcb5ec81da5cfc9ca54122688a482e488103105aa languageName: node linkType: hard @@ -1895,25 +1895,25 @@ __metadata: resolution: "@lezer/lr@npm:1.4.0" dependencies: "@lezer/common": "npm:^1.0.0" - checksum: 1e3af297cc142bb6676cb3c4e1bd310da2e93b53273cf745dc85d839a08e1d3cbbd67e0fc0322a480cf25ee215fefe967c53bc2af3ddf5d9b1bf267081dfa164 + checksum: 10c0/1e3af297cc142bb6676cb3c4e1bd310da2e93b53273cf745dc85d839a08e1d3cbbd67e0fc0322a480cf25ee215fefe967c53bc2af3ddf5d9b1bf267081dfa164 languageName: node linkType: hard "@material-icons/svg@npm:^1.0.33": version: 1.0.33 resolution: "@material-icons/svg@npm:1.0.33" - checksum: 5205b710f90283d5184ad542b05d84d0a4ba494daddc3de68de92d81ac09548a64e417d64502eb30537c19a5aff758e227b352faa86a2944c5388712b63e09e7 + checksum: 10c0/5205b710f90283d5184ad542b05d84d0a4ba494daddc3de68de92d81ac09548a64e417d64502eb30537c19a5aff758e227b352faa86a2944c5388712b63e09e7 languageName: node linkType: hard -"@mui/base@npm:5.0.0-beta.33": - version: 5.0.0-beta.33 - resolution: "@mui/base@npm:5.0.0-beta.33" +"@mui/base@npm:5.0.0-beta.36": + version: 5.0.0-beta.36 + resolution: "@mui/base@npm:5.0.0-beta.36" dependencies: - "@babel/runtime": "npm:^7.23.8" - "@floating-ui/react-dom": "npm:^2.0.6" + "@babel/runtime": "npm:^7.23.9" + "@floating-ui/react-dom": "npm:^2.0.8" "@mui/types": "npm:^7.2.13" - "@mui/utils": "npm:^5.15.6" + "@mui/utils": "npm:^5.15.9" "@popperjs/core": "npm:^2.11.8" clsx: "npm:^2.1.0" prop-types: "npm:^15.8.1" @@ -1924,22 +1924,22 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 397f2ccb3943545debf99bee68f75bf27b3e3146a44450bbe43d554cc23e422cc9b07e69584c61c5f24ac9e6c6dca4cbab50b89d0cbcd02e0d8d57b83759fa98 + checksum: 10c0/b789cd9e6906d56698bb5536704aefa475283081f1287b8340bb74dea4465565f7958c5e61bbc000f0d2a8e97aaf95a203f35cc737115e3edc7ea389da3d9c9e languageName: node linkType: hard -"@mui/core-downloads-tracker@npm:^5.15.6": - version: 5.15.6 - resolution: "@mui/core-downloads-tracker@npm:5.15.6" - checksum: 62d3491755b568c2fdbe1eb73603df58e713c4267db0d71a86629d3e6b101b0733f5aefcadb03580b1e95e50c440d73eb271533112d3ab814de1651768cc5354 +"@mui/core-downloads-tracker@npm:^5.15.10": + version: 5.15.10 + resolution: "@mui/core-downloads-tracker@npm:5.15.10" + checksum: 10c0/d05da33eb3532994aa0b71e8131c8c21b4c6256976bfa704b2268c2bd88ae2c6853b0832c2af904507820e56563d373020827310abd626e146e026200b76eacf languageName: node linkType: hard -"@mui/icons-material@npm:^5.15.6": - version: 5.15.6 - resolution: "@mui/icons-material@npm:5.15.6" +"@mui/icons-material@npm:^5.15.10": + version: 5.15.10 + resolution: "@mui/icons-material@npm:5.15.10" dependencies: - "@babel/runtime": "npm:^7.23.8" + "@babel/runtime": "npm:^7.23.9" peerDependencies: "@mui/material": ^5.0.0 "@types/react": ^17.0.0 || ^18.0.0 @@ -1947,23 +1947,23 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 9d3a9806dc1c578f5809b60022be1806b003a7f4c9d415e1f7531486d931c54f39b3750102c505379694be8ec6d22b49a51610b07a97d611b31f978bb4cd8fe7 + checksum: 10c0/d49747d962ad9dec172d498173ee60fe29f3c818d15458fdc21b5d7a1cfa3a5acf8c6f3e6e35c665a3b0f4a088ac6806601c0d408403117f6711740448db4346 languageName: node linkType: hard -"@mui/material@npm:^5.15.6": - version: 5.15.6 - resolution: "@mui/material@npm:5.15.6" +"@mui/material@npm:^5.15.10": + version: 5.15.10 + resolution: "@mui/material@npm:5.15.10" dependencies: - "@babel/runtime": "npm:^7.23.8" - "@mui/base": "npm:5.0.0-beta.33" - "@mui/core-downloads-tracker": "npm:^5.15.6" - "@mui/system": "npm:^5.15.6" + "@babel/runtime": "npm:^7.23.9" + "@mui/base": "npm:5.0.0-beta.36" + "@mui/core-downloads-tracker": "npm:^5.15.10" + "@mui/system": "npm:^5.15.9" "@mui/types": "npm:^7.2.13" - "@mui/utils": "npm:^5.15.6" + "@mui/utils": "npm:^5.15.9" "@types/react-transition-group": "npm:^4.4.10" clsx: "npm:^2.1.0" - csstype: "npm:^3.1.2" + csstype: "npm:^3.1.3" prop-types: "npm:^15.8.1" react-is: "npm:^18.2.0" react-transition-group: "npm:^4.4.5" @@ -1980,16 +1980,16 @@ __metadata: optional: true "@types/react": optional: true - checksum: 991791c38776d9ce25d475a23dd25bbfc5055e7d7db1d390df5637a5312f77fea342cbafccb54d55d6419c50022111ed78d24a84d2b6e3bbdaff49898c477f68 + checksum: 10c0/057147a7f68269641954dd456852a801c71fe10cc1dee7c4d669e8327a792ac2dee4083c4562b918a3696276a9035ba2a5b1b5261dc7f1a385711b938ae508fe languageName: node linkType: hard -"@mui/private-theming@npm:^5.15.6": - version: 5.15.6 - resolution: "@mui/private-theming@npm:5.15.6" +"@mui/private-theming@npm:^5.15.9": + version: 5.15.9 + resolution: "@mui/private-theming@npm:5.15.9" dependencies: - "@babel/runtime": "npm:^7.23.8" - "@mui/utils": "npm:^5.15.6" + "@babel/runtime": "npm:^7.23.9" + "@mui/utils": "npm:^5.15.9" prop-types: "npm:^15.8.1" peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 @@ -1997,17 +1997,17 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 812496bf92974ecdfabe9b24f67d1f4958066555661f12db6acf4aba97b7e1e4c7b01d012f409b755f08286bf0a4f8367a3ec68dbe70fbd33b00008b852b125b + checksum: 10c0/a5c995b7f2faa9aa39ccf258bc2cafde9a8c265dd15bfbaec974650690d81d662eaae0524f0f8e17d16fe7893a6907cc0c388ac5648cce7b502a77d722daa116 languageName: node linkType: hard -"@mui/styled-engine@npm:^5.15.6": - version: 5.15.6 - resolution: "@mui/styled-engine@npm:5.15.6" +"@mui/styled-engine@npm:^5.15.9": + version: 5.15.9 + resolution: "@mui/styled-engine@npm:5.15.9" dependencies: - "@babel/runtime": "npm:^7.23.8" + "@babel/runtime": "npm:^7.23.9" "@emotion/cache": "npm:^11.11.0" - csstype: "npm:^3.1.2" + csstype: "npm:^3.1.3" prop-types: "npm:^15.8.1" peerDependencies: "@emotion/react": ^11.4.1 @@ -2018,21 +2018,21 @@ __metadata: optional: true "@emotion/styled": optional: true - checksum: 0242f417f1d758cf72c5903c94235030bdc4f07aa793dd986c031975e4d5ba16c0f15c5c87245b5ebd86028998a494f55733cfa9db26ba5cc74f4a73b5f62804 + checksum: 10c0/47968ec55a5a36936dc8c245c1d62fe9be82bdaba800aeea08d111702b3aea8388bc3c2a46ee4ee315efe77b1c7ecf63308fc518afa69114b2fc90a203de48e0 languageName: node linkType: hard -"@mui/system@npm:^5.15.6": - version: 5.15.6 - resolution: "@mui/system@npm:5.15.6" +"@mui/system@npm:^5.15.9": + version: 5.15.9 + resolution: "@mui/system@npm:5.15.9" dependencies: - "@babel/runtime": "npm:^7.23.8" - "@mui/private-theming": "npm:^5.15.6" - "@mui/styled-engine": "npm:^5.15.6" + "@babel/runtime": "npm:^7.23.9" + "@mui/private-theming": "npm:^5.15.9" + "@mui/styled-engine": "npm:^5.15.9" "@mui/types": "npm:^7.2.13" - "@mui/utils": "npm:^5.15.6" + "@mui/utils": "npm:^5.15.9" clsx: "npm:^2.1.0" - csstype: "npm:^3.1.2" + csstype: "npm:^3.1.3" prop-types: "npm:^15.8.1" peerDependencies: "@emotion/react": ^11.5.0 @@ -2046,7 +2046,7 @@ __metadata: optional: true "@types/react": optional: true - checksum: 1d9a10c0dee768773c254daca2971dc51989f5124c8979e732f8819412df511d753e2ddb3eda71452e49e820a64cabe5dd674e8b080ae2cbe56a5a173ae2cc09 + checksum: 10c0/187a14e689be1434c7db646f2f0f19c5fe60eb565dd0fa2d0a7b903240fd36ccdd3a5d2318630a9e0186036ef61fbebd58a9ef752f7b9b329660614ddbdf37f1 languageName: node linkType: hard @@ -2058,15 +2058,15 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 4d0014cabf9efda8cfcbdcb01435af7e678c60cf73f808da857c50a795d3b9943a1209d6501a9be173ce692cd8739803b0857166969206eceefeafe1aa8a5d3a + checksum: 10c0/4d0014cabf9efda8cfcbdcb01435af7e678c60cf73f808da857c50a795d3b9943a1209d6501a9be173ce692cd8739803b0857166969206eceefeafe1aa8a5d3a languageName: node linkType: hard -"@mui/utils@npm:^5.14.16, @mui/utils@npm:^5.15.6": - version: 5.15.6 - resolution: "@mui/utils@npm:5.15.6" +"@mui/utils@npm:^5.14.16, @mui/utils@npm:^5.15.9": + version: 5.15.9 + resolution: "@mui/utils@npm:5.15.9" dependencies: - "@babel/runtime": "npm:^7.23.8" + "@babel/runtime": "npm:^7.23.9" "@types/prop-types": "npm:^15.7.11" prop-types: "npm:^15.8.1" react-is: "npm:^18.2.0" @@ -2076,13 +2076,13 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 030d5c6a569caf2bd5f2652764343201d5ddb3a858d666a0a2b1903e0bb43de57be1b50f7a32be5ef23d283044eee25cebc84bbd2ba527effdc8af5dc76c7e6e + checksum: 10c0/42d3db7f73f47ad719b8a4769eac2aeaec683166c953e67518f6edb7d14464576daf6566619a384f5f7e48dcb1478053ff3e4ce1be244fd332f7e988da9e1401 languageName: node linkType: hard -"@mui/x-data-grid@npm:^6.19.2": - version: 6.19.2 - resolution: "@mui/x-data-grid@npm:6.19.2" +"@mui/x-data-grid@npm:^6.19.4": + version: 6.19.4 + resolution: "@mui/x-data-grid@npm:6.19.4" dependencies: "@babel/runtime": "npm:^7.23.2" "@mui/utils": "npm:^5.14.16" @@ -2094,7 +2094,7 @@ __metadata: "@mui/system": ^5.4.1 react: ^17.0.0 || ^18.0.0 react-dom: ^17.0.0 || ^18.0.0 - checksum: b9c8c7c03de70b7e6c03f7269230753b424f6d5966acda342988b5d0d58ce2a6c7b9ddcb17c2ff0e8be6bcb887d42fad9494d7efa3294b7c96fb1ae679bc13cd + checksum: 10c0/2de403c7cadb9c34baed609afc500288c927518abf70f362eb8a45ac6161497aebb9f3b13e72e0192a6deb508c0db2ffb13d8ae09cece2e52490bd2b956179ed languageName: node linkType: hard @@ -2104,14 +2104,14 @@ __metadata: dependencies: "@nodelib/fs.stat": "npm:2.0.5" run-parallel: "npm:^1.1.9" - checksum: 732c3b6d1b1e967440e65f284bd06e5821fedf10a1bea9ed2bb75956ea1f30e08c44d3def9d6a230666574edbaf136f8cfd319c14fd1f87c66e6a44449afb2eb + checksum: 10c0/732c3b6d1b1e967440e65f284bd06e5821fedf10a1bea9ed2bb75956ea1f30e08c44d3def9d6a230666574edbaf136f8cfd319c14fd1f87c66e6a44449afb2eb languageName: node linkType: hard "@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": version: 2.0.5 resolution: "@nodelib/fs.stat@npm:2.0.5" - checksum: 88dafe5e3e29a388b07264680dc996c17f4bda48d163a9d4f5c1112979f0ce8ec72aa7116122c350b4e7976bc5566dc3ddb579be1ceaacc727872eb4ed93926d + checksum: 10c0/88dafe5e3e29a388b07264680dc996c17f4bda48d163a9d4f5c1112979f0ce8ec72aa7116122c350b4e7976bc5566dc3ddb579be1ceaacc727872eb4ed93926d languageName: node linkType: hard @@ -2121,7 +2121,7 @@ __metadata: dependencies: "@nodelib/fs.scandir": "npm:2.1.5" fastq: "npm:^1.6.0" - checksum: db9de047c3bb9b51f9335a7bb46f4fcfb6829fb628318c12115fbaf7d369bfce71c15b103d1fc3b464812d936220ee9bc1c8f762d032c9f6be9acc99249095b1 + checksum: 10c0/db9de047c3bb9b51f9335a7bb46f4fcfb6829fb628318c12115fbaf7d369bfce71c15b103d1fc3b464812d936220ee9bc1c8f762d032c9f6be9acc99249095b1 languageName: node linkType: hard @@ -2130,28 +2130,28 @@ __metadata: resolution: "@npmcli/fs@npm:3.1.0" dependencies: semver: "npm:^7.3.5" - checksum: 162b4a0b8705cd6f5c2470b851d1dc6cd228c86d2170e1769d738c1fbb69a87160901411c3c035331e9e99db72f1f1099a8b734bf1637cc32b9a5be1660e4e1e + checksum: 10c0/162b4a0b8705cd6f5c2470b851d1dc6cd228c86d2170e1769d738c1fbb69a87160901411c3c035331e9e99db72f1f1099a8b734bf1637cc32b9a5be1660e4e1e languageName: node linkType: hard "@pkgjs/parseargs@npm:^0.11.0": version: 0.11.0 resolution: "@pkgjs/parseargs@npm:0.11.0" - checksum: 5bd7576bb1b38a47a7fc7b51ac9f38748e772beebc56200450c4a817d712232b8f1d3ef70532c80840243c657d491cf6a6be1e3a214cff907645819fdc34aadd + checksum: 10c0/5bd7576bb1b38a47a7fc7b51ac9f38748e772beebc56200450c4a817d712232b8f1d3ef70532c80840243c657d491cf6a6be1e3a214cff907645819fdc34aadd languageName: node linkType: hard "@pkgr/core@npm:^0.1.0": version: 0.1.0 resolution: "@pkgr/core@npm:0.1.0" - checksum: 8f4a0aa6cc1c445fec4f5f12157047e8a05e30b5c03441156f40203d6430f84d15135e8f1a6886e6c9800ff0e4a75d9d3419a43dbcd7490683f2882375a3b99a + checksum: 10c0/8f4a0aa6cc1c445fec4f5f12157047e8a05e30b5c03441156f40203d6430f84d15135e8f1a6886e6c9800ff0e4a75d9d3419a43dbcd7490683f2882375a3b99a languageName: node linkType: hard "@popperjs/core@npm:^2.11.8": version: 2.11.8 resolution: "@popperjs/core@npm:2.11.8" - checksum: 4681e682abc006d25eb380d0cf3efc7557043f53b6aea7a5057d0d1e7df849a00e281cd8ea79c902a35a414d7919621fc2ba293ecec05f413598e0b23d5a1e63 + checksum: 10c0/4681e682abc006d25eb380d0cf3efc7557043f53b6aea7a5057d0d1e7df849a00e281cd8ea79c902a35a414d7919621fc2ba293ecec05f413598e0b23d5a1e63 languageName: node linkType: hard @@ -2161,25 +2161,25 @@ __metadata: dependencies: "@codemirror/autocomplete": "npm:^6.12.0" "@codemirror/commands": "npm:^6.3.3" - "@codemirror/language": "npm:^6.10.0" - "@codemirror/lint": "npm:^6.4.2" - "@codemirror/search": "npm:^6.5.5" + "@codemirror/language": "npm:^6.10.1" + "@codemirror/lint": "npm:^6.5.0" + "@codemirror/search": "npm:^6.5.6" "@codemirror/state": "npm:^6.4.0" - "@codemirror/view": "npm:^6.23.1" + "@codemirror/view": "npm:^6.24.0" "@emotion/react": "npm:^11.11.3" "@emotion/styled": "npm:^11.11.0" "@fontsource-variable/jetbrains-mono": "npm:^5.0.19" - "@fontsource-variable/open-sans": "npm:^5.0.23" - "@hpcc-js/wasm": "npm:^2.15.3" + "@fontsource-variable/open-sans": "npm:^5.0.25" + "@hpcc-js/wasm": "npm:^2.16.0" "@lezer/common": "npm:^1.2.1" "@lezer/generator": "npm:^1.6.0" "@lezer/highlight": "npm:^1.2.0" "@lezer/lr": "npm:^1.4.0" "@material-icons/svg": "npm:^1.0.33" - "@mui/icons-material": "npm:^5.15.6" - "@mui/material": "npm:^5.15.6" - "@mui/system": "npm:^5.15.6" - "@mui/x-data-grid": "npm:^6.19.2" + "@mui/icons-material": "npm:^5.15.10" + "@mui/material": "npm:^5.15.10" + "@mui/system": "npm:^5.15.9" + "@mui/x-data-grid": "npm:^6.19.4" "@types/d3": "npm:^7.4.3" "@types/d3-graphviz": "npm:^2.6.10" "@types/d3-selection": "npm:^3.0.10" @@ -2189,19 +2189,19 @@ __metadata: "@types/lodash-es": "npm:^4.17.12" "@types/micromatch": "npm:^4.0.6" "@types/ms": "npm:^0.7.34" - "@types/node": "npm:^20.11.10" + "@types/node": "npm:^20.11.19" "@types/pnpapi": "npm:^0.0.5" - "@types/react": "npm:^18.2.48" - "@types/react-dom": "npm:^18.2.18" - "@typescript-eslint/eslint-plugin": "npm:^6.20.0" - "@typescript-eslint/parser": "npm:^6.20.0" - "@vitejs/plugin-react-swc": "npm:^3.5.0" + "@types/react": "npm:^18.2.56" + "@types/react-dom": "npm:^18.2.19" + "@typescript-eslint/eslint-plugin": "npm:^6.21.0" + "@typescript-eslint/parser": "npm:^6.21.0" + "@vitejs/plugin-react-swc": "npm:^3.6.0" "@xstate/cli": "npm:^0.5.17" ansi-styles: "npm:^6.2.1" cross-env: "npm:^7.0.3" csstype: "npm:^3.1.3" d3: "npm:^7.8.5" - d3-graphviz: "patch:d3-graphviz@npm%3A5.2.0#~/.yarn/patches/d3-graphviz-npm-5.2.0-161b1fbad4.patch" + d3-graphviz: "patch:d3-graphviz@npm%3A5.3.0#~/.yarn/patches/d3-graphviz-npm-5.3.0-e0eace978a.patch" d3-selection: "npm:^3.0.0" d3-zoom: "patch:d3-zoom@npm%3A3.0.0#~/.yarn/patches/d3-zoom-npm-3.0.0-18f706a421.patch" escape-string-regexp: "npm:^5.0.0" @@ -2224,16 +2224,16 @@ __metadata: mobx: "npm:^6.12.0" mobx-react-lite: "npm:^4.0.5" ms: "npm:^2.1.3" - nanoid: "npm:^5.0.4" + nanoid: "npm:^5.0.5" notistack: "npm:^3.0.1" pnpapi: "npm:^0.0.0" - prettier: "npm:^3.2.4" + prettier: "npm:^3.2.5" react: "npm:^18.2.0" react-dom: "npm:^18.2.0" react-resize-detector: "npm:^10.0.1" typescript: "npm:5.3.3" - vite: "npm:^5.0.12" - vite-plugin-pwa: "npm:^0.17.5" + vite: "npm:^5.1.3" + vite-plugin-pwa: "npm:^0.19.0" workbox-window: "npm:^7.0.0" xstate: "npm:^4.38.3" zod: "npm:^3.22.4" @@ -2262,7 +2262,7 @@ __metadata: peerDependenciesMeta: "@types/babel__core": optional: true - checksum: 2766134dd5567c0d4fd6909d1f511ce9bf3bd9d727e1bc5ffdd6097a3606faca324107ae8e0961839ee4dbb45e5e579ae601efe472fc0a271259aea79920cafa + checksum: 10c0/2766134dd5567c0d4fd6909d1f511ce9bf3bd9d727e1bc5ffdd6097a3606faca324107ae8e0961839ee4dbb45e5e579ae601efe472fc0a271259aea79920cafa languageName: node linkType: hard @@ -2278,7 +2278,7 @@ __metadata: resolve: "npm:^1.19.0" peerDependencies: rollup: ^1.20.0||^2.0.0 - checksum: a8226b01352ee1f7133b1b59b3906267e11c99020a55e3b7a313e03889f790d1cd94e7f7769d3963261e897c3265082533ba595976f8e3f08cf70aa88bf1ddd7 + checksum: 10c0/a8226b01352ee1f7133b1b59b3906267e11c99020a55e3b7a313e03889f790d1cd94e7f7769d3963261e897c3265082533ba595976f8e3f08cf70aa88bf1ddd7 languageName: node linkType: hard @@ -2290,7 +2290,7 @@ __metadata: magic-string: "npm:^0.25.7" peerDependencies: rollup: ^1.20.0 || ^2.0.0 - checksum: ea3d27291c791661638b91809d0247dde1ee71be0b16fa7060078c2700db3669eada2c3978ea979b917b29ebe06f3fddc8797feae554da966264a22142b5771a + checksum: 10c0/ea3d27291c791661638b91809d0247dde1ee71be0b16fa7060078c2700db3669eada2c3978ea979b917b29ebe06f3fddc8797feae554da966264a22142b5771a languageName: node linkType: hard @@ -2303,7 +2303,7 @@ __metadata: picomatch: "npm:^2.2.2" peerDependencies: rollup: ^1.20.0||^2.0.0 - checksum: 7151753160d15ba2b259461a6c25b3932150994ea52dba8fd3144f634c7647c2e56733d986e2c15de67c4d96a9ee7d6278efa6d2e626a7169898fd64adc0f90c + checksum: 10c0/7151753160d15ba2b259461a6c25b3932150994ea52dba8fd3144f634c7647c2e56733d986e2c15de67c4d96a9ee7d6278efa6d2e626a7169898fd64adc0f90c languageName: node linkType: hard @@ -2399,95 +2399,95 @@ __metadata: json5: "npm:^2.2.0" magic-string: "npm:^0.25.0" string.prototype.matchall: "npm:^4.0.6" - checksum: 4f36a7488cdae2907053a48231430e8e9aa8f1903a96131bf8325786afba3224011f9120164cae75043558bd051881050b071958388fe477927d340b1cc1a066 + checksum: 10c0/4f36a7488cdae2907053a48231430e8e9aa8f1903a96131bf8325786afba3224011f9120164cae75043558bd051881050b071958388fe477927d340b1cc1a066 languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.3.96": - version: 1.3.96 - resolution: "@swc/core-darwin-arm64@npm:1.3.96" +"@swc/core-darwin-arm64@npm:1.4.1": + version: 1.4.1 + resolution: "@swc/core-darwin-arm64@npm:1.4.1" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.3.96": - version: 1.3.96 - resolution: "@swc/core-darwin-x64@npm:1.3.96" +"@swc/core-darwin-x64@npm:1.4.1": + version: 1.4.1 + resolution: "@swc/core-darwin-x64@npm:1.4.1" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.3.96": - version: 1.3.96 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.96" +"@swc/core-linux-arm-gnueabihf@npm:1.4.1": + version: 1.4.1 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.4.1" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.3.96": - version: 1.3.96 - resolution: "@swc/core-linux-arm64-gnu@npm:1.3.96" +"@swc/core-linux-arm64-gnu@npm:1.4.1": + version: 1.4.1 + resolution: "@swc/core-linux-arm64-gnu@npm:1.4.1" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.3.96": - version: 1.3.96 - resolution: "@swc/core-linux-arm64-musl@npm:1.3.96" +"@swc/core-linux-arm64-musl@npm:1.4.1": + version: 1.4.1 + resolution: "@swc/core-linux-arm64-musl@npm:1.4.1" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.3.96": - version: 1.3.96 - resolution: "@swc/core-linux-x64-gnu@npm:1.3.96" +"@swc/core-linux-x64-gnu@npm:1.4.1": + version: 1.4.1 + resolution: "@swc/core-linux-x64-gnu@npm:1.4.1" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.3.96": - version: 1.3.96 - resolution: "@swc/core-linux-x64-musl@npm:1.3.96" +"@swc/core-linux-x64-musl@npm:1.4.1": + version: 1.4.1 + resolution: "@swc/core-linux-x64-musl@npm:1.4.1" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.3.96": - version: 1.3.96 - resolution: "@swc/core-win32-arm64-msvc@npm:1.3.96" +"@swc/core-win32-arm64-msvc@npm:1.4.1": + version: 1.4.1 + resolution: "@swc/core-win32-arm64-msvc@npm:1.4.1" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.3.96": - version: 1.3.96 - resolution: "@swc/core-win32-ia32-msvc@npm:1.3.96" +"@swc/core-win32-ia32-msvc@npm:1.4.1": + version: 1.4.1 + resolution: "@swc/core-win32-ia32-msvc@npm:1.4.1" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.3.96": - version: 1.3.96 - resolution: "@swc/core-win32-x64-msvc@npm:1.3.96" +"@swc/core-win32-x64-msvc@npm:1.4.1": + version: 1.4.1 + resolution: "@swc/core-win32-x64-msvc@npm:1.4.1" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@swc/core@npm:^1.3.96": - version: 1.3.96 - resolution: "@swc/core@npm:1.3.96" - dependencies: - "@swc/core-darwin-arm64": "npm:1.3.96" - "@swc/core-darwin-x64": "npm:1.3.96" - "@swc/core-linux-arm-gnueabihf": "npm:1.3.96" - "@swc/core-linux-arm64-gnu": "npm:1.3.96" - "@swc/core-linux-arm64-musl": "npm:1.3.96" - "@swc/core-linux-x64-gnu": "npm:1.3.96" - "@swc/core-linux-x64-musl": "npm:1.3.96" - "@swc/core-win32-arm64-msvc": "npm:1.3.96" - "@swc/core-win32-ia32-msvc": "npm:1.3.96" - "@swc/core-win32-x64-msvc": "npm:1.3.96" - "@swc/counter": "npm:^0.1.1" +"@swc/core@npm:^1.3.107": + version: 1.4.1 + resolution: "@swc/core@npm:1.4.1" + dependencies: + "@swc/core-darwin-arm64": "npm:1.4.1" + "@swc/core-darwin-x64": "npm:1.4.1" + "@swc/core-linux-arm-gnueabihf": "npm:1.4.1" + "@swc/core-linux-arm64-gnu": "npm:1.4.1" + "@swc/core-linux-arm64-musl": "npm:1.4.1" + "@swc/core-linux-x64-gnu": "npm:1.4.1" + "@swc/core-linux-x64-musl": "npm:1.4.1" + "@swc/core-win32-arm64-msvc": "npm:1.4.1" + "@swc/core-win32-ia32-msvc": "npm:1.4.1" + "@swc/core-win32-x64-msvc": "npm:1.4.1" + "@swc/counter": "npm:^0.1.2" "@swc/types": "npm:^0.1.5" peerDependencies: "@swc/helpers": ^0.5.0 @@ -2515,42 +2515,42 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: 273d4894d9f62b72a3f4e84d351bc426ba33055bb2fd38f743777c5ac802365bf61dec2e12552252fbdb705c96dd9688534740e23746ddb98a59b4e45af64369 + checksum: 10c0/ff5ac47c6a6b925292b82a98aefbf518dae6bb69300ff8aa231e10f0b4f68b346cbfce9a8dbe177119d43bdbf5bc7b0aaee8cc49d47385197bef8317df4c015c languageName: node linkType: hard -"@swc/counter@npm:^0.1.1": - version: 0.1.2 - resolution: "@swc/counter@npm:0.1.2" - checksum: 18be012107d4ba1f79776c48d83391ca2159103d7d31a59ff52fcc8024db51b71c5f46714a9fb73981739bc8a38dc6f385a046b71cc08f6043f3c47f5c409eab +"@swc/counter@npm:^0.1.2": + version: 0.1.3 + resolution: "@swc/counter@npm:0.1.3" + checksum: 10c0/8424f60f6bf8694cfd2a9bca45845bce29f26105cda8cf19cdb9fd3e78dc6338699e4db77a89ae449260bafa1cc6bec307e81e7fb96dbf7dcfce0eea55151356 languageName: node linkType: hard "@swc/types@npm:^0.1.5": version: 0.1.5 resolution: "@swc/types@npm:0.1.5" - checksum: b35f93fe896a2240f6f10544e408f9648c2bd4bcff9bd8d022d9a6942d31cf859f86119fb0bbb04a12eefa1f6a6745ffc7d18f3a490d76d7b6a074a7c9608144 + checksum: 10c0/b35f93fe896a2240f6f10544e408f9648c2bd4bcff9bd8d022d9a6942d31cf859f86119fb0bbb04a12eefa1f6a6745ffc7d18f3a490d76d7b6a074a7c9608144 languageName: node linkType: hard "@tootallnate/once@npm:2": version: 2.0.0 resolution: "@tootallnate/once@npm:2.0.0" - checksum: 073bfa548026b1ebaf1659eb8961e526be22fa77139b10d60e712f46d2f0f05f4e6c8bec62a087d41088ee9e29faa7f54838568e475ab2f776171003c3920858 + checksum: 10c0/073bfa548026b1ebaf1659eb8961e526be22fa77139b10d60e712f46d2f0f05f4e6c8bec62a087d41088ee9e29faa7f54838568e475ab2f776171003c3920858 languageName: node linkType: hard "@types/braces@npm:*": version: 3.0.1 resolution: "@types/braces@npm:3.0.1" - checksum: 2052cf78c7378ceb692b823f743ac3a838b05f4c27f6eba3e5b6e298fd11d64322b1c7be1fa0eb53d99d9c6049202bf16a88ec1f40ebfd09e086b54eb69ff767 + checksum: 10c0/2052cf78c7378ceb692b823f743ac3a838b05f4c27f6eba3e5b6e298fd11d64322b1c7be1fa0eb53d99d9c6049202bf16a88ec1f40ebfd09e086b54eb69ff767 languageName: node linkType: hard "@types/d3-array@npm:*": version: 3.0.5 resolution: "@types/d3-array@npm:3.0.5" - checksum: 145c61ffc88af9ac550d924e2d13a8b6fc95011989662500848e2df2214e7b3e19decaf7e95238a2c5460053137227360ccd00f6859c4ecb2508a807338ab957 + checksum: 10c0/145c61ffc88af9ac550d924e2d13a8b6fc95011989662500848e2df2214e7b3e19decaf7e95238a2c5460053137227360ccd00f6859c4ecb2508a807338ab957 languageName: node linkType: hard @@ -2559,7 +2559,7 @@ __metadata: resolution: "@types/d3-axis@npm:3.0.2" dependencies: "@types/d3-selection": "npm:*" - checksum: 3efaca6b227fff21eea654b980952e7315dbe5822956d48c6c6047a815adf100b31a901c1cd0e089067f8a409abae2728cfcb81b9da28c02aee96b009237d6e7 + checksum: 10c0/3efaca6b227fff21eea654b980952e7315dbe5822956d48c6c6047a815adf100b31a901c1cd0e089067f8a409abae2728cfcb81b9da28c02aee96b009237d6e7 languageName: node linkType: hard @@ -2568,28 +2568,28 @@ __metadata: resolution: "@types/d3-brush@npm:3.0.2" dependencies: "@types/d3-selection": "npm:*" - checksum: 8ddc4978fd5ef637ddc459a7a26b2b14e59a19cb2c541904ec17005e6d3fc3cea426598b8dd08ca154dc1cf0fe466fef3bf344b3b5bc2d9591d48783f8e76a96 + checksum: 10c0/8ddc4978fd5ef637ddc459a7a26b2b14e59a19cb2c541904ec17005e6d3fc3cea426598b8dd08ca154dc1cf0fe466fef3bf344b3b5bc2d9591d48783f8e76a96 languageName: node linkType: hard "@types/d3-chord@npm:*": version: 3.0.2 resolution: "@types/d3-chord@npm:3.0.2" - checksum: e354f29b261d4ff9546e52e1c3e315e62407a8ead85c82bd7e4efb277e89898ae2fa1a7740589e15d32677d76c826a596b198d374749e27598f9d3dec0055d7f + checksum: 10c0/e354f29b261d4ff9546e52e1c3e315e62407a8ead85c82bd7e4efb277e89898ae2fa1a7740589e15d32677d76c826a596b198d374749e27598f9d3dec0055d7f languageName: node linkType: hard "@types/d3-color@npm:*": version: 3.1.0 resolution: "@types/d3-color@npm:3.1.0" - checksum: 5b4be21b4b025da9ffd0cef876fb7d82f99116fa26e7ee3449771faf0a953d160246b1ceb2a9bbc7d131e32ab60d7d19013131d098616369a56f9880f25f20ef + checksum: 10c0/5b4be21b4b025da9ffd0cef876fb7d82f99116fa26e7ee3449771faf0a953d160246b1ceb2a9bbc7d131e32ab60d7d19013131d098616369a56f9880f25f20ef languageName: node linkType: hard "@types/d3-color@npm:^1": version: 1.4.2 resolution: "@types/d3-color@npm:1.4.2" - checksum: f1c70d7deabe2b30e337361c3fa26b7ce4e9c875dfd1ad75e17379c6a5596f116fb21ca0e595c2f2220e04866bca6bdb2623e772cfb5f8bf4d20ffe6ba5c72ab + checksum: 10c0/f1c70d7deabe2b30e337361c3fa26b7ce4e9c875dfd1ad75e17379c6a5596f116fb21ca0e595c2f2220e04866bca6bdb2623e772cfb5f8bf4d20ffe6ba5c72ab languageName: node linkType: hard @@ -2599,21 +2599,21 @@ __metadata: dependencies: "@types/d3-array": "npm:*" "@types/geojson": "npm:*" - checksum: b4fc2b783c944b35412080c873ec828896864144675db9376b390c2a64631f5a63939fdefd50bf8f3cf0cb80ac8113429334f303b7806a71dd3155e1f762a304 + checksum: 10c0/b4fc2b783c944b35412080c873ec828896864144675db9376b390c2a64631f5a63939fdefd50bf8f3cf0cb80ac8113429334f303b7806a71dd3155e1f762a304 languageName: node linkType: hard "@types/d3-delaunay@npm:*": version: 6.0.1 resolution: "@types/d3-delaunay@npm:6.0.1" - checksum: b03f84560a98e0d08b96095759484de6ebccc4fc137a9114795ece15898ccb67c5b0897ffe1e939658224fe387dd58090b951a2c3ff31c70ec9fe2dddc0df1f9 + checksum: 10c0/b03f84560a98e0d08b96095759484de6ebccc4fc137a9114795ece15898ccb67c5b0897ffe1e939658224fe387dd58090b951a2c3ff31c70ec9fe2dddc0df1f9 languageName: node linkType: hard "@types/d3-dispatch@npm:*": version: 3.0.2 resolution: "@types/d3-dispatch@npm:3.0.2" - checksum: 4d3afa2ff31abe7207347f7bdf044b5a94ba39935670a745d1599021e56f7f29eb0e09685cb32519d9ee45ec9d0de865ac4c77ed6c1e049cb1d820b5a1085c09 + checksum: 10c0/4d3afa2ff31abe7207347f7bdf044b5a94ba39935670a745d1599021e56f7f29eb0e09685cb32519d9ee45ec9d0de865ac4c77ed6c1e049cb1d820b5a1085c09 languageName: node linkType: hard @@ -2622,21 +2622,21 @@ __metadata: resolution: "@types/d3-drag@npm:3.0.2" dependencies: "@types/d3-selection": "npm:*" - checksum: b8af2eaf78df1acce61bc70c8684fc97be3b2824d096107a93e34c157f3e680d9635aeb6227431c1b226808442a55e728109615690a0ff240479eb04216afb94 + checksum: 10c0/b8af2eaf78df1acce61bc70c8684fc97be3b2824d096107a93e34c157f3e680d9635aeb6227431c1b226808442a55e728109615690a0ff240479eb04216afb94 languageName: node linkType: hard "@types/d3-dsv@npm:*": version: 3.0.1 resolution: "@types/d3-dsv@npm:3.0.1" - checksum: 1daac684901a4b4022213bfd82cb0b2917c950cb2f1d0d925aabe2aab88c7cfdef67f522a08259e6c19d7c54fb98e4a8a994d9e48d8fb8d5bcda813969c5afc6 + checksum: 10c0/1daac684901a4b4022213bfd82cb0b2917c950cb2f1d0d925aabe2aab88c7cfdef67f522a08259e6c19d7c54fb98e4a8a994d9e48d8fb8d5bcda813969c5afc6 languageName: node linkType: hard "@types/d3-ease@npm:*": version: 3.0.0 resolution: "@types/d3-ease@npm:3.0.0" - checksum: 8fa64035f3b459cbf178e0bbb01cd188ec7337877e959fcf0a6ef08528b6caf93fd9f69635ec1c8fc11f6d2448d0e5d2a4e11988cb16bc6e001f0c0afe609204 + checksum: 10c0/8fa64035f3b459cbf178e0bbb01cd188ec7337877e959fcf0a6ef08528b6caf93fd9f69635ec1c8fc11f6d2448d0e5d2a4e11988cb16bc6e001f0c0afe609204 languageName: node linkType: hard @@ -2645,21 +2645,21 @@ __metadata: resolution: "@types/d3-fetch@npm:3.0.2" dependencies: "@types/d3-dsv": "npm:*" - checksum: ee592cb03b0651b882851d022df6fc17934ab955d642b9178c2e1e800cd7e75733bde02a1f4936cff1befcec918556144a3525bd0cc6a3c8c5446de4a8bf4bf7 + checksum: 10c0/ee592cb03b0651b882851d022df6fc17934ab955d642b9178c2e1e800cd7e75733bde02a1f4936cff1befcec918556144a3525bd0cc6a3c8c5446de4a8bf4bf7 languageName: node linkType: hard "@types/d3-force@npm:*": version: 3.0.4 resolution: "@types/d3-force@npm:3.0.4" - checksum: d1c1c00742f55c8f8d99e0fa09be990ae4dc562d2fd1861d86dfdc69efbcc47e1e8a30a97cde64a6c0175dcc8c2cfa1c7ab4c021063f96a13182e14a2d0c5ff1 + checksum: 10c0/d1c1c00742f55c8f8d99e0fa09be990ae4dc562d2fd1861d86dfdc69efbcc47e1e8a30a97cde64a6c0175dcc8c2cfa1c7ab4c021063f96a13182e14a2d0c5ff1 languageName: node linkType: hard "@types/d3-format@npm:*": version: 3.0.1 resolution: "@types/d3-format@npm:3.0.1" - checksum: abfb57288fb26899bac98aeb03d652ed73d7074c12c96bb33d2d67ced9869f52f4b3e37579df883fc69a13d970199331a07e67a8bcd9f858efeb4f3a71e36188 + checksum: 10c0/abfb57288fb26899bac98aeb03d652ed73d7074c12c96bb33d2d67ced9869f52f4b3e37579df883fc69a13d970199331a07e67a8bcd9f858efeb4f3a71e36188 languageName: node linkType: hard @@ -2668,7 +2668,7 @@ __metadata: resolution: "@types/d3-geo@npm:3.0.3" dependencies: "@types/geojson": "npm:*" - checksum: f1409f60507644b331a2355e54e3ff497011cb0e1b4faa5962c6ee9f1f5e80f4ca9a400c67c8c7bea2b3e67c3f7684a047c91330d2d0216ddb63b3ddc9ac8f96 + checksum: 10c0/f1409f60507644b331a2355e54e3ff497011cb0e1b4faa5962c6ee9f1f5e80f4ca9a400c67c8c7bea2b3e67c3f7684a047c91330d2d0216ddb63b3ddc9ac8f96 languageName: node linkType: hard @@ -2679,14 +2679,14 @@ __metadata: "@types/d3-selection": "npm:^1" "@types/d3-transition": "npm:^1" "@types/d3-zoom": "npm:^1" - checksum: bbb4143dcef1ebac612f93e448a53291cec3f708489261dc54c657db0441ed0a87c3bdf5e902e6d695918b7a39ace15bcf07e2c828d6568611eee8b5c15fe6c4 + checksum: 10c0/bbb4143dcef1ebac612f93e448a53291cec3f708489261dc54c657db0441ed0a87c3bdf5e902e6d695918b7a39ace15bcf07e2c828d6568611eee8b5c15fe6c4 languageName: node linkType: hard "@types/d3-hierarchy@npm:*": version: 3.1.2 resolution: "@types/d3-hierarchy@npm:3.1.2" - checksum: 9248d1d01f659e30808da58171652542d88d4e07364dac4acffcf3513509b26d5e2971880f56e29091cf89b0d2f8de64fcd9cb86017d9192d0f27e863c965414 + checksum: 10c0/9248d1d01f659e30808da58171652542d88d4e07364dac4acffcf3513509b26d5e2971880f56e29091cf89b0d2f8de64fcd9cb86017d9192d0f27e863c965414 languageName: node linkType: hard @@ -2695,7 +2695,7 @@ __metadata: resolution: "@types/d3-interpolate@npm:3.0.1" dependencies: "@types/d3-color": "npm:*" - checksum: 1c7577045a4a30dc177bca10980c456a28c9b89b1a5406fe7303824dd9cc898f67f8dafd8e22a7702ca5df12a28a5f48f77d92a9b5d8f1fc0939f33831067114 + checksum: 10c0/1c7577045a4a30dc177bca10980c456a28c9b89b1a5406fe7303824dd9cc898f67f8dafd8e22a7702ca5df12a28a5f48f77d92a9b5d8f1fc0939f33831067114 languageName: node linkType: hard @@ -2704,42 +2704,42 @@ __metadata: resolution: "@types/d3-interpolate@npm:1.4.2" dependencies: "@types/d3-color": "npm:^1" - checksum: 98bff93ce4d94485a4f6117e554854ec69072382910008e785d2c960b50e643093a8cfa2e0875b3d1dff19f3603b6e16a4eea8122c7c8ead3623daf3044cd22e + checksum: 10c0/98bff93ce4d94485a4f6117e554854ec69072382910008e785d2c960b50e643093a8cfa2e0875b3d1dff19f3603b6e16a4eea8122c7c8ead3623daf3044cd22e languageName: node linkType: hard "@types/d3-path@npm:*": version: 3.0.0 resolution: "@types/d3-path@npm:3.0.0" - checksum: 64750aeb3e490112d2f1d812230201140de352743846150e022e44c6924f44d47deb1a50f3dc63b930fd6a8fd6482f8fcb7da2516a14b8e29a4749d2b86f90ca + checksum: 10c0/64750aeb3e490112d2f1d812230201140de352743846150e022e44c6924f44d47deb1a50f3dc63b930fd6a8fd6482f8fcb7da2516a14b8e29a4749d2b86f90ca languageName: node linkType: hard "@types/d3-polygon@npm:*": version: 3.0.0 resolution: "@types/d3-polygon@npm:3.0.0" - checksum: 6fce6672581cac3c5bcda6f0014527228bdc25ad9f99d1bf9103764f6ce89bc0d5690db55c92052ad7182fa20623aa4bb6bcb2b85aa7a77535610c06b3c32d97 + checksum: 10c0/6fce6672581cac3c5bcda6f0014527228bdc25ad9f99d1bf9103764f6ce89bc0d5690db55c92052ad7182fa20623aa4bb6bcb2b85aa7a77535610c06b3c32d97 languageName: node linkType: hard "@types/d3-quadtree@npm:*": version: 3.0.2 resolution: "@types/d3-quadtree@npm:3.0.2" - checksum: 0a2a6921bb21d8bd14190bfd048990f80d2369e622822cbc344a897bb88534b1d7332445024e17cf0adfb4cef663a8a79f0e3bf2a4129a7d13f264854f06e379 + checksum: 10c0/0a2a6921bb21d8bd14190bfd048990f80d2369e622822cbc344a897bb88534b1d7332445024e17cf0adfb4cef663a8a79f0e3bf2a4129a7d13f264854f06e379 languageName: node linkType: hard "@types/d3-random@npm:*": version: 3.0.1 resolution: "@types/d3-random@npm:3.0.1" - checksum: e2818c15b157df55f48c50ca1ed8ba243859b56eb0eb07fdca162ea34ef77f373e5fd5402df4c2e483d6a71e0b57b97ce189cb9398d0433569be6318e1ede408 + checksum: 10c0/e2818c15b157df55f48c50ca1ed8ba243859b56eb0eb07fdca162ea34ef77f373e5fd5402df4c2e483d6a71e0b57b97ce189cb9398d0433569be6318e1ede408 languageName: node linkType: hard "@types/d3-scale-chromatic@npm:*": version: 3.0.0 resolution: "@types/d3-scale-chromatic@npm:3.0.0" - checksum: 58cef12deab19233d8d06f61993198930248fb7cf5de0754e38a9dd342a8fba2d917bc746b57eeee9f82e50bbc079a867e15cc045e8a338cf8502ebcde4561f9 + checksum: 10c0/58cef12deab19233d8d06f61993198930248fb7cf5de0754e38a9dd342a8fba2d917bc746b57eeee9f82e50bbc079a867e15cc045e8a338cf8502ebcde4561f9 languageName: node linkType: hard @@ -2748,21 +2748,21 @@ __metadata: resolution: "@types/d3-scale@npm:4.0.3" dependencies: "@types/d3-time": "npm:*" - checksum: 5eace4cf45f87b3eec9637ade77e97530e778a3bb7f8356e4712bde732fb9474f3e8ef3aa12bc97dd3e4f76e23343ed81c1f5a3a1dcfdb72868f876b418da117 + checksum: 10c0/5eace4cf45f87b3eec9637ade77e97530e778a3bb7f8356e4712bde732fb9474f3e8ef3aa12bc97dd3e4f76e23343ed81c1f5a3a1dcfdb72868f876b418da117 languageName: node linkType: hard "@types/d3-selection@npm:*, @types/d3-selection@npm:^3.0.10": version: 3.0.10 resolution: "@types/d3-selection@npm:3.0.10" - checksum: de1f99ab186a08999bf394a645fd76911add1b02316270d4c07616c8383903a2b068d7e02b73b6a99a1f26bb49a2e99ef4b55a5d2ddfa165f6f3c53144897920 + checksum: 10c0/de1f99ab186a08999bf394a645fd76911add1b02316270d4c07616c8383903a2b068d7e02b73b6a99a1f26bb49a2e99ef4b55a5d2ddfa165f6f3c53144897920 languageName: node linkType: hard "@types/d3-selection@npm:^1": version: 1.4.3 resolution: "@types/d3-selection@npm:1.4.3" - checksum: 47c181f8362ade4df151e01737816356c939bc5728ff87c3a29bd43aaa0413296170119949eb3aa0ef8d9c10fac4463eb1d154b6fd0e89617b45eeb06bdefb8b + checksum: 10c0/47c181f8362ade4df151e01737816356c939bc5728ff87c3a29bd43aaa0413296170119949eb3aa0ef8d9c10fac4463eb1d154b6fd0e89617b45eeb06bdefb8b languageName: node linkType: hard @@ -2771,28 +2771,28 @@ __metadata: resolution: "@types/d3-shape@npm:3.1.1" dependencies: "@types/d3-path": "npm:*" - checksum: e06f0e6f5d74184dfb6a71861085ffad221bde8a11d2de632649118d75e9605fddf9af664601b0841d794e0c27afd6ea37d652350fb47c196905facc04c284d5 + checksum: 10c0/e06f0e6f5d74184dfb6a71861085ffad221bde8a11d2de632649118d75e9605fddf9af664601b0841d794e0c27afd6ea37d652350fb47c196905facc04c284d5 languageName: node linkType: hard "@types/d3-time-format@npm:*": version: 4.0.0 resolution: "@types/d3-time-format@npm:4.0.0" - checksum: 3b2b95950594ded5bb6c1b21da37b049daa945c93a93ced76eac2ea6d78d6d17ebabbcf226523b07e214fe53c5d0f98f5d2e9ce7c758bc29c25e3563afddcf87 + checksum: 10c0/3b2b95950594ded5bb6c1b21da37b049daa945c93a93ced76eac2ea6d78d6d17ebabbcf226523b07e214fe53c5d0f98f5d2e9ce7c758bc29c25e3563afddcf87 languageName: node linkType: hard "@types/d3-time@npm:*": version: 3.0.0 resolution: "@types/d3-time@npm:3.0.0" - checksum: 4f900608d5c557b09b38e4b096723af5eb4508a1b32f9afae253fe77a4bcbbe821a14225bab1c2ea36ddbc5c4154ab3563452c6b6eba7a9f48cefad94276e6b5 + checksum: 10c0/4f900608d5c557b09b38e4b096723af5eb4508a1b32f9afae253fe77a4bcbbe821a14225bab1c2ea36ddbc5c4154ab3563452c6b6eba7a9f48cefad94276e6b5 languageName: node linkType: hard "@types/d3-timer@npm:*": version: 3.0.0 resolution: "@types/d3-timer@npm:3.0.0" - checksum: 7f6cd693f6c99a360dc01e1b5aa1185cfa8f65d603f537c52c810d475c8ef8aa07ac2f8be24cc489d2e69b843e384ab30dd079ac75011dbc91b21cd216a79502 + checksum: 10c0/7f6cd693f6c99a360dc01e1b5aa1185cfa8f65d603f537c52c810d475c8ef8aa07ac2f8be24cc489d2e69b843e384ab30dd079ac75011dbc91b21cd216a79502 languageName: node linkType: hard @@ -2801,7 +2801,7 @@ __metadata: resolution: "@types/d3-transition@npm:3.0.3" dependencies: "@types/d3-selection": "npm:*" - checksum: b91742816f4f8b16c26b8a41065f0b72170b5eb9f5a9af30c7e432ff0b7b78a02fb7228d4e4bb8471e91d8122aa96dd8f8e879ceb181cc006039e87a0c696fbf + checksum: 10c0/b91742816f4f8b16c26b8a41065f0b72170b5eb9f5a9af30c7e432ff0b7b78a02fb7228d4e4bb8471e91d8122aa96dd8f8e879ceb181cc006039e87a0c696fbf languageName: node linkType: hard @@ -2810,7 +2810,7 @@ __metadata: resolution: "@types/d3-transition@npm:1.3.2" dependencies: "@types/d3-selection": "npm:^1" - checksum: 9e1340c2840fde63f224550cbde5531b8b2493218d421f97de138c1e7ca9b1f481dfc9e4c91cb5ce84df9df671e2d95468556be1f8cf1e28f0c33929322115a4 + checksum: 10c0/9e1340c2840fde63f224550cbde5531b8b2493218d421f97de138c1e7ca9b1f481dfc9e4c91cb5ce84df9df671e2d95468556be1f8cf1e28f0c33929322115a4 languageName: node linkType: hard @@ -2820,7 +2820,7 @@ __metadata: dependencies: "@types/d3-interpolate": "npm:*" "@types/d3-selection": "npm:*" - checksum: 1dbdbcafddcae12efb5beb6948546963f29599e18bc7f2a91fb69cc617c2299a65354f2d47e282dfb86fec0968406cd4fb7f76ba2d2fb67baa8e8d146eb4a547 + checksum: 10c0/1dbdbcafddcae12efb5beb6948546963f29599e18bc7f2a91fb69cc617c2299a65354f2d47e282dfb86fec0968406cd4fb7f76ba2d2fb67baa8e8d146eb4a547 languageName: node linkType: hard @@ -2830,7 +2830,7 @@ __metadata: dependencies: "@types/d3-interpolate": "npm:^1" "@types/d3-selection": "npm:^1" - checksum: 3135d2e01ec2eb633a5104025e719d989cdd9d203eeb97fc749128d60c2d19de9693e058e92ea1eb2f63aa0fa47cd4e4a994dc7df614b00eda650952c92f2c8a + checksum: 10c0/3135d2e01ec2eb633a5104025e719d989cdd9d203eeb97fc749128d60c2d19de9693e058e92ea1eb2f63aa0fa47cd4e4a994dc7df614b00eda650952c92f2c8a languageName: node linkType: hard @@ -2868,7 +2868,7 @@ __metadata: "@types/d3-timer": "npm:*" "@types/d3-transition": "npm:*" "@types/d3-zoom": "npm:*" - checksum: a9c6d65b13ef3b42c87f2a89ea63a6d5640221869f97d0657b0cb2f1dac96a0f164bf5605643c0794e0de3aa2bf05df198519aaf15d24ca135eb0e8bd8a9d879 + checksum: 10c0/a9c6d65b13ef3b42c87f2a89ea63a6d5640221869f97d0657b0cb2f1dac96a0f164bf5605643c0794e0de3aa2bf05df198519aaf15d24ca135eb0e8bd8a9d879 languageName: node linkType: hard @@ -2878,49 +2878,49 @@ __metadata: dependencies: "@types/estree": "npm:*" "@types/json-schema": "npm:*" - checksum: e33ca87a30a9454ba9943e1270ac759996f5fe598a1c1afbaec1d1e7346a339e20bf2a9d81f177067116bbaa6cfa4f748993cb338f57978ae862ad38ffae56fe + checksum: 10c0/e33ca87a30a9454ba9943e1270ac759996f5fe598a1c1afbaec1d1e7346a339e20bf2a9d81f177067116bbaa6cfa4f748993cb338f57978ae862ad38ffae56fe languageName: node linkType: hard "@types/estree@npm:*": version: 1.0.0 resolution: "@types/estree@npm:1.0.0" - checksum: 4e73ff606bf7c7ccdaa66092de650c410a4ad2ecc388fdbed8242cac9dbcad72407e1ceff041b7da691babb02ff74ab885d6231fb09368fdd1eabbf1b5253d49 + checksum: 10c0/4e73ff606bf7c7ccdaa66092de650c410a4ad2ecc388fdbed8242cac9dbcad72407e1ceff041b7da691babb02ff74ab885d6231fb09368fdd1eabbf1b5253d49 languageName: node linkType: hard "@types/estree@npm:0.0.39": version: 0.0.39 resolution: "@types/estree@npm:0.0.39" - checksum: f0af6c95ac1988c4827964bd9d3b51d24da442e2188943f6dfcb1e1559103d5d024d564b2e9d3f84c53714a02a0a7435c7441138eb63d9af5de4dfc66cdc0d92 + checksum: 10c0/f0af6c95ac1988c4827964bd9d3b51d24da442e2188943f6dfcb1e1559103d5d024d564b2e9d3f84c53714a02a0a7435c7441138eb63d9af5de4dfc66cdc0d92 languageName: node linkType: hard "@types/geojson@npm:*": version: 7946.0.10 resolution: "@types/geojson@npm:7946.0.10" - checksum: 4abba554467494c1496a60622c2cb6f8c7f80b0dbb909ff898812a9f67799fd1b254802d7d266361974bd8b0c9ef32a7686183aac83b20c437f6d0eee89cd0a1 + checksum: 10c0/4abba554467494c1496a60622c2cb6f8c7f80b0dbb909ff898812a9f67799fd1b254802d7d266361974bd8b0c9ef32a7686183aac83b20c437f6d0eee89cd0a1 languageName: node linkType: hard "@types/html-minifier-terser@npm:^7.0.2": version: 7.0.2 resolution: "@types/html-minifier-terser@npm:7.0.2" - checksum: 46b700e022a666ed001f58c672bcabe1040660526ca617797750e84db8fc6e29e55305d7291d04b5c1e85960773e751d67ed338f5bf5264dd29d7d824a1ef1ed + checksum: 10c0/46b700e022a666ed001f58c672bcabe1040660526ca617797750e84db8fc6e29e55305d7291d04b5c1e85960773e751d67ed338f5bf5264dd29d7d824a1ef1ed languageName: node linkType: hard "@types/json-schema@npm:*, @types/json-schema@npm:^7.0.12": version: 7.0.12 resolution: "@types/json-schema@npm:7.0.12" - checksum: 2c39946ae321fe42d085c61a85872a81bbee70f9b2054ad344e8811dfc478fdbaf1ebf5f2989bb87c895ba2dfc3b1dcba85db11e467bbcdc023708814207791c + checksum: 10c0/2c39946ae321fe42d085c61a85872a81bbee70f9b2054ad344e8811dfc478fdbaf1ebf5f2989bb87c895ba2dfc3b1dcba85db11e467bbcdc023708814207791c languageName: node linkType: hard "@types/json5@npm:^0.0.29": version: 0.0.29 resolution: "@types/json5@npm:0.0.29" - checksum: 6bf5337bc447b706bb5b4431d37686aa2ea6d07cfd6f79cc31de80170d6ff9b1c7384a9c0ccbc45b3f512bae9e9f75c2e12109806a15331dc94e8a8db6dbb4ac + checksum: 10c0/6bf5337bc447b706bb5b4431d37686aa2ea6d07cfd6f79cc31de80170d6ff9b1c7384a9c0ccbc45b3f512bae9e9f75c2e12109806a15331dc94e8a8db6dbb4ac languageName: node linkType: hard @@ -2929,14 +2929,14 @@ __metadata: resolution: "@types/lodash-es@npm:4.17.12" dependencies: "@types/lodash": "npm:*" - checksum: 5d12d2cede07f07ab067541371ed1b838a33edb3c35cb81b73284e93c6fd0c4bbeaefee984e69294bffb53f62d7272c5d679fdba8e595ff71e11d00f2601dde0 + checksum: 10c0/5d12d2cede07f07ab067541371ed1b838a33edb3c35cb81b73284e93c6fd0c4bbeaefee984e69294bffb53f62d7272c5d679fdba8e595ff71e11d00f2601dde0 languageName: node linkType: hard "@types/lodash@npm:*": version: 4.14.184 resolution: "@types/lodash@npm:4.14.184" - checksum: 35e81d477603b319179b335b839865f7bc837afcfd08b5fedfe7e01a0a0f192599f7567ffa45dbf95bfa793f1e9f9bc4666f57f47f0b00fe171e857b9178aed9 + checksum: 10c0/35e81d477603b319179b335b839865f7bc837afcfd08b5fedfe7e01a0a0f192599f7567ffa45dbf95bfa793f1e9f9bc4666f57f47f0b00fe171e857b9178aed9 languageName: node linkType: hard @@ -2945,53 +2945,53 @@ __metadata: resolution: "@types/micromatch@npm:4.0.6" dependencies: "@types/braces": "npm:*" - checksum: deba87b2bb740cb3f206c006baddc2d3f411fdba48e47452fb189a2a1a73cc3d6f6f2e6f52b970d1383e988afd9f12046e50f902ad740f1f8afa3faa273ab2a0 + checksum: 10c0/deba87b2bb740cb3f206c006baddc2d3f411fdba48e47452fb189a2a1a73cc3d6f6f2e6f52b970d1383e988afd9f12046e50f902ad740f1f8afa3faa273ab2a0 languageName: node linkType: hard "@types/ms@npm:^0.7.34": version: 0.7.34 resolution: "@types/ms@npm:0.7.34" - checksum: ac80bd90012116ceb2d188fde62d96830ca847823e8ca71255616bc73991aa7d9f057b8bfab79e8ee44ffefb031ddd1bcce63ea82f9e66f7c31ec02d2d823ccc + checksum: 10c0/ac80bd90012116ceb2d188fde62d96830ca847823e8ca71255616bc73991aa7d9f057b8bfab79e8ee44ffefb031ddd1bcce63ea82f9e66f7c31ec02d2d823ccc languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:^20.11.10": - version: 20.11.10 - resolution: "@types/node@npm:20.11.10" +"@types/node@npm:*, @types/node@npm:^20.11.19": + version: 20.11.19 + resolution: "@types/node@npm:20.11.19" dependencies: undici-types: "npm:~5.26.4" - checksum: aced8595c2786d4e60471772659add1e2e0d1f2b73d119820b2e1815426d6e52c6a77f1c7fca8ea46490c36f7959cc46b0dc609fa2e80b7fd24f9a7d696c2210 + checksum: 10c0/f451ef0a1d78f29c57bad7b77e49ebec945f2a6d0d7a89851d7e185ee9fe7ad94d651c0dfbcb7858c9fa791310c8b40a881e2260f56bd3c1b7e7ae92723373ae languageName: node linkType: hard "@types/parse-json@npm:^4.0.0": version: 4.0.0 resolution: "@types/parse-json@npm:4.0.0" - checksum: 1d3012ab2fcdad1ba313e1d065b737578f6506c8958e2a7a5bdbdef517c7e930796cb1599ee067d5dee942fb3a764df64b5eef7e9ae98548d776e86dcffba985 + checksum: 10c0/1d3012ab2fcdad1ba313e1d065b737578f6506c8958e2a7a5bdbdef517c7e930796cb1599ee067d5dee942fb3a764df64b5eef7e9ae98548d776e86dcffba985 languageName: node linkType: hard "@types/pnpapi@npm:^0.0.5": version: 0.0.5 resolution: "@types/pnpapi@npm:0.0.5" - checksum: 2ade69b20d0ad5d16e6f709b1a40a8c43034ae5e8ca3b979a7fc7c26fbf0cc75791b7e8539f84e98c0e910b9c31d805fb420840e73482c6ed7bba9760ee938be + checksum: 10c0/2ade69b20d0ad5d16e6f709b1a40a8c43034ae5e8ca3b979a7fc7c26fbf0cc75791b7e8539f84e98c0e910b9c31d805fb420840e73482c6ed7bba9760ee938be languageName: node linkType: hard "@types/prop-types@npm:*, @types/prop-types@npm:^15.7.11": version: 15.7.11 resolution: "@types/prop-types@npm:15.7.11" - checksum: e53423cf9d510515ef8b47ff42f4f1b65a7b7b37c8704e2dbfcb9a60defe0c0e1f3cb1acfdeb466bad44ca938d7c79bffdd51b48ffb659df2432169d0b27a132 + checksum: 10c0/e53423cf9d510515ef8b47ff42f4f1b65a7b7b37c8704e2dbfcb9a60defe0c0e1f3cb1acfdeb466bad44ca938d7c79bffdd51b48ffb659df2432169d0b27a132 languageName: node linkType: hard -"@types/react-dom@npm:^18.2.18": - version: 18.2.18 - resolution: "@types/react-dom@npm:18.2.18" +"@types/react-dom@npm:^18.2.19": + version: 18.2.19 + resolution: "@types/react-dom@npm:18.2.19" dependencies: "@types/react": "npm:*" - checksum: 74dba11a1b8156f3a763f3fca1fb4ec1dcd349153279b8bf79210024a69f994bf2cf0728198c047f8130c5318420ea56281b0a4ef84c8ae943cd9a0cac705220 + checksum: 10c0/88d7c6daa4659f661d0c97985d9fca492f24b421a34bb614dcd94c343aed7bea121463149e97fb01ecaa693be17b7d1542cf71ddb1705f3889a81eb2639a88aa languageName: node linkType: hard @@ -3000,18 +3000,18 @@ __metadata: resolution: "@types/react-transition-group@npm:4.4.10" dependencies: "@types/react": "npm:*" - checksum: 3eb9bca143abc21eb781aa5cb1bded0c9335689d515bf0513fb8e63217b7a8122c6a323ecd5644a06938727e1f467ee061d8df1c93b68825a80ff1b47ab777a2 + checksum: 10c0/3eb9bca143abc21eb781aa5cb1bded0c9335689d515bf0513fb8e63217b7a8122c6a323ecd5644a06938727e1f467ee061d8df1c93b68825a80ff1b47ab777a2 languageName: node linkType: hard -"@types/react@npm:*, @types/react@npm:^18.2.48": - version: 18.2.48 - resolution: "@types/react@npm:18.2.48" +"@types/react@npm:*, @types/react@npm:^18.2.56": + version: 18.2.56 + resolution: "@types/react@npm:18.2.56" dependencies: "@types/prop-types": "npm:*" "@types/scheduler": "npm:*" csstype: "npm:^3.0.2" - checksum: 7e89f18ea2928b1638f564b156d692894dcb9352a7e0a807873c97e858abe1f23dbd165a25dd088a991344e973fdeef88ba5724bfb64504b74072cbc9c220c3a + checksum: 10c0/a6dab9569799538a9e01d340a721ef1a6f5532bd11cae8d8ab9af00dab2edcafaa00950f7bf2f9ae5bbb1839d890e9ac6eb1ea1186200894b7178dde7b503269 languageName: node linkType: hard @@ -3020,40 +3020,40 @@ __metadata: resolution: "@types/resolve@npm:1.17.1" dependencies: "@types/node": "npm:*" - checksum: 6eeb9c27d99bf4b393bf168d43208f63e78cefca5644662a0bdb2bdbf8352386f4f3aca66add138fc41bce5f66fd48a0de430a1473f11b612fbed0375ae78031 + checksum: 10c0/6eeb9c27d99bf4b393bf168d43208f63e78cefca5644662a0bdb2bdbf8352386f4f3aca66add138fc41bce5f66fd48a0de430a1473f11b612fbed0375ae78031 languageName: node linkType: hard "@types/scheduler@npm:*": version: 0.16.2 resolution: "@types/scheduler@npm:0.16.2" - checksum: 89a3a922f03609b61c270d534226791edeedcb1b06f0225d5543ac17830254624ef9d8a97ad05418e4ce549dd545bddf1ff28cb90658ff10721ad14556ca68a5 + checksum: 10c0/89a3a922f03609b61c270d534226791edeedcb1b06f0225d5543ac17830254624ef9d8a97ad05418e4ce549dd545bddf1ff28cb90658ff10721ad14556ca68a5 languageName: node linkType: hard "@types/semver@npm:^7.5.0": version: 7.5.0 resolution: "@types/semver@npm:7.5.0" - checksum: ca4ba4642b5972b6e88e73c5bc02bbaceb8d76bce71748d86e3e95042d4e5a44603113a1dcd2cb9b73ad6f91f6e4ab73185eb41bbfc9c73b11f0ed3db3b7443a + checksum: 10c0/ca4ba4642b5972b6e88e73c5bc02bbaceb8d76bce71748d86e3e95042d4e5a44603113a1dcd2cb9b73ad6f91f6e4ab73185eb41bbfc9c73b11f0ed3db3b7443a languageName: node linkType: hard "@types/trusted-types@npm:^2.0.2": version: 2.0.2 resolution: "@types/trusted-types@npm:2.0.2" - checksum: 8c5253d7a297ba375b1dff7704013fb8d31c08c681d257db9e7e0624309cbb4a1e0c916bdd5a8c378992391126af0adb731720ba7642244a2f2c1ff42aba5bcf + checksum: 10c0/8c5253d7a297ba375b1dff7704013fb8d31c08c681d257db9e7e0624309cbb4a1e0c916bdd5a8c378992391126af0adb731720ba7642244a2f2c1ff42aba5bcf languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^6.20.0": - version: 6.20.0 - resolution: "@typescript-eslint/eslint-plugin@npm:6.20.0" +"@typescript-eslint/eslint-plugin@npm:^6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/eslint-plugin@npm:6.21.0" dependencies: "@eslint-community/regexpp": "npm:^4.5.1" - "@typescript-eslint/scope-manager": "npm:6.20.0" - "@typescript-eslint/type-utils": "npm:6.20.0" - "@typescript-eslint/utils": "npm:6.20.0" - "@typescript-eslint/visitor-keys": "npm:6.20.0" + "@typescript-eslint/scope-manager": "npm:6.21.0" + "@typescript-eslint/type-utils": "npm:6.21.0" + "@typescript-eslint/utils": "npm:6.21.0" + "@typescript-eslint/visitor-keys": "npm:6.21.0" debug: "npm:^4.3.4" graphemer: "npm:^1.4.0" ignore: "npm:^5.2.4" @@ -3066,44 +3066,44 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 5020faac39be476de056342f58f2bf68bb788f230e2fa4a2e27ceab8a5187dc450beba7333b0aa741a43aeaff45a117558132953f9390b5eca4c2cc004fde716 + checksum: 10c0/f911a79ee64d642f814a3b6cdb0d324b5f45d9ef955c5033e78903f626b7239b4aa773e464a38c3e667519066169d983538f2bf8e5d00228af587c9d438fb344 languageName: node linkType: hard -"@typescript-eslint/parser@npm:^6.20.0": - version: 6.20.0 - resolution: "@typescript-eslint/parser@npm:6.20.0" +"@typescript-eslint/parser@npm:^6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/parser@npm:6.21.0" dependencies: - "@typescript-eslint/scope-manager": "npm:6.20.0" - "@typescript-eslint/types": "npm:6.20.0" - "@typescript-eslint/typescript-estree": "npm:6.20.0" - "@typescript-eslint/visitor-keys": "npm:6.20.0" + "@typescript-eslint/scope-manager": "npm:6.21.0" + "@typescript-eslint/types": "npm:6.21.0" + "@typescript-eslint/typescript-estree": "npm:6.21.0" + "@typescript-eslint/visitor-keys": "npm:6.21.0" debug: "npm:^4.3.4" peerDependencies: eslint: ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: d84ad5e2282b1096c80dedb903c83ecc31eaf7be1aafcb14c18d9ec2d4a319f2fd1e5a9038b944d9f42c36c1c57add5e4292d4026ca7d3d5441d41286700d402 + checksum: 10c0/a8f99820679decd0d115c0af61903fb1de3b1b5bec412dc72b67670bf636de77ab07f2a68ee65d6da7976039bbf636907f9d5ca546db3f0b98a31ffbc225bc7d languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:6.20.0": - version: 6.20.0 - resolution: "@typescript-eslint/scope-manager@npm:6.20.0" +"@typescript-eslint/scope-manager@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/scope-manager@npm:6.21.0" dependencies: - "@typescript-eslint/types": "npm:6.20.0" - "@typescript-eslint/visitor-keys": "npm:6.20.0" - checksum: f6768ed2dcd2d1771d55ed567ff392a6569ffd683a26500067509dd41769f8838c43686460fe7337144f324fd063df33f5d5646d44e5df4998ceffb3ad1fb790 + "@typescript-eslint/types": "npm:6.21.0" + "@typescript-eslint/visitor-keys": "npm:6.21.0" + checksum: 10c0/eaf868938d811cbbea33e97e44ba7050d2b6892202cea6a9622c486b85ab1cf801979edf78036179a8ba4ac26f1dfdf7fcc83a68c1ff66be0b3a8e9a9989b526 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:6.20.0": - version: 6.20.0 - resolution: "@typescript-eslint/type-utils@npm:6.20.0" +"@typescript-eslint/type-utils@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/type-utils@npm:6.21.0" dependencies: - "@typescript-eslint/typescript-estree": "npm:6.20.0" - "@typescript-eslint/utils": "npm:6.20.0" + "@typescript-eslint/typescript-estree": "npm:6.21.0" + "@typescript-eslint/utils": "npm:6.21.0" debug: "npm:^4.3.4" ts-api-utils: "npm:^1.0.1" peerDependencies: @@ -3111,23 +3111,23 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 8f622fbb14268f1d00b2948f995b570f0ef82be02c12be41d90385290a56ea0dbd34d855d6a5aff100b57f3bdd300ff0c300f16c78f12d6064f7ae6e34fd71bf + checksum: 10c0/7409c97d1c4a4386b488962739c4f1b5b04dc60cf51f8cd88e6b12541f84d84c6b8b67e491a147a2c95f9ec486539bf4519fb9d418411aef6537b9c156468117 languageName: node linkType: hard -"@typescript-eslint/types@npm:6.20.0": - version: 6.20.0 - resolution: "@typescript-eslint/types@npm:6.20.0" - checksum: 37589003b0e06f83c1945e3748e91af85918cfd997766894642a08e6f355f611cfe11df4e7632dda96e3a9b3441406283fe834ab0906cf81ea97fd43ca2aebe3 +"@typescript-eslint/types@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/types@npm:6.21.0" + checksum: 10c0/020631d3223bbcff8a0da3efbdf058220a8f48a3de221563996ad1dcc30d6c08dadc3f7608cc08830d21c0d565efd2db19b557b9528921c78aabb605eef2d74d languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:6.20.0": - version: 6.20.0 - resolution: "@typescript-eslint/typescript-estree@npm:6.20.0" +"@typescript-eslint/typescript-estree@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/typescript-estree@npm:6.21.0" dependencies: - "@typescript-eslint/types": "npm:6.20.0" - "@typescript-eslint/visitor-keys": "npm:6.20.0" + "@typescript-eslint/types": "npm:6.21.0" + "@typescript-eslint/visitor-keys": "npm:6.21.0" debug: "npm:^4.3.4" globby: "npm:^11.1.0" is-glob: "npm:^4.0.3" @@ -3137,52 +3137,52 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 551f13445a303882d9fc0fbe14ef8507eb8414253fd87a5f13d2e324b5280b626421a238b8ec038e628bc80128dc06c057757f668738e82e64d5b39a9083c27d + checksum: 10c0/af1438c60f080045ebb330155a8c9bb90db345d5069cdd5d01b67de502abb7449d6c75500519df829f913a6b3f490ade3e8215279b6bdc63d0fb0ae61034df5f languageName: node linkType: hard -"@typescript-eslint/utils@npm:6.20.0": - version: 6.20.0 - resolution: "@typescript-eslint/utils@npm:6.20.0" +"@typescript-eslint/utils@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/utils@npm:6.21.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" "@types/json-schema": "npm:^7.0.12" "@types/semver": "npm:^7.5.0" - "@typescript-eslint/scope-manager": "npm:6.20.0" - "@typescript-eslint/types": "npm:6.20.0" - "@typescript-eslint/typescript-estree": "npm:6.20.0" + "@typescript-eslint/scope-manager": "npm:6.21.0" + "@typescript-eslint/types": "npm:6.21.0" + "@typescript-eslint/typescript-estree": "npm:6.21.0" semver: "npm:^7.5.4" peerDependencies: eslint: ^7.0.0 || ^8.0.0 - checksum: 0a8ede3d80a365b52ae96d88e4a9f6e6abf3569c6b60ff9f42ff900cd843ae7c5493cd95f8f2029d90bb0acbf31030980206af98e581d760d6d41e0f80e9fb86 + checksum: 10c0/ab2df3833b2582d4e5467a484d08942b4f2f7208f8e09d67de510008eb8001a9b7460f2f9ba11c12086fd3cdcac0c626761c7995c2c6b5657d5fa6b82030a32d languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:6.20.0": - version: 6.20.0 - resolution: "@typescript-eslint/visitor-keys@npm:6.20.0" +"@typescript-eslint/visitor-keys@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/visitor-keys@npm:6.21.0" dependencies: - "@typescript-eslint/types": "npm:6.20.0" + "@typescript-eslint/types": "npm:6.21.0" eslint-visitor-keys: "npm:^3.4.1" - checksum: 852d938f2e5d57200cf62733b42e73a369f797b097d17e8fd3fffd0f7315c3b9e1863eed60bb8d57d6535a3b7f1980f645f96ec6d513950f182bfa8107b33fab + checksum: 10c0/7395f69739cfa1cb83c1fb2fad30afa2a814756367302fb4facd5893eff66abc807e8d8f63eba94ed3b0fe0c1c996ac9a1680bcbf0f83717acedc3f2bb724fbf languageName: node linkType: hard "@ungap/structured-clone@npm:^1.2.0": version: 1.2.0 resolution: "@ungap/structured-clone@npm:1.2.0" - checksum: 8209c937cb39119f44eb63cf90c0b73e7c754209a6411c707be08e50e29ee81356dca1a848a405c8bdeebfe2f5e4f831ad310ae1689eeef65e7445c090c6657d + checksum: 10c0/8209c937cb39119f44eb63cf90c0b73e7c754209a6411c707be08e50e29ee81356dca1a848a405c8bdeebfe2f5e4f831ad310ae1689eeef65e7445c090c6657d languageName: node linkType: hard -"@vitejs/plugin-react-swc@npm:^3.5.0": - version: 3.5.0 - resolution: "@vitejs/plugin-react-swc@npm:3.5.0" +"@vitejs/plugin-react-swc@npm:^3.6.0": + version: 3.6.0 + resolution: "@vitejs/plugin-react-swc@npm:3.6.0" dependencies: - "@swc/core": "npm:^1.3.96" + "@swc/core": "npm:^1.3.107" peerDependencies: vite: ^4 || ^5 - checksum: 8a0c61fd08224a8945f7190a33ff0ab563548200f0841f7d9ef4a41260d9fcd70bc75fcd5cfef2915fe1e81642e36a3c158fa2b48ba6626e19ba7da61330b2c1 + checksum: 10c0/aae7c02f390559d0fbfb6285f1ba80917493d2c4979315f62f90fa06fb19b0b40362717fac035cac726575fdb120f66c4094f27bea846e2009686d15bc8637ae languageName: node linkType: hard @@ -3202,7 +3202,7 @@ __metadata: xstate-beta: "npm:xstate@beta" bin: xstate: bin/bin.js - checksum: 043ba57afa76c653986d3f7f9109a4b5ff72d3fd672917a5fcd1661a948bf1d1b6bcc539e79c462c8b5b02038bd6de378020137507a68c0f4fd21415cc208130 + checksum: 10c0/043ba57afa76c653986d3f7f9109a4b5ff72d3fd672917a5fcd1661a948bf1d1b6bcc539e79c462c8b5b02038bd6de378020137507a68c0f4fd21415cc208130 languageName: node linkType: hard @@ -3216,7 +3216,7 @@ __metadata: recast: "npm:^0.23.1" peerDependencies: xstate: ^4 - checksum: 0f9a617fda3da7c1e568c381759d4b46999e8967a2b721e53522af2dc653849dea7ce36f9df50ab13afdfe17e5c62b8a61490190c35b1c61683be8a8a4f58793 + checksum: 10c0/0f9a617fda3da7c1e568c381759d4b46999e8967a2b721e53522af2dc653849dea7ce36f9df50ab13afdfe17e5c62b8a61490190c35b1c61683be8a8a4f58793 languageName: node linkType: hard @@ -3228,14 +3228,14 @@ __metadata: peerDependencies: prettier: ^2 xstate: ^4 - checksum: af5d29fe22506b33a26300aa01fef215b3dd3498106a5825c7b04370cdcbfcb7aa5d882393836ed0bd9b61d027ec6b528ce9bc7ad47859ebefb56fe1867cf842 + checksum: 10c0/af5d29fe22506b33a26300aa01fef215b3dd3498106a5825c7b04370cdcbfcb7aa5d882393836ed0bd9b61d027ec6b528ce9bc7ad47859ebefb56fe1867cf842 languageName: node linkType: hard "abbrev@npm:^1.0.0": version: 1.1.1 resolution: "abbrev@npm:1.1.1" - checksum: 3f762677702acb24f65e813070e306c61fafe25d4b2583f9dfc935131f774863f3addd5741572ed576bd69cabe473c5af18e1e108b829cb7b6b4747884f726e6 + checksum: 10c0/3f762677702acb24f65e813070e306c61fafe25d4b2583f9dfc935131f774863f3addd5741572ed576bd69cabe473c5af18e1e108b829cb7b6b4747884f726e6 languageName: node linkType: hard @@ -3244,7 +3244,7 @@ __metadata: resolution: "acorn-jsx@npm:5.3.2" peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 4c54868fbef3b8d58927d5e33f0a4de35f59012fe7b12cf9dfbb345fb8f46607709e1c4431be869a23fb63c151033d84c4198fa9f79385cec34fcb1dd53974c1 + checksum: 10c0/4c54868fbef3b8d58927d5e33f0a4de35f59012fe7b12cf9dfbb345fb8f46607709e1c4431be869a23fb63c151033d84c4198fa9f79385cec34fcb1dd53974c1 languageName: node linkType: hard @@ -3253,7 +3253,7 @@ __metadata: resolution: "acorn@npm:8.10.0" bin: acorn: bin/acorn - checksum: deaeebfbea6e40f6c0e1070e9b0e16e76ba484de54cbd735914d1d41d19169a450de8630b7a3a0c4e271a3b0c0b075a3427ad1a40d8a69f8747c0e8cb02ee3e2 + checksum: 10c0/deaeebfbea6e40f6c0e1070e9b0e16e76ba484de54cbd735914d1d41d19169a450de8630b7a3a0c4e271a3b0c0b075a3427ad1a40d8a69f8747c0e8cb02ee3e2 languageName: node linkType: hard @@ -3262,7 +3262,7 @@ __metadata: resolution: "agent-base@npm:6.0.2" dependencies: debug: "npm:4" - checksum: dc4f757e40b5f3e3d674bc9beb4f1048f4ee83af189bae39be99f57bf1f48dde166a8b0a5342a84b5944ee8e6ed1e5a9d801858f4ad44764e84957122fe46261 + checksum: 10c0/dc4f757e40b5f3e3d674bc9beb4f1048f4ee83af189bae39be99f57bf1f48dde166a8b0a5342a84b5944ee8e6ed1e5a9d801858f4ad44764e84957122fe46261 languageName: node linkType: hard @@ -3271,7 +3271,7 @@ __metadata: resolution: "agentkeepalive@npm:4.5.0" dependencies: humanize-ms: "npm:^1.2.1" - checksum: 394ea19f9710f230722996e156607f48fdf3a345133b0b1823244b7989426c16019a428b56c82d3eabef616e938812981d9009f4792ecc66bd6a59e991c62612 + checksum: 10c0/394ea19f9710f230722996e156607f48fdf3a345133b0b1823244b7989426c16019a428b56c82d3eabef616e938812981d9009f4792ecc66bd6a59e991c62612 languageName: node linkType: hard @@ -3281,7 +3281,7 @@ __metadata: dependencies: clean-stack: "npm:^2.0.0" indent-string: "npm:^4.0.0" - checksum: a42f67faa79e3e6687a4923050e7c9807db3848a037076f791d10e092677d65c1d2d863b7848560699f40fc0502c19f40963fb1cd1fb3d338a7423df8e45e039 + checksum: 10c0/a42f67faa79e3e6687a4923050e7c9807db3848a037076f791d10e092677d65c1d2d863b7848560699f40fc0502c19f40963fb1cd1fb3d338a7423df8e45e039 languageName: node linkType: hard @@ -3293,7 +3293,7 @@ __metadata: fast-json-stable-stringify: "npm:^2.0.0" json-schema-traverse: "npm:^0.4.1" uri-js: "npm:^4.2.2" - checksum: 41e23642cbe545889245b9d2a45854ebba51cda6c778ebced9649420d9205f2efb39cb43dbc41e358409223b1ea43303ae4839db682c848b891e4811da1a5a71 + checksum: 10c0/41e23642cbe545889245b9d2a45854ebba51cda6c778ebced9649420d9205f2efb39cb43dbc41e358409223b1ea43303ae4839db682c848b891e4811da1a5a71 languageName: node linkType: hard @@ -3305,21 +3305,21 @@ __metadata: json-schema-traverse: "npm:^1.0.0" require-from-string: "npm:^2.0.2" uri-js: "npm:^4.2.2" - checksum: ac4f72adf727ee425e049bc9d8b31d4a57e1c90da8d28bcd23d60781b12fcd6fc3d68db5df16994c57b78b94eed7988f5a6b482fd376dc5b084125e20a0a622e + checksum: 10c0/ac4f72adf727ee425e049bc9d8b31d4a57e1c90da8d28bcd23d60781b12fcd6fc3d68db5df16994c57b78b94eed7988f5a6b482fd376dc5b084125e20a0a622e languageName: node linkType: hard "ansi-regex@npm:^5.0.1": version: 5.0.1 resolution: "ansi-regex@npm:5.0.1" - checksum: 9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 + checksum: 10c0/9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 languageName: node linkType: hard "ansi-regex@npm:^6.0.1": version: 6.0.1 resolution: "ansi-regex@npm:6.0.1" - checksum: cbe16dbd2c6b2735d1df7976a7070dd277326434f0212f43abf6d87674095d247968209babdaad31bb00882fa68807256ba9be340eec2f1004de14ca75f52a08 + checksum: 10c0/cbe16dbd2c6b2735d1df7976a7070dd277326434f0212f43abf6d87674095d247968209babdaad31bb00882fa68807256ba9be340eec2f1004de14ca75f52a08 languageName: node linkType: hard @@ -3328,7 +3328,7 @@ __metadata: resolution: "ansi-styles@npm:3.2.1" dependencies: color-convert: "npm:^1.9.0" - checksum: ece5a8ef069fcc5298f67e3f4771a663129abd174ea2dfa87923a2be2abf6cd367ef72ac87942da00ce85bd1d651d4cd8595aebdb1b385889b89b205860e977b + checksum: 10c0/ece5a8ef069fcc5298f67e3f4771a663129abd174ea2dfa87923a2be2abf6cd367ef72ac87942da00ce85bd1d651d4cd8595aebdb1b385889b89b205860e977b languageName: node linkType: hard @@ -3337,14 +3337,14 @@ __metadata: resolution: "ansi-styles@npm:4.3.0" dependencies: color-convert: "npm:^2.0.1" - checksum: 895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 + checksum: 10c0/895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 languageName: node linkType: hard "ansi-styles@npm:^6.1.0, ansi-styles@npm:^6.2.1": version: 6.2.1 resolution: "ansi-styles@npm:6.2.1" - checksum: 5d1ec38c123984bcedd996eac680d548f31828bd679a66db2bdf11844634dde55fec3efa9c6bb1d89056a5e79c1ac540c4c784d592ea1d25028a92227d2f2d5c + checksum: 10c0/5d1ec38c123984bcedd996eac680d548f31828bd679a66db2bdf11844634dde55fec3efa9c6bb1d89056a5e79c1ac540c4c784d592ea1d25028a92227d2f2d5c languageName: node linkType: hard @@ -3354,14 +3354,14 @@ __metadata: dependencies: normalize-path: "npm:^3.0.0" picomatch: "npm:^2.0.4" - checksum: 57b06ae984bc32a0d22592c87384cd88fe4511b1dd7581497831c56d41939c8a001b28e7b853e1450f2bf61992dfcaa8ae2d0d161a0a90c4fb631ef07098fbac + checksum: 10c0/57b06ae984bc32a0d22592c87384cd88fe4511b1dd7581497831c56d41939c8a001b28e7b853e1450f2bf61992dfcaa8ae2d0d161a0a90c4fb631ef07098fbac languageName: node linkType: hard "aproba@npm:^1.0.3 || ^2.0.0": version: 2.0.0 resolution: "aproba@npm:2.0.0" - checksum: d06e26384a8f6245d8c8896e138c0388824e259a329e0c9f196b4fa533c82502a6fd449586e3604950a0c42921832a458bb3aa0aa9f0ba449cfd4f50fd0d09b5 + checksum: 10c0/d06e26384a8f6245d8c8896e138c0388824e259a329e0c9f196b4fa533c82502a6fd449586e3604950a0c42921832a458bb3aa0aa9f0ba449cfd4f50fd0d09b5 languageName: node linkType: hard @@ -3371,14 +3371,14 @@ __metadata: dependencies: delegates: "npm:^1.0.0" readable-stream: "npm:^3.6.0" - checksum: 8373f289ba42e4b5ec713bb585acdac14b5702c75f2a458dc985b9e4fa5762bc5b46b40a21b72418a3ed0cfb5e35bdc317ef1ae132f3035f633d581dd03168c3 + checksum: 10c0/8373f289ba42e4b5ec713bb585acdac14b5702c75f2a458dc985b9e4fa5762bc5b46b40a21b72418a3ed0cfb5e35bdc317ef1ae132f3035f633d581dd03168c3 languageName: node linkType: hard "argparse@npm:^2.0.1": version: 2.0.1 resolution: "argparse@npm:2.0.1" - checksum: c5640c2d89045371c7cedd6a70212a04e360fd34d6edeae32f6952c63949e3525ea77dbec0289d8213a99bbaeab5abfa860b5c12cf88a2e6cf8106e90dd27a7e + checksum: 10c0/c5640c2d89045371c7cedd6a70212a04e360fd34d6edeae32f6952c63949e3525ea77dbec0289d8213a99bbaeab5abfa860b5c12cf88a2e6cf8106e90dd27a7e languageName: node linkType: hard @@ -3387,7 +3387,7 @@ __metadata: resolution: "aria-query@npm:5.3.0" dependencies: dequal: "npm:^2.0.3" - checksum: 2bff0d4eba5852a9dd578ecf47eaef0e82cc52569b48469b0aac2db5145db0b17b7a58d9e01237706d1e14b7a1b0ac9b78e9c97027ad97679dd8f91b85da1469 + checksum: 10c0/2bff0d4eba5852a9dd578ecf47eaef0e82cc52569b48469b0aac2db5145db0b17b7a58d9e01237706d1e14b7a1b0ac9b78e9c97027ad97679dd8f91b85da1469 languageName: node linkType: hard @@ -3397,7 +3397,7 @@ __metadata: dependencies: call-bind: "npm:^1.0.2" is-array-buffer: "npm:^3.0.1" - checksum: 12f84f6418b57a954caa41654e5e63e019142a4bbb2c6829ba86d1ba65d31ccfaf1461d1743556fd32b091fac34ff44d9dfbdb001402361c45c373b2c86f5c20 + checksum: 10c0/12f84f6418b57a954caa41654e5e63e019142a4bbb2c6829ba86d1ba65d31ccfaf1461d1743556fd32b091fac34ff44d9dfbdb001402361c45c373b2c86f5c20 languageName: node linkType: hard @@ -3410,14 +3410,14 @@ __metadata: es-abstract: "npm:^1.22.1" get-intrinsic: "npm:^1.2.1" is-string: "npm:^1.0.7" - checksum: 692907bd7f19d06dc58ccb761f34b58f5dc0b437d2b47a8fe42a1501849a5cf5c27aed3d521a9702667827c2c85a7e75df00a402c438094d87fc43f39ebf9b2b + checksum: 10c0/692907bd7f19d06dc58ccb761f34b58f5dc0b437d2b47a8fe42a1501849a5cf5c27aed3d521a9702667827c2c85a7e75df00a402c438094d87fc43f39ebf9b2b languageName: node linkType: hard "array-union@npm:^2.1.0": version: 2.1.0 resolution: "array-union@npm:2.1.0" - checksum: 429897e68110374f39b771ec47a7161fc6a8fc33e196857c0a396dc75df0b5f65e4d046674db764330b6bb66b39ef48dd7c53b6a2ee75cfb0681e0c1a7033962 + checksum: 10c0/429897e68110374f39b771ec47a7161fc6a8fc33e196857c0a396dc75df0b5f65e4d046674db764330b6bb66b39ef48dd7c53b6a2ee75cfb0681e0c1a7033962 languageName: node linkType: hard @@ -3430,7 +3430,7 @@ __metadata: es-abstract: "npm:^1.22.1" es-shim-unscopables: "npm:^1.0.0" get-intrinsic: "npm:^1.2.1" - checksum: 2c5c4d3f07512d6729f728f6260a314c00f2eb0a243123092661fa1bc65dce90234c3b483b5f978396eccef6f69c50f0bea248448aaf9cdfcd1cedad6217acbb + checksum: 10c0/2c5c4d3f07512d6729f728f6260a314c00f2eb0a243123092661fa1bc65dce90234c3b483b5f978396eccef6f69c50f0bea248448aaf9cdfcd1cedad6217acbb languageName: node linkType: hard @@ -3442,7 +3442,7 @@ __metadata: define-properties: "npm:^1.2.0" es-abstract: "npm:^1.22.1" es-shim-unscopables: "npm:^1.0.0" - checksum: a578ed836a786efbb6c2db0899ae80781b476200617f65a44846cb1ed8bd8b24c8821b83703375d8af639c689497b7b07277060024b9919db94ac3e10dc8a49b + checksum: 10c0/a578ed836a786efbb6c2db0899ae80781b476200617f65a44846cb1ed8bd8b24c8821b83703375d8af639c689497b7b07277060024b9919db94ac3e10dc8a49b languageName: node linkType: hard @@ -3454,7 +3454,7 @@ __metadata: define-properties: "npm:^1.2.0" es-abstract: "npm:^1.22.1" es-shim-unscopables: "npm:^1.0.0" - checksum: 67b3f1d602bb73713265145853128b1ad77cc0f9b833c7e1e056b323fbeac41a4ff1c9c99c7b9445903caea924d9ca2450578d9011913191aa88cc3c3a4b54f4 + checksum: 10c0/67b3f1d602bb73713265145853128b1ad77cc0f9b833c7e1e056b323fbeac41a4ff1c9c99c7b9445903caea924d9ca2450578d9011913191aa88cc3c3a4b54f4 languageName: node linkType: hard @@ -3467,7 +3467,7 @@ __metadata: es-abstract: "npm:^1.20.4" es-shim-unscopables: "npm:^1.0.0" get-intrinsic: "npm:^1.1.3" - checksum: fd5f57aca3c7ddcd1bb83965457b625f3a67d8f334f5cbdb8ac8ef33d5b0d38281524114db2936f8c08048115d5158af216c94e6ae1eb966241b9b6f4ab8a7e8 + checksum: 10c0/fd5f57aca3c7ddcd1bb83965457b625f3a67d8f334f5cbdb8ac8ef33d5b0d38281524114db2936f8c08048115d5158af216c94e6ae1eb966241b9b6f4ab8a7e8 languageName: node linkType: hard @@ -3482,7 +3482,7 @@ __metadata: get-intrinsic: "npm:^1.2.1" is-array-buffer: "npm:^3.0.2" is-shared-array-buffer: "npm:^1.0.2" - checksum: 96b6e40e439678ffb7fa266398510074d33c3980fbb475490b69980cca60adec3b0777047ef377068a29862157f83edef42efc64ce48ce38977d04d68de5b7fb + checksum: 10c0/96b6e40e439678ffb7fa266398510074d33c3980fbb475490b69980cca60adec3b0777047ef377068a29862157f83edef42efc64ce48ce38977d04d68de5b7fb languageName: node linkType: hard @@ -3494,14 +3494,14 @@ __metadata: is-nan: "npm:^1.2.1" object-is: "npm:^1.0.1" util: "npm:^0.12.0" - checksum: a25c7ebc07b52cc4dadd5c46d73472e7d4b86e40eb7ebaa12f78c1ba954dbe83612be5dea314b862fc364c305ab3bdbcd1c9d4ec2d92bc37214ae7d5596347f3 + checksum: 10c0/a25c7ebc07b52cc4dadd5c46d73472e7d4b86e40eb7ebaa12f78c1ba954dbe83612be5dea314b862fc364c305ab3bdbcd1c9d4ec2d92bc37214ae7d5596347f3 languageName: node linkType: hard "ast-types-flow@npm:^0.0.8": version: 0.0.8 resolution: "ast-types-flow@npm:0.0.8" - checksum: f2a0ba8055353b743c41431974521e5e852a9824870cd6fce2db0e538ac7bf4da406bbd018d109af29ff3f8f0993f6a730c9eddbd0abd031fbcb29ca75c1014e + checksum: 10c0/f2a0ba8055353b743c41431974521e5e852a9824870cd6fce2db0e538ac7bf4da406bbd018d109af29ff3f8f0993f6a730c9eddbd0abd031fbcb29ca75c1014e languageName: node linkType: hard @@ -3510,14 +3510,14 @@ __metadata: resolution: "ast-types@npm:0.16.1" dependencies: tslib: "npm:^2.0.1" - checksum: abcc49e42eb921a7ebc013d5bec1154651fb6dbc3f497541d488859e681256901b2990b954d530ba0da4d0851271d484f7057d5eff5e07cb73e8b10909f711bf + checksum: 10c0/abcc49e42eb921a7ebc013d5bec1154651fb6dbc3f497541d488859e681256901b2990b954d530ba0da4d0851271d484f7057d5eff5e07cb73e8b10909f711bf languageName: node linkType: hard "async@npm:^3.2.3": version: 3.2.4 resolution: "async@npm:3.2.4" - checksum: b5d02fed64717edf49e35b2b156debd9cf524934ea670108fa5528e7615ed66a5e0bf6c65f832c9483b63aa7f0bffe3e588ebe8d58a539b833798d324516e1c9 + checksum: 10c0/b5d02fed64717edf49e35b2b156debd9cf524934ea670108fa5528e7615ed66a5e0bf6c65f832c9483b63aa7f0bffe3e588ebe8d58a539b833798d324516e1c9 languageName: node linkType: hard @@ -3526,28 +3526,28 @@ __metadata: resolution: "asynciterator.prototype@npm:1.0.0" dependencies: has-symbols: "npm:^1.0.3" - checksum: fb76850e57d931ff59fd16b6cddb79b0d34fe45f400b2c3480d38892e72cd089787401687dbdb7cdb14ece402c275d3e02a648760d1489cd493527129c4c6204 + checksum: 10c0/fb76850e57d931ff59fd16b6cddb79b0d34fe45f400b2c3480d38892e72cd089787401687dbdb7cdb14ece402c275d3e02a648760d1489cd493527129c4c6204 languageName: node linkType: hard "at-least-node@npm:^1.0.0": version: 1.0.0 resolution: "at-least-node@npm:1.0.0" - checksum: 4c058baf6df1bc5a1697cf182e2029c58cd99975288a13f9e70068ef5d6f4e1f1fd7c4d2c3c4912eae44797d1725be9700995736deca441b39f3e66d8dee97ef + checksum: 10c0/4c058baf6df1bc5a1697cf182e2029c58cd99975288a13f9e70068ef5d6f4e1f1fd7c4d2c3c4912eae44797d1725be9700995736deca441b39f3e66d8dee97ef languageName: node linkType: hard "available-typed-arrays@npm:^1.0.5": version: 1.0.5 resolution: "available-typed-arrays@npm:1.0.5" - checksum: c4df567ca72d2754a6cbad20088f5f98b1065b3360178169fa9b44ea101af62c0f423fc3854fa820fd6895b6b9171b8386e71558203103ff8fc2ad503fdcc660 + checksum: 10c0/c4df567ca72d2754a6cbad20088f5f98b1065b3360178169fa9b44ea101af62c0f423fc3854fa820fd6895b6b9171b8386e71558203103ff8fc2ad503fdcc660 languageName: node linkType: hard "axe-core@npm:=4.7.0": version: 4.7.0 resolution: "axe-core@npm:4.7.0" - checksum: 89ac5712b5932ac7d23398b4cb5ba081c394a086e343acc68ba49c83472706e18e0799804e8388c779dcdacc465377deb29f2714241d3fbb389cf3a6b275c9ba + checksum: 10c0/89ac5712b5932ac7d23398b4cb5ba081c394a086e343acc68ba49c83472706e18e0799804e8388c779dcdacc465377deb29f2714241d3fbb389cf3a6b275c9ba languageName: node linkType: hard @@ -3556,7 +3556,7 @@ __metadata: resolution: "axobject-query@npm:3.2.1" dependencies: dequal: "npm:^2.0.3" - checksum: f7debc2012e456139b57d888c223f6d3cb4b61eb104164a85e3d346273dd6ef0bc9a04b6660ca9407704a14a8e05fa6b6eb9d55f44f348c7210de7ffb350c3a7 + checksum: 10c0/f7debc2012e456139b57d888c223f6d3cb4b61eb104164a85e3d346273dd6ef0bc9a04b6660ca9407704a14a8e05fa6b6eb9d55f44f348c7210de7ffb350c3a7 languageName: node linkType: hard @@ -3565,7 +3565,7 @@ __metadata: resolution: "babel-plugin-dynamic-import-node@npm:2.3.3" dependencies: object.assign: "npm:^4.1.0" - checksum: 1bd80df981e1fc1aff0cd4e390cf27aaa34f95f7620cd14dff07ba3bad56d168c098233a7d2deb2c9b1dc13643e596a6b94fc608a3412ee3c56e74a25cd2167e + checksum: 10c0/1bd80df981e1fc1aff0cd4e390cf27aaa34f95f7620cd14dff07ba3bad56d168c098233a7d2deb2c9b1dc13643e596a6b94fc608a3412ee3c56e74a25cd2167e languageName: node linkType: hard @@ -3576,7 +3576,7 @@ __metadata: "@babel/runtime": "npm:^7.12.5" cosmiconfig: "npm:^7.0.0" resolve: "npm:^1.19.0" - checksum: c6dfb15de96f67871d95bd2e8c58b0c81edc08b9b087dc16755e7157f357dc1090a8dc60ebab955e92587a9101f02eba07e730adc253a1e4cf593ca3ebd3839c + checksum: 10c0/c6dfb15de96f67871d95bd2e8c58b0c81edc08b9b087dc16755e7157f357dc1090a8dc60ebab955e92587a9101f02eba07e730adc253a1e4cf593ca3ebd3839c languageName: node linkType: hard @@ -3589,7 +3589,7 @@ __metadata: semver: "npm:^6.1.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 21e34d4ba961de66d3fe31f3fecca5612d5db99638949766a445d37de72c1f736552fe436f3bd3792e5cc307f48e8f78a498a01e858c84946627ddb662415cc4 + checksum: 10c0/21e34d4ba961de66d3fe31f3fecca5612d5db99638949766a445d37de72c1f736552fe436f3bd3792e5cc307f48e8f78a498a01e858c84946627ddb662415cc4 languageName: node linkType: hard @@ -3601,7 +3601,7 @@ __metadata: core-js-compat: "npm:^3.21.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 87f9eb8be5e8e115b930624c8e3e91b5396eca8d563120b0cd03853960addf587fd4cab8776ecf3a59ec94a774f214f2321a96c354a667a62fa2dc5eb122eaa0 + checksum: 10c0/87f9eb8be5e8e115b930624c8e3e91b5396eca8d563120b0cd03853960addf587fd4cab8776ecf3a59ec94a774f214f2321a96c354a667a62fa2dc5eb122eaa0 languageName: node linkType: hard @@ -3612,21 +3612,21 @@ __metadata: "@babel/helper-define-polyfill-provider": "npm:^0.3.3" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: bd915d51e30259201b289a58dfa46c8c1bc8827a38c275ff3134c8194d27e634d5c32ec62137d489d81c7dd5f6ea46b04057eb44b7180d06c19388e3a5f4f8c6 + checksum: 10c0/bd915d51e30259201b289a58dfa46c8c1bc8827a38c275ff3134c8194d27e634d5c32ec62137d489d81c7dd5f6ea46b04057eb44b7180d06c19388e3a5f4f8c6 languageName: node linkType: hard "balanced-match@npm:^1.0.0": version: 1.0.2 resolution: "balanced-match@npm:1.0.2" - checksum: 9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee + checksum: 10c0/9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee languageName: node linkType: hard "binary-extensions@npm:^2.0.0": version: 2.2.0 resolution: "binary-extensions@npm:2.2.0" - checksum: d73d8b897238a2d3ffa5f59c0241870043aa7471335e89ea5e1ff48edb7c2d0bb471517a3e4c5c3f4c043615caa2717b5f80a5e61e07503d51dc85cb848e665d + checksum: 10c0/d73d8b897238a2d3ffa5f59c0241870043aa7471335e89ea5e1ff48edb7c2d0bb471517a3e4c5c3f4c043615caa2717b5f80a5e61e07503d51dc85cb848e665d languageName: node linkType: hard @@ -3636,7 +3636,7 @@ __metadata: dependencies: balanced-match: "npm:^1.0.0" concat-map: "npm:0.0.1" - checksum: 695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 + checksum: 10c0/695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 languageName: node linkType: hard @@ -3645,7 +3645,7 @@ __metadata: resolution: "brace-expansion@npm:2.0.1" dependencies: balanced-match: "npm:^1.0.0" - checksum: b358f2fe060e2d7a87aa015979ecea07f3c37d4018f8d6deb5bd4c229ad3a0384fe6029bb76cd8be63c81e516ee52d1a0673edbe2023d53a5191732ae3c3e49f + checksum: 10c0/b358f2fe060e2d7a87aa015979ecea07f3c37d4018f8d6deb5bd4c229ad3a0384fe6029bb76cd8be63c81e516ee52d1a0673edbe2023d53a5191732ae3c3e49f languageName: node linkType: hard @@ -3654,7 +3654,7 @@ __metadata: resolution: "braces@npm:3.0.2" dependencies: fill-range: "npm:^7.0.1" - checksum: 321b4d675791479293264019156ca322163f02dc06e3c4cab33bb15cd43d80b51efef69b0930cfde3acd63d126ebca24cd0544fa6f261e093a0fb41ab9dda381 + checksum: 10c0/321b4d675791479293264019156ca322163f02dc06e3c4cab33bb15cd43d80b51efef69b0930cfde3acd63d126ebca24cd0544fa6f261e093a0fb41ab9dda381 languageName: node linkType: hard @@ -3668,21 +3668,21 @@ __metadata: update-browserslist-db: "npm:^1.0.11" bin: browserslist: cli.js - checksum: e8c98496e5f2a5128d0e2f1f186dc0416bfc49c811e568b19c9e07a56cccc1f7f415fa4f532488e6a13dfacbe3332a9b55b152082ff125402696a11a158a0894 + checksum: 10c0/e8c98496e5f2a5128d0e2f1f186dc0416bfc49c811e568b19c9e07a56cccc1f7f415fa4f532488e6a13dfacbe3332a9b55b152082ff125402696a11a158a0894 languageName: node linkType: hard "buffer-from@npm:^1.0.0": version: 1.1.2 resolution: "buffer-from@npm:1.1.2" - checksum: 124fff9d66d691a86d3b062eff4663fe437a9d9ee4b47b1b9e97f5a5d14f6d5399345db80f796827be7c95e70a8e765dd404b7c3ff3b3324f98e9b0c8826cc34 + checksum: 10c0/124fff9d66d691a86d3b062eff4663fe437a9d9ee4b47b1b9e97f5a5d14f6d5399345db80f796827be7c95e70a8e765dd404b7c3ff3b3324f98e9b0c8826cc34 languageName: node linkType: hard "builtin-modules@npm:^3.1.0": version: 3.3.0 resolution: "builtin-modules@npm:3.3.0" - checksum: 2cb3448b4f7306dc853632a4fcddc95e8d4e4b9868c139400027b71938fc6806d4ff44007deffb362ac85724bd40c2c6452fb6a0aa4531650eeddb98d8e5ee8a + checksum: 10c0/2cb3448b4f7306dc853632a4fcddc95e8d4e4b9868c139400027b71938fc6806d4ff44007deffb362ac85724bd40c2c6452fb6a0aa4531650eeddb98d8e5ee8a languageName: node linkType: hard @@ -3702,7 +3702,7 @@ __metadata: ssri: "npm:^10.0.0" tar: "npm:^6.1.11" unique-filename: "npm:^3.0.0" - checksum: 21749dcf98c61dd570b179e51573b076c92e3f6c82166d37444242db66b92b1e6c6dc11c6059c027ac7bdef5479b513855059299cc11cda8212c49b0f69a3662 + checksum: 10c0/21749dcf98c61dd570b179e51573b076c92e3f6c82166d37444242db66b92b1e6c6dc11c6059c027ac7bdef5479b513855059299cc11cda8212c49b0f69a3662 languageName: node linkType: hard @@ -3713,14 +3713,14 @@ __metadata: function-bind: "npm:^1.1.2" get-intrinsic: "npm:^1.2.1" set-function-length: "npm:^1.1.1" - checksum: a6172c168fd6dacf744fcde745099218056bd755c50415b592655dcd6562157ed29f130f56c3f6db2250f67e4bd62e5c218cdc56d7bfd76e0bda50770fce2d10 + checksum: 10c0/a6172c168fd6dacf744fcde745099218056bd755c50415b592655dcd6562157ed29f130f56c3f6db2250f67e4bd62e5c218cdc56d7bfd76e0bda50770fce2d10 languageName: node linkType: hard "callsites@npm:^3.0.0": version: 3.1.0 resolution: "callsites@npm:3.1.0" - checksum: fff92277400eb06c3079f9e74f3af120db9f8ea03bad0e84d9aede54bbe2d44a56cccb5f6cf12211f93f52306df87077ecec5b712794c5a9b5dac6d615a3f301 + checksum: 10c0/fff92277400eb06c3079f9e74f3af120db9f8ea03bad0e84d9aede54bbe2d44a56cccb5f6cf12211f93f52306df87077ecec5b712794c5a9b5dac6d615a3f301 languageName: node linkType: hard @@ -3730,14 +3730,14 @@ __metadata: dependencies: pascal-case: "npm:^3.1.2" tslib: "npm:^2.0.3" - checksum: bf9eefaee1f20edbed2e9a442a226793bc72336e2b99e5e48c6b7252b6f70b080fc46d8246ab91939e2af91c36cdd422e0af35161e58dd089590f302f8f64c8a + checksum: 10c0/bf9eefaee1f20edbed2e9a442a226793bc72336e2b99e5e48c6b7252b6f70b080fc46d8246ab91939e2af91c36cdd422e0af35161e58dd089590f302f8f64c8a languageName: node linkType: hard "caniuse-lite@npm:^1.0.30001517": - version: 1.0.30001581 - resolution: "caniuse-lite@npm:1.0.30001581" - checksum: 34b048156514eab5932212807428905cbecdef918f7c3d2153d5e8b6885d929e5c0b649f9e135cb1e03e413fbad8e00d1f24ed04cbcca52adc660ef98cad9032 + version: 1.0.30001588 + resolution: "caniuse-lite@npm:1.0.30001588" + checksum: 10c0/f8333cb52e7ebc169d462763cecc33807530f1e04d22ba1084e05a583907aa801fb3c013d60b38d54cb792440f48efcd2a1a68f22d5fce896b5bd0277392347c languageName: node linkType: hard @@ -3748,7 +3748,7 @@ __metadata: ansi-styles: "npm:^3.2.1" escape-string-regexp: "npm:^1.0.5" supports-color: "npm:^5.3.0" - checksum: e6543f02ec877732e3a2d1c3c3323ddb4d39fbab687c23f526e25bd4c6a9bf3b83a696e8c769d078e04e5754921648f7821b2a2acfd16c550435fd630026e073 + checksum: 10c0/e6543f02ec877732e3a2d1c3c3323ddb4d39fbab687c23f526e25bd4c6a9bf3b83a696e8c769d078e04e5754921648f7821b2a2acfd16c550435fd630026e073 languageName: node linkType: hard @@ -3758,7 +3758,7 @@ __metadata: dependencies: ansi-styles: "npm:^4.1.0" supports-color: "npm:^7.1.0" - checksum: 4a3fef5cc34975c898ffe77141450f679721df9dde00f6c304353fa9c8b571929123b26a0e4617bde5018977eb655b31970c297b91b63ee83bb82aeb04666880 + checksum: 10c0/4a3fef5cc34975c898ffe77141450f679721df9dde00f6c304353fa9c8b571929123b26a0e4617bde5018977eb655b31970c297b91b63ee83bb82aeb04666880 languageName: node linkType: hard @@ -3777,14 +3777,14 @@ __metadata: dependenciesMeta: fsevents: optional: true - checksum: 1076953093e0707c882a92c66c0f56ba6187831aa51bb4de878c1fec59ae611a3bf02898f190efec8e77a086b8df61c2b2a3ea324642a0558bdf8ee6c5dc9ca1 + checksum: 10c0/1076953093e0707c882a92c66c0f56ba6187831aa51bb4de878c1fec59ae611a3bf02898f190efec8e77a086b8df61c2b2a3ea324642a0558bdf8ee6c5dc9ca1 languageName: node linkType: hard "chownr@npm:^2.0.0": version: 2.0.0 resolution: "chownr@npm:2.0.0" - checksum: 594754e1303672171cc04e50f6c398ae16128eb134a88f801bf5354fd96f205320f23536a045d9abd8b51024a149696e51231565891d4efdab8846021ecf88e6 + checksum: 10c0/594754e1303672171cc04e50f6c398ae16128eb134a88f801bf5354fd96f205320f23536a045d9abd8b51024a149696e51231565891d4efdab8846021ecf88e6 languageName: node linkType: hard @@ -3793,14 +3793,14 @@ __metadata: resolution: "clean-css@npm:5.3.2" dependencies: source-map: "npm:~0.6.0" - checksum: 315e0e81306524bd2c1905fa6823bf7658be40799b78f446e5e6922808718d2b80266fb3e96842a06176fa683bc2c1a0d2827b08d154e2f9cf136d7bda909d33 + checksum: 10c0/315e0e81306524bd2c1905fa6823bf7658be40799b78f446e5e6922808718d2b80266fb3e96842a06176fa683bc2c1a0d2827b08d154e2f9cf136d7bda909d33 languageName: node linkType: hard "clean-stack@npm:^2.0.0": version: 2.2.0 resolution: "clean-stack@npm:2.2.0" - checksum: 1f90262d5f6230a17e27d0c190b09d47ebe7efdd76a03b5a1127863f7b3c9aec4c3e6c8bb3a7bbf81d553d56a1fd35728f5a8ef4c63f867ac8d690109742a8c1 + checksum: 10c0/1f90262d5f6230a17e27d0c190b09d47ebe7efdd76a03b5a1127863f7b3c9aec4c3e6c8bb3a7bbf81d553d56a1fd35728f5a8ef4c63f867ac8d690109742a8c1 languageName: node linkType: hard @@ -3811,21 +3811,21 @@ __metadata: string-width: "npm:^4.2.0" strip-ansi: "npm:^6.0.1" wrap-ansi: "npm:^7.0.0" - checksum: 4bda0f09c340cbb6dfdc1ed508b3ca080f12992c18d68c6be4d9cf51756033d5266e61ec57529e610dacbf4da1c634423b0c1b11037709cc6b09045cbd815df5 + checksum: 10c0/4bda0f09c340cbb6dfdc1ed508b3ca080f12992c18d68c6be4d9cf51756033d5266e61ec57529e610dacbf4da1c634423b0c1b11037709cc6b09045cbd815df5 languageName: node linkType: hard "clsx@npm:^1.1.0": version: 1.2.1 resolution: "clsx@npm:1.2.1" - checksum: 34dead8bee24f5e96f6e7937d711978380647e936a22e76380290e35486afd8634966ce300fc4b74a32f3762c7d4c0303f442c3e259f4ce02374eb0c82834f27 + checksum: 10c0/34dead8bee24f5e96f6e7937d711978380647e936a22e76380290e35486afd8634966ce300fc4b74a32f3762c7d4c0303f442c3e259f4ce02374eb0c82834f27 languageName: node linkType: hard "clsx@npm:^2.0.0, clsx@npm:^2.1.0": version: 2.1.0 resolution: "clsx@npm:2.1.0" - checksum: c09c00ad14f638366ca814097e6cab533dfa1972a358da5b557be487168acbb25b4c1395e89ffa842a8a61ba87a462d2b4885bc9d4f8410b598f3cb339599cdb + checksum: 10c0/c09c00ad14f638366ca814097e6cab533dfa1972a358da5b557be487168acbb25b4c1395e89ffa842a8a61ba87a462d2b4885bc9d4f8410b598f3cb339599cdb languageName: node linkType: hard @@ -3834,7 +3834,7 @@ __metadata: resolution: "color-convert@npm:1.9.3" dependencies: color-name: "npm:1.1.3" - checksum: 5ad3c534949a8c68fca8fbc6f09068f435f0ad290ab8b2f76841b9e6af7e0bb57b98cb05b0e19fe33f5d91e5a8611ad457e5f69e0a484caad1f7487fd0e8253c + checksum: 10c0/5ad3c534949a8c68fca8fbc6f09068f435f0ad290ab8b2f76841b9e6af7e0bb57b98cb05b0e19fe33f5d91e5a8611ad457e5f69e0a484caad1f7487fd0e8253c languageName: node linkType: hard @@ -3843,21 +3843,21 @@ __metadata: resolution: "color-convert@npm:2.0.1" dependencies: color-name: "npm:~1.1.4" - checksum: 37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 + checksum: 10c0/37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 languageName: node linkType: hard "color-name@npm:1.1.3": version: 1.1.3 resolution: "color-name@npm:1.1.3" - checksum: 566a3d42cca25b9b3cd5528cd7754b8e89c0eb646b7f214e8e2eaddb69994ac5f0557d9c175eb5d8f0ad73531140d9c47525085ee752a91a2ab15ab459caf6d6 + checksum: 10c0/566a3d42cca25b9b3cd5528cd7754b8e89c0eb646b7f214e8e2eaddb69994ac5f0557d9c175eb5d8f0ad73531140d9c47525085ee752a91a2ab15ab459caf6d6 languageName: node linkType: hard "color-name@npm:~1.1.4": version: 1.1.4 resolution: "color-name@npm:1.1.4" - checksum: a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 + checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 languageName: node linkType: hard @@ -3866,70 +3866,70 @@ __metadata: resolution: "color-support@npm:1.1.3" bin: color-support: bin.js - checksum: 8ffeaa270a784dc382f62d9be0a98581db43e11eee301af14734a6d089bd456478b1a8b3e7db7ca7dc5b18a75f828f775c44074020b51c05fc00e6d0992b1cc6 + checksum: 10c0/8ffeaa270a784dc382f62d9be0a98581db43e11eee301af14734a6d089bd456478b1a8b3e7db7ca7dc5b18a75f828f775c44074020b51c05fc00e6d0992b1cc6 languageName: node linkType: hard "commander@npm:7": version: 7.2.0 resolution: "commander@npm:7.2.0" - checksum: 8d690ff13b0356df7e0ebbe6c59b4712f754f4b724d4f473d3cc5b3fdcf978e3a5dc3078717858a2ceb50b0f84d0660a7f22a96cdc50fb877d0c9bb31593d23a + checksum: 10c0/8d690ff13b0356df7e0ebbe6c59b4712f754f4b724d4f473d3cc5b3fdcf978e3a5dc3078717858a2ceb50b0f84d0660a7f22a96cdc50fb877d0c9bb31593d23a languageName: node linkType: hard "commander@npm:^10.0.0": version: 10.0.1 resolution: "commander@npm:10.0.1" - checksum: 53f33d8927758a911094adadda4b2cbac111a5b377d8706700587650fd8f45b0bbe336de4b5c3fe47fd61f420a3d9bd452b6e0e6e5600a7e74d7bf0174f6efe3 + checksum: 10c0/53f33d8927758a911094adadda4b2cbac111a5b377d8706700587650fd8f45b0bbe336de4b5c3fe47fd61f420a3d9bd452b6e0e6e5600a7e74d7bf0174f6efe3 languageName: node linkType: hard "commander@npm:^2.20.0": version: 2.20.3 resolution: "commander@npm:2.20.3" - checksum: 74c781a5248c2402a0a3e966a0a2bba3c054aad144f5c023364be83265e796b20565aa9feff624132ff629aa64e16999fa40a743c10c12f7c61e96a794b99288 + checksum: 10c0/74c781a5248c2402a0a3e966a0a2bba3c054aad144f5c023364be83265e796b20565aa9feff624132ff629aa64e16999fa40a743c10c12f7c61e96a794b99288 languageName: node linkType: hard "commander@npm:^8.0.0": version: 8.3.0 resolution: "commander@npm:8.3.0" - checksum: 8b043bb8322ea1c39664a1598a95e0495bfe4ca2fad0d84a92d7d1d8d213e2a155b441d2470c8e08de7c4a28cf2bc6e169211c49e1b21d9f7edc6ae4d9356060 + checksum: 10c0/8b043bb8322ea1c39664a1598a95e0495bfe4ca2fad0d84a92d7d1d8d213e2a155b441d2470c8e08de7c4a28cf2bc6e169211c49e1b21d9f7edc6ae4d9356060 languageName: node linkType: hard "common-tags@npm:^1.8.0": version: 1.8.2 resolution: "common-tags@npm:1.8.2" - checksum: 23efe47ff0a1a7c91489271b3a1e1d2a171c12ec7f9b35b29b2fce51270124aff0ec890087e2bc2182c1cb746e232ab7561aaafe05f1e7452aea733d2bfe3f63 + checksum: 10c0/23efe47ff0a1a7c91489271b3a1e1d2a171c12ec7f9b35b29b2fce51270124aff0ec890087e2bc2182c1cb746e232ab7561aaafe05f1e7452aea733d2bfe3f63 languageName: node linkType: hard "concat-map@npm:0.0.1": version: 0.0.1 resolution: "concat-map@npm:0.0.1" - checksum: c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f + checksum: 10c0/c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f languageName: node linkType: hard "confusing-browser-globals@npm:^1.0.10": version: 1.0.11 resolution: "confusing-browser-globals@npm:1.0.11" - checksum: 475d0a284fa964a5182b519af5738b5b64bf7e413cfd703c1b3496bf6f4df9f827893a9b221c0ea5873c1476835beb1e0df569ba643eff0734010c1eb780589e + checksum: 10c0/475d0a284fa964a5182b519af5738b5b64bf7e413cfd703c1b3496bf6f4df9f827893a9b221c0ea5873c1476835beb1e0df569ba643eff0734010c1eb780589e languageName: node linkType: hard "console-control-strings@npm:^1.1.0": version: 1.1.0 resolution: "console-control-strings@npm:1.1.0" - checksum: 7ab51d30b52d461412cd467721bb82afe695da78fff8f29fe6f6b9cbaac9a2328e27a22a966014df9532100f6dd85370460be8130b9c677891ba36d96a343f50 + checksum: 10c0/7ab51d30b52d461412cd467721bb82afe695da78fff8f29fe6f6b9cbaac9a2328e27a22a966014df9532100f6dd85370460be8130b9c677891ba36d96a343f50 languageName: node linkType: hard "convert-source-map@npm:^1.5.0, convert-source-map@npm:^1.7.0": version: 1.9.0 resolution: "convert-source-map@npm:1.9.0" - checksum: 281da55454bf8126cbc6625385928c43479f2060984180c42f3a86c8b8c12720a24eac260624a7d1e090004028d2dee78602330578ceec1a08e27cb8bb0a8a5b + checksum: 10c0/281da55454bf8126cbc6625385928c43479f2060984180c42f3a86c8b8c12720a24eac260624a7d1e090004028d2dee78602330578ceec1a08e27cb8bb0a8a5b languageName: node linkType: hard @@ -3938,7 +3938,7 @@ __metadata: resolution: "core-js-compat@npm:3.32.0" dependencies: browserslist: "npm:^4.21.9" - checksum: 9d3164c4c2ab602d22a6f653611a72fc3fe875b69379dad974786b01e8f93ba338bdb27c0b46d9aaf40ebd97c275a0004d3051c33691de3b2da3e636399a63a0 + checksum: 10c0/9d3164c4c2ab602d22a6f653611a72fc3fe875b69379dad974786b01e8f93ba338bdb27c0b46d9aaf40ebd97c275a0004d3051c33691de3b2da3e636399a63a0 languageName: node linkType: hard @@ -3951,14 +3951,14 @@ __metadata: parse-json: "npm:^5.0.0" path-type: "npm:^4.0.0" yaml: "npm:^1.10.0" - checksum: b923ff6af581638128e5f074a5450ba12c0300b71302398ea38dbeabd33bbcaa0245ca9adbedfcf284a07da50f99ede5658c80bb3e39e2ce770a99d28a21ef03 + checksum: 10c0/b923ff6af581638128e5f074a5450ba12c0300b71302398ea38dbeabd33bbcaa0245ca9adbedfcf284a07da50f99ede5658c80bb3e39e2ce770a99d28a21ef03 languageName: node linkType: hard "crelt@npm:^1.0.5": version: 1.0.6 resolution: "crelt@npm:1.0.6" - checksum: e0fb76dff50c5eb47f2ea9b786c17f9425c66276025adee80876bdbf4a84ab72e899e56d3928431ab0cb057a105ef704df80fe5726ef0f7b1658f815521bdf09 + checksum: 10c0/e0fb76dff50c5eb47f2ea9b786c17f9425c66276025adee80876bdbf4a84ab72e899e56d3928431ab0cb057a105ef704df80fe5726ef0f7b1658f815521bdf09 languageName: node linkType: hard @@ -3970,7 +3970,7 @@ __metadata: bin: cross-env: src/bin/cross-env.js cross-env-shell: src/bin/cross-env-shell.js - checksum: f3765c25746c69fcca369655c442c6c886e54ccf3ab8c16847d5ad0e91e2f337d36eedc6599c1227904bf2a228d721e690324446876115bc8e7b32a866735ecf + checksum: 10c0/f3765c25746c69fcca369655c442c6c886e54ccf3ab8c16847d5ad0e91e2f337d36eedc6599c1227904bf2a228d721e690324446876115bc8e7b32a866735ecf languageName: node linkType: hard @@ -3981,21 +3981,21 @@ __metadata: path-key: "npm:^3.1.0" shebang-command: "npm:^2.0.0" which: "npm:^2.0.1" - checksum: 5738c312387081c98d69c98e105b6327b069197f864a60593245d64c8089c8a0a744e16349281210d56835bb9274130d825a78b2ad6853ca13cfbeffc0c31750 + checksum: 10c0/5738c312387081c98d69c98e105b6327b069197f864a60593245d64c8089c8a0a744e16349281210d56835bb9274130d825a78b2ad6853ca13cfbeffc0c31750 languageName: node linkType: hard "crypto-random-string@npm:^2.0.0": version: 2.0.0 resolution: "crypto-random-string@npm:2.0.0" - checksum: 288589b2484fe787f9e146f56c4be90b940018f17af1b152e4dde12309042ff5a2bf69e949aab8b8ac253948381529cc6f3e5a2427b73643a71ff177fa122b37 + checksum: 10c0/288589b2484fe787f9e146f56c4be90b940018f17af1b152e4dde12309042ff5a2bf69e949aab8b8ac253948381529cc6f3e5a2427b73643a71ff177fa122b37 languageName: node linkType: hard -"csstype@npm:^3.0.2, csstype@npm:^3.1.2, csstype@npm:^3.1.3": +"csstype@npm:^3.0.2, csstype@npm:^3.1.3": version: 3.1.3 resolution: "csstype@npm:3.1.3" - checksum: 80c089d6f7e0c5b2bd83cf0539ab41474198579584fa10d86d0cafe0642202343cbc119e076a0b1aece191989477081415d66c9fefbf3c957fc2fc4b7009f248 + checksum: 10c0/80c089d6f7e0c5b2bd83cf0539ab41474198579584fa10d86d0cafe0642202343cbc119e076a0b1aece191989477081415d66c9fefbf3c957fc2fc4b7009f248 languageName: node linkType: hard @@ -4004,14 +4004,14 @@ __metadata: resolution: "d3-array@npm:3.2.4" dependencies: internmap: "npm:1 - 2" - checksum: 08b95e91130f98c1375db0e0af718f4371ccacef7d5d257727fe74f79a24383e79aba280b9ffae655483ffbbad4fd1dec4ade0119d88c4749f388641c8bf8c50 + checksum: 10c0/08b95e91130f98c1375db0e0af718f4371ccacef7d5d257727fe74f79a24383e79aba280b9ffae655483ffbbad4fd1dec4ade0119d88c4749f388641c8bf8c50 languageName: node linkType: hard "d3-axis@npm:3": version: 3.0.0 resolution: "d3-axis@npm:3.0.0" - checksum: a271e70ba1966daa5aaf6a7f959ceca3e12997b43297e757c7b945db2e1ead3c6ee226f2abcfa22abbd4e2e28bd2b71a0911794c4e5b911bbba271328a582c78 + checksum: 10c0/a271e70ba1966daa5aaf6a7f959ceca3e12997b43297e757c7b945db2e1ead3c6ee226f2abcfa22abbd4e2e28bd2b71a0911794c4e5b911bbba271328a582c78 languageName: node linkType: hard @@ -4024,7 +4024,7 @@ __metadata: d3-interpolate: "npm:1 - 3" d3-selection: "npm:3" d3-transition: "npm:3" - checksum: 07baf00334c576da2f68a91fc0da5732c3a5fa19bd3d7aed7fd24d1d674a773f71a93e9687c154176f7246946194d77c48c2d8fed757f5dcb1a4740067ec50a8 + checksum: 10c0/07baf00334c576da2f68a91fc0da5732c3a5fa19bd3d7aed7fd24d1d674a773f71a93e9687c154176f7246946194d77c48c2d8fed757f5dcb1a4740067ec50a8 languageName: node linkType: hard @@ -4033,14 +4033,14 @@ __metadata: resolution: "d3-chord@npm:3.0.1" dependencies: d3-path: "npm:1 - 3" - checksum: baa6013914af3f4fe1521f0d16de31a38eb8a71d08ff1dec4741f6f45a828661e5cd3935e39bd14e3032bdc78206c283ca37411da21d46ec3cfc520be6e7a7ce + checksum: 10c0/baa6013914af3f4fe1521f0d16de31a38eb8a71d08ff1dec4741f6f45a828661e5cd3935e39bd14e3032bdc78206c283ca37411da21d46ec3cfc520be6e7a7ce languageName: node linkType: hard "d3-color@npm:1 - 3, d3-color@npm:3": version: 3.1.0 resolution: "d3-color@npm:3.1.0" - checksum: a4e20e1115fa696fce041fbe13fbc80dc4c19150fa72027a7c128ade980bc0eeeba4bcf28c9e21f0bce0e0dbfe7ca5869ef67746541dcfda053e4802ad19783c + checksum: 10c0/a4e20e1115fa696fce041fbe13fbc80dc4c19150fa72027a7c128ade980bc0eeeba4bcf28c9e21f0bce0e0dbfe7ca5869ef67746541dcfda053e4802ad19783c languageName: node linkType: hard @@ -4049,7 +4049,7 @@ __metadata: resolution: "d3-contour@npm:4.0.2" dependencies: d3-array: "npm:^3.2.0" - checksum: 98bc5fbed6009e08707434a952076f39f1cd6ed8b9288253cc3e6a3286e4e80c63c62d84954b20e64bf6e4ededcc69add54d3db25e990784a59c04edd3449032 + checksum: 10c0/98bc5fbed6009e08707434a952076f39f1cd6ed8b9288253cc3e6a3286e4e80c63c62d84954b20e64bf6e4ededcc69add54d3db25e990784a59c04edd3449032 languageName: node linkType: hard @@ -4058,14 +4058,14 @@ __metadata: resolution: "d3-delaunay@npm:6.0.4" dependencies: delaunator: "npm:5" - checksum: 57c3aecd2525664b07c4c292aa11cf49b2752c0cf3f5257f752999399fe3c592de2d418644d79df1f255471eec8057a9cc0c3062ed7128cb3348c45f69597754 + checksum: 10c0/57c3aecd2525664b07c4c292aa11cf49b2752c0cf3f5257f752999399fe3c592de2d418644d79df1f255471eec8057a9cc0c3062ed7128cb3348c45f69597754 languageName: node linkType: hard "d3-dispatch@npm:1 - 3, d3-dispatch@npm:3, d3-dispatch@npm:^3.0.1": version: 3.0.1 resolution: "d3-dispatch@npm:3.0.1" - checksum: 6eca77008ce2dc33380e45d4410c67d150941df7ab45b91d116dbe6d0a3092c0f6ac184dd4602c796dc9e790222bad3ff7142025f5fd22694efe088d1d941753 + checksum: 10c0/6eca77008ce2dc33380e45d4410c67d150941df7ab45b91d116dbe6d0a3092c0f6ac184dd4602c796dc9e790222bad3ff7142025f5fd22694efe088d1d941753 languageName: node linkType: hard @@ -4075,7 +4075,7 @@ __metadata: dependencies: d3-dispatch: "npm:1 - 3" d3-selection: "npm:3" - checksum: d2556e8dc720741a443b595a30af403dd60642dfd938d44d6e9bfc4c71a962142f9a028c56b61f8b4790b65a34acad177d1263d66f103c3c527767b0926ef5aa + checksum: 10c0/d2556e8dc720741a443b595a30af403dd60642dfd938d44d6e9bfc4c71a962142f9a028c56b61f8b4790b65a34acad177d1263d66f103c3c527767b0926ef5aa languageName: node linkType: hard @@ -4096,14 +4096,14 @@ __metadata: json2tsv: bin/json2dsv.js tsv2csv: bin/dsv2dsv.js tsv2json: bin/dsv2json.js - checksum: 10e6af9e331950ed258f34ab49ac1b7060128ef81dcf32afc790bd1f7e8c3cc2aac7f5f875250a83f21f39bb5925fbd0872bb209f8aca32b3b77d32bab8a65ab + checksum: 10c0/10e6af9e331950ed258f34ab49ac1b7060128ef81dcf32afc790bd1f7e8c3cc2aac7f5f875250a83f21f39bb5925fbd0872bb209f8aca32b3b77d32bab8a65ab languageName: node linkType: hard "d3-ease@npm:1 - 3, d3-ease@npm:3": version: 3.0.1 resolution: "d3-ease@npm:3.0.1" - checksum: fec8ef826c0cc35cda3092c6841e07672868b1839fcaf556e19266a3a37e6bc7977d8298c0fcb9885e7799bfdcef7db1baaba9cd4dcf4bc5e952cf78574a88b0 + checksum: 10c0/fec8ef826c0cc35cda3092c6841e07672868b1839fcaf556e19266a3a37e6bc7977d8298c0fcb9885e7799bfdcef7db1baaba9cd4dcf4bc5e952cf78574a88b0 languageName: node linkType: hard @@ -4112,7 +4112,7 @@ __metadata: resolution: "d3-fetch@npm:3.0.1" dependencies: d3-dsv: "npm:1 - 3" - checksum: 4f467a79bf290395ac0cbb5f7562483f6a18668adc4c8eb84c9d3eff048b6f6d3b6f55079ba1ebf1908dabe000c941d46be447f8d78453b2dad5fb59fb6aa93b + checksum: 10c0/4f467a79bf290395ac0cbb5f7562483f6a18668adc4c8eb84c9d3eff048b6f6d3b6f55079ba1ebf1908dabe000c941d46be447f8d78453b2dad5fb59fb6aa93b languageName: node linkType: hard @@ -4123,14 +4123,14 @@ __metadata: d3-dispatch: "npm:1 - 3" d3-quadtree: "npm:1 - 3" d3-timer: "npm:1 - 3" - checksum: 220a16a1a1ac62ba56df61028896e4b52be89c81040d20229c876efc8852191482c233f8a52bb5a4e0875c321b8e5cb6413ef3dfa4d8fe79eeb7d52c587f52cf + checksum: 10c0/220a16a1a1ac62ba56df61028896e4b52be89c81040d20229c876efc8852191482c233f8a52bb5a4e0875c321b8e5cb6413ef3dfa4d8fe79eeb7d52c587f52cf languageName: node linkType: hard "d3-format@npm:1 - 3, d3-format@npm:3, d3-format@npm:^3.1.0": version: 3.1.0 resolution: "d3-format@npm:3.1.0" - checksum: 049f5c0871ebce9859fc5e2f07f336b3c5bfff52a2540e0bac7e703fce567cd9346f4ad1079dd18d6f1e0eaa0599941c1810898926f10ac21a31fd0a34b4aa75 + checksum: 10c0/049f5c0871ebce9859fc5e2f07f336b3c5bfff52a2540e0bac7e703fce567cd9346f4ad1079dd18d6f1e0eaa0599941c1810898926f10ac21a31fd0a34b4aa75 languageName: node linkType: hard @@ -4139,15 +4139,15 @@ __metadata: resolution: "d3-geo@npm:3.1.0" dependencies: d3-array: "npm:2.5.0 - 3" - checksum: 5b0a26d232787ca9e824a660827c28626a51004328dde7c76a1bd300d3cad8c7eeb55fea64c8cd6495d5a34fea434fb1418d59926a6cb24e6fb6e2b6f62c6bd9 + checksum: 10c0/5b0a26d232787ca9e824a660827c28626a51004328dde7c76a1bd300d3cad8c7eeb55fea64c8cd6495d5a34fea434fb1418d59926a6cb24e6fb6e2b6f62c6bd9 languageName: node linkType: hard -"d3-graphviz@npm:5.2.0": - version: 5.2.0 - resolution: "d3-graphviz@npm:5.2.0" +"d3-graphviz@npm:5.3.0": + version: 5.3.0 + resolution: "d3-graphviz@npm:5.3.0" dependencies: - "@hpcc-js/wasm": "npm:^2.14.1" + "@hpcc-js/wasm": "npm:^2.16.0" d3-dispatch: "npm:^3.0.1" d3-format: "npm:^3.1.0" d3-interpolate: "npm:^3.0.1" @@ -4157,15 +4157,15 @@ __metadata: d3-zoom: "npm:^3.0.0" peerDependencies: d3-selection: ^3.0.0 - checksum: 6ac36bc497e1c1007168ec1125911117161290b2006150bbcc1de7f6caa4a9023cc1703a65a6077dc4a19bc659ccfb4d57ad6e8557c730448d1a0403583018fb + checksum: 10c0/32bda121b6edbaf8fbd9c043b6106090f4463c5614ff43a856626bef6ae3683d2ba89e5073a668276df07a955fd9c2ab1fa0743b077ee61e7a675196c6eab2d8 languageName: node linkType: hard -"d3-graphviz@patch:d3-graphviz@npm%3A5.2.0#~/.yarn/patches/d3-graphviz-npm-5.2.0-161b1fbad4.patch": - version: 5.2.0 - resolution: "d3-graphviz@patch:d3-graphviz@npm%3A5.2.0#~/.yarn/patches/d3-graphviz-npm-5.2.0-161b1fbad4.patch::version=5.2.0&hash=dcacac" +"d3-graphviz@patch:d3-graphviz@npm%3A5.3.0#~/.yarn/patches/d3-graphviz-npm-5.3.0-e0eace978a.patch": + version: 5.3.0 + resolution: "d3-graphviz@patch:d3-graphviz@npm%3A5.3.0#~/.yarn/patches/d3-graphviz-npm-5.3.0-e0eace978a.patch::version=5.3.0&hash=f1a735" dependencies: - "@hpcc-js/wasm": "npm:^2.14.1" + "@hpcc-js/wasm": "npm:^2.16.0" d3-dispatch: "npm:^3.0.1" d3-format: "npm:^3.1.0" d3-interpolate: "npm:^3.0.1" @@ -4175,14 +4175,14 @@ __metadata: d3-zoom: "npm:^3.0.0" peerDependencies: d3-selection: ^3.0.0 - checksum: 3deb155d85d6fccb1b6b74485ef0053f0016da3ae0a036b25f530fd701aabda938ba4bb31daacb07b71661fc7bcec381ad689d5e138223299089c7b4d9aac008 + checksum: 10c0/d2faa0e7c2fe6007ea466a88fb1199e2d4ca0170a674cf0144a9adddcc5cb93538379b7860b26770466f3549ed9a63f6dd3de4091a33ad3e2d48a63ca7ce07fe languageName: node linkType: hard "d3-hierarchy@npm:3": version: 3.1.2 resolution: "d3-hierarchy@npm:3.1.2" - checksum: 6dcdb480539644aa7fc0d72dfc7b03f99dfbcdf02714044e8c708577e0d5981deb9d3e99bbbb2d26422b55bcc342ac89a0fa2ea6c9d7302e2fc0951dd96f89cf + checksum: 10c0/6dcdb480539644aa7fc0d72dfc7b03f99dfbcdf02714044e8c708577e0d5981deb9d3e99bbbb2d26422b55bcc342ac89a0fa2ea6c9d7302e2fc0951dd96f89cf languageName: node linkType: hard @@ -4191,35 +4191,35 @@ __metadata: resolution: "d3-interpolate@npm:3.0.1" dependencies: d3-color: "npm:1 - 3" - checksum: 19f4b4daa8d733906671afff7767c19488f51a43d251f8b7f484d5d3cfc36c663f0a66c38fe91eee30f40327443d799be17169f55a293a3ba949e84e57a33e6a + checksum: 10c0/19f4b4daa8d733906671afff7767c19488f51a43d251f8b7f484d5d3cfc36c663f0a66c38fe91eee30f40327443d799be17169f55a293a3ba949e84e57a33e6a languageName: node linkType: hard "d3-path@npm:1 - 3, d3-path@npm:3, d3-path@npm:^3.1.0": version: 3.1.0 resolution: "d3-path@npm:3.1.0" - checksum: dc1d58ec87fa8319bd240cf7689995111a124b141428354e9637aa83059eb12e681f77187e0ada5dedfce346f7e3d1f903467ceb41b379bfd01cd8e31721f5da + checksum: 10c0/dc1d58ec87fa8319bd240cf7689995111a124b141428354e9637aa83059eb12e681f77187e0ada5dedfce346f7e3d1f903467ceb41b379bfd01cd8e31721f5da languageName: node linkType: hard "d3-polygon@npm:3": version: 3.0.1 resolution: "d3-polygon@npm:3.0.1" - checksum: e236aa7f33efa9a4072907af7dc119f85b150a0716759d4fe5f12f62573018264a6cbde8617fbfa6944a7ae48c1c0c8d3f39ae72e11f66dd471e9b5e668385df + checksum: 10c0/e236aa7f33efa9a4072907af7dc119f85b150a0716759d4fe5f12f62573018264a6cbde8617fbfa6944a7ae48c1c0c8d3f39ae72e11f66dd471e9b5e668385df languageName: node linkType: hard "d3-quadtree@npm:1 - 3, d3-quadtree@npm:3": version: 3.0.1 resolution: "d3-quadtree@npm:3.0.1" - checksum: 18302d2548bfecaef788152397edec95a76400fd97d9d7f42a089ceb68d910f685c96579d74e3712d57477ed042b056881b47cd836a521de683c66f47ce89090 + checksum: 10c0/18302d2548bfecaef788152397edec95a76400fd97d9d7f42a089ceb68d910f685c96579d74e3712d57477ed042b056881b47cd836a521de683c66f47ce89090 languageName: node linkType: hard "d3-random@npm:3": version: 3.0.1 resolution: "d3-random@npm:3.0.1" - checksum: 987a1a1bcbf26e6cf01fd89d5a265b463b2cea93560fc17d9b1c45e8ed6ff2db5924601bcceb808de24c94133f000039eb7fa1c469a7a844ccbf1170cbb25b41 + checksum: 10c0/987a1a1bcbf26e6cf01fd89d5a265b463b2cea93560fc17d9b1c45e8ed6ff2db5924601bcceb808de24c94133f000039eb7fa1c469a7a844ccbf1170cbb25b41 languageName: node linkType: hard @@ -4229,7 +4229,7 @@ __metadata: dependencies: d3-color: "npm:1 - 3" d3-interpolate: "npm:1 - 3" - checksum: 920a80f2e31b5686798c116e99d1671c32f55fb60fa920b742aa4ac5175b878c615adb4e55a246d65367e6e1061fdbcc55807be731fb5b18ae628d1df62bfac1 + checksum: 10c0/920a80f2e31b5686798c116e99d1671c32f55fb60fa920b742aa4ac5175b878c615adb4e55a246d65367e6e1061fdbcc55807be731fb5b18ae628d1df62bfac1 languageName: node linkType: hard @@ -4242,14 +4242,14 @@ __metadata: d3-interpolate: "npm:1.2.0 - 3" d3-time: "npm:2.1.1 - 3" d3-time-format: "npm:2 - 4" - checksum: 65d9ad8c2641aec30ed5673a7410feb187a224d6ca8d1a520d68a7d6eac9d04caedbff4713d1e8545be33eb7fec5739983a7ab1d22d4e5ad35368c6729d362f1 + checksum: 10c0/65d9ad8c2641aec30ed5673a7410feb187a224d6ca8d1a520d68a7d6eac9d04caedbff4713d1e8545be33eb7fec5739983a7ab1d22d4e5ad35368c6729d362f1 languageName: node linkType: hard "d3-selection@npm:2 - 3, d3-selection@npm:3, d3-selection@npm:^3.0.0": version: 3.0.0 resolution: "d3-selection@npm:3.0.0" - checksum: e59096bbe8f0cb0daa1001d9bdd6dbc93a688019abc97d1d8b37f85cd3c286a6875b22adea0931b0c88410d025563e1643019161a883c516acf50c190a11b56b + checksum: 10c0/e59096bbe8f0cb0daa1001d9bdd6dbc93a688019abc97d1d8b37f85cd3c286a6875b22adea0931b0c88410d025563e1643019161a883c516acf50c190a11b56b languageName: node linkType: hard @@ -4258,7 +4258,7 @@ __metadata: resolution: "d3-shape@npm:3.2.0" dependencies: d3-path: "npm:^3.1.0" - checksum: f1c9d1f09926daaf6f6193ae3b4c4b5521e81da7d8902d24b38694517c7f527ce3c9a77a9d3a5722ad1e3ff355860b014557b450023d66a944eabf8cfde37132 + checksum: 10c0/f1c9d1f09926daaf6f6193ae3b4c4b5521e81da7d8902d24b38694517c7f527ce3c9a77a9d3a5722ad1e3ff355860b014557b450023d66a944eabf8cfde37132 languageName: node linkType: hard @@ -4267,7 +4267,7 @@ __metadata: resolution: "d3-time-format@npm:4.1.0" dependencies: d3-time: "npm:1 - 3" - checksum: 735e00fb25a7fd5d418fac350018713ae394eefddb0d745fab12bbff0517f9cdb5f807c7bbe87bb6eeb06249662f8ea84fec075f7d0cd68609735b2ceb29d206 + checksum: 10c0/735e00fb25a7fd5d418fac350018713ae394eefddb0d745fab12bbff0517f9cdb5f807c7bbe87bb6eeb06249662f8ea84fec075f7d0cd68609735b2ceb29d206 languageName: node linkType: hard @@ -4276,14 +4276,14 @@ __metadata: resolution: "d3-time@npm:3.1.0" dependencies: d3-array: "npm:2 - 3" - checksum: a984f77e1aaeaa182679b46fbf57eceb6ebdb5f67d7578d6f68ef933f8eeb63737c0949991618a8d29472dbf43736c7d7f17c452b2770f8c1271191cba724ca1 + checksum: 10c0/a984f77e1aaeaa182679b46fbf57eceb6ebdb5f67d7578d6f68ef933f8eeb63737c0949991618a8d29472dbf43736c7d7f17c452b2770f8c1271191cba724ca1 languageName: node linkType: hard "d3-timer@npm:1 - 3, d3-timer@npm:3, d3-timer@npm:^3.0.1": version: 3.0.1 resolution: "d3-timer@npm:3.0.1" - checksum: d4c63cb4bb5461d7038aac561b097cd1c5673969b27cbdd0e87fa48d9300a538b9e6f39b4a7f0e3592ef4f963d858c8a9f0e92754db73116770856f2fc04561a + checksum: 10c0/d4c63cb4bb5461d7038aac561b097cd1c5673969b27cbdd0e87fa48d9300a538b9e6f39b4a7f0e3592ef4f963d858c8a9f0e92754db73116770856f2fc04561a languageName: node linkType: hard @@ -4298,7 +4298,7 @@ __metadata: d3-timer: "npm:1 - 3" peerDependencies: d3-selection: 2 - 3 - checksum: 4e74535dda7024aa43e141635b7522bb70cf9d3dfefed975eb643b36b864762eca67f88fafc2ca798174f83ca7c8a65e892624f824b3f65b8145c6a1a88dbbad + checksum: 10c0/4e74535dda7024aa43e141635b7522bb70cf9d3dfefed975eb643b36b864762eca67f88fafc2ca798174f83ca7c8a65e892624f824b3f65b8145c6a1a88dbbad languageName: node linkType: hard @@ -4311,7 +4311,7 @@ __metadata: d3-interpolate: "npm:1 - 3" d3-selection: "npm:2 - 3" d3-transition: "npm:2 - 3" - checksum: ee2036479049e70d8c783d594c444fe00e398246048e3f11a59755cd0e21de62ece3126181b0d7a31bf37bcf32fd726f83ae7dea4495ff86ec7736ce5ad36fd3 + checksum: 10c0/ee2036479049e70d8c783d594c444fe00e398246048e3f11a59755cd0e21de62ece3126181b0d7a31bf37bcf32fd726f83ae7dea4495ff86ec7736ce5ad36fd3 languageName: node linkType: hard @@ -4324,7 +4324,7 @@ __metadata: d3-interpolate: "npm:1 - 3" d3-selection: "npm:2 - 3" d3-transition: "npm:2 - 3" - checksum: fc56f5be9f492b7d7bba91b166f4b93e1761599a23496b0f2890e295476971a8db040b0c2069b670897984ed28c4f0d151caf1d51e305fe635e80cdb94f2c2af + checksum: 10c0/fc56f5be9f492b7d7bba91b166f4b93e1761599a23496b0f2890e295476971a8db040b0c2069b670897984ed28c4f0d151caf1d51e305fe635e80cdb94f2c2af languageName: node linkType: hard @@ -4362,14 +4362,14 @@ __metadata: d3-timer: "npm:3" d3-transition: "npm:3" d3-zoom: "npm:3" - checksum: 408758dcc2437cbff8cd207b9d82760030b5c53c1df6a2ce5b1a76633388a6892fd65c0632cfa83da963e239722d49805062e5fb05d99e0fb078bda14cb22222 + checksum: 10c0/408758dcc2437cbff8cd207b9d82760030b5c53c1df6a2ce5b1a76633388a6892fd65c0632cfa83da963e239722d49805062e5fb05d99e0fb078bda14cb22222 languageName: node linkType: hard "damerau-levenshtein@npm:^1.0.8": version: 1.0.8 resolution: "damerau-levenshtein@npm:1.0.8" - checksum: 4c2647e0f42acaee7d068756c1d396e296c3556f9c8314bac1ac63ffb236217ef0e7e58602b18bb2173deec7ec8e0cac8e27cccf8f5526666b4ff11a13ad54a3 + checksum: 10c0/4c2647e0f42acaee7d068756c1d396e296c3556f9c8314bac1ac63ffb236217ef0e7e58602b18bb2173deec7ec8e0cac8e27cccf8f5526666b4ff11a13ad54a3 languageName: node linkType: hard @@ -4381,7 +4381,7 @@ __metadata: peerDependenciesMeta: supports-color: optional: true - checksum: cedbec45298dd5c501d01b92b119cd3faebe5438c3917ff11ae1bff86a6c722930ac9c8659792824013168ba6db7c4668225d845c633fbdafbbf902a6389f736 + checksum: 10c0/cedbec45298dd5c501d01b92b119cd3faebe5438c3917ff11ae1bff86a6c722930ac9c8659792824013168ba6db7c4668225d845c633fbdafbbf902a6389f736 languageName: node linkType: hard @@ -4390,21 +4390,21 @@ __metadata: resolution: "debug@npm:3.2.7" dependencies: ms: "npm:^2.1.1" - checksum: 37d96ae42cbc71c14844d2ae3ba55adf462ec89fd3a999459dec3833944cd999af6007ff29c780f1c61153bcaaf2c842d1e4ce1ec621e4fc4923244942e4a02a + checksum: 10c0/37d96ae42cbc71c14844d2ae3ba55adf462ec89fd3a999459dec3833944cd999af6007ff29c780f1c61153bcaaf2c842d1e4ce1ec621e4fc4923244942e4a02a languageName: node linkType: hard "deep-is@npm:^0.1.3": version: 0.1.4 resolution: "deep-is@npm:0.1.4" - checksum: 7f0ee496e0dff14a573dc6127f14c95061b448b87b995fc96c017ce0a1e66af1675e73f1d6064407975bc4ea6ab679497a29fff7b5b9c4e99cb10797c1ad0b4c + checksum: 10c0/7f0ee496e0dff14a573dc6127f14c95061b448b87b995fc96c017ce0a1e66af1675e73f1d6064407975bc4ea6ab679497a29fff7b5b9c4e99cb10797c1ad0b4c languageName: node linkType: hard "deepmerge@npm:^4.2.2": version: 4.3.1 resolution: "deepmerge@npm:4.3.1" - checksum: e53481aaf1aa2c4082b5342be6b6d8ad9dfe387bc92ce197a66dea08bd4265904a087e75e464f14d1347cf2ac8afe1e4c16b266e0561cc5df29382d3c5f80044 + checksum: 10c0/e53481aaf1aa2c4082b5342be6b6d8ad9dfe387bc92ce197a66dea08bd4265904a087e75e464f14d1347cf2ac8afe1e4c16b266e0561cc5df29382d3c5f80044 languageName: node linkType: hard @@ -4415,7 +4415,7 @@ __metadata: get-intrinsic: "npm:^1.2.1" gopd: "npm:^1.0.1" has-property-descriptors: "npm:^1.0.0" - checksum: 77ef6e0bceb515e05b5913ab635a84d537cee84f8a7c37c77fdcb31fc5b80f6dbe81b33375e4b67d96aa04e6a0d8d4ea099e431d83f089af8d93adfb584bcb94 + checksum: 10c0/77ef6e0bceb515e05b5913ab635a84d537cee84f8a7c37c77fdcb31fc5b80f6dbe81b33375e4b67d96aa04e6a0d8d4ea099e431d83f089af8d93adfb584bcb94 languageName: node linkType: hard @@ -4426,7 +4426,7 @@ __metadata: define-data-property: "npm:^1.0.1" has-property-descriptors: "npm:^1.0.0" object-keys: "npm:^1.1.1" - checksum: 88a152319ffe1396ccc6ded510a3896e77efac7a1bfbaa174a7b00414a1747377e0bb525d303794a47cf30e805c2ec84e575758512c6e44a993076d29fd4e6c3 + checksum: 10c0/88a152319ffe1396ccc6ded510a3896e77efac7a1bfbaa174a7b00414a1747377e0bb525d303794a47cf30e805c2ec84e575758512c6e44a993076d29fd4e6c3 languageName: node linkType: hard @@ -4435,21 +4435,21 @@ __metadata: resolution: "delaunator@npm:5.0.0" dependencies: robust-predicates: "npm:^3.0.0" - checksum: 8655c1ad12dc58bd6350f882c12065ea415cfc809e4cac12b7b5c4941e981aaabee1afdcf13985dcd545d13d0143eb3805836f50e2b097af8137b204dfbea4f6 + checksum: 10c0/8655c1ad12dc58bd6350f882c12065ea415cfc809e4cac12b7b5c4941e981aaabee1afdcf13985dcd545d13d0143eb3805836f50e2b097af8137b204dfbea4f6 languageName: node linkType: hard "delegates@npm:^1.0.0": version: 1.0.0 resolution: "delegates@npm:1.0.0" - checksum: ba05874b91148e1db4bf254750c042bf2215febd23a6d3cda2e64896aef79745fbd4b9996488bd3cafb39ce19dbce0fd6e3b6665275638befffe1c9b312b91b5 + checksum: 10c0/ba05874b91148e1db4bf254750c042bf2215febd23a6d3cda2e64896aef79745fbd4b9996488bd3cafb39ce19dbce0fd6e3b6665275638befffe1c9b312b91b5 languageName: node linkType: hard "dequal@npm:^2.0.3": version: 2.0.3 resolution: "dequal@npm:2.0.3" - checksum: f98860cdf58b64991ae10205137c0e97d384c3a4edc7f807603887b7c4b850af1224a33d88012009f150861cbee4fa2d322c4cc04b9313bee312e47f6ecaa888 + checksum: 10c0/f98860cdf58b64991ae10205137c0e97d384c3a4edc7f807603887b7c4b850af1224a33d88012009f150861cbee4fa2d322c4cc04b9313bee312e47f6ecaa888 languageName: node linkType: hard @@ -4458,7 +4458,7 @@ __metadata: resolution: "dir-glob@npm:3.0.1" dependencies: path-type: "npm:^4.0.0" - checksum: dcac00920a4d503e38bb64001acb19df4efc14536ada475725e12f52c16777afdee4db827f55f13a908ee7efc0cb282e2e3dbaeeb98c0993dd93d1802d3bf00c + checksum: 10c0/dcac00920a4d503e38bb64001acb19df4efc14536ada475725e12f52c16777afdee4db827f55f13a908ee7efc0cb282e2e3dbaeeb98c0993dd93d1802d3bf00c languageName: node linkType: hard @@ -4467,7 +4467,7 @@ __metadata: resolution: "doctrine@npm:2.1.0" dependencies: esutils: "npm:^2.0.2" - checksum: b6416aaff1f380bf56c3b552f31fdf7a69b45689368deca72d28636f41c16bb28ec3ebc40ace97db4c1afc0ceeb8120e8492fe0046841c94c2933b2e30a7d5ac + checksum: 10c0/b6416aaff1f380bf56c3b552f31fdf7a69b45689368deca72d28636f41c16bb28ec3ebc40ace97db4c1afc0ceeb8120e8492fe0046841c94c2933b2e30a7d5ac languageName: node linkType: hard @@ -4476,7 +4476,7 @@ __metadata: resolution: "doctrine@npm:3.0.0" dependencies: esutils: "npm:^2.0.2" - checksum: c96bdccabe9d62ab6fea9399fdff04a66e6563c1d6fb3a3a063e8d53c3bb136ba63e84250bbf63d00086a769ad53aef92d2bd483f03f837fc97b71cbee6b2520 + checksum: 10c0/c96bdccabe9d62ab6fea9399fdff04a66e6563c1d6fb3a3a063e8d53c3bb136ba63e84250bbf63d00086a769ad53aef92d2bd483f03f837fc97b71cbee6b2520 languageName: node linkType: hard @@ -4486,7 +4486,7 @@ __metadata: dependencies: "@babel/runtime": "npm:^7.8.7" csstype: "npm:^3.0.2" - checksum: f735074d66dd759b36b158fa26e9d00c9388ee0e8c9b16af941c38f014a37fc80782de83afefd621681b19ac0501034b4f1c4a3bff5caa1b8667f0212b5e124c + checksum: 10c0/f735074d66dd759b36b158fa26e9d00c9388ee0e8c9b16af941c38f014a37fc80782de83afefd621681b19ac0501034b4f1c4a3bff5caa1b8667f0212b5e124c languageName: node linkType: hard @@ -4496,21 +4496,21 @@ __metadata: dependencies: no-case: "npm:^3.0.4" tslib: "npm:^2.0.3" - checksum: 5b859ea65097a7ea870e2c91b5768b72ddf7fa947223fd29e167bcdff58fe731d941c48e47a38ec8aa8e43044c8fbd15cd8fa21689a526bc34b6548197cd5b05 + checksum: 10c0/5b859ea65097a7ea870e2c91b5768b72ddf7fa947223fd29e167bcdff58fe731d941c48e47a38ec8aa8e43044c8fbd15cd8fa21689a526bc34b6548197cd5b05 languageName: node linkType: hard "dotenv@npm:^16.0.3": version: 16.3.1 resolution: "dotenv@npm:16.3.1" - checksum: b95ff1bbe624ead85a3cd70dbd827e8e06d5f05f716f2d0cbc476532d54c7c9469c3bc4dd93ea519f6ad711cb522c00ac9a62b6eb340d5affae8008facc3fbd7 + checksum: 10c0/b95ff1bbe624ead85a3cd70dbd827e8e06d5f05f716f2d0cbc476532d54c7c9469c3bc4dd93ea519f6ad711cb522c00ac9a62b6eb340d5affae8008facc3fbd7 languageName: node linkType: hard "eastasianwidth@npm:^0.2.0": version: 0.2.0 resolution: "eastasianwidth@npm:0.2.0" - checksum: 26f364ebcdb6395f95124fda411f63137a4bfb5d3a06453f7f23dfe52502905bd84e0488172e0f9ec295fdc45f05c23d5d91baf16bd26f0fe9acd777a188dc39 + checksum: 10c0/26f364ebcdb6395f95124fda411f63137a4bfb5d3a06453f7f23dfe52502905bd84e0488172e0f9ec295fdc45f05c23d5d91baf16bd26f0fe9acd777a188dc39 languageName: node linkType: hard @@ -4521,28 +4521,28 @@ __metadata: jake: "npm:^10.8.5" bin: ejs: bin/cli.js - checksum: f0e249c79128810f5f6d5cbf347fc906d86bb9384263db0b2a9004aea649f2bc2d112736de5716c509c80afb4721c47281bd5b57c757d3b63f1bf5ac5f885893 + checksum: 10c0/f0e249c79128810f5f6d5cbf347fc906d86bb9384263db0b2a9004aea649f2bc2d112736de5716c509c80afb4721c47281bd5b57c757d3b63f1bf5ac5f885893 languageName: node linkType: hard "electron-to-chromium@npm:^1.4.477": version: 1.4.491 resolution: "electron-to-chromium@npm:1.4.491" - checksum: 417c9328cf9875f2aed225908e1c7629ff462fe7646c32de56c3e65a3383ea8edd50ecaba017ea06ff1a4b5dedab56aa4c843ee1db726d28065d3ffbe94777dd + checksum: 10c0/417c9328cf9875f2aed225908e1c7629ff462fe7646c32de56c3e65a3383ea8edd50ecaba017ea06ff1a4b5dedab56aa4c843ee1db726d28065d3ffbe94777dd languageName: node linkType: hard "emoji-regex@npm:^8.0.0": version: 8.0.0 resolution: "emoji-regex@npm:8.0.0" - checksum: b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 + checksum: 10c0/b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 languageName: node linkType: hard "emoji-regex@npm:^9.2.2": version: 9.2.2 resolution: "emoji-regex@npm:9.2.2" - checksum: af014e759a72064cf66e6e694a7fc6b0ed3d8db680427b021a89727689671cefe9d04151b2cad51dbaf85d5ba790d061cd167f1cf32eb7b281f6368b3c181639 + checksum: 10c0/af014e759a72064cf66e6e694a7fc6b0ed3d8db680427b021a89727689671cefe9d04151b2cad51dbaf85d5ba790d061cd167f1cf32eb7b281f6368b3c181639 languageName: node linkType: hard @@ -4551,7 +4551,7 @@ __metadata: resolution: "encoding@npm:0.1.13" dependencies: iconv-lite: "npm:^0.6.2" - checksum: 36d938712ff00fe1f4bac88b43bcffb5930c1efa57bbcdca9d67e1d9d6c57cfb1200fb01efe0f3109b2ce99b231f90779532814a81370a1bd3274a0f58585039 + checksum: 10c0/36d938712ff00fe1f4bac88b43bcffb5930c1efa57bbcdca9d67e1d9d6c57cfb1200fb01efe0f3109b2ce99b231f90779532814a81370a1bd3274a0f58585039 languageName: node linkType: hard @@ -4561,28 +4561,28 @@ __metadata: dependencies: graceful-fs: "npm:^4.2.4" tapable: "npm:^2.2.0" - checksum: 69984a7990913948b4150855aed26a84afb4cb1c5a94fb8e3a65bd00729a73fc2eaff6871fb8e345377f294831afe349615c93560f2f54d61b43cdfdf668f19a + checksum: 10c0/69984a7990913948b4150855aed26a84afb4cb1c5a94fb8e3a65bd00729a73fc2eaff6871fb8e345377f294831afe349615c93560f2f54d61b43cdfdf668f19a languageName: node linkType: hard "entities@npm:^4.4.0": version: 4.5.0 resolution: "entities@npm:4.5.0" - checksum: 5b039739f7621f5d1ad996715e53d964035f75ad3b9a4d38c6b3804bb226e282ffeae2443624d8fdd9c47d8e926ae9ac009c54671243f0c3294c26af7cc85250 + checksum: 10c0/5b039739f7621f5d1ad996715e53d964035f75ad3b9a4d38c6b3804bb226e282ffeae2443624d8fdd9c47d8e926ae9ac009c54671243f0c3294c26af7cc85250 languageName: node linkType: hard "env-paths@npm:^2.2.0": version: 2.2.1 resolution: "env-paths@npm:2.2.1" - checksum: 285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 + checksum: 10c0/285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 languageName: node linkType: hard "err-code@npm:^2.0.2": version: 2.0.3 resolution: "err-code@npm:2.0.3" - checksum: b642f7b4dd4a376e954947550a3065a9ece6733ab8e51ad80db727aaae0817c2e99b02a97a3d6cecc648a97848305e728289cf312d09af395403a90c9d4d8a66 + checksum: 10c0/b642f7b4dd4a376e954947550a3065a9ece6733ab8e51ad80db727aaae0817c2e99b02a97a3d6cecc648a97848305e728289cf312d09af395403a90c9d4d8a66 languageName: node linkType: hard @@ -4591,7 +4591,7 @@ __metadata: resolution: "error-ex@npm:1.3.2" dependencies: is-arrayish: "npm:^0.2.1" - checksum: ba827f89369b4c93382cfca5a264d059dfefdaa56ecc5e338ffa58a6471f5ed93b71a20add1d52290a4873d92381174382658c885ac1a2305f7baca363ce9cce + checksum: 10c0/ba827f89369b4c93382cfca5a264d059dfefdaa56ecc5e338ffa58a6471f5ed93b71a20add1d52290a4873d92381174382658c885ac1a2305f7baca363ce9cce languageName: node linkType: hard @@ -4638,7 +4638,7 @@ __metadata: typed-array-length: "npm:^1.0.4" unbox-primitive: "npm:^1.0.2" which-typed-array: "npm:^1.1.13" - checksum: da31ec43b1c8eb47ba8a17693cac143682a1078b6c3cd883ce0e2062f135f532e93d873694ef439670e1f6ca03195118f43567ba6f33fb0d6c7daae750090236 + checksum: 10c0/da31ec43b1c8eb47ba8a17693cac143682a1078b6c3cd883ce0e2062f135f532e93d873694ef439670e1f6ca03195118f43567ba6f33fb0d6c7daae750090236 languageName: node linkType: hard @@ -4660,7 +4660,7 @@ __metadata: internal-slot: "npm:^1.0.5" iterator.prototype: "npm:^1.1.2" safe-array-concat: "npm:^1.0.1" - checksum: b4c83f94bfe624260d5238092de3173989f76f1416b1d02c388aea3b2024174e5f5f0e864057311ac99790b57e836ca3545b6e77256b26066dac944519f5e6d6 + checksum: 10c0/b4c83f94bfe624260d5238092de3173989f76f1416b1d02c388aea3b2024174e5f5f0e864057311ac99790b57e836ca3545b6e77256b26066dac944519f5e6d6 languageName: node linkType: hard @@ -4671,7 +4671,7 @@ __metadata: get-intrinsic: "npm:^1.1.3" has: "npm:^1.0.3" has-tostringtag: "npm:^1.0.0" - checksum: 9af096365e3861bb29755cc5f76f15f66a7eab0e83befca396129090c1d9737e54090278b8e5357e97b5f0a5b0459fca07c40c6740884c2659cbf90ef8e508cc + checksum: 10c0/9af096365e3861bb29755cc5f76f15f66a7eab0e83befca396129090c1d9737e54090278b8e5357e97b5f0a5b0459fca07c40c6740884c2659cbf90ef8e508cc languageName: node linkType: hard @@ -4680,7 +4680,7 @@ __metadata: resolution: "es-shim-unscopables@npm:1.0.0" dependencies: has: "npm:^1.0.3" - checksum: d54a66239fbd19535b3e50333913260394f14d2d7adb136a95396a13ca584bab400cf9cb2ffd9232f3fe2f0362540bd3a708240c493e46e13fe0b90cfcfedc3d + checksum: 10c0/d54a66239fbd19535b3e50333913260394f14d2d7adb136a95396a13ca584bab400cf9cb2ffd9232f3fe2f0362540bd3a708240c493e46e13fe0b90cfcfedc3d languageName: node linkType: hard @@ -4691,14 +4691,14 @@ __metadata: is-callable: "npm:^1.1.4" is-date-object: "npm:^1.0.1" is-symbol: "npm:^1.0.2" - checksum: 0886572b8dc075cb10e50c0af62a03d03a68e1e69c388bd4f10c0649ee41b1fbb24840a1b7e590b393011b5cdbe0144b776da316762653685432df37d6de60f1 + checksum: 10c0/0886572b8dc075cb10e50c0af62a03d03a68e1e69c388bd4f10c0649ee41b1fbb24840a1b7e590b393011b5cdbe0144b776da316762653685432df37d6de60f1 languageName: node linkType: hard "es6-object-assign@npm:^1.1.0": version: 1.1.0 resolution: "es6-object-assign@npm:1.1.0" - checksum: 11c165ae16866aca897dee9b689402f0e871589e859809343ef9e0fdd067133684db16fd15abdba2a99e7319222b9f43e6b747baabb909cee9d0ecbac8deebee + checksum: 10c0/11c165ae16866aca897dee9b689402f0e871589e859809343ef9e0fdd067133684db16fd15abdba2a99e7319222b9f43e6b747baabb909cee9d0ecbac8deebee languageName: node linkType: hard @@ -4775,35 +4775,35 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: 401e6da33bf6f2c4bbfa0aa8f37ddc6eb41c9d8ddf6b32c9922aabeef3f1886ed792eb03e778859e7e61467c765c78245f88216bc1a59050413ce7a513dd675f + checksum: 10c0/401e6da33bf6f2c4bbfa0aa8f37ddc6eb41c9d8ddf6b32c9922aabeef3f1886ed792eb03e778859e7e61467c765c78245f88216bc1a59050413ce7a513dd675f languageName: node linkType: hard "escalade@npm:^3.1.1": version: 3.1.1 resolution: "escalade@npm:3.1.1" - checksum: afd02e6ca91ffa813e1108b5e7756566173d6bc0d1eb951cb44d6b21702ec17c1cf116cfe75d4a2b02e05acb0b808a7a9387d0d1ca5cf9c04ad03a8445c3e46d + checksum: 10c0/afd02e6ca91ffa813e1108b5e7756566173d6bc0d1eb951cb44d6b21702ec17c1cf116cfe75d4a2b02e05acb0b808a7a9387d0d1ca5cf9c04ad03a8445c3e46d languageName: node linkType: hard "escape-string-regexp@npm:^1.0.5": version: 1.0.5 resolution: "escape-string-regexp@npm:1.0.5" - checksum: a968ad453dd0c2724e14a4f20e177aaf32bb384ab41b674a8454afe9a41c5e6fe8903323e0a1052f56289d04bd600f81278edf140b0fcc02f5cac98d0f5b5371 + checksum: 10c0/a968ad453dd0c2724e14a4f20e177aaf32bb384ab41b674a8454afe9a41c5e6fe8903323e0a1052f56289d04bd600f81278edf140b0fcc02f5cac98d0f5b5371 languageName: node linkType: hard "escape-string-regexp@npm:^4.0.0": version: 4.0.0 resolution: "escape-string-regexp@npm:4.0.0" - checksum: 9497d4dd307d845bd7f75180d8188bb17ea8c151c1edbf6b6717c100e104d629dc2dfb687686181b0f4b7d732c7dfdc4d5e7a8ff72de1b0ca283a75bbb3a9cd9 + checksum: 10c0/9497d4dd307d845bd7f75180d8188bb17ea8c151c1edbf6b6717c100e104d629dc2dfb687686181b0f4b7d732c7dfdc4d5e7a8ff72de1b0ca283a75bbb3a9cd9 languageName: node linkType: hard "escape-string-regexp@npm:^5.0.0": version: 5.0.0 resolution: "escape-string-regexp@npm:5.0.0" - checksum: 6366f474c6f37a802800a435232395e04e9885919873e382b157ab7e8f0feb8fed71497f84a6f6a81a49aab41815522f5839112bd38026d203aea0c91622df95 + checksum: 10c0/6366f474c6f37a802800a435232395e04e9885919873e382b157ab7e8f0feb8fed71497f84a6f6a81a49aab41815522f5839112bd38026d203aea0c91622df95 languageName: node linkType: hard @@ -4818,7 +4818,7 @@ __metadata: peerDependencies: eslint: ^7.32.0 || ^8.2.0 eslint-plugin-import: ^2.25.2 - checksum: 93639d991654414756f82ad7860aac30b0dc6797277b7904ddb53ed88a32c470598696bbc6c503e066414024d305221974d3769e6642de65043bedf29cbbd30f + checksum: 10c0/93639d991654414756f82ad7860aac30b0dc6797277b7904ddb53ed88a32c470598696bbc6c503e066414024d305221974d3769e6642de65043bedf29cbbd30f languageName: node linkType: hard @@ -4832,7 +4832,7 @@ __metadata: "@typescript-eslint/parser": ^5.0.0 || ^6.0.0 eslint: ^7.32.0 || ^8.2.0 eslint-plugin-import: ^2.25.3 - checksum: 46d1753d660fe4225ccd89e91dd9f812db490326dfb835cfb786ab0b9a4ca25a39171a838661233b8f6f9a19294aaedaa962e19df915066beb80e7422749f7f1 + checksum: 10c0/46d1753d660fe4225ccd89e91dd9f812db490326dfb835cfb786ab0b9a4ca25a39171a838661233b8f6f9a19294aaedaa962e19df915066beb80e7422749f7f1 languageName: node linkType: hard @@ -4849,7 +4849,7 @@ __metadata: eslint-plugin-jsx-a11y: ^6.5.1 eslint-plugin-react: ^7.28.0 eslint-plugin-react-hooks: ^4.3.0 - checksum: 867feeda45c4b480b1b8eff8fabc1bb107e837da8b48e5039e0c175ae6ad34af383b1924fc163bbfcef24a324e6651b1515e5bd12cbcbb19535a8838e2544a02 + checksum: 10c0/867feeda45c4b480b1b8eff8fabc1bb107e837da8b48e5039e0c175ae6ad34af383b1924fc163bbfcef24a324e6651b1515e5bd12cbcbb19535a8838e2544a02 languageName: node linkType: hard @@ -4860,7 +4860,7 @@ __metadata: eslint: ">=7.0.0" bin: eslint-config-prettier: bin/cli.js - checksum: 6d332694b36bc9ac6fdb18d3ca2f6ac42afa2ad61f0493e89226950a7091e38981b66bac2b47ba39d15b73fff2cd32c78b850a9cf9eed9ca9a96bfb2f3a2f10d + checksum: 10c0/6d332694b36bc9ac6fdb18d3ca2f6ac42afa2ad61f0493e89226950a7091e38981b66bac2b47ba39d15b73fff2cd32c78b850a9cf9eed9ca9a96bfb2f3a2f10d languageName: node linkType: hard @@ -4871,7 +4871,7 @@ __metadata: debug: "npm:^3.2.7" is-core-module: "npm:^2.13.0" resolve: "npm:^1.22.4" - checksum: 0ea8a24a72328a51fd95aa8f660dcca74c1429806737cf10261ab90cfcaaf62fd1eff664b76a44270868e0a932711a81b250053942595bcd00a93b1c1575dd61 + checksum: 10c0/0ea8a24a72328a51fd95aa8f660dcca74c1429806737cf10261ab90cfcaaf62fd1eff664b76a44270868e0a932711a81b250053942595bcd00a93b1c1575dd61 languageName: node linkType: hard @@ -4889,7 +4889,7 @@ __metadata: peerDependencies: eslint: "*" eslint-plugin-import: "*" - checksum: cb1cb4389916fe78bf8c8567aae2f69243dbfe624bfe21078c56ad46fa1ebf0634fa7239dd3b2055ab5c27359e4b4c28b69b11fcb3a5df8a9e6f7add8e034d86 + checksum: 10c0/cb1cb4389916fe78bf8c8567aae2f69243dbfe624bfe21078c56ad46fa1ebf0634fa7239dd3b2055ab5c27359e4b4c28b69b11fcb3a5df8a9e6f7add8e034d86 languageName: node linkType: hard @@ -4901,7 +4901,7 @@ __metadata: peerDependenciesMeta: eslint: optional: true - checksum: c7a8d1a58d76ec8217a8fea49271ec8132d1b9390965a75f6a4ecbc9e5983d742195b46d2e4378231d2186801439fe1aa5700714b0bfd4eb17aac6e1b65309df + checksum: 10c0/c7a8d1a58d76ec8217a8fea49271ec8132d1b9390965a75f6a4ecbc9e5983d742195b46d2e4378231d2186801439fe1aa5700714b0bfd4eb17aac6e1b65309df languageName: node linkType: hard @@ -4928,7 +4928,7 @@ __metadata: tsconfig-paths: "npm:^3.15.0" peerDependencies: eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - checksum: 5f35dfbf4e8e67f741f396987de9504ad125c49f4144508a93282b4ea0127e052bde65ab6def1f31b6ace6d5d430be698333f75bdd7dca3bc14226c92a083196 + checksum: 10c0/5f35dfbf4e8e67f741f396987de9504ad125c49f4144508a93282b4ea0127e052bde65ab6def1f31b6ace6d5d430be698333f75bdd7dca3bc14226c92a083196 languageName: node linkType: hard @@ -4954,7 +4954,7 @@ __metadata: object.fromentries: "npm:^2.0.7" peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - checksum: 199b883e526e6f9d7c54cb3f094abc54f11a1ec816db5fb6cae3b938eb0e503acc10ccba91ca7451633a9d0b9abc0ea03601844a8aba5fe88c5e8897c9ac8f49 + checksum: 10c0/199b883e526e6f9d7c54cb3f094abc54f11a1ec816db5fb6cae3b938eb0e503acc10ccba91ca7451633a9d0b9abc0ea03601844a8aba5fe88c5e8897c9ac8f49 languageName: node linkType: hard @@ -4963,7 +4963,7 @@ __metadata: resolution: "eslint-plugin-mobx@npm:0.0.9" peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: d0668169cf56633ff9b34ff251f59374a267083def5ad64f23772e236464d84e6a0b4fc5f68ad7bda2c1ea53d75c4ce0499e12747e67c3272e5968be939a6e9f + checksum: 10c0/d0668169cf56633ff9b34ff251f59374a267083def5ad64f23772e236464d84e6a0b4fc5f68ad7bda2c1ea53d75c4ce0499e12747e67c3272e5968be939a6e9f languageName: node linkType: hard @@ -4983,7 +4983,7 @@ __metadata: optional: true eslint-config-prettier: optional: true - checksum: f45d5fc1fcfec6b0cf038a7a65ddd10a25df4fe3f9e1f6b7f0d5100e66f046a26a2492e69ee765dddf461b93c114cf2e1eb18d4970aafa6f385448985c136e09 + checksum: 10c0/f45d5fc1fcfec6b0cf038a7a65ddd10a25df4fe3f9e1f6b7f0d5100e66f046a26a2492e69ee765dddf461b93c114cf2e1eb18d4970aafa6f385448985c136e09 languageName: node linkType: hard @@ -4992,7 +4992,7 @@ __metadata: resolution: "eslint-plugin-react-hooks@npm:4.6.0" peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - checksum: 58c7e10ea5792c33346fcf5cb4024e14837035ce412ff99c2dcb7c4f903dc9b17939078f80bfef826301ce326582c396c00e8e0ac9d10ac2cde2b42d33763c65 + checksum: 10c0/58c7e10ea5792c33346fcf5cb4024e14837035ce412ff99c2dcb7c4f903dc9b17939078f80bfef826301ce326582c396c00e8e0ac9d10ac2cde2b42d33763c65 languageName: node linkType: hard @@ -5018,7 +5018,7 @@ __metadata: string.prototype.matchall: "npm:^4.0.8" peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - checksum: f9b247861024bafc396c4bd3c9ac946604b3b23077251c98f23602aa22027a0c33a69157fd49564e4ff7f17b3678e5dc366a46c7ec42a09454d7cbce786d5001 + checksum: 10c0/f9b247861024bafc396c4bd3c9ac946604b3b23077251c98f23602aa22027a0c33a69157fd49564e4ff7f17b3678e5dc366a46c7ec42a09454d7cbce786d5001 languageName: node linkType: hard @@ -5028,14 +5028,14 @@ __metadata: dependencies: esrecurse: "npm:^4.3.0" estraverse: "npm:^5.2.0" - checksum: 613c267aea34b5a6d6c00514e8545ef1f1433108097e857225fed40d397dd6b1809dffd11c2fde23b37ca53d7bf935fe04d2a18e6fc932b31837b6ad67e1c116 + checksum: 10c0/613c267aea34b5a6d6c00514e8545ef1f1433108097e857225fed40d397dd6b1809dffd11c2fde23b37ca53d7bf935fe04d2a18e6fc932b31837b6ad67e1c116 languageName: node linkType: hard "eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": version: 3.4.3 resolution: "eslint-visitor-keys@npm:3.4.3" - checksum: 92708e882c0a5ffd88c23c0b404ac1628cf20104a108c745f240a13c332a11aac54f49a22d5762efbffc18ecbc9a580d1b7ad034bf5f3cc3307e5cbff2ec9820 + checksum: 10c0/92708e882c0a5ffd88c23c0b404ac1628cf20104a108c745f240a13c332a11aac54f49a22d5762efbffc18ecbc9a580d1b7ad034bf5f3cc3307e5cbff2ec9820 languageName: node linkType: hard @@ -5083,7 +5083,7 @@ __metadata: text-table: "npm:^0.2.0" bin: eslint: bin/eslint.js - checksum: 2be598f7da1339d045ad933ffd3d4742bee610515cd2b0d9a2b8b729395a01d4e913552fff555b559fccaefd89d7b37632825789d1b06470608737ae69ab43fb + checksum: 10c0/2be598f7da1339d045ad933ffd3d4742bee610515cd2b0d9a2b8b729395a01d4e913552fff555b559fccaefd89d7b37632825789d1b06470608737ae69ab43fb languageName: node linkType: hard @@ -5094,7 +5094,7 @@ __metadata: acorn: "npm:^8.9.0" acorn-jsx: "npm:^5.3.2" eslint-visitor-keys: "npm:^3.4.1" - checksum: 1a2e9b4699b715347f62330bcc76aee224390c28bb02b31a3752e9d07549c473f5f986720483c6469cf3cfb3c9d05df612ffc69eb1ee94b54b739e67de9bb460 + checksum: 10c0/1a2e9b4699b715347f62330bcc76aee224390c28bb02b31a3752e9d07549c473f5f986720483c6469cf3cfb3c9d05df612ffc69eb1ee94b54b739e67de9bb460 languageName: node linkType: hard @@ -5104,7 +5104,7 @@ __metadata: bin: esparse: ./bin/esparse.js esvalidate: ./bin/esvalidate.js - checksum: ad4bab9ead0808cf56501750fd9d3fb276f6b105f987707d059005d57e182d18a7c9ec7f3a01794ebddcca676773e42ca48a32d67a250c9d35e009ca613caba3 + checksum: 10c0/ad4bab9ead0808cf56501750fd9d3fb276f6b105f987707d059005d57e182d18a7c9ec7f3a01794ebddcca676773e42ca48a32d67a250c9d35e009ca613caba3 languageName: node linkType: hard @@ -5113,7 +5113,7 @@ __metadata: resolution: "esquery@npm:1.5.0" dependencies: estraverse: "npm:^5.1.0" - checksum: a084bd049d954cc88ac69df30534043fb2aee5555b56246493f42f27d1e168f00d9e5d4192e46f10290d312dc30dc7d58994d61a609c579c1219d636996f9213 + checksum: 10c0/a084bd049d954cc88ac69df30534043fb2aee5555b56246493f42f27d1e168f00d9e5d4192e46f10290d312dc30dc7d58994d61a609c579c1219d636996f9213 languageName: node linkType: hard @@ -5122,49 +5122,49 @@ __metadata: resolution: "esrecurse@npm:4.3.0" dependencies: estraverse: "npm:^5.2.0" - checksum: 81a37116d1408ded88ada45b9fb16dbd26fba3aadc369ce50fcaf82a0bac12772ebd7b24cd7b91fc66786bf2c1ac7b5f196bc990a473efff972f5cb338877cf5 + checksum: 10c0/81a37116d1408ded88ada45b9fb16dbd26fba3aadc369ce50fcaf82a0bac12772ebd7b24cd7b91fc66786bf2c1ac7b5f196bc990a473efff972f5cb338877cf5 languageName: node linkType: hard "estraverse@npm:^5.1.0, estraverse@npm:^5.2.0, estraverse@npm:^5.3.0": version: 5.3.0 resolution: "estraverse@npm:5.3.0" - checksum: 1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107 + checksum: 10c0/1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107 languageName: node linkType: hard "estree-walker@npm:^1.0.1": version: 1.0.1 resolution: "estree-walker@npm:1.0.1" - checksum: fa9e5f8c1bbe8d01e314c0f03067b64a4f22d4c58410fc5237060d0c15b81e58c23921c41acc60abbdab490f1fdfcbd6408ede2d03ca704454272e0244d61a55 + checksum: 10c0/fa9e5f8c1bbe8d01e314c0f03067b64a4f22d4c58410fc5237060d0c15b81e58c23921c41acc60abbdab490f1fdfcbd6408ede2d03ca704454272e0244d61a55 languageName: node linkType: hard "esutils@npm:^2.0.2": version: 2.0.3 resolution: "esutils@npm:2.0.3" - checksum: 9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 + checksum: 10c0/9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 languageName: node linkType: hard "exponential-backoff@npm:^3.1.1": version: 3.1.1 resolution: "exponential-backoff@npm:3.1.1" - checksum: 160456d2d647e6019640bd07111634d8c353038d9fa40176afb7cd49b0548bdae83b56d05e907c2cce2300b81cae35d800ef92fefb9d0208e190fa3b7d6bb579 + checksum: 10c0/160456d2d647e6019640bd07111634d8c353038d9fa40176afb7cd49b0548bdae83b56d05e907c2cce2300b81cae35d800ef92fefb9d0208e190fa3b7d6bb579 languageName: node linkType: hard "fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": version: 3.1.3 resolution: "fast-deep-equal@npm:3.1.3" - checksum: 40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 + checksum: 10c0/40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 languageName: node linkType: hard "fast-diff@npm:^1.1.2": version: 1.3.0 resolution: "fast-diff@npm:1.3.0" - checksum: 5c19af237edb5d5effda008c891a18a585f74bf12953be57923f17a3a4d0979565fc64dbc73b9e20926b9d895f5b690c618cbb969af0cf022e3222471220ad29 + checksum: 10c0/5c19af237edb5d5effda008c891a18a585f74bf12953be57923f17a3a4d0979565fc64dbc73b9e20926b9d895f5b690c618cbb969af0cf022e3222471220ad29 languageName: node linkType: hard @@ -5177,21 +5177,21 @@ __metadata: glob-parent: "npm:^5.1.2" merge2: "npm:^1.3.0" micromatch: "npm:^4.0.4" - checksum: 42baad7b9cd40b63e42039132bde27ca2cb3a4950d0a0f9abe4639ea1aa9d3e3b40f98b1fe31cbc0cc17b664c9ea7447d911a152fa34ec5b72977b125a6fc845 + checksum: 10c0/42baad7b9cd40b63e42039132bde27ca2cb3a4950d0a0f9abe4639ea1aa9d3e3b40f98b1fe31cbc0cc17b664c9ea7447d911a152fa34ec5b72977b125a6fc845 languageName: node linkType: hard "fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0": version: 2.1.0 resolution: "fast-json-stable-stringify@npm:2.1.0" - checksum: 7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b + checksum: 10c0/7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b languageName: node linkType: hard "fast-levenshtein@npm:^2.0.6": version: 2.0.6 resolution: "fast-levenshtein@npm:2.0.6" - checksum: 111972b37338bcb88f7d9e2c5907862c280ebf4234433b95bc611e518d192ccb2d38119c4ac86e26b668d75f7f3894f4ff5c4982899afced7ca78633b08287c4 + checksum: 10c0/111972b37338bcb88f7d9e2c5907862c280ebf4234433b95bc611e518d192ccb2d38119c4ac86e26b668d75f7f3894f4ff5c4982899afced7ca78633b08287c4 languageName: node linkType: hard @@ -5200,7 +5200,7 @@ __metadata: resolution: "fastq@npm:1.15.0" dependencies: reusify: "npm:^1.0.4" - checksum: 5ce4f83afa5f88c9379e67906b4d31bc7694a30826d6cc8d0f0473c966929017fda65c2174b0ec89f064ede6ace6c67f8a4fe04cef42119b6a55b0d465554c24 + checksum: 10c0/5ce4f83afa5f88c9379e67906b4d31bc7694a30826d6cc8d0f0473c966929017fda65c2174b0ec89f064ede6ace6c67f8a4fe04cef42119b6a55b0d465554c24 languageName: node linkType: hard @@ -5209,7 +5209,7 @@ __metadata: resolution: "file-entry-cache@npm:6.0.1" dependencies: flat-cache: "npm:^3.0.4" - checksum: 58473e8a82794d01b38e5e435f6feaf648e3f36fdb3a56e98f417f4efae71ad1c0d4ebd8a9a7c50c3ad085820a93fc7494ad721e0e4ebc1da3573f4e1c3c7cdd + checksum: 10c0/58473e8a82794d01b38e5e435f6feaf648e3f36fdb3a56e98f417f4efae71ad1c0d4ebd8a9a7c50c3ad085820a93fc7494ad721e0e4ebc1da3573f4e1c3c7cdd languageName: node linkType: hard @@ -5218,7 +5218,7 @@ __metadata: resolution: "filelist@npm:1.0.4" dependencies: minimatch: "npm:^5.0.1" - checksum: 426b1de3944a3d153b053f1c0ebfd02dccd0308a4f9e832ad220707a6d1f1b3c9784d6cadf6b2f68f09a57565f63ebc7bcdc913ccf8012d834f472c46e596f41 + checksum: 10c0/426b1de3944a3d153b053f1c0ebfd02dccd0308a4f9e832ad220707a6d1f1b3c9784d6cadf6b2f68f09a57565f63ebc7bcdc913ccf8012d834f472c46e596f41 languageName: node linkType: hard @@ -5227,14 +5227,14 @@ __metadata: resolution: "fill-range@npm:7.0.1" dependencies: to-regex-range: "npm:^5.0.1" - checksum: 7cdad7d426ffbaadf45aeb5d15ec675bbd77f7597ad5399e3d2766987ed20bda24d5fac64b3ee79d93276f5865608bb22344a26b9b1ae6c4d00bd94bf611623f + checksum: 10c0/7cdad7d426ffbaadf45aeb5d15ec675bbd77f7597ad5399e3d2766987ed20bda24d5fac64b3ee79d93276f5865608bb22344a26b9b1ae6c4d00bd94bf611623f languageName: node linkType: hard "find-root@npm:^1.1.0": version: 1.1.0 resolution: "find-root@npm:1.1.0" - checksum: 1abc7f3bf2f8d78ff26d9e00ce9d0f7b32e5ff6d1da2857bcdf4746134c422282b091c672cde0572cac3840713487e0a7a636af9aa1b74cb11894b447a521efa + checksum: 10c0/1abc7f3bf2f8d78ff26d9e00ce9d0f7b32e5ff6d1da2857bcdf4746134c422282b091c672cde0572cac3840713487e0a7a636af9aa1b74cb11894b447a521efa languageName: node linkType: hard @@ -5244,7 +5244,7 @@ __metadata: dependencies: locate-path: "npm:^6.0.0" path-exists: "npm:^4.0.0" - checksum: 062c5a83a9c02f53cdd6d175a37ecf8f87ea5bbff1fdfb828f04bfa021441bc7583e8ebc0872a4c1baab96221fb8a8a275a19809fb93fbc40bd69ec35634069a + checksum: 10c0/062c5a83a9c02f53cdd6d175a37ecf8f87ea5bbff1fdfb828f04bfa021441bc7583e8ebc0872a4c1baab96221fb8a8a275a19809fb93fbc40bd69ec35634069a languageName: node linkType: hard @@ -5254,14 +5254,14 @@ __metadata: dependencies: flatted: "npm:^3.1.0" rimraf: "npm:^3.0.2" - checksum: f274dcbadb09ad8d7b6edf2ee9b034bc40bf0c12638f6c4084e9f1d39208cb104a5ebbb24b398880ef048200eaa116852f73d2d8b72e8c9627aba8c3e27ca057 + checksum: 10c0/f274dcbadb09ad8d7b6edf2ee9b034bc40bf0c12638f6c4084e9f1d39208cb104a5ebbb24b398880ef048200eaa116852f73d2d8b72e8c9627aba8c3e27ca057 languageName: node linkType: hard "flatted@npm:^3.1.0": version: 3.2.7 resolution: "flatted@npm:3.2.7" - checksum: 207a87c7abfc1ea6928ea16bac84f9eaa6d44d365620ece419e5c41cf44a5e9902b4c1f59c9605771b10e4565a0cb46e99d78e0464e8aabb42c97de880642257 + checksum: 10c0/207a87c7abfc1ea6928ea16bac84f9eaa6d44d365620ece419e5c41cf44a5e9902b4c1f59c9605771b10e4565a0cb46e99d78e0464e8aabb42c97de880642257 languageName: node linkType: hard @@ -5270,7 +5270,7 @@ __metadata: resolution: "for-each@npm:0.3.3" dependencies: is-callable: "npm:^1.1.3" - checksum: 22330d8a2db728dbf003ec9182c2d421fbcd2969b02b4f97ec288721cda63eb28f2c08585ddccd0f77cb2930af8d958005c9e72f47141dc51816127a118f39aa + checksum: 10c0/22330d8a2db728dbf003ec9182c2d421fbcd2969b02b4f97ec288721cda63eb28f2c08585ddccd0f77cb2930af8d958005c9e72f47141dc51816127a118f39aa languageName: node linkType: hard @@ -5280,7 +5280,7 @@ __metadata: dependencies: cross-spawn: "npm:^7.0.0" signal-exit: "npm:^4.0.1" - checksum: 9700a0285628abaeb37007c9a4d92bd49f67210f09067638774338e146c8e9c825c5c877f072b2f75f41dc6a2d0be8664f79ffc03f6576649f54a84fb9b47de0 + checksum: 10c0/9700a0285628abaeb37007c9a4d92bd49f67210f09067638774338e146c8e9c825c5c877f072b2f75f41dc6a2d0be8664f79ffc03f6576649f54a84fb9b47de0 languageName: node linkType: hard @@ -5292,7 +5292,7 @@ __metadata: graceful-fs: "npm:^4.2.0" jsonfile: "npm:^6.0.1" universalify: "npm:^2.0.0" - checksum: 9b808bd884beff5cb940773018179a6b94a966381d005479f00adda6b44e5e3d4abf765135773d849cc27efe68c349e4a7b86acd7d3306d5932c14f3a4b17a92 + checksum: 10c0/9b808bd884beff5cb940773018179a6b94a966381d005479f00adda6b44e5e3d4abf765135773d849cc27efe68c349e4a7b86acd7d3306d5932c14f3a4b17a92 languageName: node linkType: hard @@ -5301,7 +5301,7 @@ __metadata: resolution: "fs-minipass@npm:2.1.0" dependencies: minipass: "npm:^3.0.0" - checksum: 703d16522b8282d7299337539c3ed6edddd1afe82435e4f5b76e34a79cd74e488a8a0e26a636afc2440e1a23b03878e2122e3a2cfe375a5cf63c37d92b86a004 + checksum: 10c0/703d16522b8282d7299337539c3ed6edddd1afe82435e4f5b76e34a79cd74e488a8a0e26a636afc2440e1a23b03878e2122e3a2cfe375a5cf63c37d92b86a004 languageName: node linkType: hard @@ -5310,14 +5310,14 @@ __metadata: resolution: "fs-minipass@npm:3.0.3" dependencies: minipass: "npm:^7.0.3" - checksum: 63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 + checksum: 10c0/63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 languageName: node linkType: hard "fs.realpath@npm:^1.0.0": version: 1.0.0 resolution: "fs.realpath@npm:1.0.0" - checksum: 444cf1291d997165dfd4c0d58b69f0e4782bfd9149fd72faa4fe299e68e0e93d6db941660b37dd29153bf7186672ececa3b50b7e7249477b03fdf850f287c948 + checksum: 10c0/444cf1291d997165dfd4c0d58b69f0e4782bfd9149fd72faa4fe299e68e0e93d6db941660b37dd29153bf7186672ececa3b50b7e7249477b03fdf850f287c948 languageName: node linkType: hard @@ -5326,7 +5326,7 @@ __metadata: resolution: "fsevents@npm:2.3.3" dependencies: node-gyp: "npm:latest" - checksum: a1f0c44595123ed717febbc478aa952e47adfc28e2092be66b8ab1635147254ca6cfe1df792a8997f22716d4cbafc73309899ff7bfac2ac3ad8cf2e4ecc3ec60 + checksum: 10c0/a1f0c44595123ed717febbc478aa952e47adfc28e2092be66b8ab1635147254ca6cfe1df792a8997f22716d4cbafc73309899ff7bfac2ac3ad8cf2e4ecc3ec60 conditions: os=darwin languageName: node linkType: hard @@ -5343,7 +5343,7 @@ __metadata: "function-bind@npm:^1.1.1, function-bind@npm:^1.1.2": version: 1.1.2 resolution: "function-bind@npm:1.1.2" - checksum: d8680ee1e5fcd4c197e4ac33b2b4dce03c71f4d91717292785703db200f5c21f977c568d28061226f9b5900cbcd2c84463646134fd5337e7925e0942bc3f46d5 + checksum: 10c0/d8680ee1e5fcd4c197e4ac33b2b4dce03c71f4d91717292785703db200f5c21f977c568d28061226f9b5900cbcd2c84463646134fd5337e7925e0942bc3f46d5 languageName: node linkType: hard @@ -5355,14 +5355,14 @@ __metadata: define-properties: "npm:^1.2.0" es-abstract: "npm:^1.22.1" functions-have-names: "npm:^1.2.3" - checksum: 9eae11294905b62cb16874adb4fc687927cda3162285e0ad9612e6a1d04934005d46907362ea9cdb7428edce05a2f2c3dabc3b2d21e9fd343e9bb278230ad94b + checksum: 10c0/9eae11294905b62cb16874adb4fc687927cda3162285e0ad9612e6a1d04934005d46907362ea9cdb7428edce05a2f2c3dabc3b2d21e9fd343e9bb278230ad94b languageName: node linkType: hard "functions-have-names@npm:^1.2.3": version: 1.2.3 resolution: "functions-have-names@npm:1.2.3" - checksum: 33e77fd29bddc2d9bb78ab3eb854c165909201f88c75faa8272e35899e2d35a8a642a15e7420ef945e1f64a9670d6aa3ec744106b2aa42be68ca5114025954ca + checksum: 10c0/33e77fd29bddc2d9bb78ab3eb854c165909201f88c75faa8272e35899e2d35a8a642a15e7420ef945e1f64a9670d6aa3ec744106b2aa42be68ca5114025954ca languageName: node linkType: hard @@ -5378,21 +5378,21 @@ __metadata: string-width: "npm:^4.2.3" strip-ansi: "npm:^6.0.1" wide-align: "npm:^1.1.5" - checksum: ef10d7981113d69225135f994c9f8c4369d945e64a8fc721d655a3a38421b738c9fe899951721d1b47b73c41fdb5404ac87cc8903b2ecbed95d2800363e7e58c + checksum: 10c0/ef10d7981113d69225135f994c9f8c4369d945e64a8fc721d655a3a38421b738c9fe899951721d1b47b73c41fdb5404ac87cc8903b2ecbed95d2800363e7e58c languageName: node linkType: hard "gensync@npm:^1.0.0-beta.2": version: 1.0.0-beta.2 resolution: "gensync@npm:1.0.0-beta.2" - checksum: 782aba6cba65b1bb5af3b095d96249d20edbe8df32dbf4696fd49be2583faf676173bf4809386588828e4dd76a3354fcbeb577bab1c833ccd9fc4577f26103f8 + checksum: 10c0/782aba6cba65b1bb5af3b095d96249d20edbe8df32dbf4696fd49be2583faf676173bf4809386588828e4dd76a3354fcbeb577bab1c833ccd9fc4577f26103f8 languageName: node linkType: hard "get-caller-file@npm:^2.0.5": version: 2.0.5 resolution: "get-caller-file@npm:2.0.5" - checksum: c6c7b60271931fa752aeb92f2b47e355eac1af3a2673f47c9589e8f8a41adc74d45551c1bc57b5e66a80609f10ffb72b6f575e4370d61cc3f7f3aaff01757cde + checksum: 10c0/c6c7b60271931fa752aeb92f2b47e355eac1af3a2673f47c9589e8f8a41adc74d45551c1bc57b5e66a80609f10ffb72b6f575e4370d61cc3f7f3aaff01757cde languageName: node linkType: hard @@ -5404,14 +5404,14 @@ __metadata: has-proto: "npm:^1.0.1" has-symbols: "npm:^1.0.3" hasown: "npm:^2.0.0" - checksum: 4e7fb8adc6172bae7c4fe579569b4d5238b3667c07931cd46b4eee74bbe6ff6b91329bec311a638d8e60f5b51f44fe5445693c6be89ae88d4b5c49f7ff12db0b + checksum: 10c0/4e7fb8adc6172bae7c4fe579569b4d5238b3667c07931cd46b4eee74bbe6ff6b91329bec311a638d8e60f5b51f44fe5445693c6be89ae88d4b5c49f7ff12db0b languageName: node linkType: hard "get-own-enumerable-property-symbols@npm:^3.0.0": version: 3.0.2 resolution: "get-own-enumerable-property-symbols@npm:3.0.2" - checksum: 103999855f3d1718c631472437161d76962cbddcd95cc642a34c07bfb661ed41b6c09a9c669ccdff89ee965beb7126b80eec7b2101e20e31e9cc6c4725305e10 + checksum: 10c0/103999855f3d1718c631472437161d76962cbddcd95cc642a34c07bfb661ed41b6c09a9c669ccdff89ee965beb7126b80eec7b2101e20e31e9cc6c4725305e10 languageName: node linkType: hard @@ -5421,7 +5421,7 @@ __metadata: dependencies: call-bind: "npm:^1.0.2" get-intrinsic: "npm:^1.1.1" - checksum: 23bc3b44c221cdf7669a88230c62f4b9e30393b61eb21ba4400cb3e346801bd8f95fe4330ee78dbae37aecd874646d53e3e76a17a654d0c84c77f6690526d6bb + checksum: 10c0/23bc3b44c221cdf7669a88230c62f4b9e30393b61eb21ba4400cb3e346801bd8f95fe4330ee78dbae37aecd874646d53e3e76a17a654d0c84c77f6690526d6bb languageName: node linkType: hard @@ -5430,7 +5430,7 @@ __metadata: resolution: "get-tsconfig@npm:4.7.0" dependencies: resolve-pkg-maps: "npm:^1.0.0" - checksum: 5844d18a705535808cf535010d9443b47b462c6e91ed00d94500602f220ecb8e518325d5b1f9e0c515c67025819c3df193194144a456e1d8f1cd70b5d48b52aa + checksum: 10c0/5844d18a705535808cf535010d9443b47b462c6e91ed00d94500602f220ecb8e518325d5b1f9e0c515c67025819c3df193194144a456e1d8f1cd70b5d48b52aa languageName: node linkType: hard @@ -5439,7 +5439,7 @@ __metadata: resolution: "glob-parent@npm:5.1.2" dependencies: is-glob: "npm:^4.0.1" - checksum: cab87638e2112bee3f839ef5f6e0765057163d39c66be8ec1602f3823da4692297ad4e972de876ea17c44d652978638d2fd583c6713d0eb6591706825020c9ee + checksum: 10c0/cab87638e2112bee3f839ef5f6e0765057163d39c66be8ec1602f3823da4692297ad4e972de876ea17c44d652978638d2fd583c6713d0eb6591706825020c9ee languageName: node linkType: hard @@ -5448,7 +5448,7 @@ __metadata: resolution: "glob-parent@npm:6.0.2" dependencies: is-glob: "npm:^4.0.3" - checksum: 317034d88654730230b3f43bb7ad4f7c90257a426e872ea0bf157473ac61c99bf5d205fad8f0185f989be8d2fa6d3c7dce1645d99d545b6ea9089c39f838e7f8 + checksum: 10c0/317034d88654730230b3f43bb7ad4f7c90257a426e872ea0bf157473ac61c99bf5d205fad8f0185f989be8d2fa6d3c7dce1645d99d545b6ea9089c39f838e7f8 languageName: node linkType: hard @@ -5463,7 +5463,7 @@ __metadata: path-scurry: "npm:^1.10.1" bin: glob: dist/cjs/src/bin.js - checksum: 50effa4208762e508def5688e4d88242db80b5913f65e9c5d5aefb707c59e66a27e845fbf18127157189f6ed0f055e2c94d7112c97a065b9cbfe002e1b26d330 + checksum: 10c0/50effa4208762e508def5688e4d88242db80b5913f65e9c5d5aefb707c59e66a27e845fbf18127157189f6ed0f055e2c94d7112c97a065b9cbfe002e1b26d330 languageName: node linkType: hard @@ -5477,14 +5477,14 @@ __metadata: minimatch: "npm:^3.1.1" once: "npm:^1.3.0" path-is-absolute: "npm:^1.0.0" - checksum: 65676153e2b0c9095100fe7f25a778bf45608eeb32c6048cf307f579649bcc30353277b3b898a3792602c65764e5baa4f643714dfbdfd64ea271d210c7a425fe + checksum: 10c0/65676153e2b0c9095100fe7f25a778bf45608eeb32c6048cf307f579649bcc30353277b3b898a3792602c65764e5baa4f643714dfbdfd64ea271d210c7a425fe languageName: node linkType: hard "globals@npm:^11.1.0": version: 11.12.0 resolution: "globals@npm:11.12.0" - checksum: 758f9f258e7b19226bd8d4af5d3b0dcf7038780fb23d82e6f98932c44e239f884847f1766e8fa9cc5635ccb3204f7fa7314d4408dd4002a5e8ea827b4018f0a1 + checksum: 10c0/758f9f258e7b19226bd8d4af5d3b0dcf7038780fb23d82e6f98932c44e239f884847f1766e8fa9cc5635ccb3204f7fa7314d4408dd4002a5e8ea827b4018f0a1 languageName: node linkType: hard @@ -5493,7 +5493,7 @@ __metadata: resolution: "globals@npm:13.21.0" dependencies: type-fest: "npm:^0.20.2" - checksum: 90573e825401adbe0ef25db1b52e8f74afe4a1087049edd972f1ace77b391753fc3fe51eba9b6962c62e2282645f0a27ce20251662cdc247631c4861f32d56eb + checksum: 10c0/90573e825401adbe0ef25db1b52e8f74afe4a1087049edd972f1ace77b391753fc3fe51eba9b6962c62e2282645f0a27ce20251662cdc247631c4861f32d56eb languageName: node linkType: hard @@ -5502,7 +5502,7 @@ __metadata: resolution: "globalthis@npm:1.0.3" dependencies: define-properties: "npm:^1.1.3" - checksum: 0db6e9af102a5254630351557ac15e6909bc7459d3e3f6b001e59fe784c96d31108818f032d9095739355a88467459e6488ff16584ee6250cd8c27dec05af4b0 + checksum: 10c0/0db6e9af102a5254630351557ac15e6909bc7459d3e3f6b001e59fe784c96d31108818f032d9095739355a88467459e6488ff16584ee6250cd8c27dec05af4b0 languageName: node linkType: hard @@ -5516,7 +5516,7 @@ __metadata: ignore: "npm:^5.2.0" merge2: "npm:^1.4.1" slash: "npm:^3.0.0" - checksum: b39511b4afe4bd8a7aead3a27c4ade2b9968649abab0a6c28b1a90141b96ca68ca5db1302f7c7bd29eab66bf51e13916b8e0a3d0ac08f75e1e84a39b35691189 + checksum: 10c0/b39511b4afe4bd8a7aead3a27c4ade2b9968649abab0a6c28b1a90141b96ca68ca5db1302f7c7bd29eab66bf51e13916b8e0a3d0ac08f75e1e84a39b35691189 languageName: node linkType: hard @@ -5525,7 +5525,7 @@ __metadata: resolution: "goober@npm:2.1.13" peerDependencies: csstype: ^3.0.10 - checksum: a322ea3b688e1140e9e69014169563a1a73ea715d4a6edeaf61b59d40eb2c3b70f8269b09bb178d474764ee1772a0b1719c1d45db689e5c557698e468ce94702 + checksum: 10c0/a322ea3b688e1140e9e69014169563a1a73ea715d4a6edeaf61b59d40eb2c3b70f8269b09bb178d474764ee1772a0b1719c1d45db689e5c557698e468ce94702 languageName: node linkType: hard @@ -5534,42 +5534,42 @@ __metadata: resolution: "gopd@npm:1.0.1" dependencies: get-intrinsic: "npm:^1.1.3" - checksum: 505c05487f7944c552cee72087bf1567debb470d4355b1335f2c262d218ebbff805cd3715448fe29b4b380bae6912561d0467233e4165830efd28da241418c63 + checksum: 10c0/505c05487f7944c552cee72087bf1567debb470d4355b1335f2c262d218ebbff805cd3715448fe29b4b380bae6912561d0467233e4165830efd28da241418c63 languageName: node linkType: hard "graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" - checksum: 386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 + checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 languageName: node linkType: hard "graphemer@npm:^1.4.0": version: 1.4.0 resolution: "graphemer@npm:1.4.0" - checksum: e951259d8cd2e0d196c72ec711add7115d42eb9a8146c8eeda5b8d3ac91e5dd816b9cd68920726d9fd4490368e7ed86e9c423f40db87e2d8dfafa00fa17c3a31 + checksum: 10c0/e951259d8cd2e0d196c72ec711add7115d42eb9a8146c8eeda5b8d3ac91e5dd816b9cd68920726d9fd4490368e7ed86e9c423f40db87e2d8dfafa00fa17c3a31 languageName: node linkType: hard "has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": version: 1.0.2 resolution: "has-bigints@npm:1.0.2" - checksum: 724eb1485bfa3cdff6f18d95130aa190561f00b3fcf9f19dc640baf8176b5917c143b81ec2123f8cddb6c05164a198c94b13e1377c497705ccc8e1a80306e83b + checksum: 10c0/724eb1485bfa3cdff6f18d95130aa190561f00b3fcf9f19dc640baf8176b5917c143b81ec2123f8cddb6c05164a198c94b13e1377c497705ccc8e1a80306e83b languageName: node linkType: hard "has-flag@npm:^3.0.0": version: 3.0.0 resolution: "has-flag@npm:3.0.0" - checksum: 1c6c83b14b8b1b3c25b0727b8ba3e3b647f99e9e6e13eb7322107261de07a4c1be56fc0d45678fc376e09772a3a1642ccdaf8fc69bdf123b6c086598397ce473 + checksum: 10c0/1c6c83b14b8b1b3c25b0727b8ba3e3b647f99e9e6e13eb7322107261de07a4c1be56fc0d45678fc376e09772a3a1642ccdaf8fc69bdf123b6c086598397ce473 languageName: node linkType: hard "has-flag@npm:^4.0.0": version: 4.0.0 resolution: "has-flag@npm:4.0.0" - checksum: 2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1 + checksum: 10c0/2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1 languageName: node linkType: hard @@ -5578,21 +5578,21 @@ __metadata: resolution: "has-property-descriptors@npm:1.0.0" dependencies: get-intrinsic: "npm:^1.1.1" - checksum: d4ca882b6960d6257bd28baa3ddfa21f068d260411004a093b30ca357c740e11e985771c85216a6d1eef4161e862657f48c4758ec8ab515223b3895200ad164b + checksum: 10c0/d4ca882b6960d6257bd28baa3ddfa21f068d260411004a093b30ca357c740e11e985771c85216a6d1eef4161e862657f48c4758ec8ab515223b3895200ad164b languageName: node linkType: hard "has-proto@npm:^1.0.1": version: 1.0.1 resolution: "has-proto@npm:1.0.1" - checksum: c8a8fe411f810b23a564bd5546a8f3f0fff6f1b692740eb7a2fdc9df716ef870040806891e2f23ff4653f1083e3895bf12088703dd1a0eac3d9202d3a4768cd0 + checksum: 10c0/c8a8fe411f810b23a564bd5546a8f3f0fff6f1b692740eb7a2fdc9df716ef870040806891e2f23ff4653f1083e3895bf12088703dd1a0eac3d9202d3a4768cd0 languageName: node linkType: hard "has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": version: 1.0.3 resolution: "has-symbols@npm:1.0.3" - checksum: e6922b4345a3f37069cdfe8600febbca791c94988c01af3394d86ca3360b4b93928bbf395859158f88099cb10b19d98e3bbab7c9ff2c1bd09cf665ee90afa2c3 + checksum: 10c0/e6922b4345a3f37069cdfe8600febbca791c94988c01af3394d86ca3360b4b93928bbf395859158f88099cb10b19d98e3bbab7c9ff2c1bd09cf665ee90afa2c3 languageName: node linkType: hard @@ -5601,14 +5601,14 @@ __metadata: resolution: "has-tostringtag@npm:1.0.0" dependencies: has-symbols: "npm:^1.0.2" - checksum: 1cdba76b7d13f65198a92b8ca1560ba40edfa09e85d182bf436d928f3588a9ebd260451d569f0ed1b849c4bf54f49c862aa0d0a77f9552b1855bb6deb526c011 + checksum: 10c0/1cdba76b7d13f65198a92b8ca1560ba40edfa09e85d182bf436d928f3588a9ebd260451d569f0ed1b849c4bf54f49c862aa0d0a77f9552b1855bb6deb526c011 languageName: node linkType: hard "has-unicode@npm:^2.0.1": version: 2.0.1 resolution: "has-unicode@npm:2.0.1" - checksum: ebdb2f4895c26bb08a8a100b62d362e49b2190bcfd84b76bc4be1a3bd4d254ec52d0dd9f2fbcc093fc5eb878b20c52146f9dfd33e2686ed28982187be593b47c + checksum: 10c0/ebdb2f4895c26bb08a8a100b62d362e49b2190bcfd84b76bc4be1a3bd4d254ec52d0dd9f2fbcc093fc5eb878b20c52146f9dfd33e2686ed28982187be593b47c languageName: node linkType: hard @@ -5617,7 +5617,7 @@ __metadata: resolution: "has@npm:1.0.3" dependencies: function-bind: "npm:^1.1.1" - checksum: e1da0d2bd109f116b632f27782cf23182b42f14972ca9540e4c5aa7e52647407a0a4a76937334fddcb56befe94a3494825ec22b19b51f5e5507c3153fd1a5e1b + checksum: 10c0/e1da0d2bd109f116b632f27782cf23182b42f14972ca9540e4c5aa7e52647407a0a4a76937334fddcb56befe94a3494825ec22b19b51f5e5507c3153fd1a5e1b languageName: node linkType: hard @@ -5626,7 +5626,7 @@ __metadata: resolution: "hasown@npm:2.0.0" dependencies: function-bind: "npm:^1.1.2" - checksum: 5d415b114f410661208c95e7ab4879f1cc2765b8daceff4dc8718317d1cb7b9ffa7c5d1eafd9a4389c9aab7445d6ea88e05f3096cb1e529618b55304956b87fc + checksum: 10c0/5d415b114f410661208c95e7ab4879f1cc2765b8daceff4dc8718317d1cb7b9ffa7c5d1eafd9a4389c9aab7445d6ea88e05f3096cb1e529618b55304956b87fc languageName: node linkType: hard @@ -5635,7 +5635,7 @@ __metadata: resolution: "hoist-non-react-statics@npm:3.3.2" dependencies: react-is: "npm:^16.7.0" - checksum: fe0889169e845d738b59b64badf5e55fa3cf20454f9203d1eb088df322d49d4318df774828e789898dcb280e8a5521bb59b3203385662ca5e9218a6ca5820e74 + checksum: 10c0/fe0889169e845d738b59b64badf5e55fa3cf20454f9203d1eb088df322d49d4318df774828e789898dcb280e8a5521bb59b3203385662ca5e9218a6ca5820e74 languageName: node linkType: hard @@ -5652,14 +5652,14 @@ __metadata: terser: "npm:^5.15.1" bin: html-minifier-terser: cli.js - checksum: ffc97c17299d9ec30e17269781b816ea2fc411a9206fc9e768be8f2decb1ea1470892809babb23bb4e3ab1f64d606d97e1803bf526ae3af71edc0fd3070b94b9 + checksum: 10c0/ffc97c17299d9ec30e17269781b816ea2fc411a9206fc9e768be8f2decb1ea1470892809babb23bb4e3ab1f64d606d97e1803bf526ae3af71edc0fd3070b94b9 languageName: node linkType: hard "http-cache-semantics@npm:^4.1.1": version: 4.1.1 resolution: "http-cache-semantics@npm:4.1.1" - checksum: ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc + checksum: 10c0/ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc languageName: node linkType: hard @@ -5670,7 +5670,7 @@ __metadata: "@tootallnate/once": "npm:2" agent-base: "npm:6" debug: "npm:4" - checksum: 32a05e413430b2c1e542e5c74b38a9f14865301dd69dff2e53ddb684989440e3d2ce0c4b64d25eb63cf6283e6265ff979a61cf93e3ca3d23047ddfdc8df34a32 + checksum: 10c0/32a05e413430b2c1e542e5c74b38a9f14865301dd69dff2e53ddb684989440e3d2ce0c4b64d25eb63cf6283e6265ff979a61cf93e3ca3d23047ddfdc8df34a32 languageName: node linkType: hard @@ -5680,7 +5680,7 @@ __metadata: dependencies: agent-base: "npm:6" debug: "npm:4" - checksum: 6dd639f03434003577c62b27cafdb864784ef19b2de430d8ae2a1d45e31c4fd60719e5637b44db1a88a046934307da7089e03d6089ec3ddacc1189d8de8897d1 + checksum: 10c0/6dd639f03434003577c62b27cafdb864784ef19b2de430d8ae2a1d45e31c4fd60719e5637b44db1a88a046934307da7089e03d6089ec3ddacc1189d8de8897d1 languageName: node linkType: hard @@ -5689,7 +5689,7 @@ __metadata: resolution: "humanize-ms@npm:1.2.1" dependencies: ms: "npm:^2.0.0" - checksum: f34a2c20161d02303c2807badec2f3b49cbfbbb409abd4f95a07377ae01cfe6b59e3d15ac609cffcd8f2521f0eb37b7e1091acf65da99aa2a4f1ad63c21e7e7a + checksum: 10c0/f34a2c20161d02303c2807badec2f3b49cbfbbb409abd4f95a07377ae01cfe6b59e3d15ac609cffcd8f2521f0eb37b7e1091acf65da99aa2a4f1ad63c21e7e7a languageName: node linkType: hard @@ -5698,21 +5698,21 @@ __metadata: resolution: "iconv-lite@npm:0.6.3" dependencies: safer-buffer: "npm:>= 2.1.2 < 3.0.0" - checksum: 98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 + checksum: 10c0/98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 languageName: node linkType: hard "idb@npm:^7.0.1": version: 7.1.1 resolution: "idb@npm:7.1.1" - checksum: 72418e4397638797ee2089f97b45fc29f937b830bc0eb4126f4a9889ecf10320ceacf3a177fe5d7ffaf6b4fe38b20bbd210151549bfdc881db8081eed41c870d + checksum: 10c0/72418e4397638797ee2089f97b45fc29f937b830bc0eb4126f4a9889ecf10320ceacf3a177fe5d7ffaf6b4fe38b20bbd210151549bfdc881db8081eed41c870d languageName: node linkType: hard "ignore@npm:^5.2.0, ignore@npm:^5.2.4": version: 5.2.4 resolution: "ignore@npm:5.2.4" - checksum: 7c7cd90edd9fea6e037f9b9da4b01bf0a86b198ce78345f9bbd983929d68ff14830be31111edc5d70c264921f4962404d75b7262b4d9cc3bc12381eccbd03096 + checksum: 10c0/7c7cd90edd9fea6e037f9b9da4b01bf0a86b198ce78345f9bbd983929d68ff14830be31111edc5d70c264921f4962404d75b7262b4d9cc3bc12381eccbd03096 languageName: node linkType: hard @@ -5722,21 +5722,21 @@ __metadata: dependencies: parent-module: "npm:^1.0.0" resolve-from: "npm:^4.0.0" - checksum: 7f882953aa6b740d1f0e384d0547158bc86efbf2eea0f1483b8900a6f65c5a5123c2cf09b0d542cc419d0b98a759ecaeb394237e97ea427f2da221dc3cd80cc3 + checksum: 10c0/7f882953aa6b740d1f0e384d0547158bc86efbf2eea0f1483b8900a6f65c5a5123c2cf09b0d542cc419d0b98a759ecaeb394237e97ea427f2da221dc3cd80cc3 languageName: node linkType: hard "imurmurhash@npm:^0.1.4": version: 0.1.4 resolution: "imurmurhash@npm:0.1.4" - checksum: 8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 + checksum: 10c0/8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 languageName: node linkType: hard "indent-string@npm:^4.0.0": version: 4.0.0 resolution: "indent-string@npm:4.0.0" - checksum: 1e1904ddb0cb3d6cce7cd09e27a90184908b7a5d5c21b92e232c93579d314f0b83c246ffb035493d0504b1e9147ba2c9b21df0030f48673fba0496ecd698161f + checksum: 10c0/1e1904ddb0cb3d6cce7cd09e27a90184908b7a5d5c21b92e232c93579d314f0b83c246ffb035493d0504b1e9147ba2c9b21df0030f48673fba0496ecd698161f languageName: node linkType: hard @@ -5746,14 +5746,14 @@ __metadata: dependencies: once: "npm:^1.3.0" wrappy: "npm:1" - checksum: 7faca22584600a9dc5b9fca2cd5feb7135ac8c935449837b315676b4c90aa4f391ec4f42240178244b5a34e8bede1948627fda392ca3191522fc46b34e985ab2 + checksum: 10c0/7faca22584600a9dc5b9fca2cd5feb7135ac8c935449837b315676b4c90aa4f391ec4f42240178244b5a34e8bede1948627fda392ca3191522fc46b34e985ab2 languageName: node linkType: hard "inherits@npm:2, inherits@npm:^2.0.3": version: 2.0.4 resolution: "inherits@npm:2.0.4" - checksum: 4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 + checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 languageName: node linkType: hard @@ -5764,21 +5764,21 @@ __metadata: get-intrinsic: "npm:^1.2.0" has: "npm:^1.0.3" side-channel: "npm:^1.0.4" - checksum: 66d8a66b4b5310c042e8ad00ce895dc55cb25165a3a7da0d7862ca18d69d3b1ba86511b4bf3baf4273d744d3f6e9154574af45189ef11135a444945309e39e4a + checksum: 10c0/66d8a66b4b5310c042e8ad00ce895dc55cb25165a3a7da0d7862ca18d69d3b1ba86511b4bf3baf4273d744d3f6e9154574af45189ef11135a444945309e39e4a languageName: node linkType: hard "internmap@npm:1 - 2": version: 2.0.3 resolution: "internmap@npm:2.0.3" - checksum: 8cedd57f07bbc22501516fbfc70447f0c6812871d471096fad9ea603516eacc2137b633633daf432c029712df0baefd793686388ddf5737e3ea15074b877f7ed + checksum: 10c0/8cedd57f07bbc22501516fbfc70447f0c6812871d471096fad9ea603516eacc2137b633633daf432c029712df0baefd793686388ddf5737e3ea15074b877f7ed languageName: node linkType: hard "ip@npm:^2.0.0": version: 2.0.0 resolution: "ip@npm:2.0.0" - checksum: 8d186cc5585f57372847ae29b6eba258c68862055e18a75cc4933327232cb5c107f89800ce29715d542eef2c254fbb68b382e780a7414f9ee7caf60b7a473958 + checksum: 10c0/8d186cc5585f57372847ae29b6eba258c68862055e18a75cc4933327232cb5c107f89800ce29715d542eef2c254fbb68b382e780a7414f9ee7caf60b7a473958 languageName: node linkType: hard @@ -5788,7 +5788,7 @@ __metadata: dependencies: call-bind: "npm:^1.0.2" has-tostringtag: "npm:^1.0.0" - checksum: 5ff1f341ee4475350adfc14b2328b38962564b7c2076be2f5bac7bd9b61779efba99b9f844a7b82ba7654adccf8e8eb19d1bb0cc6d1c1a085e498f6793d4328f + checksum: 10c0/5ff1f341ee4475350adfc14b2328b38962564b7c2076be2f5bac7bd9b61779efba99b9f844a7b82ba7654adccf8e8eb19d1bb0cc6d1c1a085e498f6793d4328f languageName: node linkType: hard @@ -5799,14 +5799,14 @@ __metadata: call-bind: "npm:^1.0.2" get-intrinsic: "npm:^1.2.0" is-typed-array: "npm:^1.1.10" - checksum: 40ed13a5f5746ac3ae2f2e463687d9b5a3f5fd0086f970fb4898f0253c2a5ec2e3caea2d664dd8f54761b1c1948609702416921a22faebe160c7640a9217c80e + checksum: 10c0/40ed13a5f5746ac3ae2f2e463687d9b5a3f5fd0086f970fb4898f0253c2a5ec2e3caea2d664dd8f54761b1c1948609702416921a22faebe160c7640a9217c80e languageName: node linkType: hard "is-arrayish@npm:^0.2.1": version: 0.2.1 resolution: "is-arrayish@npm:0.2.1" - checksum: e7fb686a739068bb70f860b39b67afc62acc62e36bb61c5f965768abce1873b379c563e61dd2adad96ebb7edf6651111b385e490cf508378959b0ed4cac4e729 + checksum: 10c0/e7fb686a739068bb70f860b39b67afc62acc62e36bb61c5f965768abce1873b379c563e61dd2adad96ebb7edf6651111b385e490cf508378959b0ed4cac4e729 languageName: node linkType: hard @@ -5815,7 +5815,7 @@ __metadata: resolution: "is-async-function@npm:2.0.0" dependencies: has-tostringtag: "npm:^1.0.0" - checksum: 787bc931576aad525d751fc5ce211960fe91e49ac84a5c22d6ae0bc9541945fbc3f686dc590c3175722ce4f6d7b798a93f6f8ff4847fdb2199aea6f4baf5d668 + checksum: 10c0/787bc931576aad525d751fc5ce211960fe91e49ac84a5c22d6ae0bc9541945fbc3f686dc590c3175722ce4f6d7b798a93f6f8ff4847fdb2199aea6f4baf5d668 languageName: node linkType: hard @@ -5824,7 +5824,7 @@ __metadata: resolution: "is-bigint@npm:1.0.4" dependencies: has-bigints: "npm:^1.0.1" - checksum: eb9c88e418a0d195ca545aff2b715c9903d9b0a5033bc5922fec600eb0c3d7b1ee7f882dbf2e0d5a6e694e42391be3683e4368737bd3c4a77f8ac293e7773696 + checksum: 10c0/eb9c88e418a0d195ca545aff2b715c9903d9b0a5033bc5922fec600eb0c3d7b1ee7f882dbf2e0d5a6e694e42391be3683e4368737bd3c4a77f8ac293e7773696 languageName: node linkType: hard @@ -5833,7 +5833,7 @@ __metadata: resolution: "is-binary-path@npm:2.1.0" dependencies: binary-extensions: "npm:^2.0.0" - checksum: a16eaee59ae2b315ba36fad5c5dcaf8e49c3e27318f8ab8fa3cdb8772bf559c8d1ba750a589c2ccb096113bb64497084361a25960899cb6172a6925ab6123d38 + checksum: 10c0/a16eaee59ae2b315ba36fad5c5dcaf8e49c3e27318f8ab8fa3cdb8772bf559c8d1ba750a589c2ccb096113bb64497084361a25960899cb6172a6925ab6123d38 languageName: node linkType: hard @@ -5843,14 +5843,14 @@ __metadata: dependencies: call-bind: "npm:^1.0.2" has-tostringtag: "npm:^1.0.0" - checksum: 6090587f8a8a8534c0f816da868bc94f32810f08807aa72fa7e79f7e11c466d281486ffe7a788178809c2aa71fe3e700b167fe80dd96dad68026bfff8ebf39f7 + checksum: 10c0/6090587f8a8a8534c0f816da868bc94f32810f08807aa72fa7e79f7e11c466d281486ffe7a788178809c2aa71fe3e700b167fe80dd96dad68026bfff8ebf39f7 languageName: node linkType: hard "is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": version: 1.2.7 resolution: "is-callable@npm:1.2.7" - checksum: ceebaeb9d92e8adee604076971dd6000d38d6afc40bb843ea8e45c5579b57671c3f3b50d7f04869618242c6cee08d1b67806a8cb8edaaaf7c0748b3720d6066f + checksum: 10c0/ceebaeb9d92e8adee604076971dd6000d38d6afc40bb843ea8e45c5579b57671c3f3b50d7f04869618242c6cee08d1b67806a8cb8edaaaf7c0748b3720d6066f languageName: node linkType: hard @@ -5859,7 +5859,7 @@ __metadata: resolution: "is-core-module@npm:2.13.1" dependencies: hasown: "npm:^2.0.0" - checksum: 2cba9903aaa52718f11c4896dabc189bab980870aae86a62dc0d5cedb546896770ee946fb14c84b7adf0735f5eaea4277243f1b95f5cefa90054f92fbcac2518 + checksum: 10c0/2cba9903aaa52718f11c4896dabc189bab980870aae86a62dc0d5cedb546896770ee946fb14c84b7adf0735f5eaea4277243f1b95f5cefa90054f92fbcac2518 languageName: node linkType: hard @@ -5868,14 +5868,14 @@ __metadata: resolution: "is-date-object@npm:1.0.5" dependencies: has-tostringtag: "npm:^1.0.0" - checksum: eed21e5dcc619c48ccef804dfc83a739dbb2abee6ca202838ee1bd5f760fe8d8a93444f0d49012ad19bb7c006186e2884a1b92f6e1c056da7fd23d0a9ad5992e + checksum: 10c0/eed21e5dcc619c48ccef804dfc83a739dbb2abee6ca202838ee1bd5f760fe8d8a93444f0d49012ad19bb7c006186e2884a1b92f6e1c056da7fd23d0a9ad5992e languageName: node linkType: hard "is-extglob@npm:^2.1.1": version: 2.1.1 resolution: "is-extglob@npm:2.1.1" - checksum: 5487da35691fbc339700bbb2730430b07777a3c21b9ebaecb3072512dfd7b4ba78ac2381a87e8d78d20ea08affb3f1971b4af629173a6bf435ff8a4c47747912 + checksum: 10c0/5487da35691fbc339700bbb2730430b07777a3c21b9ebaecb3072512dfd7b4ba78ac2381a87e8d78d20ea08affb3f1971b4af629173a6bf435ff8a4c47747912 languageName: node linkType: hard @@ -5884,14 +5884,14 @@ __metadata: resolution: "is-finalizationregistry@npm:1.0.2" dependencies: call-bind: "npm:^1.0.2" - checksum: 81caecc984d27b1a35c68741156fc651fb1fa5e3e6710d21410abc527eb226d400c0943a167922b2e920f6b3e58b0dede9aa795882b038b85f50b3a4b877db86 + checksum: 10c0/81caecc984d27b1a35c68741156fc651fb1fa5e3e6710d21410abc527eb226d400c0943a167922b2e920f6b3e58b0dede9aa795882b038b85f50b3a4b877db86 languageName: node linkType: hard "is-fullwidth-code-point@npm:^3.0.0": version: 3.0.0 resolution: "is-fullwidth-code-point@npm:3.0.0" - checksum: bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc + checksum: 10c0/bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc languageName: node linkType: hard @@ -5900,7 +5900,7 @@ __metadata: resolution: "is-generator-function@npm:1.0.10" dependencies: has-tostringtag: "npm:^1.0.0" - checksum: df03514df01a6098945b5a0cfa1abff715807c8e72f57c49a0686ad54b3b74d394e2d8714e6f709a71eb00c9630d48e73ca1796c1ccc84ac95092c1fecc0d98b + checksum: 10c0/df03514df01a6098945b5a0cfa1abff715807c8e72f57c49a0686ad54b3b74d394e2d8714e6f709a71eb00c9630d48e73ca1796c1ccc84ac95092c1fecc0d98b languageName: node linkType: hard @@ -5909,28 +5909,28 @@ __metadata: resolution: "is-glob@npm:4.0.3" dependencies: is-extglob: "npm:^2.1.1" - checksum: 17fb4014e22be3bbecea9b2e3a76e9e34ff645466be702f1693e8f1ee1adac84710d0be0bd9f967d6354036fd51ab7c2741d954d6e91dae6bb69714de92c197a + checksum: 10c0/17fb4014e22be3bbecea9b2e3a76e9e34ff645466be702f1693e8f1ee1adac84710d0be0bd9f967d6354036fd51ab7c2741d954d6e91dae6bb69714de92c197a languageName: node linkType: hard "is-lambda@npm:^1.0.1": version: 1.0.1 resolution: "is-lambda@npm:1.0.1" - checksum: 85fee098ae62ba6f1e24cf22678805473c7afd0fb3978a3aa260e354cb7bcb3a5806cf0a98403188465efedec41ab4348e8e4e79305d409601323855b3839d4d + checksum: 10c0/85fee098ae62ba6f1e24cf22678805473c7afd0fb3978a3aa260e354cb7bcb3a5806cf0a98403188465efedec41ab4348e8e4e79305d409601323855b3839d4d languageName: node linkType: hard "is-map@npm:^2.0.1": version: 2.0.2 resolution: "is-map@npm:2.0.2" - checksum: 119ff9137a37fd131a72fab3f4ab8c9d6a24b0a1ee26b4eff14dc625900d8675a97785eea5f4174265e2006ed076cc24e89f6e57ebd080a48338d914ec9168a5 + checksum: 10c0/119ff9137a37fd131a72fab3f4ab8c9d6a24b0a1ee26b4eff14dc625900d8675a97785eea5f4174265e2006ed076cc24e89f6e57ebd080a48338d914ec9168a5 languageName: node linkType: hard "is-module@npm:^1.0.0": version: 1.0.0 resolution: "is-module@npm:1.0.0" - checksum: 795a3914bcae7c26a1c23a1e5574c42eac13429625045737bf3e324ce865c0601d61aee7a5afbca1bee8cb300c7d9647e7dc98860c9bdbc3b7fdc51d8ac0bffc + checksum: 10c0/795a3914bcae7c26a1c23a1e5574c42eac13429625045737bf3e324ce865c0601d61aee7a5afbca1bee8cb300c7d9647e7dc98860c9bdbc3b7fdc51d8ac0bffc languageName: node linkType: hard @@ -5940,14 +5940,14 @@ __metadata: dependencies: call-bind: "npm:^1.0.0" define-properties: "npm:^1.1.3" - checksum: 8bfb286f85763f9c2e28ea32e9127702fe980ffd15fa5d63ade3be7786559e6e21355d3625dd364c769c033c5aedf0a2ed3d4025d336abf1b9241e3d9eddc5b0 + checksum: 10c0/8bfb286f85763f9c2e28ea32e9127702fe980ffd15fa5d63ade3be7786559e6e21355d3625dd364c769c033c5aedf0a2ed3d4025d336abf1b9241e3d9eddc5b0 languageName: node linkType: hard "is-negative-zero@npm:^2.0.2": version: 2.0.2 resolution: "is-negative-zero@npm:2.0.2" - checksum: eda024c158f70f2017f3415e471b818d314da5ef5be68f801b16314d4a4b6304a74cbed778acf9e2f955bb9c1c5f2935c1be0c7c99e1ad12286f45366217b6a3 + checksum: 10c0/eda024c158f70f2017f3415e471b818d314da5ef5be68f801b16314d4a4b6304a74cbed778acf9e2f955bb9c1c5f2935c1be0c7c99e1ad12286f45366217b6a3 languageName: node linkType: hard @@ -5956,28 +5956,28 @@ __metadata: resolution: "is-number-object@npm:1.0.7" dependencies: has-tostringtag: "npm:^1.0.0" - checksum: aad266da1e530f1804a2b7bd2e874b4869f71c98590b3964f9d06cc9869b18f8d1f4778f838ecd2a11011bce20aeecb53cb269ba916209b79c24580416b74b1b + checksum: 10c0/aad266da1e530f1804a2b7bd2e874b4869f71c98590b3964f9d06cc9869b18f8d1f4778f838ecd2a11011bce20aeecb53cb269ba916209b79c24580416b74b1b languageName: node linkType: hard "is-number@npm:^7.0.0": version: 7.0.0 resolution: "is-number@npm:7.0.0" - checksum: b4686d0d3053146095ccd45346461bc8e53b80aeb7671cc52a4de02dbbf7dc0d1d2a986e2fe4ae206984b4d34ef37e8b795ebc4f4295c978373e6575e295d811 + checksum: 10c0/b4686d0d3053146095ccd45346461bc8e53b80aeb7671cc52a4de02dbbf7dc0d1d2a986e2fe4ae206984b4d34ef37e8b795ebc4f4295c978373e6575e295d811 languageName: node linkType: hard "is-obj@npm:^1.0.1": version: 1.0.1 resolution: "is-obj@npm:1.0.1" - checksum: 5003acba0af7aa47dfe0760e545a89bbac89af37c12092c3efadc755372cdaec034f130e7a3653a59eb3c1843cfc72ca71eaf1a6c3bafe5a0bab3611a47f9945 + checksum: 10c0/5003acba0af7aa47dfe0760e545a89bbac89af37c12092c3efadc755372cdaec034f130e7a3653a59eb3c1843cfc72ca71eaf1a6c3bafe5a0bab3611a47f9945 languageName: node linkType: hard "is-path-inside@npm:^3.0.3": version: 3.0.3 resolution: "is-path-inside@npm:3.0.3" - checksum: cf7d4ac35fb96bab6a1d2c3598fe5ebb29aafb52c0aaa482b5a3ed9d8ba3edc11631e3ec2637660c44b3ce0e61a08d54946e8af30dec0b60a7c27296c68ffd05 + checksum: 10c0/cf7d4ac35fb96bab6a1d2c3598fe5ebb29aafb52c0aaa482b5a3ed9d8ba3edc11631e3ec2637660c44b3ce0e61a08d54946e8af30dec0b60a7c27296c68ffd05 languageName: node linkType: hard @@ -5987,21 +5987,21 @@ __metadata: dependencies: call-bind: "npm:^1.0.2" has-tostringtag: "npm:^1.0.0" - checksum: bb72aae604a69eafd4a82a93002058c416ace8cde95873589a97fc5dac96a6c6c78a9977d487b7b95426a8f5073969124dd228f043f9f604f041f32fcc465fc1 + checksum: 10c0/bb72aae604a69eafd4a82a93002058c416ace8cde95873589a97fc5dac96a6c6c78a9977d487b7b95426a8f5073969124dd228f043f9f604f041f32fcc465fc1 languageName: node linkType: hard "is-regexp@npm:^1.0.0": version: 1.0.0 resolution: "is-regexp@npm:1.0.0" - checksum: 34cacda1901e00f6e44879378f1d2fa96320ea956c1bec27713130aaf1d44f6e7bd963eed28945bfe37e600cb27df1cf5207302680dad8bdd27b9baff8ecf611 + checksum: 10c0/34cacda1901e00f6e44879378f1d2fa96320ea956c1bec27713130aaf1d44f6e7bd963eed28945bfe37e600cb27df1cf5207302680dad8bdd27b9baff8ecf611 languageName: node linkType: hard "is-set@npm:^2.0.1": version: 2.0.2 resolution: "is-set@npm:2.0.2" - checksum: 5f8bd1880df8c0004ce694e315e6e1e47a3452014be792880bb274a3b2cdb952fdb60789636ca6e084c7947ca8b7ae03ccaf54c93a7fcfed228af810559e5432 + checksum: 10c0/5f8bd1880df8c0004ce694e315e6e1e47a3452014be792880bb274a3b2cdb952fdb60789636ca6e084c7947ca8b7ae03ccaf54c93a7fcfed228af810559e5432 languageName: node linkType: hard @@ -6010,14 +6010,14 @@ __metadata: resolution: "is-shared-array-buffer@npm:1.0.2" dependencies: call-bind: "npm:^1.0.2" - checksum: cfeee6f171f1b13e6cbc6f3b6cc44e192b93df39f3fcb31aa66ffb1d2df3b91e05664311659f9701baba62f5e98c83b0673c628e7adc30f55071c4874fcdccec + checksum: 10c0/cfeee6f171f1b13e6cbc6f3b6cc44e192b93df39f3fcb31aa66ffb1d2df3b91e05664311659f9701baba62f5e98c83b0673c628e7adc30f55071c4874fcdccec languageName: node linkType: hard "is-stream@npm:^2.0.0": version: 2.0.1 resolution: "is-stream@npm:2.0.1" - checksum: 7c284241313fc6efc329b8d7f08e16c0efeb6baab1b4cd0ba579eb78e5af1aa5da11e68559896a2067cd6c526bd29241dda4eb1225e627d5aa1a89a76d4635a5 + checksum: 10c0/7c284241313fc6efc329b8d7f08e16c0efeb6baab1b4cd0ba579eb78e5af1aa5da11e68559896a2067cd6c526bd29241dda4eb1225e627d5aa1a89a76d4635a5 languageName: node linkType: hard @@ -6026,7 +6026,7 @@ __metadata: resolution: "is-string@npm:1.0.7" dependencies: has-tostringtag: "npm:^1.0.0" - checksum: 905f805cbc6eedfa678aaa103ab7f626aac9ebbdc8737abb5243acaa61d9820f8edc5819106b8fcd1839e33db21de9f0116ae20de380c8382d16dc2a601921f6 + checksum: 10c0/905f805cbc6eedfa678aaa103ab7f626aac9ebbdc8737abb5243acaa61d9820f8edc5819106b8fcd1839e33db21de9f0116ae20de380c8382d16dc2a601921f6 languageName: node linkType: hard @@ -6035,7 +6035,7 @@ __metadata: resolution: "is-symbol@npm:1.0.4" dependencies: has-symbols: "npm:^1.0.2" - checksum: 9381dd015f7c8906154dbcbf93fad769de16b4b961edc94f88d26eb8c555935caa23af88bda0c93a18e65560f6d7cca0fd5a3f8a8e1df6f1abbb9bead4502ef7 + checksum: 10c0/9381dd015f7c8906154dbcbf93fad769de16b4b961edc94f88d26eb8c555935caa23af88bda0c93a18e65560f6d7cca0fd5a3f8a8e1df6f1abbb9bead4502ef7 languageName: node linkType: hard @@ -6044,14 +6044,14 @@ __metadata: resolution: "is-typed-array@npm:1.1.12" dependencies: which-typed-array: "npm:^1.1.11" - checksum: 9863e9cc7223c6fc1c462a2c3898a7beff6b41b1ee0fabb03b7d278ae7de670b5bcbc8627db56bb66ed60902fa37d53fe5cce0fd2f7d73ac64fe5da6f409b6ae + checksum: 10c0/9863e9cc7223c6fc1c462a2c3898a7beff6b41b1ee0fabb03b7d278ae7de670b5bcbc8627db56bb66ed60902fa37d53fe5cce0fd2f7d73ac64fe5da6f409b6ae languageName: node linkType: hard "is-weakmap@npm:^2.0.1": version: 2.0.1 resolution: "is-weakmap@npm:2.0.1" - checksum: 9c9fec9efa7bf5030a4a927f33fff2a6976b93646259f92b517d3646c073cc5b98283a162ce75c412b060a46de07032444b530f0a4c9b6e012ef8f1741c3a987 + checksum: 10c0/9c9fec9efa7bf5030a4a927f33fff2a6976b93646259f92b517d3646c073cc5b98283a162ce75c412b060a46de07032444b530f0a4c9b6e012ef8f1741c3a987 languageName: node linkType: hard @@ -6060,7 +6060,7 @@ __metadata: resolution: "is-weakref@npm:1.0.2" dependencies: call-bind: "npm:^1.0.2" - checksum: 1545c5d172cb690c392f2136c23eec07d8d78a7f57d0e41f10078aa4f5daf5d7f57b6513a67514ab4f073275ad00c9822fc8935e00229d0a2089e1c02685d4b1 + checksum: 10c0/1545c5d172cb690c392f2136c23eec07d8d78a7f57d0e41f10078aa4f5daf5d7f57b6513a67514ab4f073275ad00c9822fc8935e00229d0a2089e1c02685d4b1 languageName: node linkType: hard @@ -6070,21 +6070,21 @@ __metadata: dependencies: call-bind: "npm:^1.0.2" get-intrinsic: "npm:^1.1.1" - checksum: ef5136bd446ae4603229b897f73efd0720c6ab3ec6cc05c8d5c4b51aa9f95164713c4cad0a22ff1fedf04865ff86cae4648bc1d5eead4b6388e1150525af1cc1 + checksum: 10c0/ef5136bd446ae4603229b897f73efd0720c6ab3ec6cc05c8d5c4b51aa9f95164713c4cad0a22ff1fedf04865ff86cae4648bc1d5eead4b6388e1150525af1cc1 languageName: node linkType: hard "isarray@npm:^2.0.5": version: 2.0.5 resolution: "isarray@npm:2.0.5" - checksum: 4199f14a7a13da2177c66c31080008b7124331956f47bca57dd0b6ea9f11687aa25e565a2c7a2b519bc86988d10398e3049a1f5df13c9f6b7664154690ae79fd + checksum: 10c0/4199f14a7a13da2177c66c31080008b7124331956f47bca57dd0b6ea9f11687aa25e565a2c7a2b519bc86988d10398e3049a1f5df13c9f6b7664154690ae79fd languageName: node linkType: hard "isexe@npm:^2.0.0": version: 2.0.0 resolution: "isexe@npm:2.0.0" - checksum: 228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d + checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d languageName: node linkType: hard @@ -6094,7 +6094,7 @@ __metadata: dependencies: node-fetch: "npm:^2.6.1" whatwg-fetch: "npm:^3.4.1" - checksum: 511b1135c6d18125a07de661091f5e7403b7640060355d2d704ce081e019bc1862da849482d079ce5e2559b8976d3de7709566063aec1b908369c0b98a2b075b + checksum: 10c0/511b1135c6d18125a07de661091f5e7403b7640060355d2d704ce081e019bc1862da849482d079ce5e2559b8976d3de7709566063aec1b908369c0b98a2b075b languageName: node linkType: hard @@ -6107,7 +6107,7 @@ __metadata: has-symbols: "npm:^1.0.3" reflect.getprototypeof: "npm:^1.0.4" set-function-name: "npm:^2.0.1" - checksum: a32151326095e916f306990d909f6bbf23e3221999a18ba686419535dcd1749b10ded505e89334b77dc4c7a58a8508978f0eb16c2c8573e6d412eb7eb894ea79 + checksum: 10c0/a32151326095e916f306990d909f6bbf23e3221999a18ba686419535dcd1749b10ded505e89334b77dc4c7a58a8508978f0eb16c2c8573e6d412eb7eb894ea79 languageName: node linkType: hard @@ -6120,7 +6120,7 @@ __metadata: dependenciesMeta: "@pkgjs/parseargs": optional: true - checksum: 4e1ac5cff07302dd8452006cebff5b753b347faedf2b96ef82a13ebde8c9e6f3685630733e36ab5baaff34829dbc3b2b9454b1496b2970912151869929bcabd5 + checksum: 10c0/4e1ac5cff07302dd8452006cebff5b753b347faedf2b96ef82a13ebde8c9e6f3685630733e36ab5baaff34829dbc3b2b9454b1496b2970912151869929bcabd5 languageName: node linkType: hard @@ -6134,7 +6134,7 @@ __metadata: minimatch: "npm:^3.1.2" bin: jake: bin/cli.js - checksum: 89326d01a8bc110d02d973729a66394c79a34b34461116f5c530a2a2dbc30265683fe6737928f75df9178e9d369ff1442f5753fb983d525e740eefdadc56a103 + checksum: 10c0/89326d01a8bc110d02d973729a66394c79a34b34461116f5c530a2a2dbc30265683fe6737928f75df9178e9d369ff1442f5753fb983d525e740eefdadc56a103 languageName: node linkType: hard @@ -6145,14 +6145,14 @@ __metadata: "@types/node": "npm:*" merge-stream: "npm:^2.0.0" supports-color: "npm:^7.0.0" - checksum: 07e4dba650381604cda253ab6d5837fe0279c8d68c25884995b45bfe149a7a1e1b5a97f304b4518f257dac2a9ddc1808d57d650649c3ab855e9e60cf824d2970 + checksum: 10c0/07e4dba650381604cda253ab6d5837fe0279c8d68c25884995b45bfe149a7a1e1b5a97f304b4518f257dac2a9ddc1808d57d650649c3ab855e9e60cf824d2970 languageName: node linkType: hard "js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": version: 4.0.0 resolution: "js-tokens@npm:4.0.0" - checksum: e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed + checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed languageName: node linkType: hard @@ -6163,7 +6163,7 @@ __metadata: argparse: "npm:^2.0.1" bin: js-yaml: bin/js-yaml.js - checksum: 184a24b4eaacfce40ad9074c64fd42ac83cf74d8c8cd137718d456ced75051229e5061b8633c3366b8aada17945a7a356b337828c19da92b51ae62126575018f + checksum: 10c0/184a24b4eaacfce40ad9074c64fd42ac83cf74d8c8cd137718d456ced75051229e5061b8633c3366b8aada17945a7a356b337828c19da92b51ae62126575018f languageName: node linkType: hard @@ -6172,7 +6172,7 @@ __metadata: resolution: "jsesc@npm:2.5.2" bin: jsesc: bin/jsesc - checksum: dbf59312e0ebf2b4405ef413ec2b25abb5f8f4d9bc5fb8d9f90381622ebca5f2af6a6aa9a8578f65903f9e33990a6dc798edd0ce5586894bf0e9e31803a1de88 + checksum: 10c0/dbf59312e0ebf2b4405ef413ec2b25abb5f8f4d9bc5fb8d9f90381622ebca5f2af6a6aa9a8578f65903f9e33990a6dc798edd0ce5586894bf0e9e31803a1de88 languageName: node linkType: hard @@ -6181,42 +6181,42 @@ __metadata: resolution: "jsesc@npm:0.5.0" bin: jsesc: bin/jsesc - checksum: f93792440ae1d80f091b65f8ceddf8e55c4bb7f1a09dee5dcbdb0db5612c55c0f6045625aa6b7e8edb2e0a4feabd80ee48616dbe2d37055573a84db3d24f96d9 + checksum: 10c0/f93792440ae1d80f091b65f8ceddf8e55c4bb7f1a09dee5dcbdb0db5612c55c0f6045625aa6b7e8edb2e0a4feabd80ee48616dbe2d37055573a84db3d24f96d9 languageName: node linkType: hard "json-parse-even-better-errors@npm:^2.3.0": version: 2.3.1 resolution: "json-parse-even-better-errors@npm:2.3.1" - checksum: 140932564c8f0b88455432e0f33c4cb4086b8868e37524e07e723f4eaedb9425bdc2bafd71bd1d9765bd15fd1e2d126972bc83990f55c467168c228c24d665f3 + checksum: 10c0/140932564c8f0b88455432e0f33c4cb4086b8868e37524e07e723f4eaedb9425bdc2bafd71bd1d9765bd15fd1e2d126972bc83990f55c467168c228c24d665f3 languageName: node linkType: hard "json-schema-traverse@npm:^0.4.1": version: 0.4.1 resolution: "json-schema-traverse@npm:0.4.1" - checksum: 108fa90d4cc6f08243aedc6da16c408daf81793bf903e9fd5ab21983cda433d5d2da49e40711da016289465ec2e62e0324dcdfbc06275a607fe3233fde4942ce + checksum: 10c0/108fa90d4cc6f08243aedc6da16c408daf81793bf903e9fd5ab21983cda433d5d2da49e40711da016289465ec2e62e0324dcdfbc06275a607fe3233fde4942ce languageName: node linkType: hard "json-schema-traverse@npm:^1.0.0": version: 1.0.0 resolution: "json-schema-traverse@npm:1.0.0" - checksum: 71e30015d7f3d6dc1c316d6298047c8ef98a06d31ad064919976583eb61e1018a60a0067338f0f79cabc00d84af3fcc489bd48ce8a46ea165d9541ba17fb30c6 + checksum: 10c0/71e30015d7f3d6dc1c316d6298047c8ef98a06d31ad064919976583eb61e1018a60a0067338f0f79cabc00d84af3fcc489bd48ce8a46ea165d9541ba17fb30c6 languageName: node linkType: hard "json-schema@npm:^0.4.0": version: 0.4.0 resolution: "json-schema@npm:0.4.0" - checksum: d4a637ec1d83544857c1c163232f3da46912e971d5bf054ba44fdb88f07d8d359a462b4aec46f2745efbc57053365608d88bc1d7b1729f7b4fc3369765639ed3 + checksum: 10c0/d4a637ec1d83544857c1c163232f3da46912e971d5bf054ba44fdb88f07d8d359a462b4aec46f2745efbc57053365608d88bc1d7b1729f7b4fc3369765639ed3 languageName: node linkType: hard "json-stable-stringify-without-jsonify@npm:^1.0.1": version: 1.0.1 resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" - checksum: cb168b61fd4de83e58d09aaa6425ef71001bae30d260e2c57e7d09a5fd82223e2f22a042dedaab8db23b7d9ae46854b08bb1f91675a8be11c5cffebef5fb66a5 + checksum: 10c0/cb168b61fd4de83e58d09aaa6425ef71001bae30d260e2c57e7d09a5fd82223e2f22a042dedaab8db23b7d9ae46854b08bb1f91675a8be11c5cffebef5fb66a5 languageName: node linkType: hard @@ -6227,7 +6227,7 @@ __metadata: minimist: "npm:^1.2.0" bin: json5: lib/cli.js - checksum: 9ee316bf21f000b00752e6c2a3b79ecf5324515a5c60ee88983a1910a45426b643a4f3461657586e8aeca87aaf96f0a519b0516d2ae527a6c3e7eed80f68717f + checksum: 10c0/9ee316bf21f000b00752e6c2a3b79ecf5324515a5c60ee88983a1910a45426b643a4f3461657586e8aeca87aaf96f0a519b0516d2ae527a6c3e7eed80f68717f languageName: node linkType: hard @@ -6236,7 +6236,7 @@ __metadata: resolution: "json5@npm:2.2.3" bin: json5: lib/cli.js - checksum: 5a04eed94810fa55c5ea138b2f7a5c12b97c3750bc63d11e511dcecbfef758003861522a070c2272764ee0f4e3e323862f386945aeb5b85b87ee43f084ba586c + checksum: 10c0/5a04eed94810fa55c5ea138b2f7a5c12b97c3750bc63d11e511dcecbfef758003861522a070c2272764ee0f4e3e323862f386945aeb5b85b87ee43f084ba586c languageName: node linkType: hard @@ -6249,14 +6249,14 @@ __metadata: dependenciesMeta: graceful-fs: optional: true - checksum: 4f95b5e8a5622b1e9e8f33c96b7ef3158122f595998114d1e7f03985649ea99cb3cd99ce1ed1831ae94c8c8543ab45ebd044207612f31a56fd08462140e46865 + checksum: 10c0/4f95b5e8a5622b1e9e8f33c96b7ef3158122f595998114d1e7f03985649ea99cb3cd99ce1ed1831ae94c8c8543ab45ebd044207612f31a56fd08462140e46865 languageName: node linkType: hard "jsonpointer@npm:^5.0.0": version: 5.0.1 resolution: "jsonpointer@npm:5.0.1" - checksum: 89929e58b400fcb96928c0504fcf4fc3f919d81e9543ceb055df125538470ee25290bb4984251e172e6ef8fcc55761eb998c118da763a82051ad89d4cb073fe7 + checksum: 10c0/89929e58b400fcb96928c0504fcf4fc3f919d81e9543ceb055df125538470ee25290bb4984251e172e6ef8fcc55761eb998c118da763a82051ad89d4cb073fe7 languageName: node linkType: hard @@ -6268,14 +6268,14 @@ __metadata: array.prototype.flat: "npm:^1.3.1" object.assign: "npm:^4.1.4" object.values: "npm:^1.1.6" - checksum: a32679e9cb55469cb6d8bbc863f7d631b2c98b7fc7bf172629261751a6e7bc8da6ae374ddb74d5fbd8b06cf0eb4572287b259813d92b36e384024ed35e4c13e1 + checksum: 10c0/a32679e9cb55469cb6d8bbc863f7d631b2c98b7fc7bf172629261751a6e7bc8da6ae374ddb74d5fbd8b06cf0eb4572287b259813d92b36e384024ed35e4c13e1 languageName: node linkType: hard "language-subtag-registry@npm:^0.3.20": version: 0.3.22 resolution: "language-subtag-registry@npm:0.3.22" - checksum: d1e09971260a7cd3b9fdeb190d33af0b6e99c8697013537d9aaa15f7856d9d83aee128ba8078e219df0a7cf4b8dd18d1a0c188f6543b500d92a2689d2d114b70 + checksum: 10c0/d1e09971260a7cd3b9fdeb190d33af0b6e99c8697013537d9aaa15f7856d9d83aee128ba8078e219df0a7cf4b8dd18d1a0c188f6543b500d92a2689d2d114b70 languageName: node linkType: hard @@ -6284,14 +6284,14 @@ __metadata: resolution: "language-tags@npm:1.0.9" dependencies: language-subtag-registry: "npm:^0.3.20" - checksum: 9ab911213c4bd8bd583c850201c17794e52cb0660d1ab6e32558aadc8324abebf6844e46f92b80a5d600d0fbba7eface2c207bfaf270a1c7fd539e4c3a880bff + checksum: 10c0/9ab911213c4bd8bd583c850201c17794e52cb0660d1ab6e32558aadc8324abebf6844e46f92b80a5d600d0fbba7eface2c207bfaf270a1c7fd539e4c3a880bff languageName: node linkType: hard "leven@npm:^3.1.0": version: 3.1.0 resolution: "leven@npm:3.1.0" - checksum: cd778ba3fbab0f4d0500b7e87d1f6e1f041507c56fdcd47e8256a3012c98aaee371d4c15e0a76e0386107af2d42e2b7466160a2d80688aaa03e66e49949f42df + checksum: 10c0/cd778ba3fbab0f4d0500b7e87d1f6e1f041507c56fdcd47e8256a3012c98aaee371d4c15e0a76e0386107af2d42e2b7466160a2d80688aaa03e66e49949f42df languageName: node linkType: hard @@ -6301,14 +6301,14 @@ __metadata: dependencies: prelude-ls: "npm:^1.2.1" type-check: "npm:~0.4.0" - checksum: effb03cad7c89dfa5bd4f6989364bfc79994c2042ec5966cb9b95990e2edee5cd8969ddf42616a0373ac49fac1403437deaf6e9050fbbaa3546093a59b9ac94e + checksum: 10c0/effb03cad7c89dfa5bd4f6989364bfc79994c2042ec5966cb9b95990e2edee5cd8969ddf42616a0373ac49fac1403437deaf6e9050fbbaa3546093a59b9ac94e languageName: node linkType: hard "lines-and-columns@npm:^1.1.6": version: 1.2.4 resolution: "lines-and-columns@npm:1.2.4" - checksum: 3da6ee62d4cd9f03f5dc90b4df2540fb85b352081bee77fe4bbcd12c9000ead7f35e0a38b8d09a9bb99b13223446dd8689ff3c4959807620726d788701a83d2d + checksum: 10c0/3da6ee62d4cd9f03f5dc90b4df2540fb85b352081bee77fe4bbcd12c9000ead7f35e0a38b8d09a9bb99b13223446dd8689ff3c4959807620726d788701a83d2d languageName: node linkType: hard @@ -6317,56 +6317,56 @@ __metadata: resolution: "locate-path@npm:6.0.0" dependencies: p-locate: "npm:^5.0.0" - checksum: d3972ab70dfe58ce620e64265f90162d247e87159b6126b01314dd67be43d50e96a50b517bce2d9452a79409c7614054c277b5232377de50416564a77ac7aad3 + checksum: 10c0/d3972ab70dfe58ce620e64265f90162d247e87159b6126b01314dd67be43d50e96a50b517bce2d9452a79409c7614054c277b5232377de50416564a77ac7aad3 languageName: node linkType: hard "lodash-es@npm:^4.17.21": version: 4.17.21 resolution: "lodash-es@npm:4.17.21" - checksum: fb407355f7e6cd523a9383e76e6b455321f0f153a6c9625e21a8827d10c54c2a2341bd2ae8d034358b60e07325e1330c14c224ff582d04612a46a4f0479ff2f2 + checksum: 10c0/fb407355f7e6cd523a9383e76e6b455321f0f153a6c9625e21a8827d10c54c2a2341bd2ae8d034358b60e07325e1330c14c224ff582d04612a46a4f0479ff2f2 languageName: node linkType: hard "lodash.debounce@npm:^4.0.8": version: 4.0.8 resolution: "lodash.debounce@npm:4.0.8" - checksum: 762998a63e095412b6099b8290903e0a8ddcb353ac6e2e0f2d7e7d03abd4275fe3c689d88960eb90b0dde4f177554d51a690f22a343932ecbc50a5d111849987 + checksum: 10c0/762998a63e095412b6099b8290903e0a8ddcb353ac6e2e0f2d7e7d03abd4275fe3c689d88960eb90b0dde4f177554d51a690f22a343932ecbc50a5d111849987 languageName: node linkType: hard "lodash.merge@npm:^4.6.2": version: 4.6.2 resolution: "lodash.merge@npm:4.6.2" - checksum: 402fa16a1edd7538de5b5903a90228aa48eb5533986ba7fa26606a49db2572bf414ff73a2c9f5d5fd36b31c46a5d5c7e1527749c07cbcf965ccff5fbdf32c506 + checksum: 10c0/402fa16a1edd7538de5b5903a90228aa48eb5533986ba7fa26606a49db2572bf414ff73a2c9f5d5fd36b31c46a5d5c7e1527749c07cbcf965ccff5fbdf32c506 languageName: node linkType: hard "lodash.sortby@npm:^4.7.0": version: 4.7.0 resolution: "lodash.sortby@npm:4.7.0" - checksum: fc48fb54ff7669f33bb32997cab9460757ee99fafaf72400b261c3e10fde21538e47d8cfcbe6a25a31bcb5b7b727c27d52626386fc2de24eb059a6d64a89cdf5 + checksum: 10c0/fc48fb54ff7669f33bb32997cab9460757ee99fafaf72400b261c3e10fde21538e47d8cfcbe6a25a31bcb5b7b727c27d52626386fc2de24eb059a6d64a89cdf5 languageName: node linkType: hard "lodash@npm:^4.17.20, lodash@npm:^4.17.21": version: 4.17.21 resolution: "lodash@npm:4.17.21" - checksum: d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c + checksum: 10c0/d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c languageName: node linkType: hard "loglevel-plugin-prefix@npm:^0.8.4": version: 0.8.4 resolution: "loglevel-plugin-prefix@npm:0.8.4" - checksum: 357524eec4c165ff823b5bbf72e8373ff529e5cb95c1f4b20749847bd5b5b16ab328d6d33d1a9019f1a2dc52e28fca5d595e52f2ee20e24986182a6f9552a9ec + checksum: 10c0/357524eec4c165ff823b5bbf72e8373ff529e5cb95c1f4b20749847bd5b5b16ab328d6d33d1a9019f1a2dc52e28fca5d595e52f2ee20e24986182a6f9552a9ec languageName: node linkType: hard "loglevel@npm:^1.9.1": version: 1.9.1 resolution: "loglevel@npm:1.9.1" - checksum: 152f0501cea367cf998c844a38b19f0b5af555756ad7d8650214a1f8c6a5b045e31b8cf5dae27d28339a061624ce3f618aadb333aed386cac041d6ddc5101a39 + checksum: 10c0/152f0501cea367cf998c844a38b19f0b5af555756ad7d8650214a1f8c6a5b045e31b8cf5dae27d28339a061624ce3f618aadb333aed386cac041d6ddc5101a39 languageName: node linkType: hard @@ -6377,7 +6377,7 @@ __metadata: js-tokens: "npm:^3.0.0 || ^4.0.0" bin: loose-envify: cli.js - checksum: 655d110220983c1a4b9c0c679a2e8016d4b67f6e9c7b5435ff5979ecdb20d0813f4dec0a08674fcbdd4846a3f07edbb50a36811fd37930b94aaa0d9daceb017e + checksum: 10c0/655d110220983c1a4b9c0c679a2e8016d4b67f6e9c7b5435ff5979ecdb20d0813f4dec0a08674fcbdd4846a3f07edbb50a36811fd37930b94aaa0d9daceb017e languageName: node linkType: hard @@ -6386,7 +6386,7 @@ __metadata: resolution: "lower-case@npm:2.0.2" dependencies: tslib: "npm:^2.0.3" - checksum: 3d925e090315cf7dc1caa358e0477e186ffa23947740e4314a7429b6e62d72742e0bbe7536a5ae56d19d7618ce998aba05caca53c2902bd5742fdca5fc57fd7b + checksum: 10c0/3d925e090315cf7dc1caa358e0477e186ffa23947740e4314a7429b6e62d72742e0bbe7536a5ae56d19d7618ce998aba05caca53c2902bd5742fdca5fc57fd7b languageName: node linkType: hard @@ -6395,7 +6395,7 @@ __metadata: resolution: "lru-cache@npm:5.1.1" dependencies: yallist: "npm:^3.0.2" - checksum: 89b2ef2ef45f543011e38737b8a8622a2f8998cddf0e5437174ef8f1f70a8b9d14a918ab3e232cb3ba343b7abddffa667f0b59075b2b80e6b4d63c3de6127482 + checksum: 10c0/89b2ef2ef45f543011e38737b8a8622a2f8998cddf0e5437174ef8f1f70a8b9d14a918ab3e232cb3ba343b7abddffa667f0b59075b2b80e6b4d63c3de6127482 languageName: node linkType: hard @@ -6404,21 +6404,21 @@ __metadata: resolution: "lru-cache@npm:6.0.0" dependencies: yallist: "npm:^4.0.0" - checksum: cb53e582785c48187d7a188d3379c181b5ca2a9c78d2bce3e7dee36f32761d1c42983da3fe12b55cb74e1779fa94cdc2e5367c028a9b35317184ede0c07a30a9 + checksum: 10c0/cb53e582785c48187d7a188d3379c181b5ca2a9c78d2bce3e7dee36f32761d1c42983da3fe12b55cb74e1779fa94cdc2e5367c028a9b35317184ede0c07a30a9 languageName: node linkType: hard "lru-cache@npm:^7.7.1": version: 7.18.3 resolution: "lru-cache@npm:7.18.3" - checksum: b3a452b491433db885beed95041eb104c157ef7794b9c9b4d647be503be91769d11206bb573849a16b4cc0d03cbd15ffd22df7960997788b74c1d399ac7a4fed + checksum: 10c0/b3a452b491433db885beed95041eb104c157ef7794b9c9b4d647be503be91769d11206bb573849a16b4cc0d03cbd15ffd22df7960997788b74c1d399ac7a4fed languageName: node linkType: hard "lru-cache@npm:^9.1.1 || ^10.0.0": version: 10.0.1 resolution: "lru-cache@npm:10.0.1" - checksum: 982dabfb227b9a2daf56d712ae0e72e01115a28c0a2068cd71277bca04568f3417bbf741c6c7941abc5c620fd8059e34f15607f90ebccbfa0a17533322d27a8e + checksum: 10c0/982dabfb227b9a2daf56d712ae0e72e01115a28c0a2068cd71277bca04568f3417bbf741c6c7941abc5c620fd8059e34f15607f90ebccbfa0a17533322d27a8e languageName: node linkType: hard @@ -6427,7 +6427,7 @@ __metadata: resolution: "magic-string@npm:0.25.9" dependencies: sourcemap-codec: "npm:^1.4.8" - checksum: 37f5e01a7e8b19a072091f0b45ff127cda676232d373ce2c551a162dd4053c575ec048b9cbb4587a1f03adb6c5d0fd0dd49e8ab070cd2c83a4992b2182d9cb56 + checksum: 10c0/37f5e01a7e8b19a072091f0b45ff127cda676232d373ce2c551a162dd4053c575ec048b9cbb4587a1f03adb6c5d0fd0dd49e8ab070cd2c83a4992b2182d9cb56 languageName: node linkType: hard @@ -6450,21 +6450,21 @@ __metadata: promise-retry: "npm:^2.0.1" socks-proxy-agent: "npm:^7.0.0" ssri: "npm:^10.0.0" - checksum: c161bde51dbc03382f9fac091734526a64dd6878205db6c338f70d2133df797b5b5166bff3091cf7d4785869d4b21e99a58139c1790c2fb1b5eec00f528f5f0b + checksum: 10c0/c161bde51dbc03382f9fac091734526a64dd6878205db6c338f70d2133df797b5b5166bff3091cf7d4785869d4b21e99a58139c1790c2fb1b5eec00f528f5f0b languageName: node linkType: hard "merge-stream@npm:^2.0.0": version: 2.0.0 resolution: "merge-stream@npm:2.0.0" - checksum: 867fdbb30a6d58b011449b8885601ec1690c3e41c759ecd5a9d609094f7aed0096c37823ff4a7190ef0b8f22cc86beb7049196ff68c016e3b3c671d0dac91ce5 + checksum: 10c0/867fdbb30a6d58b011449b8885601ec1690c3e41c759ecd5a9d609094f7aed0096c37823ff4a7190ef0b8f22cc86beb7049196ff68c016e3b3c671d0dac91ce5 languageName: node linkType: hard "merge2@npm:^1.3.0, merge2@npm:^1.4.1": version: 1.4.1 resolution: "merge2@npm:1.4.1" - checksum: 254a8a4605b58f450308fc474c82ac9a094848081bf4c06778200207820e5193726dc563a0d2c16468810516a5c97d9d3ea0ca6585d23c58ccfff2403e8dbbeb + checksum: 10c0/254a8a4605b58f450308fc474c82ac9a094848081bf4c06778200207820e5193726dc563a0d2c16468810516a5c97d9d3ea0ca6585d23c58ccfff2403e8dbbeb languageName: node linkType: hard @@ -6474,7 +6474,7 @@ __metadata: dependencies: braces: "npm:^3.0.2" picomatch: "npm:^2.3.1" - checksum: 3d6505b20f9fa804af5d8c596cb1c5e475b9b0cd05f652c5b56141cf941bd72adaeb7a436fda344235cef93a7f29b7472efc779fcdb83b478eab0867b95cdeff + checksum: 10c0/3d6505b20f9fa804af5d8c596cb1c5e475b9b0cd05f652c5b56141cf941bd72adaeb7a436fda344235cef93a7f29b7472efc779fcdb83b478eab0867b95cdeff languageName: node linkType: hard @@ -6483,7 +6483,7 @@ __metadata: resolution: "minimatch@npm:9.0.3" dependencies: brace-expansion: "npm:^2.0.1" - checksum: 85f407dcd38ac3e180f425e86553911d101455ca3ad5544d6a7cec16286657e4f8a9aa6695803025c55e31e35a91a2252b5dc8e7d527211278b8b65b4dbd5eac + checksum: 10c0/85f407dcd38ac3e180f425e86553911d101455ca3ad5544d6a7cec16286657e4f8a9aa6695803025c55e31e35a91a2252b5dc8e7d527211278b8b65b4dbd5eac languageName: node linkType: hard @@ -6492,7 +6492,7 @@ __metadata: resolution: "minimatch@npm:3.1.2" dependencies: brace-expansion: "npm:^1.1.7" - checksum: 0262810a8fc2e72cca45d6fd86bd349eee435eb95ac6aa45c9ea2180e7ee875ef44c32b55b5973ceabe95ea12682f6e3725cbb63d7a2d1da3ae1163c8b210311 + checksum: 10c0/0262810a8fc2e72cca45d6fd86bd349eee435eb95ac6aa45c9ea2180e7ee875ef44c32b55b5973ceabe95ea12682f6e3725cbb63d7a2d1da3ae1163c8b210311 languageName: node linkType: hard @@ -6501,14 +6501,14 @@ __metadata: resolution: "minimatch@npm:5.1.6" dependencies: brace-expansion: "npm:^2.0.1" - checksum: 3defdfd230914f22a8da203747c42ee3c405c39d4d37ffda284dac5e45b7e1f6c49aa8be606509002898e73091ff2a3bbfc59c2c6c71d4660609f63aa92f98e3 + checksum: 10c0/3defdfd230914f22a8da203747c42ee3c405c39d4d37ffda284dac5e45b7e1f6c49aa8be606509002898e73091ff2a3bbfc59c2c6c71d4660609f63aa92f98e3 languageName: node linkType: hard "minimist@npm:^1.2.0, minimist@npm:^1.2.6": version: 1.2.8 resolution: "minimist@npm:1.2.8" - checksum: 19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 + checksum: 10c0/19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 languageName: node linkType: hard @@ -6517,7 +6517,7 @@ __metadata: resolution: "minipass-collect@npm:1.0.2" dependencies: minipass: "npm:^3.0.0" - checksum: 8f82bd1f3095b24f53a991b04b67f4c710c894e518b813f0864a31de5570441a509be1ca17e0bb92b047591a8fdbeb886f502764fefb00d2f144f4011791e898 + checksum: 10c0/8f82bd1f3095b24f53a991b04b67f4c710c894e518b813f0864a31de5570441a509be1ca17e0bb92b047591a8fdbeb886f502764fefb00d2f144f4011791e898 languageName: node linkType: hard @@ -6532,7 +6532,7 @@ __metadata: dependenciesMeta: encoding: optional: true - checksum: 1b63c1f3313e88eeac4689f1b71c9f086598db9a189400e3ee960c32ed89e06737fa23976c9305c2d57464fb3fcdc12749d3378805c9d6176f5569b0d0ee8a75 + checksum: 10c0/1b63c1f3313e88eeac4689f1b71c9f086598db9a189400e3ee960c32ed89e06737fa23976c9305c2d57464fb3fcdc12749d3378805c9d6176f5569b0d0ee8a75 languageName: node linkType: hard @@ -6541,7 +6541,7 @@ __metadata: resolution: "minipass-flush@npm:1.0.5" dependencies: minipass: "npm:^3.0.0" - checksum: 2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd + checksum: 10c0/2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd languageName: node linkType: hard @@ -6550,7 +6550,7 @@ __metadata: resolution: "minipass-pipeline@npm:1.2.4" dependencies: minipass: "npm:^3.0.0" - checksum: cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 + checksum: 10c0/cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 languageName: node linkType: hard @@ -6559,7 +6559,7 @@ __metadata: resolution: "minipass-sized@npm:1.0.3" dependencies: minipass: "npm:^3.0.0" - checksum: 298f124753efdc745cfe0f2bdfdd81ba25b9f4e753ca4a2066eb17c821f25d48acea607dfc997633ee5bf7b6dfffb4eee4f2051eb168663f0b99fad2fa4829cb + checksum: 10c0/298f124753efdc745cfe0f2bdfdd81ba25b9f4e753ca4a2066eb17c821f25d48acea607dfc997633ee5bf7b6dfffb4eee4f2051eb168663f0b99fad2fa4829cb languageName: node linkType: hard @@ -6568,21 +6568,21 @@ __metadata: resolution: "minipass@npm:3.3.6" dependencies: yallist: "npm:^4.0.0" - checksum: a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c + checksum: 10c0/a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c languageName: node linkType: hard "minipass@npm:^5.0.0": version: 5.0.0 resolution: "minipass@npm:5.0.0" - checksum: a91d8043f691796a8ac88df039da19933ef0f633e3d7f0d35dcd5373af49131cf2399bfc355f41515dc495e3990369c3858cd319e5c2722b4753c90bf3152462 + checksum: 10c0/a91d8043f691796a8ac88df039da19933ef0f633e3d7f0d35dcd5373af49131cf2399bfc355f41515dc495e3990369c3858cd319e5c2722b4753c90bf3152462 languageName: node linkType: hard "minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.3": version: 7.0.3 resolution: "minipass@npm:7.0.3" - checksum: c85426bce6310368218aad1f20b8f242180b6c2058209c78840959d6fff8a4738076a3224c3a6b651080f95684d559be1bdb084939bc40011c653ec4552cf06e + checksum: 10c0/c85426bce6310368218aad1f20b8f242180b6c2058209c78840959d6fff8a4738076a3224c3a6b651080f95684d559be1bdb084939bc40011c653ec4552cf06e languageName: node linkType: hard @@ -6592,7 +6592,7 @@ __metadata: dependencies: minipass: "npm:^3.0.0" yallist: "npm:^4.0.0" - checksum: 64fae024e1a7d0346a1102bb670085b17b7f95bf6cfdf5b128772ec8faf9ea211464ea4add406a3a6384a7d87a0cd1a96263692134323477b4fb43659a6cab78 + checksum: 10c0/64fae024e1a7d0346a1102bb670085b17b7f95bf6cfdf5b128772ec8faf9ea211464ea4add406a3a6384a7d87a0cd1a96263692134323477b4fb43659a6cab78 languageName: node linkType: hard @@ -6601,7 +6601,7 @@ __metadata: resolution: "mkdirp@npm:1.0.4" bin: mkdirp: bin/cmd.js - checksum: 46ea0f3ffa8bc6a5bc0c7081ffc3907777f0ed6516888d40a518c5111f8366d97d2678911ad1a6882bf592fa9de6c784fea32e1687bb94e1f4944170af48a5cf + checksum: 10c0/46ea0f3ffa8bc6a5bc0c7081ffc3907777f0ed6516888d40a518c5111f8366d97d2678911ad1a6882bf592fa9de6c784fea32e1687bb94e1f4944170af48a5cf languageName: node linkType: hard @@ -6618,28 +6618,28 @@ __metadata: optional: true react-native: optional: true - checksum: 6c8f69646ee9fb50155062c8a43e6d222a7b9dbd28f139648dcbb2a097d9ea660d643dd94529355e7f6926561e37c0206ca9e477f01784aedafbed607daceda6 + checksum: 10c0/6c8f69646ee9fb50155062c8a43e6d222a7b9dbd28f139648dcbb2a097d9ea660d643dd94529355e7f6926561e37c0206ca9e477f01784aedafbed607daceda6 languageName: node linkType: hard "mobx@npm:^6.12.0": version: 6.12.0 resolution: "mobx@npm:6.12.0" - checksum: 18226d1120b0b21faf142c812f5e9dc670b03a3ad3fb868b9aeb9dffb72b7f0866591e50c3d07b79b01bdd4ca264b9843fb996a980b8bcb59f5a53597a8a2b90 + checksum: 10c0/18226d1120b0b21faf142c812f5e9dc670b03a3ad3fb868b9aeb9dffb72b7f0866591e50c3d07b79b01bdd4ca264b9843fb996a980b8bcb59f5a53597a8a2b90 languageName: node linkType: hard "ms@npm:2.1.2": version: 2.1.2 resolution: "ms@npm:2.1.2" - checksum: a437714e2f90dbf881b5191d35a6db792efbca5badf112f87b9e1c712aace4b4b9b742dd6537f3edf90fd6f684de897cec230abde57e87883766712ddda297cc + checksum: 10c0/a437714e2f90dbf881b5191d35a6db792efbca5badf112f87b9e1c712aace4b4b9b742dd6537f3edf90fd6f684de897cec230abde57e87883766712ddda297cc languageName: node linkType: hard "ms@npm:^2.0.0, ms@npm:^2.1.1, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" - checksum: d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 + checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 languageName: node linkType: hard @@ -6648,30 +6648,30 @@ __metadata: resolution: "nanoid@npm:3.3.7" bin: nanoid: bin/nanoid.cjs - checksum: e3fb661aa083454f40500473bb69eedb85dc160e763150b9a2c567c7e9ff560ce028a9f833123b618a6ea742e311138b591910e795614a629029e86e180660f3 + checksum: 10c0/e3fb661aa083454f40500473bb69eedb85dc160e763150b9a2c567c7e9ff560ce028a9f833123b618a6ea742e311138b591910e795614a629029e86e180660f3 languageName: node linkType: hard -"nanoid@npm:^5.0.4": - version: 5.0.4 - resolution: "nanoid@npm:5.0.4" +"nanoid@npm:^5.0.5": + version: 5.0.5 + resolution: "nanoid@npm:5.0.5" bin: nanoid: bin/nanoid.js - checksum: 28c22d3ff96ea9e6abc059813b8483890c1f52de0f185d8347b0ea205c5966530205c374f1f77492bb53dc5d649de5d36d6eade16645055eb9220dc62080c1b1 + checksum: 10c0/b1f881b08d6e918bf70d37dece3e59fff8d99cc29b80a956e29d1852e09d3a7bf35a4884f4b9d5ff26963018937d0c91bef83842c15758a668d88c94704d2da7 languageName: node linkType: hard "natural-compare@npm:^1.4.0": version: 1.4.0 resolution: "natural-compare@npm:1.4.0" - checksum: f5f9a7974bfb28a91afafa254b197f0f22c684d4a1731763dda960d2c8e375b36c7d690e0d9dc8fba774c537af14a7e979129bca23d88d052fbeb9466955e447 + checksum: 10c0/f5f9a7974bfb28a91afafa254b197f0f22c684d4a1731763dda960d2c8e375b36c7d690e0d9dc8fba774c537af14a7e979129bca23d88d052fbeb9466955e447 languageName: node linkType: hard "negotiator@npm:^0.6.3": version: 0.6.3 resolution: "negotiator@npm:0.6.3" - checksum: 3ec9fd413e7bf071c937ae60d572bc67155262068ed522cf4b3be5edbe6ddf67d095ec03a3a14ebf8fc8e95f8e1d61be4869db0dbb0de696f6b837358bd43fc2 + checksum: 10c0/3ec9fd413e7bf071c937ae60d572bc67155262068ed522cf4b3be5edbe6ddf67d095ec03a3a14ebf8fc8e95f8e1d61be4869db0dbb0de696f6b837358bd43fc2 languageName: node linkType: hard @@ -6681,7 +6681,7 @@ __metadata: dependencies: lower-case: "npm:^2.0.2" tslib: "npm:^2.0.3" - checksum: 8ef545f0b3f8677c848f86ecbd42ca0ff3cd9dd71c158527b344c69ba14710d816d8489c746b6ca225e7b615108938a0bda0a54706f8c255933703ac1cf8e703 + checksum: 10c0/8ef545f0b3f8677c848f86ecbd42ca0ff3cd9dd71c158527b344c69ba14710d816d8489c746b6ca225e7b615108938a0bda0a54706f8c255933703ac1cf8e703 languageName: node linkType: hard @@ -6695,7 +6695,7 @@ __metadata: peerDependenciesMeta: encoding: optional: true - checksum: b55786b6028208e6fbe594ccccc213cab67a72899c9234eb59dba51062a299ea853210fcf526998eaa2867b0963ad72338824450905679ff0fa304b8c5093ae8 + checksum: 10c0/b55786b6028208e6fbe594ccccc213cab67a72899c9234eb59dba51062a299ea853210fcf526998eaa2867b0963ad72338824450905679ff0fa304b8c5093ae8 languageName: node linkType: hard @@ -6716,14 +6716,14 @@ __metadata: which: "npm:^2.0.2" bin: node-gyp: bin/node-gyp.js - checksum: e8dfbe2b02f23d056f69e01c409381963e92c71cafba6c9cfbf63b038f65ca19ab8183bb6891d080e59c4eb2cc425fc736f42e90afc0f0030ecd97bfc64fb7ad + checksum: 10c0/e8dfbe2b02f23d056f69e01c409381963e92c71cafba6c9cfbf63b038f65ca19ab8183bb6891d080e59c4eb2cc425fc736f42e90afc0f0030ecd97bfc64fb7ad languageName: node linkType: hard "node-releases@npm:^2.0.13": version: 2.0.13 resolution: "node-releases@npm:2.0.13" - checksum: 2fb44bf70fc949d27f3a48a7fd1a9d1d603ddad4ccd091f26b3fb8b1da976605d919330d7388ccd55ca2ade0dc8b2e12841ba19ef249c8bb29bf82532d401af7 + checksum: 10c0/2fb44bf70fc949d27f3a48a7fd1a9d1d603ddad4ccd091f26b3fb8b1da976605d919330d7388ccd55ca2ade0dc8b2e12841ba19ef249c8bb29bf82532d401af7 languageName: node linkType: hard @@ -6734,14 +6734,14 @@ __metadata: abbrev: "npm:^1.0.0" bin: nopt: bin/nopt.js - checksum: 837b52c330df16fcaad816b1f54fec6b2854ab1aa771d935c1603fbcf9b023bb073f1466b1b67f48ea4dce127ae675b85b9d9355700e9b109de39db490919786 + checksum: 10c0/837b52c330df16fcaad816b1f54fec6b2854ab1aa771d935c1603fbcf9b023bb073f1466b1b67f48ea4dce127ae675b85b9d9355700e9b109de39db490919786 languageName: node linkType: hard "normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": version: 3.0.0 resolution: "normalize-path@npm:3.0.0" - checksum: e008c8142bcc335b5e38cf0d63cfd39d6cf2d97480af9abdbe9a439221fd4d749763bab492a8ee708ce7a194bb00c9da6d0a115018672310850489137b3da046 + checksum: 10c0/e008c8142bcc335b5e38cf0d63cfd39d6cf2d97480af9abdbe9a439221fd4d749763bab492a8ee708ce7a194bb00c9da6d0a115018672310850489137b3da046 languageName: node linkType: hard @@ -6754,7 +6754,7 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: dd5bd492dbaf8d07a1f45a53ae195c5d481bc7136d73a756eb076534d315216a3cd2f4628263be55ad21d8bfed6ec546e5063584ffcc2798fb2aac56e5ccf0cf + checksum: 10c0/dd5bd492dbaf8d07a1f45a53ae195c5d481bc7136d73a756eb076534d315216a3cd2f4628263be55ad21d8bfed6ec546e5063584ffcc2798fb2aac56e5ccf0cf languageName: node linkType: hard @@ -6766,21 +6766,21 @@ __metadata: console-control-strings: "npm:^1.1.0" gauge: "npm:^4.0.3" set-blocking: "npm:^2.0.0" - checksum: 0cacedfbc2f6139c746d9cd4a85f62718435ad0ca4a2d6459cd331dd33ae58206e91a0742c1558634efcde3f33f8e8e7fd3adf1bfe7978310cf00bd55cccf890 + checksum: 10c0/0cacedfbc2f6139c746d9cd4a85f62718435ad0ca4a2d6459cd331dd33ae58206e91a0742c1558634efcde3f33f8e8e7fd3adf1bfe7978310cf00bd55cccf890 languageName: node linkType: hard "object-assign@npm:^4.1.1": version: 4.1.1 resolution: "object-assign@npm:4.1.1" - checksum: 1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414 + checksum: 10c0/1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414 languageName: node linkType: hard "object-inspect@npm:^1.13.1, object-inspect@npm:^1.9.0": version: 1.13.1 resolution: "object-inspect@npm:1.13.1" - checksum: fad603f408e345c82e946abdf4bfd774260a5ed3e5997a0b057c44153ac32c7271ff19e3a5ae39c858da683ba045ccac2f65245c12763ce4e8594f818f4a648d + checksum: 10c0/fad603f408e345c82e946abdf4bfd774260a5ed3e5997a0b057c44153ac32c7271ff19e3a5ae39c858da683ba045ccac2f65245c12763ce4e8594f818f4a648d languageName: node linkType: hard @@ -6790,14 +6790,14 @@ __metadata: dependencies: call-bind: "npm:^1.0.2" define-properties: "npm:^1.1.3" - checksum: 8c263fb03fc28f1ffb54b44b9147235c5e233dc1ca23768e7d2569740b5d860154d7cc29a30220fe28ed6d8008e2422aefdebfe987c103e1c5d190cf02d9d886 + checksum: 10c0/8c263fb03fc28f1ffb54b44b9147235c5e233dc1ca23768e7d2569740b5d860154d7cc29a30220fe28ed6d8008e2422aefdebfe987c103e1c5d190cf02d9d886 languageName: node linkType: hard "object-keys@npm:^1.1.1": version: 1.1.1 resolution: "object-keys@npm:1.1.1" - checksum: b11f7ccdbc6d406d1f186cdadb9d54738e347b2692a14439ca5ac70c225fa6db46db809711b78589866d47b25fc3e8dee0b4c722ac751e11180f9380e3d8601d + checksum: 10c0/b11f7ccdbc6d406d1f186cdadb9d54738e347b2692a14439ca5ac70c225fa6db46db809711b78589866d47b25fc3e8dee0b4c722ac751e11180f9380e3d8601d languageName: node linkType: hard @@ -6809,7 +6809,7 @@ __metadata: define-properties: "npm:^1.1.4" has-symbols: "npm:^1.0.3" object-keys: "npm:^1.1.1" - checksum: 2f286118c023e557757620e647b02e7c88d3d417e0c568fca0820de8ec9cca68928304854d5b03e99763eddad6e78a6716e2930f7e6372e4b9b843f3fd3056f3 + checksum: 10c0/2f286118c023e557757620e647b02e7c88d3d417e0c568fca0820de8ec9cca68928304854d5b03e99763eddad6e78a6716e2930f7e6372e4b9b843f3fd3056f3 languageName: node linkType: hard @@ -6820,7 +6820,7 @@ __metadata: call-bind: "npm:^1.0.2" define-properties: "npm:^1.2.0" es-abstract: "npm:^1.22.1" - checksum: 3ad1899cc7bf14546bf28f4a9b363ae8690b90948fcfbcac4c808395435d760f26193d9cae95337ce0e3c1e5c1f4fa45f7b46b31b68d389e9e117fce38775d86 + checksum: 10c0/3ad1899cc7bf14546bf28f4a9b363ae8690b90948fcfbcac4c808395435d760f26193d9cae95337ce0e3c1e5c1f4fa45f7b46b31b68d389e9e117fce38775d86 languageName: node linkType: hard @@ -6831,7 +6831,7 @@ __metadata: call-bind: "npm:^1.0.2" define-properties: "npm:^1.2.0" es-abstract: "npm:^1.22.1" - checksum: 071745c21f6fc9e6c914691f2532c1fb60ad967e5ddc52801d09958b5de926566299d07ae14466452a7efd29015f9145d6c09c573d93a0dc6f1683ee0ec2b93b + checksum: 10c0/071745c21f6fc9e6c914691f2532c1fb60ad967e5ddc52801d09958b5de926566299d07ae14466452a7efd29015f9145d6c09c573d93a0dc6f1683ee0ec2b93b languageName: node linkType: hard @@ -6843,7 +6843,7 @@ __metadata: define-properties: "npm:^1.2.0" es-abstract: "npm:^1.22.1" get-intrinsic: "npm:^1.2.1" - checksum: 61e41fbf08cc04ed860363db9629eedeaa590fce243c0960e948fd7b11f78a9d4350065c339936d118a2dd8775d7259e26207340cc8ce688bec66cb615fec6fe + checksum: 10c0/61e41fbf08cc04ed860363db9629eedeaa590fce243c0960e948fd7b11f78a9d4350065c339936d118a2dd8775d7259e26207340cc8ce688bec66cb615fec6fe languageName: node linkType: hard @@ -6853,7 +6853,7 @@ __metadata: dependencies: define-properties: "npm:^1.1.4" es-abstract: "npm:^1.20.4" - checksum: 419fc1c74a2aea7ebb4d49b79d5b1599a010b26c18eae35bd061ccdd013ccb749c499d8dd6ee21a91e6d7264ccc592573d0f13562970f76e25fc844d8c1b02ce + checksum: 10c0/419fc1c74a2aea7ebb4d49b79d5b1599a010b26c18eae35bd061ccdd013ccb749c499d8dd6ee21a91e6d7264ccc592573d0f13562970f76e25fc844d8c1b02ce languageName: node linkType: hard @@ -6864,7 +6864,7 @@ __metadata: call-bind: "npm:^1.0.2" define-properties: "npm:^1.2.0" es-abstract: "npm:^1.22.1" - checksum: e869d6a37fb7afdd0054dea49036d6ccebb84854a8848a093bbd1bc516f53e690bba88f0bc3e83fdfa74c601469ee6989c9b13359cda9604144c6e732fad3b6b + checksum: 10c0/e869d6a37fb7afdd0054dea49036d6ccebb84854a8848a093bbd1bc516f53e690bba88f0bc3e83fdfa74c601469ee6989c9b13359cda9604144c6e732fad3b6b languageName: node linkType: hard @@ -6873,7 +6873,7 @@ __metadata: resolution: "once@npm:1.4.0" dependencies: wrappy: "npm:1" - checksum: 5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 + checksum: 10c0/5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 languageName: node linkType: hard @@ -6887,7 +6887,7 @@ __metadata: levn: "npm:^0.4.1" prelude-ls: "npm:^1.2.1" type-check: "npm:^0.4.0" - checksum: 66fba794d425b5be51353035cf3167ce6cfa049059cbb93229b819167687e0f48d2bc4603fcb21b091c99acb516aae1083624675b15c4765b2e4693a085e959c + checksum: 10c0/66fba794d425b5be51353035cf3167ce6cfa049059cbb93229b819167687e0f48d2bc4603fcb21b091c99acb516aae1083624675b15c4765b2e4693a085e959c languageName: node linkType: hard @@ -6896,7 +6896,7 @@ __metadata: resolution: "p-limit@npm:3.1.0" dependencies: yocto-queue: "npm:^0.1.0" - checksum: 9db675949dbdc9c3763c89e748d0ef8bdad0afbb24d49ceaf4c46c02c77d30db4e0652ed36d0a0a7a95154335fab810d95c86153105bb73b3a90448e2bb14e1a + checksum: 10c0/9db675949dbdc9c3763c89e748d0ef8bdad0afbb24d49ceaf4c46c02c77d30db4e0652ed36d0a0a7a95154335fab810d95c86153105bb73b3a90448e2bb14e1a languageName: node linkType: hard @@ -6905,7 +6905,7 @@ __metadata: resolution: "p-locate@npm:5.0.0" dependencies: p-limit: "npm:^3.0.2" - checksum: 2290d627ab7903b8b70d11d384fee714b797f6040d9278932754a6860845c4d3190603a0772a663c8cb5a7b21d1b16acb3a6487ebcafa9773094edc3dfe6009a + checksum: 10c0/2290d627ab7903b8b70d11d384fee714b797f6040d9278932754a6860845c4d3190603a0772a663c8cb5a7b21d1b16acb3a6487ebcafa9773094edc3dfe6009a languageName: node linkType: hard @@ -6914,7 +6914,7 @@ __metadata: resolution: "p-map@npm:4.0.0" dependencies: aggregate-error: "npm:^3.0.0" - checksum: 592c05bd6262c466ce269ff172bb8de7c6975afca9b50c975135b974e9bdaafbfe80e61aaaf5be6d1200ba08b30ead04b88cfa7e25ff1e3b93ab28c9f62a2c75 + checksum: 10c0/592c05bd6262c466ce269ff172bb8de7c6975afca9b50c975135b974e9bdaafbfe80e61aaaf5be6d1200ba08b30ead04b88cfa7e25ff1e3b93ab28c9f62a2c75 languageName: node linkType: hard @@ -6924,7 +6924,7 @@ __metadata: dependencies: dot-case: "npm:^3.0.4" tslib: "npm:^2.0.3" - checksum: ccc053f3019f878eca10e70ec546d92f51a592f762917dafab11c8b532715dcff58356118a6f350976e4ab109e321756f05739643ed0ca94298e82291e6f9e76 + checksum: 10c0/ccc053f3019f878eca10e70ec546d92f51a592f762917dafab11c8b532715dcff58356118a6f350976e4ab109e321756f05739643ed0ca94298e82291e6f9e76 languageName: node linkType: hard @@ -6933,7 +6933,7 @@ __metadata: resolution: "parent-module@npm:1.0.1" dependencies: callsites: "npm:^3.0.0" - checksum: c63d6e80000d4babd11978e0d3fee386ca7752a02b035fd2435960ffaa7219dc42146f07069fb65e6e8bf1caef89daf9af7535a39bddf354d78bf50d8294f556 + checksum: 10c0/c63d6e80000d4babd11978e0d3fee386ca7752a02b035fd2435960ffaa7219dc42146f07069fb65e6e8bf1caef89daf9af7535a39bddf354d78bf50d8294f556 languageName: node linkType: hard @@ -6945,7 +6945,7 @@ __metadata: error-ex: "npm:^1.3.1" json-parse-even-better-errors: "npm:^2.3.0" lines-and-columns: "npm:^1.1.6" - checksum: 77947f2253005be7a12d858aedbafa09c9ae39eb4863adf330f7b416ca4f4a08132e453e08de2db46459256fb66afaac5ee758b44fe6541b7cdaf9d252e59585 + checksum: 10c0/77947f2253005be7a12d858aedbafa09c9ae39eb4863adf330f7b416ca4f4a08132e453e08de2db46459256fb66afaac5ee758b44fe6541b7cdaf9d252e59585 languageName: node linkType: hard @@ -6955,35 +6955,35 @@ __metadata: dependencies: no-case: "npm:^3.0.4" tslib: "npm:^2.0.3" - checksum: 05ff7c344809fd272fc5030ae0ee3da8e4e63f36d47a1e0a4855ca59736254192c5a27b5822ed4bae96e54048eec5f6907713cfcfff7cdf7a464eaf7490786d8 + checksum: 10c0/05ff7c344809fd272fc5030ae0ee3da8e4e63f36d47a1e0a4855ca59736254192c5a27b5822ed4bae96e54048eec5f6907713cfcfff7cdf7a464eaf7490786d8 languageName: node linkType: hard "path-exists@npm:^4.0.0": version: 4.0.0 resolution: "path-exists@npm:4.0.0" - checksum: 8c0bd3f5238188197dc78dced15207a4716c51cc4e3624c44fc97acf69558f5ebb9a2afff486fe1b4ee148e0c133e96c5e11a9aa5c48a3006e3467da070e5e1b + checksum: 10c0/8c0bd3f5238188197dc78dced15207a4716c51cc4e3624c44fc97acf69558f5ebb9a2afff486fe1b4ee148e0c133e96c5e11a9aa5c48a3006e3467da070e5e1b languageName: node linkType: hard "path-is-absolute@npm:^1.0.0": version: 1.0.1 resolution: "path-is-absolute@npm:1.0.1" - checksum: 127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 + checksum: 10c0/127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 languageName: node linkType: hard "path-key@npm:^3.1.0": version: 3.1.1 resolution: "path-key@npm:3.1.1" - checksum: 748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c + checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c languageName: node linkType: hard "path-parse@npm:^1.0.7": version: 1.0.7 resolution: "path-parse@npm:1.0.7" - checksum: 11ce261f9d294cc7a58d6a574b7f1b935842355ec66fba3c3fd79e0f036462eaf07d0aa95bb74ff432f9afef97ce1926c720988c6a7451d8a584930ae7de86e1 + checksum: 10c0/11ce261f9d294cc7a58d6a574b7f1b935842355ec66fba3c3fd79e0f036462eaf07d0aa95bb74ff432f9afef97ce1926c720988c6a7451d8a584930ae7de86e1 languageName: node linkType: hard @@ -6993,53 +6993,53 @@ __metadata: dependencies: lru-cache: "npm:^9.1.1 || ^10.0.0" minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" - checksum: e5dc78a7348d25eec61ab166317e9e9c7b46818aa2c2b9006c507a6ff48c672d011292d9662527213e558f5652ce0afcc788663a061d8b59ab495681840c0c1e + checksum: 10c0/e5dc78a7348d25eec61ab166317e9e9c7b46818aa2c2b9006c507a6ff48c672d011292d9662527213e558f5652ce0afcc788663a061d8b59ab495681840c0c1e languageName: node linkType: hard "path-type@npm:^4.0.0": version: 4.0.0 resolution: "path-type@npm:4.0.0" - checksum: 666f6973f332f27581371efaf303fd6c272cc43c2057b37aa99e3643158c7e4b2626549555d88626e99ea9e046f82f32e41bbde5f1508547e9a11b149b52387c + checksum: 10c0/666f6973f332f27581371efaf303fd6c272cc43c2057b37aa99e3643158c7e4b2626549555d88626e99ea9e046f82f32e41bbde5f1508547e9a11b149b52387c languageName: node linkType: hard "picocolors@npm:^1.0.0": version: 1.0.0 resolution: "picocolors@npm:1.0.0" - checksum: 20a5b249e331c14479d94ec6817a182fd7a5680debae82705747b2db7ec50009a5f6648d0621c561b0572703f84dbef0858abcbd5856d3c5511426afcb1961f7 + checksum: 10c0/20a5b249e331c14479d94ec6817a182fd7a5680debae82705747b2db7ec50009a5f6648d0621c561b0572703f84dbef0858abcbd5856d3c5511426afcb1961f7 languageName: node linkType: hard "picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.2, picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" - checksum: 26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be + checksum: 10c0/26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be languageName: node linkType: hard "pnpapi@npm:^0.0.0": version: 0.0.0 resolution: "pnpapi@npm:0.0.0" - checksum: 7e718f0263073729486b35658fc502bc8f6f34e922da288731722fad5fa69f3817d29cce64d0135c41826c7f899999343daff5e49a9367f056ece9f1c1ded391 + checksum: 10c0/7e718f0263073729486b35658fc502bc8f6f34e922da288731722fad5fa69f3817d29cce64d0135c41826c7f899999343daff5e49a9367f056ece9f1c1ded391 languageName: node linkType: hard -"postcss@npm:^8.4.32": - version: 8.4.32 - resolution: "postcss@npm:8.4.32" +"postcss@npm:^8.4.35": + version: 8.4.35 + resolution: "postcss@npm:8.4.35" dependencies: nanoid: "npm:^3.3.7" picocolors: "npm:^1.0.0" source-map-js: "npm:^1.0.2" - checksum: 39308a9195fa34d4dbdd7b58a896cff0c7809f84f7a4ac1b95b68ca86c9138a395addff33075668ed3983d41b90aac05754c445237a9365eb1c3a5602ebd03ad + checksum: 10c0/e8dd04e48001eb5857abc9475365bf08f4e508ddf9bc0b8525449a95d190f10d025acebc5b56ac2e94b3c7146790e4ae78989bb9633cb7ee20d1cc9b7dc909b2 languageName: node linkType: hard "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1" - checksum: b00d617431e7886c520a6f498a2e14c75ec58f6d93ba48c3b639cf241b54232d90daa05d83a9e9b9fef6baa63cb7e1e4602c2372fea5bc169668401eb127d0cd + checksum: 10c0/b00d617431e7886c520a6f498a2e14c75ec58f6d93ba48c3b639cf241b54232d90daa05d83a9e9b9fef6baa63cb7e1e4602c2372fea5bc169668401eb127d0cd languageName: node linkType: hard @@ -7048,7 +7048,7 @@ __metadata: resolution: "prettier-linter-helpers@npm:1.0.0" dependencies: fast-diff: "npm:^1.1.2" - checksum: 81e0027d731b7b3697ccd2129470ed9913ecb111e4ec175a12f0fcfab0096516373bf0af2fef132af50cafb0a905b74ff57996d615f59512bb9ac7378fcc64ab + checksum: 10c0/81e0027d731b7b3697ccd2129470ed9913ecb111e4ec175a12f0fcfab0096516373bf0af2fef132af50cafb0a905b74ff57996d615f59512bb9ac7378fcc64ab languageName: node linkType: hard @@ -7057,30 +7057,30 @@ __metadata: resolution: "prettier@npm:2.8.8" bin: prettier: bin-prettier.js - checksum: 463ea8f9a0946cd5b828d8cf27bd8b567345cf02f56562d5ecde198b91f47a76b7ac9eae0facd247ace70e927143af6135e8cf411986b8cb8478784a4d6d724a + checksum: 10c0/463ea8f9a0946cd5b828d8cf27bd8b567345cf02f56562d5ecde198b91f47a76b7ac9eae0facd247ace70e927143af6135e8cf411986b8cb8478784a4d6d724a languageName: node linkType: hard -"prettier@npm:^3.2.4": - version: 3.2.4 - resolution: "prettier@npm:3.2.4" +"prettier@npm:^3.2.5": + version: 3.2.5 + resolution: "prettier@npm:3.2.5" bin: prettier: bin/prettier.cjs - checksum: 88dfeb78ac6096522c9a5b81f1413d875f568420d9bb6a5e5103527912519b993f2bcdcac311fcff5718d5869671d44e4f85827d3626f3a6ce32b9abc65d88e0 + checksum: 10c0/ea327f37a7d46f2324a34ad35292af2ad4c4c3c3355da07313339d7e554320f66f65f91e856add8530157a733c6c4a897dc41b577056be5c24c40f739f5ee8c6 languageName: node linkType: hard "pretty-bytes@npm:^5.3.0": version: 5.6.0 resolution: "pretty-bytes@npm:5.6.0" - checksum: f69f494dcc1adda98dbe0e4a36d301e8be8ff99bfde7a637b2ee2820e7cb583b0fc0f3a63b0e3752c01501185a5cf38602c7be60da41bdf84ef5b70e89c370f3 + checksum: 10c0/f69f494dcc1adda98dbe0e4a36d301e8be8ff99bfde7a637b2ee2820e7cb583b0fc0f3a63b0e3752c01501185a5cf38602c7be60da41bdf84ef5b70e89c370f3 languageName: node linkType: hard "pretty-bytes@npm:^6.1.1": version: 6.1.1 resolution: "pretty-bytes@npm:6.1.1" - checksum: c7a660b933355f3b4587ad3f001c266a8dd6afd17db9f89ebc50812354bb142df4b9600396ba5999bdb1f9717300387dc311df91895c5f0f2a1780e22495b5f8 + checksum: 10c0/c7a660b933355f3b4587ad3f001c266a8dd6afd17db9f89ebc50812354bb142df4b9600396ba5999bdb1f9717300387dc311df91895c5f0f2a1780e22495b5f8 languageName: node linkType: hard @@ -7090,7 +7090,7 @@ __metadata: dependencies: err-code: "npm:^2.0.2" retry: "npm:^0.12.0" - checksum: 9c7045a1a2928094b5b9b15336dcd2a7b1c052f674550df63cc3f36cd44028e5080448175b6f6ca32b642de81150f5e7b1a98b728f15cb069f2dd60ac2616b96 + checksum: 10c0/9c7045a1a2928094b5b9b15336dcd2a7b1c052f674550df63cc3f36cd44028e5080448175b6f6ca32b642de81150f5e7b1a98b728f15cb069f2dd60ac2616b96 languageName: node linkType: hard @@ -7101,21 +7101,21 @@ __metadata: loose-envify: "npm:^1.4.0" object-assign: "npm:^4.1.1" react-is: "npm:^16.13.1" - checksum: 59ece7ca2fb9838031d73a48d4becb9a7cc1ed10e610517c7d8f19a1e02fa47f7c27d557d8a5702bec3cfeccddc853579832b43f449e54635803f277b1c78077 + checksum: 10c0/59ece7ca2fb9838031d73a48d4becb9a7cc1ed10e610517c7d8f19a1e02fa47f7c27d557d8a5702bec3cfeccddc853579832b43f449e54635803f277b1c78077 languageName: node linkType: hard "punycode@npm:^2.1.0": version: 2.3.0 resolution: "punycode@npm:2.3.0" - checksum: 8e6f7abdd3a6635820049e3731c623bbef3fedbf63bbc696b0d7237fdba4cefa069bc1fa62f2938b0fbae057550df7b5318f4a6bcece27f1907fc75c54160bee + checksum: 10c0/8e6f7abdd3a6635820049e3731c623bbef3fedbf63bbc696b0d7237fdba4cefa069bc1fa62f2938b0fbae057550df7b5318f4a6bcece27f1907fc75c54160bee languageName: node linkType: hard "queue-microtask@npm:^1.2.2": version: 1.2.3 resolution: "queue-microtask@npm:1.2.3" - checksum: 900a93d3cdae3acd7d16f642c29a642aea32c2026446151f0778c62ac089d4b8e6c986811076e1ae180a694cedf077d453a11b58ff0a865629a4f82ab558e102 + checksum: 10c0/900a93d3cdae3acd7d16f642c29a642aea32c2026446151f0778c62ac089d4b8e6c986811076e1ae180a694cedf077d453a11b58ff0a865629a4f82ab558e102 languageName: node linkType: hard @@ -7124,7 +7124,7 @@ __metadata: resolution: "randombytes@npm:2.1.0" dependencies: safe-buffer: "npm:^5.1.0" - checksum: 50395efda7a8c94f5dffab564f9ff89736064d32addf0cc7e8bf5e4166f09f8ded7a0849ca6c2d2a59478f7d90f78f20d8048bca3cdf8be09d8e8a10790388f3 + checksum: 10c0/50395efda7a8c94f5dffab564f9ff89736064d32addf0cc7e8bf5e4166f09f8ded7a0849ca6c2d2a59478f7d90f78f20d8048bca3cdf8be09d8e8a10790388f3 languageName: node linkType: hard @@ -7136,21 +7136,21 @@ __metadata: scheduler: "npm:^0.23.0" peerDependencies: react: ^18.2.0 - checksum: 66dfc5f93e13d0674e78ef41f92ed21dfb80f9c4ac4ac25a4b51046d41d4d2186abc915b897f69d3d0ebbffe6184e7c5876f2af26bfa956f179225d921be713a + checksum: 10c0/66dfc5f93e13d0674e78ef41f92ed21dfb80f9c4ac4ac25a4b51046d41d4d2186abc915b897f69d3d0ebbffe6184e7c5876f2af26bfa956f179225d921be713a languageName: node linkType: hard "react-is@npm:^16.13.1, react-is@npm:^16.7.0": version: 16.13.1 resolution: "react-is@npm:16.13.1" - checksum: 33977da7a5f1a287936a0c85639fec6ca74f4f15ef1e59a6bc20338fc73dc69555381e211f7a3529b8150a1f71e4225525b41b60b52965bda53ce7d47377ada1 + checksum: 10c0/33977da7a5f1a287936a0c85639fec6ca74f4f15ef1e59a6bc20338fc73dc69555381e211f7a3529b8150a1f71e4225525b41b60b52965bda53ce7d47377ada1 languageName: node linkType: hard "react-is@npm:^18.2.0": version: 18.2.0 resolution: "react-is@npm:18.2.0" - checksum: 6eb5e4b28028c23e2bfcf73371e72cd4162e4ac7ab445ddae2afe24e347a37d6dc22fae6e1748632cd43c6d4f9b8f86dcf26bf9275e1874f436d129952528ae0 + checksum: 10c0/6eb5e4b28028c23e2bfcf73371e72cd4162e4ac7ab445ddae2afe24e347a37d6dc22fae6e1748632cd43c6d4f9b8f86dcf26bf9275e1874f436d129952528ae0 languageName: node linkType: hard @@ -7162,7 +7162,7 @@ __metadata: peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 - checksum: 2d4f354f35e8a6c0421c875d9014f7a41a734ac5d83eea7bbc5adf8332173325ed10ee4ea74332040823b5c9d188539a3a86337a80cc1f533c8ab5f78e68dc7e + checksum: 10c0/2d4f354f35e8a6c0421c875d9014f7a41a734ac5d83eea7bbc5adf8332173325ed10ee4ea74332040823b5c9d188539a3a86337a80cc1f533c8ab5f78e68dc7e languageName: node linkType: hard @@ -7177,7 +7177,7 @@ __metadata: peerDependencies: react: ">=16.6.0" react-dom: ">=16.6.0" - checksum: 2ba754ba748faefa15f87c96dfa700d5525054a0141de8c75763aae6734af0740e77e11261a1e8f4ffc08fd9ab78510122e05c21c2d79066c38bb6861a886c82 + checksum: 10c0/2ba754ba748faefa15f87c96dfa700d5525054a0141de8c75763aae6734af0740e77e11261a1e8f4ffc08fd9ab78510122e05c21c2d79066c38bb6861a886c82 languageName: node linkType: hard @@ -7186,7 +7186,7 @@ __metadata: resolution: "react@npm:18.2.0" dependencies: loose-envify: "npm:^1.1.0" - checksum: b562d9b569b0cb315e44b48099f7712283d93df36b19a39a67c254c6686479d3980b7f013dc931f4a5a3ae7645eae6386b4aa5eea933baa54ecd0f9acb0902b8 + checksum: 10c0/b562d9b569b0cb315e44b48099f7712283d93df36b19a39a67c254c6686479d3980b7f013dc931f4a5a3ae7645eae6386b4aa5eea933baa54ecd0f9acb0902b8 languageName: node linkType: hard @@ -7197,7 +7197,7 @@ __metadata: inherits: "npm:^2.0.3" string_decoder: "npm:^1.1.1" util-deprecate: "npm:^1.0.1" - checksum: e37be5c79c376fdd088a45fa31ea2e423e5d48854be7a22a58869b4e84d25047b193f6acb54f1012331e1bcd667ffb569c01b99d36b0bd59658fb33f513511b7 + checksum: 10c0/e37be5c79c376fdd088a45fa31ea2e423e5d48854be7a22a58869b4e84d25047b193f6acb54f1012331e1bcd667ffb569c01b99d36b0bd59658fb33f513511b7 languageName: node linkType: hard @@ -7206,7 +7206,7 @@ __metadata: resolution: "readdirp@npm:3.6.0" dependencies: picomatch: "npm:^2.2.1" - checksum: 6fa848cf63d1b82ab4e985f4cf72bd55b7dcfd8e0a376905804e48c3634b7e749170940ba77b32804d5fe93b3cc521aa95a8d7e7d725f830da6d93f3669ce66b + checksum: 10c0/6fa848cf63d1b82ab4e985f4cf72bd55b7dcfd8e0a376905804e48c3634b7e749170940ba77b32804d5fe93b3cc521aa95a8d7e7d725f830da6d93f3669ce66b languageName: node linkType: hard @@ -7219,7 +7219,7 @@ __metadata: esprima: "npm:~4.0.0" source-map: "npm:~0.6.1" tslib: "npm:^2.0.1" - checksum: d719633be8029e28f23b8191d4a525c5dbdac721792ab3cb5e9dfcf1694fb93f3c147b186916195a9c7fa0711f1e4990ba457cdcee02faed3899d4a80da1bd1f + checksum: 10c0/d719633be8029e28f23b8191d4a525c5dbdac721792ab3cb5e9dfcf1694fb93f3c147b186916195a9c7fa0711f1e4990ba457cdcee02faed3899d4a80da1bd1f languageName: node linkType: hard @@ -7233,7 +7233,7 @@ __metadata: get-intrinsic: "npm:^1.2.1" globalthis: "npm:^1.0.3" which-builtin-type: "npm:^1.1.3" - checksum: 02104cdd22658b637efe6b1df73658edab539268347327c8250a72d0cb273dcdf280c284e2d94155d22601d022d16be1a816a8616d679e447cbcbde9860d15cb + checksum: 10c0/02104cdd22658b637efe6b1df73658edab539268347327c8250a72d0cb273dcdf280c284e2d94155d22601d022d16be1a816a8616d679e447cbcbde9860d15cb languageName: node linkType: hard @@ -7242,21 +7242,21 @@ __metadata: resolution: "regenerate-unicode-properties@npm:10.1.0" dependencies: regenerate: "npm:^1.4.2" - checksum: 17818ea6f67c5a4884b9e18842edc4b3838a12f62e24f843e80fbb6d8cb649274b5b86d98bb02075074e02021850e597a92ff6b58bbe5caba4bf5fd8e4e38b56 + checksum: 10c0/17818ea6f67c5a4884b9e18842edc4b3838a12f62e24f843e80fbb6d8cb649274b5b86d98bb02075074e02021850e597a92ff6b58bbe5caba4bf5fd8e4e38b56 languageName: node linkType: hard "regenerate@npm:^1.4.2": version: 1.4.2 resolution: "regenerate@npm:1.4.2" - checksum: f73c9eba5d398c818edc71d1c6979eaa05af7a808682749dd079f8df2a6d91a9b913db216c2c9b03e0a8ba2bba8701244a93f45211afbff691c32c7b275db1b8 + checksum: 10c0/f73c9eba5d398c818edc71d1c6979eaa05af7a808682749dd079f8df2a6d91a9b913db216c2c9b03e0a8ba2bba8701244a93f45211afbff691c32c7b275db1b8 languageName: node linkType: hard "regenerator-runtime@npm:^0.14.0": version: 0.14.0 resolution: "regenerator-runtime@npm:0.14.0" - checksum: e25f062c1a183f81c99681691a342760e65c55e8d3a4d4fe347ebe72433b123754b942b70b622959894e11f8a9131dc549bd3c9a5234677db06a4af42add8d12 + checksum: 10c0/e25f062c1a183f81c99681691a342760e65c55e8d3a4d4fe347ebe72433b123754b942b70b622959894e11f8a9131dc549bd3c9a5234677db06a4af42add8d12 languageName: node linkType: hard @@ -7265,7 +7265,7 @@ __metadata: resolution: "regenerator-transform@npm:0.15.2" dependencies: "@babel/runtime": "npm:^7.8.4" - checksum: 7cfe6931ec793269701994a93bab89c0cc95379191fad866270a7fea2adfec67ea62bb5b374db77058b60ba4509319d9b608664d0d288bd9989ca8dbd08fae90 + checksum: 10c0/7cfe6931ec793269701994a93bab89c0cc95379191fad866270a7fea2adfec67ea62bb5b374db77058b60ba4509319d9b608664d0d288bd9989ca8dbd08fae90 languageName: node linkType: hard @@ -7276,7 +7276,7 @@ __metadata: call-bind: "npm:^1.0.2" define-properties: "npm:^1.2.0" set-function-name: "npm:^2.0.0" - checksum: 1de7d214c0a726c7c874a7023e47b0e27b9f7fdb64175bfe1861189de1704aaeca05c3d26c35aa375432289b99946f3cf86651a92a8f7601b90d8c226a23bcd8 + checksum: 10c0/1de7d214c0a726c7c874a7023e47b0e27b9f7fdb64175bfe1861189de1704aaeca05c3d26c35aa375432289b99946f3cf86651a92a8f7601b90d8c226a23bcd8 languageName: node linkType: hard @@ -7290,7 +7290,7 @@ __metadata: regjsparser: "npm:^0.9.1" unicode-match-property-ecmascript: "npm:^2.0.0" unicode-match-property-value-ecmascript: "npm:^2.1.0" - checksum: 7945d5ab10c8bbed3ca383d4274687ea825aee4ab93a9c51c6e31e1365edd5ea807f6908f800ba017b66c462944ba68011164e7055207747ab651f8111ef3770 + checksum: 10c0/7945d5ab10c8bbed3ca383d4274687ea825aee4ab93a9c51c6e31e1365edd5ea807f6908f800ba017b66c462944ba68011164e7055207747ab651f8111ef3770 languageName: node linkType: hard @@ -7301,49 +7301,49 @@ __metadata: jsesc: "npm:~0.5.0" bin: regjsparser: bin/parser - checksum: fe44fcf19a99fe4f92809b0b6179530e5ef313ff7f87df143b08ce9a2eb3c4b6189b43735d645be6e8f4033bfb015ed1ca54f0583bc7561bed53fd379feb8225 + checksum: 10c0/fe44fcf19a99fe4f92809b0b6179530e5ef313ff7f87df143b08ce9a2eb3c4b6189b43735d645be6e8f4033bfb015ed1ca54f0583bc7561bed53fd379feb8225 languageName: node linkType: hard "relateurl@npm:^0.2.7": version: 0.2.7 resolution: "relateurl@npm:0.2.7" - checksum: c248b4e3b32474f116a804b537fa6343d731b80056fb506dffd91e737eef4cac6be47a65aae39b522b0db9d0b1011d1a12e288d82a109ecd94a5299d82f6573a + checksum: 10c0/c248b4e3b32474f116a804b537fa6343d731b80056fb506dffd91e737eef4cac6be47a65aae39b522b0db9d0b1011d1a12e288d82a109ecd94a5299d82f6573a languageName: node linkType: hard "require-directory@npm:^2.1.1": version: 2.1.1 resolution: "require-directory@npm:2.1.1" - checksum: 83aa76a7bc1531f68d92c75a2ca2f54f1b01463cb566cf3fbc787d0de8be30c9dbc211d1d46be3497dac5785fe296f2dd11d531945ac29730643357978966e99 + checksum: 10c0/83aa76a7bc1531f68d92c75a2ca2f54f1b01463cb566cf3fbc787d0de8be30c9dbc211d1d46be3497dac5785fe296f2dd11d531945ac29730643357978966e99 languageName: node linkType: hard "require-from-string@npm:^2.0.2": version: 2.0.2 resolution: "require-from-string@npm:2.0.2" - checksum: aaa267e0c5b022fc5fd4eef49d8285086b15f2a1c54b28240fdf03599cbd9c26049fee3eab894f2e1f6ca65e513b030a7c264201e3f005601e80c49fb2937ce2 + checksum: 10c0/aaa267e0c5b022fc5fd4eef49d8285086b15f2a1c54b28240fdf03599cbd9c26049fee3eab894f2e1f6ca65e513b030a7c264201e3f005601e80c49fb2937ce2 languageName: node linkType: hard "reselect@npm:^4.1.8": version: 4.1.8 resolution: "reselect@npm:4.1.8" - checksum: 06a305a504affcbb67dd0561ddc8306b35796199c7e15b38934c80606938a021eadcf68cfd58e7bb5e17786601c37602a3362a4665c7bf0a96c1041ceee9d0b7 + checksum: 10c0/06a305a504affcbb67dd0561ddc8306b35796199c7e15b38934c80606938a021eadcf68cfd58e7bb5e17786601c37602a3362a4665c7bf0a96c1041ceee9d0b7 languageName: node linkType: hard "resolve-from@npm:^4.0.0": version: 4.0.0 resolution: "resolve-from@npm:4.0.0" - checksum: 8408eec31a3112ef96e3746c37be7d64020cda07c03a920f5024e77290a218ea758b26ca9529fd7b1ad283947f34b2291c1c0f6aa0ed34acfdda9c6014c8d190 + checksum: 10c0/8408eec31a3112ef96e3746c37be7d64020cda07c03a920f5024e77290a218ea758b26ca9529fd7b1ad283947f34b2291c1c0f6aa0ed34acfdda9c6014c8d190 languageName: node linkType: hard "resolve-pkg-maps@npm:^1.0.0": version: 1.0.0 resolution: "resolve-pkg-maps@npm:1.0.0" - checksum: fb8f7bbe2ca281a73b7ef423a1cbc786fb244bd7a95cbe5c3fba25b27d327150beca8ba02f622baea65919a57e061eb5005204daa5f93ed590d9b77463a567ab + checksum: 10c0/fb8f7bbe2ca281a73b7ef423a1cbc786fb244bd7a95cbe5c3fba25b27d327150beca8ba02f622baea65919a57e061eb5005204daa5f93ed590d9b77463a567ab languageName: node linkType: hard @@ -7356,7 +7356,7 @@ __metadata: supports-preserve-symlinks-flag: "npm:^1.0.0" bin: resolve: bin/resolve - checksum: b1adb7885a05e31fc2be19e85e338b8d48d9e442b568d91e9c925990ed1c3bff66683ccea03b9e9893b857ec25dee0f7951a0d0630be49e4e1f5c1150ddc35dc + checksum: 10c0/b1adb7885a05e31fc2be19e85e338b8d48d9e442b568d91e9c925990ed1c3bff66683ccea03b9e9893b857ec25dee0f7951a0d0630be49e4e1f5c1150ddc35dc languageName: node linkType: hard @@ -7369,7 +7369,7 @@ __metadata: supports-preserve-symlinks-flag: "npm:^1.0.0" bin: resolve: bin/resolve - checksum: 1de92669e7c46cfe125294c66d5405e13288bb87b97e9bdab71693ceebbcc0255c789bde30e2834265257d330d8ff57414d7d88e3097d8f69951f3ce978bf045 + checksum: 10c0/1de92669e7c46cfe125294c66d5405e13288bb87b97e9bdab71693ceebbcc0255c789bde30e2834265257d330d8ff57414d7d88e3097d8f69951f3ce978bf045 languageName: node linkType: hard @@ -7382,7 +7382,7 @@ __metadata: supports-preserve-symlinks-flag: "npm:^1.0.0" bin: resolve: bin/resolve - checksum: 60ca179599acf8b1bb17b850280a7081781b457d235d48197dc893b82d75741f191c5fe2d93e5729292234d0b0d88e9add273df4b9e04755eeed4fd7d23f1c79 + checksum: 10c0/60ca179599acf8b1bb17b850280a7081781b457d235d48197dc893b82d75741f191c5fe2d93e5729292234d0b0d88e9add273df4b9e04755eeed4fd7d23f1c79 languageName: node linkType: hard @@ -7395,21 +7395,21 @@ __metadata: supports-preserve-symlinks-flag: "npm:^1.0.0" bin: resolve: bin/resolve - checksum: ed2bb51d616b9cd30fe85cf49f7a2240094d9fa01a221d361918462be81f683d1855b7f192391d2ab5325245b42464ca59690db5bd5dad0a326fc0de5974dd10 + checksum: 10c0/ed2bb51d616b9cd30fe85cf49f7a2240094d9fa01a221d361918462be81f683d1855b7f192391d2ab5325245b42464ca59690db5bd5dad0a326fc0de5974dd10 languageName: node linkType: hard "retry@npm:^0.12.0": version: 0.12.0 resolution: "retry@npm:0.12.0" - checksum: 59933e8501727ba13ad73ef4a04d5280b3717fd650408460c987392efe9d7be2040778ed8ebe933c5cbd63da3dcc37919c141ef8af0a54a6e4fca5a2af177bfe + checksum: 10c0/59933e8501727ba13ad73ef4a04d5280b3717fd650408460c987392efe9d7be2040778ed8ebe933c5cbd63da3dcc37919c141ef8af0a54a6e4fca5a2af177bfe languageName: node linkType: hard "reusify@npm:^1.0.4": version: 1.0.4 resolution: "reusify@npm:1.0.4" - checksum: c19ef26e4e188f408922c46f7ff480d38e8dfc55d448310dfb518736b23ed2c4f547fb64a6ed5bdba92cd7e7ddc889d36ff78f794816d5e71498d645ef476107 + checksum: 10c0/c19ef26e4e188f408922c46f7ff480d38e8dfc55d448310dfb518736b23ed2c4f547fb64a6ed5bdba92cd7e7ddc889d36ff78f794816d5e71498d645ef476107 languageName: node linkType: hard @@ -7420,14 +7420,14 @@ __metadata: glob: "npm:^7.1.3" bin: rimraf: bin.js - checksum: 9cb7757acb489bd83757ba1a274ab545eafd75598a9d817e0c3f8b164238dd90eba50d6b848bd4dcc5f3040912e882dc7ba71653e35af660d77b25c381d402e8 + checksum: 10c0/9cb7757acb489bd83757ba1a274ab545eafd75598a9d817e0c3f8b164238dd90eba50d6b848bd4dcc5f3040912e882dc7ba71653e35af660d77b25c381d402e8 languageName: node linkType: hard "robust-predicates@npm:^3.0.0": version: 3.0.2 resolution: "robust-predicates@npm:3.0.2" - checksum: 4ecd53649f1c2d49529c85518f2fa69ffb2f7a4453f7fd19c042421c7b4d76c3efb48bc1c740c8f7049346d7cb58cf08ee0c9adaae595cc23564d360adb1fde4 + checksum: 10c0/4ecd53649f1c2d49529c85518f2fa69ffb2f7a4453f7fd19c042421c7b4d76c3efb48bc1c740c8f7049346d7cb58cf08ee0c9adaae595cc23564d360adb1fde4 languageName: node linkType: hard @@ -7441,7 +7441,7 @@ __metadata: terser: "npm:^5.0.0" peerDependencies: rollup: ^2.0.0 - checksum: f79b851c6f7b06555d3a8ce7a4e32abd2b7cb8318e89fb8db73e662fa6e3af1a59920e881d111efc65a7437fd9582b61b1f4859b6fd839ba948616829d92432d + checksum: 10c0/f79b851c6f7b06555d3a8ce7a4e32abd2b7cb8318e89fb8db73e662fa6e3af1a59920e881d111efc65a7437fd9582b61b1f4859b6fd839ba948616829d92432d languageName: node linkType: hard @@ -7455,7 +7455,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 421418687f5dcd7324f4387f203c6bfc7118b7ace789e30f5da022471c43e037a76f5fd93837052754eeeae798a4fb266ac05ccee1e594406d912a59af98dde9 + checksum: 10c0/421418687f5dcd7324f4387f203c6bfc7118b7ace789e30f5da022471c43e037a76f5fd93837052754eeeae798a4fb266ac05ccee1e594406d912a59af98dde9 languageName: node linkType: hard @@ -7505,7 +7505,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: deeac5bed2a24ef954447807a3effd0c931d6f4bf0cc1a48e8c2ad0712db2f112a8bcf26721793556349a154a56fc81712c6f60fd1b5dc58def96c244613107a + checksum: 10c0/deeac5bed2a24ef954447807a3effd0c931d6f4bf0cc1a48e8c2ad0712db2f112a8bcf26721793556349a154a56fc81712c6f60fd1b5dc58def96c244613107a languageName: node linkType: hard @@ -7514,14 +7514,14 @@ __metadata: resolution: "run-parallel@npm:1.2.0" dependencies: queue-microtask: "npm:^1.2.2" - checksum: 200b5ab25b5b8b7113f9901bfe3afc347e19bb7475b267d55ad0eb86a62a46d77510cb0f232507c9e5d497ebda569a08a9867d0d14f57a82ad5564d991588b39 + checksum: 10c0/200b5ab25b5b8b7113f9901bfe3afc347e19bb7475b267d55ad0eb86a62a46d77510cb0f232507c9e5d497ebda569a08a9867d0d14f57a82ad5564d991588b39 languageName: node linkType: hard "rw@npm:1": version: 1.3.3 resolution: "rw@npm:1.3.3" - checksum: b1e1ef37d1e79d9dc7050787866e30b6ddcb2625149276045c262c6b4d53075ddc35f387a856a8e76f0d0df59f4cd58fe24707e40797ebee66e542b840ed6a53 + checksum: 10c0/b1e1ef37d1e79d9dc7050787866e30b6ddcb2625149276045c262c6b4d53075ddc35f387a856a8e76f0d0df59f4cd58fe24707e40797ebee66e542b840ed6a53 languageName: node linkType: hard @@ -7533,14 +7533,14 @@ __metadata: get-intrinsic: "npm:^1.2.1" has-symbols: "npm:^1.0.3" isarray: "npm:^2.0.5" - checksum: 4b15ce5fce5ce4d7e744a63592cded88d2f27806ed229eadb2e42629cbcd40e770f7478608e75f455e7fe341acd8c0a01bdcd7146b10645ea7411c5e3c1d1dd8 + checksum: 10c0/4b15ce5fce5ce4d7e744a63592cded88d2f27806ed229eadb2e42629cbcd40e770f7478608e75f455e7fe341acd8c0a01bdcd7146b10645ea7411c5e3c1d1dd8 languageName: node linkType: hard "safe-buffer@npm:^5.1.0, safe-buffer@npm:~5.2.0": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" - checksum: 6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 + checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 languageName: node linkType: hard @@ -7551,14 +7551,14 @@ __metadata: call-bind: "npm:^1.0.2" get-intrinsic: "npm:^1.1.3" is-regex: "npm:^1.1.4" - checksum: 14a81a7e683f97b2d6e9c8be61fddcf8ed7a02f4e64a825515f96bb1738eb007145359313741d2704d28b55b703a0f6300c749dde7c1dbc13952a2b85048ede2 + checksum: 10c0/14a81a7e683f97b2d6e9c8be61fddcf8ed7a02f4e64a825515f96bb1738eb007145359313741d2704d28b55b703a0f6300c749dde7c1dbc13952a2b85048ede2 languageName: node linkType: hard "safer-buffer@npm:>= 2.1.2 < 3.0.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" - checksum: 7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 + checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 languageName: node linkType: hard @@ -7567,7 +7567,7 @@ __metadata: resolution: "scheduler@npm:0.23.0" dependencies: loose-envify: "npm:^1.1.0" - checksum: b777f7ca0115e6d93e126ac490dbd82642d14983b3079f58f35519d992fa46260be7d6e6cede433a92db70306310c6f5f06e144f0e40c484199e09c1f7be53dd + checksum: 10c0/b777f7ca0115e6d93e126ac490dbd82642d14983b3079f58f35519d992fa46260be7d6e6cede433a92db70306310c6f5f06e144f0e40c484199e09c1f7be53dd languageName: node linkType: hard @@ -7576,7 +7576,7 @@ __metadata: resolution: "semver@npm:6.3.1" bin: semver: bin/semver.js - checksum: e3d79b609071caa78bcb6ce2ad81c7966a46a7431d9d58b8800cfa9cb6a63699b3899a0e4bcce36167a284578212d9ae6942b6929ba4aa5015c079a67751d42d + checksum: 10c0/e3d79b609071caa78bcb6ce2ad81c7966a46a7431d9d58b8800cfa9cb6a63699b3899a0e4bcce36167a284578212d9ae6942b6929ba4aa5015c079a67751d42d languageName: node linkType: hard @@ -7587,7 +7587,7 @@ __metadata: lru-cache: "npm:^6.0.0" bin: semver: bin/semver.js - checksum: 5160b06975a38b11c1ab55950cb5b8a23db78df88275d3d8a42ccf1f29e55112ac995b3a26a522c36e3b5f76b0445f1eef70d696b8c7862a2b4303d7b0e7609e + checksum: 10c0/5160b06975a38b11c1ab55950cb5b8a23db78df88275d3d8a42ccf1f29e55112ac995b3a26a522c36e3b5f76b0445f1eef70d696b8c7862a2b4303d7b0e7609e languageName: node linkType: hard @@ -7596,14 +7596,14 @@ __metadata: resolution: "serialize-javascript@npm:4.0.0" dependencies: randombytes: "npm:^2.1.0" - checksum: 510dfe7f0311c0b2f7ab06311afa1668ba2969ab2f1faaac0a4924ede76b7f22ba85cfdeaa0052ec5a047bca42c8cd8ac8df8f0efe52f9bd290b3a39ae69fe9d + checksum: 10c0/510dfe7f0311c0b2f7ab06311afa1668ba2969ab2f1faaac0a4924ede76b7f22ba85cfdeaa0052ec5a047bca42c8cd8ac8df8f0efe52f9bd290b3a39ae69fe9d languageName: node linkType: hard "set-blocking@npm:^2.0.0": version: 2.0.0 resolution: "set-blocking@npm:2.0.0" - checksum: 9f8c1b2d800800d0b589de1477c753492de5c1548d4ade52f57f1d1f5e04af5481554d75ce5e5c43d4004b80a3eb714398d6907027dc0534177b7539119f4454 + checksum: 10c0/9f8c1b2d800800d0b589de1477c753492de5c1548d4ade52f57f1d1f5e04af5481554d75ce5e5c43d4004b80a3eb714398d6907027dc0534177b7539119f4454 languageName: node linkType: hard @@ -7615,7 +7615,7 @@ __metadata: get-intrinsic: "npm:^1.2.1" gopd: "npm:^1.0.1" has-property-descriptors: "npm:^1.0.0" - checksum: a29e255c116c29e3323b851c4f46c58c91be9bb8b065f191e2ea1807cb2c839df56e3175732a498e0c6d54626ba6b6fef896bf699feb7ab70c42dc47eb247c95 + checksum: 10c0/a29e255c116c29e3323b851c4f46c58c91be9bb8b065f191e2ea1807cb2c839df56e3175732a498e0c6d54626ba6b6fef896bf699feb7ab70c42dc47eb247c95 languageName: node linkType: hard @@ -7626,7 +7626,7 @@ __metadata: define-data-property: "npm:^1.0.1" functions-have-names: "npm:^1.2.3" has-property-descriptors: "npm:^1.0.0" - checksum: 6be7d3e15be47f4db8a5a563a35c60b5e7c4af91cc900e8972ffad33d3aaa227900faa55f60121cdb04b85866a734bb7fe4cd91f654c632861cc86121a48312a + checksum: 10c0/6be7d3e15be47f4db8a5a563a35c60b5e7c4af91cc900e8972ffad33d3aaa227900faa55f60121cdb04b85866a734bb7fe4cd91f654c632861cc86121a48312a languageName: node linkType: hard @@ -7635,14 +7635,14 @@ __metadata: resolution: "shebang-command@npm:2.0.0" dependencies: shebang-regex: "npm:^3.0.0" - checksum: a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e + checksum: 10c0/a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e languageName: node linkType: hard "shebang-regex@npm:^3.0.0": version: 3.0.0 resolution: "shebang-regex@npm:3.0.0" - checksum: 1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 + checksum: 10c0/1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 languageName: node linkType: hard @@ -7653,35 +7653,35 @@ __metadata: call-bind: "npm:^1.0.0" get-intrinsic: "npm:^1.0.2" object-inspect: "npm:^1.9.0" - checksum: 054a5d23ee35054b2c4609b9fd2a0587760737782b5d765a9c7852264710cc39c6dcb56a9bbd6c12cd84071648aea3edb2359d2f6e560677eedadce511ac1da5 + checksum: 10c0/054a5d23ee35054b2c4609b9fd2a0587760737782b5d765a9c7852264710cc39c6dcb56a9bbd6c12cd84071648aea3edb2359d2f6e560677eedadce511ac1da5 languageName: node linkType: hard "signal-exit@npm:^3.0.7": version: 3.0.7 resolution: "signal-exit@npm:3.0.7" - checksum: 25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 + checksum: 10c0/25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 languageName: node linkType: hard "signal-exit@npm:^4.0.1": version: 4.1.0 resolution: "signal-exit@npm:4.1.0" - checksum: 41602dce540e46d599edba9d9860193398d135f7ff72cab629db5171516cfae628d21e7bfccde1bbfdf11c48726bc2a6d1a8fb8701125852fbfda7cf19c6aa83 + checksum: 10c0/41602dce540e46d599edba9d9860193398d135f7ff72cab629db5171516cfae628d21e7bfccde1bbfdf11c48726bc2a6d1a8fb8701125852fbfda7cf19c6aa83 languageName: node linkType: hard "slash@npm:^3.0.0": version: 3.0.0 resolution: "slash@npm:3.0.0" - checksum: e18488c6a42bdfd4ac5be85b2ced3ccd0224773baae6ad42cfbb9ec74fc07f9fa8396bd35ee638084ead7a2a0818eb5e7151111544d4731ce843019dab4be47b + checksum: 10c0/e18488c6a42bdfd4ac5be85b2ced3ccd0224773baae6ad42cfbb9ec74fc07f9fa8396bd35ee638084ead7a2a0818eb5e7151111544d4731ce843019dab4be47b languageName: node linkType: hard "smart-buffer@npm:^4.2.0": version: 4.2.0 resolution: "smart-buffer@npm:4.2.0" - checksum: a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 + checksum: 10c0/a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 languageName: node linkType: hard @@ -7692,7 +7692,7 @@ __metadata: agent-base: "npm:^6.0.2" debug: "npm:^4.3.3" socks: "npm:^2.6.2" - checksum: b859f7eb8e96ec2c4186beea233ae59c02404094f3eb009946836af27d6e5c1627d1975a69b4d2e20611729ed543b6db3ae8481eb38603433c50d0345c987600 + checksum: 10c0/b859f7eb8e96ec2c4186beea233ae59c02404094f3eb009946836af27d6e5c1627d1975a69b4d2e20611729ed543b6db3ae8481eb38603433c50d0345c987600 languageName: node linkType: hard @@ -7702,14 +7702,14 @@ __metadata: dependencies: ip: "npm:^2.0.0" smart-buffer: "npm:^4.2.0" - checksum: 43f69dbc9f34fc8220bc51c6eea1c39715ab3cfdb115d6e3285f6c7d1a603c5c75655668a5bbc11e3c7e2c99d60321fb8d7ab6f38cda6a215fadd0d6d0b52130 + checksum: 10c0/43f69dbc9f34fc8220bc51c6eea1c39715ab3cfdb115d6e3285f6c7d1a603c5c75655668a5bbc11e3c7e2c99d60321fb8d7ab6f38cda6a215fadd0d6d0b52130 languageName: node linkType: hard "source-map-js@npm:^1.0.2": version: 1.0.2 resolution: "source-map-js@npm:1.0.2" - checksum: 32f2dfd1e9b7168f9a9715eb1b4e21905850f3b50cf02cf476e47e4eebe8e6b762b63a64357896aa29b37e24922b4282df0f492e0d2ace572b43d15525976ff8 + checksum: 10c0/32f2dfd1e9b7168f9a9715eb1b4e21905850f3b50cf02cf476e47e4eebe8e6b762b63a64357896aa29b37e24922b4282df0f492e0d2ace572b43d15525976ff8 languageName: node linkType: hard @@ -7719,21 +7719,21 @@ __metadata: dependencies: buffer-from: "npm:^1.0.0" source-map: "npm:^0.6.0" - checksum: 9ee09942f415e0f721d6daad3917ec1516af746a8120bba7bb56278707a37f1eb8642bde456e98454b8a885023af81a16e646869975f06afc1a711fb90484e7d + checksum: 10c0/9ee09942f415e0f721d6daad3917ec1516af746a8120bba7bb56278707a37f1eb8642bde456e98454b8a885023af81a16e646869975f06afc1a711fb90484e7d languageName: node linkType: hard "source-map@npm:^0.5.7": version: 0.5.7 resolution: "source-map@npm:0.5.7" - checksum: 904e767bb9c494929be013017380cbba013637da1b28e5943b566031e29df04fba57edf3f093e0914be094648b577372bd8ad247fa98cfba9c600794cd16b599 + checksum: 10c0/904e767bb9c494929be013017380cbba013637da1b28e5943b566031e29df04fba57edf3f093e0914be094648b577372bd8ad247fa98cfba9c600794cd16b599 languageName: node linkType: hard "source-map@npm:^0.6.0, source-map@npm:~0.6.0, source-map@npm:~0.6.1": version: 0.6.1 resolution: "source-map@npm:0.6.1" - checksum: ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 + checksum: 10c0/ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 languageName: node linkType: hard @@ -7742,14 +7742,14 @@ __metadata: resolution: "source-map@npm:0.8.0-beta.0" dependencies: whatwg-url: "npm:^7.0.0" - checksum: fb4d9bde9a9fdb2c29b10e5eae6c71d10e09ef467e1afb75fdec2eb7e11fa5b343a2af553f74f18b695dbc0b81f9da2e9fa3d7a317d5985e9939499ec6087835 + checksum: 10c0/fb4d9bde9a9fdb2c29b10e5eae6c71d10e09ef467e1afb75fdec2eb7e11fa5b343a2af553f74f18b695dbc0b81f9da2e9fa3d7a317d5985e9939499ec6087835 languageName: node linkType: hard "sourcemap-codec@npm:^1.4.8": version: 1.4.8 resolution: "sourcemap-codec@npm:1.4.8" - checksum: f099279fdaae070ff156df7414bbe39aad69cdd615454947ed3e19136bfdfcb4544952685ee73f56e17038f4578091e12b17b283ed8ac013882916594d95b9e6 + checksum: 10c0/f099279fdaae070ff156df7414bbe39aad69cdd615454947ed3e19136bfdfcb4544952685ee73f56e17038f4578091e12b17b283ed8ac013882916594d95b9e6 languageName: node linkType: hard @@ -7758,7 +7758,7 @@ __metadata: resolution: "ssri@npm:10.0.5" dependencies: minipass: "npm:^7.0.3" - checksum: b091f2ae92474183c7ac5ed3f9811457e1df23df7a7e70c9476eaa9a0c4a0c8fc190fb45acefbf023ca9ee864dd6754237a697dc52a0fb182afe65d8e77443d8 + checksum: 10c0/b091f2ae92474183c7ac5ed3f9811457e1df23df7a7e70c9476eaa9a0c4a0c8fc190fb45acefbf023ca9ee864dd6754237a697dc52a0fb182afe65d8e77443d8 languageName: node linkType: hard @@ -7769,7 +7769,7 @@ __metadata: emoji-regex: "npm:^8.0.0" is-fullwidth-code-point: "npm:^3.0.0" strip-ansi: "npm:^6.0.1" - checksum: 1e525e92e5eae0afd7454086eed9c818ee84374bb80328fc41217ae72ff5f065ef1c9d7f72da41de40c75fa8bb3dee63d92373fd492c84260a552c636392a47b + checksum: 10c0/1e525e92e5eae0afd7454086eed9c818ee84374bb80328fc41217ae72ff5f065ef1c9d7f72da41de40c75fa8bb3dee63d92373fd492c84260a552c636392a47b languageName: node linkType: hard @@ -7780,7 +7780,7 @@ __metadata: eastasianwidth: "npm:^0.2.0" emoji-regex: "npm:^9.2.2" strip-ansi: "npm:^7.0.1" - checksum: ab9c4264443d35b8b923cbdd513a089a60de339216d3b0ed3be3ba57d6880e1a192b70ae17225f764d7adbf5994e9bb8df253a944736c15a0240eff553c678ca + checksum: 10c0/ab9c4264443d35b8b923cbdd513a089a60de339216d3b0ed3be3ba57d6880e1a192b70ae17225f764d7adbf5994e9bb8df253a944736c15a0240eff553c678ca languageName: node linkType: hard @@ -7796,7 +7796,7 @@ __metadata: internal-slot: "npm:^1.0.3" regexp.prototype.flags: "npm:^1.4.3" side-channel: "npm:^1.0.4" - checksum: 644523d05c1ee93bab7474e999a5734ee5f6ad2d7ad24ed6ea8706c270dc92b352bde0f2a5420bfbeed54e28cb6a770c3800e1988a5267a70fd5e677c7750abc + checksum: 10c0/644523d05c1ee93bab7474e999a5734ee5f6ad2d7ad24ed6ea8706c270dc92b352bde0f2a5420bfbeed54e28cb6a770c3800e1988a5267a70fd5e677c7750abc languageName: node linkType: hard @@ -7807,7 +7807,7 @@ __metadata: call-bind: "npm:^1.0.2" define-properties: "npm:^1.2.0" es-abstract: "npm:^1.22.1" - checksum: 4f76c583908bcde9a71208ddff38f67f24c9ec8093631601666a0df8b52fad44dad2368c78895ce83eb2ae8e7068294cc96a02fc971ab234e4d5c9bb61ea4e34 + checksum: 10c0/4f76c583908bcde9a71208ddff38f67f24c9ec8093631601666a0df8b52fad44dad2368c78895ce83eb2ae8e7068294cc96a02fc971ab234e4d5c9bb61ea4e34 languageName: node linkType: hard @@ -7818,7 +7818,7 @@ __metadata: call-bind: "npm:^1.0.2" define-properties: "npm:^1.2.0" es-abstract: "npm:^1.22.1" - checksum: 53c24911c7c4d8d65f5ef5322de23a3d5b6b4db73273e05871d5ab4571ae5638f38f7f19d71d09116578fb060e5a145cc6a208af2d248c8baf7a34f44d32ce57 + checksum: 10c0/53c24911c7c4d8d65f5ef5322de23a3d5b6b4db73273e05871d5ab4571ae5638f38f7f19d71d09116578fb060e5a145cc6a208af2d248c8baf7a34f44d32ce57 languageName: node linkType: hard @@ -7829,7 +7829,7 @@ __metadata: call-bind: "npm:^1.0.2" define-properties: "npm:^1.2.0" es-abstract: "npm:^1.22.1" - checksum: 0bcf391b41ea16d4fda9c9953d0a7075171fe090d33b4cf64849af94944c50862995672ac03e0c5dba2940a213ad7f53515a668dac859ce22a0276289ae5cf4f + checksum: 10c0/0bcf391b41ea16d4fda9c9953d0a7075171fe090d33b4cf64849af94944c50862995672ac03e0c5dba2940a213ad7f53515a668dac859ce22a0276289ae5cf4f languageName: node linkType: hard @@ -7838,7 +7838,7 @@ __metadata: resolution: "string_decoder@npm:1.3.0" dependencies: safe-buffer: "npm:~5.2.0" - checksum: 810614ddb030e271cd591935dcd5956b2410dd079d64ff92a1844d6b7588bf992b3e1b69b0f4d34a3e06e0bd73046ac646b5264c1987b20d0601f81ef35d731d + checksum: 10c0/810614ddb030e271cd591935dcd5956b2410dd079d64ff92a1844d6b7588bf992b3e1b69b0f4d34a3e06e0bd73046ac646b5264c1987b20d0601f81ef35d731d languageName: node linkType: hard @@ -7849,7 +7849,7 @@ __metadata: get-own-enumerable-property-symbols: "npm:^3.0.0" is-obj: "npm:^1.0.1" is-regexp: "npm:^1.0.0" - checksum: ba8078f84128979ee24b3de9a083489cbd3c62cb8572a061b47d4d82601a8ae4b4d86fa8c54dd955593da56bb7c16a6de51c27221fdc6b7139bb4f29d815f35b + checksum: 10c0/ba8078f84128979ee24b3de9a083489cbd3c62cb8572a061b47d4d82601a8ae4b4d86fa8c54dd955593da56bb7c16a6de51c27221fdc6b7139bb4f29d815f35b languageName: node linkType: hard @@ -7858,7 +7858,7 @@ __metadata: resolution: "strip-ansi@npm:6.0.1" dependencies: ansi-regex: "npm:^5.0.1" - checksum: 1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 + checksum: 10c0/1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 languageName: node linkType: hard @@ -7867,42 +7867,42 @@ __metadata: resolution: "strip-ansi@npm:7.1.0" dependencies: ansi-regex: "npm:^6.0.1" - checksum: a198c3762e8832505328cbf9e8c8381de14a4fa50a4f9b2160138158ea88c0f5549fb50cb13c651c3088f47e63a108b34622ec18c0499b6c8c3a5ddf6b305ac4 + checksum: 10c0/a198c3762e8832505328cbf9e8c8381de14a4fa50a4f9b2160138158ea88c0f5549fb50cb13c651c3088f47e63a108b34622ec18c0499b6c8c3a5ddf6b305ac4 languageName: node linkType: hard "strip-bom@npm:^3.0.0": version: 3.0.0 resolution: "strip-bom@npm:3.0.0" - checksum: 51201f50e021ef16672593d7434ca239441b7b760e905d9f33df6e4f3954ff54ec0e0a06f100d028af0982d6f25c35cd5cda2ce34eaebccd0250b8befb90d8f1 + checksum: 10c0/51201f50e021ef16672593d7434ca239441b7b760e905d9f33df6e4f3954ff54ec0e0a06f100d028af0982d6f25c35cd5cda2ce34eaebccd0250b8befb90d8f1 languageName: node linkType: hard "strip-comments@npm:^2.0.1": version: 2.0.1 resolution: "strip-comments@npm:2.0.1" - checksum: 984321b1ec47a531bdcfddd87f217590934e2d2f142198a080ec88588280239a5b58a81ca780730679b6195e52afef83673c6d6466c07c2277f71f44d7d9553d + checksum: 10c0/984321b1ec47a531bdcfddd87f217590934e2d2f142198a080ec88588280239a5b58a81ca780730679b6195e52afef83673c6d6466c07c2277f71f44d7d9553d languageName: node linkType: hard "strip-json-comments@npm:^3.1.1": version: 3.1.1 resolution: "strip-json-comments@npm:3.1.1" - checksum: 9681a6257b925a7fa0f285851c0e613cc934a50661fa7bb41ca9cbbff89686bb4a0ee366e6ecedc4daafd01e83eee0720111ab294366fe7c185e935475ebcecd + checksum: 10c0/9681a6257b925a7fa0f285851c0e613cc934a50661fa7bb41ca9cbbff89686bb4a0ee366e6ecedc4daafd01e83eee0720111ab294366fe7c185e935475ebcecd languageName: node linkType: hard "style-mod@npm:^4.0.0, style-mod@npm:^4.1.0": version: 4.1.0 resolution: "style-mod@npm:4.1.0" - checksum: 1dce7b0f3d1a91c9e6c37200627b5a9ffa943916bb5879dfaa800c3929fcc11b9bfcc2a6097f49ec3462b254b7afcbcf63caeae6895f53c80122523dc9e5ddb7 + checksum: 10c0/1dce7b0f3d1a91c9e6c37200627b5a9ffa943916bb5879dfaa800c3929fcc11b9bfcc2a6097f49ec3462b254b7afcbcf63caeae6895f53c80122523dc9e5ddb7 languageName: node linkType: hard "stylis@npm:4.2.0": version: 4.2.0 resolution: "stylis@npm:4.2.0" - checksum: a7128ad5a8ed72652c6eba46bed4f416521bc9745a460ef5741edc725252cebf36ee45e33a8615a7057403c93df0866ab9ee955960792db210bb80abd5ac6543 + checksum: 10c0/a7128ad5a8ed72652c6eba46bed4f416521bc9745a460ef5741edc725252cebf36ee45e33a8615a7057403c93df0866ab9ee955960792db210bb80abd5ac6543 languageName: node linkType: hard @@ -7911,7 +7911,7 @@ __metadata: resolution: "supports-color@npm:5.5.0" dependencies: has-flag: "npm:^3.0.0" - checksum: 6ae5ff319bfbb021f8a86da8ea1f8db52fac8bd4d499492e30ec17095b58af11f0c55f8577390a749b1c4dde691b6a0315dab78f5f54c9b3d83f8fb5905c1c05 + checksum: 10c0/6ae5ff319bfbb021f8a86da8ea1f8db52fac8bd4d499492e30ec17095b58af11f0c55f8577390a749b1c4dde691b6a0315dab78f5f54c9b3d83f8fb5905c1c05 languageName: node linkType: hard @@ -7920,14 +7920,14 @@ __metadata: resolution: "supports-color@npm:7.2.0" dependencies: has-flag: "npm:^4.0.0" - checksum: afb4c88521b8b136b5f5f95160c98dee7243dc79d5432db7efc27efb219385bbc7d9427398e43dd6cc730a0f87d5085ce1652af7efbe391327bc0a7d0f7fc124 + checksum: 10c0/afb4c88521b8b136b5f5f95160c98dee7243dc79d5432db7efc27efb219385bbc7d9427398e43dd6cc730a0f87d5085ce1652af7efbe391327bc0a7d0f7fc124 languageName: node linkType: hard "supports-preserve-symlinks-flag@npm:^1.0.0": version: 1.0.0 resolution: "supports-preserve-symlinks-flag@npm:1.0.0" - checksum: 6c4032340701a9950865f7ae8ef38578d8d7053f5e10518076e6554a9381fa91bd9c6850193695c141f32b21f979c985db07265a758867bac95de05f7d8aeb39 + checksum: 10c0/6c4032340701a9950865f7ae8ef38578d8d7053f5e10518076e6554a9381fa91bd9c6850193695c141f32b21f979c985db07265a758867bac95de05f7d8aeb39 languageName: node linkType: hard @@ -7937,14 +7937,14 @@ __metadata: dependencies: "@pkgr/core": "npm:^0.1.0" tslib: "npm:^2.6.2" - checksum: c3d3aa8e284f3f84f2f868b960c9f49239b364e35f6d20825a448449a3e9c8f49fe36cdd5196b30615682f007830d46f2ea354003954c7336723cb821e4b6519 + checksum: 10c0/c3d3aa8e284f3f84f2f868b960c9f49239b364e35f6d20825a448449a3e9c8f49fe36cdd5196b30615682f007830d46f2ea354003954c7336723cb821e4b6519 languageName: node linkType: hard "tapable@npm:^2.2.0": version: 2.2.1 resolution: "tapable@npm:2.2.1" - checksum: bc40e6efe1e554d075469cedaba69a30eeb373552aaf41caeaaa45bf56ffacc2674261b106245bd566b35d8f3329b52d838e851ee0a852120acae26e622925c9 + checksum: 10c0/bc40e6efe1e554d075469cedaba69a30eeb373552aaf41caeaaa45bf56ffacc2674261b106245bd566b35d8f3329b52d838e851ee0a852120acae26e622925c9 languageName: node linkType: hard @@ -7958,14 +7958,14 @@ __metadata: minizlib: "npm:^2.1.1" mkdirp: "npm:^1.0.3" yallist: "npm:^4.0.0" - checksum: bb2babe7b14442f690d83c2b2c571c9dd0bf802314773e05f4a3e4a241fdecd7fb560b8e4e7d6ea34533c8cd692e1b8418a3b8ba3b9687fe78a683dfbad7f82d + checksum: 10c0/bb2babe7b14442f690d83c2b2c571c9dd0bf802314773e05f4a3e4a241fdecd7fb560b8e4e7d6ea34533c8cd692e1b8418a3b8ba3b9687fe78a683dfbad7f82d languageName: node linkType: hard "temp-dir@npm:^2.0.0": version: 2.0.0 resolution: "temp-dir@npm:2.0.0" - checksum: b1df969e3f3f7903f3426861887ed76ba3b495f63f6d0c8e1ce22588679d9384d336df6064210fda14e640ed422e2a17d5c40d901f60e161c99482d723f4d309 + checksum: 10c0/b1df969e3f3f7903f3426861887ed76ba3b495f63f6d0c8e1ce22588679d9384d336df6064210fda14e640ed422e2a17d5c40d901f60e161c99482d723f4d309 languageName: node linkType: hard @@ -7977,7 +7977,7 @@ __metadata: temp-dir: "npm:^2.0.0" type-fest: "npm:^0.16.0" unique-string: "npm:^2.0.0" - checksum: ca0882276732d1313b85006b0427620cb4a8d7a57738a2311a72befae60ed152be7d5b41b951dcb447a01a35404bed76f33eb4e37c55263cd7f807eee1187f8f + checksum: 10c0/ca0882276732d1313b85006b0427620cb4a8d7a57738a2311a72befae60ed152be7d5b41b951dcb447a01a35404bed76f33eb4e37c55263cd7f807eee1187f8f languageName: node linkType: hard @@ -7991,21 +7991,21 @@ __metadata: source-map-support: "npm:~0.5.20" bin: terser: bin/terser - checksum: 95817b86619af33d8d143d7ae02dfcd9ac2cf4ea5b5cb7b208aaccff4cdc5594893960a4c3dcdac09863ebd43e2835ab173997041790aa77092c1d31ff40c95a + checksum: 10c0/95817b86619af33d8d143d7ae02dfcd9ac2cf4ea5b5cb7b208aaccff4cdc5594893960a4c3dcdac09863ebd43e2835ab173997041790aa77092c1d31ff40c95a languageName: node linkType: hard "text-table@npm:^0.2.0": version: 0.2.0 resolution: "text-table@npm:0.2.0" - checksum: 02805740c12851ea5982686810702e2f14369a5f4c5c40a836821e3eefc65ffeec3131ba324692a37608294b0fd8c1e55a2dd571ffed4909822787668ddbee5c + checksum: 10c0/02805740c12851ea5982686810702e2f14369a5f4c5c40a836821e3eefc65ffeec3131ba324692a37608294b0fd8c1e55a2dd571ffed4909822787668ddbee5c languageName: node linkType: hard "to-fast-properties@npm:^2.0.0": version: 2.0.0 resolution: "to-fast-properties@npm:2.0.0" - checksum: b214d21dbfb4bce3452b6244b336806ffea9c05297148d32ebb428d5c43ce7545bdfc65a1ceb58c9ef4376a65c0cb2854d645f33961658b3e3b4f84910ddcdd7 + checksum: 10c0/b214d21dbfb4bce3452b6244b336806ffea9c05297148d32ebb428d5c43ce7545bdfc65a1ceb58c9ef4376a65c0cb2854d645f33961658b3e3b4f84910ddcdd7 languageName: node linkType: hard @@ -8014,7 +8014,7 @@ __metadata: resolution: "to-regex-range@npm:5.0.1" dependencies: is-number: "npm:^7.0.0" - checksum: 487988b0a19c654ff3e1961b87f471702e708fa8a8dd02a298ef16da7206692e8552a0250e8b3e8759270f62e9d8314616f6da274734d3b558b1fc7b7724e892 + checksum: 10c0/487988b0a19c654ff3e1961b87f471702e708fa8a8dd02a298ef16da7206692e8552a0250e8b3e8759270f62e9d8314616f6da274734d3b558b1fc7b7724e892 languageName: node linkType: hard @@ -8023,14 +8023,14 @@ __metadata: resolution: "tr46@npm:1.0.1" dependencies: punycode: "npm:^2.1.0" - checksum: 41525c2ccce86e3ef30af6fa5e1464e6d8bb4286a58ea8db09228f598889581ef62347153f6636cd41553dc41685bdfad0a9d032ef58df9fbb0792b3447d0f04 + checksum: 10c0/41525c2ccce86e3ef30af6fa5e1464e6d8bb4286a58ea8db09228f598889581ef62347153f6636cd41553dc41685bdfad0a9d032ef58df9fbb0792b3447d0f04 languageName: node linkType: hard "tr46@npm:~0.0.3": version: 0.0.3 resolution: "tr46@npm:0.0.3" - checksum: 047cb209a6b60c742f05c9d3ace8fa510bff609995c129a37ace03476a9b12db4dbf975e74600830ef0796e18882b2381fb5fb1f6b4f96b832c374de3ab91a11 + checksum: 10c0/047cb209a6b60c742f05c9d3ace8fa510bff609995c129a37ace03476a9b12db4dbf975e74600830ef0796e18882b2381fb5fb1f6b4f96b832c374de3ab91a11 languageName: node linkType: hard @@ -8039,7 +8039,7 @@ __metadata: resolution: "ts-api-utils@npm:1.0.1" peerDependencies: typescript: ">=4.2.0" - checksum: 8e8a54afb44df31c413e6f5b817a305a37780726125db26e85d01d553efc31aacb3ccad111a14844b584776f24e71bcd4db2f2d3e9bce8031a329dc78f3e46e2 + checksum: 10c0/8e8a54afb44df31c413e6f5b817a305a37780726125db26e85d01d553efc31aacb3ccad111a14844b584776f24e71bcd4db2f2d3e9bce8031a329dc78f3e46e2 languageName: node linkType: hard @@ -8051,14 +8051,14 @@ __metadata: json5: "npm:^1.0.2" minimist: "npm:^1.2.6" strip-bom: "npm:^3.0.0" - checksum: 5b4f301a2b7a3766a986baf8fc0e177eb80bdba6e396792ff92dc23b5bca8bb279fc96517dcaaef63a3b49bebc6c4c833653ec58155780bc906bdbcf7dda0ef5 + checksum: 10c0/5b4f301a2b7a3766a986baf8fc0e177eb80bdba6e396792ff92dc23b5bca8bb279fc96517dcaaef63a3b49bebc6c4c833653ec58155780bc906bdbcf7dda0ef5 languageName: node linkType: hard "tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.6.2": version: 2.6.2 resolution: "tslib@npm:2.6.2" - checksum: e03a8a4271152c8b26604ed45535954c0a45296e32445b4b87f8a5abdb2421f40b59b4ca437c4346af0f28179780d604094eb64546bee2019d903d01c6c19bdb + checksum: 10c0/e03a8a4271152c8b26604ed45535954c0a45296e32445b4b87f8a5abdb2421f40b59b4ca437c4346af0f28179780d604094eb64546bee2019d903d01c6c19bdb languageName: node linkType: hard @@ -8067,21 +8067,21 @@ __metadata: resolution: "type-check@npm:0.4.0" dependencies: prelude-ls: "npm:^1.2.1" - checksum: 7b3fd0ed43891e2080bf0c5c504b418fbb3e5c7b9708d3d015037ba2e6323a28152ec163bcb65212741fa5d2022e3075ac3c76440dbd344c9035f818e8ecee58 + checksum: 10c0/7b3fd0ed43891e2080bf0c5c504b418fbb3e5c7b9708d3d015037ba2e6323a28152ec163bcb65212741fa5d2022e3075ac3c76440dbd344c9035f818e8ecee58 languageName: node linkType: hard "type-fest@npm:^0.16.0": version: 0.16.0 resolution: "type-fest@npm:0.16.0" - checksum: 6b4d846534e7bcb49a6160b068ffaed2b62570d989d909ac3f29df5ef1e993859f890a4242eebe023c9e923f96adbcb3b3e88a198c35a1ee9a731e147a6839c3 + checksum: 10c0/6b4d846534e7bcb49a6160b068ffaed2b62570d989d909ac3f29df5ef1e993859f890a4242eebe023c9e923f96adbcb3b3e88a198c35a1ee9a731e147a6839c3 languageName: node linkType: hard "type-fest@npm:^0.20.2": version: 0.20.2 resolution: "type-fest@npm:0.20.2" - checksum: dea9df45ea1f0aaa4e2d3bed3f9a0bfe9e5b2592bddb92eb1bf06e50bcf98dbb78189668cd8bc31a0511d3fc25539b4cd5c704497e53e93e2d40ca764b10bfc3 + checksum: 10c0/dea9df45ea1f0aaa4e2d3bed3f9a0bfe9e5b2592bddb92eb1bf06e50bcf98dbb78189668cd8bc31a0511d3fc25539b4cd5c704497e53e93e2d40ca764b10bfc3 languageName: node linkType: hard @@ -8092,7 +8092,7 @@ __metadata: call-bind: "npm:^1.0.2" get-intrinsic: "npm:^1.2.1" is-typed-array: "npm:^1.1.10" - checksum: ebad66cdf00c96b1395dffc7873169cf09801fca5954507a484f41f253feb1388d815db297b0b3bb8ce7421eac6f7ff45e2ec68450a3d68408aa4ae02fcf3a6c + checksum: 10c0/ebad66cdf00c96b1395dffc7873169cf09801fca5954507a484f41f253feb1388d815db297b0b3bb8ce7421eac6f7ff45e2ec68450a3d68408aa4ae02fcf3a6c languageName: node linkType: hard @@ -8104,7 +8104,7 @@ __metadata: for-each: "npm:^0.3.3" has-proto: "npm:^1.0.1" is-typed-array: "npm:^1.1.10" - checksum: 6696435d53ce0e704ff6760c57ccc35138aec5f87859e03eb2a3246336d546feae367952dbc918116f3f0dffbe669734e3cbd8960283c2fa79aac925db50d888 + checksum: 10c0/6696435d53ce0e704ff6760c57ccc35138aec5f87859e03eb2a3246336d546feae367952dbc918116f3f0dffbe669734e3cbd8960283c2fa79aac925db50d888 languageName: node linkType: hard @@ -8117,7 +8117,7 @@ __metadata: for-each: "npm:^0.3.3" has-proto: "npm:^1.0.1" is-typed-array: "npm:^1.1.10" - checksum: 4036ce007ae9752931bed3dd61e0d6de2a3e5f6a5a85a05f3adb35388d2c0728f9b1a1e638d75579f168e49c289bfb5417f00e96d4ab081f38b647fc854ff7a5 + checksum: 10c0/4036ce007ae9752931bed3dd61e0d6de2a3e5f6a5a85a05f3adb35388d2c0728f9b1a1e638d75579f168e49c289bfb5417f00e96d4ab081f38b647fc854ff7a5 languageName: node linkType: hard @@ -8128,7 +8128,7 @@ __metadata: call-bind: "npm:^1.0.2" for-each: "npm:^0.3.3" is-typed-array: "npm:^1.1.9" - checksum: c5163c0103d07fefc8a2ad0fc151f9ca9a1f6422098c00f695d55f9896e4d63614cd62cf8d8a031c6cee5f418e8980a533796597174da4edff075b3d275a7e23 + checksum: 10c0/c5163c0103d07fefc8a2ad0fc151f9ca9a1f6422098c00f695d55f9896e4d63614cd62cf8d8a031c6cee5f418e8980a533796597174da4edff075b3d275a7e23 languageName: node linkType: hard @@ -8138,7 +8138,7 @@ __metadata: bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: e33cef99d82573624fc0f854a2980322714986bc35b9cb4d1ce736ed182aeab78e2cb32b385efa493b2a976ef52c53e20d6c6918312353a91850e2b76f1ea44f + checksum: 10c0/e33cef99d82573624fc0f854a2980322714986bc35b9cb4d1ce736ed182aeab78e2cb32b385efa493b2a976ef52c53e20d6c6918312353a91850e2b76f1ea44f languageName: node linkType: hard @@ -8148,7 +8148,7 @@ __metadata: bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 1d0a5f4ce496c42caa9a30e659c467c5686eae15d54b027ee7866744952547f1be1262f2d40de911618c242b510029d51d43ff605dba8fb740ec85ca2d3f9500 + checksum: 10c0/1d0a5f4ce496c42caa9a30e659c467c5686eae15d54b027ee7866744952547f1be1262f2d40de911618c242b510029d51d43ff605dba8fb740ec85ca2d3f9500 languageName: node linkType: hard @@ -8160,21 +8160,21 @@ __metadata: has-bigints: "npm:^1.0.2" has-symbols: "npm:^1.0.3" which-boxed-primitive: "npm:^1.0.2" - checksum: 81ca2e81134167cc8f75fa79fbcc8a94379d6c61de67090986a2273850989dd3bae8440c163121b77434b68263e34787a675cbdcb34bb2f764c6b9c843a11b66 + checksum: 10c0/81ca2e81134167cc8f75fa79fbcc8a94379d6c61de67090986a2273850989dd3bae8440c163121b77434b68263e34787a675cbdcb34bb2f764c6b9c843a11b66 languageName: node linkType: hard "undici-types@npm:~5.26.4": version: 5.26.5 resolution: "undici-types@npm:5.26.5" - checksum: bb673d7876c2d411b6eb6c560e0c571eef4a01c1c19925175d16e3a30c4c428181fb8d7ae802a261f283e4166a0ac435e2f505743aa9e45d893f9a3df017b501 + checksum: 10c0/bb673d7876c2d411b6eb6c560e0c571eef4a01c1c19925175d16e3a30c4c428181fb8d7ae802a261f283e4166a0ac435e2f505743aa9e45d893f9a3df017b501 languageName: node linkType: hard "unicode-canonical-property-names-ecmascript@npm:^2.0.0": version: 2.0.0 resolution: "unicode-canonical-property-names-ecmascript@npm:2.0.0" - checksum: 0fe812641bcfa3ae433025178a64afb5d9afebc21a922dafa7cba971deebb5e4a37350423890750132a85c936c290fb988146d0b1bd86838ad4897f4fc5bd0de + checksum: 10c0/0fe812641bcfa3ae433025178a64afb5d9afebc21a922dafa7cba971deebb5e4a37350423890750132a85c936c290fb988146d0b1bd86838ad4897f4fc5bd0de languageName: node linkType: hard @@ -8184,21 +8184,21 @@ __metadata: dependencies: unicode-canonical-property-names-ecmascript: "npm:^2.0.0" unicode-property-aliases-ecmascript: "npm:^2.0.0" - checksum: 4d05252cecaf5c8e36d78dc5332e03b334c6242faf7cf16b3658525441386c0a03b5f603d42cbec0f09bb63b9fd25c9b3b09667aee75463cac3efadae2cd17ec + checksum: 10c0/4d05252cecaf5c8e36d78dc5332e03b334c6242faf7cf16b3658525441386c0a03b5f603d42cbec0f09bb63b9fd25c9b3b09667aee75463cac3efadae2cd17ec languageName: node linkType: hard "unicode-match-property-value-ecmascript@npm:^2.1.0": version: 2.1.0 resolution: "unicode-match-property-value-ecmascript@npm:2.1.0" - checksum: f5b9499b9e0ffdc6027b744d528f17ec27dd7c15da03254ed06851feec47e0531f20d410910c8a49af4a6a190f4978413794c8d75ce112950b56d583b5d5c7f2 + checksum: 10c0/f5b9499b9e0ffdc6027b744d528f17ec27dd7c15da03254ed06851feec47e0531f20d410910c8a49af4a6a190f4978413794c8d75ce112950b56d583b5d5c7f2 languageName: node linkType: hard "unicode-property-aliases-ecmascript@npm:^2.0.0": version: 2.1.0 resolution: "unicode-property-aliases-ecmascript@npm:2.1.0" - checksum: 50ded3f8c963c7785e48c510a3b7c6bc4e08a579551489aa0349680a35b1ceceec122e33b2b6c1b579d0be2250f34bb163ac35f5f8695fe10bbc67fb757f0af8 + checksum: 10c0/50ded3f8c963c7785e48c510a3b7c6bc4e08a579551489aa0349680a35b1ceceec122e33b2b6c1b579d0be2250f34bb163ac35f5f8695fe10bbc67fb757f0af8 languageName: node linkType: hard @@ -8207,7 +8207,7 @@ __metadata: resolution: "unique-filename@npm:3.0.0" dependencies: unique-slug: "npm:^4.0.0" - checksum: 6363e40b2fa758eb5ec5e21b3c7fb83e5da8dcfbd866cc0c199d5534c42f03b9ea9ab069769cc388e1d7ab93b4eeef28ef506ab5f18d910ef29617715101884f + checksum: 10c0/6363e40b2fa758eb5ec5e21b3c7fb83e5da8dcfbd866cc0c199d5534c42f03b9ea9ab069769cc388e1d7ab93b4eeef28ef506ab5f18d910ef29617715101884f languageName: node linkType: hard @@ -8216,7 +8216,7 @@ __metadata: resolution: "unique-slug@npm:4.0.0" dependencies: imurmurhash: "npm:^0.1.4" - checksum: cb811d9d54eb5821b81b18205750be84cb015c20a4a44280794e915f5a0a70223ce39066781a354e872df3572e8155c228f43ff0cce94c7cbf4da2cc7cbdd635 + checksum: 10c0/cb811d9d54eb5821b81b18205750be84cb015c20a4a44280794e915f5a0a70223ce39066781a354e872df3572e8155c228f43ff0cce94c7cbf4da2cc7cbdd635 languageName: node linkType: hard @@ -8225,21 +8225,21 @@ __metadata: resolution: "unique-string@npm:2.0.0" dependencies: crypto-random-string: "npm:^2.0.0" - checksum: 11820db0a4ba069d174bedfa96c588fc2c96b083066fafa186851e563951d0de78181ac79c744c1ed28b51f9d82ac5b8196ff3e4560d0178046ef455d8c2244b + checksum: 10c0/11820db0a4ba069d174bedfa96c588fc2c96b083066fafa186851e563951d0de78181ac79c744c1ed28b51f9d82ac5b8196ff3e4560d0178046ef455d8c2244b languageName: node linkType: hard "universalify@npm:^2.0.0": version: 2.0.0 resolution: "universalify@npm:2.0.0" - checksum: 07092b9f46df61b823d8ab5e57f0ee5120c178b39609a95e4a15a98c42f6b0b8e834e66fbb47ff92831786193be42f1fd36347169b88ce8639d0f9670af24a71 + checksum: 10c0/07092b9f46df61b823d8ab5e57f0ee5120c178b39609a95e4a15a98c42f6b0b8e834e66fbb47ff92831786193be42f1fd36347169b88ce8639d0f9670af24a71 languageName: node linkType: hard "upath@npm:^1.2.0": version: 1.2.0 resolution: "upath@npm:1.2.0" - checksum: 3746f24099bf69dbf8234cecb671e1016e1f6b26bd306de4ff8966fb0bc463fa1014ffc48646b375de1ab573660e3a0256f6f2a87218b2dfa1779a84ef6992fa + checksum: 10c0/3746f24099bf69dbf8234cecb671e1016e1f6b26bd306de4ff8966fb0bc463fa1014ffc48646b375de1ab573660e3a0256f6f2a87218b2dfa1779a84ef6992fa languageName: node linkType: hard @@ -8253,7 +8253,7 @@ __metadata: browserslist: ">= 4.21.0" bin: update-browserslist-db: cli.js - checksum: 280d5cf92e302d8de0c12ef840a6af26ec024a5158aa2020975cd01bf0ded09c709793a6f421e6d0f1a47557d6a1a10dc43af80f9c30b8fd0df9691eb98c1c69 + checksum: 10c0/280d5cf92e302d8de0c12ef840a6af26ec024a5158aa2020975cd01bf0ded09c709793a6f421e6d0f1a47557d6a1a10dc43af80f9c30b8fd0df9691eb98c1c69 languageName: node linkType: hard @@ -8262,7 +8262,7 @@ __metadata: resolution: "uri-js@npm:4.4.1" dependencies: punycode: "npm:^2.1.0" - checksum: 4ef57b45aa820d7ac6496e9208559986c665e49447cb072744c13b66925a362d96dd5a46c4530a6b8e203e5db5fe849369444440cb22ecfc26c679359e5dfa3c + checksum: 10c0/4ef57b45aa820d7ac6496e9208559986c665e49447cb072744c13b66925a362d96dd5a46c4530a6b8e203e5db5fe849369444440cb22ecfc26c679359e5dfa3c languageName: node linkType: hard @@ -8271,14 +8271,14 @@ __metadata: resolution: "use-sync-external-store@npm:1.2.0" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: ac4814e5592524f242921157e791b022efe36e451fe0d4fd4d204322d5433a4fc300d63b0ade5185f8e0735ded044c70bcf6d2352db0f74d097a238cebd2da02 + checksum: 10c0/ac4814e5592524f242921157e791b022efe36e451fe0d4fd4d204322d5433a4fc300d63b0ade5185f8e0735ded044c70bcf6d2352db0f74d097a238cebd2da02 languageName: node linkType: hard "util-deprecate@npm:^1.0.1": version: 1.0.2 resolution: "util-deprecate@npm:1.0.2" - checksum: 41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942 + checksum: 10c0/41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942 languageName: node linkType: hard @@ -8291,13 +8291,13 @@ __metadata: is-generator-function: "npm:^1.0.7" is-typed-array: "npm:^1.1.3" which-typed-array: "npm:^1.1.2" - checksum: c27054de2cea2229a66c09522d0fa1415fb12d861d08523a8846bf2e4cbf0079d4c3f725f09dcb87493549bcbf05f5798dce1688b53c6c17201a45759e7253f3 + checksum: 10c0/c27054de2cea2229a66c09522d0fa1415fb12d861d08523a8846bf2e4cbf0079d4c3f725f09dcb87493549bcbf05f5798dce1688b53c6c17201a45759e7253f3 languageName: node linkType: hard -"vite-plugin-pwa@npm:^0.17.5": - version: 0.17.5 - resolution: "vite-plugin-pwa@npm:0.17.5" +"vite-plugin-pwa@npm:^0.19.0": + version: 0.19.0 + resolution: "vite-plugin-pwa@npm:0.19.0" dependencies: debug: "npm:^4.3.4" fast-glob: "npm:^3.3.2" @@ -8305,20 +8305,24 @@ __metadata: workbox-build: "npm:^7.0.0" workbox-window: "npm:^7.0.0" peerDependencies: + "@vite-pwa/assets-generator": ^0.2.4 vite: ^3.1.0 || ^4.0.0 || ^5.0.0 workbox-build: ^7.0.0 workbox-window: ^7.0.0 - checksum: 08c1916066a6493010c180af3c563da257ab63bbd7bfe96d6a95e837360815269aad74bf437a668488d4c7c207ba6a559c1decc75d85b961214323fb8ba92226 + peerDependenciesMeta: + "@vite-pwa/assets-generator": + optional: true + checksum: 10c0/fb6d24427469a29051abb2e76287eea495dc524187df70b3e3de81013728b9d28ed87bda1e5e61c4655c6da3143ea58e25a041839ab64818a6db19a34133aed4 languageName: node linkType: hard -"vite@npm:^5.0.12": - version: 5.0.12 - resolution: "vite@npm:5.0.12" +"vite@npm:^5.1.3": + version: 5.1.3 + resolution: "vite@npm:5.1.3" dependencies: esbuild: "npm:^0.19.3" fsevents: "npm:~2.3.3" - postcss: "npm:^8.4.32" + postcss: "npm:^8.4.35" rollup: "npm:^4.2.0" peerDependencies: "@types/node": ^18.0.0 || >=20.0.0 @@ -8348,35 +8352,35 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: c51b8e458851943c903fddde6973e720099ef8a5f364fb107cddade59c9e90f6d9ad98b61a7419cdfa0c6374236e10bff965d0c2d9e7b1790c68b874e5e7950c + checksum: 10c0/d3b19607d736de60b660f7daf4c0f86589edcbbc1fcb09f8aa36630f99518cc8a063062bb952899b8ccaed62f1314fac22c1df492dd035de3c65998ab27e2d2a languageName: node linkType: hard "w3c-keyname@npm:^2.2.4": version: 2.2.8 resolution: "w3c-keyname@npm:2.2.8" - checksum: 37cf335c90efff31672ebb345577d681e2177f7ff9006a9ad47c68c5a9d265ba4a7b39d6c2599ceea639ca9315584ce4bd9c9fbf7a7217bfb7a599e71943c4c4 + checksum: 10c0/37cf335c90efff31672ebb345577d681e2177f7ff9006a9ad47c68c5a9d265ba4a7b39d6c2599ceea639ca9315584ce4bd9c9fbf7a7217bfb7a599e71943c4c4 languageName: node linkType: hard "webidl-conversions@npm:^3.0.0": version: 3.0.1 resolution: "webidl-conversions@npm:3.0.1" - checksum: 5612d5f3e54760a797052eb4927f0ddc01383550f542ccd33d5238cfd65aeed392a45ad38364970d0a0f4fea32e1f4d231b3d8dac4a3bdd385e5cf802ae097db + checksum: 10c0/5612d5f3e54760a797052eb4927f0ddc01383550f542ccd33d5238cfd65aeed392a45ad38364970d0a0f4fea32e1f4d231b3d8dac4a3bdd385e5cf802ae097db languageName: node linkType: hard "webidl-conversions@npm:^4.0.2": version: 4.0.2 resolution: "webidl-conversions@npm:4.0.2" - checksum: def5c5ac3479286dffcb604547628b2e6b46c5c5b8a8cfaa8c71dc3bafc85859bde5fbe89467ff861f571ab38987cf6ab3d6e7c80b39b999e50e803c12f3164f + checksum: 10c0/def5c5ac3479286dffcb604547628b2e6b46c5c5b8a8cfaa8c71dc3bafc85859bde5fbe89467ff861f571ab38987cf6ab3d6e7c80b39b999e50e803c12f3164f languageName: node linkType: hard "whatwg-fetch@npm:^3.4.1": version: 3.6.19 resolution: "whatwg-fetch@npm:3.6.19" - checksum: 01dd755492d594c8d71d47811bb3886cdb7d566684daff5ec658cf148fa2418de6b562a94ff8cceaf1cf277bfb99fa6b61258cc20de5053f5817a4d419b5d293 + checksum: 10c0/01dd755492d594c8d71d47811bb3886cdb7d566684daff5ec658cf148fa2418de6b562a94ff8cceaf1cf277bfb99fa6b61258cc20de5053f5817a4d419b5d293 languageName: node linkType: hard @@ -8386,7 +8390,7 @@ __metadata: dependencies: tr46: "npm:~0.0.3" webidl-conversions: "npm:^3.0.0" - checksum: 1588bed84d10b72d5eec1d0faa0722ba1962f1821e7539c535558fb5398d223b0c50d8acab950b8c488b4ba69043fd833cc2697056b167d8ad46fac3995a55d5 + checksum: 10c0/1588bed84d10b72d5eec1d0faa0722ba1962f1821e7539c535558fb5398d223b0c50d8acab950b8c488b4ba69043fd833cc2697056b167d8ad46fac3995a55d5 languageName: node linkType: hard @@ -8397,7 +8401,7 @@ __metadata: lodash.sortby: "npm:^4.7.0" tr46: "npm:^1.0.1" webidl-conversions: "npm:^4.0.2" - checksum: 2785fe4647690e5a0225a79509ba5e21fdf4a71f9de3eabdba1192483fe006fc79961198e0b99f82751557309f17fc5a07d4d83c251aa5b2f85ba71e674cbee9 + checksum: 10c0/2785fe4647690e5a0225a79509ba5e21fdf4a71f9de3eabdba1192483fe006fc79961198e0b99f82751557309f17fc5a07d4d83c251aa5b2f85ba71e674cbee9 languageName: node linkType: hard @@ -8410,7 +8414,7 @@ __metadata: is-number-object: "npm:^1.0.4" is-string: "npm:^1.0.5" is-symbol: "npm:^1.0.3" - checksum: 0a62a03c00c91dd4fb1035b2f0733c341d805753b027eebd3a304b9cb70e8ce33e25317add2fe9b5fea6f53a175c0633ae701ff812e604410ddd049777cd435e + checksum: 10c0/0a62a03c00c91dd4fb1035b2f0733c341d805753b027eebd3a304b9cb70e8ce33e25317add2fe9b5fea6f53a175c0633ae701ff812e604410ddd049777cd435e languageName: node linkType: hard @@ -8430,7 +8434,7 @@ __metadata: which-boxed-primitive: "npm:^1.0.2" which-collection: "npm:^1.0.1" which-typed-array: "npm:^1.1.9" - checksum: 2b7b234df3443b52f4fbd2b65b731804de8d30bcc4210ec84107ef377a81923cea7f2763b7fb78b394175cea59118bf3c41b9ffd2d643cb1d748ef93b33b6bd4 + checksum: 10c0/2b7b234df3443b52f4fbd2b65b731804de8d30bcc4210ec84107ef377a81923cea7f2763b7fb78b394175cea59118bf3c41b9ffd2d643cb1d748ef93b33b6bd4 languageName: node linkType: hard @@ -8442,7 +8446,7 @@ __metadata: is-set: "npm:^2.0.1" is-weakmap: "npm:^2.0.1" is-weakset: "npm:^2.0.1" - checksum: 249f913e1758ed2f06f00706007d87dc22090a80591a56917376e70ecf8fc9ab6c41d98e1c87208bb9648676f65d4b09c0e4d23c56c7afb0f0a73a27d701df5d + checksum: 10c0/249f913e1758ed2f06f00706007d87dc22090a80591a56917376e70ecf8fc9ab6c41d98e1c87208bb9648676f65d4b09c0e4d23c56c7afb0f0a73a27d701df5d languageName: node linkType: hard @@ -8455,7 +8459,7 @@ __metadata: for-each: "npm:^0.3.3" gopd: "npm:^1.0.1" has-tostringtag: "npm:^1.0.0" - checksum: 9f5f1c42918df3d5b91c4315ed0051d5d874370998bf095c9ae0df374f0881f85094e3c384b8fb08ab7b4d4f54ba81c0aff75da6226e7c0589b83dfbec1cd4c9 + checksum: 10c0/9f5f1c42918df3d5b91c4315ed0051d5d874370998bf095c9ae0df374f0881f85094e3c384b8fb08ab7b4d4f54ba81c0aff75da6226e7c0589b83dfbec1cd4c9 languageName: node linkType: hard @@ -8466,7 +8470,7 @@ __metadata: isexe: "npm:^2.0.0" bin: node-which: ./bin/node-which - checksum: 66522872a768b60c2a65a57e8ad184e5372f5b6a9ca6d5f033d4b0dc98aff63995655a7503b9c0a2598936f532120e81dd8cc155e2e92ed662a2b9377cc4374f + checksum: 10c0/66522872a768b60c2a65a57e8ad184e5372f5b6a9ca6d5f033d4b0dc98aff63995655a7503b9c0a2598936f532120e81dd8cc155e2e92ed662a2b9377cc4374f languageName: node linkType: hard @@ -8475,7 +8479,7 @@ __metadata: resolution: "wide-align@npm:1.1.5" dependencies: string-width: "npm:^1.0.2 || 2 || 3 || 4" - checksum: 1d9c2a3e36dfb09832f38e2e699c367ef190f96b82c71f809bc0822c306f5379df87bab47bed27ea99106d86447e50eb972d3c516c2f95782807a9d082fbea95 + checksum: 10c0/1d9c2a3e36dfb09832f38e2e699c367ef190f96b82c71f809bc0822c306f5379df87bab47bed27ea99106d86447e50eb972d3c516c2f95782807a9d082fbea95 languageName: node linkType: hard @@ -8485,7 +8489,7 @@ __metadata: dependencies: idb: "npm:^7.0.1" workbox-core: "npm:7.0.0" - checksum: 91eb064c608cfb4cf7aa4f062215d8217a99b93d67c4ae571e5abdda1b020c5ab45c7bddab99cb77d334aae8d259f0fe91b7c42ee6e7ad10db32b4a971991489 + checksum: 10c0/91eb064c608cfb4cf7aa4f062215d8217a99b93d67c4ae571e5abdda1b020c5ab45c7bddab99cb77d334aae8d259f0fe91b7c42ee6e7ad10db32b4a971991489 languageName: node linkType: hard @@ -8494,7 +8498,7 @@ __metadata: resolution: "workbox-broadcast-update@npm:7.0.0" dependencies: workbox-core: "npm:7.0.0" - checksum: 3c3a6e1e72c19d2971d187297b99b242f304b1ec442f6f1ec84ea9c6e125dc01cd626d51e6ecf1c8d89226e6a286dccaa9f950bd5ef6183518af10ba0f4f524e + checksum: 10c0/3c3a6e1e72c19d2971d187297b99b242f304b1ec442f6f1ec84ea9c6e125dc01cd626d51e6ecf1c8d89226e6a286dccaa9f950bd5ef6183518af10ba0f4f524e languageName: node linkType: hard @@ -8539,7 +8543,7 @@ __metadata: workbox-streams: "npm:7.0.0" workbox-sw: "npm:7.0.0" workbox-window: "npm:7.0.0" - checksum: a090aeee836f59d42ca9eda8b82aa5a0ee8f4ce3f3095b6fcbe157a9a154c492e4ba86b5c4d6aa50ef7c37ea1c38c965442b56d1404911fd0351d0fc9a859a3c + checksum: 10c0/a090aeee836f59d42ca9eda8b82aa5a0ee8f4ce3f3095b6fcbe157a9a154c492e4ba86b5c4d6aa50ef7c37ea1c38c965442b56d1404911fd0351d0fc9a859a3c languageName: node linkType: hard @@ -8548,14 +8552,14 @@ __metadata: resolution: "workbox-cacheable-response@npm:7.0.0" dependencies: workbox-core: "npm:7.0.0" - checksum: ddf123b3461070e215af51d88c672f3302b540b93ecf61ad5f3853f0a997194973eedb2c9ed21e849b7419f68804ef8a8d876dced3836a7eb2c697099e3d408f + checksum: 10c0/ddf123b3461070e215af51d88c672f3302b540b93ecf61ad5f3853f0a997194973eedb2c9ed21e849b7419f68804ef8a8d876dced3836a7eb2c697099e3d408f languageName: node linkType: hard "workbox-core@npm:7.0.0": version: 7.0.0 resolution: "workbox-core@npm:7.0.0" - checksum: aaaf7b66978456bf5d6a90b1068b5acd82bf451f4a23c5a416201524b50ea4e0bc62a01365499bc088b4c18cddc513fdebbe8b048ab15aff960fe7cbbf55d5bd + checksum: 10c0/aaaf7b66978456bf5d6a90b1068b5acd82bf451f4a23c5a416201524b50ea4e0bc62a01365499bc088b4c18cddc513fdebbe8b048ab15aff960fe7cbbf55d5bd languageName: node linkType: hard @@ -8565,7 +8569,7 @@ __metadata: dependencies: idb: "npm:^7.0.1" workbox-core: "npm:7.0.0" - checksum: 990a6c2c9b177d796c012b0112913621e41b283e2736d83acb58cb9645591ddc7a6aef585145c5686f9b071d73ce12b4b1887765754624322545b0f4125d649f + checksum: 10c0/990a6c2c9b177d796c012b0112913621e41b283e2736d83acb58cb9645591ddc7a6aef585145c5686f9b071d73ce12b4b1887765754624322545b0f4125d649f languageName: node linkType: hard @@ -8577,7 +8581,7 @@ __metadata: workbox-core: "npm:7.0.0" workbox-routing: "npm:7.0.0" workbox-strategies: "npm:7.0.0" - checksum: 7656ab4bff15fbcbc7f546d86628ccbc74736a99139ec70a166c465fc4ff59656aecd44cc0aef45b4690fd88a4980d6c9f27ce8c6606fd12d026162259a8069d + checksum: 10c0/7656ab4bff15fbcbc7f546d86628ccbc74736a99139ec70a166c465fc4ff59656aecd44cc0aef45b4690fd88a4980d6c9f27ce8c6606fd12d026162259a8069d languageName: node linkType: hard @@ -8586,7 +8590,7 @@ __metadata: resolution: "workbox-navigation-preload@npm:7.0.0" dependencies: workbox-core: "npm:7.0.0" - checksum: f29ac8364c7f7f392daa1f886134adc780057199b218ab6c6eef298841b8825d6cbc4bc88e655299929bdf14c700edfb9f217ca5c0b46094627247528f655011 + checksum: 10c0/f29ac8364c7f7f392daa1f886134adc780057199b218ab6c6eef298841b8825d6cbc4bc88e655299929bdf14c700edfb9f217ca5c0b46094627247528f655011 languageName: node linkType: hard @@ -8597,7 +8601,7 @@ __metadata: workbox-core: "npm:7.0.0" workbox-routing: "npm:7.0.0" workbox-strategies: "npm:7.0.0" - checksum: 1b47cb151bb6ec7442b2dc8981203feff22527a4383510f2399730338b620ef0d03076bd3dbc1eb9a05272d5d6f4803fb4262f320bf5645f0818981e91077f39 + checksum: 10c0/1b47cb151bb6ec7442b2dc8981203feff22527a4383510f2399730338b620ef0d03076bd3dbc1eb9a05272d5d6f4803fb4262f320bf5645f0818981e91077f39 languageName: node linkType: hard @@ -8606,7 +8610,7 @@ __metadata: resolution: "workbox-range-requests@npm:7.0.0" dependencies: workbox-core: "npm:7.0.0" - checksum: 909f0ed7a176e5dc55692792825e67b577dacf1015a3f3775389fcec34ff5b3441b15595109455fe226f0bc4dce4789a7c86e5e9c5963c13b4d6482f6d01d44f + checksum: 10c0/909f0ed7a176e5dc55692792825e67b577dacf1015a3f3775389fcec34ff5b3441b15595109455fe226f0bc4dce4789a7c86e5e9c5963c13b4d6482f6d01d44f languageName: node linkType: hard @@ -8620,7 +8624,7 @@ __metadata: workbox-precaching: "npm:7.0.0" workbox-routing: "npm:7.0.0" workbox-strategies: "npm:7.0.0" - checksum: c024141f24b0778355bdfbfe2b4a24a3f74e279f6f7541635758533e79318e15986f9f556a899c97717a9c25a1738d9e112d17dd36aa19cebf901462ebeeb8e4 + checksum: 10c0/c024141f24b0778355bdfbfe2b4a24a3f74e279f6f7541635758533e79318e15986f9f556a899c97717a9c25a1738d9e112d17dd36aa19cebf901462ebeeb8e4 languageName: node linkType: hard @@ -8629,7 +8633,7 @@ __metadata: resolution: "workbox-routing@npm:7.0.0" dependencies: workbox-core: "npm:7.0.0" - checksum: 74ad651a0643506cfd3ca51eee754f5fe34e3f1460e6b772ed213e0422028cf002d70f91da32d13261bc5ee2160527ffb5436ac209fdbe8d0e7071784aa65190 + checksum: 10c0/74ad651a0643506cfd3ca51eee754f5fe34e3f1460e6b772ed213e0422028cf002d70f91da32d13261bc5ee2160527ffb5436ac209fdbe8d0e7071784aa65190 languageName: node linkType: hard @@ -8638,7 +8642,7 @@ __metadata: resolution: "workbox-strategies@npm:7.0.0" dependencies: workbox-core: "npm:7.0.0" - checksum: 4fe122b80e547b347bedf187aeb2c2eb34efc3fbde2733b7709530cccb6b6e03b29adcbccecf301e4fcaad0d5cd4a74e1e704f769d949c32439dca358130a613 + checksum: 10c0/4fe122b80e547b347bedf187aeb2c2eb34efc3fbde2733b7709530cccb6b6e03b29adcbccecf301e4fcaad0d5cd4a74e1e704f769d949c32439dca358130a613 languageName: node linkType: hard @@ -8648,14 +8652,14 @@ __metadata: dependencies: workbox-core: "npm:7.0.0" workbox-routing: "npm:7.0.0" - checksum: 9a1a9b8200f5b315523ac49c61a9b88791009377bbdedd44cf19c4b2258e710bd2fbc6f74ef53b72db7849da7ce9965ced5983f167785ccfc7efa1df761e3371 + checksum: 10c0/9a1a9b8200f5b315523ac49c61a9b88791009377bbdedd44cf19c4b2258e710bd2fbc6f74ef53b72db7849da7ce9965ced5983f167785ccfc7efa1df761e3371 languageName: node linkType: hard "workbox-sw@npm:7.0.0": version: 7.0.0 resolution: "workbox-sw@npm:7.0.0" - checksum: 06d9713398ca92d8b2cad70a7d302825ec7650e05e2e0c8e68f453442fdf9a9227350c856484f7b649df6cb429cc03a103f8ecd9596e83bfa52e845bf25ffbcd + checksum: 10c0/06d9713398ca92d8b2cad70a7d302825ec7650e05e2e0c8e68f453442fdf9a9227350c856484f7b649df6cb429cc03a103f8ecd9596e83bfa52e845bf25ffbcd languageName: node linkType: hard @@ -8665,7 +8669,7 @@ __metadata: dependencies: "@types/trusted-types": "npm:^2.0.2" workbox-core: "npm:7.0.0" - checksum: 8070fb80734a8543248ed6e3b186b8d3ee64419400a6d6d75f78809c44bf16321c5d9739bdf60ee62f631461ebb67a8a7dd78192504678d00bf2a9d3683f1324 + checksum: 10c0/8070fb80734a8543248ed6e3b186b8d3ee64419400a6d6d75f78809c44bf16321c5d9739bdf60ee62f631461ebb67a8a7dd78192504678d00bf2a9d3683f1324 languageName: node linkType: hard @@ -8676,7 +8680,7 @@ __metadata: ansi-styles: "npm:^4.0.0" string-width: "npm:^4.1.0" strip-ansi: "npm:^6.0.0" - checksum: d15fc12c11e4cbc4044a552129ebc75ee3f57aa9c1958373a4db0292d72282f54373b536103987a4a7594db1ef6a4f10acf92978f79b98c49306a4b58c77d4da + checksum: 10c0/d15fc12c11e4cbc4044a552129ebc75ee3f57aa9c1958373a4db0292d72282f54373b536103987a4a7594db1ef6a4f10acf92978f79b98c49306a4b58c77d4da languageName: node linkType: hard @@ -8687,63 +8691,63 @@ __metadata: ansi-styles: "npm:^6.1.0" string-width: "npm:^5.0.1" strip-ansi: "npm:^7.0.1" - checksum: 138ff58a41d2f877eae87e3282c0630fc2789012fc1af4d6bd626eeb9a2f9a65ca92005e6e69a75c7b85a68479fe7443c7dbe1eb8fbaa681a4491364b7c55c60 + checksum: 10c0/138ff58a41d2f877eae87e3282c0630fc2789012fc1af4d6bd626eeb9a2f9a65ca92005e6e69a75c7b85a68479fe7443c7dbe1eb8fbaa681a4491364b7c55c60 languageName: node linkType: hard "wrappy@npm:1": version: 1.0.2 resolution: "wrappy@npm:1.0.2" - checksum: 56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 + checksum: 10c0/56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 languageName: node linkType: hard "xstate-beta@npm:xstate@beta": version: 5.0.0-beta.34 resolution: "xstate@npm:5.0.0-beta.34" - checksum: 88e5635bf788c3590fa535fc73a8b8b56183bd29e6627aad992df31e756c660f8f05e7fcfeec6255dda1a2f79bd18ce1e926c8526556b143421f191d1c6b36e7 + checksum: 10c0/88e5635bf788c3590fa535fc73a8b8b56183bd29e6627aad992df31e756c660f8f05e7fcfeec6255dda1a2f79bd18ce1e926c8526556b143421f191d1c6b36e7 languageName: node linkType: hard "xstate@npm:^4.33.4, xstate@npm:^4.38.3": version: 4.38.3 resolution: "xstate@npm:4.38.3" - checksum: 8a2063743517390107275113bca0e757dba99102e7d57d40cf656b5cc03a6f2c5e10fbf3752294d9d29fbe1d8757bb9a54f54c934a22f205a237956dd10dcd0f + checksum: 10c0/8a2063743517390107275113bca0e757dba99102e7d57d40cf656b5cc03a6f2c5e10fbf3752294d9d29fbe1d8757bb9a54f54c934a22f205a237956dd10dcd0f languageName: node linkType: hard "y18n@npm:^5.0.5": version: 5.0.8 resolution: "y18n@npm:5.0.8" - checksum: 4df2842c36e468590c3691c894bc9cdbac41f520566e76e24f59401ba7d8b4811eb1e34524d57e54bc6d864bcb66baab7ffd9ca42bf1eda596618f9162b91249 + checksum: 10c0/4df2842c36e468590c3691c894bc9cdbac41f520566e76e24f59401ba7d8b4811eb1e34524d57e54bc6d864bcb66baab7ffd9ca42bf1eda596618f9162b91249 languageName: node linkType: hard "yallist@npm:^3.0.2": version: 3.1.1 resolution: "yallist@npm:3.1.1" - checksum: c66a5c46bc89af1625476f7f0f2ec3653c1a1791d2f9407cfb4c2ba812a1e1c9941416d71ba9719876530e3340a99925f697142989371b72d93b9ee628afd8c1 + checksum: 10c0/c66a5c46bc89af1625476f7f0f2ec3653c1a1791d2f9407cfb4c2ba812a1e1c9941416d71ba9719876530e3340a99925f697142989371b72d93b9ee628afd8c1 languageName: node linkType: hard "yallist@npm:^4.0.0": version: 4.0.0 resolution: "yallist@npm:4.0.0" - checksum: 2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a + checksum: 10c0/2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a languageName: node linkType: hard "yaml@npm:^1.10.0": version: 1.10.2 resolution: "yaml@npm:1.10.2" - checksum: 5c28b9eb7adc46544f28d9a8d20c5b3cb1215a886609a2fd41f51628d8aaa5878ccd628b755dbcd29f6bb4921bd04ffbc6dcc370689bb96e594e2f9813d2605f + checksum: 10c0/5c28b9eb7adc46544f28d9a8d20c5b3cb1215a886609a2fd41f51628d8aaa5878ccd628b755dbcd29f6bb4921bd04ffbc6dcc370689bb96e594e2f9813d2605f languageName: node linkType: hard "yargs-parser@npm:^21.1.1": version: 21.1.1 resolution: "yargs-parser@npm:21.1.1" - checksum: f84b5e48169479d2f402239c59f084cfd1c3acc197a05c59b98bab067452e6b3ea46d4dd8ba2985ba7b3d32a343d77df0debd6b343e5dae3da2aab2cdf5886b2 + checksum: 10c0/f84b5e48169479d2f402239c59f084cfd1c3acc197a05c59b98bab067452e6b3ea46d4dd8ba2985ba7b3d32a343d77df0debd6b343e5dae3da2aab2cdf5886b2 languageName: node linkType: hard @@ -8758,20 +8762,20 @@ __metadata: string-width: "npm:^4.2.3" y18n: "npm:^5.0.5" yargs-parser: "npm:^21.1.1" - checksum: ccd7e723e61ad5965fffbb791366db689572b80cca80e0f96aad968dfff4156cd7cd1ad18607afe1046d8241e6fb2d6c08bf7fa7bfb5eaec818735d8feac8f05 + checksum: 10c0/ccd7e723e61ad5965fffbb791366db689572b80cca80e0f96aad968dfff4156cd7cd1ad18607afe1046d8241e6fb2d6c08bf7fa7bfb5eaec818735d8feac8f05 languageName: node linkType: hard "yocto-queue@npm:^0.1.0": version: 0.1.0 resolution: "yocto-queue@npm:0.1.0" - checksum: dceb44c28578b31641e13695d200d34ec4ab3966a5729814d5445b194933c096b7ced71494ce53a0e8820685d1d010df8b2422e5bf2cdea7e469d97ffbea306f + checksum: 10c0/dceb44c28578b31641e13695d200d34ec4ab3966a5729814d5445b194933c096b7ced71494ce53a0e8820685d1d010df8b2422e5bf2cdea7e469d97ffbea306f languageName: node linkType: hard "zod@npm:^3.22.4": version: 3.22.4 resolution: "zod@npm:3.22.4" - checksum: 7578ab283dac0eee66a0ad0fc4a7f28c43e6745aadb3a529f59a4b851aa10872b3890398b3160f257f4b6817b4ce643debdda4fb21a2c040adda7862cab0a587 + checksum: 10c0/7578ab283dac0eee66a0ad0fc4a7f28c43e6745aadb3a529f59a4b851aa10872b3890398b3160f257f4b6817b4ce643debdda4fb21a2c040adda7862cab0a587 languageName: node linkType: hard -- cgit v1.2.3-54-g00ecf From d2da47e97f63c5965d9efdcdb1730ab8d1f5295b Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Mon, 19 Feb 2024 00:37:39 +0100 Subject: docs: update README --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1dd81298..1f9eccee 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ @@ -30,6 +30,10 @@ Alternatively, you can follow the instructions in [CONTRIBUTING.md](CONTRIBUTING ## Related publications +### Tool demonstration + +* K. Marussy, A. Ficsor, O. Semeráth, D. Varró: “Refinery: Graph Solver as a Service” _ICSE 2024 Demonstrations_ [[doi](https://doi.org/10.1145/3639478.3640045)] [[pdf](https://refinery.tools/papers/icse24-demo.pdf)] [[video](https://youtu.be/Qy_3udNsWsM)] + ### Partial model specification language * K. Marussy, O. Semeráth, A. Babikian, D. Varró: _A Specification Language for Consistent Model Generation based on Partial Models._ @@ -52,7 +56,7 @@ J. Object Technol. **19**(3): 3:1-22 (2020) [[doi](https://doi.org/10.5381/jot.2 ## License -Copyright (c) 2021-2023 [The Refinery Authors](CONTRIBUTORS.md) +Copyright (c) 2021-2024 [The Refinery Authors](CONTRIBUTORS.md) Refinery is available under the [Eclipse Public License - v 2.0](https://www.eclipse.org/legal/epl-2.0/). -- cgit v1.2.3-54-g00ecf