diff options
39 files changed, 0 insertions, 6015 deletions
diff --git a/.gitattribute b/.gitattributes index 176a458..176a458 100644 --- a/.gitattribute +++ b/.gitattributes @@ -1,5 +1 @@ -yarn-error.log -node_modules/ -.* -*.swp *~ diff --git a/package.json b/package.json deleted file mode 100644 index 2621654..0000000 --- a/package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "devDependencies": { - "jest": "^29.5.0" - }, - "scripts": { - "test": "NODE_OPTIONS=--experimental-vm-modules jest", - "wtest": "test.bat" - }, - "type": "module" -} diff --git a/src/genome/README.md b/src/genome/README.md deleted file mode 100644 index 1135ed0..0000000 --- a/src/genome/README.md +++ /dev/null @@ -1,12 +0,0 @@ -src/genome
-==========
-
-Genomes represent the neural network that underlies a creature. They are an array of tuples of the form `[ source, sink, weight ]`, where:
-
- * `source` is an integer in the range `[0, N - num_outputs)`, representing the index of the source neuron
- * `sink` is an integer in the range `[num_inputs, N)`, representing the index of the sink neuron
- * `weight` is a floating-point value in the range `[-4, 4]`, representing the weight of the connection
-
-`num_input` and `num_output` are fixed by the environment (as they are the input senses and output actions of the creature, respectively).
-`N` is not fixed, but is instead determined by the maximum index present in the genome. As long as the maximum index is greater than or
-equal to `num_input + num_output`, the genome is considered valid.
diff --git a/src/genome/genome.js b/src/genome/genome.js deleted file mode 100644 index 20974fc..0000000 --- a/src/genome/genome.js +++ /dev/null @@ -1,218 +0,0 @@ -'use strict';
-
-import { random_choice } from '../util.js';
-import { network } from '../mind/topology.js';
-
-
-// check if a given genome is valid and compute its size
-export function validate_genome(genome) {
- const { n_input, n_internal, n_output } = genome;
- console.log(n_input + n_internal);
- return genome.genes.reduce(
- (acc, [source, sink, weight]) => acc && (
- (source < n_input+n_internal) &&
- (sink >= n_input)
- ),
- true
- );
-}
-
-// parse a genome into a useable neural net
-export function parse_genome(genome) {
- const { n_input, n_internal, n_output } = genome;
-
- const n = genome.genes.reduce(
- (acc, [source, sink, weight]) => acc.connect(source, sink, weight),
- network(n_input, n_internal, n_output)
- );
-
- return n;
-}
-
-
-// --===== mutations =====--
-
-function clamp(value, min, max) {
- if (value > max) { return max; }
- if (value < min) { return min; }
- return value;
-}
-
-// adjust the source input of a gene
-export function mut_gene_source(n_input, n_internal, n_output, gene, r) {
- const [source, sink, weight] = gene;
-
- const new_source = r < 0.5 ? source-1 : source+1;
-
- return [
- clamp(new_source, 0, n_input+n_internal-1),
- sink,
- weight,
- ];
-}
-
-
-// adjust the sink target of a gene
-export function mut_gene_sink(n_input, n_internal, n_output, gene, r) {
- const [source, sink, weight] = gene;
-
- const new_sink = r < 0.5 ? sink-1 : sink+1;
-
- return [
- source,
- clamp(new_sink, n_input+n_internal, n_input+n_internal+n_output-1),
- weight,
- ];
-}
-
-
-// modify a gene's weight
-// only adjusts the weight by performing a weighted average, so as to
-// more gently modify the generated net
-export function mut_gene_weight(weight_max, gene, r) {
- const [source, sink, weight] = gene;
-
- const rr = (2*r)-1;
- const move = weight_max * rr;
- const new_weight = (2*weight + move)/3;
-
- return [
- source,
- sink,
- clamp(new_weight, -weight_max, weight_max),
- ];
-}
-
-
-
-// expand the size of the neural net encoded by the genome
-// relabels internal indices so that there is one extra internal neuron
-export function mut_genome_expand(genome, r) {
- const expand_index = Math.floor(genome.n_internal * r) + genome.n_input;
- const new_genes = genome.genes.map(([source, sink, weight]) => [
- source >= expand_index ? source+1 : source,
- sink >= expand_index ? sink+1 : sink,
- weight,
- ]);
-
- return {
- ...genome,
- n_internal: genome.n_internal+1,
- genes: new_genes,
- };
-}
-
-
-// contract the size of the neural net encoded by the genome
-// relabels internal indices so that there is one less internal neuron
-export function mut_genome_contract(genome, r) {
- const { n_input, n_internal, n_output } = genome;
- const contract_idx = Math.floor(n_internal * r) + n_input;
-
- // decrement sources on the contract index too, to prevent invalid genomes
- const new_source = (source) => source >= contract_idx ? source-1 : source;
- // decrement sinks only after the contract index
- const new_sink = (sink) => sink > contract_idx ? sink-1 : sink;
-
- const new_genes = genome.genes.map(([source, sink, weight]) => [
- new_source(source),
- new_sink(sink),
- weight,
- ]);
-
- return {
- ...genome,
- n_internal: n_internal-1,
- genes: new_genes,
- };
-}
-
-
-// append a newly generated gene to the end of the genome
-export function mut_genome_insert(genome, weight_max, r1=Math.random(), r2=Math.random(), r3=Math.random()) {
- const { n_input, n_internal, n_output } = genome;
- const source = Math.floor((n_input + n_internal) * r1);
- const sink = Math.floor((n_internal + n_output) * r2) + n_input;
- const weight = weight_max * ((2*r3)-1);
-
- return {
- ...genome,
- genes: [...genome.genes, [source, sink, weight]],
- };
-}
-
-
-// delete a gene from the genome
-export function mut_genome_delete(genome, r) {
- const del_idx = Math.floor(r * genome.genes.length);
- const genes = genome.genes.filter((_, idx) => idx != del_idx);
- return { ...genome, genes };
-}
-
-
-function mut_gene(
- [n_input, n_internal, n_output, genome],
- weight_max, r1, r2, r3
-) {
- const gene_idx = Math.floor(genome.length * r1);
- const mod = random_choice(['source', 'sink', 'weight'], r2);
- let new_gene;
- if (mod == 'source') {
- new_gene = mut_gene_source(
- n_input, n_internal, n_output,
- genome[gene_idx],
- r3
- );
- } else if (mod == 'sink') {
- new_gene = mut_gene_sink(
- n_input, n_internal, n_output,
- genome[gene_idx],
- r3
- );
- } else {
- new_gene = mut_gene_weight(
- weight_max, genome[gene_idx], r3
- );
- }
-
- const new_genome = genome.map((gene, idx) => {
- if (idx == gene_idx) { return new_gene; }
- return gene;
- });
-
- return [
- n_input, n_internal, n_output, new_genome
- ];
-}
-
-
-export function mutate_genome(obj, weight_max) {
- const mut = random_choice([
- 'gene', 'gene', 'gene',
- 'gene', 'gene', 'gene',
- 'gene', 'gene', 'gene',
- 'insert', 'delete',
- 'insert', 'delete',
- 'expand', 'contract',
- ], Math.random());
-
- if (mut == 'gene') {
- return mut_gene(
- obj, weight_max,
- Math.random(), Math.random(), Math.random()
- );
- } else if (mut == 'insert') {
- return mut_genome_insert(
- obj, weight_max,
- Math.random(), Math.random(), Math.random()
- );
- } else if (mut == 'delete') {
- return mut_genome_delete(obj, Math.random());
- } else if (mut == 'expand') {
- return mut_genome_expand(obj, Math.random());
- } else if (mut == 'contract') {
- return mut_genome_contract(obj, Math.random());
- } else {
- throw new Error(`bad mut value: ${mut}`);
- }
-}
diff --git a/src/genome/genome.test.js b/src/genome/genome.test.js deleted file mode 100644 index bc64e4e..0000000 --- a/src/genome/genome.test.js +++ /dev/null @@ -1,282 +0,0 @@ -'use strict';
-
-// genome structure
-// {
-// genes: gene[]
-// n_input, n_internal, n_output
-// }
-
-
-import {
- validate_genome,
- parse_genome,
- mut_gene_source,
- mut_gene_sink,
- mut_gene_weight,
- mut_genome_expand,
- mut_genome_contract,
- mut_genome_insert,
- mut_genome_delete,
-} from './genome';
-
-
-test('genome validation', () => {
- expect(validate_genome({
- n_input: 0, n_internal: 1, n_output: 0,
- genes: [[0, 0, 1.0]],
- })).toBe(true);
- expect(validate_genome({
- n_input: 2, n_internal: 0, n_output: 1,
- genes: [[0, 2, 1]],
- })).toBe(true);
- expect(validate_genome({
- n_input: 2, n_internal: 0, n_output: 1,
- genes: [[2, 0, 1]],
- })).toBe(false);
- expect(validate_genome({
- n_input: 2, n_internal: 0, n_output: 1,
- genes: [[2, 2, 1]],
- })).toBe(false);
- expect(validate_genome({
- n_input: 2, n_internal: 1, n_output: 1,
- genes: [[3, 2, 1]],
- })).toBe(false);
-});
-
-
-test('parse a genome into a neural net', () => {
- const n = parse_genome({
- n_input: 1, n_internal: 1, n_output: 1,
- genes: [
- [0, 1, 1],
- [1, 1, 1],
- [1, 2, 1]
- ]
- });
-
- expect(n.input_count).toBe(1);
- expect(n.output_count).toBe(1);
- expect(n.compute([2], [-1])).toEqual([
- [ Math.tanh( Math.tanh( 2-1 ) ) ],
- [ Math.tanh( 2-1 ) ],
- ]);
-});
-
-
-test('mutate gene source', () => {
- const n_input = 3;
- const n_internal = 4;
- const n_output = 5;
-
- expect(mut_gene_source(
- n_input, n_internal, n_output,
- [0, 4, 0],
- 0.0
- )).toEqual([0, 4, 0]);
-
- expect(mut_gene_source(
- n_input, n_internal, n_output,
- [0, 4, 0],
- 1.0
- )).toEqual([1, 4, 0]);
-
- expect(mut_gene_source(
- n_input, n_internal, n_output,
- [6, 4, 0],
- 0.0
- )).toEqual([5, 4, 0]);
-
- expect(mut_gene_source(
- n_input, n_internal, n_output,
- [6, 4, 0],
- 1.0
- )).toEqual([6, 4, 0]);
-});
-
-
-test('mutate gene sink', () => {
- const n_input = 3;
- const n_internal = 4;
- const n_output = 5;
-
- expect(mut_gene_sink(
- n_input, n_internal, n_output,
- [0, 7, 0],
- 0.0
- )).toEqual([0, 7, 0]);
-
- expect(mut_gene_sink(
- n_input, n_internal, n_output,
- [0, 7, 0],
- 1.0
- )).toEqual([0, 8, 0]);
-
- expect(mut_gene_sink(
- n_input, n_internal, n_output,
- [6, 11, 0],
- 0.0
- )).toEqual([6, 10, 0]);
-
- expect(mut_gene_sink(
- n_input, n_internal, n_output,
- [6, 11, 0],
- 1.0
- )).toEqual([6, 11, 0]);
-});
-
-
-test('mutate gene weight', () => {
- const weight_max = 4.0;
-
- expect(mut_gene_weight(
- weight_max, [0, 0, 1], 0.0
- )).toEqual([0, 0, (2 - 4)/3]);
-
- expect(mut_gene_weight(
- weight_max, [0, 0, -4], 1.0
- )).toEqual([0, 0, (-8 + 4)/3]);
-
- expect(mut_gene_weight(
- weight_max, [0, 0, 3], 0.5
- )).toEqual([0, 0, (6+0)/3]);
-});
-
-
-test('expand genome', () => {
- const n_input = 1;
- const n_internal = 3;
- const n_output = 1;
-
- const genome = {
- n_input, n_internal, n_output,
- genes: [
- [0, 1, 0],
- [1, 2, 0],
- [2, 3, 0],
- [3, 4, 0],
- ],
- };
-
- expect(mut_genome_expand(genome, 0.0)).toEqual({
- n_input, n_internal: n_internal+1, n_output,
- genes: [
- [0, 2, 0],
- [2, 3, 0],
- [3, 4, 0],
- [4, 5, 0],
- ],
- });
-
- expect(mut_genome_expand(genome, 0.5)).toEqual({
- n_input, n_internal: n_internal+1, n_output,
- genes: [
- [0, 1, 0],
- [1, 3, 0],
- [3, 4, 0],
- [4, 5, 0],
- ],
- });
-
- expect(mut_genome_expand(genome, 0.99)).toEqual({
- n_input, n_internal: n_internal+1, n_output,
- genes: [
- [0, 1, 0],
- [1, 2, 0],
- [2, 4, 0],
- [4, 5, 0],
- ],
- });
-});
-
-
-test('contract genome', () => {
- const n_input = 1;
- const n_internal = 3;
- const n_output = 1;
-
- const genome = {
- n_input, n_internal, n_output,
- genes: [
- [0, 1, 0],
- [1, 2, 1],
- [2, 3, 2],
- [3, 4, 3],
- ],
- };
-
- expect(mut_genome_contract(genome, 0.0)).toEqual({
- n_input, n_internal: n_internal-1, n_output,
- genes: [
- [0, 1, 0],
- [0, 1, 1],
- [1, 2, 2],
- [2, 3, 3],
- ],
- });
-
- expect(mut_genome_contract(genome, 0.5)).toEqual({
- n_input, n_internal: n_internal-1, n_output,
- genes: [
- [0, 1, 0],
- [1, 2, 1],
- [1, 2, 2],
- [2, 3, 3],
- ],
- });
-
- expect(mut_genome_contract(genome, 0.99)).toEqual({
- n_input, n_internal: n_internal-1, n_output,
- genes: [
- [0, 1, 0],
- [1, 2, 1],
- [2, 3, 2],
- [2, 3, 3],
- ],
- });
-});
-
-
-
-test('insert new genes', () => {
- const n_input = 1;
- const n_internal = 2;
- const n_output = 1;
- const weight_max = 4;
-
- expect(mut_genome_insert({
- n_input, n_internal, n_output,
- genes: []
- }, weight_max, 0, 0.5, 0)).toEqual({
- n_input, n_internal, n_output,
- genes: [[0, 2, -4]]
- });
-
- expect(mut_genome_insert({
- n_input, n_internal, n_output,
- genes: [[0, 2, -4]]
- }, weight_max, 0.99, 0, 1)).toEqual({
- n_input, n_internal, n_output,
- genes: [[0, 2, -4], [2, 1, 4]]
- });
-});
-
-
-test('remove genes', () => {
- const n_input = 0;
- const n_output = 0;
- const n_internal = 3;
- const genome = {
- n_input, n_internal, n_output,
- genes: [[0, 1, 0], [1, 2, 0]],
- };
-
- expect(mut_genome_delete(genome, 0.0)).toEqual({
- n_input, n_internal, n_output,
- genes: [[1, 2, 0]],
- });
-
- expect(mut_genome_delete(genome, 0.99)).toEqual({
- n_input, n_internal, n_output,
- genes: [[0, 1, 0]],
- });
-});
diff --git a/src/genome/trial.js b/src/genome/trial.js deleted file mode 100644 index 2ce23bf..0000000 --- a/src/genome/trial.js +++ /dev/null @@ -1,37 +0,0 @@ -import { - get_size, - mut_genome_insert, mutate_genome, -} from './genome.js'; - -const recurse = (f, x0, n) => { - if (n == 0) { - return x0; - } else { - return f(recurse(f, x0, n-1)); - } -}; - - -const n_input = 5; -const n_output = 5; - - -const [_1, _2, _3, genome] = recurse( - s => mut_genome_insert( - s, 4, - Math.random(), Math.random(), Math.random() - ), - [n_input, 10, n_output, []], - 20); - - -const n_internal = get_size(n_input, n_output, genome) - n_input - n_output; -console.log([n_input, n_internal, n_output, genome]); - -const mutation = recurse( - s => mutate_genome(s, 4), - [n_input, n_internal, n_output, genome], - 40 -); - -console.log(mutation); diff --git a/src/index.html b/src/index.html deleted file mode 100644 index 6b7ebf7..0000000 --- a/src/index.html +++ /dev/null @@ -1,14 +0,0 @@ -<!doctype html> -<html> - <head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>nerine</title> - <style> - </style> - <script type="module" src="ui/index.js"></script> - </head> - <body> - <canvas id="canvas" width="95vw" height="95vw"> - </body> -</html> diff --git a/src/mind/README.md b/src/mind/README.md deleted file mode 100644 index 1ece125..0000000 --- a/src/mind/README.md +++ /dev/null @@ -1,37 +0,0 @@ -mind -==== - -This module is used to create arbitrary stateful neural networks. - -The only export is the following function: - -``` -network(input_count, internal_count, output_count, weight_max = 4 : number) -``` - -This function returns an object that represents a neural network with `input_count` input neurons, -`internal_count` internal (and stateful) neurons, and `output_count` output neurons. `max_weight` determines -the maximum absolute value allowed for connection weights. - -A network object has two methods: - -``` -connect(source, sink, weight : number) -``` - -This method returns a new network object that is an exact copy of the original, except with a new -connection between the neuron indexed by `source` and `sink`, with weight `weight`. Neuron indices -are zero-indexed, and span all neurons, first the inputs, then the internal neurons, and finally the outputs. -An error will be thrown if `source` is in the range of output neurons or if `sink` is in the range of input -neurons. - - -``` -compute(inputs, state : array[number]) -``` - -This method returns a tuple `[output, newState]`, where `output` is an array of `output_count` values -corresponding to the output neuron's computed values, and `newState` is the new state of the internal neurons. - -`input` must be an array of numbers with length equal to `input_count`, and `state` must be an array of numbers -with length equal to `internal_count` or an error will be raised. diff --git a/src/mind/topology.js b/src/mind/topology.js deleted file mode 100644 index 946dd86..0000000 --- a/src/mind/topology.js +++ /dev/null @@ -1,183 +0,0 @@ -'use strict'; - -import { create } from '../util.js'; - - -const DEFAULT_WEIGHT_MAX = 4; - - -// prototype for network objects -const network_proto = { - connect: function(source, sink, weight) { - return network_connect(this, source, sink, weight); - }, - compute: function(inputs, state) { - return network_compute(this, inputs, state); - }, -}; - - -// create a new network -export function network(input_count, internal_count, output_count, weight_max = 4) { - const count = input_count + internal_count + output_count; - const n = create({ - input_count, - output_count, - adjacency: new Array(count).fill([]), - weight: [], - }, network_proto); - return n; -} - - -// check index is an input -function is_input(n, index) { - return index < n.input_count; -} -// check if index is an output -function is_output(n, index) { - return index >= (n.adjacency.length - n.output_count); -} -// check if index is a hidden neuron -function is_hidden(n, index) { - return (!is_input(n, index)) && (!is_output(n, index)); -} - - -// returns a new network with an edge between the given nodes -// with the given weight -export function network_connect(n, source, sink, weight) { - if (is_input(n, sink)) { - // inputs cannot be sinks - throw new Error(`attempt to use input as sink (${source} -> ${sink})`); - } - if (is_output(n, source)) { - // outputs cannot be sources - throw new Error(`attempt to use output as source (${source} -> ${sink})`); - } - - return create({ - ...n, - adjacency: n.adjacency.map((row, i) => { - if (i === source && i === sink) { - // self-loop - return [...row, 2]; - } else if (i === source) { - return [...row, 1]; - } else if (i === sink) { - return [...row, -1]; - } else { - return [...row, 0]; - } - }), - weight: [...n.weight, weight], - }, network_proto); -} - - -// gets the indices of the edges incident on the given adjacency list -function incident_edges(n, adj) { - const incident = adj - .map((edge, index) => (edge < 0) || (edge === 2) ? index : null) - .filter(index => index !== null); - - return incident; -} - - -// get the indices of the ends of an edge -// in the case of self-loops, both values are the same -function edge_ends(n, edge) { - const ends = n.adjacency - .map((adj, index) => adj[edge] !== 0 ? index : null) - .filter(index => index != null); - - ends.sort((a, b) => n.adjacency[a][edge] < n.adjacency[b][edge] ? -1 : 1); - - if (ends.length === 1) { - return { source: ends[0], sink: ends[0] }; - } else if (ends.length === 2) { - return { source: ends[1], sink: ends[0] }; - } else { - throw new Error("something bad happened with the ends"); - } -} - - -// recursively get the value of a node from the input nodes, -// optionally caching the computed values -function get_value(n, index, input, prev, cache) { - // check if value is cached - if (cache !== undefined && cache[index]) { - return cache[index]; - } - // check if value is input - if (is_input(n, index)) { - return input[index]; - } - - const adj = n.adjacency[index]; // get adjacency list - const incident = incident_edges(n, adj); // get incident edges - const weight = incident.map(x => n.weight[x]); // edge weights - const sources = incident // get ancestor nodes - .map(x => edge_ends(n, x).source); - - // get the value of each ancestor - const values = sources - .map(x => x === index // if the ancestor is this node - ? prev[x - n.input_count] // then the value is the previous value - : get_value(n, x, input, prev, cache)); // else recurse - - const sum = values // compute the weighted sum of the values - .reduce((acc, x, i) => acc + (weight[i] * x), 0); - - if (sum !== sum) { // NaN test - console.log(n); - console.log(sources); - console.log(input); - throw new Error(`failed to get output for index ${index}`); - } - - // compute result - const value = Math.tanh(sum); - - // !!! impure caching !!! - // cache result - if (cache !== undefined) { - cache[index] = value; - } - - return value; -} - - -// compute a network's output and new hidden state -// given the input and previous hidden state -export function network_compute(n, input, state) { - // validate input - if (input.length !== n.input_count) { - throw new Error("incorrect number of input elements"); - } - // validate state - const hidden_count = n.adjacency.length - n.input_count - n.output_count; - if (state.length !== hidden_count) { - throw new Error("incorrect number of state elements"); - } - - // !!! impure caching !!! - const value_cache = {}; - - const result = Object.freeze(n.adjacency - .map((x, i) => is_output(n, i) ? i : null) // output index or null - .filter(i => i !== null) // remove nulls - .map(x => get_value(n, x, input, state, value_cache)) // map to computed value - ); - - const newstate = Object.freeze(n.adjacency - .map((x, i) => is_hidden(n, i) ? i : null) // hidden index or null - .filter(i => i !== null) // remove nulls - .map(x => get_value(n, x, input, state, value_cache)) // map to computed value (using cache) - ); - - return Object.freeze([result, newstate]); -} diff --git a/src/mind/topology.test.js b/src/mind/topology.test.js deleted file mode 100644 index 52c196f..0000000 --- a/src/mind/topology.test.js +++ /dev/null @@ -1,235 +0,0 @@ -'use strict'; - -import { network } from './topology'; - - -test('basic network functionality', () => { - const n = network(0, 5, 0); - expect(n).toEqual({ - input_count: 0, - output_count: 0, - adjacency: [ [], [], [], [], [] ], - weight: [], - }); - - expect(() => n.adjacency = []).toThrow(); - expect(() => n.weight = []).toThrow(); - - const nn = n.connect(0, 1, -2); - expect(nn).toEqual({ - input_count: 0, - output_count: 0, - adjacency: [ - [ 1 ], - [ -1 ], - [ 0 ], - [ 0 ], - [ 0 ] - ], - weight: [ -2 ], - }); - - expect(() => nn.adjacency = []).toThrow(); - expect(() => nn.weight = []).toThrow(); - - const nnn = nn.connect(2, 4, 3); - expect(nnn).toEqual({ - input_count: 0, - output_count: 0, - adjacency: [ - [ 1, 0 ], - [ -1, 0 ], - [ 0, 1 ], - [ 0, 0 ], - [ 0, -1 ] - ], - weight: [ -2, 3 ], - }); - - expect(() => nnn.adjacency = []).toThrow(); - expect(() => nnn.weight = []).toThrow(); -}); - - -test( -'networks are restricted from sinking to inputs or sourcing from outputs', -() => { - const n = network(2, 2, 2); - - expect(n.connect(1,2,0)).toEqual({ - input_count: 2, - output_count: 2, - adjacency: [ - [ 0 ], - [ 1 ], - [ -1 ], - [ 0 ], - [ 0 ], - [ 0 ], - ], - weight: [ 0 ], - }); - expect(() => n.connect(2, 1, 0)).toThrow(); - - expect(n.connect(3, 4, 2)).toEqual({ - input_count: 2, - output_count: 2, - adjacency: [ - [ 0 ], - [ 0 ], - [ 0 ], - [ 1 ], - [ -1 ], - [ 0 ], - ], - weight: [ 2 ], - }); - expect(() => n.connect(4, 3, 2)).toThrow(); -}); - - -test('self-connections work correctly', () => { - const n = network(0, 1, 0).connect(0, 0, 2.0); - expect(n).toEqual({ - input_count: 0, - output_count: 0, - adjacency: [ - [ 2 ], - ], - weight: [ 2 ], - }); -}); - - -test('network computations', () => { - const n = network(1, 0, 1).connect(0, 1, 2.0); - const input = [ -0.5 ]; - const state = []; - const result = n.compute(input, state); - expect(result).toEqual([ - [ Math.tanh(-0.5 * 2.0) ], - [], - ]); - - expect(input).toEqual([ -0.5 ]); - expect(state).toEqual([]); - - expect(() => result[0] = 'hi').toThrow(); - expect(() => result[0].push('hi')).toThrow(); - expect(() => result[1] = 'hi').toThrow(); - expect(() => result[1].push('hi')).toThrow(); -}); - - -test('multiple input network', () => { - const n = network(4, 0, 1) - .connect(0, 4, -1.0) - .connect(1, 4, -2.0) - .connect(2, 4, 1.0) - .connect(3, 4, 2.0) - - expect(n.compute([1, 2, 3, 5], [])).toEqual([ - [ Math.tanh( - (-1.0 * 1) + - (-2.0 * 2) + - (1.0 * 3) + - (2.0 * 5))], - [], - ]); -}); - - -test('multiple outputs', () => { - const n = network(4, 0, 2) - .connect(0, 4, -1) - .connect(1, 4, 1) - .connect(2, 5, -1) - .connect(3, 5, 1); - - expect(n.compute([1,2,3,5], [])).toEqual([ - [ Math.tanh(2-1), Math.tanh(5-3) ], - [], - ]); -}); - - -test('hidden neurons', () => { - const n = network(4, 2, 1) - .connect(0, 4, -1) - .connect(1, 4, 1) - .connect(2, 5, -1) - .connect(3, 5, 1) - .connect(4, 6, -1) - .connect(5, 6, 1); - - expect(n.compute([1,2,3,5], [ 0, 0 ])).toEqual([ - [ Math.tanh( Math.tanh(5-3) - Math.tanh(2-1) ) ], - [ Math.tanh(2-1), Math.tanh(5-3) ], - ]); -}); - - -test('arbitrary hidden neurons', () => { - const n = network(1, 2, 1) - .connect(0, 1, 1) - .connect(1, 2, -1) - .connect(2, 3, 2) - - const [output, state] = n.compute([1], [0, 0]); - - expect(output).toEqual([ - Math.tanh( - 2*Math.tanh( - -1*Math.tanh(1) - ) - ) - ]); - - expect(state).toEqual([ - Math.tanh(1), - Math.tanh( -Math.tanh(1) ), - ]); -}); - - -test('memory', () => { - const n = network(0, 1, 1).connect(0, 0, -0.5).connect(0, 1, 2); - - expect(n.compute([], [1])).toEqual([ - [ Math.tanh( 2 * Math.tanh( -0.5 * 1 ) ) ], - [ Math.tanh( -0.5 * 1) ], - ]); -}); - - -test('memory and input', () => { - const n = network(1, 1, 1) - .connect(0, 1, 1) - .connect(1, 1, 1) - .connect(1, 2, 1); - - expect(n.compute([2], [-1])).toEqual([ - [ Math.tanh( Math.tanh( 2-1 ) ) ], - [ Math.tanh( 2-1 ) ], - ]); -}); - - -test('input and state must be the correct size', () => { - const n = network(2, 1, 1) - .connect(0, 2, 1) - .connect(1, 2, 1) - .connect(2, 3, 1); - - // wrong input size - expect(() => n.compute([], [4])).toThrow(); - expect(() => n.compute([1], [4])).toThrow(); - expect(() => n.compute([1, 1, 1], [4])).toThrow(); - - // wrong state size - expect(() => n.compute([1, 1], [])).toThrow(); - expect(() => n.compute([1, 1], [4, 4])).toThrow(); - - // prove correct sizes work - n.compute([1, 1], [4]); -}); diff --git a/src/simulation/actions.js b/src/simulation/actions.js deleted file mode 100644 index ad08572..0000000 --- a/src/simulation/actions.js +++ /dev/null @@ -1,260 +0,0 @@ -'use strict'; - -const threshold = 0.5; - - -const move_forward = { - size: 1, - propose: (world, agent, head) => { - if (agent.flags.frozen === true) { return []; } - if (head[0] > threshold) { - console.log('move forward'); - console.log(agent.id, agent.x, agent.y); - const dx = { n: 0, e: 1, s: 0, w: -1 }[agent.flags.orientation]; - const dy = { n: -1, e: 0, s: 1, w: 0 }[agent.flags.orientation]; - return [{ - agent_changes: [{ - agent_id: agent.id, - x: agent.x + dx, - y: agent.y + dy, - }], - }]; - } else { - return []; - } - }, -}; - - -const move_backward = { - size: 1, - propose: (world, agent, head) => { - if (agent.flags.frozen === true) { return []; } - if (head[0] > threshold) { - console.log('move backward'); - const dx = { n: 0, e: 1, s: 0, w: -1 }[agent.flags.orientation]; - const dy = { n: -1, e: 0, s: 1, w: 0 }[agent.flags.orientation]; - return [{ - agent_changes: [{ - agent_id: agent.id, - x: agent.x - dx, - y: agent.y - dy, - }], - }]; - } else { - return []; - } - }, -}; - - -const turn_left = { - size: 1, - propose: (world, agent, head) => { - if (agent.flags.frozen === true) { return []; } - if (head[0] > threshold) { - console.log('turn left'); - const orientation = { n: 'w', e: 'n', s: 'e', w: 's' }[agent.flags.orientation]; - return [{ - agent_changes: [{ - agent_id: agent.id, - flags: { orientation }, - }], - }]; - } else { - return []; - } - }, -}; - - -const turn_right = { - size: 1, - propose: (world, agent, head) => { - if (agent.flags.frozen === true) { return []; } - if (head[0] > threshold) { - console.log('turn right'); - const orientation = { n: 'e', e: 's', s: 'w', w: 'n' }[agent.flags.orientation]; - return [{ - agent_changes: [{ - agent_id: agent.id, - flags: { orientation }, - }], - }]; - } else { - return []; - } - }, -}; - - -const place = { - size: 1, - propose: (world, agent, head) => { - if (head[0] < threshold) { return []; } - else { - const dx = { n: 0, e: 1, s: 0, w: -1 }[agent.flags.orientation]; - const dy = { n: -1, e: 0, s: 1, w: 0 }[agent.flags.orientation]; - return [ - { lattice_changes: [{ - x: agent.x + dx, y: agent.y + dy, - from: 'empty', to: 'mutable', - flags: { emit: [1, 0, 0, 0, 0, 0, 0, 0] }, - }]} - ]; - } - }, -}; - - -const trigger = { - size: 1, - propose: (world, agent, head) => { - if (head[0] < threshold) { return []; } - else { - const dx = { n: 0, e: 1, s: 0, w: -1 }[agent.flags.orientation]; - const dy = { n: -1, e: 0, s: 1, w: 0 }[agent.flags.orientation]; - return [ - { lattice_changes: [{ - x: agent.x + dx, y: agent.y + dy, - from: 'mutable', to: 'active', - flags: { emit: [1, 0, 0, 0, 0, 0, 0, 0] }, - }]} - ]; - } - }, -}; - - -const pretend_frozen = { - size: 1, - propose: (world, agent, head) => { - if (head[0] < threshold) { return [{ - agent_changes: [{ - agent_id: agent.id, - flags: { pretend_frozen: false }, - }], - }]; } - else { - return [{ - agent_changes: [{ - agent_id: agent.id, - flags: { pretend_frozen: true }, - }] - }]; - } - }, -}; - - -const unfreeze = { - size: 1, - propose: (world, agent, head) => { - if (head[0] < threshold) { return []; } - else { - const dx = { n: 0, e: 1, s: 0, w: -1 }[agent.flags.orientation]; - const dy = { n: -1, e: 0, s: 1, w: 0 }[agent.flags.orientation]; - const target = world.agents.filter( - a => a.x === agent.x+dx && a.y === agent.y+dy - )[0]; - if (target === undefined) { return []; } - return [ - { agent_changes: [{ - agent_id: target.id, - flags: { frozen: false, emit: [0, 1, 0, 0, 0, 0, 0, 0] }, - }]} - ]; - } - }, -}; - - -const take_flag = { - size: 1, - propose: (world, agent, head) => { - if (head[0] < threshold) { return []; } - else { - const dx = { n: 0, e: 1, s: 0, w: -1 }[agent.flags.orientation]; - const dy = { n: -1, e: 0, s: 1, w: 0 }[agent.flags.orientation]; - const target = world.agents.filter( - a => a.x === agent.x+dx && a.y === agent.y+dy - )[0]; - if (target === undefined || !target.flags.flag) { - return [ - { - lattice_changes: [{ - x: agent.x + dx, y: agent.y + dy, - from: 'flag', to: 'empty', - flags: { emit: [ 0, 0, 1, 0, 0, 0, 0, 0 ] }, - }], - agent_changes: [{ - agent_id: agent.id, - flags: { flag: true }, - }], - } - ]; - } else { - return [{ - agent_changes: [ - { - agent_id: target.id, - flags: { flag: false }, - }, - { - agent_id: agent.id, - flags: { flag: true }, - }, - ], - }]; - } - } - }, -}; - - -const drop_flag = { - size: 1, - propose: (world, agent, head) => { - if (head[0] < threshold) { return []; } - else if (!agent.flags.flag) { return []; } - else { - const dx = { n: 0, e: 1, s: 0, w: -1 }[agent.flags.orientation]; - const dy = { n: -1, e: 0, s: 1, w: 0 }[agent.flags.orientation]; - return [ - { - lattice_changes: [{ - x: agent.x + dx, y: agent.y + dy, - from: 'empty', to: 'flag', - flags: { emit: [ 0, 0, -1, 0, 0, 0, 0, 0 ] }, - }], - agent_changes: [{ - agent_id: agent.id, - flags: { flag: false }, - }], - } - ]; - } - }, -}; - - -const speak = { - size: 8, - propose: (world, agent, head) => { - return [ - { - agent_changes: [{ - agent_id: agent.id, - flags: { emit: head }, - }], - }, - ]; - }, -}; - - -export const actions = [ - move_forward, /*move_backward, */turn_left, turn_right, - place, trigger, pretend_frozen, unfreeze, take_flag, drop_flag, - speak, -]; diff --git a/src/simulation/actions.test.js b/src/simulation/actions.test.js deleted file mode 100644 index e8406bc..0000000 --- a/src/simulation/actions.test.js +++ /dev/null @@ -1,294 +0,0 @@ -'use strict'; - -import { actions } from './actions.js'; - - -const [ - move_forward, move_backward, - turn_left, turn_right, - place, trigger, - pretend_frozen, unfreeze, - take_flag, - ...rest -] = actions; - - -test("move forward", () => { - const n = { id: 0, x: 0, y: 0, flags: { orientation: 'n' } }; - const s = { id: 0, x: 0, y: 0, flags: { orientation: 's' } }; - const e = { id: 0, x: 0, y: 0, flags: { orientation: 'e' } }; - const w = { id: 0, x: 0, y: 0, flags: { orientation: 'w' } }; - - expect(move_forward.propose(null, n, [1])).toEqual([ - { agent_changes: [{ agent_id: 0, x: 0, y: -1 }] }, - ]); - expect(move_forward.propose(null, s, [1])).toEqual([ - { agent_changes: [{ agent_id: 0, x: 0, y: 1 }] }, - ]); - expect(move_forward.propose(null, e, [1])).toEqual([ - { agent_changes: [{ agent_id: 0, x: 1, y: 0 }] }, - ]); - expect(move_forward.propose(null, w, [1])).toEqual([ - { agent_changes: [{ agent_id: 0, x: -1, y: 0 }] }, - ]); - - expect(move_forward.propose(null, n, [0])).toEqual([]); - expect(move_forward.propose(null, s, [-1])).toEqual([]); - expect(move_forward.propose(null, e, [0])).toEqual([]); - expect(move_forward.propose(null, w, [-1])).toEqual([]); -}); - - -test("move backward", () => { - const n = { id: 0, x: 0, y: 0, flags: { orientation: 'n' } }; - const s = { id: 0, x: 0, y: 0, flags: { orientation: 's' } }; - const e = { id: 0, x: 0, y: 0, flags: { orientation: 'e' } }; - const w = { id: 0, x: 0, y: 0, flags: { orientation: 'w' } }; - - expect(move_backward.propose(null, n, [1])).toEqual([ - { agent_changes: [{ agent_id: 0, x: 0, y: 1 }] }, - ]); - expect(move_backward.propose(null, s, [1])).toEqual([ - { agent_changes: [{ agent_id: 0, x: 0, y: -1 }] }, - ]); - expect(move_backward.propose(null, e, [1])).toEqual([ - { agent_changes: [{ agent_id: 0, x: -1, y: 0 }] }, - ]); - expect(move_backward.propose(null, w, [1])).toEqual([ - { agent_changes: [{ agent_id: 0, x: 1, y: 0 }] }, - ]); - - expect(move_backward.propose(null, n, [0])).toEqual([]); - expect(move_backward.propose(null, s, [-1])).toEqual([]); - expect(move_backward.propose(null, e, [0])).toEqual([]); - expect(move_backward.propose(null, w, [-1])).toEqual([]); -}); - - -test("turn_left", () => { - const n = { id: 0, x: 0, y: 0, flags: { orientation: 'n' } }; - const s = { id: 0, x: 0, y: 0, flags: { orientation: 's' } }; - const e = { id: 0, x: 0, y: 0, flags: { orientation: 'e' } }; - const w = { id: 0, x: 0, y: 0, flags: { orientation: 'w' } }; - - expect(turn_left.propose(null, n, [1])).toEqual([ - { agent_changes: [{ agent_id: 0, flags: { orientation: 'w' } }] }, - ]); - expect(turn_left.propose(null, s, [1])).toEqual([ - { agent_changes: [{ agent_id: 0, flags: { orientation: 'e' } }] }, - ]); - expect(turn_left.propose(null, e, [1])).toEqual([ - { agent_changes: [{ agent_id: 0, flags: { orientation: 'n' } }] }, - ]); - expect(turn_left.propose(null, w, [1])).toEqual([ - { agent_changes: [{ agent_id: 0, flags: { orientation: 's' } }] }, - ]); - - expect(turn_left.propose(null, n, [0])).toEqual([]); - expect(turn_left.propose(null, s, [-1])).toEqual([]); - expect(turn_left.propose(null, e, [0])).toEqual([]); - expect(turn_left.propose(null, w, [-1])).toEqual([]); -}); - - -test("turn_right", () => { - const n = { id: 0, x: 0, y: 0, flags: { orientation: 'n' } }; - const s = { id: 0, x: 0, y: 0, flags: { orientation: 's' } }; - const e = { id: 0, x: 0, y: 0, flags: { orientation: 'e' } }; - const w = { id: 0, x: 0, y: 0, flags: { orientation: 'w' } }; - - expect(turn_right.propose(null, n, [1])).toEqual([ - { agent_changes: [{ agent_id: 0, flags: { orientation: 'e' } }] }, - ]); - expect(turn_right.propose(null, s, [1])).toEqual([ - { agent_changes: [{ agent_id: 0, flags: { orientation: 'w' } }] }, - ]); - expect(turn_right.propose(null, e, [1])).toEqual([ - { agent_changes: [{ agent_id: 0, flags: { orientation: 's' } }] }, - ]); - expect(turn_right.propose(null, w, [1])).toEqual([ - { agent_changes: [{ agent_id: 0, flags: { orientation: 'n' } }] }, - ]); - - expect(turn_right.propose(null, n, [0])).toEqual([]); - expect(turn_right.propose(null, s, [-1])).toEqual([]); - expect(turn_right.propose(null, e, [0])).toEqual([]); - expect(turn_right.propose(null, w, [-1])).toEqual([]); -}); - - -test("place", () => { - const n = { id: 0, x: 0, y: 0, flags: { orientation: 'n' } }; - const s = { id: 0, x: 0, y: 0, flags: { orientation: 's' } }; - const e = { id: 0, x: 0, y: 0, flags: { orientation: 'e' } }; - const w = { id: 0, x: 0, y: 0, flags: { orientation: 'w' } }; - - expect(place.propose(null, n, [1])).toEqual([ - { lattice_changes: [ - { - x: 0, y: -1, from: 'empty', to: 'mutable', - flags: { emit: [1, 0, 0, 0, 0, 0, 0, 0] } - } - ]} - ]); - expect(place.propose(null, s, [1])).toEqual([ - { lattice_changes: [ - { - x: 0, y: 1, from: 'empty', to: 'mutable', - flags: { emit: [1, 0, 0, 0, 0, 0, 0, 0] } - } - ]} - ]); - expect(place.propose(null, e, [1])).toEqual([ - { lattice_changes: [ - { - x: 1, y: 0, from: 'empty', to: 'mutable', - flags: { emit: [1, 0, 0, 0, 0, 0, 0, 0] } - } - ]} - ]); - expect(place.propose(null, w, [1])).toEqual([ - { lattice_changes: [ - { - x: -1, y: 0, from: 'empty', to: 'mutable', - flags: { emit: [1, 0, 0, 0, 0, 0, 0, 0] } - } - ]} - ]); - - expect(place.propose(null, n, [0])).toEqual([]); - expect(place.propose(null, s, [-1])).toEqual([]); - expect(place.propose(null, e, [0])).toEqual([]); - expect(place.propose(null, w, [-1])).toEqual([]); -}); - - -test("trigger", () => { - const n = { id: 0, x: 0, y: 0, flags: { orientation: 'n' } }; - const s = { id: 0, x: 0, y: 0, flags: { orientation: 's' } }; - const e = { id: 0, x: 0, y: 0, flags: { orientation: 'e' } }; - const w = { id: 0, x: 0, y: 0, flags: { orientation: 'w' } }; - - expect(trigger.propose(null, n, [1])).toEqual([ - { lattice_changes: [{ - x: 0, y: -1, from: 'mutable', to: 'active', - flags: { emit: [1, 0, 0, 0, 0, 0, 0, 0] }, - }]}, - ]); - expect(trigger.propose(null, s, [1])).toEqual([ - { lattice_changes: [{ - x: 0, y: 1, from: 'mutable', to: 'active', - flags: { emit: [1, 0, 0, 0, 0, 0, 0, 0] }, - }]}, - ]); - expect(trigger.propose(null, e, [1])).toEqual([ - { lattice_changes: [{ - x: 1, y: 0, from: 'mutable', to: 'active', - flags: { emit: [1, 0, 0, 0, 0, 0, 0, 0] }, - }]}, - ]); - expect(trigger.propose(null, w, [1])).toEqual([ - { lattice_changes: [{ - x: -1, y: 0, from: 'mutable', to: 'active', - flags: { emit: [1, 0, 0, 0, 0, 0, 0, 0] }, - }]}, - ]); - - expect(trigger.propose(null, n, [0])).toEqual([]); - expect(trigger.propose(null, s, [-1])).toEqual([]); - expect(trigger.propose(null, e, [0])).toEqual([]); - expect(trigger.propose(null, w, [-1])).toEqual([]); - }); - - -test("pretend frozen", () => { - const agent = { id: 2, x: 0, y: 0, flags: { orientation: 'n' } }; - - expect(pretend_frozen.propose(null, agent, [1])).toEqual([{ - agent_changes: [{ - agent_id: 2, - flags: { pretend_frozen: true }, - }] - }]); - - expect(pretend_frozen.propose(null, agent, [0])).toEqual([{ - agent_changes: [{ - agent_id: 2, - flags: { pretend_frozen: false }, - }] - }]); -}); - - -test("unfreeze", () => { - const agent1 = { id: 0, x: 0, y: 0, flags: { orientation: 'n' } }; - const agent2 = { id: 1, x: 0, y: -1 }; - const agent3 = { id: 10, x: -1, y: 0 }; - const agents = [ agent1, agent2, agent3 ]; - - expect(unfreeze.propose({agents}, agent1, [1])).toEqual([{ - agent_changes: [{ - agent_id: 1, - flags: { frozen: false, emit: [ 0, 1, 0, 0, 0, 0, 0, 0 ] }, - }] - }]); - - agent1.flags.orientation = 'w'; - - expect(unfreeze.propose({agents}, agent1, [1])).toEqual([{ - agent_changes: [{ - agent_id: 10, - flags: { frozen: false, emit: [ 0, 1, 0, 0, 0, 0, 0, 0 ] }, - }] - }]); - - agent1.flags.orientation = 's'; - expect(unfreeze.propose({agents}, agent1, [1])).toEqual([]); - - expect(unfreeze.propose({agents}, agent1, [0])).toEqual([]); -}); - - -test("take flag", () => { - const agent = { id: 0, x: 0, y: 0, flags: { orientation: 'n' } }; - const other1 = { id: 1, x: 0, y: -1, flags: { flag: true } }; - const other2 = { id: 2, x: 0, y: 1, flags: { flag: false } }; - - const world = { agents: [ agent, other1, other2 ] }; - - expect(take_flag.propose(world, agent, [1])).toEqual([ - { agent_changes: [ - { agent_id: 1, flags: { flag: false } }, - { agent_id: 0, flags: { flag: true } }, - ]}, - ]); - - agent.flags.orientation = 's'; - expect(take_flag.propose(world, agent, [1])).toEqual([ - { - lattice_changes: [ - { - x: 0, y: 1, from: 'flag', to: 'empty', - flags: { emit: [ 0, 0, 1, 0, 0, 0, 0, 0 ] }, - }, - ], - agent_changes: [ - { agent_id: 0, flags: { flag: true } }, - ] - }, - ]); - - expect(take_flag.propose(world, agent, [0])).toEqual([]); -}); - - -test("frozen agents cannot move", () => { - const agent = { id: 0, x: 0, y: 0, flags: { orientation: 'n', frozen: true } }; - - const world = { agents: [agent] }; - - expect(move_forward.propose(world, agent, [1])).toEqual([]); - expect(move_backward.propose(world, agent, [1])).toEqual([]); - expect(turn_left.propose(world, agent, [1])).toEqual([]); - expect(turn_right.propose(world, agent, [1])).toEqual([]); -}); diff --git a/src/simulation/game.js b/src/simulation/game.js deleted file mode 100644 index 978289d..0000000 --- a/src/simulation/game.js +++ /dev/null @@ -1,255 +0,0 @@ -'use strict'; - - -import { random_choice, apply, shuffle } from '../util.js'; -import { mut_genome_insert, parse_genome } from '../genome/genome.js'; -import { world_update } from '../world/world.js'; -import { senses } from './senses.js'; -import { actions } from './actions.js'; -import { lattice_rules } from './lattice_rules.js'; -import { validity } from './validity.js'; -import { postprocess } from './postprocess.js'; - - -function is_wall(size, x, y) { - return ( - x === 0 || x === size-1 || - y === 0 || y === size-1 - ); -} -function is_corner(size, x, y) { - const subsize = Math.floor(size/3); - return ( - (x < subsize || x >= 2*subsize) && - (y < subsize || y >= 2*subsize) - ); -} -export function get_team(size, x, y) { - const subsize = Math.floor(size/3); - if (y < subsize) { - return 0; - } else if (x >= 2*subsize) { - return 1; - } else if (y >= 2*subsize) { - return 2; - } else if (x < subsize) { - return 3; - } else { - return undefined; - } -} - -export function setup_board(size) { - const lattice = [...Array(size)] - .map(() => [...Array(size)]) - .map((row, y) => row.map((_, x) => { - if (is_wall(size, x, y)) { - return { type: 'immutable', flags: {} }; - } else if (is_corner(size, x, y)) { - return { type: 'immutable', flags: {} }; - } else { - const team = get_team(size, x, y); - if (Math.random() > 0.95 && get_team(size, x, y) === undefined) { - return { type: 'flag', flags: { team } }; - } else { - return { type: 'empty', flags: { team } }; - } - } - })); - return lattice; -} - - -export function create_world(size, teams) { - const lattice = setup_board(size); - - const agents = teams.reduce( - (agents, team, team_num) => { - const team_cells = lattice.map((row, y) => row.map((cell, x) => [x, y, cell])).flat() - // only check cells with the right team - .filter(([x, y, cell]) => cell.type === 'empty' && cell.flags.team === team_num) - return agents.concat(team.reduce( - (acc, agent) => { - const available_cells = team_cells.filter(([x, y, cell]) => acc.reduce( - (occupied, a) => occupied && ((a.x !== x) || (a.y !== y)), - true - )) - const [x, y, ..._] = random_choice(available_cells); - const orientation = random_choice([ 'n', 'e', 's', 'w' ]); - return [...acc, {...agent, x, y, flags: { ...agent.flags, team: team_num, orientation } }]; - }, - [] - )); - }, - [] - ).flat(); - - return { lattice, lattice_rules, agents, actions, senses, validity }; -}; - - -// team structure: -// { -// agents -// genome -// score -// games -// } - -const N_INPUT = senses.reduce((acc, sense) => acc + sense.size, 0); -const N_OUTPUT = actions.reduce((acc, action) => acc + action.size, 0); -const MAX_MUTATIONS = 15; - - -let agent_id = 0; - -export function create_agent(genome, n_internal) { - return { - id: agent_id++, // !!!! side effect !!!! - net: parse_genome(genome), - state: [...Array(n_internal)].map(_ => (2*Math.random()) - 1), - } -} - - - -export function create_team(size, genome_size, n_internal) { - const genome = apply( - s => mut_genome_insert(s, 4), - genome_size, - {n_input: N_INPUT, n_internal, n_output: N_OUTPUT, genes: []}, - ); - console.log(N_INPUT, N_OUTPUT, genome); - - const agents = [...Array(size)].map(_ => create_agent(genome, n_internal)); - return { agents, genome, score: 0, games: 0 }; -} - - -export function child_team(team, keep=Math.floor(team.size/2)) { - const n_internal = get_size(team.genome) - N_INPUT - N_OUTPUT; - const genome = apply( - s => mutate_genome(s, 4), - Math.floor(MAX_MUTATIONS * Math.random()), - [N_INPUT, n_internal, N_OUTPUT, team.genome] - ); - - const old_agents = [...Array(team.agents.length - keep)].reduce( - (acc, _) => { - const idx = Math.floor(Math.random() * acc.length); - acc.splice(idx, 1); - return acc; - }, - ); - const new_agents = [...Array(team.agents.length - keep)].map(_ => create_agent(genome, n_internal)); - const agents = [old_agents, new_agents].flat(); - - return { agents, genome, score: 0, games: 0 }; -} - - -// game structure: -// { -// world: world -// team_indices: number[] -// time: number -// } - - -export function create_game(size, teams, team_indices) { - const world = create_world(size, team_indices.map(i => teams[i].agents)); - return { world, team_indices, time: 0 }; -} - - -export function step_game(game) { - return { - ...game, - world: world_update(game.world, postprocess), - time: game.time + 1, - }; -} - - -function score(lattice, team_num) { - const size = lattice.length; - - // count number of flags in the team's area - return lattice - .map((row, y) => row.map((cell, x) => [x, y, cell])) - .flat() - .filter(([x, y, cell]) => get_team(size, x, y) === team_num && cell.type === 'flag') - .length; -} - -export function finish_game(teams, game) { - const scores = [0, 1, 2, 3].map(t => score(game.world.lattice, t)); - return game.team_indices.reduce( - (acc, idx, i) => { - const team = teams[idx]; - acc.splice(idx, 1, {...team, score: team.score + scores[i], games: team.games+1}); - return acc; - }, - teams, - ); -} - - - -// epoch structure -// { -// game -// time -// teams -// } - -function random_indices(teams) { - return [...Array(teams.length - 4)].reduce( - (acc) => { - const idx = Math.floor(Math.random() * acc.length); - acc.splice(idx, 1); - return acc; - }, - [...teams.keys()] - ); -} - -let epoch_num = 0; -export function create_epoch(size, teams) { - return { - game: create_game(size, teams, random_indices(teams)), - time: 0, - epoch: epoch_num++, // !!!! side effects !!!! - size, - teams, - } -} - - -const GAME_STEPS = 10000 -const EPOCH_STEPS = 200 - -export function update_epoch(epoch) { - if (epoch.game.time < GAME_STEPS) { - return { ...epoch, game: step_game(epoch.game) }; - } else if (epoch.time < EPOCH_STEPS) { - return { - ...epoch, - teams: finish_game(epoch.teams, epoch.game), - game: create_game(size, epoch.teams, random_indices(epoch.teams)), - time: epoch.time+1 - }; - } else { - // epoch complete!! - const source_teams = epoch.teams - .map(team => { - const normalized_score = team.score/team.games; - const count = Math.ceil(16*normalized_score); - return [...Array(count > 0 ? count : 1)].map(x => team) - }) - .flat(); - const new_teams = [...Array(epoch.teams.length)] - .reduce((acc) => child_team(random_choice(source_teams)), []); - return create_epoch(epoch.size, new_teams); - } -} diff --git a/src/simulation/game.test.js b/src/simulation/game.test.js deleted file mode 100644 index 219dce6..0000000 --- a/src/simulation/game.test.js +++ /dev/null @@ -1,59 +0,0 @@ -'use strict'; - -import { apply } from '../util.js'; -import { setup_board, create_world } from './game.js'; - - -test("set up boards correctly", () => { - const _ = { type: 'empty', flags: {} }; - const a = { type: 'empty', flags: { team: 0 } }; - const b = { type: 'empty', flags: { team: 1 } }; - const c = { type: 'empty', flags: { team: 2 } }; - const d = { type: 'empty', flags: { team: 3 } }; - const W = { type: 'immutable', flags: {} }; - - expect(setup_board(6)).toEqual([ - [ W, W, W, W, W, W, ], - [ W, W, a, a, W, W, ], - [ W, d, _, _, b, W, ], - [ W, d, _, _, b, W, ], - [ W, W, c, c, W, W, ], - [ W, W, W, W, W, W, ], - ]); - expect(setup_board(9)).toEqual([ - [ W, W, W, W, W, W, W, W, W, ], - [ W, W, W, a, a, a, W, W, W, ], - [ W, W, W, a, a, a, W, W, W, ], - [ W, d, d, _, _, _, b, b, W, ], - [ W, d, d, _, _, _, b, b, W, ], - [ W, d, d, _, _, _, b, b, W, ], - [ W, W, W, c, c, c, W, W, W, ], - [ W, W, W, c, c, c, W, W, W, ], - [ W, W, W, W, W, W, W, W, W, ], - ]); -}); - - -test("creating a world works correctly", () => { - const id = 0; - const agent = (id) => ({ id, net: `${id}`, state: `s${id}` }); - const team1 = [agent(0), agent(1)]; - const team2 = [agent(2), agent(3)]; - const team3 = [agent(4), agent(5)]; - const team4 = [agent(6), agent(7)]; - - const world = create_world(6, [team1, team2, team3, team4]); - const agent_cell = (agent) => { - const { x, y } = agent; - return world.lattice[y][x]; - }; - - expect(agent_cell(world.agents[0])).toEqual({ type: 'empty', flags: { team: 0 } }); - expect(agent_cell(world.agents[1])).toEqual({ type: 'empty', flags: { team: 0 } }); - expect(agent_cell(world.agents[2])).toEqual({ type: 'empty', flags: { team: 1 } }); - expect(agent_cell(world.agents[3])).toEqual({ type: 'empty', flags: { team: 1 } }); - expect(agent_cell(world.agents[4])).toEqual({ type: 'empty', flags: { team: 2 } }); - expect(agent_cell(world.agents[5])).toEqual({ type: 'empty', flags: { team: 2 } }); - expect(agent_cell(world.agents[6])).toEqual({ type: 'empty', flags: { team: 3 } }); - expect(agent_cell(world.agents[7])).toEqual({ type: 'empty', flags: { team: 3 } }); -}); diff --git a/src/simulation/lattice_rules.js b/src/simulation/lattice_rules.js deleted file mode 100644 index cc2fc5b..0000000 --- a/src/simulation/lattice_rules.js +++ /dev/null @@ -1,77 +0,0 @@ -import { pairs } from '../util.js'; -import { get_team } from './game.js'; - -function mod(k, n) { - return ((k % n) + n) % n; -} - -function pos_wrap(lattice, x, y) { - const height = lattice.length; - const width = lattice[0].length; - return [mod(x, width), mod(y, height)]; -} - - -function neighbors(lattice, x, y) { - const offsets = [-1, 0, 1]; - const positions = pairs(offsets, offsets) - .filter(([dx, dy]) => dx !== 0 || dy !== 0) - .map(([dx, dy]) => pos_wrap(lattice, x+dx, y+dy)); - const neighbors = positions - .map(([x, y]) => [x, y, lattice[y][x]]); - return neighbors; -} - - -export const lattice_rules = { - - empty: (lattice, x, y) => { - const num_active_neighbors = neighbors(lattice, x, y) - .map(([x, y, cell]) => cell.type) - .filter(type => type === 'mutable' || type === 'active') - .length; - if (num_active_neighbors === 3) { - return { world_updates: [{ - x, y, from: 'empty', to: 'active', - flags: { emit: [0, 0, 0, 0, 0, 0, 0, 1] }, - }]}; - } else { - return { world_updates: [{ - x, y, flags: { team: get_team(lattice.length, x, y) }, - }]}; - } - }, - - active: (lattice, x, y) => { - const num_active_neighbors = neighbors(lattice, x, y) - .map(([x, y, cell]) => cell.type) - .filter(type => type === 'mutable' || type === 'active') - .length; - const die = { world_updates: [{ - x, y, from: 'active', to: 'empty', - flags: { emit: [0, 0, 0, 0, 0, 0, 0, -1] }, - }]}; - if (num_active_neighbors < 2) { - return die; - } else if (num_active_neighbors > 3) { - return die; - } - }, - - mutable: (lattice, x, y) => { - const num_active_neighbors = neighbors(lattice, x, y) - .map(([x, y, cell]) => cell.type) - .filter(type => type === 'active') - .length; - if (num_active_neighbors > 0) { - // become living cell - return { world_updates: [{ - x, y, from: 'empty', to: 'active', - flags: { emit: [0, 0, 0, 0, 0, 0, 0, 1] }, - }]}; - } - }, - immutable: () => {}, - flag: () => {}, - -}; diff --git a/src/simulation/lattice_rules.test.js b/src/simulation/lattice_rules.test.js deleted file mode 100644 index c285711..0000000 --- a/src/simulation/lattice_rules.test.js +++ /dev/null @@ -1,147 +0,0 @@ -import { world_update } from '../world/world.js'; -import { lattice_rules } from './lattice_rules.js'; - - -function apply(f, n, x0) { - if (n == 0) { - return x0; - } else { - return f(apply(f, n-1, x0)); - } -} - - -// remove cell team information -function clean_team(lattice) { - return lattice.map(row => row.map(cell => ({...cell, flags: {...cell.flags, team: undefined } }))); -} - - -test("blinker", () => { - const L = { type: 'active', flags: { team: undefined, } }; - const _ = { type: 'empty', flags: { team: undefined, } }; - const l = { type: 'active', flags: { team: undefined, emit: [0, 0, 0, 0, 0, 0, 0, 1] } }; - const d = { type: 'empty', flags: { team: undefined, emit: [0, 0, 0, 0, 0, 0, 0, -1] } }; - const lattice = [ - [ _, _, _, _, _ ], - [ _, _, _, _, _ ], - [ _, L, L, L, _ ], - [ _, _, _, _, _ ], - [ _, _, _, _, _ ], - ]; - - const world = { lattice, lattice_rules, agents: [], senses: [], actions: [], validity: [] }; - expect(clean_team(world_update(world).lattice)).toEqual([ - [ _, _, _, _, _ ], - [ _, _, l, _, _ ], - [ _, d, L, d, _ ], - [ _, _, l, _, _ ], - [ _, _, _, _, _ ], - ]); - expect(clean_team(world_update(world_update(world)).lattice)).toEqual([ - [ _, _, _, _, _ ], - [ _, _, d, _, _ ], - [ _, l, L, l, _ ], - [ _, _, d, _, _ ], - [ _, _, _, _, _ ], - ]); -}); - - -test("glider", () => { - const L = { type: 'active', flags: { team: undefined, } }; - const _ = { type: 'empty', flags: { team: undefined, } }; - const l = { type: 'active', flags: { team: undefined, emit: [0, 0, 0, 0, 0, 0, 0, 1] } }; - const d = { type: 'empty', flags: { team: undefined, emit: [0, 0, 0, 0, 0, 0, 0, -1] } }; - const lattice = [ - [ _, _, _, _, _, _ ], - [ _, _, _, L, _, _ ], - [ _, L, _, L, _, _ ], - [ _, _, L, L, _, _ ], - [ _, _, _, _, _, _ ], - [ _, _, _, _, _, _ ], - ]; - - const world = { lattice, lattice_rules, agents: [], senses: [], actions: [], validity: [] }; - //expect(clean_team(world_update(world).lattice)).toEqual([ - expect(clean_team(apply(world_update, 1, world).lattice)).toEqual([ - [ _, _, _, _, _, _ ], - [ _, _, l, d, _, _ ], - [ _, d, _, L, l, _ ], - [ _, _, L, L, _, _ ], - [ _, _, _, _, _, _ ], - [ _, _, _, _, _, _ ], - ]); - expect(clean_team(apply(world_update, 2, world).lattice)).toEqual([ - [ _, _, _, _, _, _ ], - [ _, _, d, l, _, _ ], - [ _, _, _, d, L, _ ], - [ _, _, L, L, l, _ ], - [ _, _, _, _, _, _ ], - [ _, _, _, _, _, _ ], - ]); - expect(clean_team(apply(world_update, 3, world).lattice)).toEqual([ - [ _, _, _, _, _, _ ], - [ _, _, _, d, _, _ ], - [ _, _, l, _, L, _ ], - [ _, _, d, L, L, _ ], - [ _, _, _, l, _, _ ], - [ _, _, _, _, _, _ ], - ]); - expect(clean_team(apply(world_update, 4, world).lattice)).toEqual([ - [ _, _, _, _, _, _ ], - [ _, _, _, _, _, _ ], - [ _, _, d, _, L, _ ], - [ _, _, l, d, L, _ ], - [ _, _, _, L, l, _ ], - [ _, _, _, _, _, _ ], - ]); -}); - - -test("beehive", () => { - const L = { type: 'active', flags: { team: undefined, } }; - const _ = { type: 'empty', flags: { team: undefined, } }; - const lattice = [ - [ _, _, _, _, _, _ ], - [ _, _, L, L, _, _ ], - [ _, L, _, _, L, _ ], - [ _, _, L, L, _, _ ], - [ _, _, _, _, _, _ ], - ]; - - const world = { lattice, lattice_rules, agents: [], senses: [], actions: [], validity: [] }; - //expect(clean_team(world_update(world).lattice)).toEqual([ - expect(clean_team(apply(world_update, 1, world).lattice)).toEqual(lattice); -}); - - -test("mutables are activated by neighboring actives", () => { - const L = { type: 'active', flags: { team: undefined, } }; - const _ = { type: 'empty', flags: { team: undefined, } }; - const l = { type: 'active', flags: { team: undefined, emit: [0, 0, 0, 0, 0, 0, 0, 1] } }; - const d = { type: 'empty', flags: { team: undefined, emit: [0, 0, 0, 0, 0, 0, 0, -1] } }; - const M = { type: 'mutable', flags: { team: undefined, } }; - - const lattice = [ - [ _, _, _, _, ], - [ _, L, M, _, ], - [ _, M, M, _, ], - [ _, _, _, _, ], - ]; - - const world = { lattice, lattice_rules, agents: [], senses: [], actions: [], validity: [] }; - - expect(clean_team(apply(world_update, 1, world).lattice)).toEqual([ - [ _, _, _, _, ], - [ _, L, l, _, ], - [ _, l, l, _, ], - [ _, _, _, _, ], - ]); - expect(clean_team(apply(world_update, 2, world).lattice)).toEqual([ - [ _, _, _, _, ], - [ _, L, L, _, ], - [ _, L, L, _, ], - [ _, _, _, _, ], - ]); -}); diff --git a/src/simulation/postprocess.js b/src/simulation/postprocess.js deleted file mode 100644 index d50839e..0000000 --- a/src/simulation/postprocess.js +++ /dev/null @@ -1,18 +0,0 @@ -'use strict'; - -export const postprocess = [ - (world) => ({ - ...world, - agents: world.agents.map(a => { - const {x, y} = a; - if ( - world.lattice[y][x].type === 'mutable' || - world.lattice[y][x].type === 'active' - ) { - return { ...a, flags: {...a.flags, frozen: true } }; - } else { - return a; - } - }), - }), -]; diff --git a/src/simulation/postprocess.test.js b/src/simulation/postprocess.test.js deleted file mode 100644 index dc77c6a..0000000 --- a/src/simulation/postprocess.test.js +++ /dev/null @@ -1,37 +0,0 @@ -'use strict'; - -import { world_update } from '../world/world.js'; -import { postprocess } from './postprocess.js'; - -test("agents freeze when finishing on a mutable or active", () => { - const agent = { - id: 1, - net: { compute: () => [[1], null] }, - state: null, - x: 0, y: 0, - flags: {}, - }; - - const lattice = [[{ type: 'empty', flags: {} }]]; - - const world = { - lattice, - lattice_rules: { empty: ()=>{}, active: ()=>{}, mutable: ()=>{} }, - agents: [agent], - senses: [], - actions: [], - validity: [], - }; - - expect(world_update(world, postprocess).agents[0]).toEqual(agent); - world.lattice[0][0].type = 'mutable'; - expect(world_update(world, postprocess).agents[0]).toEqual({ - ...agent, - flags: { frozen: true }, - }); - world.lattice[0][0].type = 'active'; - expect(world_update(world, postprocess).agents[0]).toEqual({ - ...agent, - flags: { frozen: true }, - }); -}); diff --git a/src/simulation/senses.js b/src/simulation/senses.js deleted file mode 100644 index 970f86b..0000000 --- a/src/simulation/senses.js +++ /dev/null @@ -1,182 +0,0 @@ -'use strict'; - - -const frozen = { - size: 1, - read: (world, agent) => { - if (agent.flags.frozen === true) { - return [ 1 ]; - } else { - return [ 0 ]; - } - }, -}; - - -// add two arrays together element-wise with a scaling factor -function array_scalesum(a, s, b) { - return a.map((x, i) => x + (s*b[i])); -} -// determine the square of the distance between two cells -function lattice_dist2(x0, y0, x1, y1) { - if (x0 === x1 && y0 === y1) { return 1; } // not proper distance but avoids divide-by-zero errors c: - return ((x0-x1)**2) + ((y0-y1)**2); -} -const hear = { - size: 8, - read: (world, agent) => { - const {x, y} = agent; - const lattice_sounds = world.lattice - .map((row, cy) => row.map((cell, cx) => [ 1/lattice_dist2(x, y, cx, cy), cell ])) - .flat() - .filter(([scale, cell]) => cell.flags.emit !== undefined) - .reduce( - (acc, [scale, cell]) => array_scalesum(acc, scale, cell.flags.emit), - [0, 0, 0, 0, 0, 0, 0, 0] - ); - const agent_sounds = world.agents - .filter(a => a.flags.emit !== undefined) - .reduce( - (acc, a) => array_scalesum(acc, 1/lattice_dist2(x, y, a.x, a.y), a.flags.emit), - [0, 0, 0, 0, 0, 0, 0, 0] - ); - - return array_scalesum(lattice_sounds, 1, agent_sounds).map(ch => Math.tanh(ch)); - }, -}; - - -const [VIS_WIDTH, VIS_HEIGHT] = [31, 31]; -const [VIS_HWIDTH, VIS_HHEIGHT] = [Math.floor(VIS_WIDTH/2), Math.floor(VIS_HEIGHT/2)]; -function identity_mod(n, p) { - const mod = (n % (2*p)) - p + 1; - return mod/p; -} - -function world_pos_to_vision_pos(world, agent, x, y) { - const dx = x - agent.x; - const dy = y - agent.y; - const orientation = agent.flags.orientation || 'n'; - switch (orientation) { - case 'n': - return [VIS_HWIDTH+dx, VIS_HEIGHT+dy-1]; - case 's': - return [VIS_HWIDTH-dx, VIS_HEIGHT-dy-1]; - case 'e': - return [VIS_HWIDTH+dy, VIS_HEIGHT-dx-1]; - case 'w': - return [VIS_HWIDTH-dy, VIS_HEIGHT+dx-1]; - } -} - -function vision_pos_to_world_pos(world, agent, x, y) { - const dx = x-VIS_HWIDTH; - const dy = y-VIS_HEIGHT+1; - const orientation = agent.flags.orientation || 'n'; - switch (orientation) { - case 'n': - return [agent.x + dx, agent.y + dy]; - case 's': - return [agent.x - dx, agent.y - dy]; - case 'e': - return [agent.x - dy, agent.y - dx]; - case 'w': - return [agent.x + dy, agent.y + dx]; - } -} - -function world_pos_to_vision_idx(world, agent, x, y) { - const [vx, vy] = world_pos_to_vision_pos(world, agent, x, y); - return (VIS_WIDTH * vy) + vx; -} -function vision_idx_to_world_pos(world, agent, idx) { - const vx = idx % VIS_WIDTH; - const vy = Math.floor(idx / VIS_WIDTH); - const result = vision_pos_to_world_pos(world, agent, vx, vy); - return result; -} - -function see_cell(world, x, y) { - const team = 0; - const orientation = 0; - if (!world.lattice[y] || !world.lattice[y][x]) { - // beyond the map edge - return [ 0, 0, 0 ]; - } - const type = { - active: -0.8, - mutable: -0.4, - empty: 0.0, - immutable: 0.4, - flag: 0.8, - }[world.lattice[y][x].type]; - return [team, orientation, type]; -} - - -function relative_orientation(viewer, agent) { - switch(viewer.flags.orientation) { - case 'n': return { n: -0.8, e: -0.4, s: 0.4, w: 0.8 }[agent.flags.orientation]; - case 'e': return { e: -0.8, s: -0.4, w: 0.4, n: 0.8 }[agent.flags.orientation]; - case 's': return { s: -0.8, w: -0.4, n: 0.4, e: 0.8 }[agent.flags.orientation]; - case 'w': return { w: -0.8, n: -0.4, e: 0.4, s: 0.8 }[agent.flags.orientation]; - } -} - - -function see_agent(viewer, agent) { - const team = { - 0: -0.8, - 1: -0.4, - 2: 0.4, - 3: 0.8, - }[agent.flags.team] + (identity_mod(agent.id, 11)/16); - const orientation = relative_orientation(viewer, agent) + (identity_mod(agent.id, 37)/16); - const frozen = agent.flags.frozen || agent.flags.pretend_frozen; - const type = (() => { - if (frozen && agent.flags.flag) { - return -0.4; - } else if (frozen) { - return -0.8; - } else if (agent.flags.flag) { - return 0.8; - } else { - return 0.0; - } - })() + (identity_mod(agent.id, 499)/16); - - return [team, orientation, type]; -} - - -const see = { - size: 3*VIS_WIDTH * VIS_HEIGHT, - read: (world, agent) => { - const indices = [...Array(VIS_WIDTH*VIS_HEIGHT).keys()] - const vision = indices - .map(idx => { - const [x, y] = vision_idx_to_world_pos(world, agent, idx); - return see_cell(world, x, y); - }); - const result = world.agents.reduce( - (acc, a) => { - const idx = world_pos_to_vision_idx(world, agent, a.x, a.y); - - if (idx < 0 || idx >= VIS_WIDTH*VIS_HEIGHT) { - return acc; - } else { - acc.splice(idx, 1, see_agent(agent, a)); - return acc; - } - }, - vision - ); - return result.flat(); - }, -}; - - - -export const senses = [ - frozen, hear, see, { size: 1, read: () => [1] }, -]; diff --git a/src/simulation/senses.test.js b/src/simulation/senses.test.js deleted file mode 100644 index d3941c7..0000000 --- a/src/simulation/senses.test.js +++ /dev/null @@ -1,499 +0,0 @@ -'use strict'; - -import { senses } from './senses.js'; - -const [ frozen, hear, see, ...rest ] = senses; - - -test("frozen sense", () => { - const agent = { - id: 0, x: 0, y: 0, - flags: { frozen: true, }, - }; - - expect(frozen.read(null, agent)).toEqual([1]); - agent.flags.frozen = false; - expect(frozen.read(null, agent)).toEqual([0]); -}); - - -// --===== hearing =====-- - -test("hear nothing", () => { - const agent = { id: 4, x: 1, y: 1, flags: {} }; - const o = { type: 'empty', flags: {} }; - const world = { - lattice: [ - [ o, o, o ], - [ o, o, o ], - [ o, o, o ], - ], - agents: [agent], - }; - - expect(hear.read(world, agent)).toEqual([ - Math.tanh(0), Math.tanh(0), Math.tanh(0), Math.tanh(0), - Math.tanh(0), Math.tanh(0), Math.tanh(0), Math.tanh(0), - ]); -}); - - -test("hear self", () => { - const agent = { id: 4, x: 1, y: 1, flags: { emit: [1, 0, 0.5, 0, 0, 0, 0, 1] } }; - const o = { type: 'empty', flags: {} }; - const world = { - lattice: [ - [ o, o, o ], - [ o, o, o ], - [ o, o, o ], - ], - agents: [agent], - }; - - expect(hear.read(world, agent)).toEqual([ - Math.tanh(1), Math.tanh(0), Math.tanh(0.5), Math.tanh(0), - Math.tanh(0), Math.tanh(0), Math.tanh(0), Math.tanh(1), - ]); -}); - - -test("hear cells", () => { - const agent = { id: 4, x: 2, y: 2, flags: {} }; - const o = { type: 'empty', flags: {} }; - const s = { type: 'empty', flags: { emit: [1, 0.5, 0.25, 0.125, 0, 0, 0, 0] } }; - const world = { - lattice: [ - [ o, o, s, o, o ], - [ o, o, o, o, o ], - [ o, s, o, o, o ], - [ o, o, o, o, o ], - [ o, o, o, o, o ], - ], - agents: [agent], - }; - - expect(hear.read(world, agent)).toEqual([ - Math.tanh(1.25), Math.tanh(0.625), Math.tanh(0.3125), Math.tanh(0.15625), - Math.tanh(0), Math.tanh(0), Math.tanh(0), Math.tanh(0), - ]); -}); - - -test("hear cells & agents", () => { - const agent = { id: 4, x: 2, y: 2, flags: {} }; - const agent2 = { id: 0, x: 2, y: 4, flags: { emit: [0, 0, 0, 0, 1, 1, 1, 1] } }; - const o = { type: 'empty', flags: {} }; - const s = { type: 'empty', flags: { emit: [1, 0.5, 0.25, 0.125, 0, 0, 0, 0] } }; - const world = { - lattice: [ - [ o, o, s, o, o ], - [ o, o, o, o, o ], - [ o, s, o, o, o ], - [ o, o, o, o, o ], - [ o, o, o, o, o ], - ], - agents: [agent, agent2], - }; - - expect(hear.read(world, agent)).toEqual([ - Math.tanh(1.25), Math.tanh(0.625), Math.tanh(0.3125), Math.tanh(0.15625), - Math.tanh(0.25), Math.tanh(0.25), Math.tanh(0.25), Math.tanh(0.25), - ]); -}); - - -// --===== vision =====-- - - -test("see agents", () => { - const o = { type: 'empty', flags: {} }; - const lattice = [ - [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ], - [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ], - [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ], - [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ], - [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ], - [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ], - [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ], - [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ], - [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ], - [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ], - [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ], - [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ], - [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ], - [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ], - [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ], - [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ], - [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ], - [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ], - [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ], - [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ], - [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ], - [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ], - [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ], - [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ], - [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ], - [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ], - [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ], - [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ], - [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ], - [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ], - [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ], - ]; - const agentA = { id: 0, x: 15, y: 30, flags: { team: 0, orientation: 'n' } }; - const agentB = { id: 1, x: 15, y: 0, flags: { team: 1, orientation: 's' } }; - const agentC = { id: 2, x: 0, y: 15, flags: { team: 2, orientation: 'e', flag: true } }; - const agentD = { id: 3, x: 30, y: 15, flags: { team: 3, orientation: 'w', frozen: true } }; - const agentE = { id: 4, x: 30, y: 30, flags: { team: 0, orientation: 's', flag: true, frozen: true } }; - const world = { - lattice, - agents: [agentA, agentB, agentC, agentD, agentE], - }; - - const an = [ - -0.8 + 0.0625*(-10/11), // team + identity - -0.8 + 0.0625*(-36/37), // orientation + identity - 0.0 + 0.0625*(-498/499), // class + identity - ]; - const as = [ - -0.8 + 0.0625*(-10/11), // team + identity - 0.4 + 0.0625*(-36/37), // orientation + identity - 0.0 + 0.0625*(-498/499), // class + identity - ]; - const ae = [ - -0.8 + 0.0625*(-10/11), // team + identity - -0.4 + 0.0625*(-36/37), // orientation + identity - 0.0 + 0.0625*(-498/499), // class + identity - ]; - const aw = [ - -0.8 + 0.0625*(-10/11), // team + identity - 0.8 + 0.0625*(-36/37), // orientation + identity - 0.0 + 0.0625*(-498/499), // class + identity - ]; - - const bn = [ - -0.4 + 0.0625*(-9/11), // team + identity - -0.8 + 0.0625*(-35/37), // orientation + identity - 0.0 + 0.0625*(-497/499), // class + identity - ]; - const bs = [ - -0.4 + 0.0625*(-9/11), // team + identity - 0.4 + 0.0625*(-35/37), // orientation + identity - 0.0 + 0.0625*(-497/499), // class + identity - ]; - const be = [ - -0.4 + 0.0625*(-9/11), // team + identity - -0.4 + 0.0625*(-35/37), // orientation + identity - 0.0 + 0.0625*(-497/499), // class + identity - ]; - const bw = [ - -0.4 + 0.0625*(-9/11), // team + identity - 0.8 + 0.0625*(-35/37), // orientation + identity - 0.0 + 0.0625*(-497/499), // class + identity - ]; - - const cn = [ - 0.4 + 0.0625*(-8/11), // team + identity - -0.8 + 0.0625*(-34/37), // orientation + identity - 0.8 + 0.0625*(-496/499), // class + identity - ]; - const cs = [ - 0.4 + 0.0625*(-8/11), // team + identity - 0.4 + 0.0625*(-34/37), // orientation + identity - 0.8 + 0.0625*(-496/499), // class + identity - ]; - const ce = [ - 0.4 + 0.0625*(-8/11), // team + identity - -0.4 + 0.0625*(-34/37), // orientation + identity - 0.8 + 0.0625*(-496/499), // class + identity - ]; - const cw = [ - 0.4 + 0.0625*(-8/11), // team + identity - 0.8 + 0.0625*(-34/37), // orientation + identity - 0.8 + 0.0625*(-496/499), // class + identity - ]; - - const dn = [ - 0.8 + 0.0625*(-7/11), // team + identity - -0.8 + 0.0625*(-33/37), // orientation + identity - -0.8 + 0.0625*(-495/499), // class + identity - ]; - const ds = [ - 0.8 + 0.0625*(-7/11), // team + identity - 0.4 + 0.0625*(-33/37), // orientation + identity - -0.8 + 0.0625*(-495/499), // class + identity - ]; - const de = [ - 0.8 + 0.0625*(-7/11), // team + identity - -0.4 + 0.0625*(-33/37), // orientation + identity - -0.8 + 0.0625*(-495/499), // class + identity - ]; - const dw = [ - 0.8 + 0.0625*(-7/11), // team + identity - 0.8 + 0.0625*(-33/37), // orientation + identity - -0.8 + 0.0625*(-495/499), // class + identity - ]; - - const en = [ - -0.8 + 0.0625*(-6/11), // team + identity - -0.8 + 0.0625*(-32/37), // orientation + identity - -0.4 + 0.0625*(-494/499), // class + identity - ]; - const es = [ - -0.8 + 0.0625*(-6/11), // team + identity - 0.4 + 0.0625*(-32/37), // orientation + identity - -0.4 + 0.0625*(-494/499), // class + identity - ]; - const ee = [ - -0.8 + 0.0625*(-6/11), // team + identity - -0.4 + 0.0625*(-32/37), // orientation + identity - -0.4 + 0.0625*(-494/499), // class + identity - ]; - const ew = [ - -0.8 + 0.0625*(-6/11), // team + identity - 0.8 + 0.0625*(-32/37), // orientation + identity - -0.4 + 0.0625*(-494/499), // class + identity - ]; - - const _ = [ - 0.0, 0.0, 0.0, - ]; - - - expect(see.read(world, agentA)).toEqual([ - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, bs, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - ce, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, dw, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, an, _, _, _, _, _, _, _, _, _, _, _, _, _, _, es, - ]); - expect(see.read(world, agentB)).toEqual([ - en, _, _, _, _, _, _, _, _, _, _, _, _, _, _, as, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - de, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, cw, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, bn, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - ]); - expect(see.read(world, agentC)).toEqual([ - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, ds, _, _, _, _, _, _, _, _, _, _, _, _, _, _, ee, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - be, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, aw, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, cn, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - ]); - expect(see.read(world, agentD)).toEqual([ - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, cs, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - ae, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, bw, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - ew, _, _, _, _, _, _, _, _, _, _, _, _, _, _, dn, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - ]); -}); - - -test("seeing 'nothing' looks like teamless empty squares", () => { - const lattice = [[]]; - const agent = { id: 0, x: 0, y: 0, flags: { team: 0, orientation: 'n' } }; - const world = { - lattice, agents: [agent], - }; - - const _ = [ - 0.0, 0.0, 0.0, - ]; - const an = [ - -0.8 + 0.0625*(-10/11), // team + identity - -0.8 + 0.0625*(-36/37), // orientation + identity - 0.0 + 0.0625*(-498/499), // class + identity - ]; - - expect(see.read(world, agent)).toEqual([ - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, an, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - ]); -}); - - -test("agents pretending to be frozen appear frozen", () => { - const lattice = [[]]; - const agent = { id: 0, x: 0, y: 0, flags: { team: 0, orientation: 'n', pretend_frozen: true } }; - const world = { - lattice, agents: [agent], - }; - - const _ = [ - 0.0, 0.0, 0.0, - ]; - const an = [ - -0.8 + 0.0625*(-10/11), // team + identity - -0.8 + 0.0625*(-36/37), // orientation + identity - -0.8 + 0.0625*(-498/499), // class + identity - ]; - - expect(see.read(world, agent)).toEqual([ - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, an, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, - ]); -}); diff --git a/src/simulation/trial.js b/src/simulation/trial.js deleted file mode 100644 index b4462c5..0000000 --- a/src/simulation/trial.js +++ /dev/null @@ -1,12 +0,0 @@ -'use strict'; - -import { create_team, create_epoch, update_epoch } from './game.js'; - -const start_teams = [...Array(50)].map(x => create_team(32, 5, 5)); - -let epoch = create_epoch(start_teams); - -while (epoch.epoch < 1) { - console.log(epoch.epoch, epoch.time, epoch.game.time); - epoch = update_epoch(epoch); -} diff --git a/src/simulation/validity.js b/src/simulation/validity.js deleted file mode 100644 index de4acd1..0000000 --- a/src/simulation/validity.js +++ /dev/null @@ -1,14 +0,0 @@ -export const validity = [ - // prevent agents from moving onto immutables - (world, proposal) => (proposal.agent_changes || []).reduce( - (acc, change) => { - const {x, y} = change; - if (x !== undefined && y !== undefined && world.lattice[y][x].type === 'immutable') { - return false; - } else { - return acc; - } - }, - true, - ), -]; diff --git a/src/simulation/validity.test.js b/src/simulation/validity.test.js deleted file mode 100644 index ba9e684..0000000 --- a/src/simulation/validity.test.js +++ /dev/null @@ -1,43 +0,0 @@ -'use strict'; - -import { world_update } from '../world/world.js'; -import { validity } from './validity.js'; - -test("agents are not allowed to move into immutables", () => { - const actions = [{ - size: 1, propose: (world, agent, head) => { - return [{ - agent_changes: [{ - agent_id: agent.id, - x: agent.x + 1, y: agent.y, - }], - }]; - }, - }]; - - const agent = { - id: 1, - net: { compute: () => [[1], null] }, - state: null, - x: 0, y: 0, - flags: {}, - }; - - const lattice = [[{ type: 'empty', flags: {} }, { type: 'immutable', flags: {} }]]; - - const world = { - lattice, - lattice_rules: { empty: ()=>{}, immutable: ()=>{} }, - agents: [agent], - senses: [], - actions, - validity, - }; - - expect(world_update(world).agents[0]).toEqual(agent); - world.validity = []; - expect(world_update(world).agents[0]).toEqual({ - ...agent, - x: 1, y: 0, - }); -}); diff --git a/src/ui/canvas.js b/src/ui/canvas.js deleted file mode 100644 index b04b966..0000000 --- a/src/ui/canvas.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict'; - -export function draw(canvas, size, fn) { - const ctx = canvas.getContext("2d"); - const scale = canvas.clientWidth/size; - ctx.save(); - ctx.scale(scale, scale); - ctx.clearRect(0, 0, size, size); - fn(ctx); - ctx.restore(); -} diff --git a/src/ui/index.js b/src/ui/index.js deleted file mode 100644 index 01068cb..0000000 --- a/src/ui/index.js +++ /dev/null @@ -1,75 +0,0 @@ -import { draw } from './canvas.js'; -import { create_team, create_epoch, update_epoch } from '../simulation/game.js'; - - -console.log("generating agents..."); -const start_teams = [...Array(4)].map(x => create_team(2, 400, 50)); -console.log("creating epoch..."); -let epoch = create_epoch(60, start_teams); -console.log("ready!"); - - -function draw_cell(ctx, x, y, cell) { - ctx.fillStyle = (() => { - switch (cell.type) { - case 'empty': - return '#ffffff'; - case 'immutable': - return '#0000ff'; - case 'mutable': - return '#555555'; - case 'active': - return '#000000'; - case 'flag': - return '#ffff00'; - default: - return '#00ff00'; - } - })(); - ctx.fillRect(x, y, 1, 1); -} - -function draw_agent(ctx, agent) { - ctx.beginPath(); - ctx.fillStyle = '#ff0000'; - const { x, y } = agent; - ctx.arc(x+.5, y+.5, .5, 0, 2*Math.PI); - ctx.fill(); -} - - -function render(canvas) { - draw(canvas, epoch.size, (ctx) => { - for (let y=0; y<epoch.size; y++) { - for (let x=0; x<epoch.size; x++) { - draw_cell(ctx, x, y, epoch.game.world.lattice[y][x]); - } - } - epoch.game.world.agents.forEach(a => draw_agent(ctx, a)); - }); -} - - -function update(canvas) { - console.log('update'); - epoch = update_epoch(epoch); - render(canvas); - setTimeout(() => update(canvas), 1); -} - - -function main() { - const canvas = document.getElementById('canvas'); - window.onresize = () => { - const size = 0.95*window.innerWidth - canvas.width = size; - canvas.height = size; - render(canvas); - } - window.onresize(); - console.log("c:"); - update(canvas); -} - - -window.onload = main; diff --git a/src/util.js b/src/util.js deleted file mode 100644 index f83039f..0000000 --- a/src/util.js +++ /dev/null @@ -1,62 +0,0 @@ -'use strict';
-
-
-export function create(obj, proto=Object.prototype) {
- const props = Object.keys(obj)
- .map((key) => [ key, { value: obj[key], enumerable: true } ])
- .reduce((acc, [ key, value ]) => ({ ...acc, [key]: value }), {});
-
- return Object.create(proto, props);
-};
-
-
-export function random_choice(collection, r=Math.random()) {
- const idx = Math.floor(collection.length * r);
- return collection[idx];
-}
-
-
-export function pairs(arr1, arr2) {
- return arr1
- .map((x, i) => arr2.map(y => [x, y]))
- .flat();
-}
-
-
-export function deepEqual(a, b, debug=false) {
- if (typeof(a) === 'object') {
- if (typeof(b) === 'object') {
- // do deep equality
- return [...new Set(Object.keys(a).concat(Object.keys(b)))].reduce(
- (acc, key) => {
- return acc && deepEqual(a[key], b[key]);
- },
- true
- );
- } else {
- // one object, one non-object
- return false;
- }
- } else {
- return a === b;
- }
-}
-
-
-export function apply(f, n, x0) {
- if (n == 0) {
- return x0;
- } else {
- return f(apply(f, n-1, x0));
- }
-}
-
-
-export function shuffle(arr) {
- const shuffled = [...arr];
- for (let i=arr.length-1; i > 0; i--) {
- const j = Math.floor(Math.random() * (i+1));
- [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]
- }
- return shuffled;
-}
diff --git a/src/world/README.md b/src/world/README.md deleted file mode 100644 index a88eadc..0000000 --- a/src/world/README.md +++ /dev/null @@ -1,53 +0,0 @@ -# world - -The world is composed of a cell lattice. Each cell can contain a specific type of cell, and these cells -evolve according to fixed, regular rules. - -Agents exist on top of the cell lattice. They occupy specific cell locations, but those locations are -otherwise considered empty. Agents exist independent of the cells and evolve independent of them, though of -course they are intertwined. - -Time step process: - - * Agents update internal state and propose moves. - * World updates - * Agent moves are resolved in the new world, and agent status is updated. - * World state is updated to include agents. - -Cell types: -*(all cells, except for Empties and Flags, count as GoL living)* - - * Empty (territory-colored, GoL dead) - * Immutable - * Mutable - * Active (GoL living) - * Flag - -Agent aspects: (64) - * team (4) - * orientation (4) - * mobile/frozen (2) - * has flag (2) - * identity (3-channel) - -Agents have *internal state* corresponding to the state of their internal neurons (and roughly corresponding to their memories and experiences) and *status*, which refers to things like their current orientation, position, and mobility. - - -Agent senses: - * Hearing (inverse square, infinite range) - * Sight (2D top-down, see further ahead than behind or to the sides, 7-channel) - * Match timer - * Epoch timer - -Agent actions: - * Move forward/backward - * Turn left/right - * Place mutable - * Trigger mutable -> active (5x5 square ahead of agent) - * Play frozen - * Unfreeze - * Take flag - * Drop flag (immediately ahead of agent) - - - When carrying a flag, an agent counts as a flag tile (and other agents can steal the flag from them!). Otherwise, an agent counts as an empty tile. diff --git a/src/world/agent.js b/src/world/agent.js deleted file mode 100644 index 2be7420..0000000 --- a/src/world/agent.js +++ /dev/null @@ -1,56 +0,0 @@ -'use strict'; - -import { sense_read } from './sense.js'; -import { proposal_merge } from './proposal.js'; - - -export function agent_decide(world, agent, senses, actions) { - const inputs = senses.map(s => sense_read(world, agent, s)).flat(); - const [result, state] = agent.net.compute(inputs, agent.state); - console.log(result, state); - - const new_agent = { ...agent, state }; - const [proposals, _] = actions.reduce( - ([proposals, result], action) => { - const head = result.slice(0, action.size); - const tail = result.slice(action.size); - - const props = action - .propose(world, new_agent, head) - .reduce( - (acc, proposal) => proposal_merge(acc, proposal), - proposals - ); - - return [props, tail]; - }, - [[], result] - ); - - return [new_agent, proposals]; -} - - -function change_apply(agent, ch) { - const { x, y, flags } = ch; - return { - ...agent, - x: (x || agent.x), y: (y || agent.y), - flags: { ...agent.flags, ...flags }, - }; -} - - -export function agent_apply(agent, proposals) { - return proposals - .filter(p => p.agent_changes) - .reduce( - (acc, p) => p.agent_changes - .filter(ch => ch.agent_id === agent.id) - .reduce( - (acc_, ch) => change_apply(acc_, ch), - acc - ), - agent - ); -} diff --git a/src/world/agent.test.js b/src/world/agent.test.js deleted file mode 100644 index d10a43a..0000000 --- a/src/world/agent.test.js +++ /dev/null @@ -1,49 +0,0 @@ -import { agent_decide, agent_apply } from './agent.js'; - - -test("simple agent decisions", () => { - const lattice = null; - const agent = { - id: 3, - net: { compute: () => [[0, 1], 'state'] }, - state: null, - x: 0, y: 0, - flags: {}, - }; - - const senses = []; - const actions = [ - { size: 1, propose: (world, agent, head) => [{ agent_changes: [{ agent_id: 3, flags: { act1: head[0] } }] }] }, - { size: 1, propose: (world, agent, head) => [{ agent_changes: [{ agent_id: 3, flags: { act2: head[0] } }] }] }, - ]; - - expect(agent_decide(lattice, agent, senses, actions)).toEqual([ - { ...agent, state: 'state' }, - actions.map((a, idx) => a.propose(null, null, [idx])).flat(), - ]); -}); - - -test("apply proposals to agent", () => { - const props = [ - { agent_changes: [{ agent_id: 14, x: 4, y: 3 }] }, - { agent_changes: [{ agent_id: 16, x: 5, y: 3 }] }, - { agent_changes: [{ agent_id: 14, flags: { frozen: true } }] }, - ]; - - const agent = { - id: 14, - net: null, - state: null, - x: 0, y: 0, - flags: { frozen: false, emit: 6 } - }; - - expect(agent_apply(agent, props)).toEqual({ - id: 14, - net: null, - state: null, - x: 4, y: 3, - flags: { frozen: true, emit: 6 } - }); -}); diff --git a/src/world/lattice.js b/src/world/lattice.js deleted file mode 100644 index 066a5ca..0000000 --- a/src/world/lattice.js +++ /dev/null @@ -1,54 +0,0 @@ -'use strict'; - -// get the proposals for cell updates -export function lattice_update(lattice, update_rules) { - return lattice - .map((row, y) => row.map((cell, x) => [x, y, cell.type])) - .flat() - .reduce((acc, [x, y, type]) => [...acc, update_rules[type](lattice, x, y)], []) - .filter(x => x !== undefined) -} - - -// check if, given the current lattice configuration, a proposal is valid -export function lattice_valid(lattice, proposal) { - if (!proposal.world_updates) { return true; } - return proposal.world_updates.reduce( - (acc, update) => { - const valid = - (update.x >= 0 && update.x < lattice[0].length) && - (update.y >= 0 && update.y < lattice.length) && - (lattice[update.y][update.x].type == update.from) - return valid && acc; - }, - true - ); -} - - -// apply a set of proposals, returning the new lattice -export function lattice_apply(lattice, proposals) { - const result = proposals.reduce( - (acc, prop) => { - const change = (prop.world_updates || []).reduce( - (acc_, update) => { - const cell = acc_[update.y][update.x]; - if (update.to) { cell.type = update.to; } - if (update.flags) { - cell.flags = { ...(cell.flags || {}), ...update.flags }; - //cell.flags = cell.flags || {} - //// this is very side-effect-y but i couldn't think of a nicer compatible way of doing it 😔 - //for (let k of Object.keys(update.flags)) { - // cell.flags[k] = update.flags[k]; - //} - } - return acc_ - }, - [...acc] - ); - return change; - }, - [...lattice] - ); - return result; -} diff --git a/src/world/lattice.test.js b/src/world/lattice.test.js deleted file mode 100644 index d1bdd13..0000000 --- a/src/world/lattice.test.js +++ /dev/null @@ -1,111 +0,0 @@ -'use strict'; - -import { lattice_update, lattice_valid, lattice_apply } from './lattice.js'; - - -test("growth update rule", () => { - const lattice = [[ - { type: 'empty', flags: {} }, - { type: 'empty', flags: {} }, - { type: 'plant', flags: {} }, - ]]; - const update_rules = { - plant: () => {}, - empty: (lattice, x, y) => { - if (lattice[y][x+1].type === 'plant') { - return { world_updates: [{ x, y, from: 'empty', to: 'plant' }] }; - } - }, - }; - - expect(lattice_update(lattice, update_rules)).toEqual([ - { world_updates: [{ x: 1, y: 0, from: 'empty', to: 'plant' }] }, - ]); - - lattice[0][1] = { type: 'plant' }; - - expect(lattice_update(lattice, update_rules)).toEqual([ - { world_updates: [{ x: 0, y: 0, from: 'empty', to: 'plant' }] }, - ]); - - lattice[0][0] = { type: 'plant' }; - - expect(lattice_update(lattice, update_rules)).toEqual([]); -}); - - -//test("agents cannot move into non-empty tiles", () => { -// const lattice = [[ {type: 'empty', flags: {}}, {type: 'filled', flags: {}} ]]; -// const bad_prop = [{ agent_updates: [{ agent_id: 14, x: 1, y: 0 }] }]; -// expect(lattice_valid(lattice, bad_prop)).toBe(false); -// const good_prop = [{ agent_updates: [{ agent_id: 14, x: 0, y: 0 }] }]; -// expect(lattice_valid(lattice, bad_prop)).toBe(true); -//}); - - -test("growth update rule applied", () => { - const lattice = [[ - { type: 'empty', flags: {} }, - { type: 'empty', flags: {} }, - { type: 'plant', flags: {} }, - ]]; - expect(lattice_apply(lattice, [{ world_updates:[{ x: 1, y: 0, from: 'empty', to: 'plant' }]}])).toEqual([[ - { type: 'empty', flags: {} }, - { type: 'plant', flags: {} }, - { type: 'plant', flags: {} }, - ]]); - - expect(lattice_apply(lattice, [ - { world_updates: [{ x: 2, y: 0, from: 'plant', to: 'empty' } ]}, - { world_updates: [{ x: 1, y: 0, from: 'empty', to: 'plant' } ]}, - { world_updates: [{ x: 0, y: 0, from: 'empty', to: 'plant' } ]}, - ])).toEqual([[ - { type: 'plant', flags: {} }, - { type: 'plant', flags: {} }, - { type: 'empty', flags: {} }, - ]]); -}); - - -test("check proposals agains lattice for validity", () => { - const lattice = [[ { type: 'empty' }, { type: 'empty' }, { type: 'plant' } ]]; - expect(lattice_valid(lattice, { world_updates: [{ x: -1, y: 0, from: 'blah', to: 'blah' }] })).toBe(false); - expect(lattice_valid(lattice, { world_updates: [{ x: 0, y: 0, from: 'blah', to: 'blah' }] })).toBe(false); - expect(lattice_valid(lattice, { world_updates: [{ x: 0, y: 0, from: 'empty', to: 'blah' }] })).toBe(true); - expect(lattice_valid(lattice, { world_updates: [{ x: 2, y: 0, from: 'empty', to: 'blah' }] })).toBe(false); - expect(lattice_valid(lattice, { world_updates: [{ x: 2, y: 1, from: 'empty', to: 'blah' }] })).toBe(false); -}); - - -// this test is no longer relevant because resetting the cell flags is taken care of by world_update, -// not lattice_apply -// -//test("proposals update cell flags appropriately", () => { -// const lattice = [ -// [ -// { type: 'empty', flags: { step: 1} }, -// { type: 'empty', flags: {} }, -// { type: 'plant', flags: { foo: 'bar' } }, -// ] -// ]; -// -// // flags are reset each time step -// expect(lattice_apply(lattice, [{ world_updates:[{ x: 1, y: 0, from: 'empty', to: 'plant' }]}])).toEqual([[ -// { type: 'empty', flags: {} }, -// { type: 'plant', flags: {} }, -// { type: 'plant', flags: {} }, -// ]]); -// -// // flags are combined when updating -// expect(lattice_apply(lattice, [ -// { world_updates: [{ x: 1, y: 0, flags: { foo: 'bar' } } ]}, -// { world_updates: [{ x: 1, y: 0, from: 'empty', to: 'plant', flags: { baz: 'baz' } } ]}, -// { world_updates: [{ x: 0, y: 0, from: 'empty', to: 'plant', flags: { foo: 'foo' } } ]}, -// { world_updates: [{ x: 0, y: 0, flags: { beep: 'boop' } } ]}, -// ])).toEqual([[ -// { type: 'plant', flags: { foo: 'foo', beep: 'boop' } }, -// { type: 'plant', flags: { foo: 'bar', baz: 'baz' } }, -// { type: 'plant', flags: {} }, -// ]]); -// -//}); diff --git a/src/world/proposal.js b/src/world/proposal.js deleted file mode 100644 index 8baca06..0000000 --- a/src/world/proposal.js +++ /dev/null @@ -1,183 +0,0 @@ -import { pairs, deepEqual } from '../util.js'; - -/* agent structure: - * { - * id: string - * net: network - * state: network_state - * x, y: number - * flags: object - * } - */ - - -/* cell structure: - * { - * type: string - * flags: object - * } - */ - -/* action structure: - * { - * name: string, - * propose: (agent, output) => proposal[] - * } - */ - - -/* proposal structure - * all proposed lattice and agent changes must be included for the proposed action to be valid - * similarly, if any lattice or agent change creates merge conflicts, the proposal cannot be merged - * and must be removed - * { - * lattice_changes: proposal_lattice_change[]? - * agent_changes: proposal_agent_change[]? - * } - */ - -/* proposal_lattice_change - * { - * x, y: number - * from: string - * to: string - * flags: object? - * } - */ - -/* proposal_agent_change - * { - * agent_id: string - * x, y: number? - * flags: object? - * } - */ - - -// check that two flags objects are compatible -// flags are considered compatible if they do not have any common keys with different values -function flags_compatible(a, b) { - if (a === undefined || b === undefined) { return true; } - const keys = [...new Set(Object.keys(a).concat(Object.keys(b)))]; - return keys.reduce( - (acc, key) => { - const eq = (a[key] === undefined || b[key] === undefined) ? true : deepEqual(a[key], b[key]); - return acc && eq; - }, - true - ); -} - - -// return a tuple [conflict, merge] -// conflict is true if the two lattice_changes are incompatible -// merge is true if the two lattice changes are identical -// otherwise they are false -function lattice_change_conflict(a, b) { - if (deepEqual(a, b)) { - // merge - return [false, true]; - } - if ( - a.x === b.x && - a.y === b.y && - (a.to != b.to || !flags_compatible((a.flags || {}), (b.flags || {}))) - ) { - // conflict! - return [true, false]; - } else { - // no conflict c: - return [false, false]; - } -} - - -// returns true as long as x & y are both defined -function pos_exists(a) { - if (a.x !== undefined && a.y !== undefined) { - return true; - } else { - return false; - } -} - - -// check the equality of two objects with (x,y) keys -function pos_equal(a, b) { - if (a.x !== b.x) { return false; } - if (a.y !== b.y) { return false; } - return true; -} - - -// agent changes merge if they are identical -// they conflict if two agents are trying to move to the same tile, or -// if the same agent is trying to move to two different tiles, or if an agent -// is being updated to incompatible flags -// -// -function agent_change_conflict(a, b) { - if (deepEqual(a, b)) { - // identical: merge - return [false, true]; - } else if (a.agent_id === b.agent_id) { - if ( - pos_exists(a) && pos_exists(b) && !pos_equal(a, b) - ) { - // same agent, different positions: conflict - return [true, false]; - } else if (!flags_compatible(a.flags, b.flags)) { - // same agent, incompatible flags: conflict - return [true, false]; - } else { - // no conflict c: - return [false, false]; - } - } else { - // different agents - if (pos_exists(a) && pos_exists(b) && pos_equal(a, b)) { - // different agents, same position: conflict - return [true, false]; - } else { - // no conflict c: - return [false, false]; - } - } -} - - -// combine lattice_change and agent_change conflict/merge tuples for a pair of proposals -function proposal_conflict_merge(a, b) { - const [lattice_conflict, lattice_merge] = pairs(a.lattice_changes || [], b.lattice_changes || []).reduce( - (acc, [a, b]) => { - const [conflict, merge] = lattice_change_conflict(a, b); - return [acc[0] || conflict, acc[1] || merge]; - }, - [false, false] - ); - const [agent_conflict, agent_merge] = pairs(a.agent_changes || [], b.agent_changes || []).reduce( - (acc, [a, b]) => { - const [conflict, merge] = agent_change_conflict(a, b); - return [acc[0] || conflict, acc[1] || merge]; - }, - [false, false] - ); - return [lattice_conflict || agent_conflict, lattice_merge || agent_merge]; -} - - -// merge proposals -// if two sub-updates conflict, they are both omitted from the final merged proposal -export function proposal_merge(arr, proposal) { - const conflict_merge = arr.map(x => proposal_conflict_merge(x, proposal)); - - // if any conflicts are detected then don't merge - if (conflict_merge.reduce((acc, [c, m]) => acc || c, false)) { - const conflict_free = arr.filter((x, i) => !conflict_merge[i][0]); - return conflict_free; - } else { - // no conflicts, but need to merge identical actions - const no_merge = arr.filter((x, i) => !conflict_merge[i][1]); - return [...no_merge, proposal]; - } -} diff --git a/src/world/proposal.test.js b/src/world/proposal.test.js deleted file mode 100644 index 2f870e6..0000000 --- a/src/world/proposal.test.js +++ /dev/null @@ -1,197 +0,0 @@ -import { - proposal_merge, -} from './proposal.js'; - - -// tile updates - -test("proposals changing different tiles don't conflict", () => { - const a = { - lattice_changes: [{ x: 4, y: 3, from: 'empty', to: 'mutable' }], - }; - const b = { - lattice_changes: [{ x: 4, y: 4, from: 'empty', to: 'flag' }], - }; - - expect(proposal_merge([a], b)).toEqual([a, b]); -}); - - -test("proposals changing the same tile to different states conflict", () => { - const a = { - lattice_changes: [{ x: 4, y: 3, from: 'empty', to: 'mutable' }], - }; - const b = { - lattice_changes: [{ x: 4, y: 3, from: 'empty', to: 'flag' }], - }; - - expect(proposal_merge([a], b)).toEqual([]); -}); - - -test("proposals changing the same tile to the same state merge to a single proposal", () => { - const a = { - lattice_changes: [{ x: 4, y: 3, from: 'empty', to: 'mutable' }], - }; - const b = { - lattice_changes: [{ x: 4, y: 3, from: 'empty', to: 'mutable' }], - }; - - expect(proposal_merge([a], b)).toEqual([a]); -}); - - -test("proposals with identical tile updates but incompatible tile flags conflict", () => { - const a = { - lattice_changes: [{ x: 4, y: 3, from: 'empty', to: 'mutable', flags: { v: 'a' } }], - }; - const b = { - lattice_changes: [{ x: 4, y: 3, from: 'empty', to: 'mutable', flags: { v: 'b' } }], - }; - - expect(proposal_merge([a], b)).toEqual([]); -}); - - -test("proposals with identical tile updates but compatible tile flags do not conflict", () => { - const a = { - lattice_changes: [{ x: 4, y: 3, from: 'empty', to: 'mutable', flags: { v: 'a', r: 'd' } }], - }; - const b = { - lattice_changes: [{ x: 4, y: 3, from: 'empty', to: 'mutable', flags: { v: 'a', u: 'b' } }], - }; - - expect(proposal_merge([a], b)).toEqual([a, b]); -}); - - - - -test("proposals moving two agents to the same tile conflict", () => { - const a = { - agent_changes: [{ agent_id: 'aaa', x: 4, y: 3 }], - }; - const b = { - agent_changes: [{ agent_id: 'bbb', x: 4, y: 3 }], - }; - - expect(proposal_merge([a], b)).toEqual([]); -}); - - -// agent updates -test("proposals moving two agents to different tiles do not conflict", () => { - const a = { - agent_changes: [{ agent_id: 'aaa', x: 4, y: 3 }], - }; - const b = { - agent_changes: [{ agent_id: 'bbb', x: 3, y: 3 }], - }; - - expect(proposal_merge([a], b)).toEqual([a, b]); -}); - - -test("proposals moving the same agent to different tiles conflict", () => { - const a = { - agent_changes: [{ agent_id: 'aaa', x: 4, y: 3 }], - }; - const b = { - agent_changes: [{ agent_id: 'aaa', x: 3, y: 3 }], - }; - - expect(proposal_merge([a], b)).toEqual([]); -}); - - -test("proposals moving the same agent to the same tile merge", () => { - const a = { - agent_changes: [{ agent_id: 'aaa', x: 4, y: 3 }], - }; - const b = { - agent_changes: [{ agent_id: 'aaa', x: 4, y: 3 }], - }; - - expect(proposal_merge([a], b)).toEqual([a]); -}); - - -test("proposals setting flags on different agents do not conflict", () => { - const a = { - agent_changes: [{ agent_id: 'aaa', flags: { frozen: false } }], - }; - - const b = { - agent_changes: [{ agent_id: 'bbb', flags: { frozen: false } }], - }; - - expect(proposal_merge([a], b)).toEqual([a, b]); -}); - - -test("setting the same agent to compatible flags does not conflict", () => { - const a = { - agent_changes: [{ agent_id: 'aaa', flags: { frozen: false } }], - }; - - const b = { - agent_changes: [{ agent_id: 'aaa', flags: { crumpet: 'hi' } }], - }; - - expect(proposal_merge([a], b)).toEqual([a, b]); -}); - - -test("setting the same agent to compatible object flags does not conflict", () => { - const a = { - agent_changes: [{ agent_id: 'aaa', flags: { emit: [0, 1, 1, 0] } }], - }; - - const b = { - agent_changes: [{ agent_id: 'aaa', flags: { emit: [0, 1, 1, 0], hi: 4 } }], - }; - - expect(proposal_merge([a], b)).toEqual([a, b]); -}); - - -test("setting the same agent to incompatible flags does conflict", () => { - const a = { - agent_changes: [{ agent_id: 'aaa', flags: { frozen: false } }], - }; - - const b = { - agent_changes: [{ agent_id: 'aaa', flags: { frozen: true, crumpet: 'hi' } }], - }; - - expect(proposal_merge([a], b)).toEqual([]); -}); - - -test("setting the same agent to incompatible object flags does conflict", () => { - const a = { - agent_changes: [{ agent_id: 'aaa', flags: { emit: [0, 1, 1, 0] } }], - }; - - const b = { - agent_changes: [{ agent_id: 'aaa', flags: { emit: [0, 1, 1, 1], hi: 4 } }], - }; - - expect(proposal_merge([a], b)).toEqual([]); -}); - - -test("setting the same agent to identical flags merges", () => { - const a = { - agent_changes: [{ agent_id: 'aaa', flags: { emit: [0, 1, 1, 0] } }], - }; - - const b = { - agent_changes: [{ agent_id: 'aaa', flags: { emit: [0, 1, 1, 0] } }], - }; - - expect(proposal_merge([a], b)).toEqual([a]); -}); - - - diff --git a/src/world/sense.js b/src/world/sense.js deleted file mode 100644 index 9b5c7d4..0000000 --- a/src/world/sense.js +++ /dev/null @@ -1,17 +0,0 @@ -'use strict'; - -/* sense structure: - * { - * size: number - * read: function(lattice, agent) -> number[size] - * } - */ - - -export function sense_read(world, agent, sense) { - const result = sense.read(world, agent); - if (result.length !== sense.size) { - throw new Error(`Expected result of size ${sense.size}, but got ${result.length} instead.`); - } - return result; -} diff --git a/src/world/sense.test.js b/src/world/sense.test.js deleted file mode 100644 index 27ee2b5..0000000 --- a/src/world/sense.test.js +++ /dev/null @@ -1,33 +0,0 @@ -import { sense_read } from './sense.js'; - - -test("basic sense works", () => { - const flag_sense = { - size: 1, - read: (world, agent) => { - const {x, y} = agent; - return [ world.lattice[y-1][x].type === 'flag' ? 1.0 : 0.0 ] - }, - }; - - const lattice = [[ { type: 'flag' } ]]; - const agent = { x: 0, y: 1 }; - - expect(sense_read({lattice}, agent, flag_sense)).toEqual([1.0]); -}); - - -test("senses throw if the size is incorrect", () => { - const flag_sense = { - size: 2, - read: (world, agent) => { - const {x, y} = agent; - return [ world.lattice[y-1][x].type === 'flag' ? 1.0 : 0.0 ] - }, - } - - const lattice = [[ { type: 'flag' } ]]; - const agent = { x: 0, y: 1 }; - - expect(() => sense_read({lattice}, agent, flag_sense)).toThrow(); -}); diff --git a/src/world/world.js b/src/world/world.js deleted file mode 100644 index 63d974a..0000000 --- a/src/world/world.js +++ /dev/null @@ -1,47 +0,0 @@ -import { lattice_update, lattice_valid, lattice_apply } from './lattice.js'; -import { agent_decide, agent_apply } from './agent.js'; -import { proposal_merge } from './proposal.js'; - - -// world structure: -// { -// lattice -// lattice_rules: object -// agents: agent[] -// senses: sense[] -// actions: action[] -// validity: (function(proposal) => bool)[] -// } - - -export function world_update(world, postprocess=[]) { - const lattice_props = lattice_update(world.lattice, world.lattice_rules); - const intermediate_lattice = lattice_apply( - world.lattice.map(row => row.map(cell => ({ ...cell, flags: {} }))), - lattice_props - ); - - const decisions = world.agents - .map(a => agent_decide(world, a, world.senses, world.actions)) - .reduce( - ([agents, props], [agent, prop]) => [[...agents, agent], [...props, prop]], - [[], []] - ); - const intermediate_agents = decisions[0]; - const agent_props = world.validity.reduce( - (acc, rule) => acc.filter(prop => rule({...world, lattice: intermediate_lattice}, prop)), - decisions[1] - .flat() - .reduce((acc, prop) => proposal_merge(acc, prop), []) - .filter(prop => lattice_valid(intermediate_lattice, prop)) - ); - - const lattice = lattice_apply(intermediate_lattice, agent_props); - const agents = intermediate_agents.map(a => agent_apply(a, agent_props)); - - const new_world = {...world, lattice, agents}; - return postprocess.reduce( - (acc, f) => f(acc), - new_world - ); -} diff --git a/test.bat b/test.bat deleted file mode 100644 index c54907c..0000000 --- a/test.bat +++ /dev/null @@ -1,3 +0,0 @@ -set NODE_OPTIONS=--experimental-vm-modules
-
-jest
diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 87b5a72..0000000 --- a/yarn.lock +++ /dev/null @@ -1,2135 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@ampproject/remapping@^2.2.0": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658" - integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== - dependencies: - "@babel/highlight" "^7.22.5" - -"@babel/compat-data@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.5.tgz#b1f6c86a02d85d2dd3368a2b67c09add8cd0c255" - integrity sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA== - -"@babel/core@^7.11.6", "@babel/core@^7.12.3": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.5.tgz#d67d9747ecf26ee7ecd3ebae1ee22225fe902a89" - integrity sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.5" - "@babel/generator" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.5" - "@babel/helper-module-transforms" "^7.22.5" - "@babel/helpers" "^7.22.5" - "@babel/parser" "^7.22.5" - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.5" - "@babel/types" "^7.22.5" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.2" - semver "^6.3.0" - -"@babel/generator@^7.22.5", "@babel/generator@^7.7.2": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.5.tgz#1e7bf768688acfb05cf30b2369ef855e82d984f7" - integrity sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA== - dependencies: - "@babel/types" "^7.22.5" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/helper-compilation-targets@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz#fc7319fc54c5e2fa14b2909cf3c5fd3046813e02" - integrity sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw== - dependencies: - "@babel/compat-data" "^7.22.5" - "@babel/helper-validator-option" "^7.22.5" - browserslist "^4.21.3" - lru-cache "^5.1.1" - semver "^6.3.0" - -"@babel/helper-environment-visitor@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" - integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== - -"@babel/helper-function-name@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" - integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== - dependencies: - "@babel/template" "^7.22.5" - "@babel/types" "^7.22.5" - -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-module-imports@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" - integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-module-transforms@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz#0f65daa0716961b6e96b164034e737f60a80d2ef" - integrity sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw== - dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-module-imports" "^7.22.5" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.5" - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.5" - "@babel/types" "^7.22.5" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" - integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== - -"@babel/helper-simple-access@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" - integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-split-export-declaration@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz#88cf11050edb95ed08d596f7a044462189127a08" - integrity sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-string-parser@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" - integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== - -"@babel/helper-validator-identifier@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" - integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== - -"@babel/helper-validator-option@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" - integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== - -"@babel/helpers@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.5.tgz#74bb4373eb390d1ceed74a15ef97767e63120820" - integrity sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q== - dependencies: - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.5" - "@babel/types" "^7.22.5" - -"@babel/highlight@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031" - integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== - dependencies: - "@babel/helper-validator-identifier" "^7.22.5" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.5.tgz#721fd042f3ce1896238cf1b341c77eb7dee7dbea" - integrity sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q== - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-import-meta@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@^7.7.2": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" - integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.7.2": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272" - integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/template@^7.22.5", "@babel/template@^7.3.3": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" - integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== - dependencies: - "@babel/code-frame" "^7.22.5" - "@babel/parser" "^7.22.5" - "@babel/types" "^7.22.5" - -"@babel/traverse@^7.22.5", "@babel/traverse@^7.7.2": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.5.tgz#44bd276690db6f4940fdb84e1cb4abd2f729ccd1" - integrity sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ== - dependencies: - "@babel/code-frame" "^7.22.5" - "@babel/generator" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.5" - "@babel/parser" "^7.22.5" - "@babel/types" "^7.22.5" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.3.3": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.5.tgz#cd93eeaab025880a3a47ec881f4b096a5b786fbe" - integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA== - dependencies: - "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.5" - to-fast-properties "^2.0.0" - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/schema@^0.1.2": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/console@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.5.0.tgz#593a6c5c0d3f75689835f1b3b4688c4f8544cb57" - integrity sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ== - dependencies: - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^29.5.0" - jest-util "^29.5.0" - slash "^3.0.0" - -"@jest/core@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.5.0.tgz#76674b96904484e8214614d17261cc491e5f1f03" - integrity sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ== - dependencies: - "@jest/console" "^29.5.0" - "@jest/reporters" "^29.5.0" - "@jest/test-result" "^29.5.0" - "@jest/transform" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - ci-info "^3.2.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-changed-files "^29.5.0" - jest-config "^29.5.0" - jest-haste-map "^29.5.0" - jest-message-util "^29.5.0" - jest-regex-util "^29.4.3" - jest-resolve "^29.5.0" - jest-resolve-dependencies "^29.5.0" - jest-runner "^29.5.0" - jest-runtime "^29.5.0" - jest-snapshot "^29.5.0" - jest-util "^29.5.0" - jest-validate "^29.5.0" - jest-watcher "^29.5.0" - micromatch "^4.0.4" - pretty-format "^29.5.0" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/environment@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.5.0.tgz#9152d56317c1fdb1af389c46640ba74ef0bb4c65" - integrity sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ== - dependencies: - "@jest/fake-timers" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - jest-mock "^29.5.0" - -"@jest/expect-utils@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.5.0.tgz#f74fad6b6e20f924582dc8ecbf2cb800fe43a036" - integrity sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg== - dependencies: - jest-get-type "^29.4.3" - -"@jest/expect@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.5.0.tgz#80952f5316b23c483fbca4363ce822af79c38fba" - integrity sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g== - dependencies: - expect "^29.5.0" - jest-snapshot "^29.5.0" - -"@jest/fake-timers@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.5.0.tgz#d4d09ec3286b3d90c60bdcd66ed28d35f1b4dc2c" - integrity sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg== - dependencies: - "@jest/types" "^29.5.0" - "@sinonjs/fake-timers" "^10.0.2" - "@types/node" "*" - jest-message-util "^29.5.0" - jest-mock "^29.5.0" - jest-util "^29.5.0" - -"@jest/globals@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.5.0.tgz#6166c0bfc374c58268677539d0c181f9c1833298" - integrity sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ== - dependencies: - "@jest/environment" "^29.5.0" - "@jest/expect" "^29.5.0" - "@jest/types" "^29.5.0" - jest-mock "^29.5.0" - -"@jest/reporters@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.5.0.tgz#985dfd91290cd78ddae4914ba7921bcbabe8ac9b" - integrity sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.5.0" - "@jest/test-result" "^29.5.0" - "@jest/transform" "^29.5.0" - "@jest/types" "^29.5.0" - "@jridgewell/trace-mapping" "^0.3.15" - "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^5.1.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.1.3" - jest-message-util "^29.5.0" - jest-util "^29.5.0" - jest-worker "^29.5.0" - slash "^3.0.0" - string-length "^4.0.1" - strip-ansi "^6.0.0" - v8-to-istanbul "^9.0.1" - -"@jest/schemas@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" - integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== - dependencies: - "@sinclair/typebox" "^0.25.16" - -"@jest/source-map@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.4.3.tgz#ff8d05cbfff875d4a791ab679b4333df47951d20" - integrity sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w== - dependencies: - "@jridgewell/trace-mapping" "^0.3.15" - callsites "^3.0.0" - graceful-fs "^4.2.9" - -"@jest/test-result@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.5.0.tgz#7c856a6ca84f45cc36926a4e9c6b57f1973f1408" - integrity sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ== - dependencies: - "@jest/console" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz#34d7d82d3081abd523dbddc038a3ddcb9f6d3cc4" - integrity sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ== - dependencies: - "@jest/test-result" "^29.5.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.5.0" - slash "^3.0.0" - -"@jest/transform@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.5.0.tgz#cf9c872d0965f0cbd32f1458aa44a2b1988b00f9" - integrity sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw== - dependencies: - "@babel/core" "^7.11.6" - "@jest/types" "^29.5.0" - "@jridgewell/trace-mapping" "^0.3.15" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^2.0.0" - fast-json-stable-stringify "^2.1.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.5.0" - jest-regex-util "^29.4.3" - jest-util "^29.5.0" - micromatch "^4.0.4" - pirates "^4.0.4" - slash "^3.0.0" - write-file-atomic "^4.0.2" - -"@jest/types@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593" - integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== - dependencies: - "@jest/schemas" "^29.4.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" - integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/sourcemap-codec@1.4.14": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.18" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" - integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== - dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" - -"@sinclair/typebox@^0.25.16": - version "0.25.24" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" - integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== - -"@sinonjs/commons@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.0.tgz#beb434fe875d965265e04722ccfc21df7f755d72" - integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^10.0.2": - version "10.2.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.2.0.tgz#b3e322a34c5f26e3184e7f6115695f299c1b1194" - integrity sha512-OPwQlEdg40HAj5KNF8WW6q2KG4Z+cBCZb3m4ninfTZKaBmbIJodviQsDBoYMPHkOyJJMHnOJo5j2+LKDOhOACg== - dependencies: - "@sinonjs/commons" "^3.0.0" - -"@types/babel__core@^7.1.14": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.1.tgz#916ecea274b0c776fec721e333e55762d3a9614b" - integrity sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw== - dependencies: - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" - integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.1.tgz#dd6f1d2411ae677dcb2db008c962598be31d6acf" - integrity sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg== - dependencies: - "@babel/types" "^7.20.7" - -"@types/graceful-fs@^4.1.3": - version "4.1.6" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" - integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== - dependencies: - "@types/node" "*" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== - -"@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/node@*": - version "20.2.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.2.5.tgz#26d295f3570323b2837d322180dfbf1ba156fefb" - integrity sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ== - -"@types/prettier@^2.1.5": - version "2.7.3" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" - integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== - -"@types/stack-utils@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" - integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== - -"@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== - -"@types/yargs@^17.0.8": - version "17.0.24" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.24.tgz#b3ef8d50ad4aa6aecf6ddc97c580a00f5aa11902" - integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== - dependencies: - "@types/yargs-parser" "*" - -ansi-escapes@^4.2.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -anymatch@^3.0.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -babel-jest@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.5.0.tgz#3fe3ddb109198e78b1c88f9ebdecd5e4fc2f50a5" - integrity sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q== - dependencies: - "@jest/transform" "^29.5.0" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.5.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - slash "^3.0.0" - -babel-plugin-istanbul@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz#a97db437936f441ec196990c9738d4b88538618a" - integrity sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.1.14" - "@types/babel__traverse" "^7.0.6" - -babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== - dependencies: - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.8.3" - -babel-preset-jest@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz#57bc8cc88097af7ff6a5ab59d1cd29d52a5916e2" - integrity sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg== - dependencies: - babel-plugin-jest-hoist "^29.5.0" - babel-preset-current-node-syntax "^1.0.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browserslist@^4.21.3: - version "4.21.7" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.7.tgz#e2b420947e5fb0a58e8f4668ae6e23488127e551" - integrity sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA== - dependencies: - caniuse-lite "^1.0.30001489" - electron-to-chromium "^1.4.411" - node-releases "^2.0.12" - update-browserslist-db "^1.0.11" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.2.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -caniuse-lite@^1.0.30001489: - version "1.0.30001497" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001497.tgz#0e5387b98e7dbf9c4f743fb16e92cbf0ca780714" - integrity sha512-I4/duVK4wL6rAK/aKZl3HXB4g+lIZvaT4VLAn2rCgJ38jVLb0lv2Xug6QuqmxXFVRJMF74SPPWPJ/1Sdm3vCzw== - -chalk@^2.0.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -ci-info@^3.2.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" - integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== - -cjs-module-lexer@^1.0.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" - integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== - -collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - -cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -debug@^4.1.0, debug@^4.1.1: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -dedent@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== - -deepmerge@^4.2.2: - version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -diff-sequences@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" - integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== - -electron-to-chromium@^1.4.411: - version "1.4.427" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.427.tgz#67e8069f7a864fc092fe2e09f196e68af5cb88a1" - integrity sha512-HK3r9l+Jm8dYAm1ctXEWIC+hV60zfcjS9UA5BDlYvnI5S7PU/yytjpvSrTNrSSRRkuu3tDyZhdkwIczh+0DWaw== - -emittery@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" - integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== - -expect@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.5.0.tgz#68c0509156cb2a0adb8865d413b137eeaae682f7" - integrity sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg== - dependencies: - "@jest/expect-utils" "^29.5.0" - jest-get-type "^29.4.3" - jest-matcher-utils "^29.5.0" - jest-message-util "^29.5.0" - jest-util "^29.5.0" - -fast-json-stable-stringify@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fb-watchman@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" - integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== - dependencies: - bser "2.1.1" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -glob@^7.1.3, glob@^7.1.4: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -graceful-fs@^4.2.9: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-core-module@^2.11.0: - version "2.12.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" - integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== - dependencies: - has "^1.0.3" - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== - -istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" - integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - -istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.1.3: - version "3.1.5" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" - integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -jest-changed-files@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.5.0.tgz#e88786dca8bf2aa899ec4af7644e16d9dcf9b23e" - integrity sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag== - dependencies: - execa "^5.0.0" - p-limit "^3.1.0" - -jest-circus@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.5.0.tgz#b5926989449e75bff0d59944bae083c9d7fb7317" - integrity sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA== - dependencies: - "@jest/environment" "^29.5.0" - "@jest/expect" "^29.5.0" - "@jest/test-result" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^0.7.0" - is-generator-fn "^2.0.0" - jest-each "^29.5.0" - jest-matcher-utils "^29.5.0" - jest-message-util "^29.5.0" - jest-runtime "^29.5.0" - jest-snapshot "^29.5.0" - jest-util "^29.5.0" - p-limit "^3.1.0" - pretty-format "^29.5.0" - pure-rand "^6.0.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-cli@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.5.0.tgz#b34c20a6d35968f3ee47a7437ff8e53e086b4a67" - integrity sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw== - dependencies: - "@jest/core" "^29.5.0" - "@jest/test-result" "^29.5.0" - "@jest/types" "^29.5.0" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - import-local "^3.0.2" - jest-config "^29.5.0" - jest-util "^29.5.0" - jest-validate "^29.5.0" - prompts "^2.0.1" - yargs "^17.3.1" - -jest-config@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.5.0.tgz#3cc972faec8c8aaea9ae158c694541b79f3748da" - integrity sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA== - dependencies: - "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.5.0" - "@jest/types" "^29.5.0" - babel-jest "^29.5.0" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-circus "^29.5.0" - jest-environment-node "^29.5.0" - jest-get-type "^29.4.3" - jest-regex-util "^29.4.3" - jest-resolve "^29.5.0" - jest-runner "^29.5.0" - jest-util "^29.5.0" - jest-validate "^29.5.0" - micromatch "^4.0.4" - parse-json "^5.2.0" - pretty-format "^29.5.0" - slash "^3.0.0" - strip-json-comments "^3.1.1" - -jest-diff@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.5.0.tgz#e0d83a58eb5451dcc1fa61b1c3ee4e8f5a290d63" - integrity sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw== - dependencies: - chalk "^4.0.0" - diff-sequences "^29.4.3" - jest-get-type "^29.4.3" - pretty-format "^29.5.0" - -jest-docblock@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.4.3.tgz#90505aa89514a1c7dceeac1123df79e414636ea8" - integrity sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg== - dependencies: - detect-newline "^3.0.0" - -jest-each@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.5.0.tgz#fc6e7014f83eac68e22b7195598de8554c2e5c06" - integrity sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA== - dependencies: - "@jest/types" "^29.5.0" - chalk "^4.0.0" - jest-get-type "^29.4.3" - jest-util "^29.5.0" - pretty-format "^29.5.0" - -jest-environment-node@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.5.0.tgz#f17219d0f0cc0e68e0727c58b792c040e332c967" - integrity sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw== - dependencies: - "@jest/environment" "^29.5.0" - "@jest/fake-timers" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - jest-mock "^29.5.0" - jest-util "^29.5.0" - -jest-get-type@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" - integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== - -jest-haste-map@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.5.0.tgz#69bd67dc9012d6e2723f20a945099e972b2e94de" - integrity sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA== - dependencies: - "@jest/types" "^29.5.0" - "@types/graceful-fs" "^4.1.3" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^29.4.3" - jest-util "^29.5.0" - jest-worker "^29.5.0" - micromatch "^4.0.4" - walker "^1.0.8" - optionalDependencies: - fsevents "^2.3.2" - -jest-leak-detector@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz#cf4bdea9615c72bac4a3a7ba7e7930f9c0610c8c" - integrity sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow== - dependencies: - jest-get-type "^29.4.3" - pretty-format "^29.5.0" - -jest-matcher-utils@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz#d957af7f8c0692c5453666705621ad4abc2c59c5" - integrity sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw== - dependencies: - chalk "^4.0.0" - jest-diff "^29.5.0" - jest-get-type "^29.4.3" - pretty-format "^29.5.0" - -jest-message-util@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.5.0.tgz#1f776cac3aca332ab8dd2e3b41625435085c900e" - integrity sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.5.0" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^29.5.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-mock@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.5.0.tgz#26e2172bcc71d8b0195081ff1f146ac7e1518aed" - integrity sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw== - dependencies: - "@jest/types" "^29.5.0" - "@types/node" "*" - jest-util "^29.5.0" - -jest-pnp-resolver@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" - integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== - -jest-regex-util@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.4.3.tgz#a42616141e0cae052cfa32c169945d00c0aa0bb8" - integrity sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg== - -jest-resolve-dependencies@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz#f0ea29955996f49788bf70996052aa98e7befee4" - integrity sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg== - dependencies: - jest-regex-util "^29.4.3" - jest-snapshot "^29.5.0" - -jest-resolve@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.5.0.tgz#b053cc95ad1d5f6327f0ac8aae9f98795475ecdc" - integrity sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w== - dependencies: - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.5.0" - jest-pnp-resolver "^1.2.2" - jest-util "^29.5.0" - jest-validate "^29.5.0" - resolve "^1.20.0" - resolve.exports "^2.0.0" - slash "^3.0.0" - -jest-runner@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.5.0.tgz#6a57c282eb0ef749778d444c1d758c6a7693b6f8" - integrity sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ== - dependencies: - "@jest/console" "^29.5.0" - "@jest/environment" "^29.5.0" - "@jest/test-result" "^29.5.0" - "@jest/transform" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.13.1" - graceful-fs "^4.2.9" - jest-docblock "^29.4.3" - jest-environment-node "^29.5.0" - jest-haste-map "^29.5.0" - jest-leak-detector "^29.5.0" - jest-message-util "^29.5.0" - jest-resolve "^29.5.0" - jest-runtime "^29.5.0" - jest-util "^29.5.0" - jest-watcher "^29.5.0" - jest-worker "^29.5.0" - p-limit "^3.1.0" - source-map-support "0.5.13" - -jest-runtime@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.5.0.tgz#c83f943ee0c1da7eb91fa181b0811ebd59b03420" - integrity sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw== - dependencies: - "@jest/environment" "^29.5.0" - "@jest/fake-timers" "^29.5.0" - "@jest/globals" "^29.5.0" - "@jest/source-map" "^29.4.3" - "@jest/test-result" "^29.5.0" - "@jest/transform" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^29.5.0" - jest-message-util "^29.5.0" - jest-mock "^29.5.0" - jest-regex-util "^29.4.3" - jest-resolve "^29.5.0" - jest-snapshot "^29.5.0" - jest-util "^29.5.0" - slash "^3.0.0" - strip-bom "^4.0.0" - -jest-snapshot@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.5.0.tgz#c9c1ce0331e5b63cd444e2f95a55a73b84b1e8ce" - integrity sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g== - dependencies: - "@babel/core" "^7.11.6" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-jsx" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/traverse" "^7.7.2" - "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.5.0" - "@jest/transform" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/babel__traverse" "^7.0.6" - "@types/prettier" "^2.1.5" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^29.5.0" - graceful-fs "^4.2.9" - jest-diff "^29.5.0" - jest-get-type "^29.4.3" - jest-matcher-utils "^29.5.0" - jest-message-util "^29.5.0" - jest-util "^29.5.0" - natural-compare "^1.4.0" - pretty-format "^29.5.0" - semver "^7.3.5" - -jest-util@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f" - integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== - dependencies: - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-validate@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.5.0.tgz#8e5a8f36178d40e47138dc00866a5f3bd9916ffc" - integrity sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ== - dependencies: - "@jest/types" "^29.5.0" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^29.4.3" - leven "^3.1.0" - pretty-format "^29.5.0" - -jest-watcher@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.5.0.tgz#cf7f0f949828ba65ddbbb45c743a382a4d911363" - integrity sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA== - dependencies: - "@jest/test-result" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.13.1" - jest-util "^29.5.0" - string-length "^4.0.1" - -jest-worker@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.5.0.tgz#bdaefb06811bd3384d93f009755014d8acb4615d" - integrity sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA== - dependencies: - "@types/node" "*" - jest-util "^29.5.0" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.5.0.tgz#f75157622f5ce7ad53028f2f8888ab53e1f1f24e" - integrity sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ== - dependencies: - "@jest/core" "^29.5.0" - "@jest/types" "^29.5.0" - import-local "^3.0.2" - jest-cli "^29.5.0" - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json5@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -make-dir@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== - dependencies: - tmpl "1.0.5" - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -minimatch@^3.0.4, minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== - -node-releases@^2.0.12: - version "2.0.12" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.12.tgz#35627cc224a23bfb06fb3380f2b3afaaa7eb1039" - integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ== - -normalize-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pirates@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== - -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -pretty-format@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.5.0.tgz#283134e74f70e2e3e7229336de0e4fce94ccde5a" - integrity sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw== - dependencies: - "@jest/schemas" "^29.4.3" - ansi-styles "^5.0.0" - react-is "^18.0.0" - -prompts@^2.0.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -pure-rand@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.2.tgz#a9c2ddcae9b68d736a8163036f088a2781c8b306" - integrity sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ== - -react-is@^18.0.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve.exports@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" - integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== - -resolve@^1.20.0: - version "1.22.2" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== - dependencies: - is-core-module "^2.11.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -semver@^6.0.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@^7.3.5: - version "7.5.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.1.tgz#c90c4d631cf74720e46b21c1d37ea07edfab91ec" - integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== - dependencies: - lru-cache "^6.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -signal-exit@^3.0.3, signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -source-map-support@0.5.13: - version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0, source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -stack-utils@^2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" - integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== - dependencies: - escape-string-regexp "^2.0.0" - -string-length@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -type-detect@4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -update-browserslist-db@^1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" - integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -v8-to-istanbul@^9.0.1: - version "9.1.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz#1b83ed4e397f58c85c266a570fc2558b5feb9265" - integrity sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA== - dependencies: - "@jridgewell/trace-mapping" "^0.3.12" - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" - -walker@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== - dependencies: - makeerror "1.0.12" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" - integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^3.0.7" - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^17.3.1: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== |