diff --git a/姿态分类/README.md b/姿态分类/README.md
index 094fcd5..673ab93 100644
--- a/姿态分类/README.md
+++ b/姿态分类/README.md
@@ -29,6 +29,15 @@
- 应用将开始实时分析你的姿态,并在下方显示预测结果。
- 再次点击“停止预测”可暂停。
+
+建议使用live server插件开启本地服务器,并访问index.html文件。
+
+## 存在问题
+css样式中描绘关节骨架与实际对比偏小,现在使用的方法是模型输出关节后与视频大小一起缩放。暂时不清楚是缩放导致还是模型输出。
+
+
+
+
## 📁 项目结构
```
diff --git a/姿态分类/script.js b/姿态分类/script.js
index 56c1b0d..e5b942b 100644
--- a/姿态分类/script.js
+++ b/姿态分类/script.js
@@ -318,7 +318,6 @@ function flattenPose(pose) {
}
function drawPose(pose) {
- // ... (此函数无需修改, 省略以保持简洁)
// 绘制关键点和骨骼...
if (pose.keypoints) {
// 绘制关键点
diff --git a/音频分类/README.md b/音频分类/README.md
new file mode 100644
index 0000000..3c9d69d
--- /dev/null
+++ b/音频分类/README.md
@@ -0,0 +1,50 @@
+# 浏览器音频分类器 (背景噪音分离增强版)
+
+## 简介
+
+这个项目是一个基于浏览器的音频分类器,它利用 TensorFlow.js 和 Speech Commands 模型,可以识别用户自定义的声音类别。**与传统音频分类器不同的是,此版本特别强调了背景噪音的分离和处理,从而提升分类准确率。**
+
+此应用允许用户:
+
+1. **录制背景噪音样本:** 用于训练模型,区分目标声音和环境噪音。
+2. **添加自定义声音类别:** 例如 "拍手"、"响指"、"警告音" 等。
+3. **录制自定义声音样本:** 用于训练模型,识别特定声音。
+4. **训练模型:** 使用录制的背景噪音和自定义声音数据,训练分类模型。
+5. **实时识别:** 使用训练好的模型,实时识别麦克风输入的声音类别。
+
+
+## 特性
+
+* **背景噪音分离:** 通过录制和学习背景噪音,提高分类器在嘈杂环境中的准确性。
+* **自定义类别:** 用户可以根据自己的需求添加和训练任意声音类别。
+* **实时识别:** 模型训练完成后,可以立即进行实时声音识别。
+* **浏览器端运行:** 所有处理都在浏览器端完成,无需服务器支持。
+* **用户友好的界面:** 简单直观的界面,易于操作和使用。
+
+## 技术栈
+
+* **TensorFlow.js:** 用于在浏览器端运行机器学习模型。
+* **Speech Commands Model:** TensorFlow.js 提供的预训练语音命令模型,用于迁移学习。
+
+## 快速上手
+
+建议使用live server插件开启本地服务器,并访问voice.html文件。
+
+**注:直接打开index.html文件会需要重复授权麦克风权限,请使用live server插件开启本地服务器可以解决**
+
+
+
+
+## 音频切片
+TODO
+
+需要查看speech-commands接口实现传入`collectExample`
+
+.\speech-commands\src\browser_fft_recognizer.ts
+ 667,9: async collectExample(word: string, options?: ExampleCollectionOptions):
+
+现在实现的方法是调用`collectExample`方法,传入`word`参数,然后会自动录制音频文件,统一码率,生成频谱图,传入模型,并没有给出可以直接传入音频接口。
+
+**如果需要实现一次性录制,需要实现手动将音频文件转换成频谱图,传入模型。**
+
+目录下speech-commands文件夹是导入的`https://cdn.jsdelivr.net/npm/@tensorflow-models/speech-commands@latest/dist/speech-commands.min.js`js文件仓库
\ No newline at end of file
diff --git a/音频分类/speech-commands/.gitignore b/音频分类/speech-commands/.gitignore
new file mode 100644
index 0000000..d5a9a8f
--- /dev/null
+++ b/音频分类/speech-commands/.gitignore
@@ -0,0 +1,18 @@
+node_modules/
+coverage/
+package-lock.json
+npm-debug.log
+yarn-error.log
+.DS_Store
+dist/
+.idea/
+*.tgz
+.cache
+
+bazel-*
+
+*.pyc
+
+model.json
+metadata.json
+weights.bin
diff --git a/音频分类/speech-commands/.npmignore b/音频分类/speech-commands/.npmignore
new file mode 100644
index 0000000..1297519
--- /dev/null
+++ b/音频分类/speech-commands/.npmignore
@@ -0,0 +1,16 @@
+.yalc/
+.vscode/
+.rpt2_cache/
+demo/
+scripts/
+src/
+training/
+coverage/
+node_modules/
+karma.conf.js
+*.tgz
+.travis.yml
+.npmignore
+tslint.json
+yarn.lock
+yalc.lock
diff --git a/音频分类/speech-commands/.vscode/settings.json b/音频分类/speech-commands/.vscode/settings.json
new file mode 100644
index 0000000..3e5e8f9
--- /dev/null
+++ b/音频分类/speech-commands/.vscode/settings.json
@@ -0,0 +1,26 @@
+{
+ "search.exclude": {
+ "**/node_modules": true,
+ "coverage/": true,
+ "**/dist/": true,
+ "**/yarn.lock": true,
+ "**/.rpt2_cache/": true,
+ "**/.yalc/": true
+ },
+ "tslint.enable": true,
+ "tslint.run": "onType",
+ "tslint.configFile": "tslint.json",
+ "files.trimTrailingWhitespace": true,
+ "editor.tabSize": 2,
+ "editor.insertSpaces": true,
+ "[typescript]": {
+ "editor.formatOnSave": true
+ },
+ "editor.rulers": [80],
+ "clang-format.style": "Google",
+ "files.insertFinalNewline": true,
+ "editor.detectIndentation": false,
+ "editor.wrappingIndent": "none",
+ "typescript.tsdk": "./node_modules/typescript/lib",
+ "clang-format.executable": "${workspaceRoot}/node_modules/.bin/clang-format"
+}
diff --git a/音频分类/speech-commands/README.md b/音频分类/speech-commands/README.md
new file mode 100644
index 0000000..fb44291
--- /dev/null
+++ b/音频分类/speech-commands/README.md
@@ -0,0 +1,319 @@
+# Speech Command Recognizer
+
+The Speech Command Recognizer is a JavaScript module that enables
+recognition of spoken commands comprised of simple isolated English
+words from a small vocabulary. The default vocabulary includes the following
+words: the ten digits from "zero" to "nine", "up", "down", "left", "right",
+"go", "stop", "yes", "no", as well as the additional categories of
+"unknown word" and "background noise".
+
+It uses the web browser's
+[WebAudio API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API).
+It is built on top of [TensorFlow.js](https://js.tensorflow.org) and can
+perform inference and transfer learning entirely in the browser, using
+WebGL GPU acceleration.
+
+The underlying deep neural network has been trained using the
+[TensorFlow Speech Commands Dataset](https://www.tensorflow.org/datasets/catalog/speech_commands).
+
+For more details on the data set, see:
+
+Warden, P. (2018) "Speech commands: A dataset for limited-vocabulary
+speech recognition" https://arxiv.org/pdf/1804.03209.pdf
+
+## API Usage
+
+A speech command recognizer can be used in two ways:
+
+1. **Online streaming recognition**, during which the library automatically
+ opens an audio input channel using the browser's
+ [`getUserMedia`](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia)
+ and
+ [WebAudio](https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API)
+ APIs (requesting permission from user) and performs real-time recognition on
+ the audio input.
+2. **Offline recognition**, in which you provide a pre-constructed TensorFlow.js
+ [Tensor](https://js.tensorflow.org/api/latest/#tensor) object or a
+ `Float32Array` and the recognizer will return the recognition results.
+
+### Online streaming recognition
+
+To use the speech-command recognizer, first create a recognizer instance,
+then start the streaming recognition by calling its `listen()` method.
+
+```js
+const tf = require('@tensorflow/tfjs');
+const speechCommands = require('@tensorflow-models/speech-commands');
+
+// When calling `create()`, you must provide the type of the audio input.
+// The two available options are `BROWSER_FFT` and `SOFT_FFT`.
+// - BROWSER_FFT uses the browser's native Fourier transform.
+// - SOFT_FFT uses JavaScript implementations of Fourier transform
+// (not implemented yet).
+const recognizer = speechCommands.create('BROWSER_FFT');
+
+// Make sure that the underlying model and metadata are loaded via HTTPS
+// requests.
+await recognizer.ensureModelLoaded();
+
+// See the array of words that the recognizer is trained to recognize.
+console.log(recognizer.wordLabels());
+
+// `listen()` takes two arguments:
+// 1. A callback function that is invoked anytime a word is recognized.
+// 2. A configuration object with adjustable fields such a
+// - includeSpectrogram
+// - probabilityThreshold
+// - includeEmbedding
+recognizer.listen(result => {
+ // - result.scores contains the probability scores that correspond to
+ // recognizer.wordLabels().
+ // - result.spectrogram contains the spectrogram of the recognized word.
+}, {
+ includeSpectrogram: true,
+ probabilityThreshold: 0.75
+});
+
+// Stop the recognition in 10 seconds.
+setTimeout(() => recognizer.stopListening(), 10e3);
+```
+
+#### Vocabularies
+
+When calling `speechCommands.create()`, you can specify the vocabulary
+the loaded model will be able to recognize. This is specified as the second,
+optional argument to `speechCommands.create()`. For example:
+
+```js
+const recognizer = speechCommands.create('BROWSER_FFT', 'directional4w');
+```
+
+Currently, the supported vocabularies are:
+ - '18w' (default): The 20 item vocaulbary, consisting of:
+ 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven',
+ 'eight', 'nine', 'up', 'down', 'left', 'right', 'go', 'stop',
+ 'yes', and 'no', in addition to '_background_noise_' and '_unknown_'.
+ - 'directional4w': The four directional words: 'up', 'down', 'left', and
+ 'right', in addition to '_background_noise_' and '_unknown_'.
+
+'18w' is the default vocabulary.
+
+#### Parameters for online streaming recognition
+
+As the example above shows, you can specify optional parameters when calling
+`listen()`. The supported parameters are:
+
+* `overlapFactor`: Controls how often the recognizer performs prediction on
+ spectrograms. Must be >=0 and <1 (default: 0.5). For example,
+ if each spectrogram is 1000 ms long and `overlapFactor` is set to 0.25,
+ the prediction will happen every 250 ms.
+* `includeSpectrogram`: Let the callback function be invoked with the
+ spectrogram data included in the argument. Default: `false`.
+* `probabilityThreshold`: The callback function will be invoked if and only if
+ the maximum probability score of all the words is greater than this threshold.
+ Default: `0`.
+* `invokeCallbackOnNoiseAndUnknown`: Whether the callback function will be
+ invoked if the "word" with the maximum probability score is the "unknown"
+ or "background noise" token. Default: `false`.
+* `includeEmbedding`: Whether an internal activation from the underlying model
+ will be included in the callback argument, in addition to the probability
+ scores. Note: if this field is set as `true`, the value of
+ `invokeCallbackOnNoiseAndUnknown` will be overridden to `true` and the
+ value of `probabilityThreshold` will be overridden to `0`.
+
+### Offline recognition
+
+To perform offline recognition, you need to have obtained the spectrogram
+of an audio snippet through a certain means, e.g., by loading the data
+from a .wav file or synthesizing the spectrogram programmatically.
+Assuming you have the spectrogram stored in an Array of numbers or
+a Float32Array, you can create a `tf.Tensor` object. Note that the
+shape of the Tensor must match the expectation of the recognizer instance.
+E.g.,
+
+```js
+const tf = require('@tensorflow/tfjs');
+const speechCommands = require('@tensorflow-models/speech-commands');
+
+const recognizer = speechCommands.create('BROWSER_FFT');
+
+// Inspect the input shape of the recognizer's underlying tf.Model.
+console.log(recognizer.modelInputShape());
+// You will get something like [null, 43, 232, 1].
+// - The first dimension (null) is an undetermined batch dimension.
+// - The second dimension (e.g., 43) is the number of audio frames.
+// - The third dimension (e.g., 232) is the number of frequency data points in
+// every frame (i.e., column) of the spectrogram
+// - The last dimension (e.g., 1) is fixed at 1. This follows the convention of
+// convolutional neural networks in TensorFlow.js and Keras.
+
+// Inspect the sampling frequency and FFT size:
+console.log(recognizer.params().sampleRateHz);
+console.log(recognizer.params().fftSize);
+
+
+const x = tf.tensor4d(
+ mySpectrogramData, [1].concat(recognizer.modelInputShape().slice(1)));
+const output = await recognizer.recognize(x);
+// output has the same format as `result` in the online streaming example
+// above: the `scores` field contains the probabilities of the words.
+
+tf.dispose([x, output]);
+```
+
+Note that you must provide a spectrogram value to the `recognize()` call
+in order to perform the offline recognition. If `recognize()` is called
+without a first argument, it will perform one-shot online recognition
+by collecting a frame of audio via WebAudio.
+
+### Preloading model
+
+By default, a recognizer object will load the underlying
+tf.Model via HTTP requests to a centralized location, when its
+`listen()` or `recognize()` method is called the first time.
+You can pre-load the model to reduce the latency of the first calls
+to these methods. To do that, use the `ensureModelLoaded()` method of the
+recognizer object. The `ensureModelLoaded()` method also "warms up" model after
+the model is loaded. "Warm up" means running a few dummy examples through the
+model for inference to make sure that the necessary states are set up, so that
+subsequent inferences can be fast.
+
+### Transfer learning
+
+**Transfer learning** is the process of taking a model trained
+previously on a dataset (say dataset A) and applying it on a
+different dataset (say dataset B).
+To achieve transfer learning, the model needs to be slightly modified and
+re-trained on dataset B. However, thanks to the training on
+the original dataset (A), the training on the new dataset (B) takes much less
+time and computational resource, in addition to requiring a much smaller amount of
+data than the original training data. The modification process involves removing the
+top (output) dense layer of the original model and keeping the "base" of the
+model. Due to its previous training, the base can be used as a good feature
+extractor for any data similar to the original training data.
+The removed dense layer is replaced with a new dense layer configured
+specifically for the new dataset.
+
+The speech-command model is a model suitable for transfer learning on
+previously unseen spoken words. The original model has been trained on a relatively
+large dataset (~50k examples from 20 classes). It can be used for transfer learning on
+words different from the original vocabulary. We provide an API to perform
+this type of transfer learning. The steps are listed in the example
+code snippet below
+
+```js
+const baseRecognizer = speechCommands.create('BROWSER_FFT');
+await baseRecognizer.ensureModelLoaded();
+
+// Each instance of speech-command recognizer supports multiple
+// transfer-learning models, each of which can be trained for a different
+// new vocabulary.
+// Therefore we give a name to the transfer-learning model we are about to
+// train ('colors' in this case).
+const transferRecognizer = baseRecognizer.createTransfer('colors');
+
+// Call `collectExample()` to collect a number of audio examples
+// via WebAudio.
+await transferRecognizer.collectExample('red');
+await transferRecognizer.collectExample('green');
+await transferRecognizer.collectExample('blue');
+await transferRecognizer.collectExample('red');
+// Don't forget to collect some background-noise examples, so that the
+// transfer-learned model will be able to detect moments of silence.
+await transferRecognizer.collectExample('_background_noise_');
+await transferRecognizer.collectExample('green');
+await transferRecognizer.collectExample('blue');
+await transferRecognizer.collectExample('_background_noise_');
+// ... You would typically want to put `collectExample`
+// in the callback of a UI button to allow the user to collect
+// any desired number of examples in random order.
+
+// You can check the counts of examples for different words that have been
+// collect for this transfer-learning model.
+console.log(transferRecognizer.countExamples());
+// e.g., {'red': 2, 'green': 2', 'blue': 2, '_background_noise': 2};
+
+// Start training of the transfer-learning model.
+// You can specify `epochs` (number of training epochs) and `callback`
+// (the Model.fit callback to use during training), among other configuration
+// fields.
+await transferRecognizer.train({
+ epochs: 25,
+ callback: {
+ onEpochEnd: async (epoch, logs) => {
+ console.log(`Epoch ${epoch}: loss=${logs.loss}, accuracy=${logs.acc}`);
+ }
+ }
+});
+
+// After the transfer learning completes, you can start online streaming
+// recognition using the new model.
+await transferRecognizer.listen(result => {
+ // - result.scores contains the scores for the new vocabulary, which
+ // can be checked with:
+ const words = transferRecognizer.wordLabels();
+ // `result.scores` contains the scores for the new words, not the original
+ // words.
+ for (let i = 0; i < words.length; ++i) {
+ console.log(`score for word '${words[i]}' = ${result.scores[i]}`);
+ }
+}, {probabilityThreshold: 0.75});
+
+// Stop the recognition in 10 seconds.
+setTimeout(() => transferRecognizer.stopListening(), 10e3);
+```
+
+### Serialize examples from a transfer recognizer.
+
+Once examples has been collected with a transfer recognizer,
+you can export the examples in serialized form with the `serielizedExamples()`
+method, e.g.,
+
+```js
+const serialized = transferRecognizer.serializeExamples();
+```
+
+`serialized` is a binary `ArrayBuffer` amenable to storage and transmission.
+It contains the spectrogram data of the examples, as well as metadata such
+as word labels.
+
+You can also serialize the examples from a subset of the words in the
+transfer recognizer's vocabulary, e.g.,
+
+```js
+const serializedWithOnlyFoo = transferRecognizer.serializeExamples('foo');
+// Or
+const serializedWithOnlyFooAndBar = transferRecognizer.serializeExamples(['foo', 'bar']);
+```
+
+The serialized examples can later be loaded into another instance of
+transfer recognizer with the `loadExamples()` method, e.g.,
+
+```js
+const clearExisting = false;
+newTransferRecognizer.loadExamples(serialized, clearExisting);
+```
+
+Theo `clearExisting` flag ensures that the examples that `newTransferRecognizer`
+already holds are preserved. If `true`, the existing exampels will be cleared.
+If `clearExisting` is not specified, it'll default to `false`.
+
+## Live demo
+
+A developer-oriented live demo is available at
+[this address](https://storage.googleapis.com/tfjs-speech-model-test/2019-01-03a/dist/index.html).
+
+## How to run the demo from source code
+
+The demo/ folder contains a live demo of the speech-command recognizer.
+To run it, do
+
+```sh
+cd speech-commands
+yarn
+yarn publish-local
+cd demo
+yarn
+yarn link-local
+yarn watch
+```
diff --git a/音频分类/speech-commands/cloudbuild.yml b/音频分类/speech-commands/cloudbuild.yml
new file mode 100644
index 0000000..80bf843
--- /dev/null
+++ b/音频分类/speech-commands/cloudbuild.yml
@@ -0,0 +1,48 @@
+steps:
+
+# Install common dependencies.
+- name: 'node:16'
+ id: 'yarn-common'
+ entrypoint: 'yarn'
+ args: ['install']
+
+# Install tfjs dependencies.
+- name: 'node:16'
+ dir: 'speech-commands'
+ entrypoint: 'yarn'
+ id: 'yarn'
+ args: ['install']
+ waitFor: ['yarn-common']
+
+# Lint.
+- name: 'node:16'
+ dir: 'speech-commands'
+ entrypoint: 'yarn'
+ id: 'lint'
+ args: ['lint']
+ waitFor: ['yarn']
+
+# Build.
+- name: 'node:16'
+ dir: 'speech-commands'
+ entrypoint: 'yarn'
+ id: 'build'
+ args: ['build']
+ waitFor: ['yarn']
+
+# Run tests.
+- name: 'node:16'
+ dir: 'speech-commands'
+ entrypoint: 'yarn'
+ id: 'test'
+ args: ['test']
+ waitFor: ['yarn']
+
+# General configuration
+timeout: 1800s
+logsBucket: 'gs://tfjs-build-logs'
+substitutions:
+ _NIGHTLY: ''
+options:
+ logStreamingOption: 'STREAM_ON'
+ substitution_option: 'ALLOW_LOOSE'
diff --git a/音频分类/speech-commands/demo/.babelrc b/音频分类/speech-commands/demo/.babelrc
new file mode 100644
index 0000000..4d30251
--- /dev/null
+++ b/音频分类/speech-commands/demo/.babelrc
@@ -0,0 +1,18 @@
+{
+ "presets": [
+ [
+ "env",
+ {
+ "esmodules": false,
+ "targets": {
+ "browsers": [
+ "> 3%"
+ ]
+ }
+ }
+ ]
+ ],
+ "plugins": [
+ "@babel/plugin-transform-runtime"
+ ]
+}
diff --git a/音频分类/speech-commands/demo/dataset-vis.js b/音频分类/speech-commands/demo/dataset-vis.js
new file mode 100644
index 0000000..dbfbbaf
--- /dev/null
+++ b/音频分类/speech-commands/demo/dataset-vis.js
@@ -0,0 +1,321 @@
+/**
+ * @license
+ * Copyright 2019 Google LLC. All Rights Reserved.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =============================================================================
+ */
+
+import * as speechCommands from '../src';
+
+import {plotSpectrogram} from './ui';
+
+/** Remove the children of a div that do not have the isFixed attribute. */
+export function removeNonFixedChildrenFromWordDiv(wordDiv) {
+ for (let i = wordDiv.children.length - 1; i >= 0; --i) {
+ if (wordDiv.children[i].getAttribute('isFixed') == null) {
+ wordDiv.removeChild(wordDiv.children[i]);
+ } else {
+ break;
+ }
+ }
+}
+
+/**
+ * Get the relative x-coordinate of a click event in a canvas.
+ *
+ * @param {HTMLCanvasElement} canvasElement The canvas in which the click
+ * event happened.
+ * @param {Event} event The click event object.
+ * @return {number} The relative x-coordinate: a `number` between 0 and 1.
+ */
+function getCanvasClickRelativeXCoordinate(canvasElement, event) {
+ let x;
+ if (event.pageX) {
+ x = event.pageX;
+ } else {
+ x = event.clientX + document.body.scrollLeft +
+ document.documentElement.scrollLeft;
+ }
+ x -= canvasElement.offsetLeft;
+ return x / canvasElement.width;
+}
+
+/**
+ * Dataset visualizer that supports
+ *
+ * - Display of words and spectrograms
+ * - Navigation through examples
+ * - Deletion of examples
+ */
+export class DatasetViz {
+ /**
+ * Constructor of DatasetViz
+ *
+ * @param {Object} transferRecognizer An instance of
+ * `speechCommands.TransferSpeechCommandRecognizer`.
+ * @param {HTMLDivElement} topLevelContainer The div element that
+ * holds the div elements for the individual words. It is assumed
+ * that each element has its "word" attribute set to the word.
+ * @param {number} minExamplesPerClass Minimum number of examples
+ * per word class required for the start-transfer-learning button
+ * to be enabled.
+ * @param {HTMLButtonElement} startTransferLearnButton The button
+ * which starts the transfer learning when clicked.
+ * @param {HTMLBUttonElement} downloadAsFileButton The button
+ * that triggers downloading of the dataset as a file when clicked.
+ * @param {number} transferDurationMultiplier Optional duration
+ * multiplier (the ratio between the length of the example
+ * and the length expected by the model.) Defaults to 1.
+ */
+ constructor(
+ transferRecognizer, topLevelContainer, minExamplesPerClass,
+ startTransferLearnButton, downloadAsFileButton,
+ transferDurationMultiplier = 1) {
+ this.transferRecognizer = transferRecognizer;
+ this.container = topLevelContainer;
+ this.minExamplesPerClass = minExamplesPerClass;
+ this.startTransferLearnButton = startTransferLearnButton;
+ this.downloadAsFileButton = downloadAsFileButton;
+ this.transferDurationMultiplier = transferDurationMultiplier;
+
+ // Navigation indices for the words.
+ this.navIndices = {};
+ }
+
+ /** Get the set of words in the dataset visualizer. */
+ words_() {
+ const words = [];
+ for (const element of this.container.children) {
+ words.push(element.getAttribute('word'));
+ }
+ return words;
+ }
+
+ /**
+ * Draw an example.
+ *
+ * @param {HTMLDivElement} wordDiv The div element for the word. It is assumed
+ * that it contains the word button as the first child and the canvas as the
+ * second.
+ * @param {string} word The word of the example being added.
+ * @param {SpectrogramData} spectrogram Optional spectrogram data.
+ * If provided, will use it as is. If not provided, will use WebAudio
+ * to collect an example.
+ * @param {RawAudio} rawAudio Raw audio waveform. Optional
+ * @param {string} uid UID of the example being drawn. Must match the UID
+ * of the example from `this.transferRecognizer`.
+ */
+ async drawExample(wordDiv, word, spectrogram, rawAudio, uid) {
+ if (uid == null) {
+ throw new Error('Error: UID is not provided for pre-existing example.');
+ }
+
+ removeNonFixedChildrenFromWordDiv(wordDiv);
+
+ // Create the left and right nav buttons.
+ const leftButton = document.createElement('button');
+ leftButton.textContent = '←';
+ wordDiv.appendChild(leftButton);
+
+ const rightButton = document.createElement('button');
+ rightButton.textContent = '→';
+ wordDiv.appendChild(rightButton);
+
+ // Determine the position of the example in the word of the dataset.
+ const exampleUIDs =
+ this.transferRecognizer.getExamples(word).map(ex => ex.uid);
+ const position = exampleUIDs.indexOf(uid);
+ this.navIndices[word] = exampleUIDs.indexOf(uid);
+
+ if (position > 0) {
+ leftButton.addEventListener('click', () => {
+ this.redraw(word, exampleUIDs[position - 1]);
+ });
+ } else {
+ leftButton.disabled = true;
+ }
+
+ if (position < exampleUIDs.length - 1) {
+ rightButton.addEventListener('click', () => {
+ this.redraw(word, exampleUIDs[position + 1]);
+ });
+ } else {
+ rightButton.disabled = true;
+ }
+
+ // Spectrogram canvas.
+ const exampleCanvas = document.createElement('canvas');
+ exampleCanvas.style['display'] = 'inline-block';
+ exampleCanvas.style['vertical-align'] = 'middle';
+ exampleCanvas.height = 60;
+ exampleCanvas.width = 80;
+ exampleCanvas.style['padding'] = '3px';
+
+ // Set up the click callback for the spectrogram canvas. When clicked,
+ // the keyFrameIndex will be set.
+ if (word !== speechCommands.BACKGROUND_NOISE_TAG) {
+ exampleCanvas.addEventListener('click', event => {
+ const relativeX =
+ getCanvasClickRelativeXCoordinate(exampleCanvas, event);
+ const numFrames = spectrogram.data.length / spectrogram.frameSize;
+ const keyFrameIndex = Math.floor(numFrames * relativeX);
+ console.log(
+ `relativeX=${relativeX}; ` +
+ `changed keyFrameIndex to ${keyFrameIndex}`);
+ this.transferRecognizer.setExampleKeyFrameIndex(uid, keyFrameIndex);
+ this.redraw(word, uid);
+ });
+ }
+
+ wordDiv.appendChild(exampleCanvas);
+
+ const modelNumFrames = this.transferRecognizer.modelInputShape()[1];
+ await plotSpectrogram(
+ exampleCanvas, spectrogram.data, spectrogram.frameSize,
+ spectrogram.frameSize, {
+ pixelsPerFrame: exampleCanvas.width / modelNumFrames,
+ maxPixelWidth: Math.round(0.4 * window.innerWidth),
+ markKeyFrame: this.transferDurationMultiplier > 1 &&
+ word !== speechCommands.BACKGROUND_NOISE_TAG,
+ keyFrameIndex: spectrogram.keyFrameIndex
+ });
+
+ if (rawAudio != null) {
+ const playButton = document.createElement('button');
+ playButton.textContent = '▶️';
+ playButton.addEventListener('click', () => {
+ playButton.disabled = true;
+ speechCommands.utils.playRawAudio(
+ rawAudio, () => playButton.disabled = false);
+ });
+ wordDiv.appendChild(playButton);
+ }
+
+ // Create Delete button.
+ const deleteButton = document.createElement('button');
+ deleteButton.textContent = 'X';
+ wordDiv.appendChild(deleteButton);
+
+ // Callback for delete button.
+ deleteButton.addEventListener('click', () => {
+ this.transferRecognizer.removeExample(uid);
+ // TODO(cais): Smarter logic for which example to draw after deletion.
+ // Right now it always redraws the last available one.
+ this.redraw(word);
+ });
+
+ this.updateButtons_();
+ }
+
+ /**
+ * Redraw the spectrogram and buttons for a word.
+ *
+ * @param {string} word The word being redrawn. This must belong to the
+ * vocabulary currently held by the transferRecognizer.
+ * @param {string} uid Optional UID for the example to render. If not
+ * specified, the last available example of the dataset will be drawn.
+ */
+ async redraw(word, uid) {
+ if (word == null) {
+ throw new Error('word is not specified');
+ }
+ let divIndex;
+ for (divIndex = 0; divIndex < this.container.children.length; ++divIndex) {
+ if (this.container.children[divIndex].getAttribute('word') === word) {
+ break;
+ }
+ }
+ if (divIndex === this.container.children.length) {
+ throw new Error(`Cannot find div corresponding to word ${word}`);
+ }
+ const wordDiv = this.container.children[divIndex];
+ const exampleCounts = this.transferRecognizer.isDatasetEmpty() ?
+ {} :
+ this.transferRecognizer.countExamples();
+
+ if (word in exampleCounts) {
+ const examples = this.transferRecognizer.getExamples(word);
+ let example;
+ if (uid == null) {
+ // Example UID is not specified. Draw the last one available.
+ example = examples[examples.length - 1];
+ } else {
+ // Example UID is specified. Find the example and update navigation
+ // indices.
+ for (let index = 0; index < examples.length; ++index) {
+ if (examples[index].uid === uid) {
+ example = examples[index];
+ }
+ }
+ }
+
+ const spectrogram = example.example.spectrogram;
+ await this.drawExample(
+ wordDiv, word, spectrogram, example.example.rawAudio, example.uid);
+ } else {
+ removeNonFixedChildrenFromWordDiv(wordDiv);
+ }
+
+ this.updateButtons_();
+ }
+
+ /**
+ * Redraw the spectrograms and buttons for all words.
+ *
+ * For each word, the last available example is rendered.
+ **/
+ redrawAll() {
+ for (const word of this.words_()) {
+ this.redraw(word);
+ }
+ }
+
+ /** Update the button states according to the state of transferRecognizer. */
+ updateButtons_() {
+ const exampleCounts = this.transferRecognizer.isDatasetEmpty() ?
+ {} :
+ this.transferRecognizer.countExamples();
+ const minCountByClass =
+ this.words_()
+ .map(word => exampleCounts[word] || 0)
+ .reduce((prev, current) => current < prev ? current : prev);
+
+ for (const element of this.container.children) {
+ const word = element.getAttribute('word');
+ const button = element.children[0];
+ const displayWord =
+ word === speechCommands.BACKGROUND_NOISE_TAG ? 'noise' : word;
+ const exampleCount = exampleCounts[word] || 0;
+ if (exampleCount === 0) {
+ button.textContent = `${displayWord} (${exampleCount})`;
+ } else {
+ const pos = this.navIndices[word] + 1;
+ button.textContent = `${displayWord} (${pos}/${exampleCount})`;
+ }
+ }
+
+ const requiredMinCountPerClass =
+ Math.ceil(this.minExamplesPerClass / this.transferDurationMultiplier);
+ if (minCountByClass >= requiredMinCountPerClass) {
+ this.startTransferLearnButton.textContent = 'Start transfer learning';
+ this.startTransferLearnButton.disabled = false;
+ } else {
+ this.startTransferLearnButton.textContent =
+ `Need at least ${requiredMinCountPerClass} examples per word`;
+ this.startTransferLearnButton.disabled = true;
+ }
+
+ this.downloadAsFileButton.disabled =
+ this.transferRecognizer.isDatasetEmpty();
+ }
+}
diff --git a/音频分类/speech-commands/demo/index.html b/音频分类/speech-commands/demo/index.html
new file mode 100644
index 0000000..95f16ab
--- /dev/null
+++ b/音频分类/speech-commands/demo/index.html
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+ TensorFlow.js Speech Commands Model Demo
+
+
+
+
+
+
+ Start
+ Stop
+
+
+
+ Prob. threshold:
+
+
+
+
+
+
+
+
+
+ Duration x1
+ Duration x2
+
+
+
+
Include audio waveform
+
+
Enter transfer words
+
+
+
+
+
+
Dataset IO >>
+
+
+
↓ Download dataset as file
+
+
+ ↑ Upload dataset
+ Evaluate model on dataset
+
+
+
+
+
+
+ Epochs:
+
+ Fine-tuning (FT) epochs:
+
+ Augment by mixing noise:
+
+ Start transfer learning
+
+
+
+
+
+
Model IO >>
+
+
+ Load:
+
+
+
+ Delete
+
+
+ Save model
+
+
+
+
+
+
+
+
+
diff --git a/音频分类/speech-commands/demo/index.js b/音频分类/speech-commands/demo/index.js
new file mode 100644
index 0000000..d42c1a3
--- /dev/null
+++ b/音频分类/speech-commands/demo/index.js
@@ -0,0 +1,713 @@
+/**
+ * @license
+ * Copyright 2019 Google LLC. All Rights Reserved.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =============================================================================
+ */
+
+import * as tf from '@tensorflow/tfjs';
+import Plotly from 'plotly.js-dist';
+
+import * as SpeechCommands from '@tensorflow-models/speech-commands';
+
+import {DatasetViz, removeNonFixedChildrenFromWordDiv} from './dataset-vis';
+import {hideCandidateWords, logToStatusDisplay, plotPredictions, plotSpectrogram, populateCandidateWords, showCandidateWords} from './ui';
+
+const startButton = document.getElementById('start');
+const stopButton = document.getElementById('stop');
+const predictionCanvas = document.getElementById('prediction-canvas');
+
+const probaThresholdInput = document.getElementById('proba-threshold');
+const epochsInput = document.getElementById('epochs');
+const fineTuningEpochsInput = document.getElementById('fine-tuning-epochs');
+
+const datasetIOButton = document.getElementById('dataset-io');
+const datasetIOInnerDiv = document.getElementById('dataset-io-inner');
+const downloadAsFileButton = document.getElementById('download-dataset');
+const datasetFileInput = document.getElementById('dataset-file-input');
+const uploadFilesButton = document.getElementById('upload-dataset');
+
+const evalModelOnDatasetButton =
+ document.getElementById('eval-model-on-dataset');
+const evalResultsSpan = document.getElementById('eval-results');
+
+const modelIOButton = document.getElementById('model-io');
+const transferModelSaveLoadInnerDiv =
+ document.getElementById('transfer-model-save-load-inner');
+const loadTransferModelButton = document.getElementById('load-transfer-model');
+const saveTransferModelButton = document.getElementById('save-transfer-model');
+const savedTransferModelsSelect =
+ document.getElementById('saved-transfer-models');
+const deleteTransferModelButton =
+ document.getElementById('delete-transfer-model');
+
+const BACKGROUND_NOISE_TAG = SpeechCommands.BACKGROUND_NOISE_TAG;
+
+/**
+ * Transfer learning-related UI componenets.
+ */
+const transferModelNameInput = document.getElementById('transfer-model-name');
+const learnWordsInput = document.getElementById('learn-words');
+const durationMultiplierSelect = document.getElementById('duration-multiplier');
+const enterLearnWordsButton = document.getElementById('enter-learn-words');
+const includeTimeDomainWaveformCheckbox =
+ document.getElementById('include-audio-waveform');
+const collectButtonsDiv = document.getElementById('collect-words');
+const startTransferLearnButton =
+ document.getElementById('start-transfer-learn');
+
+const XFER_MODEL_NAME = 'xfer-model';
+
+// Minimum required number of examples per class for transfer learning.
+const MIN_EXAMPLES_PER_CLASS = 8;
+
+let recognizer;
+let transferWords;
+let transferRecognizer;
+let transferDurationMultiplier;
+
+(async function() {
+ logToStatusDisplay('Creating recognizer...');
+ recognizer = SpeechCommands.create('BROWSER_FFT');
+
+ await populateSavedTransferModelsSelect();
+
+ // Make sure the tf.Model is loaded through HTTP. If this is not
+ // called here, the tf.Model will be loaded the first time
+ // `listen()` is called.
+ recognizer.ensureModelLoaded()
+ .then(() => {
+ startButton.disabled = false;
+ enterLearnWordsButton.disabled = false;
+ loadTransferModelButton.disabled = false;
+ deleteTransferModelButton.disabled = false;
+
+ transferModelNameInput.value = `model-${getDateString()}`;
+
+ logToStatusDisplay('Model loaded.');
+
+ const params = recognizer.params();
+ logToStatusDisplay(`sampleRateHz: ${params.sampleRateHz}`);
+ logToStatusDisplay(`fftSize: ${params.fftSize}`);
+ logToStatusDisplay(
+ `spectrogramDurationMillis: ` +
+ `${params.spectrogramDurationMillis.toFixed(2)}`);
+ logToStatusDisplay(
+ `tf.Model input shape: ` +
+ `${JSON.stringify(recognizer.modelInputShape())}`);
+ })
+ .catch(err => {
+ logToStatusDisplay(
+ 'Failed to load model for recognizer: ' + err.message);
+ });
+})();
+
+startButton.addEventListener('click', () => {
+ const activeRecognizer =
+ transferRecognizer == null ? recognizer : transferRecognizer;
+ populateCandidateWords(activeRecognizer.wordLabels());
+
+ const suppressionTimeMillis = 1000;
+ activeRecognizer
+ .listen(
+ result => {
+ plotPredictions(
+ predictionCanvas, activeRecognizer.wordLabels(), result.scores,
+ 3, suppressionTimeMillis);
+ },
+ {
+ includeSpectrogram: true,
+ suppressionTimeMillis,
+ probabilityThreshold: Number.parseFloat(probaThresholdInput.value)
+ })
+ .then(() => {
+ startButton.disabled = true;
+ stopButton.disabled = false;
+ showCandidateWords();
+ logToStatusDisplay('Streaming recognition started.');
+ })
+ .catch(err => {
+ logToStatusDisplay(
+ 'ERROR: Failed to start streaming display: ' + err.message);
+ });
+});
+
+stopButton.addEventListener('click', () => {
+ const activeRecognizer =
+ transferRecognizer == null ? recognizer : transferRecognizer;
+ activeRecognizer.stopListening()
+ .then(() => {
+ startButton.disabled = false;
+ stopButton.disabled = true;
+ hideCandidateWords();
+ logToStatusDisplay('Streaming recognition stopped.');
+ })
+ .catch(err => {
+ logToStatusDisplay(
+ 'ERROR: Failed to stop streaming display: ' + err.message);
+ });
+});
+
+/**
+ * Transfer learning logic.
+ */
+
+/** Scroll to the bottom of the page */
+function scrollToPageBottom() {
+ const scrollingElement = (document.scrollingElement || document.body);
+ scrollingElement.scrollTop = scrollingElement.scrollHeight;
+}
+
+let collectWordButtons = {};
+let datasetViz;
+
+function createProgressBarAndIntervalJob(parentElement, durationSec) {
+ const progressBar = document.createElement('progress');
+ progressBar.value = 0;
+ progressBar.style['width'] = `${Math.round(window.innerWidth * 0.25)}px`;
+ // Update progress bar in increments.
+ const intervalJob = setInterval(() => {
+ progressBar.value += 0.05;
+ }, durationSec * 1e3 / 20);
+ parentElement.appendChild(progressBar);
+ return {progressBar, intervalJob};
+}
+
+/**
+ * Create div elements for transfer words.
+ *
+ * @param {string[]} transferWords The array of transfer words.
+ * @returns {Object} An object mapping word to th div element created for it.
+ */
+function createWordDivs(transferWords) {
+ // Clear collectButtonsDiv first.
+ while (collectButtonsDiv.firstChild) {
+ collectButtonsDiv.removeChild(collectButtonsDiv.firstChild);
+ }
+ datasetViz = new DatasetViz(
+ transferRecognizer, collectButtonsDiv, MIN_EXAMPLES_PER_CLASS,
+ startTransferLearnButton, downloadAsFileButton,
+ transferDurationMultiplier);
+
+ const wordDivs = {};
+ for (const word of transferWords) {
+ const wordDiv = document.createElement('div');
+ wordDiv.classList.add('word-div');
+ wordDivs[word] = wordDiv;
+ wordDiv.setAttribute('word', word);
+ const button = document.createElement('button');
+ button.setAttribute('isFixed', 'true');
+ button.style['display'] = 'inline-block';
+ button.style['vertical-align'] = 'middle';
+
+ const displayWord = word === BACKGROUND_NOISE_TAG ? 'noise' : word;
+
+ button.textContent = `${displayWord} (0)`;
+ wordDiv.appendChild(button);
+ wordDiv.className = 'transfer-word';
+ collectButtonsDiv.appendChild(wordDiv);
+ collectWordButtons[word] = button;
+
+ let durationInput;
+ if (word === BACKGROUND_NOISE_TAG) {
+ // Create noise duration input.
+ durationInput = document.createElement('input');
+ durationInput.setAttribute('isFixed', 'true');
+ durationInput.value = '10';
+ durationInput.style['width'] = '100px';
+ wordDiv.appendChild(durationInput);
+ // Create time-unit span for noise duration.
+ const timeUnitSpan = document.createElement('span');
+ timeUnitSpan.setAttribute('isFixed', 'true');
+ timeUnitSpan.classList.add('settings');
+ timeUnitSpan.style['vertical-align'] = 'middle';
+ timeUnitSpan.textContent = 'seconds';
+ wordDiv.appendChild(timeUnitSpan);
+ }
+
+ button.addEventListener('click', async () => {
+ disableAllCollectWordButtons();
+ removeNonFixedChildrenFromWordDiv(wordDiv);
+
+ const collectExampleOptions = {};
+ let durationSec;
+ let intervalJob;
+ let progressBar;
+
+ if (word === BACKGROUND_NOISE_TAG) {
+ // If the word type is background noise, display a progress bar during
+ // sound collection and do not show an incrementally updating
+ // spectrogram.
+ // _background_noise_ examples are special, in that user can specify
+ // the length of the recording (in seconds).
+ collectExampleOptions.durationSec =
+ Number.parseFloat(durationInput.value);
+ durationSec = collectExampleOptions.durationSec;
+
+ const barAndJob = createProgressBarAndIntervalJob(wordDiv, durationSec);
+ progressBar = barAndJob.progressBar;
+ intervalJob = barAndJob.intervalJob;
+ } else {
+ // If this is not a background-noise word type and if the duration
+ // multiplier is >1 (> ~1 s recoding), show an incrementally
+ // updating spectrogram in real time.
+ collectExampleOptions.durationMultiplier = transferDurationMultiplier;
+ let tempSpectrogramData;
+ const tempCanvas = document.createElement('canvas');
+ tempCanvas.style['margin-left'] = '132px';
+ tempCanvas.height = 50;
+ wordDiv.appendChild(tempCanvas);
+
+ collectExampleOptions.snippetDurationSec = 0.1;
+ collectExampleOptions.onSnippet = async (spectrogram) => {
+ if (tempSpectrogramData == null) {
+ tempSpectrogramData = spectrogram.data;
+ } else {
+ tempSpectrogramData = SpeechCommands.utils.concatenateFloat32Arrays(
+ [tempSpectrogramData, spectrogram.data]);
+ }
+ plotSpectrogram(
+ tempCanvas, tempSpectrogramData, spectrogram.frameSize,
+ spectrogram.frameSize, {pixelsPerFrame: 2});
+ }
+ }
+
+ collectExampleOptions.includeRawAudio =
+ includeTimeDomainWaveformCheckbox.checked;
+ const spectrogram =
+ await transferRecognizer.collectExample(word, collectExampleOptions);
+
+
+ if (intervalJob != null) {
+ clearInterval(intervalJob);
+ }
+ if (progressBar != null) {
+ wordDiv.removeChild(progressBar);
+ }
+ const examples = transferRecognizer.getExamples(word)
+ const example = examples[examples.length - 1];
+ await datasetViz.drawExample(
+ wordDiv, word, spectrogram, example.example.rawAudio, example.uid);
+ enableAllCollectWordButtons();
+ });
+ }
+ return wordDivs;
+}
+
+enterLearnWordsButton.addEventListener('click', () => {
+ const modelName = transferModelNameInput.value;
+ if (modelName == null || modelName.length === 0) {
+ enterLearnWordsButton.textContent = 'Need model name!';
+ setTimeout(() => {
+ enterLearnWordsButton.textContent = 'Enter transfer words';
+ }, 2000);
+ return;
+ }
+
+ // We disable the option to upload an existing dataset from files
+ // once the "Enter transfer words" button has been clicked.
+ // However, the user can still load an existing dataset from
+ // files first and keep appending examples to it.
+ disableFileUploadControls();
+ enterLearnWordsButton.disabled = true;
+
+ transferDurationMultiplier = durationMultiplierSelect.value;
+
+ learnWordsInput.disabled = true;
+ enterLearnWordsButton.disabled = true;
+ transferWords = learnWordsInput.value.trim().split(',').map(w => w.trim());
+ transferWords.sort();
+ if (transferWords == null || transferWords.length <= 1) {
+ logToStatusDisplay('ERROR: Invalid list of transfer words.');
+ return;
+ }
+
+ transferRecognizer = recognizer.createTransfer(modelName);
+ createWordDivs(transferWords);
+
+ scrollToPageBottom();
+});
+
+function disableAllCollectWordButtons() {
+ for (const word in collectWordButtons) {
+ collectWordButtons[word].disabled = true;
+ }
+}
+
+function enableAllCollectWordButtons() {
+ for (const word in collectWordButtons) {
+ collectWordButtons[word].disabled = false;
+ }
+}
+
+function disableFileUploadControls() {
+ datasetFileInput.disabled = true;
+ uploadFilesButton.disabled = true;
+}
+
+startTransferLearnButton.addEventListener('click', async () => {
+ startTransferLearnButton.disabled = true;
+ startButton.disabled = true;
+ startTransferLearnButton.textContent = 'Transfer learning starting...';
+ await tf.nextFrame();
+
+ const INITIAL_PHASE = 'initial';
+ const FINE_TUNING_PHASE = 'fineTuningPhase';
+
+ const epochs = parseInt(epochsInput.value);
+ const fineTuningEpochs = parseInt(fineTuningEpochsInput.value);
+ const trainLossValues = {};
+ const valLossValues = {};
+ const trainAccValues = {};
+ const valAccValues = {};
+
+ for (const phase of [INITIAL_PHASE, FINE_TUNING_PHASE]) {
+ const phaseSuffix = phase === FINE_TUNING_PHASE ? ' (FT)' : '';
+ const lineWidth = phase === FINE_TUNING_PHASE ? 2 : 1;
+ trainLossValues[phase] = {
+ x: [],
+ y: [],
+ name: 'train' + phaseSuffix,
+ mode: 'lines',
+ line: {width: lineWidth}
+ };
+ valLossValues[phase] = {
+ x: [],
+ y: [],
+ name: 'val' + phaseSuffix,
+ mode: 'lines',
+ line: {width: lineWidth}
+ };
+ trainAccValues[phase] = {
+ x: [],
+ y: [],
+ name: 'train' + phaseSuffix,
+ mode: 'lines',
+ line: {width: lineWidth}
+ };
+ valAccValues[phase] = {
+ x: [],
+ y: [],
+ name: 'val' + phaseSuffix,
+ mode: 'lines',
+ line: {width: lineWidth}
+ };
+ }
+
+ function plotLossAndAccuracy(epoch, loss, acc, val_loss, val_acc, phase) {
+ const displayEpoch = phase === FINE_TUNING_PHASE ? (epoch + epochs) : epoch;
+ trainLossValues[phase].x.push(displayEpoch);
+ trainLossValues[phase].y.push(loss);
+ trainAccValues[phase].x.push(displayEpoch);
+ trainAccValues[phase].y.push(acc);
+ valLossValues[phase].x.push(displayEpoch);
+ valLossValues[phase].y.push(val_loss);
+ valAccValues[phase].x.push(displayEpoch);
+ valAccValues[phase].y.push(val_acc);
+
+ Plotly.newPlot(
+ 'loss-plot',
+ [
+ trainLossValues[INITIAL_PHASE], valLossValues[INITIAL_PHASE],
+ trainLossValues[FINE_TUNING_PHASE], valLossValues[FINE_TUNING_PHASE]
+ ],
+ {
+ width: 480,
+ height: 360,
+ xaxis: {title: 'Epoch #'},
+ yaxis: {title: 'Loss'},
+ font: {size: 18}
+ });
+ Plotly.newPlot(
+ 'accuracy-plot',
+ [
+ trainAccValues[INITIAL_PHASE], valAccValues[INITIAL_PHASE],
+ trainAccValues[FINE_TUNING_PHASE], valAccValues[FINE_TUNING_PHASE]
+ ],
+ {
+ width: 480,
+ height: 360,
+ xaxis: {title: 'Epoch #'},
+ yaxis: {title: 'Accuracy'},
+ font: {size: 18}
+ });
+ startTransferLearnButton.textContent = phase === INITIAL_PHASE ?
+ `Transfer-learning... (${(epoch / epochs * 1e2).toFixed(0)}%)` :
+ `Transfer-learning (fine-tuning)... (${
+ (epoch / fineTuningEpochs * 1e2).toFixed(0)}%)`
+
+ scrollToPageBottom();
+ }
+
+ disableAllCollectWordButtons();
+ const augmentByMixingNoiseRatio =
+ document.getElementById('augment-by-mixing-noise').checked ? 0.5 : null;
+ console.log(`augmentByMixingNoiseRatio = ${augmentByMixingNoiseRatio}`);
+ await transferRecognizer.train({
+ epochs,
+ validationSplit: 0.25,
+ augmentByMixingNoiseRatio,
+ callback: {
+ onEpochEnd: async (epoch, logs) => {
+ plotLossAndAccuracy(
+ epoch, logs.loss, logs.acc, logs.val_loss, logs.val_acc,
+ INITIAL_PHASE);
+ }
+ },
+ fineTuningEpochs,
+ fineTuningCallback: {
+ onEpochEnd: async (epoch, logs) => {
+ plotLossAndAccuracy(
+ epoch, logs.loss, logs.acc, logs.val_loss, logs.val_acc,
+ FINE_TUNING_PHASE);
+ }
+ }
+ });
+ saveTransferModelButton.disabled = false;
+ transferModelNameInput.value = transferRecognizer.name;
+ transferModelNameInput.disabled = true;
+ startTransferLearnButton.textContent = 'Transfer learning complete.';
+ transferModelNameInput.disabled = false;
+ startButton.disabled = false;
+ evalModelOnDatasetButton.disabled = false;
+});
+
+downloadAsFileButton.addEventListener('click', () => {
+ const basename = getDateString();
+ const artifacts = transferRecognizer.serializeExamples();
+
+ // Trigger downloading of the data .bin file.
+ const anchor = document.createElement('a');
+ anchor.download = `${basename}.bin`;
+ anchor.href = window.URL.createObjectURL(
+ new Blob([artifacts], {type: 'application/octet-stream'}));
+ anchor.click();
+});
+
+/** Get the base name of the downloaded files based on current dataset. */
+function getDateString() {
+ const d = new Date();
+ const year = `${d.getFullYear()}`;
+ let month = `${d.getMonth() + 1}`;
+ let day = `${d.getDate()}`;
+ if (month.length < 2) {
+ month = `0${month}`;
+ }
+ if (day.length < 2) {
+ day = `0${day}`;
+ }
+ let hour = `${d.getHours()}`;
+ if (hour.length < 2) {
+ hour = `0${hour}`;
+ }
+ let minute = `${d.getMinutes()}`;
+ if (minute.length < 2) {
+ minute = `0${minute}`;
+ }
+ let second = `${d.getSeconds()}`;
+ if (second.length < 2) {
+ second = `0${second}`;
+ }
+ return `${year}-${month}-${day}T${hour}.${minute}.${second}`;
+}
+
+uploadFilesButton.addEventListener('click', async () => {
+ const files = datasetFileInput.files;
+ if (files == null || files.length !== 1) {
+ throw new Error('Must select exactly one file.');
+ }
+ const datasetFileReader = new FileReader();
+ datasetFileReader.onload = async event => {
+ try {
+ await loadDatasetInTransferRecognizer(event.target.result);
+ } catch (err) {
+ const originalTextContent = uploadFilesButton.textContent;
+ uploadFilesButton.textContent = err.message;
+ setTimeout(() => {
+ uploadFilesButton.textContent = originalTextContent;
+ }, 2000);
+ }
+ durationMultiplierSelect.value = `${transferDurationMultiplier}`;
+ durationMultiplierSelect.disabled = true;
+ enterLearnWordsButton.disabled = true;
+ };
+ datasetFileReader.onerror = () =>
+ console.error(`Failed to binary data from file '${dataFile.name}'.`);
+ datasetFileReader.readAsArrayBuffer(files[0]);
+});
+
+async function loadDatasetInTransferRecognizer(serialized) {
+ const modelName = transferModelNameInput.value;
+ if (modelName == null || modelName.length === 0) {
+ throw new Error('Need model name!');
+ }
+
+ if (transferRecognizer == null) {
+ transferRecognizer = recognizer.createTransfer(modelName);
+ }
+ transferRecognizer.loadExamples(serialized);
+ const exampleCounts = transferRecognizer.countExamples();
+ transferWords = [];
+ const modelNumFrames = transferRecognizer.modelInputShape()[1];
+ const durationMultipliers = [];
+ for (const word in exampleCounts) {
+ transferWords.push(word);
+ const examples = transferRecognizer.getExamples(word);
+ for (const example of examples) {
+ const spectrogram = example.example.spectrogram;
+ // Ignore _background_noise_ examples when determining the duration
+ // multiplier of the dataset.
+ if (word !== BACKGROUND_NOISE_TAG) {
+ durationMultipliers.push(Math.round(
+ spectrogram.data.length / spectrogram.frameSize / modelNumFrames));
+ }
+ }
+ }
+ transferWords.sort();
+ learnWordsInput.value = transferWords.join(',');
+
+ // Determine the transferDurationMultiplier value from the dataset.
+ transferDurationMultiplier =
+ durationMultipliers.length > 0 ? Math.max(...durationMultipliers) : 1;
+ console.log(
+ `Deteremined transferDurationMultiplier from uploaded ` +
+ `dataset: ${transferDurationMultiplier}`);
+
+ createWordDivs(transferWords);
+ datasetViz.redrawAll();
+}
+
+evalModelOnDatasetButton.addEventListener('click', async () => {
+ const files = datasetFileInput.files;
+ if (files == null || files.length !== 1) {
+ throw new Error('Must select exactly one file.');
+ }
+ evalModelOnDatasetButton.disabled = true;
+ const datasetFileReader = new FileReader();
+ datasetFileReader.onload = async event => {
+ try {
+ if (transferRecognizer == null) {
+ throw new Error('There is no model!');
+ }
+
+ // Load the dataset and perform evaluation of the transfer
+ // model using the dataset.
+ transferRecognizer.loadExamples(event.target.result);
+ const evalResult = await transferRecognizer.evaluate({
+ windowHopRatio: 0.25,
+ wordProbThresholds: [
+ 0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.5,
+ 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0
+ ]
+ });
+ // Plot the ROC curve.
+ const rocDataForPlot = {x: [], y: []};
+ evalResult.rocCurve.forEach(item => {
+ rocDataForPlot.x.push(item.fpr);
+ rocDataForPlot.y.push(item.tpr);
+ });
+
+ Plotly.newPlot('roc-plot', [rocDataForPlot], {
+ width: 360,
+ height: 360,
+ mode: 'markers',
+ marker: {size: 7},
+ xaxis: {title: 'False positive rate (FPR)', range: [0, 1]},
+ yaxis: {title: 'True positive rate (TPR)', range: [0, 1]},
+ font: {size: 18}
+ });
+ evalResultsSpan.textContent = `AUC = ${evalResult.auc}`;
+ } catch (err) {
+ const originalTextContent = evalModelOnDatasetButton.textContent;
+ evalModelOnDatasetButton.textContent = err.message;
+ setTimeout(() => {
+ evalModelOnDatasetButton.textContent = originalTextContent;
+ }, 2000);
+ }
+ evalModelOnDatasetButton.disabled = false;
+ };
+ datasetFileReader.onerror = () =>
+ console.error(`Failed to binary data from file '${dataFile.name}'.`);
+ datasetFileReader.readAsArrayBuffer(files[0]);
+});
+
+async function populateSavedTransferModelsSelect() {
+ const savedModelKeys = await SpeechCommands.listSavedTransferModels();
+ while (savedTransferModelsSelect.firstChild) {
+ savedTransferModelsSelect.removeChild(savedTransferModelsSelect.firstChild);
+ }
+ if (savedModelKeys.length > 0) {
+ for (const key of savedModelKeys) {
+ const option = document.createElement('option');
+ option.textContent = key;
+ option.id = key;
+ savedTransferModelsSelect.appendChild(option);
+ }
+ loadTransferModelButton.disabled = false;
+ }
+}
+
+saveTransferModelButton.addEventListener('click', async () => {
+ await transferRecognizer.save();
+ await populateSavedTransferModelsSelect();
+ saveTransferModelButton.textContent = 'Model saved!';
+ saveTransferModelButton.disabled = true;
+});
+
+loadTransferModelButton.addEventListener('click', async () => {
+ const transferModelName = savedTransferModelsSelect.value;
+ await recognizer.ensureModelLoaded();
+ transferRecognizer = recognizer.createTransfer(transferModelName);
+ await transferRecognizer.load();
+ transferModelNameInput.value = transferModelName;
+ transferModelNameInput.disabled = true;
+ learnWordsInput.value = transferRecognizer.wordLabels().join(',');
+ learnWordsInput.disabled = true;
+ durationMultiplierSelect.disabled = true;
+ enterLearnWordsButton.disabled = true;
+ saveTransferModelButton.disabled = true;
+ loadTransferModelButton.disabled = true;
+ loadTransferModelButton.textContent = 'Model loaded!';
+});
+
+modelIOButton.addEventListener('click', () => {
+ if (modelIOButton.textContent.endsWith(' >>')) {
+ transferModelSaveLoadInnerDiv.style.display = 'inline-block';
+ modelIOButton.textContent = modelIOButton.textContent.replace(' >>', ' <<');
+ } else {
+ transferModelSaveLoadInnerDiv.style.display = 'none';
+ modelIOButton.textContent = modelIOButton.textContent.replace(' <<', ' >>');
+ }
+});
+
+deleteTransferModelButton.addEventListener('click', async () => {
+ const transferModelName = savedTransferModelsSelect.value;
+ await recognizer.ensureModelLoaded();
+ transferRecognizer = recognizer.createTransfer(transferModelName);
+ await SpeechCommands.deleteSavedTransferModel(transferModelName);
+ deleteTransferModelButton.disabled = true;
+ deleteTransferModelButton.textContent = `Deleted "${transferModelName}"`;
+ await populateSavedTransferModelsSelect();
+});
+
+datasetIOButton.addEventListener('click', () => {
+ if (datasetIOButton.textContent.endsWith(' >>')) {
+ datasetIOInnerDiv.style.display = 'inline-block';
+ datasetIOButton.textContent =
+ datasetIOButton.textContent.replace(' >>', ' <<');
+ } else {
+ datasetIOInnerDiv.style.display = 'none';
+ datasetIOButton.textContent =
+ datasetIOButton.textContent.replace(' <<', ' >>');
+ }
+});
diff --git a/音频分类/speech-commands/demo/package.json b/音频分类/speech-commands/demo/package.json
new file mode 100644
index 0000000..5e95842
--- /dev/null
+++ b/音频分类/speech-commands/demo/package.json
@@ -0,0 +1,60 @@
+{
+ "name": "tfjs-models-speech-commands-demo",
+ "version": "0.0.1",
+ "description": "",
+ "main": "index.js",
+ "license": "Apache-2.0",
+ "private": true,
+ "engines": {
+ "node": ">=8.9.0"
+ },
+ "dependencies": {
+ "@tensorflow-models/speech-commands": "file:../dist",
+ "stats.js": "^0.17.0"
+ },
+ "scripts": {
+ "build-model": "cd .. && yarn && yarn build",
+ "watch": "yarn build-model && cross-env NODE_OPTIONS=--max_old_space_size=4096 NODE_ENV=development parcel index.html --no-hmr --open",
+ "build": "yarn build-model && cross-env NODE_OPTIONS=--max_old_space_size=4096 NODE_ENV=production parcel build index.html --public-url ./",
+ "lint": "eslint .",
+ "link-local": "yalc link @tensorflow-models/speech-commands"
+ },
+ "browser": {
+ "crypto": false
+ },
+ "devDependencies": {
+ "@babel/core": "^7.0.0-0",
+ "@babel/plugin-transform-runtime": "^7.1.0",
+ "babel-polyfill": "~6.26.0",
+ "babel-preset-env": "~1.6.1",
+ "babel-preset-es2017": "^6.24.1",
+ "clang-format": "~1.2.2",
+ "cross-env": "^5.2.0",
+ "dat.gui": "^0.7.1",
+ "eslint": "^4.19.1",
+ "eslint-config-google": "^0.9.1",
+ "parcel-bundler": "~1.12.5",
+ "plotly.js-dist": "^1.39.4",
+ "yalc": "~1.0.0-pre.50"
+ },
+ "resolutions": {
+ "is-svg": "4.3.1"
+ },
+ "eslintConfig": {
+ "extends": "google",
+ "rules": {
+ "require-jsdoc": 0,
+ "valid-jsdoc": 0
+ },
+ "env": {
+ "es6": true
+ },
+ "parserOptions": {
+ "ecmaVersion": 8,
+ "sourceType": "module"
+ }
+ },
+ "eslintIgnore": [
+ "dist/"
+ ]
+}
diff --git a/音频分类/speech-commands/demo/style.css b/音频分类/speech-commands/demo/style.css
new file mode 100644
index 0000000..d8629d9
--- /dev/null
+++ b/音频分类/speech-commands/demo/style.css
@@ -0,0 +1,183 @@
+body {
+ margin: 30px 0 0 30px;
+ font: 400 11px system-ui;
+}
+
+button {
+ color: #ff8300;
+ background-color: #ffffff;
+ border-style: solid;
+ border-width: 2px;
+ border-color: #ff8300;
+ border-radius: 10px;
+ font-size: 20px;
+ margin: 5px;
+ padding: 15px;
+}
+
+button:disabled {
+ color: #a0a0a0;
+ border-color: #a0a0a0;
+}
+
+input:disabled {
+ color: #a0a0a0;
+ border-color: #a0a0a0;
+}
+
+select:disabled {
+ color: #a0a0a0;
+ border-color: #a0a0a0;
+}
+
+select {
+ color: #ff8300;
+ background-color: #ffffff;
+ border-style: solid;
+ border-width: 2px;
+ border-color: #ff8300;
+ border-radius: 10px;
+ font-size: 20px;
+ margin: 5px;
+ padding: 15px;
+}
+
+.transfer-learn-section input {
+ color: #0000ff;
+ background-color: #ffffff;
+ border-style: solid;
+ border-width: 2px;
+ border-color: #0000ff;
+ border-radius: 10px;
+ font-size: 20px;
+ margin: 5px;
+ padding: 15px;
+ position: relative;
+}
+
+textarea {
+ font-size: 20px;
+ width: 90%;
+ height: 80%;
+ border: 2px solid #888;
+ border-radius: 10px;
+ resize: none;
+}
+
+.footer {
+ height: 20%;
+}
+
+.transfer-learn {
+ position: absolute;
+ top: 40%;
+}
+
+.word-div {
+ border-radius: 10px;
+ margin: 3px;
+}
+
+.candidate-word {
+ border: 1px solid gray;
+ background-color: lightyellow;
+ margin: 5px;
+ border-radius: 3px;
+ width: 10vw;
+ padding: 15px;
+ text-align: center;
+}
+
+.candidate-word-active {
+ border: 2px solid gray;
+ background-color: lightgreen;
+}
+
+.candidate-word-label {
+ font-weight: bold;
+ background-color: orange;
+ width: 250px;
+}
+
+.candidate-words-hidden {
+ display: none !important;
+}
+
+#candidate-words {
+ display: flex;
+ flex-wrap: wrap;
+ font-size: 20px;
+}
+
+#collect-words {
+ display: flex;
+ flex-wrap: wrap;
+ flex-direction: column;
+}
+
+#plots {
+ display: flex;
+}
+
+.settings {
+ font-size: 17px;
+}
+
+.collapsible-region {
+ font-size: 17px;
+ border-style: solid;
+ border-width: 1px;
+ border-color: #808080;
+ border-radius: 10px;
+}
+
+.collapsible-region-inner {
+ display: none;
+}
+
+#model-io {
+ vertical-align: top;
+}
+
+#dataset-io {
+ vertical-align: top;
+}
+
+.start-stop {
+ font-size: 17px;
+}
+
+.settings input {
+ color: #0000ff;
+ background-color: #ffffff;
+ border-style: solid;
+ border-width: 2px;
+ border-color: #0000ff;
+ border-radius: 10px;
+ margin: 5px;
+ font-size: 17px;
+}
+
+.transfer-word {
+ display: flex;
+ width: 100%;
+ justify-content: left;
+ vertical-align: middle;
+ text-align: center;
+}
+
+.eval-results {
+ font-size: 17px;
+}
+
+input[type=checkbox] {
+ transform: scale(2);
+}
+
+#include-audio-waveform {
+ margin-left: 20px;
+}
+
+#include-audio-waveform-label {
+ font-size: 17px;
+}
diff --git a/音频分类/speech-commands/demo/ui.js b/音频分类/speech-commands/demo/ui.js
new file mode 100644
index 0000000..33aca15
--- /dev/null
+++ b/音频分类/speech-commands/demo/ui.js
@@ -0,0 +1,216 @@
+/**
+ * @license
+ * Copyright 2019 Google LLC. All Rights Reserved.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =============================================================================
+ */
+
+import * as SpeechCommands from '../src';
+
+import {BACKGROUND_NOISE_TAG, UNKNOWN_TAG} from '../src';
+
+const statusDisplay = document.getElementById('status-display');
+const candidateWordsContainer = document.getElementById('candidate-words');
+
+/**
+ * Log a message to a textarea.
+ *
+ * @param {string} message Message to be logged.
+ */
+export function logToStatusDisplay(message) {
+ const date = new Date();
+ statusDisplay.value += `[${date.toISOString()}] ` + message + '\n';
+ statusDisplay.scrollTop = statusDisplay.scrollHeight;
+}
+
+let candidateWordSpans;
+
+/**
+ * Display candidate words in the UI.
+ *
+ * The background-noise "word" will be omitted.
+ *
+ * @param {*} words Candidate words.
+ */
+export function populateCandidateWords(words) {
+ candidateWordSpans = {};
+ while (candidateWordsContainer.firstChild) {
+ candidateWordsContainer.removeChild(candidateWordsContainer.firstChild);
+ }
+
+ for (const word of words) {
+ if (word === BACKGROUND_NOISE_TAG || word === UNKNOWN_TAG) {
+ continue;
+ }
+ const wordSpan = document.createElement('span');
+ wordSpan.textContent = word;
+ wordSpan.classList.add('candidate-word');
+ candidateWordsContainer.appendChild(wordSpan);
+ candidateWordSpans[word] = wordSpan;
+ }
+}
+
+export function showCandidateWords() {
+ candidateWordsContainer.classList.remove('candidate-words-hidden');
+}
+
+export function hideCandidateWords() {
+ candidateWordsContainer.classList.add('candidate-words-hidden');
+}
+
+/**
+ * Show an audio spectrogram in a canvas.
+ *
+ * @param {HTMLCanvasElement} canvas The canvas element to draw the
+ * spectrogram in.
+ * @param {Float32Array} frequencyData The flat array for the spectrogram
+ * data.
+ * @param {number} fftSize Number of frequency points per frame.
+ * @param {number} fftDisplaySize Number of frequency points to show. Must be
+ * @param {Object} config Optional configuration object, with the following
+ * supported fields:
+ * - pixelsPerFrame {number} Number of pixels along the width dimension of
+ * the canvas for each frame of spectrogram.
+ * - maxPixelWidth {number} Maximum width in pixels.
+ * - markKeyFrame {bool} Whether to mark the index of the frame
+ * with the maximum intensity or a predetermined key frame.
+ * - keyFrameIndex {index?} Predetermined key frame index.
+ *
+ * <= fftSize.
+ */
+export async function plotSpectrogram(
+ canvas, frequencyData, fftSize, fftDisplaySize, config) {
+ if (fftDisplaySize == null) {
+ fftDisplaySize = fftSize;
+ }
+ if (config == null) {
+ config = {};
+ }
+
+ // Get the maximum and minimum.
+ let min = Infinity;
+ let max = -Infinity;
+ for (let i = 0; i < frequencyData.length; ++i) {
+ const x = frequencyData[i];
+ if (x !== -Infinity) {
+ if (x < min) {
+ min = x;
+ }
+ if (x > max) {
+ max = x;
+ }
+ }
+ }
+ if (min >= max) {
+ return;
+ }
+
+ const context = canvas.getContext('2d');
+ context.clearRect(0, 0, canvas.width, canvas.height);
+
+ const numFrames = frequencyData.length / fftSize;
+ if (config.pixelsPerFrame != null) {
+ let realWidth = Math.round(config.pixelsPerFrame * numFrames);
+ if (config.maxPixelWidth != null && realWidth > config.maxPixelWidth) {
+ realWidth = config.maxPixelWidth;
+ }
+ canvas.width = realWidth;
+ }
+
+ const pixelWidth = canvas.width / numFrames;
+ const pixelHeight = canvas.height / fftDisplaySize;
+ for (let i = 0; i < numFrames; ++i) {
+ const x = pixelWidth * i;
+ const spectrum = frequencyData.subarray(i * fftSize, (i + 1) * fftSize);
+ if (spectrum[0] === -Infinity) {
+ break;
+ }
+ for (let j = 0; j < fftDisplaySize; ++j) {
+ const y = canvas.height - (j + 1) * pixelHeight;
+
+ let colorValue = (spectrum[j] - min) / (max - min);
+ colorValue = Math.pow(colorValue, 3);
+ colorValue = Math.round(255 * colorValue);
+ const fillStyle =
+ `rgb(${colorValue},${255 - colorValue},${255 - colorValue})`;
+ context.fillStyle = fillStyle;
+ context.fillRect(x, y, pixelWidth, pixelHeight);
+ }
+ }
+
+ if (config.markKeyFrame) {
+ const keyFrameIndex = config.keyFrameIndex == null ?
+ await SpeechCommands
+ .getMaxIntensityFrameIndex(
+ {data: frequencyData, frameSize: fftSize})
+ .data() :
+ config.keyFrameIndex;
+ // Draw lines to mark the maximum-intensity frame.
+ context.strokeStyle = 'black';
+ context.beginPath();
+ context.moveTo(pixelWidth * keyFrameIndex, 0);
+ context.lineTo(pixelWidth * keyFrameIndex, canvas.height * 0.1);
+ context.stroke();
+ context.beginPath();
+ context.moveTo(pixelWidth * keyFrameIndex, canvas.height * 0.9);
+ context.lineTo(pixelWidth * keyFrameIndex, canvas.height);
+ context.stroke();
+ }
+}
+
+/**
+ * Plot top-K predictions from a speech command recognizer.
+ *
+ * @param {HTMLCanvasElement} canvas The canvas to render the predictions in.
+ * @param {string[]} candidateWords Candidate word array.
+ * @param {Float32Array | number[]} probabilities Probability scores from the
+ * speech command recognizer. Must be of the same length as `candidateWords`.
+ * @param {number} timeToLiveMillis Optional time to live for the active label
+ * highlighting. If not provided, will the highlighting will live
+ * indefinitely till the next highlighting.
+ * @param {number} topK Top _ scores to render.
+ */
+export function plotPredictions(
+ canvas, candidateWords, probabilities, topK, timeToLiveMillis) {
+ if (topK != null) {
+ let wordsAndProbs = [];
+ for (let i = 0; i < candidateWords.length; ++i) {
+ wordsAndProbs.push([candidateWords[i], probabilities[i]]);
+ }
+ wordsAndProbs.sort((a, b) => (b[1] - a[1]));
+ wordsAndProbs = wordsAndProbs.slice(0, topK);
+ candidateWords = wordsAndProbs.map(item => item[0]);
+ probabilities = wordsAndProbs.map(item => item[1]);
+
+ // Highlight the top word.
+ const topWord = wordsAndProbs[0][0];
+ console.log(
+ `"${topWord}" (p=${wordsAndProbs[0][1].toFixed(6)}) @ ` +
+ new Date().toTimeString());
+ for (const word in candidateWordSpans) {
+ if (word === topWord) {
+ candidateWordSpans[word].classList.add('candidate-word-active');
+ if (timeToLiveMillis != null) {
+ setTimeout(() => {
+ if (candidateWordSpans[word]) {
+ candidateWordSpans[word].classList.remove(
+ 'candidate-word-active');
+ }
+ }, timeToLiveMillis);
+ }
+ } else {
+ candidateWordSpans[word].classList.remove('candidate-word-active');
+ }
+ }
+ }
+}
diff --git a/音频分类/speech-commands/demo/yarn.lock b/音频分类/speech-commands/demo/yarn.lock
new file mode 100644
index 0000000..49688fd
--- /dev/null
+++ b/音频分类/speech-commands/demo/yarn.lock
@@ -0,0 +1,6437 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658"
+ integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==
+ dependencies:
+ "@babel/highlight" "^7.12.13"
+
+"@babel/compat-data@^7.13.0", "@babel/compat-data@^7.13.12", "@babel/compat-data@^7.13.8":
+ version "7.13.12"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.12.tgz#a8a5ccac19c200f9dd49624cac6e19d7be1236a1"
+ integrity sha512-3eJJ841uKxeV8dcN/2yGEUy+RfgQspPEgQat85umsE1rotuquQ2AbIub4S6j7c50a2d+4myc+zSlnXeIHrOnhQ==
+
+"@babel/core@^7.0.0-0", "@babel/core@^7.4.4":
+ version "7.13.13"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.13.13.tgz#bc44c4a2be2288ec4ddf56b66fc718019c76ac29"
+ integrity sha512-1xEs9jZAyKIouOoCmpsgk/I26PoKyvzQ2ixdRpRzfbcp1fL+ozw7TUgdDgwonbTovqRaTfRh50IXuw4QrWO0GA==
+ dependencies:
+ "@babel/code-frame" "^7.12.13"
+ "@babel/generator" "^7.13.9"
+ "@babel/helper-compilation-targets" "^7.13.13"
+ "@babel/helper-module-transforms" "^7.13.12"
+ "@babel/helpers" "^7.13.10"
+ "@babel/parser" "^7.13.13"
+ "@babel/template" "^7.12.13"
+ "@babel/traverse" "^7.13.13"
+ "@babel/types" "^7.13.13"
+ convert-source-map "^1.7.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.2"
+ json5 "^2.1.2"
+ lodash "^4.17.19"
+ semver "^6.3.0"
+ source-map "^0.5.0"
+
+"@babel/generator@^7.13.9", "@babel/generator@^7.4.4":
+ version "7.13.9"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.13.9.tgz#3a7aa96f9efb8e2be42d38d80e2ceb4c64d8de39"
+ integrity sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==
+ dependencies:
+ "@babel/types" "^7.13.0"
+ jsesc "^2.5.1"
+ source-map "^0.5.0"
+
+"@babel/helper-annotate-as-pure@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab"
+ integrity sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==
+ dependencies:
+ "@babel/types" "^7.12.13"
+
+"@babel/helper-builder-binary-assignment-operator-visitor@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz#6bc20361c88b0a74d05137a65cac8d3cbf6f61fc"
+ integrity sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==
+ dependencies:
+ "@babel/helper-explode-assignable-expression" "^7.12.13"
+ "@babel/types" "^7.12.13"
+
+"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.13.10", "@babel/helper-compilation-targets@^7.13.13", "@babel/helper-compilation-targets@^7.13.8":
+ version "7.13.13"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.13.tgz#2b2972a0926474853f41e4adbc69338f520600e5"
+ integrity sha512-q1kcdHNZehBwD9jYPh3WyXcsFERi39X4I59I3NadciWtNDyZ6x+GboOxncFK0kXlKIv6BJm5acncehXWUjWQMQ==
+ dependencies:
+ "@babel/compat-data" "^7.13.12"
+ "@babel/helper-validator-option" "^7.12.17"
+ browserslist "^4.14.5"
+ semver "^6.3.0"
+
+"@babel/helper-create-class-features-plugin@^7.13.0":
+ version "7.13.11"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz#30d30a005bca2c953f5653fc25091a492177f4f6"
+ integrity sha512-ays0I7XYq9xbjCSvT+EvysLgfc3tOkwCULHjrnscGT3A9qD4sk3wXnJ3of0MAWsWGjdinFvajHU2smYuqXKMrw==
+ dependencies:
+ "@babel/helper-function-name" "^7.12.13"
+ "@babel/helper-member-expression-to-functions" "^7.13.0"
+ "@babel/helper-optimise-call-expression" "^7.12.13"
+ "@babel/helper-replace-supers" "^7.13.0"
+ "@babel/helper-split-export-declaration" "^7.12.13"
+
+"@babel/helper-create-regexp-features-plugin@^7.12.13":
+ version "7.12.17"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz#a2ac87e9e319269ac655b8d4415e94d38d663cb7"
+ integrity sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.12.13"
+ regexpu-core "^4.7.1"
+
+"@babel/helper-define-polyfill-provider@^0.1.5":
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz#3c2f91b7971b9fc11fe779c945c014065dea340e"
+ integrity sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==
+ dependencies:
+ "@babel/helper-compilation-targets" "^7.13.0"
+ "@babel/helper-module-imports" "^7.12.13"
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/traverse" "^7.13.0"
+ debug "^4.1.1"
+ lodash.debounce "^4.0.8"
+ resolve "^1.14.2"
+ semver "^6.1.2"
+
+"@babel/helper-explode-assignable-expression@^7.12.13":
+ version "7.13.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz#17b5c59ff473d9f956f40ef570cf3a76ca12657f"
+ integrity sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==
+ dependencies:
+ "@babel/types" "^7.13.0"
+
+"@babel/helper-function-name@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz#93ad656db3c3c2232559fd7b2c3dbdcbe0eb377a"
+ integrity sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==
+ dependencies:
+ "@babel/helper-get-function-arity" "^7.12.13"
+ "@babel/template" "^7.12.13"
+ "@babel/types" "^7.12.13"
+
+"@babel/helper-get-function-arity@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583"
+ integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==
+ dependencies:
+ "@babel/types" "^7.12.13"
+
+"@babel/helper-hoist-variables@^7.13.0":
+ version "7.13.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz#5d5882e855b5c5eda91e0cadc26c6e7a2c8593d8"
+ integrity sha512-0kBzvXiIKfsCA0y6cFEIJf4OdzfpRuNk4+YTeHZpGGc666SATFKTz6sRncwFnQk7/ugJ4dSrCj6iJuvW4Qwr2g==
+ dependencies:
+ "@babel/traverse" "^7.13.0"
+ "@babel/types" "^7.13.0"
+
+"@babel/helper-member-expression-to-functions@^7.13.0", "@babel/helper-member-expression-to-functions@^7.13.12":
+ version "7.13.12"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz#dfe368f26d426a07299d8d6513821768216e6d72"
+ integrity sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==
+ dependencies:
+ "@babel/types" "^7.13.12"
+
+"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.13.12":
+ version "7.13.12"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz#c6a369a6f3621cb25da014078684da9196b61977"
+ integrity sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==
+ dependencies:
+ "@babel/types" "^7.13.12"
+
+"@babel/helper-module-transforms@^7.13.0", "@babel/helper-module-transforms@^7.13.12":
+ version "7.13.12"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.13.12.tgz#600e58350490828d82282631a1422268e982ba96"
+ integrity sha512-7zVQqMO3V+K4JOOj40kxiCrMf6xlQAkewBB0eu2b03OO/Q21ZutOzjpfD79A5gtE/2OWi1nv625MrDlGlkbknQ==
+ dependencies:
+ "@babel/helper-module-imports" "^7.13.12"
+ "@babel/helper-replace-supers" "^7.13.12"
+ "@babel/helper-simple-access" "^7.13.12"
+ "@babel/helper-split-export-declaration" "^7.12.13"
+ "@babel/helper-validator-identifier" "^7.12.11"
+ "@babel/template" "^7.12.13"
+ "@babel/traverse" "^7.13.0"
+ "@babel/types" "^7.13.12"
+
+"@babel/helper-optimise-call-expression@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea"
+ integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==
+ dependencies:
+ "@babel/types" "^7.12.13"
+
+"@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.13.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
+ version "7.13.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af"
+ integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==
+
+"@babel/helper-remap-async-to-generator@^7.13.0":
+ version "7.13.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz#376a760d9f7b4b2077a9dd05aa9c3927cadb2209"
+ integrity sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.12.13"
+ "@babel/helper-wrap-function" "^7.13.0"
+ "@babel/types" "^7.13.0"
+
+"@babel/helper-replace-supers@^7.12.13", "@babel/helper-replace-supers@^7.13.0", "@babel/helper-replace-supers@^7.13.12":
+ version "7.13.12"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz#6442f4c1ad912502481a564a7386de0c77ff3804"
+ integrity sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==
+ dependencies:
+ "@babel/helper-member-expression-to-functions" "^7.13.12"
+ "@babel/helper-optimise-call-expression" "^7.12.13"
+ "@babel/traverse" "^7.13.0"
+ "@babel/types" "^7.13.12"
+
+"@babel/helper-simple-access@^7.12.13", "@babel/helper-simple-access@^7.13.12":
+ version "7.13.12"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz#dd6c538afb61819d205a012c31792a39c7a5eaf6"
+ integrity sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==
+ dependencies:
+ "@babel/types" "^7.13.12"
+
+"@babel/helper-skip-transparent-expression-wrappers@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf"
+ integrity sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==
+ dependencies:
+ "@babel/types" "^7.12.1"
+
+"@babel/helper-split-export-declaration@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05"
+ integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==
+ dependencies:
+ "@babel/types" "^7.12.13"
+
+"@babel/helper-validator-identifier@^7.12.11":
+ version "7.12.11"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed"
+ integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==
+
+"@babel/helper-validator-option@^7.12.17":
+ version "7.12.17"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831"
+ integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==
+
+"@babel/helper-wrap-function@^7.13.0":
+ version "7.13.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz#bdb5c66fda8526ec235ab894ad53a1235c79fcc4"
+ integrity sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==
+ dependencies:
+ "@babel/helper-function-name" "^7.12.13"
+ "@babel/template" "^7.12.13"
+ "@babel/traverse" "^7.13.0"
+ "@babel/types" "^7.13.0"
+
+"@babel/helpers@^7.13.10":
+ version "7.13.10"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.13.10.tgz#fd8e2ba7488533cdeac45cc158e9ebca5e3c7df8"
+ integrity sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==
+ dependencies:
+ "@babel/template" "^7.12.13"
+ "@babel/traverse" "^7.13.0"
+ "@babel/types" "^7.13.0"
+
+"@babel/highlight@^7.12.13":
+ version "7.13.10"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.13.10.tgz#a8b2a66148f5b27d666b15d81774347a731d52d1"
+ integrity sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.12.11"
+ chalk "^2.0.0"
+ js-tokens "^4.0.0"
+
+"@babel/parser@^7.12.13", "@babel/parser@^7.13.13", "@babel/parser@^7.4.4":
+ version "7.13.13"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.13.tgz#42f03862f4aed50461e543270916b47dd501f0df"
+ integrity sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==
+
+"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.13.12":
+ version "7.13.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz#a3484d84d0b549f3fc916b99ee4783f26fabad2a"
+ integrity sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1"
+ "@babel/plugin-proposal-optional-chaining" "^7.13.12"
+
+"@babel/plugin-proposal-async-generator-functions@^7.13.8":
+ version "7.13.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.8.tgz#87aacb574b3bc4b5603f6fe41458d72a5a2ec4b1"
+ integrity sha512-rPBnhj+WgoSmgq+4gQUtXx/vOcU+UYtjy1AA/aeD61Hwj410fwYyqfUcRP3lR8ucgliVJL/G7sXcNUecC75IXA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/helper-remap-async-to-generator" "^7.13.0"
+ "@babel/plugin-syntax-async-generators" "^7.8.4"
+
+"@babel/plugin-proposal-class-properties@^7.13.0":
+ version "7.13.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz#146376000b94efd001e57a40a88a525afaab9f37"
+ integrity sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.13.0"
+ "@babel/helper-plugin-utils" "^7.13.0"
+
+"@babel/plugin-proposal-dynamic-import@^7.13.8":
+ version "7.13.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz#876a1f6966e1dec332e8c9451afda3bebcdf2e1d"
+ integrity sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/plugin-syntax-dynamic-import" "^7.8.3"
+
+"@babel/plugin-proposal-export-namespace-from@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz#393be47a4acd03fa2af6e3cde9b06e33de1b446d"
+ integrity sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+ "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
+
+"@babel/plugin-proposal-json-strings@^7.13.8":
+ version "7.13.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz#bf1fb362547075afda3634ed31571c5901afef7b"
+ integrity sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/plugin-syntax-json-strings" "^7.8.3"
+
+"@babel/plugin-proposal-logical-assignment-operators@^7.13.8":
+ version "7.13.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz#93fa78d63857c40ce3c8c3315220fd00bfbb4e1a"
+ integrity sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+
+"@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8":
+ version "7.13.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz#3730a31dafd3c10d8ccd10648ed80a2ac5472ef3"
+ integrity sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+
+"@babel/plugin-proposal-numeric-separator@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz#bd9da3188e787b5120b4f9d465a8261ce67ed1db"
+ integrity sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+ "@babel/plugin-syntax-numeric-separator" "^7.10.4"
+
+"@babel/plugin-proposal-object-rest-spread@^7.13.8":
+ version "7.13.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz#5d210a4d727d6ce3b18f9de82cc99a3964eed60a"
+ integrity sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==
+ dependencies:
+ "@babel/compat-data" "^7.13.8"
+ "@babel/helper-compilation-targets" "^7.13.8"
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+ "@babel/plugin-transform-parameters" "^7.13.0"
+
+"@babel/plugin-proposal-optional-catch-binding@^7.13.8":
+ version "7.13.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz#3ad6bd5901506ea996fc31bdcf3ccfa2bed71107"
+ integrity sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+
+"@babel/plugin-proposal-optional-chaining@^7.13.12":
+ version "7.13.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz#ba9feb601d422e0adea6760c2bd6bbb7bfec4866"
+ integrity sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1"
+ "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+
+"@babel/plugin-proposal-private-methods@^7.13.0":
+ version "7.13.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz#04bd4c6d40f6e6bbfa2f57e2d8094bad900ef787"
+ integrity sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.13.0"
+ "@babel/helper-plugin-utils" "^7.13.0"
+
+"@babel/plugin-proposal-unicode-property-regex@^7.12.13", "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz#bebde51339be829c17aaaaced18641deb62b39ba"
+ integrity sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.12.13"
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@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-class-properties@^7.12.13":
+ 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-dynamic-import@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3"
+ integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-export-namespace-from@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a"
+ integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.3"
+
+"@babel/plugin-syntax-flow@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.13.tgz#5df9962503c0a9c918381c929d51d4d6949e7e86"
+ integrity sha512-J/RYxnlSLXZLVR7wTRsozxKT8qbsx1mNKJzXEEjQ0Kjx1ZACcyHgbanNWNCFtc36IzuWhYWPpvJFFoexoOWFmA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@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.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz#044fb81ebad6698fe62c478875575bcbb9b70f15"
+ integrity sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-syntax-logical-assignment-operators@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699"
+ integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9"
+ integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-numeric-separator@^7.10.4":
+ 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.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz#c5f0fa6e249f5b739727f923540cf7a806130178"
+ integrity sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-transform-arrow-functions@^7.13.0":
+ version "7.13.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz#10a59bebad52d637a027afa692e8d5ceff5e3dae"
+ integrity sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+
+"@babel/plugin-transform-async-to-generator@^7.13.0":
+ version "7.13.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz#8e112bf6771b82bf1e974e5e26806c5c99aa516f"
+ integrity sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==
+ dependencies:
+ "@babel/helper-module-imports" "^7.12.13"
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/helper-remap-async-to-generator" "^7.13.0"
+
+"@babel/plugin-transform-block-scoped-functions@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz#a9bf1836f2a39b4eb6cf09967739de29ea4bf4c4"
+ integrity sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-transform-block-scoping@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz#f36e55076d06f41dfd78557ea039c1b581642e61"
+ integrity sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-transform-classes@^7.13.0":
+ version "7.13.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz#0265155075c42918bf4d3a4053134176ad9b533b"
+ integrity sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.12.13"
+ "@babel/helper-function-name" "^7.12.13"
+ "@babel/helper-optimise-call-expression" "^7.12.13"
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/helper-replace-supers" "^7.13.0"
+ "@babel/helper-split-export-declaration" "^7.12.13"
+ globals "^11.1.0"
+
+"@babel/plugin-transform-computed-properties@^7.13.0":
+ version "7.13.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz#845c6e8b9bb55376b1fa0b92ef0bdc8ea06644ed"
+ integrity sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+
+"@babel/plugin-transform-destructuring@^7.13.0":
+ version "7.13.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz#c5dce270014d4e1ebb1d806116694c12b7028963"
+ integrity sha512-zym5em7tePoNT9s964c0/KU3JPPnuq7VhIxPRefJ4/s82cD+q1mgKfuGRDMCPL0HTyKz4dISuQlCusfgCJ86HA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+
+"@babel/plugin-transform-dotall-regex@^7.12.13", "@babel/plugin-transform-dotall-regex@^7.4.4":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz#3f1601cc29905bfcb67f53910f197aeafebb25ad"
+ integrity sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.12.13"
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-transform-duplicate-keys@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz#6f06b87a8b803fd928e54b81c258f0a0033904de"
+ integrity sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-transform-exponentiation-operator@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz#4d52390b9a273e651e4aba6aee49ef40e80cd0a1"
+ integrity sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==
+ dependencies:
+ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.12.13"
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-transform-flow-strip-types@^7.4.4":
+ version "7.13.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.13.0.tgz#58177a48c209971e8234e99906cb6bd1122addd3"
+ integrity sha512-EXAGFMJgSX8gxWD7PZtW/P6M+z74jpx3wm/+9pn+c2dOawPpBkUX7BrfyPvo6ZpXbgRIEuwgwDb/MGlKvu2pOg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/plugin-syntax-flow" "^7.12.13"
+
+"@babel/plugin-transform-for-of@^7.13.0":
+ version "7.13.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz#c799f881a8091ac26b54867a845c3e97d2696062"
+ integrity sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+
+"@babel/plugin-transform-function-name@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz#bb024452f9aaed861d374c8e7a24252ce3a50051"
+ integrity sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==
+ dependencies:
+ "@babel/helper-function-name" "^7.12.13"
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-transform-literals@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz#2ca45bafe4a820197cf315794a4d26560fe4bdb9"
+ integrity sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-transform-member-expression-literals@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz#5ffa66cd59b9e191314c9f1f803b938e8c081e40"
+ integrity sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-transform-modules-amd@^7.13.0":
+ version "7.13.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz#19f511d60e3d8753cc5a6d4e775d3a5184866cc3"
+ integrity sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.13.0"
+ "@babel/helper-plugin-utils" "^7.13.0"
+ babel-plugin-dynamic-import-node "^2.3.3"
+
+"@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.4.4":
+ version "7.13.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz#7b01ad7c2dcf2275b06fa1781e00d13d420b3e1b"
+ integrity sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.13.0"
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/helper-simple-access" "^7.12.13"
+ babel-plugin-dynamic-import-node "^2.3.3"
+
+"@babel/plugin-transform-modules-systemjs@^7.13.8":
+ version "7.13.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz#6d066ee2bff3c7b3d60bf28dec169ad993831ae3"
+ integrity sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==
+ dependencies:
+ "@babel/helper-hoist-variables" "^7.13.0"
+ "@babel/helper-module-transforms" "^7.13.0"
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/helper-validator-identifier" "^7.12.11"
+ babel-plugin-dynamic-import-node "^2.3.3"
+
+"@babel/plugin-transform-modules-umd@^7.13.0":
+ version "7.13.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz#8a3d96a97d199705b9fd021580082af81c06e70b"
+ integrity sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.13.0"
+ "@babel/helper-plugin-utils" "^7.13.0"
+
+"@babel/plugin-transform-named-capturing-groups-regex@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz#2213725a5f5bbbe364b50c3ba5998c9599c5c9d9"
+ integrity sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.12.13"
+
+"@babel/plugin-transform-new-target@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz#e22d8c3af24b150dd528cbd6e685e799bf1c351c"
+ integrity sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-transform-object-super@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz#b4416a2d63b8f7be314f3d349bd55a9c1b5171f7"
+ integrity sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+ "@babel/helper-replace-supers" "^7.12.13"
+
+"@babel/plugin-transform-parameters@^7.13.0":
+ version "7.13.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz#8fa7603e3097f9c0b7ca1a4821bc2fb52e9e5007"
+ integrity sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+
+"@babel/plugin-transform-property-literals@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz#4e6a9e37864d8f1b3bc0e2dce7bf8857db8b1a81"
+ integrity sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-transform-react-jsx@^7.0.0":
+ version "7.13.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.13.12.tgz#1df5dfaf0f4b784b43e96da6f28d630e775f68b3"
+ integrity sha512-jcEI2UqIcpCqB5U5DRxIl0tQEProI2gcu+g8VTIqxLO5Iidojb4d77q+fwGseCvd8af/lJ9masp4QWzBXFE2xA==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.12.13"
+ "@babel/helper-module-imports" "^7.13.12"
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/plugin-syntax-jsx" "^7.12.13"
+ "@babel/types" "^7.13.12"
+
+"@babel/plugin-transform-regenerator@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.13.tgz#b628bcc9c85260ac1aeb05b45bde25210194a2f5"
+ integrity sha512-lxb2ZAvSLyJ2PEe47hoGWPmW22v7CtSl9jW8mingV4H2sEX/JOcrAj2nPuGWi56ERUm2bUpjKzONAuT6HCn2EA==
+ dependencies:
+ regenerator-transform "^0.14.2"
+
+"@babel/plugin-transform-reserved-words@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz#7d9988d4f06e0fe697ea1d9803188aa18b472695"
+ integrity sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-transform-runtime@^7.1.0":
+ version "7.13.10"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.13.10.tgz#a1e40d22e2bf570c591c9c7e5ab42d6bf1e419e1"
+ integrity sha512-Y5k8ipgfvz5d/76tx7JYbKQTcgFSU6VgJ3kKQv4zGTKr+a9T/KBvfRvGtSFgKDQGt/DBykQixV0vNWKIdzWErA==
+ dependencies:
+ "@babel/helper-module-imports" "^7.12.13"
+ "@babel/helper-plugin-utils" "^7.13.0"
+ babel-plugin-polyfill-corejs2 "^0.1.4"
+ babel-plugin-polyfill-corejs3 "^0.1.3"
+ babel-plugin-polyfill-regenerator "^0.1.2"
+ semver "^6.3.0"
+
+"@babel/plugin-transform-shorthand-properties@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz#db755732b70c539d504c6390d9ce90fe64aff7ad"
+ integrity sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-transform-spread@^7.13.0":
+ version "7.13.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz#84887710e273c1815ace7ae459f6f42a5d31d5fd"
+ integrity sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1"
+
+"@babel/plugin-transform-sticky-regex@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz#760ffd936face73f860ae646fb86ee82f3d06d1f"
+ integrity sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-transform-template-literals@^7.13.0":
+ version "7.13.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz#a36049127977ad94438dee7443598d1cefdf409d"
+ integrity sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+
+"@babel/plugin-transform-typeof-symbol@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz#785dd67a1f2ea579d9c2be722de8c84cb85f5a7f"
+ integrity sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-transform-unicode-escapes@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz#840ced3b816d3b5127dd1d12dcedc5dead1a5e74"
+ integrity sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-transform-unicode-regex@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz#b52521685804e155b1202e83fc188d34bb70f5ac"
+ integrity sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.12.13"
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/preset-env@^7.4.4":
+ version "7.13.12"
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.13.12.tgz#6dff470478290582ac282fb77780eadf32480237"
+ integrity sha512-JzElc6jk3Ko6zuZgBtjOd01pf9yYDEIH8BcqVuYIuOkzOwDesoa/Nz4gIo4lBG6K861KTV9TvIgmFuT6ytOaAA==
+ dependencies:
+ "@babel/compat-data" "^7.13.12"
+ "@babel/helper-compilation-targets" "^7.13.10"
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/helper-validator-option" "^7.12.17"
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.13.12"
+ "@babel/plugin-proposal-async-generator-functions" "^7.13.8"
+ "@babel/plugin-proposal-class-properties" "^7.13.0"
+ "@babel/plugin-proposal-dynamic-import" "^7.13.8"
+ "@babel/plugin-proposal-export-namespace-from" "^7.12.13"
+ "@babel/plugin-proposal-json-strings" "^7.13.8"
+ "@babel/plugin-proposal-logical-assignment-operators" "^7.13.8"
+ "@babel/plugin-proposal-nullish-coalescing-operator" "^7.13.8"
+ "@babel/plugin-proposal-numeric-separator" "^7.12.13"
+ "@babel/plugin-proposal-object-rest-spread" "^7.13.8"
+ "@babel/plugin-proposal-optional-catch-binding" "^7.13.8"
+ "@babel/plugin-proposal-optional-chaining" "^7.13.12"
+ "@babel/plugin-proposal-private-methods" "^7.13.0"
+ "@babel/plugin-proposal-unicode-property-regex" "^7.12.13"
+ "@babel/plugin-syntax-async-generators" "^7.8.4"
+ "@babel/plugin-syntax-class-properties" "^7.12.13"
+ "@babel/plugin-syntax-dynamic-import" "^7.8.3"
+ "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
+ "@babel/plugin-syntax-json-strings" "^7.8.3"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+ "@babel/plugin-syntax-numeric-separator" "^7.10.4"
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+ "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+ "@babel/plugin-syntax-top-level-await" "^7.12.13"
+ "@babel/plugin-transform-arrow-functions" "^7.13.0"
+ "@babel/plugin-transform-async-to-generator" "^7.13.0"
+ "@babel/plugin-transform-block-scoped-functions" "^7.12.13"
+ "@babel/plugin-transform-block-scoping" "^7.12.13"
+ "@babel/plugin-transform-classes" "^7.13.0"
+ "@babel/plugin-transform-computed-properties" "^7.13.0"
+ "@babel/plugin-transform-destructuring" "^7.13.0"
+ "@babel/plugin-transform-dotall-regex" "^7.12.13"
+ "@babel/plugin-transform-duplicate-keys" "^7.12.13"
+ "@babel/plugin-transform-exponentiation-operator" "^7.12.13"
+ "@babel/plugin-transform-for-of" "^7.13.0"
+ "@babel/plugin-transform-function-name" "^7.12.13"
+ "@babel/plugin-transform-literals" "^7.12.13"
+ "@babel/plugin-transform-member-expression-literals" "^7.12.13"
+ "@babel/plugin-transform-modules-amd" "^7.13.0"
+ "@babel/plugin-transform-modules-commonjs" "^7.13.8"
+ "@babel/plugin-transform-modules-systemjs" "^7.13.8"
+ "@babel/plugin-transform-modules-umd" "^7.13.0"
+ "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.13"
+ "@babel/plugin-transform-new-target" "^7.12.13"
+ "@babel/plugin-transform-object-super" "^7.12.13"
+ "@babel/plugin-transform-parameters" "^7.13.0"
+ "@babel/plugin-transform-property-literals" "^7.12.13"
+ "@babel/plugin-transform-regenerator" "^7.12.13"
+ "@babel/plugin-transform-reserved-words" "^7.12.13"
+ "@babel/plugin-transform-shorthand-properties" "^7.12.13"
+ "@babel/plugin-transform-spread" "^7.13.0"
+ "@babel/plugin-transform-sticky-regex" "^7.12.13"
+ "@babel/plugin-transform-template-literals" "^7.13.0"
+ "@babel/plugin-transform-typeof-symbol" "^7.12.13"
+ "@babel/plugin-transform-unicode-escapes" "^7.12.13"
+ "@babel/plugin-transform-unicode-regex" "^7.12.13"
+ "@babel/preset-modules" "^0.1.4"
+ "@babel/types" "^7.13.12"
+ babel-plugin-polyfill-corejs2 "^0.1.4"
+ babel-plugin-polyfill-corejs3 "^0.1.3"
+ babel-plugin-polyfill-regenerator "^0.1.2"
+ core-js-compat "^3.9.0"
+ semver "^6.3.0"
+
+"@babel/preset-modules@^0.1.4":
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e"
+ integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/plugin-proposal-unicode-property-regex" "^7.4.4"
+ "@babel/plugin-transform-dotall-regex" "^7.4.4"
+ "@babel/types" "^7.4.4"
+ esutils "^2.0.2"
+
+"@babel/runtime@^7.4.4", "@babel/runtime@^7.8.4":
+ version "7.13.10"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.10.tgz#47d42a57b6095f4468da440388fdbad8bebf0d7d"
+ integrity sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==
+ dependencies:
+ regenerator-runtime "^0.13.4"
+
+"@babel/template@^7.12.13", "@babel/template@^7.4.4":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327"
+ integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==
+ dependencies:
+ "@babel/code-frame" "^7.12.13"
+ "@babel/parser" "^7.12.13"
+ "@babel/types" "^7.12.13"
+
+"@babel/traverse@^7.13.0", "@babel/traverse@^7.13.13", "@babel/traverse@^7.4.4":
+ version "7.13.13"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.13.13.tgz#39aa9c21aab69f74d948a486dd28a2dbdbf5114d"
+ integrity sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==
+ dependencies:
+ "@babel/code-frame" "^7.12.13"
+ "@babel/generator" "^7.13.9"
+ "@babel/helper-function-name" "^7.12.13"
+ "@babel/helper-split-export-declaration" "^7.12.13"
+ "@babel/parser" "^7.13.13"
+ "@babel/types" "^7.13.13"
+ debug "^4.1.0"
+ globals "^11.1.0"
+
+"@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.13.0", "@babel/types@^7.13.12", "@babel/types@^7.13.13", "@babel/types@^7.4.4":
+ version "7.13.13"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.13.tgz#dcd8b815b38f537a3697ce84c8e3cc62197df96f"
+ integrity sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.12.11"
+ lodash "^4.17.19"
+ to-fast-properties "^2.0.0"
+
+"@iarna/toml@^2.2.0":
+ version "2.2.5"
+ resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c"
+ integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==
+
+"@mrmlnc/readdir-enhanced@^2.2.1":
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde"
+ integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==
+ dependencies:
+ call-me-maybe "^1.0.1"
+ glob-to-regexp "^0.3.0"
+
+"@nodelib/fs.stat@^1.1.2":
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b"
+ integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==
+
+"@parcel/fs@^1.11.0":
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/@parcel/fs/-/fs-1.11.0.tgz#fb8a2be038c454ad46a50dc0554c1805f13535cd"
+ integrity sha512-86RyEqULbbVoeo8OLcv+LQ1Vq2PKBAvWTU9fCgALxuCTbbs5Ppcvll4Vr+Ko1AnmMzja/k++SzNAwJfeQXVlpA==
+ dependencies:
+ "@parcel/utils" "^1.11.0"
+ mkdirp "^0.5.1"
+ rimraf "^2.6.2"
+
+"@parcel/logger@^1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@parcel/logger/-/logger-1.11.1.tgz#c55b0744bcbe84ebc291155627f0ec406a23e2e6"
+ integrity sha512-9NF3M6UVeP2udOBDILuoEHd8VrF4vQqoWHEafymO1pfSoOMfxrSJZw1MfyAAIUN/IFp9qjcpDCUbDZB+ioVevA==
+ dependencies:
+ "@parcel/workers" "^1.11.0"
+ chalk "^2.1.0"
+ grapheme-breaker "^0.3.2"
+ ora "^2.1.0"
+ strip-ansi "^4.0.0"
+
+"@parcel/utils@^1.11.0":
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/@parcel/utils/-/utils-1.11.0.tgz#539e08fff8af3b26eca11302be80b522674b51ea"
+ integrity sha512-cA3p4jTlaMeOtAKR/6AadanOPvKeg8VwgnHhOyfi0yClD0TZS/hi9xu12w4EzA/8NtHu0g6o4RDfcNjqN8l1AQ==
+
+"@parcel/watcher@^1.12.1":
+ version "1.12.1"
+ resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-1.12.1.tgz#b98b3df309fcab93451b5583fc38e40826696dad"
+ integrity sha512-od+uCtCxC/KoNQAIE1vWx1YTyKYY+7CTrxBJPRh3cDWw/C0tCtlBMVlrbplscGoEpt6B27KhJDCv82PBxOERNA==
+ dependencies:
+ "@parcel/utils" "^1.11.0"
+ chokidar "^2.1.5"
+
+"@parcel/workers@^1.11.0":
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/@parcel/workers/-/workers-1.11.0.tgz#7b8dcf992806f4ad2b6cecf629839c41c2336c59"
+ integrity sha512-USSjRAAQYsZFlv43FUPdD+jEGML5/8oLF0rUzPQTtK4q9kvaXr49F5ZplyLz5lox78cLZ0TxN2bIDQ1xhOkulQ==
+ dependencies:
+ "@parcel/utils" "^1.11.0"
+ physical-cpu-count "^2.0.0"
+
+"@tensorflow-models/speech-commands@file:../dist":
+ version "0.0.0"
+
+"@types/q@^1.5.1":
+ version "1.5.4"
+ resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24"
+ integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==
+
+abab@^2.0.0:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a"
+ integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==
+
+acorn-globals@^4.3.0:
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7"
+ integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==
+ dependencies:
+ acorn "^6.0.1"
+ acorn-walk "^6.0.1"
+
+acorn-jsx@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b"
+ integrity sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=
+ dependencies:
+ acorn "^3.0.4"
+
+acorn-walk@^6.0.1:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c"
+ integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==
+
+acorn@^3.0.4:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
+ integrity sha1-ReN/s56No/JbruP/U2niu18iAXo=
+
+acorn@^5.5.0:
+ version "5.7.4"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e"
+ integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==
+
+acorn@^6.0.1, acorn@^6.0.4:
+ version "6.4.2"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6"
+ integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==
+
+acorn@^7.1.1:
+ version "7.4.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
+ integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
+
+ajv-keywords@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762"
+ integrity sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=
+
+ajv@^5.2.3, ajv@^5.3.0:
+ version "5.5.2"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965"
+ integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=
+ dependencies:
+ co "^4.6.0"
+ fast-deep-equal "^1.0.0"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.3.0"
+
+ajv@^6.12.3:
+ version "6.12.6"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
+alphanum-sort@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
+ integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=
+
+ansi-escapes@^3.0.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b"
+ integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==
+
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+ integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
+
+ansi-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
+ integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=
+
+ansi-regex@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
+ integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
+
+ansi-styles@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+ integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=
+
+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-to-html@^0.6.4:
+ version "0.6.14"
+ resolved "https://registry.yarnpkg.com/ansi-to-html/-/ansi-to-html-0.6.14.tgz#65fe6d08bba5dd9db33f44a20aec331e0010dad8"
+ integrity sha512-7ZslfB1+EnFSDO5Ju+ue5Y6It19DRnZXWv8jrGHgIlPna5Mh4jz7BV5jCbQneXNFurQcKoolaaAjHtgSBfOIuA==
+ dependencies:
+ entities "^1.1.2"
+
+anymatch@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
+ integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==
+ dependencies:
+ micromatch "^3.1.4"
+ normalize-path "^2.1.1"
+
+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"
+
+arr-diff@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+ integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=
+
+arr-flatten@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+ integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
+
+arr-union@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+ integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
+
+array-equal@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93"
+ integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=
+
+array-unique@^0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+ integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
+
+asn1.js@^5.2.0:
+ version "5.4.1"
+ resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07"
+ integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==
+ dependencies:
+ bn.js "^4.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+ safer-buffer "^2.1.0"
+
+asn1@~0.2.3:
+ version "0.2.4"
+ resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
+ integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==
+ dependencies:
+ safer-buffer "~2.1.0"
+
+assert-plus@1.0.0, assert-plus@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+ integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=
+
+assert@^1.1.1:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb"
+ integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==
+ dependencies:
+ object-assign "^4.1.1"
+ util "0.10.3"
+
+assign-symbols@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+ integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
+
+async-each@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf"
+ integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==
+
+async-limiter@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
+ integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
+
+async@^1.5.2:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
+ integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
+
+atob@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
+ integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
+
+aws-sign2@~0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
+ integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=
+
+aws4@^1.8.0:
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59"
+ integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==
+
+babel-code-frame@^6.22.0, babel-code-frame@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
+ integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=
+ dependencies:
+ chalk "^1.1.3"
+ esutils "^2.0.2"
+ js-tokens "^3.0.2"
+
+babel-helper-builder-binary-assignment-operator-visitor@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664"
+ integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=
+ dependencies:
+ babel-helper-explode-assignable-expression "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-call-delegate@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d"
+ integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=
+ dependencies:
+ babel-helper-hoist-variables "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-define-map@^6.24.1:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f"
+ integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ lodash "^4.17.4"
+
+babel-helper-explode-assignable-expression@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa"
+ integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-function-name@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9"
+ integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=
+ dependencies:
+ babel-helper-get-function-arity "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-get-function-arity@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d"
+ integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-hoist-variables@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76"
+ integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-optimise-call-expression@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257"
+ integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-regex@^6.24.1:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72"
+ integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=
+ dependencies:
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ lodash "^4.17.4"
+
+babel-helper-remap-async-to-generator@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b"
+ integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-replace-supers@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a"
+ integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo=
+ dependencies:
+ babel-helper-optimise-call-expression "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-messages@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
+ integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-check-es2015-constants@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a"
+ integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-dynamic-import-node@^2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3"
+ integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==
+ dependencies:
+ object.assign "^4.1.0"
+
+babel-plugin-polyfill-corejs2@^0.1.4:
+ version "0.1.10"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.1.10.tgz#a2c5c245f56c0cac3dbddbf0726a46b24f0f81d1"
+ integrity sha512-DO95wD4g0A8KRaHKi0D51NdGXzvpqVLnLu5BTvDlpqUEpTmeEtypgC1xqesORaWmiUOQI14UHKlzNd9iZ2G3ZA==
+ dependencies:
+ "@babel/compat-data" "^7.13.0"
+ "@babel/helper-define-polyfill-provider" "^0.1.5"
+ semver "^6.1.1"
+
+babel-plugin-polyfill-corejs3@^0.1.3:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz#80449d9d6f2274912e05d9e182b54816904befd0"
+ integrity sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==
+ dependencies:
+ "@babel/helper-define-polyfill-provider" "^0.1.5"
+ core-js-compat "^3.8.1"
+
+babel-plugin-polyfill-regenerator@^0.1.2:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.1.6.tgz#0fe06a026fe0faa628ccc8ba3302da0a6ce02f3f"
+ integrity sha512-OUrYG9iKPKz8NxswXbRAdSwF0GhRdIEMTloQATJi4bDuFqrXaXcCUT/VGNrr8pBcjMh1RxZ7Xt9cytVJTJfvMg==
+ dependencies:
+ "@babel/helper-define-polyfill-provider" "^0.1.5"
+
+babel-plugin-syntax-async-functions@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
+ integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=
+
+babel-plugin-syntax-exponentiation-operator@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de"
+ integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=
+
+babel-plugin-syntax-trailing-function-commas@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3"
+ integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=
+
+babel-plugin-transform-async-to-generator@^6.22.0, babel-plugin-transform-async-to-generator@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761"
+ integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=
+ dependencies:
+ babel-helper-remap-async-to-generator "^6.24.1"
+ babel-plugin-syntax-async-functions "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-arrow-functions@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"
+ integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoped-functions@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141"
+ integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoping@^6.23.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f"
+ integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=
+ dependencies:
+ babel-runtime "^6.26.0"
+ babel-template "^6.26.0"
+ babel-traverse "^6.26.0"
+ babel-types "^6.26.0"
+ lodash "^4.17.4"
+
+babel-plugin-transform-es2015-classes@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db"
+ integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=
+ dependencies:
+ babel-helper-define-map "^6.24.1"
+ babel-helper-function-name "^6.24.1"
+ babel-helper-optimise-call-expression "^6.24.1"
+ babel-helper-replace-supers "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-computed-properties@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3"
+ integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-destructuring@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d"
+ integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-duplicate-keys@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e"
+ integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-for-of@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691"
+ integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-function-name@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b"
+ integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-literals@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e"
+ integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154"
+ integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=
+ dependencies:
+ babel-plugin-transform-es2015-modules-commonjs "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1:
+ version "6.26.2"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3"
+ integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==
+ dependencies:
+ babel-plugin-transform-strict-mode "^6.24.1"
+ babel-runtime "^6.26.0"
+ babel-template "^6.26.0"
+ babel-types "^6.26.0"
+
+babel-plugin-transform-es2015-modules-systemjs@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23"
+ integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=
+ dependencies:
+ babel-helper-hoist-variables "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-umd@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468"
+ integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg=
+ dependencies:
+ babel-plugin-transform-es2015-modules-amd "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-object-super@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d"
+ integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40=
+ dependencies:
+ babel-helper-replace-supers "^6.24.1"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-parameters@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b"
+ integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=
+ dependencies:
+ babel-helper-call-delegate "^6.24.1"
+ babel-helper-get-function-arity "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-shorthand-properties@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0"
+ integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-spread@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1"
+ integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-sticky-regex@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc"
+ integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw=
+ dependencies:
+ babel-helper-regex "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-template-literals@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d"
+ integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-typeof-symbol@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372"
+ integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-unicode-regex@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9"
+ integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek=
+ dependencies:
+ babel-helper-regex "^6.24.1"
+ babel-runtime "^6.22.0"
+ regexpu-core "^2.0.0"
+
+babel-plugin-transform-exponentiation-operator@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e"
+ integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=
+ dependencies:
+ babel-helper-builder-binary-assignment-operator-visitor "^6.24.1"
+ babel-plugin-syntax-exponentiation-operator "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-regenerator@^6.22.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f"
+ integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=
+ dependencies:
+ regenerator-transform "^0.10.0"
+
+babel-plugin-transform-strict-mode@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758"
+ integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-polyfill@~6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153"
+ integrity sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=
+ dependencies:
+ babel-runtime "^6.26.0"
+ core-js "^2.5.0"
+ regenerator-runtime "^0.10.5"
+
+babel-preset-env@~1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.1.tgz#a18b564cc9b9afdf4aae57ae3c1b0d99188e6f48"
+ integrity sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA==
+ dependencies:
+ babel-plugin-check-es2015-constants "^6.22.0"
+ babel-plugin-syntax-trailing-function-commas "^6.22.0"
+ babel-plugin-transform-async-to-generator "^6.22.0"
+ babel-plugin-transform-es2015-arrow-functions "^6.22.0"
+ babel-plugin-transform-es2015-block-scoped-functions "^6.22.0"
+ babel-plugin-transform-es2015-block-scoping "^6.23.0"
+ babel-plugin-transform-es2015-classes "^6.23.0"
+ babel-plugin-transform-es2015-computed-properties "^6.22.0"
+ babel-plugin-transform-es2015-destructuring "^6.23.0"
+ babel-plugin-transform-es2015-duplicate-keys "^6.22.0"
+ babel-plugin-transform-es2015-for-of "^6.23.0"
+ babel-plugin-transform-es2015-function-name "^6.22.0"
+ babel-plugin-transform-es2015-literals "^6.22.0"
+ babel-plugin-transform-es2015-modules-amd "^6.22.0"
+ babel-plugin-transform-es2015-modules-commonjs "^6.23.0"
+ babel-plugin-transform-es2015-modules-systemjs "^6.23.0"
+ babel-plugin-transform-es2015-modules-umd "^6.23.0"
+ babel-plugin-transform-es2015-object-super "^6.22.0"
+ babel-plugin-transform-es2015-parameters "^6.23.0"
+ babel-plugin-transform-es2015-shorthand-properties "^6.22.0"
+ babel-plugin-transform-es2015-spread "^6.22.0"
+ babel-plugin-transform-es2015-sticky-regex "^6.22.0"
+ babel-plugin-transform-es2015-template-literals "^6.22.0"
+ babel-plugin-transform-es2015-typeof-symbol "^6.23.0"
+ babel-plugin-transform-es2015-unicode-regex "^6.22.0"
+ babel-plugin-transform-exponentiation-operator "^6.22.0"
+ babel-plugin-transform-regenerator "^6.22.0"
+ browserslist "^2.1.2"
+ invariant "^2.2.2"
+ semver "^5.3.0"
+
+babel-preset-es2017@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-preset-es2017/-/babel-preset-es2017-6.24.1.tgz#597beadfb9f7f208bcfd8a12e9b2b29b8b2f14d1"
+ integrity sha1-WXvq37n38gi8/YoS6bKym4svFNE=
+ dependencies:
+ babel-plugin-syntax-trailing-function-commas "^6.22.0"
+ babel-plugin-transform-async-to-generator "^6.24.1"
+
+babel-runtime@^6.11.6, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
+ integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4=
+ dependencies:
+ core-js "^2.4.0"
+ regenerator-runtime "^0.11.0"
+
+babel-template@^6.24.1, babel-template@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
+ integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=
+ dependencies:
+ babel-runtime "^6.26.0"
+ babel-traverse "^6.26.0"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+ lodash "^4.17.4"
+
+babel-traverse@^6.24.1, babel-traverse@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
+ integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=
+ dependencies:
+ babel-code-frame "^6.26.0"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+ debug "^2.6.8"
+ globals "^9.18.0"
+ invariant "^2.2.2"
+ lodash "^4.17.4"
+
+babel-types@^6.15.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
+ integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=
+ dependencies:
+ babel-runtime "^6.26.0"
+ esutils "^2.0.2"
+ lodash "^4.17.4"
+ to-fast-properties "^1.0.3"
+
+babylon-walk@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/babylon-walk/-/babylon-walk-1.0.2.tgz#3b15a5ddbb482a78b4ce9c01c8ba181702d9d6ce"
+ integrity sha1-OxWl3btIKni0zpwByLoYFwLZ1s4=
+ dependencies:
+ babel-runtime "^6.11.6"
+ babel-types "^6.15.0"
+ lodash.clone "^4.5.0"
+
+babylon@^6.18.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
+ integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==
+
+balanced-match@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+ integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
+
+base64-js@^1.0.2:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
+ integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+
+base@^0.11.1:
+ version "0.11.2"
+ resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+ integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==
+ dependencies:
+ cache-base "^1.0.1"
+ class-utils "^0.3.5"
+ component-emitter "^1.2.1"
+ define-property "^1.0.0"
+ isobject "^3.0.1"
+ mixin-deep "^1.2.0"
+ pascalcase "^0.1.1"
+
+bcrypt-pbkdf@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
+ integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=
+ dependencies:
+ tweetnacl "^0.14.3"
+
+binary-extensions@^1.0.0:
+ version "1.13.1"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65"
+ integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==
+
+bindings@^1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df"
+ integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==
+ dependencies:
+ file-uri-to-path "1.0.0"
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9:
+ version "4.12.0"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
+ integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
+
+bn.js@^5.0.0, bn.js@^5.1.1:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002"
+ integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==
+
+boolbase@^1.0.0, boolbase@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
+ integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
+
+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@^2.3.1, braces@^2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
+ integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
+ dependencies:
+ arr-flatten "^1.1.0"
+ array-unique "^0.3.2"
+ extend-shallow "^2.0.1"
+ fill-range "^4.0.0"
+ isobject "^3.0.1"
+ repeat-element "^1.1.2"
+ snapdragon "^0.8.1"
+ snapdragon-node "^2.0.1"
+ split-string "^3.0.2"
+ to-regex "^3.0.1"
+
+brfs@^1.2.0:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/brfs/-/brfs-1.6.1.tgz#b78ce2336d818e25eea04a0947cba6d4fb8849c3"
+ integrity sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==
+ dependencies:
+ quote-stream "^1.0.1"
+ resolve "^1.1.5"
+ static-module "^2.2.0"
+ through2 "^2.0.0"
+
+brorand@^1.0.1, brorand@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+ integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=
+
+browser-process-hrtime@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626"
+ integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
+ integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==
+ dependencies:
+ buffer-xor "^1.0.3"
+ cipher-base "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.3"
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+browserify-cipher@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
+ integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==
+ dependencies:
+ browserify-aes "^1.0.4"
+ browserify-des "^1.0.0"
+ evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c"
+ integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==
+ dependencies:
+ cipher-base "^1.0.1"
+ des.js "^1.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+browserify-rsa@^4.0.0, browserify-rsa@^4.0.1:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d"
+ integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==
+ dependencies:
+ bn.js "^5.0.0"
+ randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3"
+ integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==
+ dependencies:
+ bn.js "^5.1.1"
+ browserify-rsa "^4.0.1"
+ create-hash "^1.2.0"
+ create-hmac "^1.1.7"
+ elliptic "^6.5.3"
+ inherits "^2.0.4"
+ parse-asn1 "^5.1.5"
+ readable-stream "^3.6.0"
+ safe-buffer "^5.2.0"
+
+browserify-zlib@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"
+ integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==
+ dependencies:
+ pako "~1.0.5"
+
+browserslist@^2.1.2:
+ version "2.11.3"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.11.3.tgz#fe36167aed1bbcde4827ebfe71347a2cc70b99b2"
+ integrity sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==
+ dependencies:
+ caniuse-lite "^1.0.30000792"
+ electron-to-chromium "^1.3.30"
+
+browserslist@^4.0.0, browserslist@^4.1.0, browserslist@^4.14.5, browserslist@^4.16.3:
+ version "4.16.3"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.3.tgz#340aa46940d7db878748567c5dea24a48ddf3717"
+ integrity sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==
+ dependencies:
+ caniuse-lite "^1.0.30001181"
+ colorette "^1.2.1"
+ electron-to-chromium "^1.3.649"
+ escalade "^3.1.1"
+ node-releases "^1.1.70"
+
+buffer-equal@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b"
+ integrity sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=
+
+buffer-from@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
+ integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
+
+buffer-xor@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+ integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=
+
+buffer@^4.3.0:
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8"
+ integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==
+ dependencies:
+ base64-js "^1.0.2"
+ ieee754 "^1.1.4"
+ isarray "^1.0.0"
+
+builtin-status-codes@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
+ integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=
+
+cache-base@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+ integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==
+ dependencies:
+ collection-visit "^1.0.0"
+ component-emitter "^1.2.1"
+ get-value "^2.0.6"
+ has-value "^1.0.0"
+ isobject "^3.0.1"
+ set-value "^2.0.0"
+ to-object-path "^0.3.0"
+ union-value "^1.0.0"
+ unset-value "^1.0.0"
+
+call-bind@^1.0.0, call-bind@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
+ integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
+ dependencies:
+ function-bind "^1.1.1"
+ get-intrinsic "^1.0.2"
+
+call-me-maybe@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b"
+ integrity sha1-JtII6onje1y95gJQoV8DHBak1ms=
+
+caller-callsite@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134"
+ integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=
+ dependencies:
+ callsites "^2.0.0"
+
+caller-path@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f"
+ integrity sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=
+ dependencies:
+ callsites "^0.2.0"
+
+caller-path@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4"
+ integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=
+ dependencies:
+ caller-callsite "^2.0.0"
+
+callsites@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca"
+ integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=
+
+callsites@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
+ integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=
+
+caniuse-api@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0"
+ integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==
+ dependencies:
+ browserslist "^4.0.0"
+ caniuse-lite "^1.0.0"
+ lodash.memoize "^4.1.2"
+ lodash.uniq "^4.5.0"
+
+caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000792, caniuse-lite@^1.0.30001181:
+ version "1.0.30001204"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001204.tgz#256c85709a348ec4d175e847a3b515c66e79f2aa"
+ integrity sha512-JUdjWpcxfJ9IPamy2f5JaRDCaqJOxDzOSKtbdx4rH9VivMd1vIzoPumsJa9LoMIi4Fx2BV2KZOxWhNkBjaYivQ==
+
+caseless@~0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+ integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
+
+chalk@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+ integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
+ dependencies:
+ ansi-styles "^2.2.1"
+ escape-string-regexp "^1.0.2"
+ has-ansi "^2.0.0"
+ strip-ansi "^3.0.0"
+ supports-color "^2.0.0"
+
+chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2:
+ 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.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a"
+ integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+chardet@^0.4.0:
+ version "0.4.2"
+ resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2"
+ integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=
+
+chokidar@^2.1.5:
+ version "2.1.8"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917"
+ integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==
+ dependencies:
+ anymatch "^2.0.0"
+ async-each "^1.0.1"
+ braces "^2.3.2"
+ glob-parent "^3.1.0"
+ inherits "^2.0.3"
+ is-binary-path "^1.0.0"
+ is-glob "^4.0.0"
+ normalize-path "^3.0.0"
+ path-is-absolute "^1.0.0"
+ readdirp "^2.2.1"
+ upath "^1.1.1"
+ optionalDependencies:
+ fsevents "^1.2.7"
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+ integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+circular-json@^0.3.1:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66"
+ integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==
+
+clang-format@~1.2.2:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/clang-format/-/clang-format-1.2.4.tgz#4bb4b0a98180428deb093cf20982e9fc1af20b6c"
+ integrity sha512-sw+nrGUp3hvmANd1qF8vZPuezSYQAiXgGBiEtkXTtJnnu6b00fCqkkDIsnRKrNgg4nv6NYZE92ejvOMIXZoejw==
+ dependencies:
+ async "^1.5.2"
+ glob "^7.0.0"
+ resolve "^1.1.6"
+
+class-utils@^0.3.5:
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+ integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==
+ dependencies:
+ arr-union "^3.1.0"
+ define-property "^0.2.5"
+ isobject "^3.0.0"
+ static-extend "^0.1.1"
+
+cli-cursor@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
+ integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=
+ dependencies:
+ restore-cursor "^2.0.0"
+
+cli-spinners@^1.1.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a"
+ integrity sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==
+
+cli-width@^2.0.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48"
+ integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==
+
+cliui@^7.0.2:
+ version "7.0.4"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f"
+ integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.0"
+ wrap-ansi "^7.0.0"
+
+clone@^1.0.2:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
+ integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4=
+
+clone@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
+ integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=
+
+co@^4.6.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+ integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=
+
+coa@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3"
+ integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==
+ dependencies:
+ "@types/q" "^1.5.1"
+ chalk "^2.4.1"
+ q "^1.1.2"
+
+collection-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+ integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=
+ dependencies:
+ map-visit "^1.0.0"
+ object-visit "^1.0.0"
+
+color-convert@^1.9.0, color-convert@^1.9.1:
+ 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 sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
+
+color-name@^1.0.0, 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==
+
+color-string@^1.5.4:
+ version "1.5.5"
+ resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.5.tgz#65474a8f0e7439625f3d27a6a19d89fc45223014"
+ integrity sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==
+ dependencies:
+ color-name "^1.0.0"
+ simple-swizzle "^0.2.2"
+
+color@^3.0.0:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/color/-/color-3.1.3.tgz#ca67fb4e7b97d611dcde39eceed422067d91596e"
+ integrity sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==
+ dependencies:
+ color-convert "^1.9.1"
+ color-string "^1.5.4"
+
+colorette@^1.2.1:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94"
+ integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==
+
+combined-stream@^1.0.6, combined-stream@~1.0.6:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
+command-exists@^1.2.6:
+ version "1.2.9"
+ resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69"
+ integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==
+
+commander@^2.11.0, commander@^2.19.0, commander@^2.20.0:
+ version "2.20.3"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
+ integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
+
+commander@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae"
+ integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==
+
+component-emitter@^1.2.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
+ integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
+
+concat-stream@^1.6.0, concat-stream@~1.6.0:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
+ integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
+ dependencies:
+ buffer-from "^1.0.0"
+ inherits "^2.0.3"
+ readable-stream "^2.2.2"
+ typedarray "^0.0.6"
+
+console-browserify@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336"
+ integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==
+
+constants-browserify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
+ integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=
+
+convert-source-map@^1.5.1, convert-source-map@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442"
+ integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==
+ dependencies:
+ safe-buffer "~5.1.1"
+
+copy-descriptor@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+ integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
+
+core-js-compat@^3.8.1, core-js-compat@^3.9.0:
+ version "3.9.1"
+ resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.9.1.tgz#4e572acfe90aff69d76d8c37759d21a5c59bb455"
+ integrity sha512-jXAirMQxrkbiiLsCx9bQPJFA6llDadKMpYrBJQJ3/c4/vsPP/fAf29h24tviRlvwUL6AmY5CHLu2GvjuYviQqA==
+ dependencies:
+ browserslist "^4.16.3"
+ semver "7.0.0"
+
+core-js@^2.4.0, core-js@^2.5.0, core-js@^2.6.5:
+ version "2.6.12"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec"
+ integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
+
+core-util-is@1.0.2, core-util-is@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+ integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
+
+cosmiconfig@^5.0.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a"
+ integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==
+ dependencies:
+ import-fresh "^2.0.0"
+ is-directory "^0.3.1"
+ js-yaml "^3.13.1"
+ parse-json "^4.0.0"
+
+create-ecdh@^4.0.0:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e"
+ integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==
+ dependencies:
+ bn.js "^4.1.0"
+ elliptic "^6.5.3"
+
+create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
+ integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
+ dependencies:
+ cipher-base "^1.0.1"
+ inherits "^2.0.1"
+ md5.js "^1.3.4"
+ ripemd160 "^2.0.1"
+ sha.js "^2.4.0"
+
+create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
+ integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
+ dependencies:
+ cipher-base "^1.0.3"
+ create-hash "^1.1.0"
+ inherits "^2.0.1"
+ ripemd160 "^2.0.0"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+cross-env@^5.2.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-5.2.1.tgz#b2c76c1ca7add66dc874d11798466094f551b34d"
+ integrity sha512-1yHhtcfAd1r4nwQgknowuUNfIT9E8dOMMspC36g45dN+iD1blloi7xp8X/xAIDnjHWyt1uQ8PHk2fkNaym7soQ==
+ dependencies:
+ cross-spawn "^6.0.5"
+
+cross-spawn@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
+ integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=
+ dependencies:
+ lru-cache "^4.0.1"
+ shebang-command "^1.2.0"
+ which "^1.2.9"
+
+cross-spawn@^6.0.4, cross-spawn@^6.0.5:
+ version "6.0.5"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
+ integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
+ dependencies:
+ nice-try "^1.0.4"
+ path-key "^2.0.1"
+ semver "^5.5.0"
+ shebang-command "^1.2.0"
+ which "^1.2.9"
+
+crypto-browserify@^3.11.0:
+ version "3.12.0"
+ resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
+ integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==
+ dependencies:
+ browserify-cipher "^1.0.0"
+ browserify-sign "^4.0.0"
+ create-ecdh "^4.0.0"
+ create-hash "^1.1.0"
+ create-hmac "^1.1.0"
+ diffie-hellman "^5.0.0"
+ inherits "^2.0.1"
+ pbkdf2 "^3.0.3"
+ public-encrypt "^4.0.0"
+ randombytes "^2.0.0"
+ randomfill "^1.0.3"
+
+css-color-names@0.0.4, css-color-names@^0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
+ integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=
+
+css-declaration-sorter@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22"
+ integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==
+ dependencies:
+ postcss "^7.0.1"
+ timsort "^0.3.0"
+
+css-modules-loader-core@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/css-modules-loader-core/-/css-modules-loader-core-1.1.0.tgz#5908668294a1becd261ae0a4ce21b0b551f21d16"
+ integrity sha1-WQhmgpShvs0mGuCkziGwtVHyHRY=
+ dependencies:
+ icss-replace-symbols "1.1.0"
+ postcss "6.0.1"
+ postcss-modules-extract-imports "1.1.0"
+ postcss-modules-local-by-default "1.2.0"
+ postcss-modules-scope "1.1.0"
+ postcss-modules-values "1.3.0"
+
+css-select-base-adapter@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7"
+ integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==
+
+css-select@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef"
+ integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==
+ dependencies:
+ boolbase "^1.0.0"
+ css-what "^3.2.1"
+ domutils "^1.7.0"
+ nth-check "^1.0.2"
+
+css-selector-tokenizer@^0.7.0:
+ version "0.7.3"
+ resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz#735f26186e67c749aaf275783405cf0661fae8f1"
+ integrity sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==
+ dependencies:
+ cssesc "^3.0.0"
+ fastparse "^1.1.2"
+
+css-tree@1.0.0-alpha.37:
+ version "1.0.0-alpha.37"
+ resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22"
+ integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==
+ dependencies:
+ mdn-data "2.0.4"
+ source-map "^0.6.1"
+
+css-tree@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.2.tgz#9ae393b5dafd7dae8a622475caec78d3d8fbd7b5"
+ integrity sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ==
+ dependencies:
+ mdn-data "2.0.14"
+ source-map "^0.6.1"
+
+css-what@^3.2.1:
+ version "3.4.2"
+ resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4"
+ integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==
+
+cssesc@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
+ integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
+
+cssnano-preset-default@^4.0.7:
+ version "4.0.7"
+ resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76"
+ integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==
+ dependencies:
+ css-declaration-sorter "^4.0.1"
+ cssnano-util-raw-cache "^4.0.1"
+ postcss "^7.0.0"
+ postcss-calc "^7.0.1"
+ postcss-colormin "^4.0.3"
+ postcss-convert-values "^4.0.1"
+ postcss-discard-comments "^4.0.2"
+ postcss-discard-duplicates "^4.0.2"
+ postcss-discard-empty "^4.0.1"
+ postcss-discard-overridden "^4.0.1"
+ postcss-merge-longhand "^4.0.11"
+ postcss-merge-rules "^4.0.3"
+ postcss-minify-font-values "^4.0.2"
+ postcss-minify-gradients "^4.0.2"
+ postcss-minify-params "^4.0.2"
+ postcss-minify-selectors "^4.0.2"
+ postcss-normalize-charset "^4.0.1"
+ postcss-normalize-display-values "^4.0.2"
+ postcss-normalize-positions "^4.0.2"
+ postcss-normalize-repeat-style "^4.0.2"
+ postcss-normalize-string "^4.0.2"
+ postcss-normalize-timing-functions "^4.0.2"
+ postcss-normalize-unicode "^4.0.1"
+ postcss-normalize-url "^4.0.1"
+ postcss-normalize-whitespace "^4.0.2"
+ postcss-ordered-values "^4.1.2"
+ postcss-reduce-initial "^4.0.3"
+ postcss-reduce-transforms "^4.0.2"
+ postcss-svgo "^4.0.2"
+ postcss-unique-selectors "^4.0.1"
+
+cssnano-util-get-arguments@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f"
+ integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=
+
+cssnano-util-get-match@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d"
+ integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=
+
+cssnano-util-raw-cache@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282"
+ integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==
+ dependencies:
+ postcss "^7.0.0"
+
+cssnano-util-same-parent@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3"
+ integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==
+
+cssnano@^4.0.0, cssnano@^4.1.10:
+ version "4.1.10"
+ resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2"
+ integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==
+ dependencies:
+ cosmiconfig "^5.0.0"
+ cssnano-preset-default "^4.0.7"
+ is-resolvable "^1.0.0"
+ postcss "^7.0.0"
+
+csso@^4.0.2:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529"
+ integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==
+ dependencies:
+ css-tree "^1.1.2"
+
+cssom@0.3.x, cssom@^0.3.4:
+ version "0.3.8"
+ resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a"
+ integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==
+
+cssstyle@^1.1.1:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1"
+ integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==
+ dependencies:
+ cssom "0.3.x"
+
+dashdash@^1.12.0:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+ integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=
+ dependencies:
+ assert-plus "^1.0.0"
+
+dat.gui@^0.7.1:
+ version "0.7.7"
+ resolved "https://registry.yarnpkg.com/dat.gui/-/dat.gui-0.7.7.tgz#7f96dbd21621a76385203659aebfa264ee6ae89b"
+ integrity sha512-sRl/28gF/XRC5ywC9I4zriATTsQcpSsRG7seXCPnTkK8/EQMIbCu5NPMpICLGxX9ZEUvcXR3ArLYCtgreFoMDw==
+
+data-urls@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe"
+ integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==
+ dependencies:
+ abab "^2.0.0"
+ whatwg-mimetype "^2.2.0"
+ whatwg-url "^7.0.0"
+
+deasync@^0.1.14:
+ version "0.1.21"
+ resolved "https://registry.yarnpkg.com/deasync/-/deasync-0.1.21.tgz#bb11eabd4466c0d8776f0d82deb8a6126460d30f"
+ integrity sha512-kUmM8Y+PZpMpQ+B4AuOW9k2Pfx/mSupJtxOsLzmnHY2WqZUYRFccFn2RhzPAqt3Xb+sorK/badW2D4zNzqZz5w==
+ dependencies:
+ bindings "^1.5.0"
+ node-addon-api "^1.7.1"
+
+debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ dependencies:
+ ms "2.0.0"
+
+debug@^3.1.0:
+ version "3.2.7"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
+ integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
+ dependencies:
+ ms "^2.1.1"
+
+debug@^4.1.0, debug@^4.1.1:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
+ integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
+ dependencies:
+ ms "2.1.2"
+
+decode-uri-component@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+ integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
+
+deep-is@~0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
+ integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
+
+defaults@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
+ integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=
+ dependencies:
+ clone "^1.0.2"
+
+define-properties@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
+ integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
+ dependencies:
+ object-keys "^1.0.12"
+
+define-property@^0.2.5:
+ version "0.2.5"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+ integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=
+ dependencies:
+ is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+ integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY=
+ dependencies:
+ is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+ integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==
+ dependencies:
+ is-descriptor "^1.0.2"
+ isobject "^3.0.1"
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
+
+depd@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
+ integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
+
+des.js@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843"
+ integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==
+ dependencies:
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+destroy@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+ integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
+
+detect-indent@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.0.0.tgz#0abd0f549f69fc6659a254fe96786186b6f528fd"
+ integrity sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==
+
+diffie-hellman@^5.0.0:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
+ integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==
+ dependencies:
+ bn.js "^4.1.0"
+ miller-rabin "^4.0.0"
+ randombytes "^2.0.0"
+
+doctrine@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
+ integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==
+ dependencies:
+ esutils "^2.0.2"
+
+dom-serializer@0:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51"
+ integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==
+ dependencies:
+ domelementtype "^2.0.1"
+ entities "^2.0.0"
+
+domain-browser@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
+ integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==
+
+domelementtype@1, domelementtype@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f"
+ integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==
+
+domelementtype@^2.0.1:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.1.0.tgz#a851c080a6d1c3d94344aed151d99f669edf585e"
+ integrity sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==
+
+domexception@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90"
+ integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==
+ dependencies:
+ webidl-conversions "^4.0.2"
+
+domhandler@^2.3.0:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803"
+ integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==
+ dependencies:
+ domelementtype "1"
+
+domutils@^1.5.1, domutils@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
+ integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==
+ dependencies:
+ dom-serializer "0"
+ domelementtype "1"
+
+dot-prop@^5.2.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88"
+ integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==
+ dependencies:
+ is-obj "^2.0.0"
+
+dotenv-expand@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0"
+ integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==
+
+dotenv@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-5.0.1.tgz#a5317459bd3d79ab88cff6e44057a6a3fbb1fcef"
+ integrity sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow==
+
+duplexer2@~0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1"
+ integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=
+ dependencies:
+ readable-stream "^2.0.2"
+
+ecc-jsbn@~0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
+ integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=
+ dependencies:
+ jsbn "~0.1.0"
+ safer-buffer "^2.1.0"
+
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+ integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
+
+electron-to-chromium@^1.3.30, electron-to-chromium@^1.3.649:
+ version "1.3.701"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.701.tgz#5e796ed7ce88cd77bc7bf831cf311ef6b067c389"
+ integrity sha512-Zd9ofdIMYHYhG1gvnejQDvC/kqSeXQvtXF0yRURGxgwGqDZm9F9Fm3dYFnm5gyuA7xpXfBlzVLN1sz0FjxpKfw==
+
+elliptic@^6.5.3:
+ version "6.5.4"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb"
+ integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==
+ dependencies:
+ bn.js "^4.11.9"
+ brorand "^1.1.0"
+ hash.js "^1.0.0"
+ hmac-drbg "^1.0.1"
+ inherits "^2.0.4"
+ minimalistic-assert "^1.0.1"
+ minimalistic-crypto-utils "^1.0.1"
+
+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==
+
+encodeurl@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+ integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
+
+entities@^1.1.1, entities@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56"
+ integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==
+
+entities@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55"
+ integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==
+
+envinfo@^7.3.1:
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.7.4.tgz#c6311cdd38a0e86808c1c9343f667e4267c4a320"
+ integrity sha512-TQXTYFVVwwluWSFis6K2XKxgrD22jEv0FTuLCQI+OjH7rn93+iY0fSSFM5lrSxFY+H1+B0/cvvlamr3UsBivdQ==
+
+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"
+
+es-abstract@^1.17.2, es-abstract@^1.18.0-next.2:
+ version "1.18.0"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0.tgz#ab80b359eecb7ede4c298000390bc5ac3ec7b5a4"
+ integrity sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==
+ dependencies:
+ call-bind "^1.0.2"
+ es-to-primitive "^1.2.1"
+ function-bind "^1.1.1"
+ get-intrinsic "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.0.2"
+ is-callable "^1.2.3"
+ is-negative-zero "^2.0.1"
+ is-regex "^1.1.2"
+ is-string "^1.0.5"
+ object-inspect "^1.9.0"
+ object-keys "^1.1.1"
+ object.assign "^4.1.2"
+ string.prototype.trimend "^1.0.4"
+ string.prototype.trimstart "^1.0.4"
+ unbox-primitive "^1.0.0"
+
+es-to-primitive@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
+ integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
+ dependencies:
+ is-callable "^1.1.4"
+ is-date-object "^1.0.1"
+ is-symbol "^1.0.2"
+
+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-html@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+ integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
+
+escape-string-regexp@^1.0.2, 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 sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+
+escodegen@^1.11.0, escodegen@^1.11.1:
+ version "1.14.3"
+ resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503"
+ integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==
+ dependencies:
+ esprima "^4.0.1"
+ estraverse "^4.2.0"
+ esutils "^2.0.2"
+ optionator "^0.8.1"
+ optionalDependencies:
+ source-map "~0.6.1"
+
+escodegen@~1.9.0:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.1.tgz#dbae17ef96c8e4bedb1356f4504fa4cc2f7cb7e2"
+ integrity sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==
+ dependencies:
+ esprima "^3.1.3"
+ estraverse "^4.2.0"
+ esutils "^2.0.2"
+ optionator "^0.8.1"
+ optionalDependencies:
+ source-map "~0.6.1"
+
+eslint-config-google@^0.9.1:
+ version "0.9.1"
+ resolved "https://registry.yarnpkg.com/eslint-config-google/-/eslint-config-google-0.9.1.tgz#83353c3dba05f72bb123169a4094f4ff120391eb"
+ integrity sha512-5A83D+lH0PA81QMESKbLJd/a3ic8tPZtwUmqNrxMRo54nfFaUvtt89q/+icQ+fd66c2xQHn0KyFkzJDoAUfpZA==
+
+eslint-scope@^3.7.1:
+ version "3.7.3"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.3.tgz#bb507200d3d17f60247636160b4826284b108535"
+ integrity sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==
+ dependencies:
+ esrecurse "^4.1.0"
+ estraverse "^4.1.1"
+
+eslint-visitor-keys@^1.0.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e"
+ integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==
+
+eslint@^4.19.1:
+ version "4.19.1"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300"
+ integrity sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==
+ dependencies:
+ ajv "^5.3.0"
+ babel-code-frame "^6.22.0"
+ chalk "^2.1.0"
+ concat-stream "^1.6.0"
+ cross-spawn "^5.1.0"
+ debug "^3.1.0"
+ doctrine "^2.1.0"
+ eslint-scope "^3.7.1"
+ eslint-visitor-keys "^1.0.0"
+ espree "^3.5.4"
+ esquery "^1.0.0"
+ esutils "^2.0.2"
+ file-entry-cache "^2.0.0"
+ functional-red-black-tree "^1.0.1"
+ glob "^7.1.2"
+ globals "^11.0.1"
+ ignore "^3.3.3"
+ imurmurhash "^0.1.4"
+ inquirer "^3.0.6"
+ is-resolvable "^1.0.0"
+ js-yaml "^3.9.1"
+ json-stable-stringify-without-jsonify "^1.0.1"
+ levn "^0.3.0"
+ lodash "^4.17.4"
+ minimatch "^3.0.2"
+ mkdirp "^0.5.1"
+ natural-compare "^1.4.0"
+ optionator "^0.8.2"
+ path-is-inside "^1.0.2"
+ pluralize "^7.0.0"
+ progress "^2.0.0"
+ regexpp "^1.0.1"
+ require-uncached "^1.0.3"
+ semver "^5.3.0"
+ strip-ansi "^4.0.0"
+ strip-json-comments "~2.0.1"
+ table "4.0.2"
+ text-table "~0.2.0"
+
+espree@^3.5.4:
+ version "3.5.4"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7"
+ integrity sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==
+ dependencies:
+ acorn "^5.5.0"
+ acorn-jsx "^3.0.0"
+
+esprima@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
+ integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=
+
+esprima@^4.0.0, esprima@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+esquery@^1.0.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5"
+ integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==
+ dependencies:
+ estraverse "^5.1.0"
+
+esrecurse@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
+ integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
+ dependencies:
+ estraverse "^5.2.0"
+
+estraverse@^4.1.1, estraverse@^4.2.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
+ integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
+
+estraverse@^5.1.0, estraverse@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880"
+ integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+etag@~1.8.1:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+ integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
+
+events@^3.0.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
+ integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
+
+evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+ integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==
+ dependencies:
+ md5.js "^1.3.4"
+ safe-buffer "^5.1.1"
+
+expand-brackets@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+ integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI=
+ dependencies:
+ debug "^2.3.3"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ posix-character-classes "^0.1.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+extend-shallow@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+ integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=
+ dependencies:
+ is-extendable "^0.1.0"
+
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+ integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=
+ dependencies:
+ assign-symbols "^1.0.0"
+ is-extendable "^1.0.1"
+
+extend@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
+ integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
+
+external-editor@^2.0.4:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5"
+ integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==
+ dependencies:
+ chardet "^0.4.0"
+ iconv-lite "^0.4.17"
+ tmp "^0.0.33"
+
+extglob@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+ integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==
+ dependencies:
+ array-unique "^0.3.2"
+ define-property "^1.0.0"
+ expand-brackets "^2.1.4"
+ extend-shallow "^2.0.1"
+ fragment-cache "^0.2.1"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+extsprintf@1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
+ integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=
+
+extsprintf@^1.2.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
+ integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
+
+falafel@^2.1.0:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/falafel/-/falafel-2.2.4.tgz#b5d86c060c2412a43166243cb1bce44d1abd2819"
+ integrity sha512-0HXjo8XASWRmsS0X1EkhwEMZaD3Qvp7FfURwjLKjG1ghfRm/MGZl2r4cWUTv41KdNghTw4OUMmVtdGQp3+H+uQ==
+ dependencies:
+ acorn "^7.1.1"
+ foreach "^2.0.5"
+ isarray "^2.0.1"
+ object-keys "^1.0.6"
+
+fast-deep-equal@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614"
+ integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=
+
+fast-deep-equal@^3.1.1:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-glob@^2.2.2:
+ version "2.2.7"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d"
+ integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==
+ dependencies:
+ "@mrmlnc/readdir-enhanced" "^2.2.1"
+ "@nodelib/fs.stat" "^1.1.2"
+ glob-parent "^3.1.0"
+ is-glob "^4.0.0"
+ merge2 "^1.2.3"
+ micromatch "^3.1.10"
+
+fast-json-stable-stringify@^2.0.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==
+
+fast-levenshtein@~2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+ integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
+
+fast-xml-parser@^3.19.0:
+ version "3.19.0"
+ resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-3.19.0.tgz#cb637ec3f3999f51406dd8ff0e6fc4d83e520d01"
+ integrity sha512-4pXwmBplsCPv8FOY1WRakF970TjNGnGnfbOnLqjlYvMiF1SR3yOHyxMR/YCXpPTOspNF5gwudqktIP4VsWkvBg==
+
+fastparse@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9"
+ integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==
+
+figures@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962"
+ integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=
+ dependencies:
+ escape-string-regexp "^1.0.5"
+
+file-entry-cache@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361"
+ integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=
+ dependencies:
+ flat-cache "^1.2.1"
+ object-assign "^4.0.1"
+
+file-uri-to-path@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
+ integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==
+
+filesize@^3.6.0:
+ version "3.6.1"
+ resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317"
+ integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==
+
+fill-range@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+ integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+ to-regex-range "^2.1.0"
+
+flat-cache@^1.2.1:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f"
+ integrity sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==
+ dependencies:
+ circular-json "^0.3.1"
+ graceful-fs "^4.1.2"
+ rimraf "~2.6.2"
+ write "^0.2.1"
+
+for-in@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+ integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
+
+foreach@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
+ integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k=
+
+forever-agent@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+ integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
+
+form-data@~2.3.2:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
+ integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.6"
+ mime-types "^2.1.12"
+
+fragment-cache@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+ integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=
+ dependencies:
+ map-cache "^0.2.2"
+
+fresh@0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+ integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
+
+fs-extra@^8.0.1:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
+ integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==
+ dependencies:
+ graceful-fs "^4.2.0"
+ jsonfile "^4.0.0"
+ universalify "^0.1.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 sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
+
+fsevents@^1.2.7:
+ version "1.2.13"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38"
+ integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==
+ dependencies:
+ bindings "^1.5.0"
+ nan "^2.12.1"
+
+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==
+
+functional-red-black-tree@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
+ integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
+
+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-intrinsic@^1.0.2, get-intrinsic@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6"
+ integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==
+ dependencies:
+ function-bind "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.0.1"
+
+get-port@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc"
+ integrity sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=
+
+get-value@^2.0.3, get-value@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+ integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=
+
+getpass@^0.1.1:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+ integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=
+ dependencies:
+ assert-plus "^1.0.0"
+
+glob-parent@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
+ integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=
+ dependencies:
+ is-glob "^3.1.0"
+ path-dirname "^1.0.0"
+
+glob-to-regexp@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab"
+ integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=
+
+glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4:
+ version "7.1.6"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
+ integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+globals@^11.0.1, 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==
+
+globals@^9.18.0:
+ version "9.18.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
+ integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==
+
+graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0:
+ version "4.2.6"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee"
+ integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==
+
+grapheme-breaker@^0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/grapheme-breaker/-/grapheme-breaker-0.3.2.tgz#5b9e6b78c3832452d2ba2bb1cb830f96276410ac"
+ integrity sha1-W55reMODJFLSuiuxy4MPlidkEKw=
+ dependencies:
+ brfs "^1.2.0"
+ unicode-trie "^0.3.1"
+
+har-schema@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
+ integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=
+
+har-validator@~5.1.3:
+ version "5.1.5"
+ resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd"
+ integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==
+ dependencies:
+ ajv "^6.12.3"
+ har-schema "^2.0.0"
+
+has-ansi@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+ integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=
+ dependencies:
+ ansi-regex "^2.0.0"
+
+has-bigints@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113"
+ integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==
+
+has-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
+ integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+
+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-symbols@^1.0.1, has-symbols@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423"
+ integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==
+
+has-value@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+ integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=
+ dependencies:
+ get-value "^2.0.3"
+ has-values "^0.1.4"
+ isobject "^2.0.0"
+
+has-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+ integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=
+ dependencies:
+ get-value "^2.0.6"
+ has-values "^1.0.0"
+ isobject "^3.0.0"
+
+has-values@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+ integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E=
+
+has-values@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+ integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=
+ dependencies:
+ is-number "^3.0.0"
+ kind-of "^4.0.0"
+
+has@^1.0.0, has@^1.0.1, 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"
+
+hash-base@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33"
+ integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==
+ dependencies:
+ inherits "^2.0.4"
+ readable-stream "^3.6.0"
+ safe-buffer "^5.2.0"
+
+hash.js@^1.0.0, hash.js@^1.0.3:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
+ integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
+ dependencies:
+ inherits "^2.0.3"
+ minimalistic-assert "^1.0.1"
+
+hex-color-regex@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e"
+ integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==
+
+hmac-drbg@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+ integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=
+ dependencies:
+ hash.js "^1.0.3"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.1"
+
+hsl-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e"
+ integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=
+
+hsla-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38"
+ integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg=
+
+html-encoding-sniffer@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8"
+ integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==
+ dependencies:
+ whatwg-encoding "^1.0.1"
+
+html-tags@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-1.2.0.tgz#c78de65b5663aa597989dd2b7ab49200d7e4db98"
+ integrity sha1-x43mW1Zjqll5id0rerSSANfk25g=
+
+htmlnano@^0.2.2:
+ version "0.2.8"
+ resolved "https://registry.yarnpkg.com/htmlnano/-/htmlnano-0.2.8.tgz#d9c22daa18c8ea7675a0bf07cc904793ccaeb56f"
+ integrity sha512-q5gbo4SIDAE5sfJ5V0UD6uu+n1dcO/Mpr0B6SlDlJBoV7xKPne4uG4UwrT8vUWjdjIPJl95TY8EDuEbBW2TG0A==
+ dependencies:
+ cssnano "^4.1.10"
+ posthtml "^0.13.4"
+ posthtml-render "^1.3.0"
+ purgecss "^2.3.0"
+ relateurl "^0.2.7"
+ srcset "^3.0.0"
+ svgo "^1.3.2"
+ terser "^4.8.0"
+ timsort "^0.3.0"
+ uncss "^0.17.3"
+
+htmlparser2@^3.9.2:
+ version "3.10.1"
+ resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f"
+ integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==
+ dependencies:
+ domelementtype "^1.3.1"
+ domhandler "^2.3.0"
+ domutils "^1.5.1"
+ entities "^1.1.1"
+ inherits "^2.0.1"
+ readable-stream "^3.1.1"
+
+http-errors@~1.7.2:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
+ integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.4"
+ setprototypeof "1.1.1"
+ statuses ">= 1.5.0 < 2"
+ toidentifier "1.0.0"
+
+http-signature@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
+ integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=
+ dependencies:
+ assert-plus "^1.0.0"
+ jsprim "^1.2.2"
+ sshpk "^1.7.0"
+
+https-browserify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
+ integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=
+
+iconv-lite@0.4.24, iconv-lite@^0.4.17:
+ version "0.4.24"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+icss-replace-symbols@1.1.0, icss-replace-symbols@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
+ integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=
+
+ieee754@^1.1.4:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
+ integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
+
+ignore-walk@^3.0.1:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37"
+ integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==
+ dependencies:
+ minimatch "^3.0.4"
+
+ignore@^3.3.3:
+ version "3.3.10"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043"
+ integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==
+
+ignore@^5.0.4:
+ version "5.1.8"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57"
+ integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==
+
+import-fresh@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546"
+ integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY=
+ dependencies:
+ caller-path "^2.0.0"
+ resolve-from "^3.0.0"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+ integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
+
+indexes-of@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
+ integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc=
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+inherits@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
+ integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=
+
+inherits@2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+ integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
+
+ini@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5"
+ integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==
+
+inquirer@^3.0.6:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9"
+ integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==
+ dependencies:
+ ansi-escapes "^3.0.0"
+ chalk "^2.0.0"
+ cli-cursor "^2.1.0"
+ cli-width "^2.0.0"
+ external-editor "^2.0.4"
+ figures "^2.0.0"
+ lodash "^4.3.0"
+ mute-stream "0.0.7"
+ run-async "^2.2.0"
+ rx-lite "^4.0.8"
+ rx-lite-aggregates "^4.0.8"
+ string-width "^2.1.0"
+ strip-ansi "^4.0.0"
+ through "^2.3.6"
+
+invariant@^2.2.2:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
+ integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
+ dependencies:
+ loose-envify "^1.0.0"
+
+is-absolute-url@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6"
+ integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=
+
+is-absolute-url@^3.0.1:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698"
+ integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==
+
+is-accessor-descriptor@^0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
+ integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-accessor-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
+ integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==
+ dependencies:
+ kind-of "^6.0.0"
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+ integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
+
+is-arrayish@^0.3.1:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
+ integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==
+
+is-bigint@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.1.tgz#6923051dfcbc764278540b9ce0e6b3213aa5ebc2"
+ integrity sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==
+
+is-binary-path@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
+ integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=
+ dependencies:
+ binary-extensions "^1.0.0"
+
+is-boolean-object@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.0.tgz#e2aaad3a3a8fca34c28f6eee135b156ed2587ff0"
+ integrity sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==
+ dependencies:
+ call-bind "^1.0.0"
+
+is-buffer@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+ integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
+
+is-callable@^1.1.4, is-callable@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e"
+ integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==
+
+is-color-stop@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345"
+ integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=
+ dependencies:
+ css-color-names "^0.0.4"
+ hex-color-regex "^1.1.0"
+ hsl-regex "^1.0.0"
+ hsla-regex "^1.0.0"
+ rgb-regex "^1.0.1"
+ rgba-regex "^1.0.0"
+
+is-core-module@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a"
+ integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==
+ dependencies:
+ has "^1.0.3"
+
+is-data-descriptor@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
+ integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-data-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
+ integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==
+ dependencies:
+ kind-of "^6.0.0"
+
+is-date-object@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e"
+ integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==
+
+is-descriptor@^0.1.0:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
+ integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==
+ dependencies:
+ is-accessor-descriptor "^0.1.6"
+ is-data-descriptor "^0.1.4"
+ kind-of "^5.0.0"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
+ integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==
+ dependencies:
+ is-accessor-descriptor "^1.0.0"
+ is-data-descriptor "^1.0.0"
+ kind-of "^6.0.2"
+
+is-directory@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
+ integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+ integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=
+
+is-extendable@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+ integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==
+ dependencies:
+ is-plain-object "^2.0.4"
+
+is-extglob@^2.1.0, is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
+
+is-fullwidth-code-point@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+ integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
+
+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-glob@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
+ integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=
+ dependencies:
+ is-extglob "^2.1.0"
+
+is-glob@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
+ integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-html@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-html/-/is-html-1.1.0.tgz#e04f1c18d39485111396f9a0273eab51af218464"
+ integrity sha1-4E8cGNOUhRETlvmgJz6rUa8hhGQ=
+ dependencies:
+ html-tags "^1.0.0"
+
+is-negative-zero@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24"
+ integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==
+
+is-number-object@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197"
+ integrity sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==
+
+is-number@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+ integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-obj@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
+ integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==
+
+is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+ integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
+ dependencies:
+ isobject "^3.0.1"
+
+is-regex@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.2.tgz#81c8ebde4db142f2cf1c53fc86d6a45788266251"
+ integrity sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==
+ dependencies:
+ call-bind "^1.0.2"
+ has-symbols "^1.0.1"
+
+is-resolvable@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
+ integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==
+
+is-string@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6"
+ integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==
+
+is-svg@4.3.1, is-svg@^3.0.0:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-4.3.1.tgz#8c63ec8c67c8c7f0a8de0a71c8c7d58eccf4406b"
+ integrity sha512-h2CGs+yPUyvkgTJQS9cJzo9lYK06WgRiXUqBBHtglSzVKAuH4/oWsqk7LGfbSa1hGk9QcZ0SyQtVggvBA8LZXA==
+ dependencies:
+ fast-xml-parser "^3.19.0"
+
+is-symbol@^1.0.2, is-symbol@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937"
+ integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==
+ dependencies:
+ has-symbols "^1.0.1"
+
+is-typedarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+ integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
+
+is-url@^1.2.2:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52"
+ integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==
+
+is-windows@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+ integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
+
+is-wsl@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d"
+ integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=
+
+isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+ integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
+
+isarray@^2.0.1:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723"
+ integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
+
+isobject@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+ integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=
+ dependencies:
+ isarray "1.0.0"
+
+isobject@^3.0.0, isobject@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+ integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
+
+isstream@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+ integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
+
+"js-tokens@^3.0.0 || ^4.0.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-tokens@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
+ integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls=
+
+js-yaml@^3.10.0, js-yaml@^3.13.1, js-yaml@^3.9.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"
+
+jsbn@~0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+ integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
+
+jsdom@^14.1.0:
+ version "14.1.0"
+ resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-14.1.0.tgz#916463b6094956b0a6c1782c94e380cd30e1981b"
+ integrity sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng==
+ dependencies:
+ abab "^2.0.0"
+ acorn "^6.0.4"
+ acorn-globals "^4.3.0"
+ array-equal "^1.0.0"
+ cssom "^0.3.4"
+ cssstyle "^1.1.1"
+ data-urls "^1.1.0"
+ domexception "^1.0.1"
+ escodegen "^1.11.0"
+ html-encoding-sniffer "^1.0.2"
+ nwsapi "^2.1.3"
+ parse5 "5.1.0"
+ pn "^1.1.0"
+ request "^2.88.0"
+ request-promise-native "^1.0.5"
+ saxes "^3.1.9"
+ symbol-tree "^3.2.2"
+ tough-cookie "^2.5.0"
+ w3c-hr-time "^1.0.1"
+ w3c-xmlserializer "^1.1.2"
+ webidl-conversions "^4.0.2"
+ whatwg-encoding "^1.0.5"
+ whatwg-mimetype "^2.3.0"
+ whatwg-url "^7.0.0"
+ ws "^6.1.2"
+ xml-name-validator "^3.0.0"
+
+jsesc@^2.5.1:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
+ integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
+
+jsesc@~0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
+ integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=
+
+json-parse-better-errors@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
+ integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
+
+json-schema-traverse@^0.3.0:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
+ integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-schema@0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
+ integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=
+
+json-stable-stringify-without-jsonify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
+ integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
+
+json-stringify-safe@~5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+ integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
+
+json5@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
+ integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==
+ dependencies:
+ minimist "^1.2.0"
+
+json5@^2.1.2:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3"
+ integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==
+ dependencies:
+ minimist "^1.2.5"
+
+jsonfile@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
+ integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsprim@^1.2.2:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
+ integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=
+ dependencies:
+ assert-plus "1.0.0"
+ extsprintf "1.3.0"
+ json-schema "0.2.3"
+ verror "1.10.0"
+
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+ integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+ integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc=
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
+ integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
+
+kind-of@^6.0.0, kind-of@^6.0.2:
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
+ integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
+
+levn@^0.3.0, levn@~0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
+ integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=
+ dependencies:
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+
+lodash.clone@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6"
+ integrity sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=
+
+lodash.debounce@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
+ integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168=
+
+lodash.memoize@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
+ integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=
+
+lodash.sortby@^4.7.0:
+ version "4.7.0"
+ resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
+ integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=
+
+lodash.uniq@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
+ integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=
+
+lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.4, lodash@^4.3.0:
+ version "4.17.21"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+log-symbols@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a"
+ integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==
+ dependencies:
+ chalk "^2.0.1"
+
+loose-envify@^1.0.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+ integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
+lru-cache@^4.0.1:
+ version "4.1.5"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
+ integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==
+ dependencies:
+ pseudomap "^1.0.2"
+ yallist "^2.1.2"
+
+magic-string@^0.22.4:
+ version "0.22.5"
+ resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.22.5.tgz#8e9cf5afddf44385c1da5bc2a6a0dbd10b03657e"
+ integrity sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==
+ dependencies:
+ vlq "^0.2.2"
+
+map-cache@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+ integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=
+
+map-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+ integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=
+ dependencies:
+ object-visit "^1.0.0"
+
+md5.js@^1.3.4:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
+ integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+mdn-data@2.0.14:
+ version "2.0.14"
+ resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50"
+ integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==
+
+mdn-data@2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b"
+ integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==
+
+merge-source-map@1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.0.4.tgz#a5de46538dae84d4114cc5ea02b4772a6346701f"
+ integrity sha1-pd5GU42uhNQRTMXqArR3KmNGcB8=
+ dependencies:
+ source-map "^0.5.6"
+
+merge2@^1.2.3:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
+ integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+
+micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4:
+ version "3.1.10"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
+ integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ braces "^2.3.1"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ extglob "^2.0.4"
+ fragment-cache "^0.2.1"
+ kind-of "^6.0.2"
+ nanomatch "^1.2.9"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.2"
+
+miller-rabin@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
+ integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==
+ dependencies:
+ bn.js "^4.0.0"
+ brorand "^1.0.1"
+
+mime-db@1.46.0:
+ version "1.46.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.46.0.tgz#6267748a7f799594de3cbc8cde91def349661cee"
+ integrity sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==
+
+mime-types@^2.1.12, mime-types@~2.1.19:
+ version "2.1.29"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.29.tgz#1d4ab77da64b91f5f72489df29236563754bb1b2"
+ integrity sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==
+ dependencies:
+ mime-db "1.46.0"
+
+mime@1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+ integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+
+mimic-fn@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
+ integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==
+
+minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+ integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
+
+minimalistic-crypto-utils@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+ integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
+
+minimatch@^3.0.2, minimatch@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+ integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
+ integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
+
+mixin-deep@^1.2.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566"
+ integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==
+ dependencies:
+ for-in "^1.0.2"
+ is-extendable "^1.0.1"
+
+mkdirp@^0.5.1, mkdirp@~0.5.1:
+ version "0.5.5"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
+ integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
+ dependencies:
+ minimist "^1.2.5"
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+ integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
+
+ms@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
+ integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
+
+ms@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+ms@^2.1.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+mute-stream@0.0.7:
+ version "0.0.7"
+ resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
+ integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=
+
+nan@^2.12.1:
+ version "2.14.2"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19"
+ integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==
+
+nanomatch@^1.2.9:
+ version "1.2.13"
+ resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
+ integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ fragment-cache "^0.2.1"
+ is-windows "^1.0.2"
+ kind-of "^6.0.2"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+ integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
+
+nice-try@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
+ integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
+
+node-addon-api@^1.7.1:
+ version "1.7.2"
+ resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.7.2.tgz#3df30b95720b53c24e59948b49532b662444f54d"
+ integrity sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==
+
+node-forge@^0.10.0:
+ version "0.10.0"
+ resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3"
+ integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==
+
+node-libs-browser@^2.0.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425"
+ integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==
+ dependencies:
+ assert "^1.1.1"
+ browserify-zlib "^0.2.0"
+ buffer "^4.3.0"
+ console-browserify "^1.1.0"
+ constants-browserify "^1.0.0"
+ crypto-browserify "^3.11.0"
+ domain-browser "^1.1.1"
+ events "^3.0.0"
+ https-browserify "^1.0.0"
+ os-browserify "^0.3.0"
+ path-browserify "0.0.1"
+ process "^0.11.10"
+ punycode "^1.2.4"
+ querystring-es3 "^0.2.0"
+ readable-stream "^2.3.3"
+ stream-browserify "^2.0.1"
+ stream-http "^2.7.2"
+ string_decoder "^1.0.0"
+ timers-browserify "^2.0.4"
+ tty-browserify "0.0.0"
+ url "^0.11.0"
+ util "^0.11.0"
+ vm-browserify "^1.0.1"
+
+node-releases@^1.1.70:
+ version "1.1.71"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb"
+ integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==
+
+normalize-path@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+ integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=
+ dependencies:
+ remove-trailing-separator "^1.0.1"
+
+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==
+
+normalize-url@^3.0.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559"
+ integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==
+
+npm-bundled@^1.0.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b"
+ integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==
+ dependencies:
+ npm-normalize-package-bin "^1.0.1"
+
+npm-normalize-package-bin@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2"
+ integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==
+
+npm-packlist@^1.4.1:
+ version "1.4.8"
+ resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e"
+ integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==
+ dependencies:
+ ignore-walk "^3.0.1"
+ npm-bundled "^1.0.1"
+ npm-normalize-package-bin "^1.0.1"
+
+nth-check@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c"
+ integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==
+ dependencies:
+ boolbase "~1.0.0"
+
+nwsapi@^2.1.3:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7"
+ integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==
+
+oauth-sign@~0.9.0:
+ version "0.9.0"
+ resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
+ integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
+
+object-assign@^4.0.1, object-assign@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
+
+object-copy@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+ integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw=
+ dependencies:
+ copy-descriptor "^0.1.0"
+ define-property "^0.2.5"
+ kind-of "^3.0.3"
+
+object-inspect@^1.9.0:
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a"
+ integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==
+
+object-inspect@~1.4.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.4.1.tgz#37ffb10e71adaf3748d05f713b4c9452f402cbc4"
+ integrity sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw==
+
+object-keys@^1.0.12, object-keys@^1.0.6, object-keys@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object-visit@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+ integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=
+ dependencies:
+ isobject "^3.0.0"
+
+object.assign@^4.1.0, object.assign@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940"
+ integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==
+ dependencies:
+ call-bind "^1.0.0"
+ define-properties "^1.1.3"
+ has-symbols "^1.0.1"
+ object-keys "^1.1.1"
+
+object.getownpropertydescriptors@^2.1.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7"
+ integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.18.0-next.2"
+
+object.pick@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+ integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=
+ dependencies:
+ isobject "^3.0.1"
+
+object.values@^1.1.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.3.tgz#eaa8b1e17589f02f698db093f7c62ee1699742ee"
+ integrity sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.18.0-next.2"
+ has "^1.0.3"
+
+on-finished@~2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
+ integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
+ dependencies:
+ ee-first "1.1.1"
+
+once@^1.3.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
+ dependencies:
+ wrappy "1"
+
+onetime@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
+ integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=
+ dependencies:
+ mimic-fn "^1.0.0"
+
+opn@^5.1.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc"
+ integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==
+ dependencies:
+ is-wsl "^1.1.0"
+
+optionator@^0.8.1, optionator@^0.8.2:
+ version "0.8.3"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
+ integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==
+ dependencies:
+ deep-is "~0.1.3"
+ fast-levenshtein "~2.0.6"
+ levn "~0.3.0"
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+ word-wrap "~1.2.3"
+
+ora@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/ora/-/ora-2.1.0.tgz#6caf2830eb924941861ec53a173799e008b51e5b"
+ integrity sha512-hNNlAd3gfv/iPmsNxYoAPLvxg7HuPozww7fFonMZvL84tP6Ox5igfk5j/+a9rtJJwqMgKK+JgWsAQik5o0HTLA==
+ dependencies:
+ chalk "^2.3.1"
+ cli-cursor "^2.1.0"
+ cli-spinners "^1.1.0"
+ log-symbols "^2.2.0"
+ strip-ansi "^4.0.0"
+ wcwidth "^1.0.1"
+
+os-browserify@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
+ integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=
+
+os-tmpdir@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+ integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
+
+pako@^0.2.5:
+ version "0.2.9"
+ resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75"
+ integrity sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=
+
+pako@~1.0.5:
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
+ integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
+
+parcel-bundler@~1.12.5:
+ version "1.12.5"
+ resolved "https://registry.yarnpkg.com/parcel-bundler/-/parcel-bundler-1.12.5.tgz#91f7de1c1fbfe5111616d3211c749c85c4d8acf0"
+ integrity sha512-hpku8mW67U6PXQIenW6NBbphBOMb8XzW6B9r093DUhYj5GN2FUB/CXCiz5hKoPYUsusZ35BpProH8AUF9bh5IQ==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ "@babel/core" "^7.4.4"
+ "@babel/generator" "^7.4.4"
+ "@babel/parser" "^7.4.4"
+ "@babel/plugin-transform-flow-strip-types" "^7.4.4"
+ "@babel/plugin-transform-modules-commonjs" "^7.4.4"
+ "@babel/plugin-transform-react-jsx" "^7.0.0"
+ "@babel/preset-env" "^7.4.4"
+ "@babel/runtime" "^7.4.4"
+ "@babel/template" "^7.4.4"
+ "@babel/traverse" "^7.4.4"
+ "@babel/types" "^7.4.4"
+ "@iarna/toml" "^2.2.0"
+ "@parcel/fs" "^1.11.0"
+ "@parcel/logger" "^1.11.1"
+ "@parcel/utils" "^1.11.0"
+ "@parcel/watcher" "^1.12.1"
+ "@parcel/workers" "^1.11.0"
+ ansi-to-html "^0.6.4"
+ babylon-walk "^1.0.2"
+ browserslist "^4.1.0"
+ chalk "^2.1.0"
+ clone "^2.1.1"
+ command-exists "^1.2.6"
+ commander "^2.11.0"
+ core-js "^2.6.5"
+ cross-spawn "^6.0.4"
+ css-modules-loader-core "^1.1.0"
+ cssnano "^4.0.0"
+ deasync "^0.1.14"
+ dotenv "^5.0.0"
+ dotenv-expand "^5.1.0"
+ envinfo "^7.3.1"
+ fast-glob "^2.2.2"
+ filesize "^3.6.0"
+ get-port "^3.2.0"
+ htmlnano "^0.2.2"
+ is-glob "^4.0.0"
+ is-url "^1.2.2"
+ js-yaml "^3.10.0"
+ json5 "^1.0.1"
+ micromatch "^3.0.4"
+ mkdirp "^0.5.1"
+ node-forge "^0.10.0"
+ node-libs-browser "^2.0.0"
+ opn "^5.1.0"
+ postcss "^7.0.11"
+ postcss-value-parser "^3.3.1"
+ posthtml "^0.11.2"
+ posthtml-parser "^0.4.0"
+ posthtml-render "^1.1.3"
+ resolve "^1.4.0"
+ semver "^5.4.1"
+ serialize-to-js "^3.0.0"
+ serve-static "^1.12.4"
+ source-map "0.6.1"
+ terser "^3.7.3"
+ v8-compile-cache "^2.0.0"
+ ws "^5.1.1"
+
+parse-asn1@^5.0.0, parse-asn1@^5.1.5:
+ version "5.1.6"
+ resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4"
+ integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==
+ dependencies:
+ asn1.js "^5.2.0"
+ browserify-aes "^1.0.0"
+ evp_bytestokey "^1.0.0"
+ pbkdf2 "^3.0.3"
+ safe-buffer "^5.1.1"
+
+parse-json@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
+ integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=
+ dependencies:
+ error-ex "^1.3.1"
+ json-parse-better-errors "^1.0.1"
+
+parse5@5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2"
+ integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==
+
+parseurl@~1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
+ integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
+
+pascalcase@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+ integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
+
+path-browserify@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a"
+ integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==
+
+path-dirname@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
+ integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=
+
+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 sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
+
+path-is-inside@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
+ integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=
+
+path-key@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+ integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
+
+path-parse@^1.0.6:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+pbkdf2@^3.0.3:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94"
+ integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==
+ dependencies:
+ create-hash "^1.1.2"
+ create-hmac "^1.1.4"
+ ripemd160 "^2.0.1"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+performance-now@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
+ integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
+
+physical-cpu-count@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/physical-cpu-count/-/physical-cpu-count-2.0.0.tgz#18de2f97e4bf7a9551ad7511942b5496f7aba660"
+ integrity sha1-GN4vl+S/epVRrXURlCtUlverpmA=
+
+plotly.js-dist@^1.39.4:
+ version "1.58.4"
+ resolved "https://registry.yarnpkg.com/plotly.js-dist/-/plotly.js-dist-1.58.4.tgz#d57b73d27af57a0d6cd2cf9428a001962889cf5b"
+ integrity sha512-oXCTRJFN8FBsHZSQPYoM3LuJQchPUrf6sOXFC0EFdvcr5lmJmLcAsW74jDy9PkRpm3PB+A+2oY1hsUMmk2eZbw==
+
+pluralize@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777"
+ integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==
+
+pn@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb"
+ integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==
+
+posix-character-classes@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+ integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
+
+postcss-calc@^7.0.1:
+ version "7.0.5"
+ resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.5.tgz#f8a6e99f12e619c2ebc23cf6c486fdc15860933e"
+ integrity sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==
+ dependencies:
+ postcss "^7.0.27"
+ postcss-selector-parser "^6.0.2"
+ postcss-value-parser "^4.0.2"
+
+postcss-colormin@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381"
+ integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==
+ dependencies:
+ browserslist "^4.0.0"
+ color "^3.0.0"
+ has "^1.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-convert-values@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f"
+ integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==
+ dependencies:
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-discard-comments@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033"
+ integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==
+ dependencies:
+ postcss "^7.0.0"
+
+postcss-discard-duplicates@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb"
+ integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==
+ dependencies:
+ postcss "^7.0.0"
+
+postcss-discard-empty@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765"
+ integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==
+ dependencies:
+ postcss "^7.0.0"
+
+postcss-discard-overridden@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57"
+ integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==
+ dependencies:
+ postcss "^7.0.0"
+
+postcss-merge-longhand@^4.0.11:
+ version "4.0.11"
+ resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24"
+ integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==
+ dependencies:
+ css-color-names "0.0.4"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+ stylehacks "^4.0.0"
+
+postcss-merge-rules@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650"
+ integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==
+ dependencies:
+ browserslist "^4.0.0"
+ caniuse-api "^3.0.0"
+ cssnano-util-same-parent "^4.0.0"
+ postcss "^7.0.0"
+ postcss-selector-parser "^3.0.0"
+ vendors "^1.0.0"
+
+postcss-minify-font-values@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6"
+ integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==
+ dependencies:
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-minify-gradients@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471"
+ integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==
+ dependencies:
+ cssnano-util-get-arguments "^4.0.0"
+ is-color-stop "^1.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-minify-params@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874"
+ integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==
+ dependencies:
+ alphanum-sort "^1.0.0"
+ browserslist "^4.0.0"
+ cssnano-util-get-arguments "^4.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+ uniqs "^2.0.0"
+
+postcss-minify-selectors@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8"
+ integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==
+ dependencies:
+ alphanum-sort "^1.0.0"
+ has "^1.0.0"
+ postcss "^7.0.0"
+ postcss-selector-parser "^3.0.0"
+
+postcss-modules-extract-imports@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz#b614c9720be6816eaee35fb3a5faa1dba6a05ddb"
+ integrity sha1-thTJcgvmgW6u41+zpfqh26agXds=
+ dependencies:
+ postcss "^6.0.1"
+
+postcss-modules-local-by-default@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069"
+ integrity sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=
+ dependencies:
+ css-selector-tokenizer "^0.7.0"
+ postcss "^6.0.1"
+
+postcss-modules-scope@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90"
+ integrity sha1-1upkmUx5+XtipytCb75gVqGUu5A=
+ dependencies:
+ css-selector-tokenizer "^0.7.0"
+ postcss "^6.0.1"
+
+postcss-modules-values@1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20"
+ integrity sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=
+ dependencies:
+ icss-replace-symbols "^1.1.0"
+ postcss "^6.0.1"
+
+postcss-normalize-charset@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4"
+ integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==
+ dependencies:
+ postcss "^7.0.0"
+
+postcss-normalize-display-values@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a"
+ integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==
+ dependencies:
+ cssnano-util-get-match "^4.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-positions@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f"
+ integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==
+ dependencies:
+ cssnano-util-get-arguments "^4.0.0"
+ has "^1.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-repeat-style@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c"
+ integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==
+ dependencies:
+ cssnano-util-get-arguments "^4.0.0"
+ cssnano-util-get-match "^4.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-string@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c"
+ integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==
+ dependencies:
+ has "^1.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-timing-functions@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9"
+ integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==
+ dependencies:
+ cssnano-util-get-match "^4.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-unicode@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb"
+ integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==
+ dependencies:
+ browserslist "^4.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-url@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1"
+ integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==
+ dependencies:
+ is-absolute-url "^2.0.0"
+ normalize-url "^3.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-whitespace@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82"
+ integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==
+ dependencies:
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-ordered-values@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee"
+ integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==
+ dependencies:
+ cssnano-util-get-arguments "^4.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-reduce-initial@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df"
+ integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==
+ dependencies:
+ browserslist "^4.0.0"
+ caniuse-api "^3.0.0"
+ has "^1.0.0"
+ postcss "^7.0.0"
+
+postcss-reduce-transforms@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29"
+ integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==
+ dependencies:
+ cssnano-util-get-match "^4.0.0"
+ has "^1.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-selector-parser@6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c"
+ integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==
+ dependencies:
+ cssesc "^3.0.0"
+ indexes-of "^1.0.1"
+ uniq "^1.0.1"
+
+postcss-selector-parser@^3.0.0:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270"
+ integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==
+ dependencies:
+ dot-prop "^5.2.0"
+ indexes-of "^1.0.1"
+ uniq "^1.0.1"
+
+postcss-selector-parser@^6.0.2:
+ version "6.0.4"
+ resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz#56075a1380a04604c38b063ea7767a129af5c2b3"
+ integrity sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==
+ dependencies:
+ cssesc "^3.0.0"
+ indexes-of "^1.0.1"
+ uniq "^1.0.1"
+ util-deprecate "^1.0.2"
+
+postcss-svgo@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258"
+ integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==
+ dependencies:
+ is-svg "^3.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+ svgo "^1.0.0"
+
+postcss-unique-selectors@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac"
+ integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==
+ dependencies:
+ alphanum-sort "^1.0.0"
+ postcss "^7.0.0"
+ uniqs "^2.0.0"
+
+postcss-value-parser@^3.0.0, postcss-value-parser@^3.3.1:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281"
+ integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==
+
+postcss-value-parser@^4.0.2:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb"
+ integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==
+
+postcss@6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.1.tgz#000dbd1f8eef217aa368b9a212c5fc40b2a8f3f2"
+ integrity sha1-AA29H47vIXqjaLmiEsX8QLKo8/I=
+ dependencies:
+ chalk "^1.1.3"
+ source-map "^0.5.6"
+ supports-color "^3.2.3"
+
+postcss@7.0.32:
+ version "7.0.32"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d"
+ integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==
+ dependencies:
+ chalk "^2.4.2"
+ source-map "^0.6.1"
+ supports-color "^6.1.0"
+
+postcss@^6.0.1:
+ version "6.0.23"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324"
+ integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==
+ dependencies:
+ chalk "^2.4.1"
+ source-map "^0.6.1"
+ supports-color "^5.4.0"
+
+postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.11, postcss@^7.0.17, postcss@^7.0.27:
+ version "7.0.35"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24"
+ integrity sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==
+ dependencies:
+ chalk "^2.4.2"
+ source-map "^0.6.1"
+ supports-color "^6.1.0"
+
+posthtml-parser@^0.4.0, posthtml-parser@^0.4.1:
+ version "0.4.2"
+ resolved "https://registry.yarnpkg.com/posthtml-parser/-/posthtml-parser-0.4.2.tgz#a132bbdf0cd4bc199d34f322f5c1599385d7c6c1"
+ integrity sha512-BUIorsYJTvS9UhXxPTzupIztOMVNPa/HtAm9KHni9z6qEfiJ1bpOBL5DfUOL9XAc3XkLIEzBzpph+Zbm4AdRAg==
+ dependencies:
+ htmlparser2 "^3.9.2"
+
+posthtml-parser@^0.5.0:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/posthtml-parser/-/posthtml-parser-0.5.3.tgz#e95b92e57d98da50b443e116fcee39466cd9012e"
+ integrity sha512-uHosRn0y+1wbnlYKrqMjBPoo/kK5LPYImLtiETszNFYfFwAD3cQdD1R2E13Mh5icBxkHj+yKtlIHozCsmVWD/Q==
+ dependencies:
+ htmlparser2 "^3.9.2"
+
+posthtml-render@^1.1.3, posthtml-render@^1.1.5, posthtml-render@^1.2.3, posthtml-render@^1.3.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/posthtml-render/-/posthtml-render-1.3.1.tgz#260f15bc43cdf7ea008bf0cc35253fb27e4d03fd"
+ integrity sha512-eSToKjNLu0FiF76SSGMHjOFXYzAc/CJqi677Sq6hYvcvFCBtD6de/W5l+0IYPf7ypscqAfjCttxvTdMJt5Gj8Q==
+
+posthtml@^0.11.2:
+ version "0.11.6"
+ resolved "https://registry.yarnpkg.com/posthtml/-/posthtml-0.11.6.tgz#e349d51af7929d0683b9d8c3abd8166beecc90a8"
+ integrity sha512-C2hrAPzmRdpuL3iH0TDdQ6XCc9M7Dcc3zEW5BLerY65G4tWWszwv6nG/ksi6ul5i2mx22ubdljgktXCtNkydkw==
+ dependencies:
+ posthtml-parser "^0.4.1"
+ posthtml-render "^1.1.5"
+
+posthtml@^0.13.4:
+ version "0.13.4"
+ resolved "https://registry.yarnpkg.com/posthtml/-/posthtml-0.13.4.tgz#ad81b3fa62b85f81ccdb5710f4ec375a4ed94934"
+ integrity sha512-i2oTo/+dwXGC6zaAQSF6WZEQSbEqu10hsvg01DWzGAfZmy31Iiy9ktPh9nnXDfZiYytjxTIvxoK4TI0uk4QWpw==
+ dependencies:
+ posthtml-parser "^0.5.0"
+ posthtml-render "^1.2.3"
+
+prelude-ls@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
+ integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
+
+private@^0.1.6:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
+ integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==
+
+process-nextick-args@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
+ integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+
+process@^0.11.10:
+ version "0.11.10"
+ resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+ integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
+
+progress@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
+ integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
+
+pseudomap@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+ integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
+
+psl@^1.1.28:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
+ integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==
+
+public-encrypt@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0"
+ integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==
+ dependencies:
+ bn.js "^4.1.0"
+ browserify-rsa "^4.0.0"
+ create-hash "^1.1.0"
+ parse-asn1 "^5.0.0"
+ randombytes "^2.0.1"
+ safe-buffer "^5.1.2"
+
+punycode@1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+ integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=
+
+punycode@^1.2.4:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+ integrity sha1-wNWmOycYgArY4esPpSachN1BhF4=
+
+punycode@^2.1.0, punycode@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+ integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+
+purgecss@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/purgecss/-/purgecss-2.3.0.tgz#5327587abf5795e6541517af8b190a6fb5488bb3"
+ integrity sha512-BE5CROfVGsx2XIhxGuZAT7rTH9lLeQx/6M0P7DTXQH4IUc3BBzs9JUzt4yzGf3JrH9enkeq6YJBe9CTtkm1WmQ==
+ dependencies:
+ commander "^5.0.0"
+ glob "^7.0.0"
+ postcss "7.0.32"
+ postcss-selector-parser "^6.0.2"
+
+q@^1.1.2:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
+ integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=
+
+qs@~6.5.2:
+ version "6.5.2"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
+ integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
+
+querystring-es3@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
+ integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=
+
+querystring@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+ integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
+
+quote-stream@^1.0.1, quote-stream@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/quote-stream/-/quote-stream-1.0.2.tgz#84963f8c9c26b942e153feeb53aae74652b7e0b2"
+ integrity sha1-hJY/jJwmuULhU/7rU6rnRlK34LI=
+ dependencies:
+ buffer-equal "0.0.1"
+ minimist "^1.1.3"
+ through2 "^2.0.0"
+
+randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
+ integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
+ dependencies:
+ safe-buffer "^5.1.0"
+
+randomfill@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
+ integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==
+ dependencies:
+ randombytes "^2.0.5"
+ safe-buffer "^5.1.0"
+
+range-parser@~1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
+ integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
+
+readable-stream@^2.0.2, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.3, readable-stream@~2.3.6:
+ version "2.3.7"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
+ integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.3"
+ isarray "~1.0.0"
+ process-nextick-args "~2.0.0"
+ safe-buffer "~5.1.1"
+ string_decoder "~1.1.1"
+ util-deprecate "~1.0.1"
+
+readable-stream@^3.1.1, readable-stream@^3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
+ integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
+ dependencies:
+ inherits "^2.0.3"
+ string_decoder "^1.1.1"
+ util-deprecate "^1.0.1"
+
+readdirp@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525"
+ integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==
+ dependencies:
+ graceful-fs "^4.1.11"
+ micromatch "^3.1.10"
+ readable-stream "^2.0.2"
+
+regenerate-unicode-properties@^8.2.0:
+ version "8.2.0"
+ resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec"
+ integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==
+ dependencies:
+ regenerate "^1.4.0"
+
+regenerate@^1.2.1, regenerate@^1.4.0:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a"
+ integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==
+
+regenerator-runtime@^0.10.5:
+ version "0.10.5"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658"
+ integrity sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=
+
+regenerator-runtime@^0.11.0:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
+ integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
+
+regenerator-runtime@^0.13.4:
+ version "0.13.7"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55"
+ integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==
+
+regenerator-transform@^0.10.0:
+ version "0.10.1"
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd"
+ integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==
+ dependencies:
+ babel-runtime "^6.18.0"
+ babel-types "^6.19.0"
+ private "^0.1.6"
+
+regenerator-transform@^0.14.2:
+ version "0.14.5"
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4"
+ integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==
+ dependencies:
+ "@babel/runtime" "^7.8.4"
+
+regex-not@^1.0.0, regex-not@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+ integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==
+ dependencies:
+ extend-shallow "^3.0.2"
+ safe-regex "^1.1.0"
+
+regexpp@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab"
+ integrity sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==
+
+regexpu-core@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240"
+ integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=
+ dependencies:
+ regenerate "^1.2.1"
+ regjsgen "^0.2.0"
+ regjsparser "^0.1.4"
+
+regexpu-core@^4.7.1:
+ version "4.7.1"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6"
+ integrity sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==
+ dependencies:
+ regenerate "^1.4.0"
+ regenerate-unicode-properties "^8.2.0"
+ regjsgen "^0.5.1"
+ regjsparser "^0.6.4"
+ unicode-match-property-ecmascript "^1.0.4"
+ unicode-match-property-value-ecmascript "^1.2.0"
+
+regjsgen@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
+ integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=
+
+regjsgen@^0.5.1:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733"
+ integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==
+
+regjsparser@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
+ integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=
+ dependencies:
+ jsesc "~0.5.0"
+
+regjsparser@^0.6.4:
+ version "0.6.9"
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.9.tgz#b489eef7c9a2ce43727627011429cf833a7183e6"
+ integrity sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==
+ dependencies:
+ jsesc "~0.5.0"
+
+relateurl@^0.2.7:
+ version "0.2.7"
+ resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
+ integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=
+
+remove-trailing-separator@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+ integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8=
+
+repeat-element@^1.1.2:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce"
+ integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==
+
+repeat-string@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+ integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
+
+request-promise-core@1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f"
+ integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==
+ dependencies:
+ lodash "^4.17.19"
+
+request-promise-native@^1.0.5:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28"
+ integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==
+ dependencies:
+ request-promise-core "1.1.4"
+ stealthy-require "^1.1.1"
+ tough-cookie "^2.3.3"
+
+request@^2.88.0:
+ version "2.88.2"
+ resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
+ integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
+ dependencies:
+ aws-sign2 "~0.7.0"
+ aws4 "^1.8.0"
+ caseless "~0.12.0"
+ combined-stream "~1.0.6"
+ extend "~3.0.2"
+ forever-agent "~0.6.1"
+ form-data "~2.3.2"
+ har-validator "~5.1.3"
+ http-signature "~1.2.0"
+ is-typedarray "~1.0.0"
+ isstream "~0.1.2"
+ json-stringify-safe "~5.0.1"
+ mime-types "~2.1.19"
+ oauth-sign "~0.9.0"
+ performance-now "^2.1.0"
+ qs "~6.5.2"
+ safe-buffer "^5.1.2"
+ tough-cookie "~2.5.0"
+ tunnel-agent "^0.6.0"
+ uuid "^3.3.2"
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
+
+require-uncached@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3"
+ integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=
+ dependencies:
+ caller-path "^0.1.0"
+ resolve-from "^1.0.0"
+
+resolve-from@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226"
+ integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=
+
+resolve-from@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
+ integrity sha1-six699nWiBvItuZTM17rywoYh0g=
+
+resolve-url@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+ integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
+
+resolve@^1.1.5, resolve@^1.1.6, resolve@^1.14.2, resolve@^1.4.0:
+ version "1.20.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
+ integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
+ dependencies:
+ is-core-module "^2.2.0"
+ path-parse "^1.0.6"
+
+restore-cursor@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
+ integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368=
+ dependencies:
+ onetime "^2.0.0"
+ signal-exit "^3.0.2"
+
+ret@~0.1.10:
+ version "0.1.15"
+ resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+ integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
+
+rgb-regex@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1"
+ integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE=
+
+rgba-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3"
+ integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=
+
+rimraf@^2.6.2:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
+ integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
+ dependencies:
+ glob "^7.1.3"
+
+rimraf@~2.6.2:
+ version "2.6.3"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
+ integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
+ dependencies:
+ glob "^7.1.3"
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
+ integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+
+run-async@^2.2.0:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455"
+ integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==
+
+rx-lite-aggregates@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be"
+ integrity sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=
+ dependencies:
+ rx-lite "*"
+
+rx-lite@*, rx-lite@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444"
+ integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+safe-regex@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+ integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4=
+ dependencies:
+ ret "~0.1.10"
+
+"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+sax@~1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+ integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
+
+saxes@^3.1.9:
+ version "3.1.11"
+ resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b"
+ integrity sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==
+ dependencies:
+ xmlchars "^2.1.1"
+
+semver@7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
+ integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
+
+semver@^5.3.0, semver@^5.4.1, semver@^5.5.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
+ integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
+
+semver@^6.1.1, semver@^6.1.2, semver@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
+ integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
+
+send@0.17.1:
+ version "0.17.1"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"
+ integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==
+ dependencies:
+ debug "2.6.9"
+ depd "~1.1.2"
+ destroy "~1.0.4"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ fresh "0.5.2"
+ http-errors "~1.7.2"
+ mime "1.6.0"
+ ms "2.1.1"
+ on-finished "~2.3.0"
+ range-parser "~1.2.1"
+ statuses "~1.5.0"
+
+serialize-to-js@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/serialize-to-js/-/serialize-to-js-3.1.1.tgz#b3e77d0568ee4a60bfe66287f991e104d3a1a4ac"
+ integrity sha512-F+NGU0UHMBO4Q965tjw7rvieNVjlH6Lqi2emq/Lc9LUURYJbiCzmpi4Cy1OOjjVPtxu0c+NE85LU6968Wko5ZA==
+
+serve-static@^1.12.4:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9"
+ integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==
+ dependencies:
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ parseurl "~1.3.3"
+ send "0.17.1"
+
+set-value@^2.0.0, set-value@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b"
+ integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.3"
+ split-string "^3.0.1"
+
+setimmediate@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+ integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=
+
+setprototypeof@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
+ integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
+
+sha.js@^2.4.0, sha.js@^2.4.8:
+ version "2.4.11"
+ resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
+ integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+shallow-copy@~0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/shallow-copy/-/shallow-copy-0.0.1.tgz#415f42702d73d810330292cc5ee86eae1a11a170"
+ integrity sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=
+
+shebang-command@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+ integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
+ dependencies:
+ shebang-regex "^1.0.0"
+
+shebang-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+ integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
+
+signal-exit@^3.0.2:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
+ integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
+
+simple-swizzle@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
+ integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=
+ dependencies:
+ is-arrayish "^0.3.1"
+
+slice-ansi@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d"
+ integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==
+ dependencies:
+ is-fullwidth-code-point "^2.0.0"
+
+snapdragon-node@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+ integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==
+ dependencies:
+ define-property "^1.0.0"
+ isobject "^3.0.0"
+ snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+ integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==
+ dependencies:
+ kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
+ integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==
+ dependencies:
+ base "^0.11.1"
+ debug "^2.2.0"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ map-cache "^0.2.2"
+ source-map "^0.5.6"
+ source-map-resolve "^0.5.0"
+ use "^3.1.0"
+
+source-map-resolve@^0.5.0:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a"
+ integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==
+ dependencies:
+ atob "^2.1.2"
+ decode-uri-component "^0.2.0"
+ resolve-url "^0.2.1"
+ source-map-url "^0.4.0"
+ urix "^0.1.0"
+
+source-map-support@~0.5.10, source-map-support@~0.5.12:
+ version "0.5.19"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
+ integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map-url@^0.4.0:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56"
+ integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==
+
+source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, 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==
+
+source-map@^0.5.0, source-map@^0.5.6:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+ integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
+
+split-string@^3.0.1, split-string@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+ integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==
+ dependencies:
+ extend-shallow "^3.0.0"
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+ integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
+
+srcset@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/srcset/-/srcset-3.0.0.tgz#8afd8b971362dfc129ae9c1a99b3897301ce6441"
+ integrity sha512-D59vF08Qzu/C4GAOXVgMTLfgryt5fyWo93FZyhEWANo0PokFz/iWdDe13mX3O5TRf6l8vMTqckAfR4zPiaH0yQ==
+
+sshpk@^1.7.0:
+ version "1.16.1"
+ resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877"
+ integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==
+ dependencies:
+ asn1 "~0.2.3"
+ assert-plus "^1.0.0"
+ bcrypt-pbkdf "^1.0.0"
+ dashdash "^1.12.0"
+ ecc-jsbn "~0.1.1"
+ getpass "^0.1.1"
+ jsbn "~0.1.0"
+ safer-buffer "^2.0.2"
+ tweetnacl "~0.14.0"
+
+stable@^0.1.8:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf"
+ integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==
+
+static-eval@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.1.0.tgz#a16dbe54522d7fa5ef1389129d813fd47b148014"
+ integrity sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw==
+ dependencies:
+ escodegen "^1.11.1"
+
+static-extend@^0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+ integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=
+ dependencies:
+ define-property "^0.2.5"
+ object-copy "^0.1.0"
+
+static-module@^2.2.0:
+ version "2.2.5"
+ resolved "https://registry.yarnpkg.com/static-module/-/static-module-2.2.5.tgz#bd40abceae33da6b7afb84a0e4329ff8852bfbbf"
+ integrity sha512-D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ==
+ dependencies:
+ concat-stream "~1.6.0"
+ convert-source-map "^1.5.1"
+ duplexer2 "~0.1.4"
+ escodegen "~1.9.0"
+ falafel "^2.1.0"
+ has "^1.0.1"
+ magic-string "^0.22.4"
+ merge-source-map "1.0.4"
+ object-inspect "~1.4.0"
+ quote-stream "~1.0.2"
+ readable-stream "~2.3.3"
+ shallow-copy "~0.0.1"
+ static-eval "^2.0.0"
+ through2 "~2.0.3"
+
+stats.js@^0.17.0:
+ version "0.17.0"
+ resolved "https://registry.yarnpkg.com/stats.js/-/stats.js-0.17.0.tgz#b1c3dc46d94498b578b7fd3985b81ace7131cc7d"
+ integrity sha1-scPcRtlEmLV4t/05hbgaznExzH0=
+
+"statuses@>= 1.5.0 < 2", statuses@~1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
+ integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
+
+stealthy-require@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
+ integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=
+
+stream-browserify@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b"
+ integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==
+ dependencies:
+ inherits "~2.0.1"
+ readable-stream "^2.0.2"
+
+stream-http@^2.7.2:
+ version "2.8.3"
+ resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc"
+ integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==
+ dependencies:
+ builtin-status-codes "^3.0.0"
+ inherits "^2.0.1"
+ readable-stream "^2.3.6"
+ to-arraybuffer "^1.0.0"
+ xtend "^4.0.0"
+
+string-width@^2.1.0, string-width@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+ integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
+ dependencies:
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^4.0.0"
+
+string-width@^4.1.0, string-width@^4.2.0:
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5"
+ integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.0"
+
+string.prototype.trimend@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80"
+ integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+string.prototype.trimstart@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed"
+ integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+string_decoder@^1.0.0, string_decoder@^1.1.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
+ integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+ dependencies:
+ safe-buffer "~5.2.0"
+
+string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+ integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+ dependencies:
+ safe-buffer "~5.1.0"
+
+strip-ansi@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+ integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
+ dependencies:
+ ansi-regex "^2.0.0"
+
+strip-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+ integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8=
+ dependencies:
+ ansi-regex "^3.0.0"
+
+strip-ansi@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
+ integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
+ dependencies:
+ ansi-regex "^5.0.0"
+
+strip-json-comments@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+ integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
+
+stylehacks@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5"
+ integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==
+ dependencies:
+ browserslist "^4.0.0"
+ postcss "^7.0.0"
+ postcss-selector-parser "^3.0.0"
+
+supports-color@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+ integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=
+
+supports-color@^3.2.3:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
+ integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=
+ dependencies:
+ has-flag "^1.0.0"
+
+supports-color@^5.3.0, supports-color@^5.4.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@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3"
+ integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==
+ 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"
+
+svgo@^1.0.0, svgo@^1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167"
+ integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==
+ dependencies:
+ chalk "^2.4.1"
+ coa "^2.0.2"
+ css-select "^2.0.0"
+ css-select-base-adapter "^0.1.1"
+ css-tree "1.0.0-alpha.37"
+ csso "^4.0.2"
+ js-yaml "^3.13.1"
+ mkdirp "~0.5.1"
+ object.values "^1.1.0"
+ sax "~1.2.4"
+ stable "^0.1.8"
+ unquote "~1.1.1"
+ util.promisify "~1.0.0"
+
+symbol-tree@^3.2.2:
+ version "3.2.4"
+ resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
+ integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
+
+table@4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36"
+ integrity sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==
+ dependencies:
+ ajv "^5.2.3"
+ ajv-keywords "^2.1.0"
+ chalk "^2.1.0"
+ lodash "^4.17.4"
+ slice-ansi "1.0.0"
+ string-width "^2.1.1"
+
+terser@^3.7.3:
+ version "3.17.0"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-3.17.0.tgz#f88ffbeda0deb5637f9d24b0da66f4e15ab10cb2"
+ integrity sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==
+ dependencies:
+ commander "^2.19.0"
+ source-map "~0.6.1"
+ source-map-support "~0.5.10"
+
+terser@^4.8.0:
+ version "4.8.0"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17"
+ integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==
+ dependencies:
+ commander "^2.20.0"
+ source-map "~0.6.1"
+ source-map-support "~0.5.12"
+
+text-table@~0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+ integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
+
+through2@^2.0.0, through2@~2.0.3:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
+ integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
+ dependencies:
+ readable-stream "~2.3.6"
+ xtend "~4.0.1"
+
+through@^2.3.6:
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+ integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
+
+timers-browserify@^2.0.4:
+ version "2.0.12"
+ resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee"
+ integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==
+ dependencies:
+ setimmediate "^1.0.4"
+
+timsort@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4"
+ integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=
+
+tiny-inflate@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/tiny-inflate/-/tiny-inflate-1.0.3.tgz#122715494913a1805166aaf7c93467933eea26c4"
+ integrity sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==
+
+tmp@^0.0.33:
+ version "0.0.33"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
+ integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
+ dependencies:
+ os-tmpdir "~1.0.2"
+
+to-arraybuffer@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
+ integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=
+
+to-fast-properties@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
+ integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=
+
+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 sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=
+
+to-object-path@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+ integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=
+ dependencies:
+ kind-of "^3.0.2"
+
+to-regex-range@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+ integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=
+ dependencies:
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+
+to-regex@^3.0.1, to-regex@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+ integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==
+ dependencies:
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ regex-not "^1.0.2"
+ safe-regex "^1.1.0"
+
+toidentifier@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
+ integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
+
+tough-cookie@^2.3.3, tough-cookie@^2.5.0, tough-cookie@~2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
+ integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
+ dependencies:
+ psl "^1.1.28"
+ punycode "^2.1.1"
+
+tr46@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09"
+ integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=
+ dependencies:
+ punycode "^2.1.0"
+
+tty-browserify@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
+ integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=
+
+tunnel-agent@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+ integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
+ dependencies:
+ safe-buffer "^5.0.1"
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+ version "0.14.5"
+ resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+ integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
+
+type-check@~0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
+ integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=
+ dependencies:
+ prelude-ls "~1.1.2"
+
+typedarray@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+ integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
+
+unbox-primitive@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471"
+ integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==
+ dependencies:
+ function-bind "^1.1.1"
+ has-bigints "^1.0.1"
+ has-symbols "^1.0.2"
+ which-boxed-primitive "^1.0.2"
+
+uncss@^0.17.3:
+ version "0.17.3"
+ resolved "https://registry.yarnpkg.com/uncss/-/uncss-0.17.3.tgz#50fc1eb4ed573ffff763458d801cd86e4d69ea11"
+ integrity sha512-ksdDWl81YWvF/X14fOSw4iu8tESDHFIeyKIeDrK6GEVTQvqJc1WlOEXqostNwOCi3qAj++4EaLsdAgPmUbEyog==
+ dependencies:
+ commander "^2.20.0"
+ glob "^7.1.4"
+ is-absolute-url "^3.0.1"
+ is-html "^1.1.0"
+ jsdom "^14.1.0"
+ lodash "^4.17.15"
+ postcss "^7.0.17"
+ postcss-selector-parser "6.0.2"
+ request "^2.88.0"
+
+unicode-canonical-property-names-ecmascript@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818"
+ integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==
+
+unicode-match-property-ecmascript@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c"
+ integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==
+ dependencies:
+ unicode-canonical-property-names-ecmascript "^1.0.4"
+ unicode-property-aliases-ecmascript "^1.0.4"
+
+unicode-match-property-value-ecmascript@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531"
+ integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==
+
+unicode-property-aliases-ecmascript@^1.0.4:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4"
+ integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==
+
+unicode-trie@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/unicode-trie/-/unicode-trie-0.3.1.tgz#d671dddd89101a08bac37b6a5161010602052085"
+ integrity sha1-1nHd3YkQGgi6w3tqUWEBBgIFIIU=
+ dependencies:
+ pako "^0.2.5"
+ tiny-inflate "^1.0.0"
+
+union-value@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847"
+ integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==
+ dependencies:
+ arr-union "^3.1.0"
+ get-value "^2.0.6"
+ is-extendable "^0.1.1"
+ set-value "^2.0.1"
+
+uniq@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
+ integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=
+
+uniqs@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02"
+ integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI=
+
+universalify@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
+ integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
+
+unquote@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544"
+ integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=
+
+unset-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+ integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=
+ dependencies:
+ has-value "^0.3.1"
+ isobject "^3.0.0"
+
+upath@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894"
+ integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==
+
+uri-js@^4.2.2:
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ dependencies:
+ punycode "^2.1.0"
+
+urix@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+ integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
+
+url@^0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
+ integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=
+ dependencies:
+ punycode "1.3.2"
+ querystring "0.2.0"
+
+use@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
+ integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
+
+util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
+
+util.promisify@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee"
+ integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.17.2"
+ has-symbols "^1.0.1"
+ object.getownpropertydescriptors "^2.1.0"
+
+util@0.10.3:
+ version "0.10.3"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
+ integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk=
+ dependencies:
+ inherits "2.0.1"
+
+util@^0.11.0:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61"
+ integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==
+ dependencies:
+ inherits "2.0.3"
+
+uuid@^3.3.2:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
+ integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
+
+v8-compile-cache@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"
+ integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==
+
+vendors@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e"
+ integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==
+
+verror@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
+ integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=
+ dependencies:
+ assert-plus "^1.0.0"
+ core-util-is "1.0.2"
+ extsprintf "^1.2.0"
+
+vlq@^0.2.2:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26"
+ integrity sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==
+
+vm-browserify@^1.0.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0"
+ integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==
+
+w3c-hr-time@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd"
+ integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==
+ dependencies:
+ browser-process-hrtime "^1.0.0"
+
+w3c-xmlserializer@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794"
+ integrity sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==
+ dependencies:
+ domexception "^1.0.1"
+ webidl-conversions "^4.0.2"
+ xml-name-validator "^3.0.0"
+
+wcwidth@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
+ integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=
+ dependencies:
+ defaults "^1.0.3"
+
+webidl-conversions@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
+ integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==
+
+whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0"
+ integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==
+ dependencies:
+ iconv-lite "0.4.24"
+
+whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf"
+ integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==
+
+whatwg-url@^7.0.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06"
+ integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==
+ dependencies:
+ lodash.sortby "^4.7.0"
+ tr46 "^1.0.1"
+ webidl-conversions "^4.0.2"
+
+which-boxed-primitive@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
+ integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==
+ dependencies:
+ is-bigint "^1.0.1"
+ is-boolean-object "^1.1.0"
+ is-number-object "^1.0.4"
+ is-string "^1.0.5"
+ is-symbol "^1.0.3"
+
+which@^1.2.9:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+ integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
+ dependencies:
+ isexe "^2.0.0"
+
+word-wrap@~1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
+ integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
+
+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 sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+
+write@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757"
+ integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=
+ dependencies:
+ mkdirp "^0.5.1"
+
+ws@^5.1.1:
+ version "5.2.2"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f"
+ integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==
+ dependencies:
+ async-limiter "~1.0.0"
+
+ws@^6.1.2:
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb"
+ integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==
+ dependencies:
+ async-limiter "~1.0.0"
+
+xml-name-validator@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
+ integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==
+
+xmlchars@^2.1.1:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"
+ integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==
+
+xtend@^4.0.0, xtend@~4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
+ integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
+
+y18n@^5.0.5:
+ version "5.0.5"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18"
+ integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==
+
+yalc@~1.0.0-pre.50:
+ version "1.0.0-pre.50"
+ resolved "https://registry.yarnpkg.com/yalc/-/yalc-1.0.0-pre.50.tgz#e654e5af5f739cf255eedad1d66ba05a17de78f9"
+ integrity sha512-HGFjFFUhXSpQcxyOwJQl3jhERMn7XBgSCCoJ1k3dDPMbH6n56onv6Cp6cDGMiTho8tLIF4x02/Kb4g6pHavzgA==
+ dependencies:
+ chalk "^4.1.0"
+ detect-indent "^6.0.0"
+ fs-extra "^8.0.1"
+ glob "^7.1.4"
+ ignore "^5.0.4"
+ ini "^2.0.0"
+ npm-packlist "^1.4.1"
+ yargs "^16.1.1"
+
+yallist@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+ integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=
+
+yargs-parser@^20.2.2:
+ version "20.2.7"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a"
+ integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==
+
+yargs@^16.1.1:
+ version "16.2.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
+ integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==
+ dependencies:
+ cliui "^7.0.2"
+ escalade "^3.1.1"
+ get-caller-file "^2.0.5"
+ require-directory "^2.1.1"
+ string-width "^4.2.0"
+ y18n "^5.0.5"
+ yargs-parser "^20.2.2"
diff --git a/音频分类/speech-commands/package.json b/音频分类/speech-commands/package.json
new file mode 100644
index 0000000..08c0fc3
--- /dev/null
+++ b/音频分类/speech-commands/package.json
@@ -0,0 +1,56 @@
+{
+ "name": "@tensorflow-models/speech-commands",
+ "version": "0.5.4",
+ "description": "Speech-command recognizer in TensorFlow.js",
+ "main": "dist/index.js",
+ "unpkg": "dist/speech-commands.min.js",
+ "jsdelivr": "dist/speech-commands.min.js",
+ "jsnext:main": "dist/speech-commands.esm.js",
+ "module": "dist/speech-commands.esm.js",
+ "types": "dist/index.d.ts",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/tensorflow/tfjs-models.git"
+ },
+ "peerDependencies": {
+ "@tensorflow/tfjs-core": "^4.13.0",
+ "@tensorflow/tfjs-data": "^4.13.0",
+ "@tensorflow/tfjs-layers": "^4.13.0"
+ },
+ "devDependencies": {
+ "@tensorflow/tfjs-core": "^4.13.0",
+ "@tensorflow/tfjs-data": "^4.13.0",
+ "@tensorflow/tfjs-layers": "^4.13.0",
+ "@tensorflow/tfjs-node": "^4.13.0",
+ "@types/jasmine": "~2.8.8",
+ "@types/rimraf": "^2.0.2",
+ "@types/tempfile": "^2.0.0",
+ "babel-core": "~6.26.0",
+ "babel-plugin-transform-runtime": "~6.23.0",
+ "clang-format": "^1.2.4",
+ "dct": "^0.0.3",
+ "jasmine": "^3.2.0",
+ "jasmine-core": "^3.2.1",
+ "kissfft-js": "^0.1.8",
+ "rimraf": "2.6.2",
+ "rollup": "~0.58.2",
+ "rollup-plugin-node-resolve": "~3.3.0",
+ "rollup-plugin-typescript2": "~0.13.0",
+ "rollup-plugin-uglify": "~3.0.0",
+ "tempfile": "2.0.0",
+ "ts-node": "~5.0.0",
+ "tslib": "1.8.0",
+ "tslint": "~5.18.0",
+ "tslint-no-circular-imports": "^0.6.1",
+ "typescript": "~3.5.3",
+ "yalc": "~1.0.0-pre.21"
+ },
+ "scripts": {
+ "build": "tsc",
+ "lint": "tslint -p . -t verbose",
+ "publish-local": "yarn build && rollup -c && yalc push",
+ "build-npm": "yarn build && rollup -c",
+ "test": "ts-node --skip-ignore --project tsconfig.test.json run_tests.ts"
+ },
+ "license": "Apache-2.0"
+}
diff --git a/音频分类/speech-commands/rollup.config.js b/音频分类/speech-commands/rollup.config.js
new file mode 100644
index 0000000..9559d4a
--- /dev/null
+++ b/音频分类/speech-commands/rollup.config.js
@@ -0,0 +1,77 @@
+/**
+ * @license
+ * Copyright 2020 Google LLC. All Rights Reserved.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =============================================================================
+ */
+import node from 'rollup-plugin-node-resolve';
+import typescript from 'rollup-plugin-typescript2';
+import uglify from 'rollup-plugin-uglify';
+
+const PREAMBLE = `/**
+ * @license
+ * Copyright ${(new Date).getFullYear()} Google LLC. All Rights Reserved.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =============================================================================
+ */`;
+
+function minify() {
+ return uglify({ output: { preamble: PREAMBLE } });
+}
+
+function config({ plugins = [], output = {} }) {
+ return {
+ input: 'src/index.ts',
+ plugins: [
+ typescript({ tsconfigOverride: { compilerOptions: { module: 'ES2015' } } }),
+ node(), ...plugins
+ ],
+ output: {
+ banner: PREAMBLE,
+ globals: {
+ '@tensorflow/tfjs-core': 'tf',
+ '@tensorflow/tfjs-layers': 'tf',
+ '@tensorflow/tfjs-data': 'tf.data',
+ },
+ ...output
+ },
+ external: [
+ '@tensorflow/tfjs-core',
+ '@tensorflow/tfjs-layers',
+ '@tensorflow/tfjs-data',
+ ]
+ };
+}
+
+const packageName = 'speechCommands';
+export default [
+ config({output: {format: 'umd', name: packageName, file: 'dist/speech-commands.js'}}),
+ config({
+ plugins: [minify()],
+ output: {format: 'umd', name: packageName, file: 'dist/speech-commands.min.js'}
+ }),
+ config({
+ plugins: [minify()],
+ output: {format: 'es', file: 'dist/speech-commands.esm.js'}
+ })
+];
diff --git a/音频分类/speech-commands/run_tests.ts b/音频分类/speech-commands/run_tests.ts
new file mode 100644
index 0000000..880d57a
--- /dev/null
+++ b/音频分类/speech-commands/run_tests.ts
@@ -0,0 +1,21 @@
+/**
+ * @license
+ * Copyright 2019 Google LLC. All Rights Reserved.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =============================================================================
+ */
+
+import * as jasmine_util from '@tensorflow/tfjs-core/dist/jasmine_util';
+import {runTests} from '../test_util';
+
+runTests(jasmine_util);
diff --git a/音频分类/speech-commands/src/browser_fft_extractor.ts b/音频分类/speech-commands/src/browser_fft_extractor.ts
new file mode 100644
index 0000000..37be9ae
--- /dev/null
+++ b/音频分类/speech-commands/src/browser_fft_extractor.ts
@@ -0,0 +1,331 @@
+/**
+ * @license
+ * Copyright 2019 Google LLC. All Rights Reserved.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =============================================================================
+ */
+
+/**
+ * Audio FFT Feature Extractor based on Browser-Native FFT.
+ */
+
+import * as tf from '@tensorflow/tfjs-core';
+
+import {getAudioContextConstructor, getAudioMediaStream} from './browser_fft_utils';
+import {FeatureExtractor, RecognizerParams} from './types';
+
+export type SpectrogramCallback = (freqData: tf.Tensor, timeData?: tf.Tensor) =>
+ Promise;
+
+/**
+ * Configurations for constructing BrowserFftFeatureExtractor.
+ */
+export interface BrowserFftFeatureExtractorConfig extends RecognizerParams {
+ /**
+ * Number of audio frames (i.e., frequency columns) per spectrogram.
+ */
+ numFramesPerSpectrogram: number;
+
+ /**
+ * Suppression period in milliseconds.
+ *
+ * How much time to rest (not call the spectrogramCallback) every time
+ * a word with probability score above threshold is recognized.
+ */
+ suppressionTimeMillis: number;
+
+ /**
+ * A callback that is invoked every time a full spectrogram becomes
+ * available.
+ *
+ * `x` is a single-example tf.Tensor instance that includes the batch
+ * dimension.
+ * The return value is assumed to be whether a flag for whether the
+ * suppression period should initiate, e.g., when a word is recognized.
+ */
+ spectrogramCallback: SpectrogramCallback;
+
+ /**
+ * Truncate each spectrogram column at how many frequency points.
+ *
+ * If `null` or `undefined`, will do no truncation.
+ */
+ columnTruncateLength?: number;
+
+ /**
+ * Overlap factor. Must be >=0 and <1.
+ * For example, if the model takes a frame length of 1000 ms,
+ * and if overlap factor is 0.4, there will be a 400ms
+ * overlap between two successive frames, i.e., frames
+ * will be taken every 600 ms.
+ */
+ overlapFactor: number;
+
+ /**
+ * Whether to collect the raw time-domain audio waveform in addition to the
+ * spectrogram.
+ *
+ * Default: `false`.
+ */
+ includeRawAudio?: boolean;
+}
+
+/**
+ * Audio feature extractor based on Browser-native FFT.
+ *
+ * Uses AudioContext and analyser node.
+ */
+export class BrowserFftFeatureExtractor implements FeatureExtractor {
+ // Number of frames (i.e., columns) per spectrogram used for classification.
+ readonly numFrames: number;
+
+ // Audio sampling rate in Hz.
+ readonly sampleRateHz: number;
+
+ // The FFT length for each spectrogram column.
+ readonly fftSize: number;
+
+ // Truncation length for spectrogram columns.
+ readonly columnTruncateLength: number;
+
+ // Overlapping factor: the ratio between the temporal spacing between
+ // consecutive spectrograms and the length of each individual spectrogram.
+ readonly overlapFactor: number;
+ readonly includeRawAudio: boolean;
+
+ private readonly spectrogramCallback: SpectrogramCallback;
+
+ private stream: MediaStream;
+ // tslint:disable-next-line:no-any
+ private audioContextConstructor: any;
+ private audioContext: AudioContext;
+ private analyser: AnalyserNode;
+ private tracker: Tracker;
+ private freqData: Float32Array;
+ private timeData: Float32Array;
+ private freqDataQueue: Float32Array[];
+ private timeDataQueue: Float32Array[];
+ // tslint:disable-next-line:no-any
+ private frameIntervalTask: any;
+ private frameDurationMillis: number;
+
+ private suppressionTimeMillis: number;
+
+ /**
+ * Constructor of BrowserFftFeatureExtractor.
+ *
+ * @param config Required configuration object.
+ */
+ constructor(config: BrowserFftFeatureExtractorConfig) {
+ if (config == null) {
+ throw new Error(
+ `Required configuration object is missing for ` +
+ `BrowserFftFeatureExtractor constructor`);
+ }
+
+ if (config.spectrogramCallback == null) {
+ throw new Error(`spectrogramCallback cannot be null or undefined`);
+ }
+
+ if (!(config.numFramesPerSpectrogram > 0)) {
+ throw new Error(
+ `Invalid value in numFramesPerSpectrogram: ` +
+ `${config.numFramesPerSpectrogram}`);
+ }
+
+ if (config.suppressionTimeMillis < 0) {
+ throw new Error(
+ `Expected suppressionTimeMillis to be >= 0, ` +
+ `but got ${config.suppressionTimeMillis}`);
+ }
+ this.suppressionTimeMillis = config.suppressionTimeMillis;
+
+ this.spectrogramCallback = config.spectrogramCallback;
+ this.numFrames = config.numFramesPerSpectrogram;
+ this.sampleRateHz = config.sampleRateHz || 44100;
+ this.fftSize = config.fftSize || 1024;
+ this.frameDurationMillis = this.fftSize / this.sampleRateHz * 1e3;
+ this.columnTruncateLength = config.columnTruncateLength || this.fftSize;
+ this.overlapFactor = config.overlapFactor;
+ this.includeRawAudio = config.includeRawAudio;
+
+ tf.util.assert(
+ this.overlapFactor >= 0 && this.overlapFactor < 1,
+ () => `Expected overlapFactor to be >= 0 and < 1, ` +
+ `but got ${this.overlapFactor}`);
+
+ if (this.columnTruncateLength > this.fftSize) {
+ throw new Error(
+ `columnTruncateLength ${this.columnTruncateLength} exceeds ` +
+ `fftSize (${this.fftSize}).`);
+ }
+
+ this.audioContextConstructor = getAudioContextConstructor();
+ }
+
+ async start(audioTrackConstraints?: MediaTrackConstraints):
+ Promise {
+ if (this.frameIntervalTask != null) {
+ throw new Error(
+ 'Cannot start already-started BrowserFftFeatureExtractor');
+ }
+
+ this.stream = await getAudioMediaStream(audioTrackConstraints);
+ this.audioContext = new this.audioContextConstructor(
+ {sampleRate: this.sampleRateHz}) as AudioContext;
+
+ const streamSource = this.audioContext.createMediaStreamSource(this.stream);
+ this.analyser = this.audioContext.createAnalyser();
+ this.analyser.fftSize = this.fftSize * 2;
+ this.analyser.smoothingTimeConstant = 0.0;
+ streamSource.connect(this.analyser);
+ // Reset the queue.
+ this.freqDataQueue = [];
+ this.freqData = new Float32Array(this.fftSize);
+ if (this.includeRawAudio) {
+ this.timeDataQueue = [];
+ this.timeData = new Float32Array(this.fftSize);
+ }
+ const period =
+ Math.max(1, Math.round(this.numFrames * (1 - this.overlapFactor)));
+ this.tracker = new Tracker(
+ period,
+ Math.round(this.suppressionTimeMillis / this.frameDurationMillis));
+ this.frameIntervalTask = setInterval(
+ this.onAudioFrame.bind(this), this.fftSize / this.sampleRateHz * 1e3);
+ }
+
+ private async onAudioFrame() {
+ this.analyser.getFloatFrequencyData(this.freqData);
+ if (this.freqData[0] === -Infinity) {
+ return;
+ }
+
+ this.freqDataQueue.push(this.freqData.slice(0, this.columnTruncateLength));
+ if (this.includeRawAudio) {
+ this.analyser.getFloatTimeDomainData(this.timeData);
+ this.timeDataQueue.push(this.timeData.slice());
+ }
+ if (this.freqDataQueue.length > this.numFrames) {
+ // Drop the oldest frame (least recent).
+ this.freqDataQueue.shift();
+ }
+ const shouldFire = this.tracker.tick();
+ if (shouldFire) {
+ const freqData = flattenQueue(this.freqDataQueue);
+ const freqDataTensor = getInputTensorFromFrequencyData(
+ freqData, [1, this.numFrames, this.columnTruncateLength, 1]);
+ let timeDataTensor: tf.Tensor;
+ if (this.includeRawAudio) {
+ const timeData = flattenQueue(this.timeDataQueue);
+ timeDataTensor = getInputTensorFromFrequencyData(
+ timeData, [1, this.numFrames * this.fftSize]);
+ }
+ const shouldRest =
+ await this.spectrogramCallback(freqDataTensor, timeDataTensor);
+ if (shouldRest) {
+ this.tracker.suppress();
+ }
+ tf.dispose([freqDataTensor, timeDataTensor]);
+ }
+ }
+
+ async stop(): Promise {
+ if (this.frameIntervalTask == null) {
+ throw new Error(
+ 'Cannot stop because there is no ongoing streaming activity.');
+ }
+ clearInterval(this.frameIntervalTask);
+ this.frameIntervalTask = null;
+ this.analyser.disconnect();
+ this.audioContext.close();
+ if (this.stream != null && this.stream.getTracks().length > 0) {
+ this.stream.getTracks()[0].stop();
+ }
+ }
+
+ setConfig(params: RecognizerParams) {
+ throw new Error(
+ 'setConfig() is not implemented for BrowserFftFeatureExtractor.');
+ }
+
+ getFeatures(): Float32Array[] {
+ throw new Error(
+ 'getFeatures() is not implemented for ' +
+ 'BrowserFftFeatureExtractor. Use the spectrogramCallback ' +
+ 'field of the constructor config instead.');
+ }
+}
+
+export function flattenQueue(queue: Float32Array[]): Float32Array {
+ const frameSize = queue[0].length;
+ const freqData = new Float32Array(queue.length * frameSize);
+ queue.forEach((data, i) => freqData.set(data, i * frameSize));
+ return freqData;
+}
+
+export function getInputTensorFromFrequencyData(
+ freqData: Float32Array, shape: number[]): tf.Tensor {
+ const vals = new Float32Array(tf.util.sizeFromShape(shape));
+ // If the data is less than the output shape, the rest is padded with zeros.
+ vals.set(freqData, vals.length - freqData.length);
+ return tf.tensor(vals, shape);
+}
+
+/**
+ * A class that manages the firing of events based on periods
+ * and suppression time.
+ */
+export class Tracker {
+ readonly period: number;
+ readonly suppressionTime: number;
+
+ private counter: number;
+ private suppressionOnset: number;
+
+ /**
+ * Constructor of Tracker.
+ *
+ * @param period The event-firing period, in number of frames.
+ * @param suppressionPeriod The suppression period, in number of frames.
+ */
+ constructor(period: number, suppressionPeriod: number) {
+ this.period = period;
+ this.suppressionTime = suppressionPeriod == null ? 0 : suppressionPeriod;
+ this.counter = 0;
+
+ tf.util.assert(
+ this.period > 0,
+ () => `Expected period to be positive, but got ${this.period}`);
+ }
+
+ /**
+ * Mark a frame.
+ *
+ * @returns Whether the event should be fired at the current frame.
+ */
+ tick(): boolean {
+ this.counter++;
+ const shouldFire = (this.counter % this.period === 0) &&
+ (this.suppressionOnset == null ||
+ this.counter - this.suppressionOnset > this.suppressionTime);
+ return shouldFire;
+ }
+
+ /**
+ * Order the beginning of a supression period.
+ */
+ suppress() {
+ this.suppressionOnset = this.counter;
+ }
+}
diff --git a/音频分类/speech-commands/src/browser_fft_extractor_test.ts b/音频分类/speech-commands/src/browser_fft_extractor_test.ts
new file mode 100644
index 0000000..1a30046
--- /dev/null
+++ b/音频分类/speech-commands/src/browser_fft_extractor_test.ts
@@ -0,0 +1,327 @@
+/**
+ * @license
+ * Copyright 2019 Google LLC. All Rights Reserved.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =============================================================================
+ */
+
+import * as tf from '@tensorflow/tfjs-core';
+// tslint:disable-next-line: no-imports-from-dist
+import {describeWithFlags, NODE_ENVS} from '@tensorflow/tfjs-core/dist/jasmine_util';
+import {BrowserFftFeatureExtractor, flattenQueue, getInputTensorFromFrequencyData} from './browser_fft_extractor';
+import * as BrowserFftUtils from './browser_fft_utils';
+import {FakeAudioContext, FakeAudioMediaStream} from './browser_test_utils';
+import {expectTensorsClose} from './test_utils';
+
+const testEnvs = NODE_ENVS;
+
+describeWithFlags('flattenQueue', testEnvs, () => {
+ it('3 frames, 2 values each', () => {
+ const queue = [[1, 1], [2, 2], [3, 3]].map(x => new Float32Array(x));
+ expect(flattenQueue(queue)).toEqual(new Float32Array([1, 1, 2, 2, 3, 3]));
+ });
+
+ it('2 frames, 2 values each', () => {
+ const queue = [[1, 1], [2, 2]].map(x => new Float32Array(x));
+ expect(flattenQueue(queue)).toEqual(new Float32Array([1, 1, 2, 2]));
+ });
+
+ it('1 frame, 2 values each', () => {
+ const queue = [[1, 1]].map(x => new Float32Array(x));
+ expect(flattenQueue(queue)).toEqual(new Float32Array([1, 1]));
+ });
+});
+
+describeWithFlags('getInputTensorFromFrequencyData', testEnvs, () => {
+ it('6 frames, 2 vals each', () => {
+ const freqData = new Float32Array([1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6]);
+ const numFrames = 6;
+ const fftSize = 2;
+ const tensor =
+ getInputTensorFromFrequencyData(freqData, [1, numFrames, fftSize, 1]);
+ expectTensorsClose(tensor, tf.tensor4d(freqData, [1, 6, 2, 1]));
+ });
+});
+
+describeWithFlags('BrowserFftFeatureExtractor', testEnvs, () => {
+ function setUpFakes() {
+ spyOn(BrowserFftUtils, 'getAudioContextConstructor')
+ .and.callFake(() => FakeAudioContext.createInstance);
+ spyOn(BrowserFftUtils, 'getAudioMediaStream')
+ .and.callFake(() => new FakeAudioMediaStream());
+ }
+
+ it('constructor', () => {
+ setUpFakes();
+
+ const extractor = new BrowserFftFeatureExtractor({
+ spectrogramCallback: async (x: tf.Tensor) => false,
+ numFramesPerSpectrogram: 43,
+ columnTruncateLength: 225,
+ suppressionTimeMillis: 1000,
+ overlapFactor: 0
+ });
+
+ expect(extractor.fftSize).toEqual(1024);
+ expect(extractor.numFrames).toEqual(43);
+ expect(extractor.columnTruncateLength).toEqual(225);
+ expect(extractor.overlapFactor).toBeCloseTo(0);
+ });
+
+ it('constructor errors due to null config', () => {
+ expect(() => new BrowserFftFeatureExtractor(null))
+ .toThrowError(/Required configuration object is missing/);
+ });
+
+ it('constructor errors due to missing spectrogramCallback', () => {
+ expect(() => new BrowserFftFeatureExtractor({
+ spectrogramCallback: null,
+ numFramesPerSpectrogram: 43,
+ columnTruncateLength: 225,
+ suppressionTimeMillis: 1000,
+ overlapFactor: 0
+ }))
+ .toThrowError(/spectrogramCallback cannot be null or undefined/);
+ });
+
+ it('constructor errors due to invalid numFramesPerSpectrogram', () => {
+ expect(() => new BrowserFftFeatureExtractor({
+ spectrogramCallback: async (x: tf.Tensor) => false,
+ numFramesPerSpectrogram: -2,
+ columnTruncateLength: 225,
+ overlapFactor: 0,
+ suppressionTimeMillis: 1000
+ }))
+ .toThrowError(/Invalid value in numFramesPerSpectrogram: -2/);
+ });
+
+ it('constructor errors due to negative overlapFactor', () => {
+ expect(() => new BrowserFftFeatureExtractor({
+ spectrogramCallback: async (x: tf.Tensor) => false,
+ numFramesPerSpectrogram: 43,
+ columnTruncateLength: 225,
+ overlapFactor: -0.1,
+ suppressionTimeMillis: 1000
+ }))
+ .toThrowError(/Expected overlapFactor/);
+ });
+
+ it('constructor errors due to columnTruncateLength too large', () => {
+ expect(() => new BrowserFftFeatureExtractor({
+ spectrogramCallback: async (x: tf.Tensor) => false,
+ numFramesPerSpectrogram: 43,
+ columnTruncateLength: 1600, // > 1024 and leads to Error.
+ overlapFactor: 0,
+ suppressionTimeMillis: 1000
+ }))
+ .toThrowError(/columnTruncateLength .* exceeds fftSize/);
+ });
+
+ it('constructor errors due to negative suppressionTimeMillis', () => {
+ expect(() => new BrowserFftFeatureExtractor({
+ spectrogramCallback: async (x: tf.Tensor) => false,
+ numFramesPerSpectrogram: 43,
+ columnTruncateLength: 1600,
+ overlapFactor: 0,
+ suppressionTimeMillis: -1000 // <0 and leads to Error.
+ }))
+ .toThrowError(/Expected suppressionTimeMillis to be >= 0/);
+ });
+
+ it('start and stop: overlapFactor = 0', done => {
+ setUpFakes();
+ const timeDelta = 50;
+ const spectrogramDurationMillis = 1024 / 44100 * 43 * 1e3 - timeDelta;
+ const numCallbacksToComplete = 3;
+ let numCallbacksCompleted = 0;
+ const tensorCounts: number[] = [];
+ const callbackTimestamps: number[] = [];
+ const extractor = new BrowserFftFeatureExtractor({
+ spectrogramCallback: async (x: tf.Tensor) => {
+ callbackTimestamps.push(tf.util.now());
+ if (callbackTimestamps.length > 1) {
+ expect(
+ callbackTimestamps[callbackTimestamps.length - 1] -
+ callbackTimestamps[callbackTimestamps.length - 2])
+ .toBeGreaterThanOrEqual(spectrogramDurationMillis);
+ }
+
+ expect(x.shape).toEqual([1, 43, 225, 1]);
+
+ tensorCounts.push(tf.memory().numTensors);
+ if (tensorCounts.length > 1) {
+ // Assert no memory leak.
+ expect(tensorCounts[tensorCounts.length - 1])
+ .toEqual(tensorCounts[tensorCounts.length - 2]);
+ }
+
+ if (++numCallbacksCompleted >= numCallbacksToComplete) {
+ await extractor.stop();
+ done();
+ }
+ return false;
+ },
+ numFramesPerSpectrogram: 43,
+ columnTruncateLength: 225,
+ overlapFactor: 0,
+ suppressionTimeMillis: 0
+ });
+ extractor.start();
+ });
+
+ it('start and stop: correct rotating buffer size', done => {
+ setUpFakes();
+
+ const numFramesPerSpectrogram = 43;
+ const columnTruncateLength = 225;
+ const numCallbacksToComplete = 3;
+ let numCallbacksCompleted = 0;
+ const extractor = new BrowserFftFeatureExtractor({
+ spectrogramCallback: async (x: tf.Tensor) => {
+ const xData = await x.data();
+ // Verify the correctness of the spectrogram data.
+ for (let i = 0; i < xData.length; ++i) {
+ const segment = Math.floor(i / columnTruncateLength);
+ const expected = segment * 1024 + (i % columnTruncateLength) +
+ 1024 * numFramesPerSpectrogram * numCallbacksCompleted;
+ expect(xData[i]).toEqual(expected);
+ }
+ if (++numCallbacksCompleted >= numCallbacksToComplete) {
+ await extractor.stop();
+ done();
+ }
+ return false;
+ },
+ numFramesPerSpectrogram,
+ columnTruncateLength,
+ overlapFactor: 0,
+ suppressionTimeMillis: 0
+ });
+ extractor.start();
+ });
+
+ it('start and stop: overlapFactor = 0.5', done => {
+ setUpFakes();
+
+ const numCallbacksToComplete = 5;
+ let numCallbacksCompleted = 0;
+ const spectrogramTensors: tf.Tensor[] = [];
+ const callbackTimestamps: number[] = [];
+ const spectrogramDurationMillis = 1024 / 44100 * 43 * 1e3;
+ const numFramesPerSpectrogram = 43;
+ const columnTruncateLength = 225;
+ const extractor = new BrowserFftFeatureExtractor({
+ spectrogramCallback: async (x: tf.Tensor) => {
+ callbackTimestamps.push(tf.util.now());
+ if (callbackTimestamps.length > 1) {
+ expect(
+ callbackTimestamps[callbackTimestamps.length - 1] -
+ callbackTimestamps[callbackTimestamps.length - 2])
+ .toBeGreaterThanOrEqual(spectrogramDurationMillis * 0.5);
+ // Verify the content of the spectrogram data.
+ const xData = await x.data();
+ expect(xData[xData.length - 1])
+ .toEqual(callbackTimestamps.length * 22 * 1024 - 800);
+ }
+ expect(x.shape).toEqual([1, 43, 225, 1]);
+ spectrogramTensors.push(tf.clone(x));
+
+ if (++numCallbacksCompleted >= numCallbacksToComplete) {
+ await extractor.stop();
+ done();
+ }
+ return false;
+ },
+ numFramesPerSpectrogram,
+ columnTruncateLength,
+ overlapFactor: 0.5,
+ suppressionTimeMillis: 0
+ });
+ extractor.start();
+ });
+
+ it('start and stop: the first frame is captured', done => {
+ setUpFakes();
+ const extractor = new BrowserFftFeatureExtractor({
+ spectrogramCallback: async (x: tf.Tensor) => {
+ expect(x.shape).toEqual([1, 43, 225, 1]);
+
+ const xData = x.dataSync();
+ // Verify that the first frame is not all zero or any constant value
+ // We don't compare the values against zero directly, because the
+ // spectrogram data is normalized here. The assertions below are also
+ // based on the fact that the fake audio context outputs linearly
+ // increasing sample values.
+ expect(xData[1]).toBeGreaterThan(xData[0]);
+ expect(xData[2]).toBeGreaterThan(xData[1]);
+
+ await extractor.stop();
+ done();
+ return false;
+ },
+ numFramesPerSpectrogram: 43,
+ columnTruncateLength: 225,
+ overlapFactor: 0,
+ suppressionTimeMillis: 0
+ });
+ extractor.start();
+ });
+
+ it('start and stop: suppressionTimeMillis = 1000', done => {
+ setUpFakes();
+
+ const numCallbacksToComplete = 2;
+ const suppressionTimeMillis = 1500;
+ let numCallbacksCompleted = 0;
+ const extractor = new BrowserFftFeatureExtractor({
+ spectrogramCallback: async (x: tf.Tensor) => {
+ if (++numCallbacksCompleted >= numCallbacksToComplete) {
+ const tEnd = tf.util.now();
+ // Due to the suppression time, the time elapsed between the two
+ // consecutive callbacks should be longer than it.
+ expect(tEnd - tBegin).toBeGreaterThanOrEqual(suppressionTimeMillis);
+ await extractor.stop();
+ done();
+ }
+ return true; // Returning true causes suppression.
+ },
+ numFramesPerSpectrogram: 43,
+ columnTruncateLength: 225,
+ overlapFactor: 0.25,
+ suppressionTimeMillis
+ });
+ const tBegin = tf.util.now();
+ extractor.start();
+ });
+
+ it('stopping unstarted extractor leads to Error', async () => {
+ setUpFakes();
+
+ const extractor = new BrowserFftFeatureExtractor({
+ spectrogramCallback: async (x: tf.Tensor) => false,
+ numFramesPerSpectrogram: 43,
+ columnTruncateLength: 225,
+ overlapFactor: 0,
+ suppressionTimeMillis: 1000
+ });
+
+ let caughtError: Error;
+ try {
+ await extractor.stop();
+ } catch (err) {
+ caughtError = err;
+ }
+ expect(caughtError.message)
+ .toMatch(/Cannot stop because there is no ongoing streaming activity/);
+ });
+});
diff --git a/音频分类/speech-commands/src/browser_fft_recognizer.ts b/音频分类/speech-commands/src/browser_fft_recognizer.ts
new file mode 100644
index 0000000..c9c3298
--- /dev/null
+++ b/音频分类/speech-commands/src/browser_fft_recognizer.ts
@@ -0,0 +1,1431 @@
+/**
+ * @license
+ * Copyright 2019 Google LLC. All Rights Reserved.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =============================================================================
+ */
+
+import * as tf from '@tensorflow/tfjs-core';
+import * as tfl from '@tensorflow/tfjs-layers';
+import * as tfd from '@tensorflow/tfjs-data';
+
+import {BrowserFftFeatureExtractor, SpectrogramCallback} from './browser_fft_extractor';
+import {loadMetadataJson, normalize, normalizeFloat32Array} from './browser_fft_utils';
+import {BACKGROUND_NOISE_TAG, Dataset} from './dataset';
+import {concatenateFloat32Arrays} from './generic_utils';
+import {balancedTrainValSplit} from './training_utils';
+import {AudioDataAugmentationOptions, EvaluateConfig, EvaluateResult, Example, ExampleCollectionOptions, RecognizeConfig, RecognizerCallback, RecognizerParams, ROCCurve, SpectrogramData, SpeechCommandRecognizer, SpeechCommandRecognizerMetadata, SpeechCommandRecognizerResult, StreamingRecognitionConfig, TransferLearnConfig, TransferSpeechCommandRecognizer} from './types';
+import {version} from './version';
+
+export const UNKNOWN_TAG = '_unknown_';
+
+// Key to the local-storage item that holds a map from model name to word
+// list.
+export const SAVED_MODEL_METADATA_KEY =
+ 'tfjs-speech-commands-saved-model-metadata';
+export const SAVE_PATH_PREFIX = 'indexeddb://tfjs-speech-commands-model/';
+
+// Export a variable for injection during unit testing.
+// tslint:disable-next-line:no-any
+export let localStorageWrapper = {
+ localStorage: typeof window === 'undefined' ? null : window.localStorage
+};
+
+export function getMajorAndMinorVersion(version: string) {
+ const versionItems = version.split('.');
+ return versionItems.slice(0, 2).join('.');
+}
+
+/**
+ * Default window hop ratio used for extracting multiple
+ * windows from a long spectrogram.
+ */
+const DEFAULT_WINDOW_HOP_RATIO = 0.25;
+
+/**
+ * Speech-Command Recognizer using browser-native (WebAudio) spectral featutres.
+ */
+export class BrowserFftSpeechCommandRecognizer implements
+ SpeechCommandRecognizer {
+ static readonly VALID_VOCABULARY_NAMES: string[] = ['18w', 'directional4w'];
+ static readonly DEFAULT_VOCABULARY_NAME = '18w';
+
+ readonly MODEL_URL_PREFIX =
+ `https://storage.googleapis.com/tfjs-models/tfjs/speech-commands/v${
+ getMajorAndMinorVersion(version)}/browser_fft`;
+
+ private readonly SAMPLE_RATE_HZ = 44100;
+ private readonly FFT_SIZE = 1024;
+ private readonly DEFAULT_SUPPRESSION_TIME_MILLIS = 0;
+
+ model: tfl.LayersModel;
+ modelWithEmbeddingOutput: tfl.LayersModel;
+ readonly vocabulary: string;
+ readonly parameters: RecognizerParams;
+ protected words: string[];
+
+ protected streaming = false;
+
+ protected nonBatchInputShape: [number, number, number];
+ private elementsPerExample: number;
+ protected audioDataExtractor: BrowserFftFeatureExtractor;
+
+ private transferRecognizers:
+ {[name: string]: TransferBrowserFftSpeechCommandRecognizer} = {};
+
+ private modelArtifactsOrURL: tf.io.ModelArtifacts|string;
+ private metadataOrURL: SpeechCommandRecognizerMetadata|string;
+
+ // The second-last dense layer in the base model.
+ // To be used for unfreezing during fine-tuning.
+ protected secondLastBaseDenseLayer: tfl.layers.Layer;
+
+ /**
+ * Constructor of BrowserFftSpeechCommandRecognizer.
+ *
+ * @param vocabulary An optional vocabulary specifier. Mutually exclusive
+ * with `modelURL` and `metadataURL`.
+ * @param modelArtifactsOrURL An optional, custom model URL pointing to a
+ * model.json, or modelArtifacts in the format of `tf.io.ModelArtifacts`.
+ * file. Supported schemes: http://, https://, and node.js-only: file://.
+ * Mutually exclusive with `vocabulary`. If provided, `metadatURL`
+ * most also be provided.
+ * @param metadataOrURL A custom metadata URL pointing to a metadata.json
+ * file. Or it can be a metadata JSON object itself. Must be provided
+ * together with `modelArtifactsOrURL`.
+ */
+ constructor(
+ vocabulary?: string, modelArtifactsOrURL?: tf.io.ModelArtifacts|string,
+ metadataOrURL?: SpeechCommandRecognizerMetadata|string) {
+ // TODO(cais): Consolidate the fields into a single config object when
+ // upgrading to v1.0.
+ tf.util.assert(
+ modelArtifactsOrURL == null && metadataOrURL == null ||
+ modelArtifactsOrURL != null && metadataOrURL != null,
+ () => `modelURL and metadataURL must be both provided or ` +
+ `both not provided.`);
+ if (modelArtifactsOrURL == null) {
+ if (vocabulary == null) {
+ vocabulary = BrowserFftSpeechCommandRecognizer.DEFAULT_VOCABULARY_NAME;
+ } else {
+ tf.util.assert(
+ BrowserFftSpeechCommandRecognizer.VALID_VOCABULARY_NAMES.indexOf(
+ vocabulary) !== -1,
+ () => `Invalid vocabulary name: '${vocabulary}'`);
+ }
+ this.vocabulary = vocabulary;
+ this.modelArtifactsOrURL =
+ `${this.MODEL_URL_PREFIX}/${this.vocabulary}/model.json`;
+ this.metadataOrURL =
+ `${this.MODEL_URL_PREFIX}/${this.vocabulary}/metadata.json`;
+ } else {
+ tf.util.assert(
+ vocabulary == null,
+ () => `vocabulary name must be null or undefined when modelURL is ` +
+ `provided`);
+ this.modelArtifactsOrURL = modelArtifactsOrURL;
+ this.metadataOrURL = metadataOrURL;
+ }
+
+ this.parameters = {
+ sampleRateHz: this.SAMPLE_RATE_HZ,
+ fftSize: this.FFT_SIZE
+ };
+ }
+
+ /**
+ * Start streaming recognition.
+ *
+ * To stop the recognition, use `stopListening()`.
+ *
+ * Example: TODO(cais): Add exapmle code snippet.
+ *
+ * @param callback The callback invoked whenever a word is recognized
+ * with a probability score greater than `config.probabilityThreshold`.
+ * It has the signature:
+ * (result: SpeechCommandRecognizerResult) => Promise
+ * wherein result has the two fields:
+ * - scores: A Float32Array that contains the probability scores for all
+ * the words.
+ * - spectrogram: The spectrogram data, provided only if
+ * `config.includeSpectrogram` is `true`.
+ * @param config The configurations for the streaming recognition to
+ * be started.
+ * The `modelName` field of `config` specifies the model to be used for
+ * online recognition. If not specified, it defaults to the name of the
+ * base model ('base'), i.e., the pretrained model not from transfer
+ * learning. If the recognizer instance has one or more transfer-learning
+ * models ready (as a result of calls to `collectTransferExample`
+ * and `trainTransferModel`), you can let this call use that
+ * model for prediction by specifying the corresponding `modelName`.
+ * @throws Error, if streaming recognition is already started or
+ * if `config` contains invalid values.
+ */
+ async listen(
+ callback: RecognizerCallback,
+ config?: StreamingRecognitionConfig): Promise {
+ if (this.streaming) {
+ throw new Error(
+ 'Cannot start streaming again when streaming is ongoing.');
+ }
+
+ await this.ensureModelLoaded();
+
+ if (config == null) {
+ config = {};
+ }
+ let probabilityThreshold =
+ config.probabilityThreshold == null ? 0 : config.probabilityThreshold;
+ if (config.includeEmbedding) {
+ // Override probability threshold to 0 if includeEmbedding is true.
+ probabilityThreshold = 0;
+ }
+ tf.util.assert(
+ probabilityThreshold >= 0 && probabilityThreshold <= 1,
+ () => `Invalid probabilityThreshold value: ${probabilityThreshold}`);
+ let invokeCallbackOnNoiseAndUnknown =
+ config.invokeCallbackOnNoiseAndUnknown == null ?
+ false :
+ config.invokeCallbackOnNoiseAndUnknown;
+ if (config.includeEmbedding) {
+ // Override invokeCallbackOnNoiseAndUnknown threshold to true if
+ // includeEmbedding is true.
+ invokeCallbackOnNoiseAndUnknown = true;
+ }
+
+ if (config.suppressionTimeMillis < 0) {
+ throw new Error(
+ `suppressionTimeMillis is expected to be >= 0, ` +
+ `but got ${config.suppressionTimeMillis}`);
+ }
+
+ const overlapFactor =
+ config.overlapFactor == null ? 0.5 : config.overlapFactor;
+ tf.util.assert(
+ overlapFactor >= 0 && overlapFactor < 1,
+ () => `Expected overlapFactor to be >= 0 and < 1, but got ${
+ overlapFactor}`);
+
+ const spectrogramCallback: SpectrogramCallback =
+ async (x: tf.Tensor, timeData?: tf.Tensor) => {
+ const normalizedX = normalize(x);
+ let y: tf.Tensor;
+ let embedding: tf.Tensor;
+ if (config.includeEmbedding) {
+ await this.ensureModelWithEmbeddingOutputCreated();
+ [y, embedding] =
+ this.modelWithEmbeddingOutput.predict(normalizedX) as tf.Tensor[];
+ } else {
+ y = this.model.predict(normalizedX) as tf.Tensor;
+ }
+
+ const scores = await y.data() as Float32Array;
+ const maxIndexTensor = y.argMax(-1);
+ const maxIndex = (await maxIndexTensor.data())[0];
+ const maxScore = Math.max(...scores);
+ tf.dispose([y, maxIndexTensor, normalizedX]);
+
+ if (maxScore < probabilityThreshold) {
+ return false;
+ } else {
+ let spectrogram: SpectrogramData = undefined;
+ if (config.includeSpectrogram) {
+ spectrogram = {
+ data: await x.data() as Float32Array,
+ frameSize: this.nonBatchInputShape[1],
+ };
+ }
+
+ let wordDetected = true;
+ if (!invokeCallbackOnNoiseAndUnknown) {
+ // Skip background noise and unknown tokens.
+ if (this.words[maxIndex] === BACKGROUND_NOISE_TAG ||
+ this.words[maxIndex] === UNKNOWN_TAG) {
+ wordDetected = false;
+ }
+ }
+ if (wordDetected) {
+ callback({scores, spectrogram, embedding});
+ }
+ // Trigger suppression only if the word is neither unknown or
+ // background noise.
+ return wordDetected;
+ }
+ };
+
+ const suppressionTimeMillis = config.suppressionTimeMillis == null ?
+ this.DEFAULT_SUPPRESSION_TIME_MILLIS :
+ config.suppressionTimeMillis;
+ this.audioDataExtractor = new BrowserFftFeatureExtractor({
+ sampleRateHz: this.parameters.sampleRateHz,
+ numFramesPerSpectrogram: this.nonBatchInputShape[0],
+ columnTruncateLength: this.nonBatchInputShape[1],
+ suppressionTimeMillis,
+ spectrogramCallback,
+ overlapFactor
+ });
+
+ await this.audioDataExtractor.start(config.audioTrackConstraints);
+
+ this.streaming = true;
+ }
+
+ /**
+ * Load the underlying tf.LayersModel instance and associated metadata.
+ *
+ * If the model and the metadata are already loaded, do nothing.
+ */
+ async ensureModelLoaded() {
+ if (this.model != null) {
+ return;
+ }
+
+ await this.ensureMetadataLoaded();
+
+ let model: tfl.LayersModel;
+ if (typeof this.modelArtifactsOrURL === 'string') {
+ model = await tfl.loadLayersModel(this.modelArtifactsOrURL);
+ } else {
+ // this.modelArtifactsOrURL is an instance of `tf.io.ModelArtifacts`.
+ model = await tfl.loadLayersModel(tf.io.fromMemory(
+ this.modelArtifactsOrURL.modelTopology,
+ this.modelArtifactsOrURL.weightSpecs,
+ this.modelArtifactsOrURL.weightData));
+ }
+
+ // Check the validity of the model's input shape.
+ if (model.inputs.length !== 1) {
+ throw new Error(
+ `Expected model to have 1 input, but got a model with ` +
+ `${model.inputs.length} inputs`);
+ }
+ if (model.inputs[0].shape.length !== 4) {
+ throw new Error(
+ `Expected model to have an input shape of rank 4, ` +
+ `but got an input shape of rank ${model.inputs[0].shape.length}`);
+ }
+ if (model.inputs[0].shape[3] !== 1) {
+ throw new Error(
+ `Expected model to have an input shape with 1 as the last ` +
+ `dimension, but got input shape` +
+ `${JSON.stringify(model.inputs[0].shape[3])}}`);
+ }
+ // Check the consistency between the word labels and the model's output
+ // shape.
+ const outputShape = model.outputShape as tfl.Shape;
+ if (outputShape.length !== 2) {
+ throw new Error(
+ `Expected loaded model to have an output shape of rank 2,` +
+ `but received shape ${JSON.stringify(outputShape)}`);
+ }
+ if (outputShape[1] !== this.words.length) {
+ throw new Error(
+ `Mismatch between the last dimension of model's output shape ` +
+ `(${outputShape[1]}) and number of words ` +
+ `(${this.words.length}).`);
+ }
+
+ this.model = model;
+ this.freezeModel();
+
+ this.nonBatchInputShape =
+ model.inputs[0].shape.slice(1) as [number, number, number];
+ this.elementsPerExample = 1;
+ model.inputs[0].shape.slice(1).forEach(
+ dimSize => this.elementsPerExample *= dimSize);
+ this.warmUpModel();
+ const frameDurationMillis =
+ this.parameters.fftSize / this.parameters.sampleRateHz * 1e3;
+ const numFrames = model.inputs[0].shape[1];
+ this.parameters.spectrogramDurationMillis = numFrames * frameDurationMillis;
+ }
+
+ /**
+ * Construct a two-output model that includes the following outputs:
+ *
+ * 1. The same softmax probability output as the original model's output
+ * 2. The embedding, i.e., activation from the second-last dense layer of
+ * the original model.
+ */
+ protected async ensureModelWithEmbeddingOutputCreated() {
+ if (this.modelWithEmbeddingOutput != null) {
+ return;
+ }
+ await this.ensureModelLoaded();
+
+ // Find the second last dense layer of the original model.
+ let secondLastDenseLayer: tfl.layers.Layer;
+ for (let i = this.model.layers.length - 2; i >= 0; --i) {
+ if (this.model.layers[i].getClassName() === 'Dense') {
+ secondLastDenseLayer = this.model.layers[i];
+ break;
+ }
+ }
+ if (secondLastDenseLayer == null) {
+ throw new Error(
+ 'Failed to find second last dense layer in the original model.');
+ }
+ this.modelWithEmbeddingOutput = tfl.model({
+ inputs: this.model.inputs,
+ outputs: [
+ this.model.outputs[0], secondLastDenseLayer.output as tfl.SymbolicTensor
+ ]
+ });
+ }
+
+ private warmUpModel() {
+ tf.tidy(() => {
+ const x = tf.zeros([1].concat(this.nonBatchInputShape));
+ for (let i = 0; i < 3; ++i) {
+ this.model.predict(x);
+ }
+ });
+ }
+
+ private async ensureMetadataLoaded() {
+ if (this.words != null) {
+ return;
+ }
+
+ const metadataJSON = typeof this.metadataOrURL === 'string' ?
+ await loadMetadataJson(this.metadataOrURL) :
+ this.metadataOrURL;
+
+ if (metadataJSON.wordLabels == null) {
+ // In some legacy formats, the field 'words', instead of 'wordLabels',
+ // was populated. This branch ensures backward compatibility with those
+ // formats.
+ // tslint:disable-next-line:no-any
+ const legacyWords = (metadataJSON as any)['words'] as string[];
+ if (legacyWords == null) {
+ throw new Error(
+ 'Cannot find field "words" or "wordLabels" in metadata JSON file');
+ }
+ this.words = legacyWords;
+ } else {
+ this.words = metadataJSON.wordLabels;
+ }
+ }
+
+ /**
+ * Stop streaming recognition.
+ *
+ * @throws Error if there is not ongoing streaming recognition.
+ */
+ async stopListening(): Promise {
+ if (!this.streaming) {
+ throw new Error('Cannot stop streaming when streaming is not ongoing.');
+ }
+ await this.audioDataExtractor.stop();
+ this.streaming = false;
+ }
+
+ /**
+ * Check if streaming recognition is ongoing.
+ */
+ isListening(): boolean {
+ return this.streaming;
+ }
+
+ /**
+ * Get the array of word labels.
+ *
+ * @throws Error If this model is called before the model is loaded.
+ */
+ wordLabels(): string[] {
+ return this.words;
+ }
+
+ /**
+ * Get the parameters of this instance of BrowserFftSpeechCommandRecognizer.
+ *
+ * @returns Parameters of this instance.
+ */
+ params(): RecognizerParams {
+ return this.parameters;
+ }
+
+ /**
+ * Get the input shape of the underlying tf.LayersModel.
+ *
+ * @returns The input shape.
+ */
+ modelInputShape(): tfl.Shape {
+ if (this.model == null) {
+ throw new Error(
+ 'Model has not been loaded yet. Load model by calling ' +
+ 'ensureModelLoaded(), recognize(), or listen().');
+ }
+ return this.model.inputs[0].shape;
+ }
+
+ /**
+ * Run offline (non-streaming) recognition on a spectrogram.
+ *
+ * @param input Spectrogram. Either a `tf.Tensor` of a `Float32Array`.
+ * - If a `tf.Tensor`, must be rank-4 and match the model's expected
+ * input shape in 2nd dimension (# of spectrogram columns), the 3rd
+ * dimension (# of frequency-domain points per column), and the 4th
+ * dimension (always 1). The 1st dimension can be 1, for single-example
+ * recogntion, or any value >1, for batched recognition.
+ * - If a `Float32Array`, must have a length divisible by the number
+ * of elements per spectrogram, i.e.,
+ * (# of spectrogram columns) * (# of frequency-domain points per column).
+ * @param config Optional configuration object.
+ * @returns Result of the recognition, with the following field:
+ * scores:
+ * - A `Float32Array` if there is only one input exapmle.
+ * - An `Array` of `Float32Array`, if there are multiple input examples.
+ */
+ async recognize(input?: tf.Tensor|Float32Array, config?: RecognizeConfig):
+ Promise {
+ if (config == null) {
+ config = {};
+ }
+
+ await this.ensureModelLoaded();
+
+ if (input == null) {
+ // If `input` is not provided, draw audio data from WebAudio and us it
+ // for recognition.
+ const spectrogramData = await this.recognizeOnline();
+ input = spectrogramData.data;
+ }
+
+ let numExamples: number;
+ let inputTensor: tf.Tensor;
+ let outTensor: tf.Tensor;
+ if (input instanceof tf.Tensor) {
+ // Check input shape.
+ this.checkInputTensorShape(input);
+ inputTensor = input;
+ numExamples = input.shape[0];
+ } else {
+ if (input.length % this.elementsPerExample) {
+ throw new Error(
+ `The length of the input Float32Array ${input.length} ` +
+ `is not divisible by the number of tensor elements per ` +
+ `per example expected by the model ${this.elementsPerExample}.`);
+ }
+
+ numExamples = input.length / this.elementsPerExample;
+ inputTensor = tf.tensor4d(input, [
+ numExamples
+ ].concat(this.nonBatchInputShape) as [number, number, number, number]);
+ }
+
+ const output: SpeechCommandRecognizerResult = {scores: null};
+ if (config.includeEmbedding) {
+ // Optional inclusion of embedding (internal activation).
+ await this.ensureModelWithEmbeddingOutputCreated();
+ const outAndEmbedding =
+ this.modelWithEmbeddingOutput.predict(inputTensor) as tf.Tensor[];
+ outTensor = outAndEmbedding[0];
+ output.embedding = outAndEmbedding[1];
+ } else {
+ outTensor = this.model.predict(inputTensor) as tf.Tensor;
+ }
+
+ if (numExamples === 1) {
+ output.scores = await outTensor.data() as Float32Array;
+ } else {
+ const unstacked = tf.unstack(outTensor);
+ const scorePromises = unstacked.map(item => item.data());
+ output.scores = await Promise.all(scorePromises) as Float32Array[];
+ tf.dispose(unstacked);
+ }
+
+ if (config.includeSpectrogram) {
+ output.spectrogram = {
+ data: (input instanceof tf.Tensor ? await input.data() : input) as
+ Float32Array,
+ frameSize: this.nonBatchInputShape[1],
+ };
+ }
+
+ tf.dispose(outTensor);
+ return output;
+ }
+
+ private async recognizeOnline(): Promise {
+ return new Promise((resolve, reject) => {
+ const spectrogramCallback: SpectrogramCallback = async (x: tf.Tensor) => {
+ const normalizedX = normalize(x);
+ await this.audioDataExtractor.stop();
+ resolve({
+ data: await normalizedX.data() as Float32Array,
+ frameSize: this.nonBatchInputShape[1],
+ });
+ normalizedX.dispose();
+ return false;
+ };
+ this.audioDataExtractor = new BrowserFftFeatureExtractor({
+ sampleRateHz: this.parameters.sampleRateHz,
+ numFramesPerSpectrogram: this.nonBatchInputShape[0],
+ columnTruncateLength: this.nonBatchInputShape[1],
+ suppressionTimeMillis: 0,
+ spectrogramCallback,
+ overlapFactor: 0
+ });
+ this.audioDataExtractor.start();
+ });
+ }
+
+ createTransfer(name: string): TransferSpeechCommandRecognizer {
+ if (this.model == null) {
+ throw new Error(
+ 'Model has not been loaded yet. Load model by calling ' +
+ 'ensureModelLoaded(), recognizer(), or listen().');
+ }
+ tf.util.assert(
+ name != null && typeof name === 'string' && name.length > 1,
+ () => `Expected the name for a transfer-learning recognized to be a ` +
+ `non-empty string, but got ${JSON.stringify(name)}`);
+ tf.util.assert(
+ this.transferRecognizers[name] == null,
+ () => `There is already a transfer-learning model named '${name}'`);
+ const transfer = new TransferBrowserFftSpeechCommandRecognizer(
+ name, this.parameters, this.model);
+ this.transferRecognizers[name] = transfer;
+ return transfer;
+ }
+
+ protected freezeModel(): void {
+ for (const layer of this.model.layers) {
+ layer.trainable = false;
+ }
+ }
+
+ private checkInputTensorShape(input: tf.Tensor) {
+ const expectedRank = this.model.inputs[0].shape.length;
+ if (input.shape.length !== expectedRank) {
+ throw new Error(
+ `Expected input Tensor to have rank ${expectedRank}, ` +
+ `but got rank ${input.shape.length} that differs `);
+ }
+ const nonBatchedShape = input.shape.slice(1);
+ const expectedNonBatchShape = this.model.inputs[0].shape.slice(1);
+ if (!tf.util.arraysEqual(nonBatchedShape, expectedNonBatchShape)) {
+ throw new Error(
+ `Expected input to have shape [null,${expectedNonBatchShape}], ` +
+ `but got shape [null,${nonBatchedShape}]`);
+ }
+ }
+}
+
+/**
+ * A subclass of BrowserFftSpeechCommandRecognizer: Transfer-learned model.
+ */
+class TransferBrowserFftSpeechCommandRecognizer extends
+ BrowserFftSpeechCommandRecognizer implements
+ TransferSpeechCommandRecognizer {
+ private dataset: Dataset;
+ private transferHead: tfl.Sequential;
+
+ /**
+ * Constructor of TransferBrowserFftSpeechCommandRecognizer.
+ *
+ * @param name Name of the transfer-learned recognizer. Must be a non-empty
+ * string.
+ * @param parameters Parameters from the base recognizer.
+ * @param baseModel Model from the base recognizer.
+ */
+ constructor(
+ readonly name: string, readonly parameters: RecognizerParams,
+ readonly baseModel: tfl.LayersModel) {
+ super();
+ tf.util.assert(
+ name != null && typeof name === 'string' && name.length > 0,
+ () => `The name of a transfer model must be a non-empty string, ` +
+ `but got ${JSON.stringify(name)}`);
+ this.nonBatchInputShape =
+ this.baseModel.inputs[0].shape.slice(1) as [number, number, number];
+ this.words = null;
+ this.dataset = new Dataset();
+ }
+
+ /**
+ * Collect an example for transfer learning via WebAudio.
+ *
+ * @param {string} word Name of the word. Must not overlap with any of the
+ * words the base model is trained to recognize.
+ * @param {ExampleCollectionOptions}
+ * @returns {SpectrogramData} The spectrogram of the acquired the example.
+ * @throws Error, if word belongs to the set of words the base model is
+ * trained to recognize.
+ */
+ async collectExample(word: string, options?: ExampleCollectionOptions):
+ Promise {
+ tf.util.assert(
+ !this.streaming,
+ () => 'Cannot start collection of transfer-learning example because ' +
+ 'a streaming recognition or transfer-learning example collection ' +
+ 'is ongoing');
+ tf.util.assert(
+ word != null && typeof word === 'string' && word.length > 0,
+ () => `Must provide a non-empty string when collecting transfer-` +
+ `learning example`);
+
+ if (options == null) {
+ options = {};
+ }
+ if (options.durationMultiplier != null && options.durationSec != null) {
+ throw new Error(
+ `durationMultiplier and durationSec are mutually exclusive, ` +
+ `but are both specified.`);
+ }
+
+ let numFramesPerSpectrogram: number;
+ if (options.durationSec != null) {
+ tf.util.assert(
+ options.durationSec > 0,
+ () =>
+ `Expected durationSec to be > 0, but got ${options.durationSec}`);
+ const frameDurationSec =
+ this.parameters.fftSize / this.parameters.sampleRateHz;
+ numFramesPerSpectrogram =
+ Math.ceil(options.durationSec / frameDurationSec);
+ } else if (options.durationMultiplier != null) {
+ tf.util.assert(
+ options.durationMultiplier >= 1,
+ () => `Expected duration multiplier to be >= 1, ` +
+ `but got ${options.durationMultiplier}`);
+ numFramesPerSpectrogram =
+ Math.round(this.nonBatchInputShape[0] * options.durationMultiplier);
+ } else {
+ numFramesPerSpectrogram = this.nonBatchInputShape[0];
+ }
+
+ if (options.snippetDurationSec != null) {
+ tf.util.assert(
+ options.snippetDurationSec > 0,
+ () => `snippetDurationSec is expected to be > 0, but got ` +
+ `${options.snippetDurationSec}`);
+ tf.util.assert(
+ options.onSnippet != null,
+ () => `onSnippet must be provided if snippetDurationSec ` +
+ `is provided.`);
+ }
+ if (options.onSnippet != null) {
+ tf.util.assert(
+ options.snippetDurationSec != null,
+ () => `snippetDurationSec must be provided if onSnippet ` +
+ `is provided.`);
+ }
+ const frameDurationSec =
+ this.parameters.fftSize / this.parameters.sampleRateHz;
+ const totalDurationSec = frameDurationSec * numFramesPerSpectrogram;
+
+ this.streaming = true;
+ return new Promise(resolve => {
+ const stepFactor = options.snippetDurationSec == null ?
+ 1 :
+ options.snippetDurationSec / totalDurationSec;
+ const overlapFactor = 1 - stepFactor;
+ const callbackCountTarget = Math.round(1 / stepFactor);
+ let callbackCount = 0;
+ let lastIndex = -1;
+ const spectrogramSnippets: Float32Array[] = [];
+
+ const spectrogramCallback: SpectrogramCallback =
+ async (freqData: tf.Tensor, timeData?: tf.Tensor) => {
+ // TODO(cais): can we consolidate the logic in the two branches?
+ if (options.onSnippet == null) {
+ const normalizedX = normalize(freqData);
+ this.dataset.addExample({
+ label: word,
+ spectrogram: {
+ data: await normalizedX.data() as Float32Array,
+ frameSize: this.nonBatchInputShape[1],
+ },
+ rawAudio: options.includeRawAudio ? {
+ data: await timeData.data() as Float32Array,
+ sampleRateHz: this.audioDataExtractor.sampleRateHz
+ } :
+ undefined
+ });
+ normalizedX.dispose();
+ await this.audioDataExtractor.stop();
+ this.streaming = false;
+ this.collateTransferWords();
+ resolve({
+ data: await freqData.data() as Float32Array,
+ frameSize: this.nonBatchInputShape[1],
+ });
+ } else {
+ const data = await freqData.data() as Float32Array;
+ if (lastIndex === -1) {
+ lastIndex = data.length;
+ }
+ let i = lastIndex - 1;
+ while (data[i] !== 0 && i >= 0) {
+ i--;
+ }
+ const increment = lastIndex - i - 1;
+ lastIndex = i + 1;
+ const snippetData = data.slice(data.length - increment, data.length);
+ spectrogramSnippets.push(snippetData);
+
+ if (options.onSnippet != null) {
+ options.onSnippet(
+ {data: snippetData, frameSize: this.nonBatchInputShape[1]});
+ }
+
+ if (callbackCount++ === callbackCountTarget) {
+ await this.audioDataExtractor.stop();
+ this.streaming = false;
+ this.collateTransferWords();
+
+ const normalized = normalizeFloat32Array(
+ concatenateFloat32Arrays(spectrogramSnippets));
+ const finalSpectrogram: SpectrogramData = {
+ data: normalized,
+ frameSize: this.nonBatchInputShape[1]
+ };
+ this.dataset.addExample({
+ label: word,
+ spectrogram: finalSpectrogram,
+ rawAudio: options.includeRawAudio ? {
+ data: await timeData.data() as Float32Array,
+ sampleRateHz: this.audioDataExtractor.sampleRateHz
+ } :
+ undefined
+ });
+ // TODO(cais): Fix 1-tensor memory leak.
+ resolve(finalSpectrogram);
+ }
+ }
+ return false;
+ };
+ this.audioDataExtractor = new BrowserFftFeatureExtractor({
+ sampleRateHz: this.parameters.sampleRateHz,
+ numFramesPerSpectrogram,
+ columnTruncateLength: this.nonBatchInputShape[1],
+ suppressionTimeMillis: 0,
+ spectrogramCallback,
+ overlapFactor,
+ includeRawAudio: options.includeRawAudio
+ });
+ this.audioDataExtractor.start(options.audioTrackConstraints);
+ });
+ }
+
+ /**
+ * Clear all transfer learning examples collected so far.
+ */
+ clearExamples(): void {
+ tf.util.assert(
+ this.words != null && this.words.length > 0 && !this.dataset.empty(),
+ () =>
+ `No transfer learning examples exist for model name ${this.name}`);
+ this.dataset.clear();
+ this.words = null;
+ }
+
+ /**
+ * Get counts of the word examples that have been collected for a
+ * transfer-learning model.
+ *
+ * @returns {{[word: string]: number}} A map from word name to number of
+ * examples collected for that word so far.
+ */
+ countExamples(): {[word: string]: number} {
+ if (this.dataset.empty()) {
+ throw new Error(
+ `No examples have been collected for transfer-learning model ` +
+ `named '${this.name}' yet.`);
+ }
+ return this.dataset.getExampleCounts();
+ }
+
+ /**
+ * Get examples currently held by the transfer-learning recognizer.
+ *
+ * @param label Label requested.
+ * @returns An array of `Example`s, along with their UIDs.
+ */
+ getExamples(label: string): Array<{uid: string, example: Example}> {
+ return this.dataset.getExamples(label);
+ }
+
+ /** Set the key frame index of a given example. */
+ setExampleKeyFrameIndex(uid: string, keyFrameIndex: number): void {
+ this.dataset.setExampleKeyFrameIndex(uid, keyFrameIndex);
+ }
+
+ /**
+ * Remove an example from the current dataset.
+ *
+ * @param uid The UID of the example to remove.
+ */
+ removeExample(uid: string): void {
+ this.dataset.removeExample(uid);
+ this.collateTransferWords();
+ }
+
+ /**
+ * Check whether the underlying dataset is empty.
+ *
+ * @returns A boolean indicating whether the underlying dataset is empty.
+ */
+ isDatasetEmpty(): boolean {
+ return this.dataset.empty();
+ }
+
+ /**
+ * Load an array of serialized examples.
+ *
+ * @param serialized The examples in their serialized format.
+ * @param clearExisting Whether to clear the existing examples while
+ * performing the loading (default: false).
+ */
+ loadExamples(serialized: ArrayBuffer, clearExisting = false): void {
+ const incomingDataset = new Dataset(serialized);
+ if (clearExisting) {
+ this.clearExamples();
+ }
+
+ const incomingVocab = incomingDataset.getVocabulary();
+ for (const label of incomingVocab) {
+ const examples = incomingDataset.getExamples(label);
+ for (const example of examples) {
+ this.dataset.addExample(example.example);
+ }
+ }
+
+ this.collateTransferWords();
+ }
+
+ /**
+ * Serialize the existing examples.
+ *
+ * @param wordLabels Optional word label(s) to serialize. If specified, only
+ * the examples with labels matching the argument will be serialized. If
+ * any specified word label does not exist in the vocabulary of this
+ * transfer recognizer, an Error will be thrown.
+ * @returns An `ArrayBuffer` object amenable to transmission and storage.
+ */
+ serializeExamples(wordLabels?: string|string[]): ArrayBuffer {
+ return this.dataset.serialize(wordLabels);
+ }
+
+ /**
+ * Collect the vocabulary of this transfer-learned recognizer.
+ *
+ * The words are put in an alphabetically sorted order.
+ */
+ private collateTransferWords() {
+ this.words = this.dataset.getVocabulary();
+ }
+
+ /**
+ * Collect the transfer-learning data as `tf.Tensor`s.
+ *
+ * Used for training and evaluation when the amount of data is relatively
+ * small.
+ *
+ * @param windowHopRatio Ratio betwen hop length in number of frames and the
+ * number of frames in a long spectrogram. Used during extraction
+ * of multiple windows from the long spectrogram.
+ * @returns xs: The feature tensors (xs), a 4D tf.Tensor.
+ * ys: The target tensors (ys), one-hot encoding, a 2D tf.Tensor.
+ */
+ private collectTransferDataAsTensors(
+ windowHopRatio?: number,
+ augmentationOptions?: AudioDataAugmentationOptions):
+ {xs: tf.Tensor, ys: tf.Tensor} {
+ const numFrames = this.nonBatchInputShape[0];
+ windowHopRatio = windowHopRatio || DEFAULT_WINDOW_HOP_RATIO;
+ const hopFrames = Math.round(windowHopRatio * numFrames);
+ const out = this.dataset.getData(
+ null, {numFrames, hopFrames, ...augmentationOptions}) as
+ {xs: tf.Tensor4D, ys?: tf.Tensor2D};
+ return {xs: out.xs, ys: out.ys as tf.Tensor};
+ }
+
+ /**
+ * Same as `collectTransferDataAsTensors`, but returns `tf.data.Dataset`s.
+ *
+ * Used for training and evaluation when the amount of data is large.
+ *
+ * @param windowHopRatio Ratio betwen hop length in number of frames and the
+ * number of frames in a long spectrogram. Used during extraction
+ * of multiple windows from the long spectrogram.
+ * @param validationSplit The validation split to be used for splitting
+ * the raw data between the `tf.data.Dataset` objects for training and
+ * validation.
+ * @param batchSize Batch size used for the `tf.data.Dataset.batch()` call
+ * during the creation of the dataset objects.
+ * @return Two `tf.data.Dataset` objects, one for training and one for
+ * validation. Each of the objects may be directly fed into
+ * `this.model.fitDataset`.
+ */
+ private collectTransferDataAsTfDataset(
+ windowHopRatio?: number, validationSplit = 0.15, batchSize = 32,
+ augmentationOptions?: AudioDataAugmentationOptions):
+ [tfd.Dataset<{}>, tfd.Dataset<{}>] {
+ const numFrames = this.nonBatchInputShape[0];
+ windowHopRatio = windowHopRatio || DEFAULT_WINDOW_HOP_RATIO;
+ const hopFrames = Math.round(windowHopRatio * numFrames);
+ return this.dataset.getData(null, {
+ numFrames,
+ hopFrames,
+ getDataset: true,
+ datasetBatchSize: batchSize,
+ datasetValidationSplit: validationSplit,
+ ...augmentationOptions
+ }) as [tfd.Dataset<{}>, tfd.Dataset<{}>];
+ // TODO(cais): See if we can tighten the typing.
+ }
+
+ /**
+ * Train the transfer-learning model.
+ *
+ * The last dense layer of the base model is replaced with new softmax dense
+ * layer.
+ *
+ * It is assume that at least one category of data has been collected (using
+ * multiple calls to the `collectTransferExample` method).
+ *
+ * @param config {TransferLearnConfig} Optional configurations fot the
+ * training of the transfer-learning model.
+ * @returns {tf.History} A history object with the loss and accuracy values
+ * from the training of the transfer-learning model.
+ * @throws Error, if `modelName` is invalid or if not sufficient training
+ * examples have been collected yet.
+ */
+ async train(config?: TransferLearnConfig):
+ Promise {
+ tf.util.assert(
+ this.words != null && this.words.length > 0,
+ () =>
+ `Cannot train transfer-learning model '${this.name}' because no ` +
+ `transfer learning example has been collected.`);
+ tf.util.assert(
+ this.words.length > 1,
+ () => `Cannot train transfer-learning model '${
+ this.name}' because only ` +
+ `1 word label ('${JSON.stringify(this.words)}') ` +
+ `has been collected for transfer learning. Requires at least 2.`);
+ if (config.fineTuningEpochs != null) {
+ tf.util.assert(
+ config.fineTuningEpochs >= 0 &&
+ Number.isInteger(config.fineTuningEpochs),
+ () => `If specified, fineTuningEpochs must be a non-negative ` +
+ `integer, but received ${config.fineTuningEpochs}`);
+ }
+
+ if (config == null) {
+ config = {};
+ }
+
+ if (this.model == null) {
+ this.createTransferModelFromBaseModel();
+ }
+
+ // This layer needs to be frozen for the initial phase of the
+ // transfer learning. During subsequent fine-tuning (if any), it will
+ // be unfrozen.
+ this.secondLastBaseDenseLayer.trainable = false;
+
+ // Compile model for training.
+ this.model.compile({
+ loss: 'categoricalCrossentropy',
+ optimizer: config.optimizer || 'sgd',
+ metrics: ['acc']
+ });
+
+ // Use `tf.data.Dataset` objects for training of the total duration of
+ // the recordings exceeds 60 seconds. Otherwise, use `tf.Tensor` objects.
+ const datasetDurationMillisThreshold =
+ config.fitDatasetDurationMillisThreshold == null ?
+ 60e3 :
+ config.fitDatasetDurationMillisThreshold;
+ if (this.dataset.durationMillis() > datasetDurationMillisThreshold) {
+ console.log(
+ `Detected large dataset: total duration = ` +
+ `${this.dataset.durationMillis()} ms > ` +
+ `${datasetDurationMillisThreshold} ms. ` +
+ `Training transfer model using fitDataset() instead of fit()`);
+ return this.trainOnDataset(config);
+ } else {
+ return this.trainOnTensors(config);
+ }
+ }
+
+ /** Helper function for training on tf.data.Dataset objects. */
+ private async trainOnDataset(config?: TransferLearnConfig):
+ Promise {
+ tf.util.assert(config.epochs > 0, () => `Invalid config.epochs`);
+ // Train transfer-learning model using fitDataset
+
+ const batchSize = config.batchSize == null ? 32 : config.batchSize;
+ const windowHopRatio = config.windowHopRatio || DEFAULT_WINDOW_HOP_RATIO;
+ const [trainDataset, valDataset] = this.collectTransferDataAsTfDataset(
+ windowHopRatio, config.validationSplit, batchSize,
+ {augmentByMixingNoiseRatio: config.augmentByMixingNoiseRatio});
+ const t0 = tf.util.now();
+ const history = await this.model.fitDataset(trainDataset, {
+ epochs: config.epochs,
+ validationData: config.validationSplit > 0 ? valDataset : null,
+ callbacks: config.callback == null ? null : [config.callback]
+ });
+ console.log(`fitDataset() took ${(tf.util.now() - t0).toFixed(2)} ms`);
+
+ if (config.fineTuningEpochs != null && config.fineTuningEpochs > 0) {
+ // Perform fine-tuning.
+ const t0 = tf.util.now();
+ const fineTuningHistory = await this.fineTuningUsingTfDatasets(
+ config, trainDataset, valDataset);
+ console.log(
+ `fitDataset() (fine-tuning) took ` +
+ `${(tf.util.now() - t0).toFixed(2)} ms`);
+ return [history, fineTuningHistory];
+ } else {
+ return history;
+ }
+ }
+
+ /** Helper function for training on tf.Tensor objects. */
+ private async trainOnTensors(config?: TransferLearnConfig):
+ Promise {
+ // Prepare the data.
+ const windowHopRatio = config.windowHopRatio || DEFAULT_WINDOW_HOP_RATIO;
+ const {xs, ys} = this.collectTransferDataAsTensors(
+ windowHopRatio,
+ {augmentByMixingNoiseRatio: config.augmentByMixingNoiseRatio});
+ console.log(
+ `Training data: xs.shape = ${xs.shape}, ys.shape = ${ys.shape}`);
+
+ let trainXs: tf.Tensor;
+ let trainYs: tf.Tensor;
+ let valData: [tf.Tensor, tf.Tensor];
+ try {
+ // TODO(cais): The balanced split may need to be pushed down to the
+ // level of the Dataset class to avoid leaks between train and val
+ // splits.
+ if (config.validationSplit != null) {
+ const splits = balancedTrainValSplit(xs, ys, config.validationSplit);
+ trainXs = splits.trainXs;
+ trainYs = splits.trainYs;
+ valData = [splits.valXs, splits.valYs];
+ } else {
+ trainXs = xs;
+ trainYs = ys;
+ }
+
+ const history = await this.model.fit(trainXs, trainYs, {
+ epochs: config.epochs == null ? 20 : config.epochs,
+ validationData: valData,
+ batchSize: config.batchSize,
+ callbacks: config.callback == null ? null : [config.callback]
+ });
+
+ if (config.fineTuningEpochs != null && config.fineTuningEpochs > 0) {
+ // Fine tuning: unfreeze the second-last dense layer of the base
+ // model.
+ const fineTuningHistory = await this.fineTuningUsingTensors(
+ config, trainXs, trainYs, valData);
+ return [history, fineTuningHistory];
+ } else {
+ return history;
+ }
+ } finally {
+ tf.dispose([xs, ys, trainXs, trainYs, valData]);
+ }
+ }
+
+ private async fineTuningUsingTfDatasets(
+ config: TransferLearnConfig, trainDataset: tfd.Dataset<{}>,
+ valDataset: tfd.Dataset<{}>): Promise {
+ const originalTrainableValue = this.secondLastBaseDenseLayer.trainable;
+ this.secondLastBaseDenseLayer.trainable = true;
+
+ // Recompile model after unfreezing layer.
+ const fineTuningOptimizer: string|tf.Optimizer =
+ config.fineTuningOptimizer == null ? 'sgd' : config.fineTuningOptimizer;
+ this.model.compile({
+ loss: 'categoricalCrossentropy',
+ optimizer: fineTuningOptimizer,
+ metrics: ['acc']
+ });
+
+ const fineTuningHistory = await this.model.fitDataset(trainDataset, {
+ epochs: config.fineTuningEpochs,
+ validationData: valDataset,
+ callbacks: config.callback == null ? null : [config.callback]
+ });
+ // Set the trainable attribute of the fine-tuning layer to its
+ // previous value.
+ this.secondLastBaseDenseLayer.trainable = originalTrainableValue;
+ return fineTuningHistory;
+ }
+
+ private async fineTuningUsingTensors(
+ config: TransferLearnConfig, trainXs: tf.Tensor, trainYs: tf.Tensor,
+ valData: [tf.Tensor, tf.Tensor]): Promise {
+ const originalTrainableValue = this.secondLastBaseDenseLayer.trainable;
+ this.secondLastBaseDenseLayer.trainable = true;
+
+ // Recompile model after unfreezing layer.
+ const fineTuningOptimizer: string|tf.Optimizer =
+ config.fineTuningOptimizer == null ? 'sgd' : config.fineTuningOptimizer;
+ this.model.compile({
+ loss: 'categoricalCrossentropy',
+ optimizer: fineTuningOptimizer,
+ metrics: ['acc']
+ });
+
+ const fineTuningHistory = await this.model.fit(trainXs, trainYs, {
+ epochs: config.fineTuningEpochs,
+ validationData: valData,
+ batchSize: config.batchSize,
+ callbacks: config.fineTuningCallback == null ? null :
+ [config.fineTuningCallback]
+ });
+ // Set the trainable attribute of the fine-tuning layer to its
+ // previous value.
+ this.secondLastBaseDenseLayer.trainable = originalTrainableValue;
+ return fineTuningHistory;
+ }
+
+ /**
+ * Perform evaluation of the model using the examples that the model
+ * has loaded.
+ *
+ * @param config Configuration object for the evaluation.
+ * @returns A Promise of the result of evaluation.
+ */
+ async evaluate(config: EvaluateConfig): Promise {
+ tf.util.assert(
+ config.wordProbThresholds != null &&
+ config.wordProbThresholds.length > 0,
+ () => `Received null or empty wordProbThresholds`);
+
+ // TODO(cais): Maybe relax this requirement.
+ const NOISE_CLASS_INDEX = 0;
+ tf.util.assert(
+ this.words[NOISE_CLASS_INDEX] === BACKGROUND_NOISE_TAG,
+ () => `Cannot perform evaluation when the first tag is not ` +
+ `${BACKGROUND_NOISE_TAG}`);
+
+ return tf.tidy(() => {
+ const rocCurve: ROCCurve = [];
+ let auc = 0;
+ const {xs, ys} = this.collectTransferDataAsTensors(config.windowHopRatio);
+ const indices = ys.argMax(-1).dataSync();
+ const probs = this.model.predict(xs) as tf.Tensor;
+
+ // To calcaulte ROC, we collapse all word probabilites into a single
+ // positive class, while _background_noise_ is treated as the
+ // negative class.
+ const maxWordProbs =
+ tf.max(tf.slice(
+ probs, [0, 1], [probs.shape[0], probs.shape[1] - 1]), -1);
+ const total = probs.shape[0];
+
+ // Calculate ROC curve.
+ for (let i = 0; i < config.wordProbThresholds.length; ++i) {
+ const probThreshold = config.wordProbThresholds[i];
+ const isWord =
+ maxWordProbs.greater(tf.scalar(probThreshold)).dataSync();
+
+ let negatives = 0;
+ let positives = 0;
+ let falsePositives = 0;
+ let truePositives = 0;
+ for (let i = 0; i < total; ++i) {
+ if (indices[i] === NOISE_CLASS_INDEX) {
+ negatives++;
+ if (isWord[i]) {
+ falsePositives++;
+ }
+ } else {
+ positives++;
+ if (isWord[i]) {
+ truePositives++;
+ }
+ }
+ }
+
+ // TODO(cais): Calculate per-hour false-positive rate.
+ const fpr = falsePositives / negatives;
+ const tpr = truePositives / positives;
+
+ rocCurve.push({probThreshold, fpr, tpr});
+ console.log(
+ `ROC thresh=${probThreshold}: ` +
+ `fpr=${fpr.toFixed(4)}, tpr=${tpr.toFixed(4)}`);
+
+ if (i > 0) {
+ // Accumulate to AUC.
+ auc += Math.abs((rocCurve[i - 1].fpr - rocCurve[i].fpr)) *
+ (rocCurve[i - 1].tpr + rocCurve[i].tpr) / 2;
+ }
+ }
+ return {rocCurve, auc};
+ });
+ }
+
+ /**
+ * Create an instance of tf.LayersModel for transfer learning.
+ *
+ * The top dense layer of the base model is replaced with a new softmax
+ * dense layer.
+ */
+ private createTransferModelFromBaseModel(): void {
+ tf.util.assert(
+ this.words != null,
+ () =>
+ `No word example is available for tranfer-learning model of name ` +
+ this.name);
+
+ // Find the second last dense layer.
+ const layers = this.baseModel.layers;
+ let layerIndex = layers.length - 2;
+ while (layerIndex >= 0) {
+ if (layers[layerIndex].getClassName().toLowerCase() === 'dense') {
+ break;
+ }
+ layerIndex--;
+ }
+ if (layerIndex < 0) {
+ throw new Error('Cannot find a hidden dense layer in the base model.');
+ }
+ this.secondLastBaseDenseLayer = layers[layerIndex];
+ const truncatedBaseOutput =
+ this.secondLastBaseDenseLayer.output as tfl.SymbolicTensor;
+
+ this.transferHead = tfl.sequential();
+ this.transferHead.add(tfl.layers.dense({
+ units: this.words.length,
+ activation: 'softmax',
+ inputShape: truncatedBaseOutput.shape.slice(1),
+ name: 'NewHeadDense'
+ }));
+ const transferOutput =
+ this.transferHead.apply(truncatedBaseOutput) as tfl.SymbolicTensor;
+ this.model =
+ tfl.model({inputs: this.baseModel.inputs, outputs: transferOutput});
+ }
+
+ /**
+ * Get the input shape of the underlying tf.LayersModel.
+ *
+ * @returns The input shape.
+ */
+ modelInputShape(): tfl.Shape {
+ return this.baseModel.inputs[0].shape;
+ }
+
+ getMetadata(): SpeechCommandRecognizerMetadata {
+ return {
+ tfjsSpeechCommandsVersion: version,
+ modelName: this.name,
+ timeStamp: new Date().toISOString(),
+ wordLabels: this.wordLabels()
+ };
+ }
+
+ async save(handlerOrURL?: string|tf.io.IOHandler): Promise {
+ const isCustomPath = handlerOrURL != null;
+ handlerOrURL = handlerOrURL || getCanonicalSavePath(this.name);
+
+ if (!isCustomPath) {
+ // First, save the words and other metadata.
+ const metadataMapStr =
+ localStorageWrapper.localStorage.getItem(SAVED_MODEL_METADATA_KEY);
+ const metadataMap =
+ metadataMapStr == null ? {} : JSON.parse(metadataMapStr);
+ metadataMap[this.name] = this.getMetadata();
+ localStorageWrapper.localStorage.setItem(
+ SAVED_MODEL_METADATA_KEY, JSON.stringify(metadataMap));
+ }
+ console.log(`Saving model to ${handlerOrURL}`);
+ return this.model.save(handlerOrURL);
+ }
+
+ async load(handlerOrURL?: string|tf.io.IOHandler): Promise {
+ const isCustomPath = handlerOrURL != null;
+ handlerOrURL = handlerOrURL || getCanonicalSavePath(this.name);
+
+ if (!isCustomPath) {
+ // First, load the words and other metadata.
+ const metadataMap = JSON.parse(
+ localStorageWrapper.localStorage.getItem(SAVED_MODEL_METADATA_KEY));
+ if (metadataMap == null || metadataMap[this.name] == null) {
+ throw new Error(
+ `Cannot find metadata for transfer model named ${this.name}"`);
+ }
+ this.words = metadataMap[this.name].wordLabels;
+ console.log(
+ `Loaded word list for model named ${this.name}: ${this.words}`);
+ }
+ this.model = await tfl.loadLayersModel(handlerOrURL);
+ console.log(`Loaded model from ${handlerOrURL}:`);
+ this.model.summary();
+ }
+
+ /**
+ * Overridden method to prevent creating a nested transfer-learning
+ * recognizer.
+ *
+ * @param name
+ */
+ createTransfer(name: string): TransferBrowserFftSpeechCommandRecognizer {
+ throw new Error(
+ 'Creating transfer-learned recognizer from a transfer-learned ' +
+ 'recognizer is not supported.');
+ }
+}
+
+function getCanonicalSavePath(name: string): string {
+ return `${SAVE_PATH_PREFIX}${name}`;
+}
+
+/**
+ * List the model that are currently saved locally in the browser.
+ *
+ * @returns An array of transfer-learned speech-commands models
+ * that are currently saved in the browser locally.
+ */
+export async function listSavedTransferModels(): Promise {
+ const models = await tf.io.listModels();
+ const keys = [];
+ for (const key in models) {
+ if (key.startsWith(SAVE_PATH_PREFIX)) {
+ keys.push(key.slice(SAVE_PATH_PREFIX.length));
+ }
+ }
+ return keys;
+}
+
+/**
+ * Delete a locally-saved, transfer-learned speech-commands model.
+ *
+ * @param name The name of the transfer-learned model to be deleted.
+ */
+export async function deleteSavedTransferModel(name: string): Promise {
+ // Delete the words from local storage.
+ let metadataMap = JSON.parse(
+ localStorageWrapper.localStorage.getItem(SAVED_MODEL_METADATA_KEY));
+ if (metadataMap == null) {
+ metadataMap = {};
+ }
+ if (metadataMap[name] != null) {
+ delete metadataMap[name];
+ }
+ localStorageWrapper.localStorage.setItem(
+ SAVED_MODEL_METADATA_KEY, JSON.stringify(metadataMap));
+ await tf.io.removeModel(getCanonicalSavePath(name));
+}
diff --git a/音频分类/speech-commands/src/browser_fft_recognizer_test.ts b/音频分类/speech-commands/src/browser_fft_recognizer_test.ts
new file mode 100644
index 0000000..4826ace
--- /dev/null
+++ b/音频分类/speech-commands/src/browser_fft_recognizer_test.ts
@@ -0,0 +1,1666 @@
+/**
+ * @license
+ * Copyright 2019 Google LLC. All Rights Reserved.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =============================================================================
+ */
+
+import '@tensorflow/tfjs-node';
+
+import * as tf from '@tensorflow/tfjs-core';
+// tslint:disable-next-line: no-imports-from-dist
+import {describeWithFlags, NODE_ENVS} from '@tensorflow/tfjs-core/dist/jasmine_util';
+import * as tfl from '@tensorflow/tfjs-layers';
+import {writeFileSync} from 'fs';
+import {join} from 'path';
+import * as rimraf from 'rimraf';
+import * as tempfile from 'tempfile';
+
+import {BrowserFftSpeechCommandRecognizer, deleteSavedTransferModel, getMajorAndMinorVersion, listSavedTransferModels, localStorageWrapper, SAVED_MODEL_METADATA_KEY} from './browser_fft_recognizer';
+import * as BrowserFftUtils from './browser_fft_utils';
+import {FakeAudioContext, FakeAudioMediaStream} from './browser_test_utils';
+import {arrayBuffer2SerializedExamples, BACKGROUND_NOISE_TAG} from './dataset';
+import {create} from './index';
+import {SpeechCommandRecognizerResult} from './types';
+import {version} from './version';
+
+describe('getMajorAndMinorVersion', () => {
+ it('Correct results', () => {
+ expect(getMajorAndMinorVersion('0.1.3')).toEqual('0.1');
+ expect(getMajorAndMinorVersion('1.0.9')).toEqual('1.0');
+ expect(getMajorAndMinorVersion('2.0.0rc0')).toEqual('2.0');
+ expect(getMajorAndMinorVersion('2.0.9999999')).toEqual('2.0');
+ expect(getMajorAndMinorVersion('3.0')).toEqual('3.0');
+ });
+});
+
+describeWithFlags('Browser FFT recognizer', NODE_ENVS, () => {
+ const fakeWords: string[] = [
+ '_background_noise_', 'down', 'eight', 'five', 'four', 'go', 'left', 'nine',
+ 'one', 'right', 'seven', 'six', 'stop', 'three', 'two', 'up', 'zero'
+ ];
+ const fakeWordsNoiseAndUnknownOnly: string[] =
+ ['_background_noise_', '_unknown_'];
+
+ const fakeNumFrames = 42;
+ const fakeColumnTruncateLength = 232;
+
+ let secondLastBaseDenseLayer: tfl.layers.Layer;
+ let tfLoadModelSpy: jasmine.Spy;
+
+ function setUpFakes(model?: tfl.Sequential, backgroundAndNoiseOnly = false) {
+ const words =
+ backgroundAndNoiseOnly ? fakeWordsNoiseAndUnknownOnly : fakeWords;
+ const numWords = words.length;
+ tfLoadModelSpy =
+ spyOn(tfl, 'loadLayersModel').and.callFake((url: string) => {
+ if (model == null) {
+ model = tfl.sequential();
+ model.add(tfl.layers.flatten(
+ {inputShape: [fakeNumFrames, fakeColumnTruncateLength, 1]}));
+ secondLastBaseDenseLayer = tfl.layers.dense({
+ units: 4,
+ activation: 'relu',
+ kernelInitializer: 'leCunNormal'
+ });
+ model.add(secondLastBaseDenseLayer);
+ model.add(tfl.layers.dense({
+ units: numWords,
+ useBias: false,
+ kernelInitializer: 'leCunNormal',
+ activation: 'softmax'
+ }));
+ }
+ return model;
+ });
+ spyOn(BrowserFftUtils, 'loadMetadataJson')
+ .and.callFake(async (url: string) => {
+ return {words};
+ });
+
+ spyOn(BrowserFftUtils, 'getAudioContextConstructor')
+ .and.callFake(() => FakeAudioContext.createInstance);
+ spyOn(BrowserFftUtils, 'getAudioMediaStream')
+ .and.callFake(() => new FakeAudioMediaStream());
+ }
+
+ it('Constructor works', () => {
+ const recognizer = new BrowserFftSpeechCommandRecognizer();
+ expect(recognizer.isListening()).toEqual(false);
+ expect(recognizer.params().sampleRateHz).toEqual(44100);
+ expect(recognizer.params().fftSize).toEqual(1024);
+ });
+
+ it('ensureModelLoaded succeeds', async () => {
+ setUpFakes();
+
+ const recognizer = new BrowserFftSpeechCommandRecognizer();
+ await recognizer.ensureModelLoaded();
+ expect(recognizer.wordLabels()).toEqual(fakeWords);
+ expect(recognizer.model instanceof tfl.LayersModel).toEqual(true);
+ expect(recognizer.modelInputShape()).toEqual([
+ null, fakeNumFrames, fakeColumnTruncateLength, 1
+ ]);
+ });
+
+ it('ensureModelLoaded fails: words - model output mismatch', async () => {
+ const fakeModel = tfl.sequential();
+ fakeModel.add(tfl.layers.flatten(
+ {inputShape: [fakeNumFrames, fakeColumnTruncateLength, 1]}));
+ fakeModel.add(tfl.layers.dense({units: 12, activation: 'softmax'}));
+ setUpFakes(fakeModel);
+
+ const recognizer = new BrowserFftSpeechCommandRecognizer();
+ let caughtError: Error;
+ try {
+ await recognizer.ensureModelLoaded();
+ } catch (err) {
+ caughtError = err;
+ }
+ expect(caughtError.message)
+ .toMatch(/Mismatch between .* dimension.*12.*17/);
+ });
+
+ async function createFakeModelArtifact(tmpDir: string) {
+ const model = tfl.sequential();
+ model.add(tfl.layers.reshape(
+ {targetShape: [43 * 232], inputShape: [43, 232, 1]}));
+ model.add(tfl.layers.dense({units: 4, activation: 'softmax'}));
+ await model.save(`file://${tmpDir}`);
+ }
+
+ function createFakeMetadataFile(tmpDir: string) {
+ // Construct the metadata.json for the fake model.
+ const metadata: {} = {
+ wordLabels: ['_background_noise_', '_unknown_', 'foo', 'bar'],
+ frameSize: 232
+ };
+ const metadataPath = join(tmpDir, 'metadata.json');
+ writeFileSync(metadataPath, JSON.stringify(metadata));
+ }
+
+ function createFakeMetadataFileWithLegacyWordsField(tmpDir: string) {
+ // Construct the metadata.json for the fake model.
+ const metadata: {} = {
+ words: ['_background_noise_', '_unknown_', 'foo', 'bar'],
+ frameSize: 232
+ };
+ const metadataPath = join(tmpDir, 'metadata.json');
+ writeFileSync(metadataPath, JSON.stringify(metadata));
+ }
+
+ it('Constructing recognizer: custom URLs', async () => {
+ // Construct a fake model
+ const tmpDir = tempfile();
+ await createFakeModelArtifact(tmpDir);
+ createFakeMetadataFile(tmpDir);
+
+ const modelPath = join(tmpDir, 'model.json');
+ const metadataPath = join(tmpDir, 'metadata.json');
+ const modelURL = `file://${modelPath}`;
+ const metadataURL = `file://${metadataPath}`;
+
+ const recognizer =
+ new BrowserFftSpeechCommandRecognizer(null, modelURL, metadataURL);
+ await recognizer.ensureModelLoaded();
+ expect(recognizer.wordLabels()).toEqual([
+ '_background_noise_', '_unknown_', 'foo', 'bar'
+ ]);
+
+ const recogResult = await recognizer.recognize(tf.zeros([2, 43, 232, 1]));
+ expect(recogResult.scores.length).toEqual(2);
+ expect((recogResult.scores[0] as Float32Array).length).toEqual(4);
+ expect((recogResult.scores[1] as Float32Array).length).toEqual(4);
+
+ rimraf(tmpDir, () => {});
+ });
+
+ it('Constructing recognizer: custom URLs, legacy words format', async () => {
+ // Construct a fake model
+ const tmpDir = tempfile();
+ await createFakeModelArtifact(tmpDir);
+ createFakeMetadataFileWithLegacyWordsField(tmpDir);
+
+ const modelPath = join(tmpDir, 'model.json');
+ const metadataPath = join(tmpDir, 'metadata.json');
+ const modelURL = `file://${modelPath}`;
+ const metadataURL = `file://${metadataPath}`;
+
+ const recognizer =
+ new BrowserFftSpeechCommandRecognizer(null, modelURL, metadataURL);
+ await recognizer.ensureModelLoaded();
+ expect(recognizer.wordLabels()).toEqual([
+ '_background_noise_', '_unknown_', 'foo', 'bar'
+ ]);
+
+ const recogResult = await recognizer.recognize(tf.zeros([2, 43, 232, 1]));
+ expect(recogResult.scores.length).toEqual(2);
+ expect((recogResult.scores[0] as Float32Array).length).toEqual(4);
+ expect((recogResult.scores[1] as Float32Array).length).toEqual(4);
+
+ rimraf(tmpDir, () => {});
+ });
+
+ it('Creating recognizer using custom URLs', async () => {
+ // Construct a fake model
+ const tmpDir = tempfile();
+ await createFakeModelArtifact(tmpDir);
+ createFakeMetadataFile(tmpDir);
+
+ const modelPath = join(tmpDir, 'model.json');
+ const metadataPath = join(tmpDir, 'metadata.json');
+ const modelURL = `file://${modelPath}`;
+ const metadataURL = `file://${metadataPath}`;
+
+ const recognizer = create('BROWSER_FFT', null, modelURL, metadataURL);
+ await recognizer.ensureModelLoaded();
+ expect(recognizer.wordLabels()).toEqual([
+ '_background_noise_', '_unknown_', 'foo', 'bar'
+ ]);
+
+ const recogResult = await recognizer.recognize(tf.zeros([2, 43, 232, 1]));
+ expect(recogResult.scores.length).toEqual(2);
+ expect((recogResult.scores[0] as Float32Array).length).toEqual(4);
+ expect((recogResult.scores[1] as Float32Array).length).toEqual(4);
+
+ rimraf(tmpDir, () => {});
+ });
+
+ it('Providing both vocabulary and modelURL leads to Error', () => {
+ expect(
+ () => new BrowserFftSpeechCommandRecognizer(
+ 'vocab_1', 'http://localhost/model.json',
+ 'http://localhost/metadata.json'))
+ .toThrowError(/vocabulary name must be null or undefined .* modelURL/);
+ });
+
+ it('Providing modelURL without metadataURL leads to Error', () => {
+ expect(
+ () => new BrowserFftSpeechCommandRecognizer(
+ null, 'http://localhost/model.json'))
+ .toThrowError(/modelURL and metadataURL must be both provided/);
+ });
+
+ it('Offline recognize succeeds with single tf.Tensor', async () => {
+ setUpFakes();
+
+ const spectrogram =
+ tf.zeros([1, fakeNumFrames, fakeColumnTruncateLength, 1]);
+ const recognizer = new BrowserFftSpeechCommandRecognizer();
+ const output = await recognizer.recognize(spectrogram);
+ expect(output.scores instanceof Float32Array).toEqual(true);
+ expect(output.scores.length).toEqual(17);
+ });
+
+ it('Offline recognize succeeds with batched tf.Tensor', async () => {
+ setUpFakes();
+
+ const spectrogram =
+ tf.zeros([3, fakeNumFrames, fakeColumnTruncateLength, 1]);
+ const recognizer = new BrowserFftSpeechCommandRecognizer();
+ const output = await recognizer.recognize(spectrogram);
+ expect(Array.isArray(output.scores)).toEqual(true);
+ expect(output.scores.length).toEqual(3);
+ for (let i = 0; i < 3; ++i) {
+ expect((output.scores[i] as Float32Array).length).toEqual(17);
+ }
+ });
+
+ it('Offline recognize call: includeEmbedding', async () => {
+ setUpFakes();
+
+ // A batch of examples.
+ const numExamples = 3;
+ const spectrogram =
+ tf.zeros([numExamples, fakeNumFrames, fakeColumnTruncateLength, 1]);
+ const recognizer = new BrowserFftSpeechCommandRecognizer();
+ // Warm-up recognize call, for subsequent memory-leak check.
+ await recognizer.recognize(spectrogram, {includeEmbedding: true});
+ const numTensors0 = tf.memory().numTensors; // For memory-leak check.
+ const output =
+ await recognizer.recognize(spectrogram, {includeEmbedding: true});
+ expect(Array.isArray(output.scores)).toEqual(true);
+ expect(output.scores.length).toEqual(3);
+ for (let i = 0; i < 3; ++i) {
+ expect((output.scores[i] as Float32Array).length).toEqual(17);
+ }
+ expect(output.embedding.rank).toEqual(2);
+ expect(output.embedding.shape[0]).toEqual(numExamples);
+ tf.dispose(output.embedding);
+ // Assert no memory leak.
+ expect(tf.memory().numTensors).toEqual(numTensors0);
+ });
+
+ it('Offline recognize fails due to incorrect shape', async () => {
+ setUpFakes();
+
+ const spectrogram =
+ tf.zeros([1, fakeNumFrames, fakeColumnTruncateLength, 2]);
+ const recognizer = new BrowserFftSpeechCommandRecognizer();
+ let caughtError: Error;
+ try {
+ await recognizer.recognize(spectrogram);
+ } catch (err) {
+ caughtError = err;
+ }
+ expect(caughtError.message).toMatch(/Expected .* shape .*, but got shape/);
+ });
+
+ it('Offline recognize succeeds with single Float32Array', async () => {
+ setUpFakes();
+
+ const spectrogram =
+ new Float32Array(fakeNumFrames * fakeColumnTruncateLength * 1);
+ const recognizer = new BrowserFftSpeechCommandRecognizer();
+ const output = await recognizer.recognize(spectrogram);
+ expect(output.scores instanceof Float32Array).toEqual(true);
+ expect(output.scores.length).toEqual(17);
+ });
+
+ it('Offline recognize succeeds with batched Float32Array', async () => {
+ setUpFakes();
+
+ const spectrogram =
+ new Float32Array(2 * fakeNumFrames * fakeColumnTruncateLength * 1);
+ const recognizer = new BrowserFftSpeechCommandRecognizer();
+ const output = await recognizer.recognize(spectrogram);
+ expect(Array.isArray(output.scores)).toEqual(true);
+ expect(output.scores.length).toEqual(2);
+ for (let i = 0; i < 2; ++i) {
+ expect((output.scores[i] as Float32Array).length).toEqual(17);
+ }
+ });
+
+ it('listen() call with invalid overlapFactor', async () => {
+ setUpFakes();
+ const recognizer = new BrowserFftSpeechCommandRecognizer();
+ let caughtError: Error;
+
+ try {
+ await recognizer.listen(
+ async (result: SpeechCommandRecognizerResult) => {},
+ {overlapFactor: -1.2});
+ } catch (err) {
+ caughtError = err;
+ }
+ expect(caughtError.message).toMatch(/Expected overlapFactor/);
+
+ try {
+ await recognizer.listen(
+ async (result: SpeechCommandRecognizerResult) => {},
+ {overlapFactor: 1});
+ } catch (err) {
+ caughtError = err;
+ }
+ expect(caughtError.message).toMatch(/Expected overlapFactor/);
+
+ try {
+ await recognizer.listen(
+ async (result: SpeechCommandRecognizerResult) => {},
+ {overlapFactor: 1.2});
+ } catch (err) {
+ caughtError = err;
+ }
+ expect(caughtError.message).toMatch(/Expected overlapFactor/);
+ });
+
+ it('listen() call with invalid probabilityThreshold', async () => {
+ setUpFakes();
+ const recognizer = new BrowserFftSpeechCommandRecognizer();
+ let caughtError: Error;
+ try {
+ await recognizer.listen(
+ async (result: SpeechCommandRecognizerResult) => {},
+ {probabilityThreshold: 1.2});
+ } catch (err) {
+ caughtError = err;
+ }
+ expect(caughtError.message)
+ .toMatch(/Invalid probabilityThreshold value: 1\.2/);
+
+ try {
+ await recognizer.listen(
+ async (result: SpeechCommandRecognizerResult) => {},
+ {probabilityThreshold: -0.1});
+ } catch (err) {
+ caughtError = err;
+ }
+ expect(caughtError.message)
+ .toMatch(/Invalid probabilityThreshold value: -0\.1/);
+ });
+
+ it('streaming: overlapFactor = 0', done => {
+ setUpFakes();
+ const recognizer = new BrowserFftSpeechCommandRecognizer();
+
+ const numCallbacksToComplete = 2;
+ let numCallbacksCompleted = 0;
+ const spectroDurationMillis = 900;
+ const tensorCounts: number[] = [];
+ const callbackTimestamps: number[] = [];
+ recognizer.listen(async (result: SpeechCommandRecognizerResult) => {
+ expect((result.scores as Float32Array).length).toEqual(fakeWords.length);
+
+ callbackTimestamps.push(tf.util.now());
+ if (callbackTimestamps.length > 1) {
+ const timeBetweenCallbacks =
+ callbackTimestamps[callbackTimestamps.length - 1] -
+ callbackTimestamps[callbackTimestamps.length - 2];
+ expect(
+ timeBetweenCallbacks > spectroDurationMillis &&
+ timeBetweenCallbacks < 1.3 * spectroDurationMillis)
+ .toBe(true);
+ }
+
+ tensorCounts.push(tf.memory().numTensors);
+ if (tensorCounts.length > 1) {
+ // Assert no memory leak.
+ expect(tensorCounts[tensorCounts.length - 1])
+ .toEqual(tensorCounts[tensorCounts.length - 2]);
+ }
+
+ // spectrogram is not provided by default.
+ expect(result.spectrogram).toBeUndefined();
+
+ // Embedding should not be included by default.
+ expect(result.embedding).toBeUndefined();
+
+ if (++numCallbacksCompleted >= numCallbacksToComplete) {
+ await recognizer.stopListening();
+ done();
+ }
+ }, {overlapFactor: 0, invokeCallbackOnNoiseAndUnknown: true});
+ });
+
+ it('streaming: overlapFactor = 0, includeEmbedding', done => {
+ setUpFakes();
+ const recognizer = new BrowserFftSpeechCommandRecognizer();
+
+ const numCallbacksToComplete = 2;
+ let numCallbacksCompleted = 0;
+ const tensorCounts: number[] = [];
+ const callbackTimestamps: number[] = [];
+ recognizer.listen(async (result: SpeechCommandRecognizerResult) => {
+ expect((result.scores as Float32Array).length).toEqual(fakeWords.length);
+
+ callbackTimestamps.push(tf.util.now());
+ const timeDelta = 50;
+ if (callbackTimestamps.length > 1) {
+ expect(
+ callbackTimestamps[callbackTimestamps.length - 1] -
+ callbackTimestamps[callbackTimestamps.length - 2])
+ .toBeGreaterThanOrEqual(
+ recognizer.params().spectrogramDurationMillis - timeDelta);
+ }
+
+ tensorCounts.push(tf.memory().numTensors);
+
+ // spectrogram is not provided by default.
+ expect(result.spectrogram).toBeUndefined();
+
+ // Embedding should not be included by default.
+ expect(result.embedding.rank).toEqual(2);
+ expect(result.embedding.shape[0]).toEqual(1);
+ // The number of units of the hidden dense layer.
+ expect(result.embedding.shape[1]).toEqual(4);
+
+ if (++numCallbacksCompleted >= numCallbacksToComplete) {
+ await recognizer.stopListening();
+ done();
+ }
+ }, {
+ overlapFactor: 0,
+ invokeCallbackOnNoiseAndUnknown: true,
+ includeEmbedding: true
+ });
+ });
+
+ it('streaming: overlapFactor = 0.5, includeSpectrogram', done => {
+ setUpFakes();
+ const recognizer = new BrowserFftSpeechCommandRecognizer();
+
+ const numCallbacksToComplete = 2;
+ let numCallbacksCompleted = 0;
+ const spectroDurationMillis = 900;
+ const tensorCounts: number[] = [];
+ const callbackTimestamps: number[] = [];
+ recognizer.listen(async (result: SpeechCommandRecognizerResult) => {
+ expect((result.scores as Float32Array).length).toEqual(fakeWords.length);
+
+ callbackTimestamps.push(tf.util.now());
+ if (callbackTimestamps.length > 1) {
+ const timeBetweenCallbacks =
+ callbackTimestamps[callbackTimestamps.length - 1] -
+ callbackTimestamps[callbackTimestamps.length - 2];
+ expect(
+ timeBetweenCallbacks > 0.5 * spectroDurationMillis &&
+ timeBetweenCallbacks < 0.8 * spectroDurationMillis)
+ .toBe(true);
+ }
+
+ tensorCounts.push(tf.memory().numTensors);
+ if (tensorCounts.length > 1) {
+ // Assert no memory leak.
+ expect(tensorCounts[tensorCounts.length - 1])
+ .toEqual(tensorCounts[tensorCounts.length - 2]);
+ }
+
+ // spectrogram is not provided by default.
+ expect(result.spectrogram.data.length)
+ .toBe(fakeNumFrames * fakeColumnTruncateLength);
+ expect(result.spectrogram.frameSize).toBe(fakeColumnTruncateLength);
+
+ if (++numCallbacksCompleted >= numCallbacksToComplete) {
+ await recognizer.stopListening();
+ done();
+ }
+ }, {
+ overlapFactor: 0.5,
+ includeSpectrogram: true,
+ invokeCallbackOnNoiseAndUnknown: true
+ });
+ });
+
+ it('streaming: invokeCallbackOnNoiseAndUnknown = false', done => {
+ setUpFakes(null, true);
+ const recognizer = new BrowserFftSpeechCommandRecognizer();
+
+ let callbackInvokeCount = 0;
+ recognizer.listen(async (result: SpeechCommandRecognizerResult) => {
+ callbackInvokeCount++;
+ }, {overlapFactor: 0.5, invokeCallbackOnNoiseAndUnknown: false});
+
+ setTimeout(() => {
+ recognizer.stopListening();
+ // Due to `invokeCallbackOnNoiseAndUnknown: false` and the fact that the
+ // vocabulary contains only _background_noise_ and _unknown_, the callback
+ // should have never been called.
+ expect(callbackInvokeCount).toEqual(0);
+ done();
+ }, 1000);
+ });
+
+ it('streaming: invokeCallbackOnNoiseAndUnknown = true', done => {
+ setUpFakes(null, true);
+ const recognizer = new BrowserFftSpeechCommandRecognizer();
+
+ let callbackInvokeCount = 0;
+ recognizer.listen(async (result: SpeechCommandRecognizerResult) => {
+ callbackInvokeCount++;
+ }, {overlapFactor: 0.5, invokeCallbackOnNoiseAndUnknown: true});
+
+ setTimeout(() => {
+ recognizer.stopListening();
+ // Even though the model predicts only _background_noise_ and _unknown_,
+ // the callback should have been invoked because of
+ // `invokeCallbackOnNoiseAndUnknown: true`.
+ expect(callbackInvokeCount).toBeGreaterThan(0);
+ done();
+ }, 1000);
+ });
+
+ it('Attempt to start streaming twice leads to Error', async () => {
+ setUpFakes();
+ const recognizer = new BrowserFftSpeechCommandRecognizer();
+ await recognizer.listen(
+ async (result: SpeechCommandRecognizerResult) => {});
+ expect(recognizer.isListening()).toEqual(true);
+
+ let caughtError: Error;
+ try {
+ await recognizer.listen(
+ async (result: SpeechCommandRecognizerResult) => {});
+ } catch (err) {
+ caughtError = err;
+ }
+ expect(caughtError.message)
+ .toEqual('Cannot start streaming again when streaming is ongoing.');
+ expect(recognizer.isListening()).toEqual(true);
+
+ await recognizer.stopListening();
+ expect(recognizer.isListening()).toEqual(false);
+ });
+
+ it('Attempt to stop streaming twice leads to Error', async () => {
+ setUpFakes();
+ const recognizer = new BrowserFftSpeechCommandRecognizer();
+ await recognizer.listen(
+ async (result: SpeechCommandRecognizerResult) => {});
+ expect(recognizer.isListening()).toEqual(true);
+
+ await recognizer.stopListening();
+ expect(recognizer.isListening()).toEqual(false);
+
+ let caughtError: Error;
+ try {
+ await recognizer.stopListening();
+ } catch (err) {
+ caughtError = err;
+ }
+ expect(caughtError.message)
+ .toEqual('Cannot stop streaming when streaming is not ongoing.');
+ expect(recognizer.isListening()).toEqual(false);
+ });
+
+ it('Online recognize() call succeeds', async () => {
+ setUpFakes();
+ const recognizer = new BrowserFftSpeechCommandRecognizer();
+
+ for (let i = 0; i < 2; ++i) {
+ // No-arg call: online recognition.
+ const output = await recognizer.recognize();
+ expect(output.scores.length).toEqual(fakeWords.length);
+ expect(output.embedding).toBeUndefined();
+ }
+ });
+
+ it('Online recognize() call with includeEmbedding succeeds', async () => {
+ setUpFakes();
+ const recognizer = new BrowserFftSpeechCommandRecognizer();
+
+ for (let i = 0; i < 2; ++i) {
+ // No-arg call: online recognition.
+ const output = await recognizer.recognize(null, {includeEmbedding: true});
+ expect(output.scores.length).toEqual(fakeWords.length);
+ expect(output.embedding.rank).toEqual(2);
+ expect(output.embedding.shape[0]).toEqual(1);
+ expect(output.spectrogram).toBeUndefined();
+ }
+ });
+
+ it('Online recognize() call with includeSpectrogram succeeds', async () => {
+ setUpFakes();
+ const recognizer = new BrowserFftSpeechCommandRecognizer();
+
+ for (let i = 0; i < 2; ++i) {
+ // No-arg call: online recognition.
+ const output =
+ await recognizer.recognize(null, {includeSpectrogram: true});
+ expect(output.scores.length).toEqual(fakeWords.length);
+ expect(output.embedding).toBeUndefined();
+ expect(output.spectrogram.frameSize).toEqual(fakeColumnTruncateLength);
+ expect(output.spectrogram.data.length)
+ .toEqual(fakeColumnTruncateLength * fakeNumFrames);
+ }
+ });
+
+ it('collectExample with durationSec', async () => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer = base.createTransfer('xfer1');
+ const params = transfer.params();
+ // Double the length of the spectrogram.
+ const durationSec = params.spectrogramDurationMillis * 2 / 1e3;
+ const spectrogram = await transfer.collectExample('foo', {durationSec});
+ expect(spectrogram.data.length / fakeColumnTruncateLength / fakeNumFrames)
+ .toEqual(2);
+ const example = transfer.getExamples('foo')[0];
+ expect(example.example.rawAudio).toBeUndefined();
+ });
+
+ it('collectExample with 0 durationSec errors', async done => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer = base.createTransfer('xfer1');
+ const durationSec = 0;
+ try {
+ await transfer.collectExample('foo', {durationSec});
+ done.fail('Failed to catch expected error');
+ } catch (err) {
+ expect(err.message).toMatch(/Expected durationSec to be > 0/);
+ done();
+ }
+ });
+
+ it('collectExample: durationMultiplier&durationSec errors', async done => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer = base.createTransfer('xfer1');
+ const durationSec = 1;
+ const durationMultiplier = 2;
+ try {
+ await transfer.collectExample('foo', {durationSec, durationMultiplier});
+ done.fail('Failed to catch expected error');
+ } catch (err) {
+ expect(err.message).toMatch(/are mutually exclusive/);
+ done();
+ }
+ });
+
+ it('collectExample with onSnippet', async () => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer = base.createTransfer('xfer1');
+ const durationSec = 1;
+ const snippetDurationSec = 0.1;
+ const snippetLengths: number[] = [];
+ const finalSpectrogram = await transfer.collectExample('foo', {
+ durationSec,
+ snippetDurationSec,
+ onSnippet: async spectrogram => {
+ snippetLengths.push(spectrogram.data.length);
+ }
+ });
+ expect(snippetLengths.length).toEqual(11);
+ expect(snippetLengths[0]).toEqual(927);
+ // First audio sample is zero and should have been skipped.
+ for (let i = 1; i < snippetLengths.length; ++i) {
+ expect(snippetLengths[i]).toEqual(928);
+ }
+ expect(finalSpectrogram.data.length)
+ .toEqual(snippetLengths.reduce((x, prev) => x + prev));
+ expect(finalSpectrogram.data.length).toEqual(10208 - 1);
+ });
+
+ it('collectExample w/ invalid durationSec leads to error', async done => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer = base.createTransfer('xfer1');
+ const durationSec = 1;
+ const snippetDurationSec = 0;
+ try {
+ await transfer.collectExample('foo', {durationSec, snippetDurationSec});
+ done.fail();
+ } catch (error) {
+ expect(error.message).toMatch(/snippetDurationSec is expected to be > 0/);
+ done();
+ }
+ });
+
+ it('collectExample w/ onSnippet w/o snippetDurationSec error', async done => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer = base.createTransfer('xfer1');
+ const durationSec = 1;
+ try {
+ await transfer.collectExample(
+ 'foo', {durationSec, onSnippet: async spectrogram => {}});
+ done.fail();
+ } catch (error) {
+ expect(error.message)
+ .toMatch(/snippetDurationSec must be provided if onSnippet/);
+ done();
+ }
+ });
+
+ it('collectExample w/ snippetDurationSec w/o callback errors', async done => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer = base.createTransfer('xfer1');
+ const durationSec = 1;
+ const snippetDurationSec = 0.1;
+ try {
+ await transfer.collectExample('foo', {durationSec, snippetDurationSec});
+ done.fail();
+ } catch (error) {
+ expect(error.message)
+ .toMatch(/onSnippet must be provided if snippetDurationSec/);
+ done();
+ }
+ });
+
+ it('collectExample: includeRawAudio, no snippets', async () => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer = base.createTransfer('xfer1');
+ const durationSec = 1.5;
+ const includeRawAudio = true;
+ await transfer.collectExample('foo', {durationSec, includeRawAudio});
+ const examples = transfer.getExamples('foo');
+ expect(examples.length).toEqual(1);
+ expect(examples[0].example.rawAudio.sampleRateHz).toEqual(44100);
+ expect(examples[0].example.rawAudio.data.length / (durationSec * 44100))
+ .toBeCloseTo(1, 1e-3);
+ });
+
+ it('collectExample: includeRawAudio, with snippets', async () => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer = base.createTransfer('xfer1');
+ const durationSec = 1.5;
+ const snippetDurationSec = 0.1;
+ const includeRawAudio = true;
+ await transfer.collectExample('foo', {
+ durationSec,
+ includeRawAudio,
+ snippetDurationSec,
+ onSnippet: async spectrogram => {}
+ });
+ const examples = transfer.getExamples('foo');
+ expect(examples.length).toEqual(1);
+ expect(examples[0].example.rawAudio.sampleRateHz).toEqual(44100);
+ expect(examples[0].example.rawAudio.data.length / (durationSec * 44100))
+ .toBeCloseTo(1, 1e-3);
+ });
+
+ it('collectTransferLearningExample default transfer model', async () => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer = base.createTransfer('xfer1');
+ let spectrogram = await transfer.collectExample('foo');
+ expect(spectrogram.frameSize).toEqual(fakeColumnTruncateLength);
+ expect(spectrogram.data.length)
+ .toEqual(fakeNumFrames * fakeColumnTruncateLength);
+ expect(transfer.wordLabels()).toEqual(['foo']);
+ // Assert no cross-talk.
+ expect(base.wordLabels()).toEqual(fakeWords);
+ expect(transfer.countExamples()).toEqual({'foo': 1});
+
+ spectrogram = await transfer.collectExample('foo');
+ expect(spectrogram.frameSize).toEqual(fakeColumnTruncateLength);
+ expect(spectrogram.data.length)
+ .toEqual(fakeNumFrames * fakeColumnTruncateLength);
+ expect(transfer.wordLabels()).toEqual(['foo']);
+ expect(transfer.countExamples()).toEqual({'foo': 2});
+
+ spectrogram = await transfer.collectExample('bar');
+ expect(spectrogram.frameSize).toEqual(fakeColumnTruncateLength);
+ expect(spectrogram.data.length)
+ .toEqual(fakeNumFrames * fakeColumnTruncateLength);
+ expect(transfer.wordLabels()).toEqual(['bar', 'foo']);
+ expect(transfer.countExamples()).toEqual({'bar': 1, 'foo': 2});
+ });
+
+ it('createTransfer with invalid name leads to Error', async () => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ expect(() => base.createTransfer('')).toThrowError(/non-empty string/);
+ expect(() => base.createTransfer(null)).toThrowError(/non-empty string/);
+ expect(() => base.createTransfer(undefined))
+ .toThrowError(/non-empty string/);
+ });
+
+ it('createTransfer with duplicate name leads to Error', async () => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ base.createTransfer('xfer1');
+ expect(() => base.createTransfer('xfer1'))
+ .toThrowError(
+ /There is already a transfer-learning model named \'xfer1\'/);
+ base.createTransfer('xfer2');
+ });
+
+ it('createTransfer before model loading leads to Error', async () => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ expect(() => base.createTransfer('xfer1'))
+ .toThrowError(/Model has not been loaded yet/);
+ });
+
+ it('transfer recognizer has correct modelInputShape', async () => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer = base.createTransfer('xfer1');
+ expect(transfer.modelInputShape()).toEqual(base.modelInputShape());
+ });
+
+ it('transfer recognizer has correct params', async () => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer = base.createTransfer('xfer1');
+ expect(transfer.params()).toEqual(base.params());
+ });
+
+ it('clearTransferLearningExamples default transfer model', async () => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer = base.createTransfer('xfer1');
+ let spectrogram = await transfer.collectExample('foo');
+ expect(spectrogram.frameSize).toEqual(fakeColumnTruncateLength);
+ expect(spectrogram.data.length)
+ .toEqual(fakeNumFrames * fakeColumnTruncateLength);
+ expect(transfer.wordLabels()).toEqual(['foo']);
+ // Assert no cross-talk.
+ expect(base.wordLabels()).toEqual(fakeWords);
+ expect(transfer.countExamples()).toEqual({'foo': 1});
+
+ transfer.clearExamples();
+ expect(transfer.wordLabels()).toEqual(null);
+ expect(() => transfer.countExamples()).toThrow();
+
+ spectrogram = await transfer.collectExample('bar');
+ expect(spectrogram.frameSize).toEqual(fakeColumnTruncateLength);
+ expect(spectrogram.data.length)
+ .toEqual(fakeNumFrames * fakeColumnTruncateLength);
+ expect(transfer.wordLabels()).toEqual(['bar']);
+ expect(transfer.countExamples()).toEqual({'bar': 1});
+ });
+
+ it('Collect examples for 2 transfer models', async () => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer1 = base.createTransfer('xfer1');
+ let spectrogram = await transfer1.collectExample('foo');
+ expect(spectrogram.frameSize).toEqual(fakeColumnTruncateLength);
+ expect(spectrogram.data.length)
+ .toEqual(fakeNumFrames * fakeColumnTruncateLength);
+ expect(transfer1.wordLabels()).toEqual(['foo']);
+
+ const transfer2 = await base.createTransfer('xfer2');
+ spectrogram = await transfer2.collectExample('bar');
+ expect(spectrogram.frameSize).toEqual(fakeColumnTruncateLength);
+ expect(spectrogram.data.length)
+ .toEqual(fakeNumFrames * fakeColumnTruncateLength);
+ expect(transfer2.wordLabels()).toEqual(['bar']);
+ expect(transfer1.wordLabels()).toEqual(['foo']);
+
+ transfer1.clearExamples();
+ expect(transfer2.wordLabels()).toEqual(['bar']);
+ expect(transfer1.wordLabels()).toEqual(null);
+ // Assert no cross-talk.
+ expect(base.wordLabels()).toEqual(fakeWords);
+ });
+
+ it('clearExamples fails if called without examples', async () => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer = base.createTransfer('xfer1');
+ expect(() => transfer.clearExamples())
+ .toThrowError(/No transfer learning examples .*xfer1/);
+ });
+
+ it('collectExample fails on undefined/null/empty word', async () => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer = base.createTransfer('xfer1');
+ let errorCaught: Error;
+ try {
+ await transfer.collectExample(undefined);
+ } catch (err) {
+ errorCaught = err;
+ }
+ expect(errorCaught.message).toMatch(/non-empty string/);
+ try {
+ await transfer.collectExample(null);
+ } catch (err) {
+ errorCaught = err;
+ }
+ expect(errorCaught.message).toMatch(/non-empty string/);
+ try {
+ await transfer.collectExample('');
+ } catch (err) {
+ errorCaught = err;
+ }
+ expect(errorCaught.message).toMatch(/non-empty string/);
+ });
+
+ it('Concurrent collectTransferLearningExample call fails', async done => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer1 = await base.createTransfer('xfer1');
+ transfer1.collectExample('foo').then(() => {
+ done();
+ });
+
+ let caughtError: Error;
+ try {
+ await transfer1.collectExample('foo');
+ } catch (err) {
+ caughtError = err;
+ }
+ expect(caughtError.message)
+ .toMatch(/Cannot start collection of transfer-learning example/);
+ });
+
+ it('Concurrent collectExample+listen fails', async () => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ await base.listen(async (result: SpeechCommandRecognizerResult) => {});
+ expect(base.isListening()).toEqual(true);
+
+ const transfer = base.createTransfer('xfer1');
+ // Concurrent with the ongoing listening (started by the listen() call
+ // above).
+ const example = await transfer.collectExample('foo');
+ expect(example.frameSize).toEqual(232);
+
+ await base.stopListening();
+ expect(base.isListening()).toEqual(false);
+ });
+
+ it('trainTransferLearningModel default params', async done => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer = base.createTransfer('xfer1');
+ await transfer.collectExample('foo');
+ for (let i = 0; i < 2; ++i) {
+ await transfer.collectExample('bar');
+ }
+
+ // Train transfer-learning model once to make sure model is created
+ // first, so that we can check the change in the transfer-learning model's
+ // weights after a new round of training.
+ await transfer.train({epochs: 1, optimizer: tf.train.sgd(0)});
+
+ const baseModel = base.model;
+ // Assert that the base model has been frozen.
+ for (const layer of baseModel.layers) {
+ expect(layer.trainable).toEqual(false);
+ }
+
+ const baseModelOldWeightValues: Float32Array[] = [];
+ baseModel.layers.forEach(layer => {
+ layer.getWeights().forEach(w => {
+ baseModelOldWeightValues.push(w.dataSync() as Float32Array);
+ });
+ });
+
+ // tslint:disable-next-line:no-any
+ const transferHead = (transfer as any).transferHead as tfl.Sequential;
+ const numLayers = transferHead.layers.length;
+ const oldTransferWeightValues = transferHead.getLayer(null, numLayers - 1)
+ .getWeights()
+ .map(weight => weight.dataSync());
+
+ const history =
+ await transfer.train({optimizer: tf.train.sgd(1)}) as tfl.History;
+ expect(history.history.loss.length).toEqual(20);
+ expect(history.history.acc.length).toEqual(20);
+
+ const baseModelNewWeightValues: Float32Array[] = [];
+ baseModel.layers.forEach(layer => {
+ layer.getWeights().forEach(w => {
+ baseModelNewWeightValues.push(w.dataSync() as Float32Array);
+ });
+ });
+
+ // Verify that the weights of the dense layer in the base model doesn't
+ // change, i.e., is frozen.
+ const newTransferWeightValues = transferHead.getLayer(null, numLayers - 1)
+ .getWeights()
+ .map(weight => weight.dataSync());
+ baseModelOldWeightValues.forEach((oldWeight, i) => {
+ tf.test_util.expectArraysClose(baseModelNewWeightValues[i], oldWeight);
+ });
+ // Verify that the weight of the transfer-learning head model changes
+ // after training.
+ const maxWeightChanges = newTransferWeightValues.map(
+ (newValues, i) => tf.max(tf.abs(tf.sub(
+ tf.tensor1d(newValues),
+ tf.tensor1d(oldTransferWeightValues[i]))))
+ .dataSync()[0]);
+ expect(Math.max(...maxWeightChanges)).toBeGreaterThan(1e-3);
+
+ // Test recognize() with the transfer recognizer.
+ const spectrogram =
+ tf.zeros([1, fakeNumFrames, fakeColumnTruncateLength, 1]);
+ const result = await transfer.recognize(spectrogram);
+ expect(result.scores.length).toEqual(2);
+
+ // After the transfer learning is complete, listen() with the
+ // transfer-learned model's name should give scores only for the
+ // transfer-learned model.
+ expect(base.wordLabels()).toEqual(fakeWords);
+ expect(transfer.wordLabels()).toEqual(['bar', 'foo']);
+ transfer.listen(async (result: SpeechCommandRecognizerResult) => {
+ expect((result.scores as Float32Array).length).toEqual(2);
+ await transfer.stopListening();
+ done();
+ });
+ });
+
+ it('trainTransferLearningModel custom params', async done => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer = base.createTransfer('xfer1');
+ await transfer.collectExample('foo');
+ for (let i = 0; i < 2; ++i) {
+ await transfer.collectExample('bar');
+ }
+ const history =
+ await transfer.train({epochs: 10, batchSize: 2}) as tfl.History;
+ expect(history.history.loss.length).toEqual(10);
+ expect(history.history.acc.length).toEqual(10);
+
+ // After the transfer learning is complete, listen() with the
+ // transfer-learned model's name should give scores only for the
+ // transfer-learned model.
+ expect(base.wordLabels()).toEqual(fakeWords);
+ expect(transfer.wordLabels()).toEqual(['bar', 'foo']);
+ transfer.listen(async (result: SpeechCommandRecognizerResult) => {
+ expect((result.scores as Float32Array).length).toEqual(2);
+ await transfer.stopListening();
+ done();
+ });
+ });
+
+ it('trainTransferLearningModel w/ mixing-noise augmentation', async () => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer = base.createTransfer('xfer1');
+ await transfer.collectExample('foo');
+ for (let i = 0; i < 2; ++i) {
+ await transfer.collectExample(BACKGROUND_NOISE_TAG);
+ }
+ const history =
+ await transfer.train(
+ {epochs: 10, batchSize: 2, augmentByMixingNoiseRatio: 0.5}) as
+ tfl.History;
+ expect(history.history.loss.length).toEqual(10);
+ expect(history.history.acc.length).toEqual(10);
+
+ expect(base.wordLabels()).toEqual(fakeWords);
+ expect(transfer.wordLabels()).toEqual([BACKGROUND_NOISE_TAG, 'foo']);
+ });
+
+ it('train and evaluate', async () => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer = base.createTransfer('xfer1');
+ await transfer.collectExample('_background_noise_');
+ await transfer.collectExample('bar');
+ await transfer.collectExample('bar');
+ await transfer.train({epochs: 3, batchSize: 2, validationSplit: 0.5});
+
+ const wordProbThresholds = [0, 0.25, 0.5, 0.75, 1];
+ // Burn-in run for evaluate() memory tracking:
+ await transfer.evaluate({windowHopRatio: 0.25, wordProbThresholds});
+ const numTensors0 = tf.memory().numTensors;
+ const {rocCurve, auc} =
+ await transfer.evaluate({windowHopRatio: 0.25, wordProbThresholds});
+ // Assert no memory leak.
+ expect(tf.memory().numTensors).toEqual(numTensors0);
+ expect(rocCurve.length).toEqual(wordProbThresholds.length);
+ for (let i = 0; i < rocCurve.length; ++i) {
+ expect(rocCurve[i].probThreshold).toEqual(wordProbThresholds[i]);
+ expect(rocCurve[i].fpr).toBeGreaterThanOrEqual(0);
+ expect(rocCurve[i].fpr).toBeLessThanOrEqual(1);
+ expect(rocCurve[i].tpr).toBeGreaterThanOrEqual(0);
+ expect(rocCurve[i].tpr).toBeLessThanOrEqual(1);
+ }
+ expect(auc).toBeGreaterThanOrEqual(0);
+ expect(auc).toBeLessThanOrEqual(1);
+ });
+
+ it('train with validationSplit and listen', async done => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer = base.createTransfer('xfer1');
+ await transfer.collectExample('_background_noise_');
+ await transfer.collectExample('bar');
+ await transfer.collectExample('bar');
+ const history =
+ await transfer.train({epochs: 3, batchSize: 2, validationSplit: 0.5}) as
+ tfl.History;
+ expect(history.history.loss.length).toEqual(3);
+ expect(history.history.acc.length).toEqual(3);
+ expect(history.history.val_loss.length).toEqual(3);
+ expect(history.history.val_acc.length).toEqual(3);
+
+ // After the transfer learning is complete, listen() with the
+ // transfer-learned model's name should give scores only for the
+ // transfer-learned model.
+ expect(base.wordLabels()).toEqual(fakeWords);
+ expect(transfer.wordLabels()).toEqual(['_background_noise_', 'bar']);
+ transfer.listen(async (result: SpeechCommandRecognizerResult) => {
+ expect((result.scores as Float32Array).length).toEqual(2);
+ transfer.stopListening().then(done);
+ }, {probabilityThreshold: 0, invokeCallbackOnNoiseAndUnknown: true});
+ });
+
+ it('getMetadata works after transfer learning', async () => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer = base.createTransfer('xfer1');
+ await transfer.collectExample('_background_noise_');
+ await transfer.collectExample('bar');
+ await transfer.collectExample('bar');
+ await transfer.train({epochs: 1, batchSize: 2, validationSplit: 0.5});
+
+ const metadata = transfer.getMetadata();
+ expect(metadata.tfjsSpeechCommandsVersion).toEqual(version);
+ expect(metadata.modelName).toEqual('xfer1');
+ expect(metadata.timeStamp != null).toEqual(true);
+ expect(metadata.wordLabels).toEqual(['_background_noise_', 'bar']);
+ });
+
+ it('train with tf.data.Dataset, with fine-tuning', async () => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer = base.createTransfer('xfer1');
+ await transfer.collectExample('_background_noise_');
+ await transfer.collectExample('_background_noise_');
+ await transfer.collectExample('bar');
+ await transfer.collectExample('bar');
+ // Set the duration threshold to 0 to force using tf.data.Dataset
+ // for training.
+ const fitDatasetDurationMillisThreshold = 0;
+ const [history, fineTuneHistory] = await transfer.train({
+ epochs: 3,
+ batchSize: 1,
+ validationSplit: 0.5,
+ fitDatasetDurationMillisThreshold,
+ fineTuningEpochs: 2
+ }) as [tfl.History, tfl.History];
+ expect(history.history.loss.length).toEqual(3);
+ expect(history.history.acc.length).toEqual(3);
+ expect(history.history.val_loss.length).toEqual(3);
+ expect(history.history.val_acc.length).toEqual(3);
+ expect(fineTuneHistory.history.loss.length).toEqual(2);
+ expect(fineTuneHistory.history.acc.length).toEqual(2);
+ expect(fineTuneHistory.history.val_loss.length).toEqual(2);
+ expect(fineTuneHistory.history.val_acc.length).toEqual(2);
+ });
+
+ it('trainTransferLearningModel with fine-tuning + callback', async done => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer = base.createTransfer('xfer1');
+ await transfer.collectExample('foo');
+ await transfer.collectExample('bar');
+
+ const oldKernel = secondLastBaseDenseLayer.getWeights()[0].dataSync();
+
+ const historyObjects = await transfer.train({
+ epochs: 3,
+ batchSize: 2,
+ fineTuningEpochs: 2,
+ fineTuningOptimizer: 'adam'
+ }) as tfl.History[];
+ expect(historyObjects.length).toEqual(2);
+ expect(historyObjects[0].history.loss.length).toEqual(3);
+ expect(historyObjects[0].history.acc.length).toEqual(3);
+ expect(historyObjects[1].history.loss.length).toEqual(2);
+ expect(historyObjects[1].history.acc.length).toEqual(2);
+
+ // Assert that the kernel has changed as a result of the fine-tuning.
+ const newKernel = secondLastBaseDenseLayer.getWeights()[0].dataSync();
+
+ let diffSumSquare = 0;
+ for (let i = 0; i < newKernel.length; ++i) {
+ const diff = newKernel[i] - oldKernel[i];
+ diffSumSquare += diff * diff;
+ }
+ expect(diffSumSquare).toBeGreaterThan(1e-4);
+
+ // After the transfer learning is complete, startStreaming with the
+ // transfer-learned model's name should give scores only for the
+ // transfer-learned model.
+ expect(base.wordLabels()).toEqual(fakeWords);
+ expect(transfer.wordLabels()).toEqual(['bar', 'foo']);
+
+ transfer.listen(async (result: SpeechCommandRecognizerResult) => {
+ expect((result.scores as Float32Array).length).toEqual(2);
+ transfer.stopListening().then(done);
+ });
+ });
+
+ it('trainTransferLearningModel custom params and callback', async () => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer = base.createTransfer('xfer1');
+ await transfer.collectExample('foo');
+ for (let i = 0; i < 2; ++i) {
+ await transfer.collectExample('bar');
+ }
+ const callbackEpochs: number[] = [];
+ const history = await transfer.train({
+ epochs: 5,
+ callback: {
+ onEpochEnd: async (epoch: number, logs: tfl.Logs) => {
+ callbackEpochs.push(epoch);
+ }
+ }
+ }) as tfl.History;
+ expect(history.history.loss.length).toEqual(5);
+ expect(history.history.acc.length).toEqual(5);
+ expect(callbackEpochs).toEqual([0, 1, 2, 3, 4]);
+ });
+
+ it('trainTransferLearningModel fails without any examples', async () => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer = base.createTransfer('xfer1');
+ let errorCaught: Error;
+ try {
+ await transfer.train();
+ } catch (err) {
+ errorCaught = err;
+ }
+ expect(errorCaught.message)
+ .toMatch(/no transfer learning example has been collected/);
+ });
+
+ it('trainTransferLearningModel fails with only 1 word', async () => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer = base.createTransfer('xfer1');
+ await transfer.collectExample('foo');
+ await transfer.collectExample('foo');
+ let errorCaught: Error;
+ try {
+ await transfer.train();
+ } catch (err) {
+ errorCaught = err;
+ }
+ expect(errorCaught.message).toMatch(/.*foo.*Requires at least 2/);
+ });
+
+ it('Invalid vocabulary name leads to Error', () => {
+ expect(() => create('BROWSER_FFT', 'nonsensical_vocab'))
+ .toThrowError(/Invalid vocabulary name.*\'nonsensical_vocab\'/);
+ });
+
+ it('getExamples()', async () => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer = base.createTransfer('xfer1');
+ await transfer.collectExample('bar');
+ await transfer.collectExample('foo');
+ await transfer.collectExample('bar');
+ const barOut = transfer.getExamples('bar');
+ expect(barOut.length).toEqual(2);
+ expect(barOut[0].uid).toMatch(/^([0-9a-f]+\-)+[0-9a-f]+$/);
+ expect(barOut[0].example.label).toEqual('bar');
+ expect(barOut[1].uid).toMatch(/^([0-9a-f]+\-)+[0-9a-f]+$/);
+ expect(barOut[1].example.label).toEqual('bar');
+ const fooOut = transfer.getExamples('foo');
+ expect(fooOut.length).toEqual(1);
+ expect(fooOut[0].uid).toMatch(/^([0-9a-f]+\-)+[0-9a-f]+$/);
+ expect(fooOut[0].example.label).toEqual('foo');
+ });
+
+ it('serializeExamples', async () => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer = base.createTransfer('xfer1');
+ await transfer.collectExample('bar');
+ await transfer.collectExample('foo');
+ await transfer.collectExample('bar');
+ const artifacts =
+ arrayBuffer2SerializedExamples(transfer.serializeExamples());
+
+ // The examples are sorted alphabetically by their label.
+ expect(artifacts.manifest).toEqual([
+ {
+ label: 'bar',
+ spectrogramNumFrames: fakeNumFrames,
+ spectrogramFrameSize: fakeColumnTruncateLength
+ },
+ {
+ label: 'bar',
+ spectrogramNumFrames: fakeNumFrames,
+ spectrogramFrameSize: fakeColumnTruncateLength
+ },
+ {
+ label: 'foo',
+ spectrogramNumFrames: fakeNumFrames,
+ spectrogramFrameSize: fakeColumnTruncateLength
+ }
+ ]);
+ expect(artifacts.data.byteLength)
+ .toEqual(fakeNumFrames * fakeColumnTruncateLength * 4 * 3);
+ });
+
+ it('serializeExamples: limited word labels', async () => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer = base.createTransfer('xfer1');
+ await transfer.collectExample('bar');
+ await transfer.collectExample('foo');
+ await transfer.collectExample('bar');
+ const artifacts =
+ arrayBuffer2SerializedExamples(transfer.serializeExamples('bar'));
+
+ // The examples are sorted alphabetically by their label.
+ expect(artifacts.manifest).toEqual([
+ {
+ label: 'bar',
+ spectrogramNumFrames: fakeNumFrames,
+ spectrogramFrameSize: fakeColumnTruncateLength
+ },
+ {
+ label: 'bar',
+ spectrogramNumFrames: fakeNumFrames,
+ spectrogramFrameSize: fakeColumnTruncateLength
+ }
+ ]);
+ expect(artifacts.data.byteLength)
+ .toEqual(fakeNumFrames * fakeColumnTruncateLength * 4 * 2);
+ });
+
+ it('removeExample & isDatasetEmpty', async () => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer = base.createTransfer('xfer1');
+ expect(transfer.isDatasetEmpty()).toEqual(true);
+ await transfer.collectExample('bar');
+ await transfer.collectExample('foo');
+ await transfer.collectExample('bar');
+ const fooExamples = transfer.getExamples('foo');
+ transfer.removeExample(fooExamples[0].uid);
+ expect(transfer.isDatasetEmpty()).toEqual(false);
+ expect(transfer.countExamples()).toEqual({'bar': 2});
+ expect(() => transfer.getExamples('foo'))
+ .toThrowError('No example of label "foo" exists in dataset');
+ const barExamples = transfer.getExamples('bar');
+ transfer.removeExample(barExamples[0].uid);
+ expect(transfer.isDatasetEmpty()).toEqual(false);
+ expect(transfer.countExamples()).toEqual({'bar': 1});
+ transfer.removeExample(barExamples[1].uid);
+ expect(transfer.isDatasetEmpty()).toEqual(true);
+ });
+
+ it('serializeExamples fails on empty data', async () => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer = base.createTransfer('xfer1');
+ expect(() => transfer.serializeExamples()).toThrow();
+ });
+
+ it('loadExapmles, from empty state', async () => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer1 = base.createTransfer('xfer1');
+ await transfer1.collectExample('foo');
+ await transfer1.collectExample('bar');
+ const transfer2 = base.createTransfer('xfer2');
+ transfer2.loadExamples(transfer1.serializeExamples());
+
+ expect(transfer2.countExamples()).toEqual({'bar': 1, 'foo': 1});
+
+ // Assert that transfer2 can continue to collect new examples.
+ await transfer2.collectExample('qux');
+ expect(transfer2.countExamples()).toEqual({'bar': 1, 'foo': 1, 'qux': 1});
+ });
+
+ it('loadExapmles, from nonempty state, clearExisting = false', async () => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer1 = base.createTransfer('xfer1');
+ await transfer1.collectExample('foo');
+ await transfer1.collectExample('bar');
+ const transfer2 = base.createTransfer('xfer2');
+ await transfer2.collectExample('qux');
+ transfer2.loadExamples(transfer1.serializeExamples());
+
+ expect(transfer2.countExamples()).toEqual({'bar': 1, 'foo': 1, 'qux': 1});
+ });
+
+ it('loadExapmles, from nonempty state, clearExisting = true', async () => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer1 = base.createTransfer('xfer1');
+ await transfer1.collectExample('foo');
+ await transfer1.collectExample('bar');
+ const transfer2 = base.createTransfer('xfer2');
+ await transfer2.collectExample('qux');
+ transfer2.loadExamples(transfer1.serializeExamples(), true);
+
+ expect(transfer2.countExamples()).toEqual({'bar': 1, 'foo': 1});
+ });
+
+ it('loadExapmles, from a word-filtered dataset', async () => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer1 = base.createTransfer('xfer1');
+ await transfer1.collectExample('foo');
+ await transfer1.collectExample('bar');
+ const serialized = transfer1.serializeExamples('foo');
+ const transfer2 = base.createTransfer('xfer2');
+ transfer2.loadExamples(serialized);
+ expect(transfer2.countExamples()).toEqual({'foo': 1});
+ const examples = transfer2.getExamples('foo');
+ expect(examples.length).toEqual(1);
+ expect(examples[0].example.label).toEqual('foo');
+ });
+
+ it('collectExample with durationMultiplier = 1.5', async () => {
+ setUpFakes();
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer = base.createTransfer('xfer1');
+ const spectrogram =
+ await transfer.collectExample('foo', {durationMultiplier: 1.5});
+ expect(spectrogram.frameSize).toEqual(fakeColumnTruncateLength);
+ const numFrames = spectrogram.data.length / fakeColumnTruncateLength;
+ expect(numFrames).toEqual(fakeNumFrames * 1.5);
+ });
+
+ function setUpFakeLocalStorage(store: {[key: string]: string}) {
+ // tslint:disable:no-any
+ localStorageWrapper.localStorage = {
+ getItem: (key: string) => {
+ return store[key];
+ },
+ setItem: (key: string, value: string) => {
+ store[key] = value;
+ }
+ } as any;
+ // tslint:enable:no-any
+ }
+
+ function setUpFakeIndexedDB(artifactStore: tf.io.ModelArtifacts[]) {
+ class FakeIndexedDBHandler implements tf.io.IOHandler {
+ constructor(readonly artifactStore: tf.io.ModelArtifacts[]) {}
+
+ async save(artifacts: tf.io.ModelArtifacts): Promise {
+ this.artifactStore.push(artifacts);
+ return null;
+ }
+
+ async load(): Promise {
+ return this.artifactStore[this.artifactStore.length - 1];
+ }
+ }
+
+ const handler = new FakeIndexedDBHandler(artifactStore);
+ function fakeIndexedDBRouter(url: string|string[]): tf.io.IOHandler {
+ if (!Array.isArray(url) && url.startsWith('indexeddb://')) {
+ return handler;
+ } else {
+ return null;
+ }
+ }
+ tf.io.registerSaveRouter(fakeIndexedDBRouter);
+ tf.io.registerLoadRouter(fakeIndexedDBRouter);
+ }
+
+ it('Save and load transfer model via indexeddb://', async () => {
+ setUpFakes();
+ const localStore: {[key: string]: string} = {};
+ setUpFakeLocalStorage(localStore);
+ const indexedDBStore: tf.io.ModelArtifacts[] = [];
+ setUpFakeIndexedDB(indexedDBStore);
+
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer = base.createTransfer('xfer1');
+ await transfer.collectExample('foo');
+ await transfer.collectExample('bar');
+ await transfer.train({epochs: 1});
+
+ const xs = tf.ones([1, fakeNumFrames, fakeColumnTruncateLength, 1]);
+ const out0 = await transfer.recognize(xs);
+
+ await transfer.save();
+
+ const savedMetadata = JSON.parse(localStore[SAVED_MODEL_METADATA_KEY]);
+ expect(savedMetadata['xfer1']['modelName']).toEqual('xfer1');
+ expect(savedMetadata['xfer1']['wordLabels']).toEqual(['bar', 'foo']);
+ expect(indexedDBStore.length).toEqual(1);
+ const modelPrime =
+ await tfl.models.modelFromJSON(indexedDBStore[0].modelTopology as {});
+ expect(modelPrime.layers.length).toEqual(4);
+ expect(indexedDBStore[0].weightSpecs.length).toEqual(4);
+
+ // Load the transfer model back.
+ const base2 = new BrowserFftSpeechCommandRecognizer();
+ await base2.ensureModelLoaded();
+ // Disable the spy on tf.loadLayersModel() first, so the subsequent
+ // tf.loadLayersModel() call during the load() call can use the fake
+ // IndexedDB handler created above.
+ tfLoadModelSpy.and.callThrough();
+ const transfer2 = base2.createTransfer('xfer1');
+ await transfer2.load();
+ expect(transfer2.wordLabels()).toEqual(['bar', 'foo']);
+ const out1 = await transfer2.recognize(xs);
+ // The new prediction scores from the loaded transfer model should match
+ // the prediction scores from the original transfer model.
+ expect(out1.scores).toEqual(out0.scores);
+ });
+
+ it('Save model via custom file:// route', async () => {
+ setUpFakes();
+
+ const base = new BrowserFftSpeechCommandRecognizer();
+ await base.ensureModelLoaded();
+ const transfer = base.createTransfer('xfer1');
+ await transfer.collectExample('foo');
+ await transfer.collectExample('bar');
+ await transfer.train({epochs: 1});
+
+ const tempSavePath = tempfile();
+ await transfer.save(`file://${tempSavePath}`);
+
+ // Disable the spy on tf.loadLayersModel() first, so the subsequent
+ // tf.loadLayersModel() call during the load() call can use the fake
+ // IndexedDB handler created above.
+ tfLoadModelSpy.and.callThrough();
+ const modelPrime =
+ await tfl.loadLayersModel(`file://${tempSavePath}/model.json`);
+ expect(modelPrime.outputs.length).toEqual(1);
+ expect(modelPrime.outputs[0].shape).toEqual([null, 2]);
+
+ rimraf(tempSavePath, () => {});
+ });
+
+ it('listSavedTransferModels', async () => {
+ spyOn(tf.io, 'listModels').and.callFake(() => {
+ return {
+ 'indexeddb://tfjs-speech-commands-model/model1':
+ {'dateSaved': '2018-12-06T04:25:08.153Z'}
+ };
+ });
+ expect(await listSavedTransferModels()).toEqual(['model1']);
+ });
+
+ it('deleteSavedTransferModel', async () => {
+ const localStore: {[key: string]: string} = {
+ 'tfjs-speech-commands-saved-model-metadata':
+ JSON.stringify({'foo': {'wordLabels': ['a', 'b']}})
+ };
+ setUpFakeLocalStorage(localStore);
+ const removedModelPaths: string[] = [];
+ spyOn(tf.io, 'removeModel').and.callFake((modelPath: string) => {
+ removedModelPaths.push(modelPath);
+ });
+ await deleteSavedTransferModel('foo');
+ expect(removedModelPaths).toEqual([
+ 'indexeddb://tfjs-speech-commands-model/foo'
+ ]);
+ expect(localStore).toEqual({
+ 'tfjs-speech-commands-saved-model-metadata': '{}'
+ });
+ });
+});
diff --git a/音频分类/speech-commands/src/browser_fft_utils.ts b/音频分类/speech-commands/src/browser_fft_utils.ts
new file mode 100644
index 0000000..779a4e6
--- /dev/null
+++ b/音频分类/speech-commands/src/browser_fft_utils.ts
@@ -0,0 +1,131 @@
+/**
+ * @license
+ * Copyright 2019 Google LLC. All Rights Reserved.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =============================================================================
+ */
+
+import * as tf from '@tensorflow/tfjs-core';
+import {promisify} from 'util';
+
+import {RawAudioData} from './types';
+
+export async function loadMetadataJson(url: string):
+ Promise<{wordLabels: string[]}> {
+ const HTTP_SCHEME = 'http://';
+ const HTTPS_SCHEME = 'https://';
+ const FILE_SCHEME = 'file://';
+ if (url.indexOf(HTTP_SCHEME) === 0 || url.indexOf(HTTPS_SCHEME) === 0) {
+ const response = await fetch(url);
+ const parsed = await response.json();
+ return parsed;
+ } else if (url.indexOf(FILE_SCHEME) === 0) {
+ // tslint:disable-next-line:no-require-imports
+ const fs = require('fs');
+ const readFile = promisify(fs.readFile);
+
+ return JSON.parse(
+ await readFile(url.slice(FILE_SCHEME.length), {encoding: 'utf-8'}));
+ } else {
+ throw new Error(
+ `Unsupported URL scheme in metadata URL: ${url}. ` +
+ `Supported schemes are: http://, https://, and ` +
+ `(node.js-only) file://`);
+ }
+}
+
+let EPSILON: number = null;
+
+/**
+ * Normalize the input into zero mean and unit standard deviation.
+ *
+ * This function is safe against divison-by-zero: In case the standard
+ * deviation is zero, the output will be all-zero.
+ *
+ * @param x Input tensor.
+ * @param y Output normalized tensor.
+ */
+export function normalize(x: tf.Tensor): tf.Tensor {
+ if (EPSILON == null) {
+ EPSILON = tf.backend().epsilon();
+ }
+ return tf.tidy(() => {
+ const {mean, variance} = tf.moments(x);
+ // Add an EPSILON to the denominator to prevent division-by-zero.
+ return tf.div(tf.sub(x, mean), tf.add(tf.sqrt(variance), EPSILON));
+ });
+}
+
+/**
+ * Z-Normalize the elements of a Float32Array.
+ *
+ * Subtract the mean and divide the result by the standard deviation.
+ *
+ * @param x The Float32Array to normalize.
+ * @return Noramlzied Float32Array.
+ */
+export function normalizeFloat32Array(x: Float32Array): Float32Array {
+ if (x.length < 2) {
+ throw new Error(
+ 'Cannot normalize a Float32Array with fewer than 2 elements.');
+ }
+ if (EPSILON == null) {
+ EPSILON = tf.backend().epsilon();
+ }
+ return tf.tidy(() => {
+ const {mean, variance} = tf.moments(tf.tensor1d(x));
+ const meanVal = mean.arraySync() as number;
+ const stdVal = Math.sqrt(variance.arraySync() as number);
+ const yArray = Array.from(x).map(y => (y - meanVal) / (stdVal + EPSILON));
+ return new Float32Array(yArray);
+ });
+}
+
+export function getAudioContextConstructor(): AudioContext {
+ // tslint:disable-next-line:no-any
+ return (window as any).AudioContext || (window as any).webkitAudioContext;
+}
+
+export async function getAudioMediaStream(
+ audioTrackConstraints?: MediaTrackConstraints): Promise {
+ return navigator.mediaDevices.getUserMedia({
+ audio: audioTrackConstraints == null ? true : audioTrackConstraints,
+ video: false
+ });
+}
+
+/**
+ * Play raw audio waveform
+ * @param rawAudio Raw audio data, including the waveform and the sampling rate.
+ * @param onEnded Callback function to execute when the playing ends.
+ */
+export function playRawAudio(
+ rawAudio: RawAudioData, onEnded: () => void|Promise): void {
+ const audioContextConstructor =
+ // tslint:disable-next-line:no-any
+ (window as any).AudioContext || (window as any).webkitAudioContext;
+ const audioContext: AudioContext = new audioContextConstructor();
+ const arrayBuffer =
+ audioContext.createBuffer(1, rawAudio.data.length, rawAudio.sampleRateHz);
+ const nowBuffering = arrayBuffer.getChannelData(0);
+ nowBuffering.set(rawAudio.data);
+ const source = audioContext.createBufferSource();
+ source.buffer = arrayBuffer;
+ source.connect(audioContext.destination);
+ source.start();
+ source.onended = () => {
+ if (onEnded != null) {
+ onEnded();
+ }
+ };
+}
diff --git a/音频分类/speech-commands/src/browser_fft_utils_test.ts b/音频分类/speech-commands/src/browser_fft_utils_test.ts
new file mode 100644
index 0000000..7927fe7
--- /dev/null
+++ b/音频分类/speech-commands/src/browser_fft_utils_test.ts
@@ -0,0 +1,56 @@
+/**
+ * @license
+ * Copyright 2019 Google LLC. All Rights Reserved.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =============================================================================
+ */
+
+import * as tf from '@tensorflow/tfjs-core';
+import {normalize, normalizeFloat32Array} from './browser_fft_utils';
+import {expectTensorsClose} from './test_utils';
+
+describe('normalize', () => {
+ it('Non-constant value; no memory leak', () => {
+ const x = tf.tensor4d([1, 2, 3, 4], [1, 2, 2, 1]);
+ const numTensors0 = tf.memory().numTensors;
+ const y = normalize(x);
+ // Assert no memory leak.
+ expect(tf.memory().numTensors).toEqual(numTensors0 + 1);
+ expectTensorsClose(
+ y,
+ tf.tensor4d(
+ [-1.3416406, -0.4472135, 0.4472135, 1.3416406], [1, 2, 2, 1]));
+ const {mean, variance} = tf.moments(y);
+ expectTensorsClose(mean, tf.scalar(0));
+ expectTensorsClose(variance, tf.scalar(1));
+ });
+
+ it('Constant value', () => {
+ const x = tf.tensor4d([42, 42, 42, 42], [1, 2, 2, 1]);
+ const y = normalize(x);
+ expectTensorsClose(y, tf.tensor4d([0, 0, 0, 0], [1, 2, 2, 1]));
+ });
+});
+
+describe('normalizeFloat32Array', () => {
+ it('Length-4 input', () => {
+ const xs = new Float32Array([1, 2, 3, 4]);
+ const numTensors0 = tf.memory().numTensors;
+ const ys = tf.tensor1d(normalizeFloat32Array(xs));
+ // Assert no memory leak. (The extra comes from the tf.tensor1d() call
+ // in the testing code.)
+ expect(tf.memory().numTensors).toEqual(numTensors0 + 1);
+ expectTensorsClose(
+ ys, tf.tensor1d([-1.3416406, -0.4472135, 0.4472135, 1.3416406]));
+ });
+});
diff --git a/音频分类/speech-commands/src/browser_test_utils.ts b/音频分类/speech-commands/src/browser_test_utils.ts
new file mode 100644
index 0000000..4945d2a
--- /dev/null
+++ b/音频分类/speech-commands/src/browser_test_utils.ts
@@ -0,0 +1,77 @@
+/**
+ * @license
+ * Copyright 2019 Google LLC. All Rights Reserved.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =============================================================================
+ */
+
+/**
+ * Testing Utilities for Browser Audio Feature Extraction.
+ */
+
+export class FakeAudioContext {
+ readonly sampleRate = 44100;
+
+ static createInstance() {
+ return new FakeAudioContext();
+ }
+
+ createMediaStreamSource() {
+ return new FakeMediaStreamAudioSourceNode();
+ }
+
+ createAnalyser() {
+ return new FakeAnalyser();
+ }
+
+ close(): void {}
+}
+
+export class FakeAudioMediaStream {
+ constructor() {}
+ getTracks(): Array<{}> {
+ return [];
+ }
+}
+
+class FakeMediaStreamAudioSourceNode {
+ constructor() {}
+ connect(node: {}): void {}
+}
+
+class FakeAnalyser {
+ fftSize: number;
+ smoothingTimeConstant: number;
+ private x: number;
+ constructor() {
+ this.x = 0;
+ }
+
+ getFloatFrequencyData(data: Float32Array): void {
+ const xs: number[] = [];
+ for (let i = 0; i < this.fftSize / 2; ++i) {
+ xs.push(this.x++);
+ }
+ data.set(new Float32Array(xs));
+ }
+
+ getFloatTimeDomainData(data: Float32Array): void {
+ const xs: number[] = [];
+ for (let i = 0; i < this.fftSize / 2; ++i) {
+ xs.push(-(this.x++));
+ }
+ data.set(new Float32Array(xs));
+ }
+
+ disconnect(): void {}
+}
diff --git a/音频分类/speech-commands/src/dataset.ts b/音频分类/speech-commands/src/dataset.ts
new file mode 100644
index 0000000..cf67c11
--- /dev/null
+++ b/音频分类/speech-commands/src/dataset.ts
@@ -0,0 +1,977 @@
+/**
+ * @license
+ * Copyright 2019 Google LLC. All Rights Reserved.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =============================================================================
+ */
+
+import * as tf from '@tensorflow/tfjs-core';
+import * as tfd from '@tensorflow/tfjs-data';
+import {normalize} from './browser_fft_utils';
+import {arrayBuffer2String, concatenateArrayBuffers, getRandomInteger, getUID, string2ArrayBuffer} from './generic_utils';
+import {balancedTrainValSplitNumArrays} from './training_utils';
+import {AudioDataAugmentationOptions, Example, SpectrogramData} from './types';
+
+// Descriptor for serialized dataset files: stands for:
+// TensorFlow.js Speech-Commands Dataset.
+// DO NOT EVER CHANGE THIS!
+export const DATASET_SERIALIZATION_DESCRIPTOR = 'TFJSSCDS';
+
+// A version number for the serialization. Since this needs
+// to be encoded within a length-1 Uint8 array, it must be
+// 1. an positive integer.
+// 2. monotonically increasing over its change history.
+// Item 1 is checked by unit tests.
+export const DATASET_SERIALIZATION_VERSION = 1;
+
+/**
+ * Specification for an `Example` (see above).
+ *
+ * Used for serialization of `Example`.
+ */
+export interface ExampleSpec {
+ /** A label for the example. */
+ label: string;
+
+ /** Number of frames in the spectrogram. */
+ spectrogramNumFrames: number;
+
+ /** The length of each frame in the spectrogram. */
+ spectrogramFrameSize: number;
+
+ /** The key frame index of the spectrogram. */
+ spectrogramKeyFrameIndex?: number;
+
+ /** Number of samples in the raw PCM-format audio (if any). */
+ rawAudioNumSamples?: number;
+
+ /** Sampling rate of the raw audio (if any). */
+ rawAudioSampleRateHz?: number;
+}
+
+/**
+ * Serialized Dataset, containing a number of `Example`s in their
+ * serialized format.
+ *
+ * This format consists of a plain-old JSON object as the manifest,
+ * along with a flattened binary `ArrayBuffer`. The format facilitates
+ * storage and transmission.
+ */
+export interface SerializedExamples {
+ /**
+ * Specifications of the serialized `Example`s, serialized as a string.
+ */
+ manifest: ExampleSpec[];
+
+ /**
+ * Serialized binary data from the `Example`s.
+ *
+ * Including the spectrograms and the raw audio (if any).
+ *
+ * For example, assuming `manifest.length` is `N`, the format of the
+ * `ArrayBuffer` is as follows:
+ *
+ * [spectrogramData1, rawAudio1 (if any),
+ * spectrogramData2, rawAudio2 (if any),
+ * ...
+ * spectrogramDataN, rawAudioN (if any)]
+ */
+ data: ArrayBuffer;
+}
+
+export const BACKGROUND_NOISE_TAG = '_background_noise_';
+
+/**
+ * Configuration for getting spectrograms as tensors.
+ */
+export interface GetDataConfig extends AudioDataAugmentationOptions {
+ /**
+ * Number of frames.
+ *
+ * This must be smaller than or equal to the # of frames of each
+ * example held by the dataset.
+ *
+ * If the # of frames of an example is greater than this number,
+ * the following heuristics will be used to extra >= 1 examples
+ * of length numFrames from the original example:
+ *
+ * - If the label of the example is `BAKCGROUND_NOISE_TAG`,
+ * the example will be splitted into multiple examples using the
+ * `hopFrames` parameter (see below).
+ * - If the label of the example is not `BACKGROUND_NOISE_TAG`,
+ * the example will be splitted into multiple examples that
+ * all contain the maximum-intensity frame using the `hopFrames`
+ * parameter.
+ */
+ numFrames?: number;
+
+ /**
+ * Hop length in number of frames.
+ *
+ * Used when splitting a long example into multiple shorter ones.
+ *
+ * Must be provided if any such long examples exist.
+ */
+ hopFrames?: number;
+
+ /**
+ * Whether the spectrogram of each example will be normalized.
+ *
+ * Normalization means:
+ * - Subtracting the mean, and
+ * - Dividing the result by the standard deviation.
+ *
+ * Default: `true`.
+ */
+ normalize?: boolean;
+
+ /**
+ * Whether the examples will be shuffled prior to merged into
+ * `tf.Tensor`s.
+ *
+ * Default: `true`.
+ */
+ shuffle?: boolean;
+
+ /**
+ * Whether to obtain a `tf.data.Datasaet` object.
+ *
+ * Default: `false`.
+ */
+ getDataset?: boolean;
+
+ /**
+ * Batch size for dataset.
+ *
+ * Applicable only if `getDataset === true`.
+ */
+ datasetBatchSize?: number;
+
+ /**
+ * Validation split for the datasaet.
+ *
+ * Applicable only if `getDataset === true`.
+ *
+ * The data will be divided into two fractions of relative sizes
+ * `[1 - datasetValidationSplit, datasetValidationSplit]`, for the
+ * training and validation `tf.data.Dataset` objects, respectively.
+ *
+ * Must be a number between 0 and 1.
+ * Default: 0.15.
+ */
+ datasetValidationSplit?: number;
+}
+
+// tslint:disable-next-line:no-any
+export type SpectrogramAndTargetsTfDataset = tfd.Dataset<{}>;
+
+/**
+ * A serializable, mutable set of speech/audio `Example`s;
+ */
+export class Dataset {
+ private examples: {[id: string]: Example};
+ private label2Ids: {[label: string]: string[]};
+
+ /**
+ * Constructor of `Dataset`.
+ *
+ * If called with no arguments (i.e., `artifacts` == null), an empty dataset
+ * will be constructed.
+ *
+ * Else, the dataset will be deserialized from `artifacts`.
+ *
+ * @param serialized Optional serialization artifacts to deserialize.
+ */
+ constructor(serialized?: ArrayBuffer) {
+ this.examples = {};
+ this.label2Ids = {};
+ if (serialized != null) {
+ // Deserialize from the provided artifacts.
+ const artifacts = arrayBuffer2SerializedExamples(serialized);
+ let offset = 0;
+ for (let i = 0; i < artifacts.manifest.length; ++i) {
+ const spec = artifacts.manifest[i];
+ let byteLen = spec.spectrogramNumFrames * spec.spectrogramFrameSize;
+ if (spec.rawAudioNumSamples != null) {
+ byteLen += spec.rawAudioNumSamples;
+ }
+ byteLen *= 4;
+ this.addExample(deserializeExample(
+ {spec, data: artifacts.data.slice(offset, offset + byteLen)}));
+ offset += byteLen;
+ }
+ }
+ }
+
+ /**
+ * Add an `Example` to the `Dataset`
+ *
+ * @param example A `Example`, with a label. The label must be a non-empty
+ * string.
+ * @returns The UID for the added `Example`.
+ */
+ addExample(example: Example): string {
+ tf.util.assert(example != null, () => 'Got null or undefined example');
+ tf.util.assert(
+ example.label != null && example.label.length > 0,
+ () => `Expected label to be a non-empty string, ` +
+ `but got ${JSON.stringify(example.label)}`);
+ const uid = getUID();
+ this.examples[uid] = example;
+ if (!(example.label in this.label2Ids)) {
+ this.label2Ids[example.label] = [];
+ }
+ this.label2Ids[example.label].push(uid);
+ return uid;
+ }
+
+ /**
+ * Merge the incoming dataset into this dataset
+ *
+ * @param dataset The incoming dataset to be merged into this dataset.
+ */
+ merge(dataset: Dataset): void {
+ tf.util.assert(
+ dataset !== this, () => 'Cannot merge a dataset into itself');
+ const vocab = dataset.getVocabulary();
+ for (const word of vocab) {
+ const examples = dataset.getExamples(word);
+ for (const example of examples) {
+ this.addExample(example.example);
+ }
+ }
+ }
+
+ /**
+ * Get a map from `Example` label to number of `Example`s with the label.
+ *
+ * @returns A map from label to number of example counts under that label.
+ */
+ getExampleCounts(): {[label: string]: number} {
+ const counts: {[label: string]: number} = {};
+ for (const uid in this.examples) {
+ const example = this.examples[uid];
+ if (!(example.label in counts)) {
+ counts[example.label] = 0;
+ }
+ counts[example.label]++;
+ }
+ return counts;
+ }
+
+ /**
+ * Get all examples of a given label, with their UIDs.
+ *
+ * @param label The requested label.
+ * @return All examples of the given `label`, along with their UIDs.
+ * The examples are sorted in the order in which they are added to the
+ * `Dataset`.
+ * @throws Error if label is `null` or `undefined`.
+ */
+ getExamples(label: string): Array<{uid: string, example: Example}> {
+ tf.util.assert(
+ label != null,
+ () =>
+ `Expected label to be a string, but got ${JSON.stringify(label)}`);
+ tf.util.assert(
+ label in this.label2Ids,
+ () => `No example of label "${label}" exists in dataset`);
+ const output: Array<{uid: string, example: Example}> = [];
+ this.label2Ids[label].forEach(id => {
+ output.push({uid: id, example: this.examples[id]});
+ });
+ return output;
+ }
+
+ /**
+ * Get all examples and labels as tensors.
+ *
+ * - If `label` is provided and exists in the vocabulary of the `Dataset`,
+ * the spectrograms of all `Example`s under the `label` will be returned
+ * as a 4D `tf.Tensor` as `xs`. The shape of the `tf.Tensor` will be
+ * `[numExamples, numFrames, frameSize, 1]`
+ * where
+ * - `numExamples` is the number of `Example`s with the label
+ * - `numFrames` is the number of frames in each spectrogram
+ * - `frameSize` is the size of each spectrogram frame.
+ * No label Tensor will be returned.
+ * - If `label` is not provided, all `Example`s will be returned as `xs`.
+ * In addition, `ys` will contain a one-hot encoded list of labels.
+ * - The shape of `xs` will be: `[numExamples, numFrames, frameSize, 1]`
+ * - The shape of `ys` will be: `[numExamples, vocabularySize]`.
+ *
+ * @returns If `config.getDataset` is `true`, returns two `tf.data.Dataset`
+ * objects, one for training and one for validation.
+ * Else, xs` and `ys` tensors. See description above.
+ * @throws Error
+ * - if not all the involved spectrograms have matching `numFrames` and
+ * `frameSize`, or
+ * - if `label` is provided and is not present in the vocabulary of the
+ * `Dataset`, or
+ * - if the `Dataset` is currently empty.
+ */
+ getData(label?: string, config?: GetDataConfig): {
+ xs: tf.Tensor4D,
+ ys?: tf.Tensor2D
+ }|[SpectrogramAndTargetsTfDataset, SpectrogramAndTargetsTfDataset] {
+ tf.util.assert(
+ this.size() > 0,
+ () =>
+ `Cannot get spectrograms as tensors because the dataset is empty`);
+ const vocab = this.getVocabulary();
+ if (label != null) {
+ tf.util.assert(
+ vocab.indexOf(label) !== -1,
+ () => `Label ${label} is not in the vocabulary ` +
+ `(${JSON.stringify(vocab)})`);
+ } else {
+ // If all words are requested, there must be at least two words in the
+ // vocabulary to make one-hot encoding possible.
+ tf.util.assert(
+ vocab.length > 1,
+ () => `One-hot encoding of labels requires the vocabulary to have ` +
+ `at least two words, but it has only ${vocab.length} word.`);
+ }
+
+ if (config == null) {
+ config = {};
+ }
+
+ // Get the numFrames lengths of all the examples currently held by the
+ // dataset.
+ const sortedUniqueNumFrames = this.getSortedUniqueNumFrames();
+ let numFrames: number;
+ let hopFrames: number;
+ if (sortedUniqueNumFrames.length === 1) {
+ numFrames = config.numFrames == null ? sortedUniqueNumFrames[0] :
+ config.numFrames;
+ hopFrames = config.hopFrames == null ? 1 : config.hopFrames;
+ } else {
+ numFrames = config.numFrames;
+ tf.util.assert(
+ numFrames != null && Number.isInteger(numFrames) && numFrames > 0,
+ () => `There are ${
+ sortedUniqueNumFrames.length} unique lengths among ` +
+ `the ${this.size()} examples of this Dataset, hence numFrames ` +
+ `is required. But it is not provided.`);
+ tf.util.assert(
+ numFrames <= sortedUniqueNumFrames[0],
+ () => `numFrames (${numFrames}) exceeds the minimum numFrames ` +
+ `(${sortedUniqueNumFrames[0]}) among the examples of ` +
+ `the Dataset.`);
+
+ hopFrames = config.hopFrames;
+ tf.util.assert(
+ hopFrames != null && Number.isInteger(hopFrames) && hopFrames > 0,
+ () => `There are ${
+ sortedUniqueNumFrames.length} unique lengths among ` +
+ `the ${this.size()} examples of this Dataset, hence hopFrames ` +
+ `is required. But it is not provided.`);
+ }
+
+ // Normalization is performed by default.
+ const toNormalize = config.normalize == null ? true : config.normalize;
+
+ return tf.tidy(() => {
+ let xTensors: tf.Tensor3D[] = [];
+ let xArrays: Float32Array[] = [];
+
+ let labelIndices: number[] = [];
+ let uniqueFrameSize: number;
+ for (let i = 0; i < vocab.length; ++i) {
+ const currentLabel = vocab[i];
+ if (label != null && currentLabel !== label) {
+ continue;
+ }
+ const ids = this.label2Ids[currentLabel];
+ for (const id of ids) {
+ const example = this.examples[id];
+ const spectrogram = example.spectrogram;
+ const frameSize = spectrogram.frameSize;
+ if (uniqueFrameSize == null) {
+ uniqueFrameSize = frameSize;
+ } else {
+ tf.util.assert(
+ frameSize === uniqueFrameSize,
+ () => `Mismatch in frameSize ` +
+ `(${frameSize} vs ${uniqueFrameSize})`);
+ }
+
+ const snippetLength = spectrogram.data.length / frameSize;
+ let focusIndex = null;
+ if (currentLabel !== BACKGROUND_NOISE_TAG) {
+ focusIndex = spectrogram.keyFrameIndex == null ?
+ getMaxIntensityFrameIndex(spectrogram).dataSync()[0] :
+ spectrogram.keyFrameIndex;
+ }
+ // TODO(cais): See if we can get rid of dataSync();
+
+ const snippet =
+ tf.tensor3d(spectrogram.data, [snippetLength, frameSize, 1]);
+ const windows =
+ getValidWindows(snippetLength, focusIndex, numFrames, hopFrames);
+ for (const window of windows) {
+ const windowedSnippet = tf.tidy(() => {
+ const output = tf.slice(snippet,
+ [window[0], 0, 0], [window[1] - window[0], -1, -1]);
+ return toNormalize ? normalize(output) : output;
+ });
+ if (config.getDataset) {
+ // TODO(cais): See if we can do away with dataSync();
+ // TODO(cais): Shuffling?
+ xArrays.push(windowedSnippet.dataSync() as Float32Array);
+ } else {
+ xTensors.push(windowedSnippet as tf.Tensor3D);
+ }
+ if (label == null) {
+ labelIndices.push(i);
+ }
+ }
+ tf.dispose(snippet); // For memory saving.
+ }
+ }
+
+ if (config.augmentByMixingNoiseRatio != null) {
+ this.augmentByMixingNoise(
+ config.getDataset ? xArrays :
+ xTensors as Array,
+ labelIndices, config.augmentByMixingNoiseRatio);
+ }
+
+ const shuffle = config.shuffle == null ? true : config.shuffle;
+ if (config.getDataset) {
+ const batchSize =
+ config.datasetBatchSize == null ? 32 : config.datasetBatchSize;
+
+ // Split the data into two splits: training and validation.
+ const valSplit = config.datasetValidationSplit == null ?
+ 0.15 :
+ config.datasetValidationSplit;
+ tf.util.assert(
+ valSplit > 0 && valSplit < 1,
+ () => `Invalid dataset validation split: ${valSplit}`);
+
+ const zippedXandYArrays =
+ xArrays.map((xArray, i) => [xArray, labelIndices[i]]);
+ tf.util.shuffle(
+ zippedXandYArrays); // Shuffle the data before splitting.
+ xArrays = zippedXandYArrays.map(item => item[0]) as Float32Array[];
+ const yArrays = zippedXandYArrays.map(item => item[1]) as number[];
+ const {trainXs, trainYs, valXs, valYs} =
+ balancedTrainValSplitNumArrays(xArrays, yArrays, valSplit);
+
+ // TODO(cais): The typing around Float32Array is not working properly
+ // for tf.data currently. Tighten the types when the tf.data bug is
+ // fixed.
+ // tslint:disable:no-any
+ const xTrain =
+ tfd.array(trainXs as any).map(x => tf.tensor3d(x as any, [
+ numFrames, uniqueFrameSize, 1
+ ]));
+ const yTrain = tfd.array(trainYs).map(
+ y => tf.squeeze(tf.oneHot([y], vocab.length), [0]));
+ // TODO(cais): See if we can tighten the typing.
+ let trainDataset = tfd.zip({xs: xTrain, ys: yTrain});
+ if (shuffle) {
+ // Shuffle the dataset.
+ trainDataset = trainDataset.shuffle(xArrays.length);
+ }
+ trainDataset = trainDataset.batch(batchSize).prefetch(4);
+
+ const xVal =
+ tfd.array(valXs as any).map(x => tf.tensor3d(x as any, [
+ numFrames, uniqueFrameSize, 1
+ ]));
+ const yVal = tfd.array(valYs).map(
+ y => tf.squeeze(tf.oneHot([y], vocab.length), [0]));
+ let valDataset = tfd.zip({xs: xVal, ys: yVal});
+ valDataset = valDataset.batch(batchSize).prefetch(4);
+ // tslint:enable:no-any
+
+ // tslint:disable-next-line:no-any
+ return [trainDataset, valDataset] as any;
+ } else {
+ if (shuffle) {
+ // Shuffle the data.
+ const zipped: Array<{x: tf.Tensor3D, y: number}> = [];
+ xTensors.forEach((xTensor, i) => {
+ zipped.push({x: xTensor, y: labelIndices[i]});
+ });
+ tf.util.shuffle(zipped);
+ xTensors = zipped.map(item => item.x);
+ labelIndices = zipped.map(item => item.y);
+ }
+
+ const targets = label == null ?
+ tf.cast(tf.oneHot(tf.tensor1d(labelIndices, 'int32'), vocab.length),
+ 'float32') :
+ undefined;
+ return {
+ xs: tf.stack(xTensors) as tf.Tensor4D,
+ ys: targets as tf.Tensor2D
+ };
+ }
+ });
+ }
+
+ private augmentByMixingNoise(
+ xs: T[], labelIndices: number[], ratio: number): void {
+ if (xs == null || xs.length === 0) {
+ throw new Error(
+ `Cannot perform augmentation because data is null or empty`);
+ }
+ const isTypedArray = xs[0] instanceof Float32Array;
+
+ const vocab = this.getVocabulary();
+ const noiseExampleIndices: number[] = [];
+ const wordExampleIndices: number[] = [];
+ for (let i = 0; i < labelIndices.length; ++i) {
+ if (vocab[labelIndices[i]] === BACKGROUND_NOISE_TAG) {
+ noiseExampleIndices.push(i);
+ } else {
+ wordExampleIndices.push(i);
+ }
+ }
+ if (noiseExampleIndices.length === 0) {
+ throw new Error(
+ `Cannot perform augmentation by mixing with noise when ` +
+ `there is no example with label ${BACKGROUND_NOISE_TAG}`);
+ }
+
+ const mixedXTensors: Array = [];
+ const mixedLabelIndices: number[] = [];
+ for (const index of wordExampleIndices) {
+ const noiseIndex = // Randomly sample from the noises, with replacement.
+ noiseExampleIndices[getRandomInteger(0, noiseExampleIndices.length)];
+ const signalTensor = isTypedArray ?
+ tf.tensor1d(xs[index] as Float32Array) :
+ xs[index] as tf.Tensor;
+ const noiseTensor = isTypedArray ?
+ tf.tensor1d(xs[noiseIndex] as Float32Array) :
+ xs[noiseIndex] as tf.Tensor;
+ const mixed: tf.Tensor =
+ tf.tidy(() => normalize(
+ tf.add(signalTensor, tf.mul(noiseTensor, ratio))));
+ if (isTypedArray) {
+ mixedXTensors.push(mixed.dataSync() as Float32Array);
+ } else {
+ mixedXTensors.push(mixed);
+ }
+ mixedLabelIndices.push(labelIndices[index]);
+ }
+ console.log(
+ `Data augmentation: mixing noise: added ${mixedXTensors.length} ` +
+ `examples`);
+ mixedXTensors.forEach(tensor => xs.push(tensor as T));
+ labelIndices.push(...mixedLabelIndices);
+ }
+
+ private getSortedUniqueNumFrames(): number[] {
+ const numFramesSet = new Set();
+ const vocab = this.getVocabulary();
+ for (let i = 0; i < vocab.length; ++i) {
+ const label = vocab[i];
+ const ids = this.label2Ids[label];
+ for (const id of ids) {
+ const spectrogram = this.examples[id].spectrogram;
+ const numFrames = spectrogram.data.length / spectrogram.frameSize;
+ numFramesSet.add(numFrames);
+ }
+ }
+ const uniqueNumFrames = [...numFramesSet];
+ uniqueNumFrames.sort();
+ return uniqueNumFrames;
+ }
+
+ /**
+ * Remove an example from the `Dataset`.
+ *
+ * @param uid The UID of the example to remove.
+ * @throws Error if the UID doesn't exist in the `Dataset`.
+ */
+ removeExample(uid: string): void {
+ if (!(uid in this.examples)) {
+ throw new Error(`Nonexistent example UID: ${uid}`);
+ }
+ const label = this.examples[uid].label;
+ delete this.examples[uid];
+ const index = this.label2Ids[label].indexOf(uid);
+ this.label2Ids[label].splice(index, 1);
+ if (this.label2Ids[label].length === 0) {
+ delete this.label2Ids[label];
+ }
+ }
+
+ /**
+ * Set the key frame index of a given example.
+ *
+ * @param uid The UID of the example of which the `keyFrameIndex` is to be
+ * set.
+ * @param keyFrameIndex The desired value of the `keyFrameIndex`. Must
+ * be >= 0, < the number of frames of the example, and an integer.
+ * @throws Error If the UID and/or the `keyFrameIndex` value is invalid.
+ */
+ setExampleKeyFrameIndex(uid: string, keyFrameIndex: number) {
+ if (!(uid in this.examples)) {
+ throw new Error(`Nonexistent example UID: ${uid}`);
+ }
+ const spectrogram = this.examples[uid].spectrogram;
+ const numFrames = spectrogram.data.length / spectrogram.frameSize;
+ tf.util.assert(
+ keyFrameIndex >= 0 && keyFrameIndex < numFrames &&
+ Number.isInteger(keyFrameIndex),
+ () => `Invalid keyFrameIndex: ${keyFrameIndex}. ` +
+ `Must be >= 0, < ${numFrames}, and an integer.`);
+ spectrogram.keyFrameIndex = keyFrameIndex;
+ }
+
+ /**
+ * Get the total number of `Example` currently held by the `Dataset`.
+ *
+ * @returns Total `Example` count.
+ */
+ size(): number {
+ return Object.keys(this.examples).length;
+ }
+
+ /**
+ * Get the total duration of the `Example` currently held by `Dataset`,
+ *
+ * in milliseconds.
+ *
+ * @return Total duration in milliseconds.
+ */
+ durationMillis(): number {
+ let durMillis = 0;
+ const DEFAULT_FRAME_DUR_MILLIS = 23.22;
+ for (const key in this.examples) {
+ const spectrogram = this.examples[key].spectrogram;
+ const frameDurMillis =
+ spectrogram.frameDurationMillis | DEFAULT_FRAME_DUR_MILLIS;
+ durMillis +=
+ spectrogram.data.length / spectrogram.frameSize * frameDurMillis;
+ }
+ return durMillis;
+ }
+
+ /**
+ * Query whether the `Dataset` is currently empty.
+ *
+ * I.e., holds zero examples.
+ *
+ * @returns Whether the `Dataset` is currently empty.
+ */
+ empty(): boolean {
+ return this.size() === 0;
+ }
+
+ /**
+ * Remove all `Example`s from the `Dataset`.
+ */
+ clear(): void {
+ this.examples = {};
+ }
+
+ /**
+ * Get the list of labels among all `Example`s the `Dataset` currently holds.
+ *
+ * @returns A sorted Array of labels, for the unique labels that belong to all
+ * `Example`s currently held by the `Dataset`.
+ */
+ getVocabulary(): string[] {
+ const vocab = new Set();
+ for (const uid in this.examples) {
+ const example = this.examples[uid];
+ vocab.add(example.label);
+ }
+ const sortedVocab = [...vocab];
+ sortedVocab.sort();
+ return sortedVocab;
+ }
+
+ /**
+ * Serialize the `Dataset`.
+ *
+ * The `Examples` are sorted in the following order:
+ * - First, the labels in the vocabulary are sorted.
+ * - Second, the `Example`s for every label are sorted by the order in
+ * which they are added to this `Dataset`.
+ *
+ * @param wordLabels Optional word label(s) to serialize. If specified, only
+ * the examples with labels matching the argument will be serialized. If
+ * any specified word label does not exist in the vocabulary of this
+ * dataset, an Error will be thrown.
+ * @returns A `ArrayBuffer` object amenable to transmission and storage.
+ */
+ serialize(wordLabels?: string|string[]): ArrayBuffer {
+ const vocab = this.getVocabulary();
+ tf.util.assert(!this.empty(), () => `Cannot serialize empty Dataset`);
+
+ if (wordLabels != null) {
+ if (!Array.isArray(wordLabels)) {
+ wordLabels = [wordLabels];
+ }
+ wordLabels.forEach(wordLabel => {
+ if (vocab.indexOf(wordLabel) === -1) {
+ throw new Error(
+ `Word label "${wordLabel}" does not exist in the ` +
+ `vocabulary of this dataset. The vocabulary is: ` +
+ `${JSON.stringify(vocab)}.`);
+ }
+ });
+ }
+
+ const manifest: ExampleSpec[] = [];
+ const buffers: ArrayBuffer[] = [];
+ for (const label of vocab) {
+ if (wordLabels != null && wordLabels.indexOf(label) === -1) {
+ continue;
+ }
+ const ids = this.label2Ids[label];
+ for (const id of ids) {
+ const artifact = serializeExample(this.examples[id]);
+ manifest.push(artifact.spec);
+ buffers.push(artifact.data);
+ }
+ }
+ return serializedExamples2ArrayBuffer(
+ {manifest, data: concatenateArrayBuffers(buffers)});
+ }
+}
+
+/** Serialize an `Example`. */
+export function serializeExample(example: Example):
+ {spec: ExampleSpec, data: ArrayBuffer} {
+ const hasRawAudio = example.rawAudio != null;
+ const spec: ExampleSpec = {
+ label: example.label,
+ spectrogramNumFrames:
+ example.spectrogram.data.length / example.spectrogram.frameSize,
+ spectrogramFrameSize: example.spectrogram.frameSize,
+ };
+ if (example.spectrogram.keyFrameIndex != null) {
+ spec.spectrogramKeyFrameIndex = example.spectrogram.keyFrameIndex;
+ }
+
+ let data = example.spectrogram.data.buffer.slice(0);
+ if (hasRawAudio) {
+ spec.rawAudioNumSamples = example.rawAudio.data.length;
+ spec.rawAudioSampleRateHz = example.rawAudio.sampleRateHz;
+
+ // Account for the fact that the data are all float32.
+ data = concatenateArrayBuffers([data, example.rawAudio.data.buffer]);
+ }
+ return {spec, data};
+}
+
+/** Deserialize an `Example`. */
+export function deserializeExample(
+ artifact: {spec: ExampleSpec, data: ArrayBuffer}): Example {
+ const spectrogram: SpectrogramData = {
+ frameSize: artifact.spec.spectrogramFrameSize,
+ data: new Float32Array(artifact.data.slice(
+ 0,
+ 4 * artifact.spec.spectrogramFrameSize *
+ artifact.spec.spectrogramNumFrames))
+ };
+ if (artifact.spec.spectrogramKeyFrameIndex != null) {
+ spectrogram.keyFrameIndex = artifact.spec.spectrogramKeyFrameIndex;
+ }
+ const ex: Example = {label: artifact.spec.label, spectrogram};
+ if (artifact.spec.rawAudioNumSamples != null) {
+ ex.rawAudio = {
+ sampleRateHz: artifact.spec.rawAudioSampleRateHz,
+ data: new Float32Array(artifact.data.slice(
+ 4 * artifact.spec.spectrogramFrameSize *
+ artifact.spec.spectrogramNumFrames))
+ };
+ }
+ return ex;
+}
+
+/**
+ * Encode intermediate serialization format as an ArrayBuffer.
+ *
+ * Format of the binary ArrayBuffer:
+ * 1. An 8-byte descriptor (see above).
+ * 2. A 4-byte version number as Uint32.
+ * 3. A 4-byte number for the byte length of the JSON manifest.
+ * 4. The encoded JSON manifest
+ * 5. The binary data of the spectrograms, and raw audio (if any).
+ *
+ * @param serialized: Intermediate serialization format of a dataset.
+ * @returns The binary conversion result as an ArrayBuffer.
+ */
+function serializedExamples2ArrayBuffer(serialized: SerializedExamples):
+ ArrayBuffer {
+ const manifestBuffer =
+ string2ArrayBuffer(JSON.stringify(serialized.manifest));
+
+ const descriptorBuffer = string2ArrayBuffer(DATASET_SERIALIZATION_DESCRIPTOR);
+ const version = new Uint32Array([DATASET_SERIALIZATION_VERSION]);
+ const manifestLength = new Uint32Array([manifestBuffer.byteLength]);
+ const headerBuffer = concatenateArrayBuffers(
+ [descriptorBuffer, version.buffer, manifestLength.buffer]);
+
+ return concatenateArrayBuffers(
+ [headerBuffer, manifestBuffer, serialized.data]);
+}
+
+/** Decode an ArrayBuffer as intermediate serialization format. */
+export function arrayBuffer2SerializedExamples(buffer: ArrayBuffer):
+ SerializedExamples {
+ tf.util.assert(buffer != null, () => 'Received null or undefined buffer');
+ // Check descriptor.
+ let offset = 0;
+ const descriptor = arrayBuffer2String(
+ buffer.slice(offset, DATASET_SERIALIZATION_DESCRIPTOR.length));
+ tf.util.assert(
+ descriptor === DATASET_SERIALIZATION_DESCRIPTOR,
+ () => `Deserialization error: Invalid descriptor`);
+ offset += DATASET_SERIALIZATION_DESCRIPTOR.length;
+ // Skip the version part for now. It may be used in the future.
+ offset += 4;
+
+ // Extract the length of the encoded manifest JSON as a Uint32.
+ const manifestLength = new Uint32Array(buffer, offset, 1);
+ offset += 4;
+ const manifestBeginByte = offset;
+ offset = manifestBeginByte + manifestLength[0];
+ const manifestBytes = buffer.slice(manifestBeginByte, offset);
+ const manifestString = arrayBuffer2String(manifestBytes);
+ const manifest = JSON.parse(manifestString);
+ const data = buffer.slice(offset);
+ return {manifest, data};
+}
+
+/**
+ * Get valid windows in a long snippet.
+ *
+ * Each window is represented by an inclusive left index and an exclusive
+ * right index.
+ *
+ * @param snippetLength Long of the entire snippet. Must be a positive
+ * integer.
+ * @param focusIndex Optional. If `null` or `undefined`, an array of
+ * evenly-spaced windows will be generated. The array of windows will
+ * start from the first possible location (i.e., [0, windowLength]).
+ * If not `null` or `undefined`, must be an integer >= 0 and < snippetLength.
+ * @param windowLength Length of each window. Must be a positive integer and
+ * <= snippetLength.
+ * @param windowHop Hops between successsive windows. Must be a positive
+ * integer.
+ * @returns An array of [beginIndex, endIndex] pairs.
+ */
+export function getValidWindows(
+ snippetLength: number, focusIndex: number, windowLength: number,
+ windowHop: number): Array<[number, number]> {
+ tf.util.assert(
+ Number.isInteger(snippetLength) && snippetLength > 0,
+ () =>
+ `snippetLength must be a positive integer, but got ${snippetLength}`);
+ if (focusIndex != null) {
+ tf.util.assert(
+ Number.isInteger(focusIndex) && focusIndex >= 0,
+ () =>
+ `focusIndex must be a non-negative integer, but got ${focusIndex}`);
+ }
+ tf.util.assert(
+ Number.isInteger(windowLength) && windowLength > 0,
+ () => `windowLength must be a positive integer, but got ${windowLength}`);
+ tf.util.assert(
+ Number.isInteger(windowHop) && windowHop > 0,
+ () => `windowHop must be a positive integer, but got ${windowHop}`);
+ tf.util.assert(
+ windowLength <= snippetLength,
+ () => `windowLength (${windowLength}) exceeds snippetLength ` +
+ `(${snippetLength})`);
+ tf.util.assert(
+ focusIndex < snippetLength,
+ () => `focusIndex (${focusIndex}) equals or exceeds snippetLength ` +
+ `(${snippetLength})`);
+
+ if (windowLength === snippetLength) {
+ return [[0, snippetLength]];
+ }
+
+ const windows: Array<[number, number]> = [];
+
+ if (focusIndex == null) {
+ // Deal with the special case of no focus frame:
+ // Output an array of evenly-spaced windows, starting from
+ // the first possible location.
+ let begin = 0;
+ while (begin + windowLength <= snippetLength) {
+ windows.push([begin, begin + windowLength]);
+ begin += windowHop;
+ }
+ return windows;
+ }
+
+ const leftHalf = Math.floor(windowLength / 2);
+ let left = focusIndex - leftHalf;
+ if (left < 0) {
+ left = 0;
+ } else if (left + windowLength > snippetLength) {
+ left = snippetLength - windowLength;
+ }
+
+ while (true) {
+ if (left - windowHop < 0 || focusIndex >= left - windowHop + windowLength) {
+ break;
+ }
+ left -= windowHop;
+ }
+
+ while (left + windowLength <= snippetLength) {
+ if (focusIndex < left) {
+ break;
+ }
+ windows.push([left, left + windowLength]);
+ left += windowHop;
+ }
+ return windows;
+}
+
+/**
+ * Calculate an intensity profile from a spectrogram.
+ *
+ * The intensity at each time frame is caclulated by simply averaging all the
+ * spectral values that belong to that time frame.
+ *
+ * @param spectrogram The input spectrogram.
+ * @returns The temporal profile of the intensity as a 1D tf.Tensor of shape
+ * `[numFrames]`.
+ */
+export function spectrogram2IntensityCurve(spectrogram: SpectrogramData):
+ tf.Tensor {
+ return tf.tidy(() => {
+ const numFrames = spectrogram.data.length / spectrogram.frameSize;
+ const x = tf.tensor2d(spectrogram.data, [numFrames, spectrogram.frameSize]);
+ return tf.mean(x, -1);
+ });
+}
+
+/**
+ * Get the index to the maximum intensity frame.
+ *
+ * The intensity of each time frame is calculated as the arithmetic mean of
+ * all the spectral values belonging to that time frame.
+ *
+ * @param spectrogram The input spectrogram.
+ * @returns The index to the time frame containing the maximum intensity.
+ */
+export function getMaxIntensityFrameIndex(spectrogram: SpectrogramData):
+ tf.Scalar {
+ return tf.tidy(() => tf.argMax(spectrogram2IntensityCurve(spectrogram)));
+}
diff --git a/音频分类/speech-commands/src/dataset_test.ts b/音频分类/speech-commands/src/dataset_test.ts
new file mode 100644
index 0000000..272ead6
--- /dev/null
+++ b/音频分类/speech-commands/src/dataset_test.ts
@@ -0,0 +1,1325 @@
+/**
+ * @license
+ * Copyright 2019 Google LLC. All Rights Reserved.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =============================================================================
+ */
+
+import * as tf from '@tensorflow/tfjs-core';
+import {test_util} from '@tensorflow/tfjs-core';
+
+import {normalize} from './browser_fft_utils';
+import {arrayBuffer2SerializedExamples, BACKGROUND_NOISE_TAG, Dataset, DATASET_SERIALIZATION_DESCRIPTOR, DATASET_SERIALIZATION_VERSION, deserializeExample, getMaxIntensityFrameIndex, getValidWindows, serializeExample, spectrogram2IntensityCurve, SpectrogramAndTargetsTfDataset} from './dataset';
+import {string2ArrayBuffer} from './generic_utils';
+import {expectTensorsClose} from './test_utils';
+import {Example, RawAudioData, SpectrogramData} from './types';
+
+describe('Dataset', () => {
+ const FAKE_NUM_FRAMES = 4;
+ const FAKE_FRAME_SIZE = 16;
+
+ function getFakeExample(
+ label: string, numFrames = FAKE_NUM_FRAMES, frameSize = FAKE_FRAME_SIZE,
+ spectrogramData?: number[]): Example {
+ if (spectrogramData == null) {
+ spectrogramData = [];
+ let counter = 0;
+ for (let i = 0; i < numFrames * frameSize; ++i) {
+ spectrogramData.push(counter++);
+ }
+ }
+ return {
+ label,
+ spectrogram: {data: new Float32Array(spectrogramData), frameSize}
+ };
+ }
+
+ function addThreeExamplesToDataset(
+ dataset: Dataset, labelA = 'a', labelB = 'b'): string[] {
+ const ex1 = getFakeExample(labelA);
+ const uid1 = dataset.addExample(ex1);
+ const ex2 = getFakeExample(labelA);
+ const uid2 = dataset.addExample(ex2);
+ const ex3 = getFakeExample(labelB);
+ const uid3 = dataset.addExample(ex3);
+ return [uid1, uid2, uid3];
+ }
+
+ it('Constructor', () => {
+ const dataset = new Dataset();
+ expect(dataset.empty()).toEqual(true);
+ expect(dataset.size()).toEqual(0);
+ });
+
+ it('addExample', () => {
+ const dataset = new Dataset();
+
+ const uids: string[] = [];
+ const ex1 = getFakeExample('a');
+ const uid1 = dataset.addExample(ex1);
+ expect(uid1).toMatch(/^([0-9a-f]+\-)+[0-9a-f]+$/);
+ uids.push(uid1);
+ expect(dataset.empty()).toEqual(false);
+ expect(dataset.size()).toEqual(1);
+ expect(dataset.getExampleCounts()).toEqual({'a': 1});
+
+ const ex2 = getFakeExample('a');
+ const uid2 = dataset.addExample(ex2);
+ expect(uids.indexOf(uid2)).toEqual(-1);
+ uids.push(uid2);
+ expect(dataset.empty()).toEqual(false);
+ expect(dataset.size()).toEqual(2);
+ expect(dataset.getExampleCounts()).toEqual({'a': 2});
+
+ const ex3 = getFakeExample('b');
+ const uid3 = dataset.addExample(ex3);
+ expect(uids.indexOf(uid3)).toEqual(-1);
+ uids.push(uid3);
+ expect(dataset.empty()).toEqual(false);
+ expect(dataset.size()).toEqual(3);
+ expect(dataset.getExampleCounts()).toEqual({'a': 2, 'b': 1});
+ });
+
+ it('addExample with null fails', () => {
+ const dataset = new Dataset();
+ expect(() => dataset.addExample(null))
+ .toThrowError('Got null or undefined example');
+ });
+
+ it('addExample with invalid label fails', () => {
+ const dataset = new Dataset();
+ expect(() => dataset.addExample(getFakeExample(null)))
+ .toThrowError(/Expected label to be a non-empty string.*null/);
+ expect(() => dataset.addExample(getFakeExample(undefined)))
+ .toThrowError(/Expected label to be a non-empty string.*undefined/);
+ expect(() => dataset.addExample(getFakeExample('')))
+ .toThrowError(/Expected label to be a non-empty string/);
+ });
+
+ it('durationMillis', () => {
+ const dataset = new Dataset();
+ expect(dataset.durationMillis()).toEqual(0);
+ const ex1 = getFakeExample('a');
+ dataset.addExample(ex1);
+ const durationPerExample = dataset.durationMillis();
+ expect(durationPerExample).toBeGreaterThan(0);
+ const ex2 = getFakeExample('b');
+ dataset.addExample(ex2);
+ expect(dataset.durationMillis()).toEqual(durationPerExample * 2);
+ dataset.clear();
+ expect(dataset.durationMillis()).toEqual(0);
+ });
+
+ it('merge two non-empty datasets', () => {
+ const dataset = new Dataset();
+ addThreeExamplesToDataset(dataset);
+ const datasetPrime = new Dataset();
+ addThreeExamplesToDataset(datasetPrime);
+ const ex = getFakeExample('foo');
+ datasetPrime.addExample(ex);
+ const duration0 = dataset.durationMillis();
+ dataset.merge(datasetPrime);
+ expect(dataset.getExampleCounts()).toEqual({a: 4, b: 2, foo: 1});
+ // Check that the content of the incoming dataset is not affected.
+ expect(datasetPrime.getExampleCounts()).toEqual({a: 2, b: 1, foo: 1});
+ expect(dataset.durationMillis())
+ .toEqual(duration0 + datasetPrime.durationMillis());
+ });
+
+ it('merge non-empty dataset into an empty one', () => {
+ const dataset = new Dataset();
+ const datasetPrime = new Dataset();
+ addThreeExamplesToDataset(datasetPrime);
+ dataset.merge(datasetPrime);
+ expect(dataset.getExampleCounts()).toEqual({a: 2, b: 1});
+ // Check that the content of the incoming dataset is not affected.
+ expect(datasetPrime.getExampleCounts()).toEqual({a: 2, b: 1});
+ });
+
+ it('merge empty dataset into an non-empty one', () => {
+ const dataset = new Dataset();
+ addThreeExamplesToDataset(dataset);
+ const datasetPrime = new Dataset();
+ dataset.merge(datasetPrime);
+ expect(dataset.getExampleCounts()).toEqual({a: 2, b: 1});
+ // Check that the content of the incoming dataset is not affected.
+ expect(datasetPrime.empty()).toEqual(true);
+ });
+
+ it('getExamples', () => {
+ const dataset = new Dataset();
+ const [uid1, uid2, uid3] = addThreeExamplesToDataset(dataset);
+ const out1 = dataset.getExamples('a');
+ expect(out1.length).toEqual(2);
+ expect(out1[0].uid).toEqual(uid1);
+ expect(out1[0].example.label).toEqual('a');
+ expect(out1[1].uid).toEqual(uid2);
+ expect(out1[1].example.label).toEqual('a');
+ const out2 = dataset.getExamples('b');
+ expect(out2.length).toEqual(1);
+ expect(out2[0].uid).toEqual(uid3);
+ expect(out2[0].example.label).toEqual('b');
+ });
+
+ it('getExamples after addExample', () => {
+ const dataset = new Dataset();
+ const [uid1, uid2] = addThreeExamplesToDataset(dataset);
+ const out1 = dataset.getExamples('a');
+ expect(out1.length).toEqual(2);
+ expect(out1[0].uid).toEqual(uid1);
+ expect(out1[0].example.label).toEqual('a');
+ expect(out1[1].uid).toEqual(uid2);
+ expect(out1[1].example.label).toEqual('a');
+
+ const ex = getFakeExample('a');
+ const uid4 = dataset.addExample(ex);
+ const out2 = dataset.getExamples('a');
+ expect(out2.length).toEqual(3);
+ expect(out2[0].uid).toEqual(uid1);
+ expect(out2[0].example.label).toEqual('a');
+ expect(out2[1].uid).toEqual(uid2);
+ expect(out2[1].example.label).toEqual('a');
+ expect(out2[2].uid).toEqual(uid4);
+ expect(out2[2].example.label).toEqual('a');
+ });
+
+ it('getExamples after removeExample', () => {
+ const dataset = new Dataset();
+ const [uid1, uid2] = addThreeExamplesToDataset(dataset);
+ const out1 = dataset.getExamples('a');
+ expect(out1.length).toEqual(2);
+ expect(out1[0].uid).toEqual(uid1);
+ expect(out1[0].example.label).toEqual('a');
+ expect(out1[1].uid).toEqual(uid2);
+ expect(out1[1].example.label).toEqual('a');
+
+ dataset.removeExample(uid1);
+ const out2 = dataset.getExamples('a');
+ expect(out2.length).toEqual(1);
+ expect(out2[0].uid).toEqual(uid2);
+ expect(out2[0].example.label).toEqual('a');
+
+ dataset.removeExample(uid2);
+ expect(() => dataset.getExamples('a'))
+ .toThrowError(/No example .*a.* exists/);
+ });
+
+ it('getExamples after removeExample followed by addExample', () => {
+ const dataset = new Dataset();
+ const [uid1, uid2] = addThreeExamplesToDataset(dataset);
+ const out1 = dataset.getExamples('a');
+ expect(out1.length).toEqual(2);
+ expect(out1[0].uid).toEqual(uid1);
+ expect(out1[0].example.label).toEqual('a');
+ expect(out1[1].uid).toEqual(uid2);
+ expect(out1[1].example.label).toEqual('a');
+
+ dataset.removeExample(uid1);
+ const out2 = dataset.getExamples('a');
+ expect(out2.length).toEqual(1);
+ expect(out2[0].uid).toEqual(uid2);
+ expect(out2[0].example.label).toEqual('a');
+
+ const ex = getFakeExample('a');
+ const uid4 = dataset.addExample(ex);
+ const out3 = dataset.getExamples('a');
+ expect(out3.length).toEqual(2);
+ expect(out3[0].uid).toEqual(uid2);
+ expect(out3[0].example.label).toEqual('a');
+ expect(out3[1].uid).toEqual(uid4);
+ expect(out3[1].example.label).toEqual('a');
+ });
+
+ it('getExamples with nonexistent label fails', () => {
+ const dataset = new Dataset();
+ addThreeExamplesToDataset(dataset);
+ expect(() => dataset.getExamples('labelC'))
+ .toThrowError(/No example .*labelC.* exists/);
+ });
+
+ it('removeExample', () => {
+ const dataset = new Dataset();
+
+ const ex1 = getFakeExample('a');
+ const uid1 = dataset.addExample(ex1);
+ expect(dataset.empty()).toEqual(false);
+ expect(dataset.size()).toEqual(1);
+ expect(dataset.getExampleCounts()).toEqual({'a': 1});
+
+ const ex2 = getFakeExample('a');
+ const uid2 = dataset.addExample(ex2);
+ expect(dataset.empty()).toEqual(false);
+ expect(dataset.size()).toEqual(2);
+ expect(dataset.getExampleCounts()).toEqual({'a': 2});
+
+ const ex3 = getFakeExample('b');
+ const uid3 = dataset.addExample(ex3);
+ expect(dataset.empty()).toEqual(false);
+ expect(dataset.size()).toEqual(3);
+ expect(dataset.getExampleCounts()).toEqual({'a': 2, 'b': 1});
+
+ dataset.removeExample(uid1);
+ expect(dataset.empty()).toEqual(false);
+ expect(dataset.size()).toEqual(2);
+ expect(dataset.getExampleCounts()).toEqual({'a': 1, 'b': 1});
+
+ dataset.removeExample(uid2);
+ expect(dataset.empty()).toEqual(false);
+ expect(dataset.size()).toEqual(1);
+ expect(dataset.getExampleCounts()).toEqual({'b': 1});
+
+ dataset.removeExample(uid3);
+ expect(dataset.empty()).toEqual(true);
+ expect(dataset.size()).toEqual(0);
+ expect(dataset.getExampleCounts()).toEqual({});
+ });
+
+ it('removeExample with nonexistent UID fails', () => {
+ const dataset = new Dataset();
+
+ const ex1 = getFakeExample('a');
+ const uid1 = dataset.addExample(ex1);
+ dataset.removeExample(uid1);
+ expect(() => dataset.removeExample(uid1))
+ .toThrowError(/Nonexistent example UID/);
+ });
+
+ it('setExampleKeyFrameIndex: works`', () => {
+ const dataset = new Dataset();
+
+ const ex1 = getFakeExample('a');
+ const uid1 = dataset.addExample(ex1);
+ dataset.setExampleKeyFrameIndex(uid1, 1);
+ expect(ex1.spectrogram.keyFrameIndex).toEqual(1);
+ const numFrames = ex1.spectrogram.data.length / ex1.spectrogram.frameSize;
+ dataset.setExampleKeyFrameIndex(uid1, numFrames - 1);
+ expect(ex1.spectrogram.keyFrameIndex).toEqual(numFrames - 1);
+ });
+
+ it('setExampleFrameIndex: serialization-deserialization', () => {
+ const dataset = new Dataset();
+
+ const ex1 = getFakeExample('a');
+ const uid1 = dataset.addExample(ex1);
+ const numFrames = ex1.spectrogram.data.length / ex1.spectrogram.frameSize;
+ dataset.setExampleKeyFrameIndex(uid1, numFrames - 1);
+ expect(ex1.spectrogram.keyFrameIndex).toEqual(numFrames - 1);
+
+ const datasetPrime = new Dataset(dataset.serialize());
+ const ex1Prime = datasetPrime.getExamples('a')[0];
+ expect(ex1Prime.example.spectrogram.keyFrameIndex).toEqual(numFrames - 1);
+ });
+
+ it('setExampleKeyFrameIndex: Invalid example UID leads to error`', () => {
+ const dataset = new Dataset();
+
+ const ex1 = getFakeExample('a');
+ const uid1 = dataset.addExample(ex1);
+ expect(() => dataset.setExampleKeyFrameIndex(uid1 + '_foo', 0))
+ .toThrowError(/Nonexistent example UID/);
+ });
+
+ it('setExampleKeyFrameIndex: Negative index leads to error`', () => {
+ const dataset = new Dataset();
+
+ const ex1 = getFakeExample('a');
+ const uid1 = dataset.addExample(ex1);
+ expect(() => dataset.setExampleKeyFrameIndex(uid1, -1))
+ .toThrowError(/Invalid keyFrameIndex/);
+ });
+
+ it('setExampleKeyFrameIndex: Too large index leads to error`', () => {
+ const dataset = new Dataset();
+
+ const ex1 = getFakeExample('a');
+ const numFrames = ex1.spectrogram.data.length / ex1.spectrogram.frameSize;
+ const uid1 = dataset.addExample(ex1);
+ expect(() => dataset.setExampleKeyFrameIndex(uid1, numFrames))
+ .toThrowError(/Invalid keyFrameIndex/);
+ expect(() => dataset.setExampleKeyFrameIndex(uid1, numFrames + 1))
+ .toThrowError(/Invalid keyFrameIndex/);
+ });
+
+ it('setExampleKeyFrameIndex: Non-integr value leads to error`', () => {
+ const dataset = new Dataset();
+
+ const ex1 = getFakeExample('a');
+ const uid1 = dataset.addExample(ex1);
+ expect(() => dataset.setExampleKeyFrameIndex(uid1, 0.5))
+ .toThrowError(/Invalid keyFrameIndex/);
+ });
+
+ it('getVocabulary', () => {
+ const dataset = new Dataset();
+ expect(dataset.getVocabulary()).toEqual([]);
+
+ const ex1 = getFakeExample('a');
+ const ex2 = getFakeExample('a');
+ const ex3 = getFakeExample('b');
+
+ const uid1 = dataset.addExample(ex1);
+ expect(dataset.getVocabulary()).toEqual(['a']);
+ const uid2 = dataset.addExample(ex2);
+ expect(dataset.getVocabulary()).toEqual(['a']);
+ const uid3 = dataset.addExample(ex3);
+ expect(dataset.getVocabulary()).toEqual(['a', 'b']);
+
+ dataset.removeExample(uid1);
+ expect(dataset.getVocabulary()).toEqual(['a', 'b']);
+ dataset.removeExample(uid2);
+ expect(dataset.getVocabulary()).toEqual(['b']);
+ dataset.removeExample(uid3);
+ expect(dataset.getVocabulary()).toEqual([]);
+ });
+
+ it('getSpectrogramsAsTensors with label', () => {
+ const dataset = new Dataset();
+ addThreeExamplesToDataset(dataset);
+
+ const out1 = dataset.getData('a') as {xs: tf.Tensor, ys: tf.Tensor};
+ expect(out1.xs.shape).toEqual([2, FAKE_NUM_FRAMES, FAKE_FRAME_SIZE, 1]);
+ expect(out1.ys).toBeUndefined();
+ const out2 = dataset.getData('b') as {xs: tf.Tensor, ys: tf.Tensor};
+ expect(out2.xs.shape).toEqual([1, FAKE_NUM_FRAMES, FAKE_FRAME_SIZE, 1]);
+ expect(out2.ys).toBeUndefined();
+ });
+
+ it('getSpectrogramsAsTensors after removeExample', () => {
+ const dataset = new Dataset();
+ const [uid1, uid2] = addThreeExamplesToDataset(dataset);
+
+ dataset.removeExample(uid1);
+ const out1 = dataset.getData(null, {shuffle: false}) as
+ {xs: tf.Tensor, ys: tf.Tensor};
+ expect(out1.xs.shape).toEqual([2, FAKE_NUM_FRAMES, FAKE_FRAME_SIZE, 1]);
+ expectTensorsClose(out1.ys, tf.tensor2d([[1, 0], [0, 1]]));
+
+ const out2 = dataset.getData('a') as {xs: tf.Tensor, ys: tf.Tensor};
+ expect(out2.xs.shape).toEqual([1, FAKE_NUM_FRAMES, FAKE_FRAME_SIZE, 1]);
+
+ dataset.removeExample(uid2);
+ expect(() => dataset.getData('a'))
+ .toThrowError(/Label a is not in the vocabulary/);
+
+ const out3 = dataset.getData('b') as {xs: tf.Tensor, ys: tf.Tensor};
+ expect(out3.xs.shape).toEqual([1, FAKE_NUM_FRAMES, FAKE_FRAME_SIZE, 1]);
+ });
+
+ it('getSpectrogramsAsTensors w/o label on one-word vocabulary fails', () => {
+ const dataset = new Dataset();
+ const [uid1, uid2] = addThreeExamplesToDataset(dataset);
+ dataset.removeExample(uid1);
+ dataset.removeExample(uid2);
+
+ expect(() => dataset.getData())
+ .toThrowError(/requires .* at least two words/);
+ });
+
+ it('getSpectrogramsAsTensors without label', () => {
+ const dataset = new Dataset();
+ addThreeExamplesToDataset(dataset);
+
+ const out = dataset.getData(null, {shuffle: false}) as
+ {xs: tf.Tensor, ys: tf.Tensor};
+ expect(out.xs.shape).toEqual([3, FAKE_NUM_FRAMES, FAKE_FRAME_SIZE, 1]);
+ expectTensorsClose(out.ys, tf.tensor2d([[1, 0], [1, 0], [0, 1]]));
+ });
+
+ it('getSpectrogramsAsTensors without label as tf.data.Dataset', async () => {
+ const dataset = new Dataset();
+ addThreeExamplesToDataset(dataset);
+
+ const [trainDataset, valDataset] = dataset.getData(null, {
+ getDataset: true,
+ datasetBatchSize: 1,
+ datasetValidationSplit: 1 / 3
+ }) as [SpectrogramAndTargetsTfDataset, SpectrogramAndTargetsTfDataset];
+ let numTrain = 0;
+ await trainDataset.forEachAsync(
+ (xAndY: {xs: tf.Tensor2D, ys: tf.Tensor2D}) => {
+ const {xs, ys} = xAndY;
+ numTrain++;
+ expect(xs.shape).toEqual([1, FAKE_NUM_FRAMES, FAKE_FRAME_SIZE, 1]);
+ expect(xs.isDisposed).toEqual(false);
+ expect(ys.shape).toEqual([1, 2]);
+ expect(ys.isDisposed).toEqual(false);
+ });
+ expect(numTrain).toEqual(2);
+ let numVal = 0;
+ await valDataset.forEachAsync(
+ (xAndY: {xs: tf.Tensor2D, ys: tf.Tensor2D}) => {
+ const {xs, ys} = xAndY;
+ numVal++;
+ expect(xs.shape).toEqual([1, FAKE_NUM_FRAMES, FAKE_FRAME_SIZE, 1]);
+ expect(xs.isDisposed).toEqual(false);
+ expect(ys.shape).toEqual([1, 2]);
+ expect(ys.isDisposed).toEqual(false);
+ });
+ expect(numVal).toEqual(1);
+ });
+
+ it('getData w/ mixing-noise augmentation: get tf.data.Dataset', async () => {
+ const dataset = new Dataset();
+ dataset.addExample(getFakeExample(
+ BACKGROUND_NOISE_TAG, 6, 2,
+ [10, 10, 20, 20, 30, 30, 20, 20, 10, 10, 0, 0]));
+ dataset.addExample(
+ getFakeExample('bar', 5, 2, [1, 1, 2, 2, 3, 3, 2, 2, 1, 1]));
+
+ const numFrames = 3;
+ const [trainDataset, valDataset] = dataset.getData(null, {
+ numFrames,
+ hopFrames: 1,
+ augmentByMixingNoiseRatio: 0.5,
+ getDataset: true,
+ datasetBatchSize: 1,
+ datasetValidationSplit: 1 / 3
+ }) as [SpectrogramAndTargetsTfDataset, SpectrogramAndTargetsTfDataset];
+
+ let numTrain = 0;
+ await trainDataset.forEachAsync(
+ (xAndY: {xs: tf.Tensor2D, ys: tf.Tensor2D}) => {
+ const {xs, ys} = xAndY;
+ numTrain++;
+ expect(xs.shape).toEqual([1, numFrames, 2, 1]);
+ expect(xs.isDisposed).toEqual(false);
+ expect(ys.shape).toEqual([1, 2]);
+ expect(ys.isDisposed).toEqual(false);
+ });
+ let numVal = 0;
+ await valDataset.forEachAsync(
+ (xAndY: {xs: tf.Tensor2D, ys: tf.Tensor2D}) => {
+ const {xs, ys} = xAndY;
+ numVal++;
+ expect(xs.shape).toEqual([1, numFrames, 2, 1]);
+ expect(xs.isDisposed).toEqual(false);
+ expect(ys.shape).toEqual([1, 2]);
+ expect(ys.isDisposed).toEqual(false);
+ });
+ expect(numTrain).toEqual(7); // Without augmentation, it'd be 5.
+ expect(numVal).toEqual(3); // Without augmentation, it'd be 2.
+ });
+
+ it('getData w/ mixing-noise augmentation w/o noise tag errors', async () => {
+ const dataset = new Dataset();
+ dataset.addExample(getFakeExample(
+ 'foo', 6, 2, [10, 10, 20, 20, 30, 30, 20, 20, 10, 10, 0, 0]));
+ dataset.addExample(
+ getFakeExample('bar', 5, 2, [1, 1, 2, 2, 3, 3, 2, 2, 1, 1]));
+ // Lacks BACKGROUND_NOISE_TAG.
+
+ const numFrames = 3;
+ expect(() => dataset.getData(null, {
+ numFrames,
+ hopFrames: 1,
+ augmentByMixingNoiseRatio: 0.5,
+ getDataset: true,
+ datasetBatchSize: 1,
+ datasetValidationSplit: 1 / 3
+ })).toThrowError(/Cannot perform augmentation .* no example .*noise/);
+ });
+
+ it('getSpectrogramsAsTensors with invalid valSplit leads to error', () => {
+ const dataset = new Dataset();
+ addThreeExamplesToDataset(dataset);
+ expect(() => dataset.getData(null, {
+ getDataset: true,
+ datasetValidationSplit: 1.2
+ })).toThrowError(/Invalid dataset validation split/);
+ });
+
+ it('getSpectrogramsAsTensors on nonexistent label fails', () => {
+ const dataset = new Dataset();
+ addThreeExamplesToDataset(dataset);
+
+ expect(() => dataset.getData('label3'))
+ .toThrowError(/Label label3 is not in the vocabulary/);
+ });
+
+ it('getSpectrogramsAsTensors on empty Dataset fails', () => {
+ const dataset = new Dataset();
+ expect(() => dataset.getData())
+ .toThrowError(/Cannot get spectrograms as tensors because.*empty/);
+ });
+
+ it('Ragged example lengths and one window per example', () => {
+ const dataset = new Dataset();
+ dataset.addExample(getFakeExample('foo', 5));
+ dataset.addExample(getFakeExample('bar', 6));
+ dataset.addExample(getFakeExample('foo', 7));
+
+ const {xs, ys} =
+ dataset.getData(null, {numFrames: 5, hopFrames: 5, shuffle: false}) as
+ {xs: tf.Tensor, ys: tf.Tensor};
+ expect(xs.shape).toEqual([3, 5, FAKE_FRAME_SIZE, 1]);
+ expectTensorsClose(ys, tf.tensor2d([[1, 0], [0, 1], [0, 1]]));
+ });
+
+ it('Ragged example lengths and one window per example, with label', () => {
+ const dataset = new Dataset();
+ dataset.addExample(getFakeExample('foo', 5));
+ dataset.addExample(getFakeExample('bar', 6));
+ dataset.addExample(getFakeExample('foo', 7));
+
+ const {xs, ys} = dataset.getData('foo', {numFrames: 5, hopFrames: 5}) as
+ {xs: tf.Tensor, ys: tf.Tensor};
+ expect(xs.shape).toEqual([2, 5, FAKE_FRAME_SIZE, 1]);
+ expect(ys).toBeUndefined();
+ });
+
+ it('Ragged example lengths and multiple windows per example', () => {
+ const dataset = new Dataset();
+ dataset.addExample(getFakeExample(
+ 'foo', 6, 2, [10, 10, 20, 20, 30, 30, 20, 20, 10, 10, 0, 0]));
+ dataset.addExample(
+ getFakeExample('bar', 5, 2, [1, 1, 2, 2, 3, 3, 2, 2, 1, 1]));
+
+ const {xs, ys} =
+ dataset.getData(
+ null,
+ {numFrames: 3, hopFrames: 1, shuffle: false, normalize: false}) as
+ {xs: tf.Tensor, ys: tf.Tensor};
+ const windows = tf.unstack(xs);
+
+ expect(windows.length).toEqual(6);
+ expectTensorsClose(windows[0], tf.tensor3d([1, 1, 2, 2, 3, 3], [3, 2, 1]));
+ expectTensorsClose(windows[1], tf.tensor3d([2, 2, 3, 3, 2, 2], [3, 2, 1]));
+ expectTensorsClose(windows[2], tf.tensor3d([3, 3, 2, 2, 1, 1], [3, 2, 1]));
+ expectTensorsClose(
+ windows[3], tf.tensor3d([10, 10, 20, 20, 30, 30], [3, 2, 1]));
+ expectTensorsClose(
+ windows[4], tf.tensor3d([20, 20, 30, 30, 20, 20], [3, 2, 1]));
+ expectTensorsClose(
+ windows[5], tf.tensor3d([30, 30, 20, 20, 10, 10], [3, 2, 1]));
+ expectTensorsClose(
+ ys, tf.tensor2d([[1, 0], [1, 0], [1, 0], [0, 1], [0, 1], [0, 1]]));
+ });
+
+ it('getData with mixing-noise augmentation: get tensors', () => {
+ const dataset = new Dataset();
+ dataset.addExample(getFakeExample(
+ BACKGROUND_NOISE_TAG, 6, 2,
+ [10, 10, 20, 20, 30, 30, 20, 20, 10, 10, 0, 0]));
+ dataset.addExample(
+ getFakeExample('bar', 5, 2, [1, 1, 2, 2, 3, 3, 2, 2, 1, 1]));
+
+ const {xs, ys} = dataset.getData(null, {
+ numFrames: 3,
+ hopFrames: 1,
+ shuffle: false,
+ normalize: false,
+ augmentByMixingNoiseRatio: 0.5
+ }) as {xs: tf.Tensor, ys: tf.Tensor};
+
+ // 3 of the newly-generated ones at the end are from the augmentation.
+ expect(xs.shape).toEqual([10, 3, 2, 1]);
+ expect(ys.shape).toEqual([10, 2]);
+ const indices = tf.argMax(ys, -1).dataSync();
+ const backgroundNoiseIndex = indices[0];
+ for (let i = 0; i < 3; ++i) {
+ expect(indices[indices.length - 1 - i] === backgroundNoiseIndex)
+ .toEqual(false);
+ }
+ });
+
+ // TODO(cais): Test that augmentByNoise without BACKGROUND_NOISE tag leads to
+ // Error.
+
+ it('getSpectrogramsAsTensors: normalize=true', () => {
+ const dataset = new Dataset();
+ dataset.addExample(getFakeExample(
+ 'foo', 6, 2, [10, 10, 20, 20, 30, 30, 20, 20, 10, 10, 0, 0]));
+ dataset.addExample(
+ getFakeExample('bar', 5, 2, [1, 1, 2, 2, 3, 3, 2, 2, 1, 1]));
+
+ // `normalize` is `true` by default.
+ const {xs, ys} =
+ dataset.getData(null, {numFrames: 3, hopFrames: 1, shuffle: false}) as
+ {xs: tf.Tensor, ys: tf.Tensor};
+ const windows = tf.unstack(xs);
+
+ expect(windows.length).toEqual(6);
+ for (let i = 0; i < 6; ++i) {
+ const {mean, variance} = tf.moments(windows[0]);
+ expectTensorsClose(mean, tf.scalar(0));
+ expectTensorsClose(variance, tf.scalar(1));
+ }
+ expectTensorsClose(
+ windows[0], normalize(tf.tensor3d([1, 1, 2, 2, 3, 3], [3, 2, 1])));
+ expectTensorsClose(
+ windows[1], normalize(tf.tensor3d([2, 2, 3, 3, 2, 2], [3, 2, 1])));
+ expectTensorsClose(
+ windows[2], normalize(tf.tensor3d([3, 3, 2, 2, 1, 1], [3, 2, 1])));
+ expectTensorsClose(
+ windows[3],
+ normalize(tf.tensor3d([10, 10, 20, 20, 30, 30], [3, 2, 1])));
+ expectTensorsClose(
+ windows[4],
+ normalize(tf.tensor3d([20, 20, 30, 30, 20, 20], [3, 2, 1])));
+ expectTensorsClose(
+ windows[5],
+ normalize(tf.tensor3d([30, 30, 20, 20, 10, 10], [3, 2, 1])));
+ expectTensorsClose(
+ ys, tf.tensor2d([[1, 0], [1, 0], [1, 0], [0, 1], [0, 1], [0, 1]]));
+ });
+
+ it('getSpectrogramsAsTensors: shuffle=true leads to random order', () => {
+ const dataset = new Dataset();
+ dataset.addExample(getFakeExample(
+ 'foo', 6, 2, [10, 10, 20, 20, 30, 30, 20, 20, 10, 10, 0, 0]));
+ dataset.addExample(
+ getFakeExample('bar', 5, 2, [1, 1, 2, 2, 3, 3, 2, 2, 1, 1]));
+
+ const argMaxTensors: tf.Tensor[] = [];
+ for (let i = 0; i < 5; ++i) {
+ // `shuffle` is `true` by default.
+ const {ys} = dataset.getData(null, {numFrames: 3, hopFrames: 1}) as
+ {xs: tf.Tensor, ys: tf.Tensor};
+ // Use `argMax()` to convert the one-hot-encoded `ys` to indices.
+ argMaxTensors.push(tf.argMax(ys, -1));
+ }
+ // `argMaxTensors` are the indices for the targets.
+ // We stack them into a 2D tensor and then calculate the variance along
+ // the examples dimension, in order to detect variance in the indices
+ // between the iterations above.
+ const argMaxMerged = tf.stack(argMaxTensors);
+ // Assert that the orders are not all the same. This is asserting that
+ // the indices are not all the same among the 5 iterations above.
+ const {variance} = tf.moments(argMaxMerged, 0);
+ expect(tf.max(variance).dataSync()[0]).toBeGreaterThan(0);
+ });
+
+ it('getSpectrogramsAsTensors: shuffle=false leads to constant order', () => {
+ const dataset = new Dataset();
+ dataset.addExample(getFakeExample(
+ 'foo', 6, 2, [10, 10, 20, 20, 30, 30, 20, 20, 10, 10, 0, 0]));
+ dataset.addExample(
+ getFakeExample('bar', 5, 2, [1, 1, 2, 2, 3, 3, 2, 2, 1, 1]));
+
+ const argMaxTensors: tf.Tensor[] = [];
+ for (let i = 0; i < 5; ++i) {
+ const {ys} =
+ dataset.getData(null, {numFrames: 3, hopFrames: 1, shuffle: false}) as
+ {xs: tf.Tensor, ys: tf.Tensor};
+ argMaxTensors.push(tf.argMax(ys, -1));
+ }
+ // `argMaxTensors` are the indices for the targets.
+ // We stack them into a 2D tensor and then calculate the variance along
+ // the examples dimension, in order to detect variance in the indices
+ // between the iterations above.
+ const argMaxMerged = tf.stack(argMaxTensors);
+ // Assert that the orders are not all the same. This is asserting that
+ // the indices are all the same among the 5 iterations above.
+ const {variance} = tf.moments(argMaxMerged, 0);
+ expect(tf.max(variance).dataSync()[0]).toEqual(0);
+ });
+
+ it('Uniform example lengths and multiple windows per example', () => {
+ const dataset = new Dataset();
+ dataset.addExample(getFakeExample(
+ 'foo', 6, 2, [10, 10, 20, 20, 30, 30, 20, 20, 10, 10, 0, 0]));
+ dataset.addExample(
+ getFakeExample('bar', 6, 2, [0, 0, 1, 1, 2, 2, 3, 3, 2, 2, 1, 1]));
+
+ const {xs, ys} =
+ dataset.getData(
+ null,
+ {numFrames: 5, hopFrames: 1, shuffle: false, normalize: false}) as
+ {xs: tf.Tensor, ys: tf.Tensor};
+ const windows = tf.unstack(xs);
+ expect(windows.length).toEqual(4);
+ expectTensorsClose(
+ windows[0], tf.tensor3d([0, 0, 1, 1, 2, 2, 3, 3, 2, 2], [5, 2, 1]));
+ expectTensorsClose(
+ windows[1], tf.tensor3d([1, 1, 2, 2, 3, 3, 2, 2, 1, 1], [5, 2, 1]));
+ expectTensorsClose(
+ windows[2],
+ tf.tensor3d([10, 10, 20, 20, 30, 30, 20, 20, 10, 10], [5, 2, 1]));
+ expectTensorsClose(
+ windows[3],
+ tf.tensor3d([20, 20, 30, 30, 20, 20, 10, 10, 0, 0], [5, 2, 1]));
+ expectTensorsClose(ys, tf.tensor2d([[1, 0], [1, 0], [0, 1], [0, 1]]));
+ });
+
+ it('Ragged examples containing background noise', () => {
+ const dataset = new Dataset();
+ dataset.addExample(getFakeExample(
+ BACKGROUND_NOISE_TAG, 7, 2,
+ [0, 0, 10, 10, 20, 20, 30, 30, 20, 20, 10, 10, 0, 0]));
+ dataset.addExample(
+ getFakeExample('bar', 6, 2, [0, 0, 1, 1, 2, 2, 3, 3, 2, 2, 1, 1]));
+ const {xs, ys} =
+ dataset.getData(
+ null,
+ {numFrames: 3, hopFrames: 2, shuffle: false, normalize: false}) as
+ {xs: tf.Tensor, ys: tf.Tensor};
+ const windows = tf.unstack(xs);
+ expect(windows.length).toEqual(4);
+ expectTensorsClose(
+ windows[0], tf.tensor3d([0, 0, 10, 10, 20, 20], [3, 2, 1]));
+ expectTensorsClose(
+ windows[1], tf.tensor3d([20, 20, 30, 30, 20, 20], [3, 2, 1]));
+ expectTensorsClose(
+ windows[2], tf.tensor3d([20, 20, 10, 10, 0, 0], [3, 2, 1]));
+ expectTensorsClose(windows[3], tf.tensor3d([2, 2, 3, 3, 2, 2], [3, 2, 1]));
+ expectTensorsClose(ys, tf.tensor2d([[1, 0], [1, 0], [1, 0], [0, 1]]));
+ });
+
+ it('numFrames exceeding minmum example length leads to Error', () => {
+ const dataset = new Dataset();
+ dataset.addExample(getFakeExample(
+ 'foo', 6, 2, [10, 10, 20, 20, 30, 30, 20, 20, 10, 10, 0, 0]));
+ dataset.addExample(
+ getFakeExample('bar', 5, 2, [1, 1, 2, 2, 3, 3, 2, 2, 1, 1]));
+ expect(() => dataset.getData(null, {numFrames: 6, hopFrames: 2}))
+ .toThrowError(/.*6.*exceeds the minimum numFrames .*5.*/);
+ });
+
+ it('Ragged examples with no numFrames leads to Error', () => {
+ const dataset = new Dataset();
+ dataset.addExample(getFakeExample(
+ 'foo', 6, 2, [10, 10, 20, 20, 30, 30, 20, 20, 10, 10, 0, 0]));
+ dataset.addExample(
+ getFakeExample('bar', 5, 2, [1, 1, 2, 2, 3, 3, 2, 2, 1, 1]));
+ expect(() => dataset.getData(null)).toThrowError(/numFrames is required/);
+ });
+
+ it('Ragged examples with no hopFrames leads to Error', () => {
+ const dataset = new Dataset();
+ dataset.addExample(getFakeExample(
+ 'foo', 6, 2, [10, 10, 20, 20, 30, 30, 20, 20, 10, 10, 0, 0]));
+ dataset.addExample(
+ getFakeExample('bar', 5, 2, [1, 1, 2, 2, 3, 3, 2, 2, 1, 1]));
+ expect(() => dataset.getData(null, {
+ numFrames: 4
+ })).toThrowError(/hopFrames is required/);
+ });
+});
+
+describe('Dataset serialization', () => {
+ function getRandomExample(
+ label: string, numFrames: number, frameSize: number,
+ rawAudioNumSamples?: number, rawAudioSampleRateHz?: number): Example {
+ const spectrogramData = [];
+ for (let i = 0; i < numFrames * frameSize; ++i) {
+ spectrogramData.push(Math.random());
+ }
+ const output: Example = {
+ label,
+ spectrogram: {data: new Float32Array(spectrogramData), frameSize}
+ };
+ if (rawAudioNumSamples != null) {
+ const rawAudioData: number[] = [];
+ for (let i = 0; i < rawAudioNumSamples; ++i) {
+ rawAudioData.push(Math.random());
+ }
+ const rawAudio: RawAudioData = {
+ data: new Float32Array(rawAudioData),
+ sampleRateHz: rawAudioSampleRateHz
+ };
+ output.rawAudio = rawAudio;
+ }
+ return output;
+ }
+
+ it('serializeExample-deserializeExample round trip, no raw audio', () => {
+ const label = 'foo';
+ const numFrames = 10;
+ const frameSize = 16;
+ const ex = getRandomExample(label, numFrames, frameSize);
+ const artifacts = serializeExample(ex);
+ expect(artifacts.spec.label).toEqual(label);
+ expect(artifacts.spec.spectrogramNumFrames).toEqual(numFrames);
+ expect(artifacts.spec.spectrogramFrameSize).toEqual(frameSize);
+ expect(artifacts.spec.rawAudioNumSamples).toBeUndefined();
+ expect(artifacts.spec.rawAudioSampleRateHz).toBeUndefined();
+ expect(artifacts.data.byteLength).toEqual(4 * numFrames * frameSize);
+
+ const exPrime = deserializeExample(artifacts);
+ expect(exPrime.label).toEqual(ex.label);
+ expect(exPrime.spectrogram.frameSize).toEqual(ex.spectrogram.frameSize);
+ test_util.expectArraysEqual(exPrime.spectrogram.data, ex.spectrogram.data);
+ });
+
+ it('serializeExample-deserializeExample round trip, with raw audio', () => {
+ const label = 'foo';
+ const numFrames = 10;
+ const frameSize = 16;
+ const rawAudioNumSamples = 200;
+ const rawAudioSampleRateHz = 48000;
+ const ex = getRandomExample(
+ label, numFrames, frameSize, rawAudioNumSamples, rawAudioSampleRateHz);
+ const artifacts = serializeExample(ex);
+ expect(artifacts.spec.label).toEqual(label);
+ expect(artifacts.spec.spectrogramNumFrames).toEqual(numFrames);
+ expect(artifacts.spec.spectrogramFrameSize).toEqual(frameSize);
+ expect(artifacts.spec.rawAudioNumSamples).toEqual(rawAudioNumSamples);
+ expect(artifacts.spec.rawAudioSampleRateHz).toEqual(rawAudioSampleRateHz);
+ expect(artifacts.data.byteLength)
+ .toEqual(4 * (numFrames * frameSize + rawAudioNumSamples));
+
+ const exPrime = deserializeExample(artifacts);
+ expect(exPrime.label).toEqual(ex.label);
+ expect(exPrime.spectrogram.frameSize).toEqual(ex.spectrogram.frameSize);
+ expect(exPrime.rawAudio.sampleRateHz).toEqual(ex.rawAudio.sampleRateHz);
+ test_util.expectArraysEqual(exPrime.spectrogram.data, ex.spectrogram.data);
+ test_util.expectArraysEqual(exPrime.rawAudio.data, ex.rawAudio.data);
+ });
+
+ it('Dataset.serialize()', () => {
+ const dataset = new Dataset();
+ const ex1 = getRandomExample('foo', 10, 16);
+ const ex2 = getRandomExample('bar', 12, 16);
+ const ex3 = getRandomExample('qux', 14, 16);
+ const ex4 = getRandomExample('foo', 13, 16);
+ dataset.addExample(ex1);
+ dataset.addExample(ex2);
+ dataset.addExample(ex3);
+ dataset.addExample(ex4);
+ const buffer = dataset.serialize();
+ const {manifest, data} = arrayBuffer2SerializedExamples(buffer);
+ expect(manifest).toEqual([
+ {label: 'bar', spectrogramNumFrames: 12, spectrogramFrameSize: 16},
+ {label: 'foo', spectrogramNumFrames: 10, spectrogramFrameSize: 16},
+ {label: 'foo', spectrogramNumFrames: 13, spectrogramFrameSize: 16},
+ {label: 'qux', spectrogramNumFrames: 14, spectrogramFrameSize: 16}
+ ]);
+ expect(data.byteLength).toEqual(4 * (10 + 12 + 14 + 13) * 16);
+ });
+
+ it('Dataset.serialize(): limited singleton word labels', () => {
+ const dataset = new Dataset();
+ const ex1 = getRandomExample('foo', 10, 16);
+ const ex2 = getRandomExample('bar', 12, 16);
+ const ex3 = getRandomExample('qux', 14, 16);
+ const ex4 = getRandomExample('foo', 13, 16);
+ dataset.addExample(ex1);
+ dataset.addExample(ex2);
+ dataset.addExample(ex3);
+ dataset.addExample(ex4);
+
+ let buffer = dataset.serialize('foo');
+ let loaded = arrayBuffer2SerializedExamples(buffer);
+ expect(loaded.manifest).toEqual([
+ {label: 'foo', spectrogramNumFrames: 10, spectrogramFrameSize: 16},
+ {label: 'foo', spectrogramNumFrames: 13, spectrogramFrameSize: 16}
+ ]);
+ expect(loaded.data.byteLength).toEqual(4 * (10 + 13) * 16);
+
+ buffer = dataset.serialize('bar');
+ loaded = arrayBuffer2SerializedExamples(buffer);
+ expect(loaded.manifest).toEqual([
+ {label: 'bar', spectrogramNumFrames: 12, spectrogramFrameSize: 16}
+ ]);
+ expect(loaded.data.byteLength).toEqual(4 * 12 * 16);
+ });
+
+ it('Dataset.serialize(): limited array word label', () => {
+ const dataset = new Dataset();
+ const ex1 = getRandomExample('foo', 10, 16);
+ const ex2 = getRandomExample('bar', 12, 16);
+ const ex3 = getRandomExample('qux', 14, 16);
+ const ex4 = getRandomExample('foo', 13, 16);
+ dataset.addExample(ex1);
+ dataset.addExample(ex2);
+ dataset.addExample(ex3);
+ dataset.addExample(ex4);
+
+ const buffer = dataset.serialize(['foo', 'qux']);
+ const loaded = arrayBuffer2SerializedExamples(buffer);
+ expect(loaded.manifest).toEqual([
+ {label: 'foo', spectrogramNumFrames: 10, spectrogramFrameSize: 16},
+ {label: 'foo', spectrogramNumFrames: 13, spectrogramFrameSize: 16},
+ {label: 'qux', spectrogramNumFrames: 14, spectrogramFrameSize: 16}
+ ]);
+ expect(loaded.data.byteLength).toEqual(4 * (10 + 13 + 14) * 16);
+ });
+
+ it('Dataset.serialize(): nonexistent singleton word label errors', () => {
+ const dataset = new Dataset();
+ const ex1 = getRandomExample('foo', 10, 16);
+ const ex2 = getRandomExample('bar', 12, 16);
+ const ex3 = getRandomExample('qux', 14, 16);
+ const ex4 = getRandomExample('foo', 13, 16);
+ dataset.addExample(ex1);
+ dataset.addExample(ex2);
+ dataset.addExample(ex3);
+ dataset.addExample(ex4);
+
+ expect(() => dataset.serialize('gralk'))
+ .toThrowError(/\"gralk\" does not exist/);
+ expect(() => dataset.serialize(['gralk']))
+ .toThrowError(/\"gralk\" does not exist/);
+ expect(() => dataset.serialize([
+ 'foo', 'gralk'
+ ])).toThrowError(/\"gralk\" does not exist/);
+ });
+
+ it('Dataset serialize-deserialize round trip', () => {
+ const dataset = new Dataset();
+ const ex1 = getRandomExample('foo', 10, 16);
+ const ex2 = getRandomExample('bar', 10, 16);
+ const ex3 = getRandomExample('qux', 10, 16);
+ const ex4 = getRandomExample('foo', 10, 16);
+ dataset.addExample(ex1);
+ dataset.addExample(ex2);
+ dataset.addExample(ex3);
+ dataset.addExample(ex4);
+
+ const artifacts = dataset.serialize();
+ const datasetPrime = new Dataset(artifacts);
+
+ expect(datasetPrime.empty()).toEqual(false);
+ expect(datasetPrime.size()).toEqual(4);
+ expect(datasetPrime.getVocabulary()).toEqual(['bar', 'foo', 'qux']);
+ expect(dataset.getExampleCounts()).toEqual({'bar': 1, 'foo': 2, 'qux': 1});
+
+ expect(dataset.getExamples('bar').length).toEqual(1);
+ expect(dataset.getExamples('foo').length).toEqual(2);
+ expect(dataset.getExamples('qux').length).toEqual(1);
+
+ const ex1Prime = datasetPrime.getExamples('foo')[0].example;
+ expect(ex1Prime.label).toEqual('foo');
+ expect(ex1Prime.spectrogram.frameSize).toEqual(16);
+ test_util.expectArraysEqual(
+ ex1Prime.spectrogram.data, ex1.spectrogram.data);
+
+ const ex2Prime = datasetPrime.getExamples('bar')[0].example;
+ expect(ex2Prime.label).toEqual('bar');
+ expect(ex2Prime.spectrogram.frameSize).toEqual(16);
+ test_util.expectArraysEqual(
+ ex2Prime.spectrogram.data, ex2.spectrogram.data);
+
+ const ex3Prime = datasetPrime.getExamples('qux')[0].example;
+ expect(ex3Prime.label).toEqual('qux');
+ expect(ex3Prime.spectrogram.frameSize).toEqual(16);
+ test_util.expectArraysEqual(
+ ex3Prime.spectrogram.data, ex3.spectrogram.data);
+
+ const ex4Prime = datasetPrime.getExamples('foo')[1].example;
+ expect(ex4Prime.label).toEqual('foo');
+ expect(ex4Prime.spectrogram.frameSize).toEqual(16);
+ test_util.expectArraysEqual(
+ ex4Prime.spectrogram.data, ex4.spectrogram.data);
+
+ const {xs, ys} = datasetPrime.getData(null, {shuffle: false}) as
+ {xs: tf.Tensor, ys: tf.Tensor};
+ expect(xs.shape).toEqual([4, 10, 16, 1]);
+ expectTensorsClose(
+ ys, tf.tensor2d([[1, 0, 0], [0, 1, 0], [0, 1, 0], [0, 0, 1]]));
+ });
+
+ it('Calling serialize() on empty dataset fails', () => {
+ const dataset = new Dataset();
+ expect(() => dataset.serialize())
+ .toThrowError(/Cannot serialize empty Dataset/);
+ });
+
+ it('Deserialized dataset supports removeExample', () => {
+ const dataset = new Dataset();
+ const ex1 = getRandomExample('foo', 10, 16);
+ const ex2 = getRandomExample('bar', 10, 16);
+ const ex3 = getRandomExample('qux', 10, 16);
+ const ex4 = getRandomExample('foo', 10, 16);
+ dataset.addExample(ex1);
+ dataset.addExample(ex2);
+ dataset.addExample(ex3);
+ dataset.addExample(ex4);
+
+ const serialized = dataset.serialize();
+ const datasetPrime = new Dataset(serialized);
+
+ const examples = datasetPrime.getExamples('foo');
+ datasetPrime.removeExample(examples[0].uid);
+
+ const {xs, ys} = datasetPrime.getData(null, {shuffle: false}) as
+ {xs: tf.Tensor, ys: tf.Tensor};
+ expect(xs.shape).toEqual([3, 10, 16, 1]);
+ expectTensorsClose(ys, tf.tensor2d([[1, 0, 0], [0, 1, 0], [0, 0, 1]]));
+ });
+
+ it('Attempt to load invalid ArrayBuffer errors out', () => {
+ const invalidBuffer = string2ArrayBuffer('INVALID_[{}]0000000');
+ expect(() => new Dataset(invalidBuffer))
+ .toThrowError('Deserialization error: Invalid descriptor');
+ });
+
+ it('DATASET_SERIALIZATION_DESCRIPTOR has right length', () => {
+ expect(DATASET_SERIALIZATION_DESCRIPTOR.length).toEqual(8);
+ expect(string2ArrayBuffer(DATASET_SERIALIZATION_DESCRIPTOR).byteLength)
+ .toEqual(8);
+ });
+
+ it('Version number satisfies requirements', () => {
+ expect(typeof DATASET_SERIALIZATION_VERSION === 'number').toEqual(true);
+ expect(Number.isInteger(DATASET_SERIALIZATION_VERSION)).toEqual(true);
+ expect(DATASET_SERIALIZATION_VERSION).toBeGreaterThan(0);
+ });
+});
+
+describe('getValidWindows', () => {
+ it('Left and right sides open, odd windowLength', () => {
+ const snippetLength = 100;
+ const focusIndex = 50;
+ const windowLength = 21;
+ const windowHop = 5;
+ const windows =
+ getValidWindows(snippetLength, focusIndex, windowLength, windowHop);
+ expect(windows).toEqual([[30, 51], [35, 56], [40, 61], [45, 66], [50, 71]]);
+ });
+
+ it('Left and right sides open, even windowLength', () => {
+ const snippetLength = 100;
+ const focusIndex = 50;
+ const windowLength = 20;
+ const windowHop = 5;
+ const windows =
+ getValidWindows(snippetLength, focusIndex, windowLength, windowHop);
+ expect(windows).toEqual([[35, 55], [40, 60], [45, 65], [50, 70]]);
+ });
+
+ it('Left side truncation, right side open', () => {
+ const snippetLength = 100;
+ const focusIndex = 8;
+ const windowLength = 20;
+ const windowHop = 5;
+ const windows =
+ getValidWindows(snippetLength, focusIndex, windowLength, windowHop);
+ expect(windows).toEqual([[0, 20], [5, 25]]);
+ });
+
+ it('Left side truncation extreme, right side open', () => {
+ const snippetLength = 100;
+ const focusIndex = 0;
+ const windowLength = 21;
+ const windowHop = 5;
+ const windows =
+ getValidWindows(snippetLength, focusIndex, windowLength, windowHop);
+ expect(windows).toEqual([[0, 21]]);
+ });
+
+ it('Right side truncation, left side open', () => {
+ const snippetLength = 100;
+ const focusIndex = 95;
+ const windowLength = 20;
+ const windowHop = 5;
+ const windows =
+ getValidWindows(snippetLength, focusIndex, windowLength, windowHop);
+ expect(windows).toEqual([[80, 100]]);
+ });
+
+ it('Right side truncation extreme, left side open', () => {
+ const snippetLength = 100;
+ const focusIndex = 99;
+ const windowLength = 21;
+ const windowHop = 5;
+ const windows =
+ getValidWindows(snippetLength, focusIndex, windowLength, windowHop);
+ expect(windows).toEqual([[79, 100]]);
+ });
+
+ it('Neither side has enough room for another hop 1', () => {
+ const snippetLength = 100;
+ const focusIndex = 50;
+ const windowLength = 21;
+ const windowHop = 35;
+ const windows =
+ getValidWindows(snippetLength, focusIndex, windowLength, windowHop);
+ expect(windows).toEqual([[40, 61]]);
+ });
+
+ it('Neither side has enough room for another hop 2', () => {
+ const snippetLength = 100;
+ const focusIndex = 50;
+ const windowLength = 91;
+ const windowHop = 35;
+ const windows =
+ getValidWindows(snippetLength, focusIndex, windowLength, windowHop);
+ expect(windows).toEqual([[5, 96]]);
+ });
+
+ it('Exact match', () => {
+ const snippetLength = 10;
+ const windowLength = 10;
+ const windowHop = 2;
+
+ let focusIndex = 0;
+ expect(getValidWindows(snippetLength, focusIndex, windowLength, windowHop))
+ .toEqual([[0, 10]]);
+ focusIndex = 1;
+ expect(getValidWindows(snippetLength, focusIndex, windowLength, windowHop))
+ .toEqual([[0, 10]]);
+ focusIndex = 5;
+ expect(getValidWindows(snippetLength, focusIndex, windowLength, windowHop))
+ .toEqual([[0, 10]]);
+ focusIndex = 8;
+ expect(getValidWindows(snippetLength, focusIndex, windowLength, windowHop))
+ .toEqual([[0, 10]]);
+ focusIndex = 9;
+ expect(getValidWindows(snippetLength, focusIndex, windowLength, windowHop))
+ .toEqual([[0, 10]]);
+ });
+
+ it('Almost exact match', () => {
+ const snippetLength = 12;
+ const windowLength = 10;
+ const windowHop = 2;
+
+ let focusIndex = 0;
+ expect(getValidWindows(snippetLength, focusIndex, windowLength, windowHop))
+ .toEqual([[0, 10]]);
+ focusIndex = 1;
+ expect(getValidWindows(snippetLength, focusIndex, windowLength, windowHop))
+ .toEqual([[0, 10]]);
+ focusIndex = 5;
+ expect(getValidWindows(snippetLength, focusIndex, windowLength, windowHop))
+ .toEqual([[0, 10], [2, 12]]);
+ focusIndex = 8;
+ expect(getValidWindows(snippetLength, focusIndex, windowLength, windowHop))
+ .toEqual([[0, 10], [2, 12]]);
+ focusIndex = 9;
+ expect(getValidWindows(snippetLength, focusIndex, windowLength, windowHop))
+ .toEqual([[0, 10], [2, 12]]);
+ });
+
+ it('Non-positive integer snippetLength values lead to errors', () => {
+ const windowLength = 10;
+ const focusIndex = 5;
+ const windowHop = 2;
+ let snippetLength = 0;
+ expect(
+ () =>
+ getValidWindows(snippetLength, focusIndex, windowLength, windowHop))
+ .toThrow();
+ snippetLength = -2;
+ expect(
+ () =>
+ getValidWindows(snippetLength, focusIndex, windowLength, windowHop))
+ .toThrow();
+ snippetLength = 10.5;
+ expect(
+ () =>
+ getValidWindows(snippetLength, focusIndex, windowLength, windowHop))
+ .toThrow();
+ });
+
+ it('Non-positive integer windowLength values lead to errors', () => {
+ const snippetLength = 10;
+ const focusIndex = 5;
+ const windowHop = 2;
+ let windowLength = 0;
+ expect(
+ () =>
+ getValidWindows(snippetLength, focusIndex, windowLength, windowHop))
+ .toThrow();
+ windowLength = -2;
+ expect(
+ () =>
+ getValidWindows(snippetLength, focusIndex, windowLength, windowHop))
+ .toThrow();
+ windowLength = 3.5;
+ expect(
+ () =>
+ getValidWindows(snippetLength, focusIndex, windowLength, windowHop))
+ .toThrow();
+ });
+
+ it('Negative or non-integer focusIndex values lead to errors', () => {
+ const snippetLength = 10;
+ const windowLength = 10;
+ const windowHop = 2;
+ let focusIndex = -5;
+ expect(
+ () =>
+ getValidWindows(snippetLength, focusIndex, windowLength, windowHop))
+ .toThrow();
+ focusIndex = 1.5;
+ expect(
+ () =>
+ getValidWindows(snippetLength, focusIndex, windowLength, windowHop))
+ .toThrow();
+ });
+
+ it('Out-of-bound focusIndex leads to error', () => {
+ const snippetLength = 10;
+ const windowLength = 10;
+ const windowHop = 2;
+ let focusIndex = 10;
+ expect(
+ () =>
+ getValidWindows(snippetLength, focusIndex, windowLength, windowHop))
+ .toThrow();
+ focusIndex = 11;
+ expect(
+ () =>
+ getValidWindows(snippetLength, focusIndex, windowLength, windowHop))
+ .toThrow();
+ });
+
+ it('Out-of-bound windowLength leads to error', () => {
+ const snippetLength = 10;
+ const windowLength = 12;
+ const windowHop = 2;
+ const focusIndex = 5;
+ expect(
+ () =>
+ getValidWindows(snippetLength, focusIndex, windowLength, windowHop))
+ .toThrow();
+ });
+});
+
+describe('spectrogram2IntensityCurve', () => {
+ it('Correctness', () => {
+ const x = tf.tensor2d([[1, 2], [3, 4], [5, 6]]);
+ const spectrogram:
+ SpectrogramData = {data: x.dataSync() as Float32Array, frameSize: 2};
+ const intensityCurve = spectrogram2IntensityCurve(spectrogram);
+ expectTensorsClose(intensityCurve, tf.tensor1d([1.5, 3.5, 5.5]));
+ });
+});
+
+describe('getMaxIntensityFrameIndex', () => {
+ it('Multiple frames', () => {
+ const x = tf.tensor2d([[1, 2], [11, 12], [3, 4], [51, 52], [5, 6]]);
+ const spectrogram:
+ SpectrogramData = {data: x.dataSync() as Float32Array, frameSize: 2};
+ const maxIntensityFrameIndex = getMaxIntensityFrameIndex(spectrogram);
+ expectTensorsClose(maxIntensityFrameIndex, tf.scalar(3, 'int32'));
+ });
+
+ it('Only one frames', () => {
+ const x = tf.tensor2d([[11, 12]]);
+ const spectrogram:
+ SpectrogramData = {data: x.dataSync() as Float32Array, frameSize: 2};
+ const maxIntensityFrameIndex = getMaxIntensityFrameIndex(spectrogram);
+ expectTensorsClose(maxIntensityFrameIndex, tf.scalar(0, 'int32'));
+ });
+
+ it('No focus frame: return multiple windows', () => {
+ const snippetLength = 100;
+ const windowLength = 40;
+ const windowHop = 20;
+ const windows =
+ getValidWindows(snippetLength, null, windowLength, windowHop);
+ expect(windows).toEqual([[0, 40], [20, 60], [40, 80], [60, 100]]);
+ });
+
+ it('No focus frame: return one window', () => {
+ const snippetLength = 10;
+ const windowLength = 10;
+ const windowHop = 2;
+ const windows =
+ getValidWindows(snippetLength, null, windowLength, windowHop);
+ expect(windows).toEqual([[0, 10]]);
+ });
+});
diff --git a/音频分类/speech-commands/src/generic_utils.ts b/音频分类/speech-commands/src/generic_utils.ts
new file mode 100644
index 0000000..e968fb9
--- /dev/null
+++ b/音频分类/speech-commands/src/generic_utils.ts
@@ -0,0 +1,92 @@
+/**
+ * @license
+ * Copyright 2019 Google LLC. All Rights Reserved.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =============================================================================
+ */
+
+/**
+ * Concatenate a number of ArrayBuffers into one.
+ *
+ * @param buffers A number of array buffers to concatenate.
+ * @returns Result of concatenating `buffers` in order.
+ */
+export function concatenateArrayBuffers(buffers: ArrayBuffer[]): ArrayBuffer {
+ let totalByteLength = 0;
+ buffers.forEach((buffer: ArrayBuffer) => {
+ totalByteLength += buffer.byteLength;
+ });
+
+ const temp = new Uint8Array(totalByteLength);
+ let offset = 0;
+ buffers.forEach((buffer: ArrayBuffer) => {
+ temp.set(new Uint8Array(buffer), offset);
+ offset += buffer.byteLength;
+ });
+ return temp.buffer;
+}
+
+/**
+ * Concatenate Float32Arrays.
+ *
+ * @param xs Float32Arrays to concatenate.
+ * @return The result of the concatenation.
+ */
+export function concatenateFloat32Arrays(xs: Float32Array[]): Float32Array {
+ let totalLength = 0;
+ xs.forEach(x => totalLength += x.length);
+ const concatenated = new Float32Array(totalLength);
+ let index = 0;
+ xs.forEach(x => {
+ concatenated.set(x, index);
+ index += x.length;
+ });
+ return concatenated;
+}
+
+/** Encode a string as an ArrayBuffer. */
+export function string2ArrayBuffer(str: string): ArrayBuffer {
+ if (str == null) {
+ throw new Error('Received null or undefind string');
+ }
+ // NOTE(cais): This implementation is inefficient in terms of memory.
+ // But it works for UTF-8 strings. Just don't use on for very long strings.
+ const strUTF8 = unescape(encodeURIComponent(str));
+ const buf = new Uint8Array(strUTF8.length);
+ for (let i = 0; i < strUTF8.length; ++i) {
+ buf[i] = strUTF8.charCodeAt(i);
+ }
+ return buf.buffer;
+}
+
+/** Decode an ArrayBuffer as a string. */
+export function arrayBuffer2String(buffer: ArrayBuffer): string {
+ if (buffer == null) {
+ throw new Error('Received null or undefind buffer');
+ }
+ const buf = new Uint8Array(buffer);
+ return decodeURIComponent(escape(String.fromCharCode(...buf)));
+}
+
+/** Generate a pseudo-random UID. */
+export function getUID(): string {
+ function s4() {
+ return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);
+ }
+ return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() +
+ s4() + s4();
+}
+
+export function getRandomInteger(min: number, max: number): number {
+ return Math.floor((max - min) * Math.random()) + min;
+}
diff --git a/音频分类/speech-commands/src/generic_utils_test.ts b/音频分类/speech-commands/src/generic_utils_test.ts
new file mode 100644
index 0000000..5d441a1
--- /dev/null
+++ b/音频分类/speech-commands/src/generic_utils_test.ts
@@ -0,0 +1,81 @@
+
+/**
+ * @license
+ * Copyright 2019 Google LLC. All Rights Reserved.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =============================================================================
+ */
+// tslint:disable-next-line: no-imports-from-dist
+import {expectArraysEqual} from '@tensorflow/tfjs-core/dist/test_util';
+
+import {arrayBuffer2String, concatenateFloat32Arrays, string2ArrayBuffer} from './generic_utils';
+
+describe('string2ArrayBuffer and arrayBuffer2String', () => {
+ it('round trip: ASCII only', () => {
+ const str = 'Lorem_Ipsum_123 !@#$%^&*()';
+ expect(arrayBuffer2String(string2ArrayBuffer(str))).toEqual(str);
+ });
+ it('round trip: non-ASCII', () => {
+ const str = 'Welcome 欢迎 स्वागत हे ようこそ добро пожаловать 😀😀';
+ expect(arrayBuffer2String(string2ArrayBuffer(str))).toEqual(str);
+ });
+ it('round trip: empty string', () => {
+ const str = '';
+ expect(arrayBuffer2String(string2ArrayBuffer(str))).toEqual(str);
+ });
+});
+
+describe('concatenateFloat32Arrays', () => {
+ it('Two non-empty', () => {
+ const xs = new Float32Array([1, 3]);
+ const ys = new Float32Array([3, 7]);
+ expectArraysEqual(
+ concatenateFloat32Arrays([xs, ys]), new Float32Array([1, 3, 3, 7]));
+ expectArraysEqual(
+ concatenateFloat32Arrays([ys, xs]), new Float32Array([3, 7, 1, 3]));
+ // Assert that the original Float32Arrays are not altered.
+ expectArraysEqual(xs, new Float32Array([1, 3]));
+ expectArraysEqual(ys, new Float32Array([3, 7]));
+ });
+
+ it('Three unequal lengths non-empty', () => {
+ const array1 = new Float32Array([1]);
+ const array2 = new Float32Array([2, 3]);
+ const array3 = new Float32Array([4, 5, 6]);
+ expectArraysEqual(
+ concatenateFloat32Arrays([array1, array2, array3]),
+ new Float32Array([1, 2, 3, 4, 5, 6]));
+ });
+
+ it('One empty, one non-empty', () => {
+ const xs = new Float32Array([4, 2]);
+ const ys = new Float32Array(0);
+ expectArraysEqual(
+ concatenateFloat32Arrays([xs, ys]), new Float32Array([4, 2]));
+ expectArraysEqual(
+ concatenateFloat32Arrays([ys, xs]), new Float32Array([4, 2]));
+ // Assert that the original Float32Arrays are not altered.
+ expectArraysEqual(xs, new Float32Array([4, 2]));
+ expectArraysEqual(ys, new Float32Array(0));
+ });
+
+ it('Two empty', () => {
+ const xs = new Float32Array(0);
+ const ys = new Float32Array(0);
+ expectArraysEqual(concatenateFloat32Arrays([xs, ys]), new Float32Array(0));
+ expectArraysEqual(concatenateFloat32Arrays([ys, xs]), new Float32Array(0));
+ // Assert that the original Float32Arrays are not altered.
+ expectArraysEqual(xs, new Float32Array(0));
+ expectArraysEqual(ys, new Float32Array(0));
+ });
+});
diff --git a/音频分类/speech-commands/src/index.ts b/音频分类/speech-commands/src/index.ts
new file mode 100644
index 0000000..c0aee57
--- /dev/null
+++ b/音频分类/speech-commands/src/index.ts
@@ -0,0 +1,91 @@
+/**
+ * @license
+ * Copyright 2019 Google LLC. All Rights Reserved.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =============================================================================
+ */
+
+import * as tf from '@tensorflow/tfjs-core';
+
+import {BrowserFftSpeechCommandRecognizer} from './browser_fft_recognizer';
+import {playRawAudio} from './browser_fft_utils';
+import {concatenateFloat32Arrays} from './generic_utils';
+import {FFT_TYPE, SpeechCommandRecognizer, SpeechCommandRecognizerMetadata} from './types';
+import { normalizeFloat32Array, normalize } from './browser_fft_utils';
+
+/**
+ * Create an instance of speech-command recognizer.
+ *
+ * @param fftType Type of FFT. The currently availble option(s):
+ * - BROWSER_FFT: Obtains audio spectrograms using browser's native Fourier
+ * transform.
+ * @param vocabulary The vocabulary of the model to load. Possible options:
+ * - '18w' (default): The 18-word vocaulbary, consisting of:
+ * 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven',
+ * 'eight', 'nine', 'up', 'down', 'left', 'right', 'go', 'stop',
+ * 'yes', and 'no', in addition to '_background_noise_' and '_unknown_'.
+ * - 'directional4w': The four directional words: 'up', 'down', 'left', and
+ * 'right', in addition to '_background_noise_' and '_unknown_'.
+ * Choosing a smaller vocabulary leads to better accuracy on the words of
+ * interest and a slightly smaller model size.
+ * @param customModelArtifactsOrURL A custom model URL pointing to a model.json
+ * file, or a set of modelArtifacts in `tf.io.ModelArtifacts` format.
+ * Supported schemes: http://, https://, and node.js-only: file://.
+ * Mutually exclusive with `vocabulary`. If provided, `customMetadatURL`
+ * most also be provided.
+ * @param customMetadataOrURL A custom metadata URL pointing to a metadata.json
+ * file. Must be provided together with `customModelURL`, or a metadata
+ * object.
+ * @returns An instance of SpeechCommandRecognizer.
+ * @throws Error on invalid value of `fftType`.
+ */
+export function create(
+ fftType: FFT_TYPE, vocabulary?: string,
+ customModelArtifactsOrURL?: tf.io.ModelArtifacts|string,
+ customMetadataOrURL?: SpeechCommandRecognizerMetadata|
+ string): SpeechCommandRecognizer {
+ tf.util.assert(
+ customModelArtifactsOrURL == null && customMetadataOrURL == null ||
+ customModelArtifactsOrURL != null && customMetadataOrURL != null,
+ () => `customModelURL and customMetadataURL must be both provided or ` +
+ `both not provided.`);
+ if (customModelArtifactsOrURL != null) {
+ tf.util.assert(
+ vocabulary == null,
+ () => `vocabulary name must be null or undefined when modelURL ` +
+ `is provided.`);
+ }
+
+ if (fftType === 'BROWSER_FFT') {
+ return new BrowserFftSpeechCommandRecognizer(
+ vocabulary, customModelArtifactsOrURL, customMetadataOrURL);
+ } else if (fftType === 'SOFT_FFT') {
+ throw new Error(
+ 'SOFT_FFT SpeechCommandRecognizer has not been implemented yet.');
+ } else {
+ throw new Error(`Invalid fftType: '${fftType}'`);
+ }
+}
+
+const utils = {
+ concatenateFloat32Arrays,
+ normalizeFloat32Array,
+ normalize,
+ playRawAudio
+};
+
+export {BACKGROUND_NOISE_TAG, Dataset, GetDataConfig as GetSpectrogramsAsTensorsConfig, getMaxIntensityFrameIndex, spectrogram2IntensityCurve, SpectrogramAndTargetsTfDataset} from './dataset';
+export {AudioDataAugmentationOptions, Example, FFT_TYPE, RawAudioData, RecognizerParams, SpectrogramData, SpeechCommandRecognizer, SpeechCommandRecognizerMetadata, SpeechCommandRecognizerResult, StreamingRecognitionConfig, TransferLearnConfig, TransferSpeechCommandRecognizer} from './types';
+export {deleteSavedTransferModel, listSavedTransferModels, UNKNOWN_TAG} from './browser_fft_recognizer';
+export {utils};
+export {version} from './version';
diff --git a/音频分类/speech-commands/src/index_test.ts b/音频分类/speech-commands/src/index_test.ts
new file mode 100644
index 0000000..607da2c
--- /dev/null
+++ b/音频分类/speech-commands/src/index_test.ts
@@ -0,0 +1,69 @@
+/**
+ * @license
+ * Copyright 2019 Google LLC. All Rights Reserved.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =============================================================================
+ */
+
+// tslint:disable-next-line:no-require-imports
+const packageJSON = require('../package.json');
+import * as tf from '@tensorflow/tfjs-core';
+import * as tfl from '@tensorflow/tfjs-layers';
+import * as speechCommands from './index';
+
+describe('Public API', () => {
+ it('version matches package.json', () => {
+ expect(typeof speechCommands.version).toEqual('string');
+ expect(speechCommands.version).toEqual(packageJSON.version);
+ });
+});
+
+describe('Creating recognizer', () => {
+ async function makeModelArtifacts(): Promise {
+ const model = tfl.sequential();
+ model.add(tfl.layers.conv2d({
+ filters: 8,
+ kernelSize: 3,
+ activation: 'relu',
+ inputShape: [86, 500, 1]
+ }));
+ model.add(tfl.layers.flatten());
+ model.add(tfl.layers.dense({units: 3, activation: 'softmax'}));
+ let modelArtifacts: tf.io.ModelArtifacts;
+ await model.save(tf.io.withSaveHandler(artifacts => {
+ modelArtifacts = artifacts;
+ return null;
+ }));
+ return modelArtifacts;
+ }
+
+ function makeMetadata(): speechCommands.SpeechCommandRecognizerMetadata {
+ return {
+ wordLabels: [speechCommands.BACKGROUND_NOISE_TAG, 'foo', 'bar'],
+ tfjsSpeechCommandsVersion: speechCommands.version
+ };
+ }
+
+ it('Create recognizer from aritfacts and metadata objects', async () => {
+ const modelArtifacts = await makeModelArtifacts();
+ const metadata = makeMetadata();
+ const recognizer =
+ speechCommands.create('BROWSER_FFT', null, modelArtifacts, metadata);
+ await recognizer.ensureModelLoaded();
+
+ expect(recognizer.wordLabels()).toEqual([
+ speechCommands.BACKGROUND_NOISE_TAG, 'foo', 'bar'
+ ]);
+ expect(recognizer.modelInputShape()).toEqual([null, 86, 500, 1]);
+ });
+});
diff --git a/音频分类/speech-commands/src/test_utils.ts b/音频分类/speech-commands/src/test_utils.ts
new file mode 100644
index 0000000..43d4076
--- /dev/null
+++ b/音频分类/speech-commands/src/test_utils.ts
@@ -0,0 +1,46 @@
+/**
+ * @license
+ * Copyright 2019 Google Inc. All Rights Reserved.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =============================================================================
+ */
+
+import {Tensor, test_util, util} from '@tensorflow/tfjs-core';
+
+export function expectTensorsClose(
+ actual: Tensor|number[], expected: Tensor|number[], epsilon?: number) {
+ if (actual == null) {
+ throw new Error(
+ 'First argument to expectTensorsClose() is not defined.');
+ }
+ if (expected == null) {
+ throw new Error(
+ 'Second argument to expectTensorsClose() is not defined.');
+ }
+ if (actual instanceof Tensor && expected instanceof Tensor) {
+ if (actual.dtype !== expected.dtype) {
+ throw new Error(
+ `Data types do not match. Actual: '${actual.dtype}'. ` +
+ `Expected: '${expected.dtype}'`);
+ }
+ if (!util.arraysEqual(actual.shape, expected.shape)) {
+ throw new Error(
+ `Shapes do not match. Actual: [${actual.shape}]. ` +
+ `Expected: [${expected.shape}].`);
+ }
+ }
+ const actualData = actual instanceof Tensor ? actual.dataSync() : actual;
+ const expectedData =
+ expected instanceof Tensor ? expected.dataSync() : expected;
+ test_util.expectArraysClose(actualData, expectedData, epsilon);
+}
diff --git a/音频分类/speech-commands/src/training_utils.ts b/音频分类/speech-commands/src/training_utils.ts
new file mode 100644
index 0000000..913dccc
--- /dev/null
+++ b/音频分类/speech-commands/src/training_utils.ts
@@ -0,0 +1,164 @@
+/**
+ * @license
+ * Copyright 2019 Google LLC. All Rights Reserved.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =============================================================================
+ */
+
+/**
+ * Utility functions for training and transfer learning of the speech-commands
+ * model.
+ */
+
+import * as tf from '@tensorflow/tfjs-core';
+
+/**
+ * Split feature and target tensors into train and validation (val) splits.
+ *
+ * Given sufficent number of examples, the train and val sets will be
+ * balanced with respect to the classes.
+ *
+ * @param xs Features tensor, of shape [numExamples, ...].
+ * @param ys Targets tensors, of shape [numExamples, numClasses]. Assumed to be
+ * one-hot categorical encoding.
+ * @param valSplit A number > 0 and < 1, fraction of examples to use
+ * as the validation set.
+ * @returns trainXs: training features tensor; trainYs: training targets
+ * tensor; valXs: validation features tensor; valYs: validation targets
+ * tensor.
+ */
+export function balancedTrainValSplit(
+ xs: tf.Tensor, ys: tf.Tensor, valSplit: number): {
+ trainXs: tf.Tensor,
+ trainYs: tf.Tensor,
+ valXs: tf.Tensor,
+ valYs: tf.Tensor
+} {
+ tf.util.assert(
+ valSplit > 0 && valSplit < 1,
+ () => `validationSplit is expected to be >0 and <1, ` +
+ `but got ${valSplit}`);
+
+ return tf.tidy(() => {
+ const classIndices = tf.argMax(ys, -1).dataSync();
+
+ const indicesByClasses: number[][] = [];
+ for (let i = 0; i < classIndices.length; ++i) {
+ const classIndex = classIndices[i];
+ if (indicesByClasses[classIndex] == null) {
+ indicesByClasses[classIndex] = [];
+ }
+ indicesByClasses[classIndex].push(i);
+ }
+ const numClasses = indicesByClasses.length;
+
+ const trainIndices: number[] = [];
+ const valIndices: number[] = [];
+
+ // Randomly shuffle the list of indices in each array.
+ indicesByClasses.map(classIndices => tf.util.shuffle(classIndices));
+ for (let i = 0; i < numClasses; ++i) {
+ const classIndices = indicesByClasses[i];
+ const cutoff = Math.round(classIndices.length * (1 - valSplit));
+ for (let j = 0; j < classIndices.length; ++j) {
+ if (j < cutoff) {
+ trainIndices.push(classIndices[j]);
+ } else {
+ valIndices.push(classIndices[j]);
+ }
+ }
+ }
+
+ const trainXs = tf.gather(xs, trainIndices);
+ const trainYs = tf.gather(ys, trainIndices);
+ const valXs = tf.gather(xs, valIndices);
+ const valYs = tf.gather(ys, valIndices);
+ return {trainXs, trainYs, valXs, valYs};
+ });
+}
+
+/**
+ * Same as balancedTrainValSplit, but for number arrays or Float32Arrays.
+ */
+export function balancedTrainValSplitNumArrays(
+ xs: number[][]|Float32Array[], ys: number[], valSplit: number): {
+ trainXs: number[][]|Float32Array[],
+ trainYs: number[],
+ valXs: number[][]|Float32Array[],
+ valYs: number[]
+} {
+ tf.util.assert(
+ valSplit > 0 && valSplit < 1,
+ () => `validationSplit is expected to be >0 and <1, ` +
+ `but got ${valSplit}`);
+ const isXsFloat32Array = !Array.isArray(xs[0]);
+
+ const classIndices = ys;
+
+ const indicesByClasses: number[][] = [];
+ for (let i = 0; i < classIndices.length; ++i) {
+ const classIndex = classIndices[i];
+ if (indicesByClasses[classIndex] == null) {
+ indicesByClasses[classIndex] = [];
+ }
+ indicesByClasses[classIndex].push(i);
+ }
+ const numClasses = indicesByClasses.length;
+
+ const trainIndices: number[] = [];
+ const valIndices: number[] = [];
+
+ // Randomly shuffle the list of indices in each array.
+ indicesByClasses.map(classIndices => tf.util.shuffle(classIndices));
+ for (let i = 0; i < numClasses; ++i) {
+ const classIndices = indicesByClasses[i];
+ const cutoff = Math.round(classIndices.length * (1 - valSplit));
+ for (let j = 0; j < classIndices.length; ++j) {
+ if (j < cutoff) {
+ trainIndices.push(classIndices[j]);
+ } else {
+ valIndices.push(classIndices[j]);
+ }
+ }
+ }
+
+ if (isXsFloat32Array) {
+ const trainXs: Float32Array[] = [];
+ const trainYs: number[] = [];
+ const valXs: Float32Array[] = [];
+ const valYs: number[] = [];
+ for (const index of trainIndices) {
+ trainXs.push(xs[index] as Float32Array);
+ trainYs.push(ys[index]);
+ }
+ for (const index of valIndices) {
+ valXs.push(xs[index] as Float32Array);
+ valYs.push(ys[index]);
+ }
+ return {trainXs, trainYs, valXs, valYs};
+ } else {
+ const trainXs: number[][] = [];
+ const trainYs: number[] = [];
+ const valXs: number[][] = [];
+ const valYs: number[] = [];
+ for (const index of trainIndices) {
+ trainXs.push(xs[index] as number[]);
+ trainYs.push(ys[index]);
+ }
+ for (const index of valIndices) {
+ valXs.push(xs[index] as number[]);
+ valYs.push(ys[index]);
+ }
+ return {trainXs, trainYs, valXs, valYs};
+ }
+}
diff --git a/音频分类/speech-commands/src/training_utils_test.ts b/音频分类/speech-commands/src/training_utils_test.ts
new file mode 100644
index 0000000..bfdd064
--- /dev/null
+++ b/音频分类/speech-commands/src/training_utils_test.ts
@@ -0,0 +1,60 @@
+/**
+ * @license
+ * Copyright 2019 Google LLC. All Rights Reserved.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =============================================================================
+ */
+
+import '@tensorflow/tfjs-node';
+
+import * as tf from '@tensorflow/tfjs-core';
+// tslint:disable-next-line: no-imports-from-dist
+import {describeWithFlags, NODE_ENVS} from '@tensorflow/tfjs-core/dist/jasmine_util';
+
+import {expectTensorsClose} from './test_utils';
+import {balancedTrainValSplit} from './training_utils';
+
+describeWithFlags('balancedTrainValSplit', NODE_ENVS, () => {
+ it('Enough data for split', () => {
+ const xs = tf.randomNormal([8, 3]);
+ const ys = tf.oneHot(tf.tensor1d([0, 0, 0, 0, 1, 1, 1, 1], 'int32'), 2);
+ const {trainXs, trainYs, valXs, valYs} =
+ balancedTrainValSplit(xs, ys, 0.25);
+ expect(trainXs.shape).toEqual([6, 3]);
+ expect(trainYs.shape).toEqual([6, 2]);
+ expect(valXs.shape).toEqual([2, 3]);
+ expect(valYs.shape).toEqual([2, 2]);
+ expectTensorsClose(tf.sum(trainYs, 0), tf.tensor1d([3, 3], 'int32'));
+ expectTensorsClose(tf.sum(valYs, 0), tf.tensor1d([1, 1], 'int32'));
+ });
+
+ it('Not enough data for split', () => {
+ const xs = tf.randomNormal([8, 3]);
+ const ys = tf.oneHot(tf.tensor1d([0, 0, 0, 0, 1, 1, 1, 1], 'int32'), 2);
+ const {trainXs, trainYs, valXs, valYs} =
+ balancedTrainValSplit(xs, ys, 0.01);
+ expect(trainXs.shape).toEqual([8, 3]);
+ expect(trainYs.shape).toEqual([8, 2]);
+ expect(valXs.shape).toEqual([0, 3]);
+ expect(valYs.shape).toEqual([0, 2]);
+ });
+
+ it('Invalid valSplit leads to Error', () => {
+ const xs = tf.randomNormal([8, 3]);
+ const ys = tf.oneHot(tf.tensor1d([0, 0, 0, 0, 1, 1, 1, 1], 'int32'), 2);
+ expect(() => balancedTrainValSplit(xs, ys, -0.2)).toThrow();
+ expect(() => balancedTrainValSplit(xs, ys, 0)).toThrow();
+ expect(() => balancedTrainValSplit(xs, ys, 1)).toThrow();
+ expect(() => balancedTrainValSplit(xs, ys, 1.2)).toThrow();
+ });
+});
diff --git a/音频分类/speech-commands/src/types.ts b/音频分类/speech-commands/src/types.ts
new file mode 100644
index 0000000..3077451
--- /dev/null
+++ b/音频分类/speech-commands/src/types.ts
@@ -0,0 +1,754 @@
+/**
+ * @license
+ * Copyright 2019 Google LLC. All Rights Reserved.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =============================================================================
+ */
+
+import * as tf from '@tensorflow/tfjs-core';
+import * as tfl from '@tensorflow/tfjs-layers';
+
+/**
+ * This file defines the interfaces related to SpeechCommandRecognizer.
+ */
+
+export type FFT_TYPE = 'BROWSER_FFT'|'SOFT_FFT';
+
+export type RecognizerCallback = (result: SpeechCommandRecognizerResult) =>
+ Promise;
+
+/**
+ * Interface for a speech-command recognizer.
+ */
+export interface SpeechCommandRecognizer {
+ /**
+ * Load the underlying model instance and associated metadata.
+ *
+ * If the model and the metadata are already loaded, do nothing.
+ */
+ ensureModelLoaded(): Promise;
+
+ /**
+ * Start listening continuously to microphone input and perform recognition
+ * in a streaming fashion.
+ *
+ * @param callback the callback that will be invoked every time
+ * a recognition result is available.
+ * @param config optional configuration.
+ * @throws Error if there is already ongoing streaming recognition.
+ */
+ listen(callback: RecognizerCallback, config?: StreamingRecognitionConfig):
+ Promise;
+
+ /**
+ * Stop the ongoing streaming recognition (if any).
+ *
+ * @throws Error if no streaming recognition is ongoing.
+ */
+ stopListening(): Promise;
+
+ /**
+ * Check if this instance is currently performing
+ * streaming recognition.
+ */
+ isListening(): boolean;
+
+ /**
+ * Recognize a single example of audio.
+ *
+ * If `input` is provided, will perform offline prediction.
+ * If `input` is not provided, a single frame of audio
+ * will be collected from the microhpone via WebAudio and predictions
+ * will be made on it.
+ *
+ * @param input (Optional) tf.Tensor of Float32Array.
+ * If provided and a tf.Tensor, must match the input shape of the
+ * underlying tf.Model. If a Float32Array, the length must be
+ * equal to (the model’s required FFT length) *
+ * (the model’s required frame count).
+ * @returns A Promise of recognition result, with the following fields:
+ * - scores: the probability scores.
+ * - embedding: the embedding for the input audio (i.e., an internal
+ * activation from the model). Provided if and only if `includeEmbedding`
+ * is `true` in `config`.
+ * @throws Error on incorrect shape or length.
+ */
+ recognize(input?: tf.Tensor|Float32Array, config?: RecognizeConfig):
+ Promise;
+
+ /**
+ * Get the input shape of the tf.Model the underlies the recognizer.
+ */
+ modelInputShape(): tfl.Shape;
+
+ /**
+ * Getter for word labels.
+ *
+ * The word labels are an alphabetically sorted Array of strings.
+ */
+ wordLabels(): string[];
+
+ /**
+ * Get the parameters such as the required number of frames.
+ */
+ params(): RecognizerParams;
+
+ /**
+ * Create a new recognizer based on this recognizer, for transfer learning.
+ *
+ * @param name Required name of the transfer learning recognizer. Must be a
+ * non-empty string.
+ * @returns An instance of TransferSpeechCommandRecognizer, which supports
+ * `collectExample()`, `train()`, as well as the same `listen()`
+ * `stopListening()` and `recognize()` as the base recognizer.
+ */
+ createTransfer(name: string): TransferSpeechCommandRecognizer;
+}
+
+export interface ExampleCollectionOptions {
+ /**
+ * Multiplier for the duration.
+ *
+ * This is the ratio between the duration of the to-be-collected
+ * example and the duration of each input example accepted by the
+ * underlying convnet.
+ *
+ * If not provided, will default to 1.
+ *
+ * Must be a number >=1.
+ */
+ durationMultiplier?: number;
+
+ /**
+ * Duration in seconds.
+ *
+ * Mutually exclusive with durationMultiplier.
+ * If specified, must be >0.
+ */
+ durationSec?: number;
+
+ /**
+ * Optional constraints for the audio track.
+ *
+ * E.g., this can be used to select a microphone when multiple microphones
+ * are available on the system: `{deviceId: 'deadbeef'}`.
+ */
+ audioTrackConstraints?: MediaTrackConstraints;
+
+ /**
+ * Optional snipppet duration in seconds.
+ *
+ * Must be supplied if `onSnippet` is specified.
+ */
+ snippetDurationSec?: number;
+
+ /**
+ * Optional snippet callback.
+ *
+ * Must be provided if `snippetDurationSec` is specified.
+ *
+ * Gets called every snippetDurationSec with a latest slice of the
+ * spectrogram. It is the spectrogram accumulated since the last invocation of
+ * the callback (or for the first time, since when `collectExample()` is
+ * started).
+ */
+ onSnippet?: (spectrogram: SpectrogramData) => Promise;
+
+ /**
+ * Whether to collect the raw time-domain audio waveform in addition to the
+ * spectrogram.
+ *
+ * Default: `false`.
+ */
+ includeRawAudio?: boolean;
+}
+
+/**
+ * Metadata for a speech-comamnds recognizer.
+ */
+export interface SpeechCommandRecognizerMetadata {
+ /** Version of the speech-commands library. */
+ tfjsSpeechCommandsVersion: string;
+
+ /** Name of the model. */
+ modelName?: string;
+
+ /** A time stamp for when this metadata is generatd. */
+ timeStamp?: string;
+
+ /**
+ * Word labels for the recognizer model's output probability scores.
+ *
+ * The length of this array should be equal to the size of the last dimension
+ * of the model's output.
+ */
+ wordLabels: string[];
+}
+
+/**
+ * Interface for a transfer-learning speech command recognizer.
+ *
+ * This inherits the `SpeechCommandRecognizer`. It adds methods for
+ * collecting and clearing examples for transfer learning, methods for
+ * querying the status of example collection, and for performing the
+ * transfer-learning training.
+ */
+export interface TransferSpeechCommandRecognizer extends
+ SpeechCommandRecognizer {
+ /**
+ * Collect an example for transfer learning via WebAudio.
+ *
+ * @param {string} word Name of the word. Must not overlap with any of the
+ * words the base model is trained to recognize.
+ * @returns {SpectrogramData} The spectrogram of the acquired the example.
+ * @throws Error, if word belongs to the set of words the base model is
+ * trained to recognize.
+ */
+ collectExample(word: string, options?: ExampleCollectionOptions):
+ Promise;
+
+ /**
+ * Clear all transfer learning examples collected so far.
+ */
+ clearExamples(): void;
+
+ /**
+ * Get counts of the word examples that have been collected for a
+ * transfer-learning model.
+ *
+ * @returns {{[word: string]: number}} A map from word name to number of
+ * examples collected for that word so far.
+ */
+ countExamples(): {[word: string]: number};
+
+ /**
+ * Train a transfer-learning model.
+ *
+ * The last dense layer of the base model is replaced with new softmax dense
+ * layer.
+ *
+ * It is assume that at least one category of data has been collected (using
+ * multiple calls to the `collectTransferExample` method).
+ *
+ * @param config {TransferLearnConfig} Optional configurations fot the
+ * training of the transfer-learning model.
+ * @returns {tf.History} A history object with the loss and accuracy values
+ * from the training of the transfer-learning model.
+ * @throws Error, if `modelName` is invalid or if not sufficient training
+ * examples have been collected yet.
+ */
+ train(config?: TransferLearnConfig):
+ Promise;
+
+ /**
+ * Perform evaluation of the model using the examples that the model
+ * has loaded.
+ *
+ * The evaluation calcuates an ROC curve by lumping the non-background-noise
+ * classes into a positive category and treating the background-noise
+ * class as the negative category.
+ *
+ * @param config Configuration object for the evaluation.
+ * @returns A Promise of the result of evaluation.
+ */
+ evaluate(config: EvaluateConfig): Promise;
+
+ /**
+ * Get examples currently held by the transfer-learning recognizer.
+ *
+ * @param label Label requested.
+ * @returns An array of `Example`s, along with their UIDs.
+ */
+ getExamples(label: string): Array<{uid: string, example: Example}>;
+
+ /** Set the key frame index of a given example. */
+ setExampleKeyFrameIndex(uid: string, keyFrameIndex: number): void;
+
+ /**
+ * Load an array of serialized examples.
+ *
+ * @param serialized The examples in their serialized format.
+ * @param clearExisting Whether to clear the existing examples while
+ * performing the loading (default: false).
+ */
+ loadExamples(serialized: ArrayBuffer, clearExisting?: boolean): void;
+
+ /**
+ * Serialize the existing examples.
+ *
+ * @param wordLabels Optional word label(s) to serialize. If specified, only
+ * the examples with labels matching the argument will be serialized. If
+ * any specified word label does not exist in the vocabulary of this
+ * transfer recognizer, an Error will be thrown.
+ * @returns An `ArrayBuffer` object amenable to transmission and storage.
+ */
+ serializeExamples(wordLabels?: string|string[]): ArrayBuffer;
+
+ /**
+ * Remove an example from the dataset of the transfer recognizer.
+ *
+ * @param uid The UID for the example to be removed.
+ */
+ removeExample(uid: string): void;
+
+ /**
+ * Check whether the dataset underlying this transfer recognizer is empty.
+ *
+ * @returns A boolean indicating whether the underlying dataset is empty.
+ */
+ isDatasetEmpty(): boolean;
+
+ /**
+ * Save the transfer-learned model.
+ *
+ * By default, the model's topology and weights are saved to browser
+ * IndexedDB, and the associated metadata are saved to browser LocalStorage.
+ *
+ * The saved metadata includes (among other things) the word list.
+ *
+ * To save the model to another destination, use the optional argument
+ * `handlerOrURL`. Note that if you use the custom route, you'll
+ * currently have to handle the metadata (e.g., word list) saving yourself.
+ *
+ * @param handlerOrURL Optional custom save URL or IOHandler object. E.g.,
+ * `'downloads://my-file-name'`.
+ * @returns A `Promise` of a `SaveResult` object that summarizes the
+ * saving result.
+ */
+ save(handlerOrURL?: string|tf.io.IOHandler): Promise;
+
+ /**
+ * Load the transfer-learned model.
+ *
+ * By default, the model's topology and weights are loaded from browser
+ * IndexedDB and the associated metadata are loaded from browser
+ * LocalStorage.
+ *
+ * To load the model from another destination, use the optional
+ * argument. Note that if you load the model from a custom URL or
+ * IOHandler, you'll currently have to load the metadata (e.g., word
+ * list) yourself.
+ *
+ * @param handlerOrURL Optional custom source URL or IOHandler object
+ * to load the data from. E.g.,
+ * `tf.io.browserFiles([modelJSONFile, weightsFile])`
+ */
+ load(handlerOrURL?: string|tf.io.IOHandler): Promise;
+
+ /**
+ * Get metadata about the transfer recognizer.
+ *
+ * The metadata includes but is not limited to: speech-commands library
+ * version, word labels that correspond to the model's probability outputs.
+ */
+ getMetadata(): SpeechCommandRecognizerMetadata;
+}
+
+/**
+ * Interface for a snippet of audio spectrogram.
+ */
+export interface SpectrogramData {
+ /**
+ * The float32 data for the spectrogram.
+ *
+ * Stored frame by frame. For example, the first N elements
+ * belong to the first time frame and the next N elements belong
+ * to the second time frame, and so forth.
+ */
+ data: Float32Array;
+
+ /**
+ * Number of points per frame, i.e., FFT length per frame.
+ */
+ frameSize: number;
+
+ /**
+ * Duration of each frame in milliseconds.
+ */
+ frameDurationMillis?: number;
+
+ /**
+ * Index to the key frame (0-based).
+ *
+ * A key frame is a frame in the spectrogram that belongs to
+ * the utterance of interest. It is used to distinguish the
+ * utterance part from the background-noise part.
+ *
+ * A typical use of key frame index: when multiple training examples are
+ * extracted from a spectroram, every example is guaranteed to include
+ * the key frame.
+ *
+ * Key frame is not required. If it is missing, heuristics algorithms
+ * (e.g., finding the highest-intensity frame) can be used to calculate
+ * the key frame.
+ */
+ keyFrameIndex?: number;
+}
+
+/**
+ * Interface for a result emitted by a speech-command recognizer.
+ *
+ * It is used in the callback of a recognizer's streaming or offline
+ * recognition method. It represents the result for a short snippet of
+ * audio.
+ */
+export interface SpeechCommandRecognizerResult {
+ /**
+ * Probability scores for the words.
+ */
+ scores: Float32Array|Float32Array[];
+
+ /**
+ * Optional spectrogram data.
+ */
+ spectrogram?: SpectrogramData;
+
+ /**
+ * Embedding (internal activation) for the input.
+ *
+ * This field is populated if and only if `includeEmbedding`
+ * is `true` in the configuration object used during the `recognize` call.
+ */
+ embedding?: tf.Tensor;
+}
+
+export interface StreamingRecognitionConfig {
+ /**
+ * Overlap factor. Must be >=0 and <1.
+ * Defaults to 0.5.
+ * For example, if the model takes a frame length of 1000 ms,
+ * and if overlap factor is 0.4, there will be a 400ms
+ * overlap between two successive frames, i.e., frames
+ * will be taken every 600 ms.
+ */
+ overlapFactor?: number;
+
+ /**
+ * Amount to time in ms to suppress recognizer after a word is recognized.
+ *
+ * Defaults to 1000 ms.
+ */
+ suppressionTimeMillis?: number;
+
+ /**
+ * Threshold for the maximum probability value in a model prediction
+ * output to be greater than or equal to, below which the callback
+ * will not be called.
+ *
+ * Must be a number >=0 and <=1.
+ *
+ * The value will be overridden to `0` if `includeEmbedding` is `true`.
+ *
+ * If `null` or `undefined`, will default to `0`.
+ */
+ probabilityThreshold?: number;
+
+ /**
+ * Invoke the callback for background noise and unknown.
+ *
+ * The value will be overridden to `true` if `includeEmbedding` is `true`.
+ *
+ * Default: `false`.
+ */
+ invokeCallbackOnNoiseAndUnknown?: boolean;
+
+ /**
+ * Whether the spectrogram is to be provided in the each recognition
+ * callback call.
+ *
+ * Default: `false`.
+ */
+ includeSpectrogram?: boolean;
+
+ /**
+ * Whether to include the embedding (internal activation).
+ *
+ * If set as `true`, the values of the following configuration fields
+ * in this object will be overridden:
+ *
+ * - `probabilityThreshold` will be overridden to 0.
+ * - `invokeCallbackOnNoiseAndUnknown` will be overridden to `true`.
+ *
+ * Default: `false`.
+ */
+ includeEmbedding?: boolean;
+
+ /**
+ * Optional constraints for the audio track.
+ *
+ * E.g., this can be used to select a microphone when multiple microphones
+ * are available on the system: `{deviceId: 'deadbeef'}`.
+ */
+ audioTrackConstraints?: MediaTrackConstraints;
+}
+
+export interface RecognizeConfig {
+ /**
+ * Whether the spectrogram is to be provided in the each recognition
+ * callback call.
+ *
+ * Default: `false`.
+ */
+ includeSpectrogram?: boolean;
+
+ /**
+ * Whether to include the embedding (internal activation).
+ *
+ * Default: `false`.
+ */
+ includeEmbedding?: boolean;
+}
+
+export interface AudioDataAugmentationOptions {
+ /**
+ * Additive ratio for augmenting the data by mixing the word spectrograms
+ * with background-noise ones.
+ *
+ * If not `null` or `undefined`, will cause extra word spectrograms to be
+ * created through the equation:
+ * (normalizedWordSpectrogram +
+ * augmentByMixingNoiseRatio * normalizedNoiseSpectrogram)
+ *
+ * The normalizedNoiseSpectrogram will be drawn randomly from all noise
+ * snippets available. If no noise snippet is available, an Error will
+ * be thrown.
+ *
+ * Default: `undefined`.
+ */
+ augmentByMixingNoiseRatio?: number;
+
+ // TODO(cais): Add other augmentation options, including augmentByReverb,
+ // augmentByTempoShift and augmentByFrequencyShift.
+}
+
+/**
+ * Configurations for the training of a transfer-learning recognizer.
+ *
+ * It is used during calls to the `TransferSpeechCommandRecognizer.train()`
+ * method.
+ */
+export interface TransferLearnConfig extends AudioDataAugmentationOptions {
+ /**
+ * Number of training epochs (default: 20).
+ */
+ epochs?: number;
+
+ /**
+ * Optimizer to be used for training (default: 'sgd').
+ */
+ optimizer?: string|tf.Optimizer;
+
+ /**
+ * Batch size of training (default: 128).
+ */
+ batchSize?: number;
+
+ /**
+ * Validation split to be used during training.
+ *
+ * Default: null (no validation split).
+ *
+ * Note that this is split is different from the basic validation-split
+ * paradigm in TensorFlow.js. It makes sure that the distribution of the
+ * classes in the training and validation sets are approximately balanced.
+ *
+ * If specified, must be a number > 0 and < 1.
+ */
+ validationSplit?: number;
+
+ /**
+ * Number of fine-tuning epochs to run after the initial `epochs` epochs
+ * of transfer-learning training.
+ *
+ * During the fine-tuning, the last dense layer of the truncated base
+ * model (i.e., the second-last dense layer of the original model) is
+ * unfrozen and updated through backpropagation.
+ *
+ * If specified, must be an integer > 0.
+ */
+ fineTuningEpochs?: number;
+
+ /**
+ * The optimizer for fine-tuning after the initial transfer-learning
+ * training.
+ *
+ * This parameter is used only if `fineTuningEpochs` is specified
+ * and is a positive integre.
+ *
+ * Default: 'sgd'.
+ */
+ fineTuningOptimizer?: string|tf.Optimizer;
+
+ /**
+ * tf.Callback to be used during the initial training (i.e., not
+ * the fine-tuning phase).
+ */
+ callback?: tfl.CustomCallbackArgs;
+
+ /**
+ * tf.Callback to be used durnig the fine-tuning phase.
+ *
+ * This parameter is used only if `fineTuningEpochs` is specified
+ * and is a positive integer.
+ */
+ fineTuningCallback?: tfl.CustomCallbackArgs;
+
+ /**
+ * Ratio between the window hop and the window width.
+ *
+ * Used during extraction of multiple spectrograms matching the underlying
+ * model's input shape from a longer spectroram.
+ *
+ * Defaults to 0.25.
+ *
+ * For example, if the spectrogram window accepted by the underlying model
+ * is 43 frames long, then the default windowHopRatio 0.25 will lead to
+ * a hop of Math.round(43 * 0.25) = 11 frames.
+ */
+ windowHopRatio?: number;
+
+ /**
+ * The threshold for the total duration of the dataset above which
+ * `fitDataset()` will be used in lieu of `fit()`.
+ *
+ * Default: 60e3 (1 minute).
+ */
+ fitDatasetDurationMillisThreshold?: number;
+}
+
+/**
+ * Type for a Receiver Operating Characteristics (ROC) curve.
+ */
+export type ROCCurve =
+ Array < {probThreshold?: number, /** Probability threshold */
+ fpr: number, /** False positive rate (FP / N) */
+ tpr: number /** True positive rate (TP / P) */
+ falsePositivesPerHour?: number /** FPR converted to per hour rate */
+}>;
+
+ /**
+ * Model evaluation result.
+ */
+ export interface EvaluateResult {
+ /**
+ * ROC curve.
+ */
+ rocCurve?: ROCCurve;
+
+ /**
+ * Area under the (ROC) curve.
+ */
+ auc?: number;
+ }
+
+ /**
+ * Model evaluation configuration.
+ */
+ export interface EvaluateConfig {
+ /**
+ * Ratio between the window hop and the window width.
+ *
+ * Used during extraction of multiple spectrograms matching the underlying
+ * model's input shape from a longer spectroram.
+ *
+ * For example, if the spectrogram window accepted by the underlying model
+ * is 43 frames long, then the default windowHopRatio 0.25 will lead to
+ * a hop of Math.round(43 * 0.25) = 11 frames.
+ */
+ windowHopRatio: number;
+
+ /**
+ * Word probability score thresholds, used to calculate the ROC.
+ *
+ * E.g., [0, 0.2, 0.4, 0.6, 0.8, 1.0].
+ */
+ wordProbThresholds: number[];
+ }
+
+ /**
+ * Parameters for a speech-command recognizer.
+ */
+ export interface RecognizerParams {
+ /**
+ * Total duration per spectragram, in milliseconds.
+ */
+ spectrogramDurationMillis?: number;
+
+ /**
+ * FFT encoding size per spectrogram column.
+ */
+ fftSize?: number;
+
+ /**
+ * Sampling rate, in Hz.
+ */
+ sampleRateHz?: number;
+ }
+
+ /**
+ * Interface of an audio feature extractor.
+ */
+ export interface FeatureExtractor {
+ /**
+ * Config the feature extractor.
+ */
+ setConfig(params: RecognizerParams): void;
+
+ /**
+ * Start the feature extraction from the audio samples.
+ */
+ start(audioTrackConstraints?: MediaTrackConstraints):
+ Promise;
+
+ /**
+ * Stop the feature extraction.
+ */
+ stop(): Promise;
+
+ /**
+ * Get the extractor features collected since last call.
+ */
+ getFeatures(): Float32Array[];
+ }
+
+ /** Snippet of pulse-code modulation (PCM) audio data. */
+ export interface RawAudioData {
+ /** Samples of the snippet. */
+ data: Float32Array;
+
+ /** Sampling rate, in Hz. */
+ sampleRateHz: number;
+ }
+
+ /**
+ * A short, labeled snippet of speech or audio.
+ *
+ * This can be used for training a transfer model based on the base
+ * speech-commands model, among other things.
+ *
+ * A set of `Example`s can make up a dataset.
+ */
+ export interface Example {
+ /** A label for the example. */
+ label: string;
+
+ /** Spectrogram data. */
+ spectrogram: SpectrogramData;
+
+ /**
+ * Raw audio in PCM (pulse-code modulation) format.
+ *
+ * Optional.
+ */
+ rawAudio?: RawAudioData;
+ }
diff --git a/音频分类/speech-commands/src/version.ts b/音频分类/speech-commands/src/version.ts
new file mode 100644
index 0000000..460e51d
--- /dev/null
+++ b/音频分类/speech-commands/src/version.ts
@@ -0,0 +1,5 @@
+/** @license See the LICENSE file. */
+
+// This code is auto-generated, do not modify this file!
+const version = '0.5.4';
+export {version};
diff --git a/音频分类/speech-commands/src/version_test.ts b/音频分类/speech-commands/src/version_test.ts
new file mode 100644
index 0000000..ba99347
--- /dev/null
+++ b/音频分类/speech-commands/src/version_test.ts
@@ -0,0 +1,26 @@
+/**
+ * @license
+ * Copyright 2019 Google LLC. All Rights Reserved.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =============================================================================
+ */
+
+import {version} from './index';
+
+describe('version', () => {
+ it('version matches package.json', () => {
+ // tslint:disable-next-line:no-require-imports
+ const expected = require('../package.json').version;
+ expect(version).toBe(expected);
+ });
+});
diff --git a/音频分类/speech-commands/training/browser-fft/README.md b/音频分类/speech-commands/training/browser-fft/README.md
new file mode 100644
index 0000000..22af322
--- /dev/null
+++ b/音频分类/speech-commands/training/browser-fft/README.md
@@ -0,0 +1,22 @@
+# Training a TensorFlow.js model for Speech Commands Using Browser FFT
+
+This directory contains two example notebooks. They demonstrate how to train
+custom TensorFlow.js audio models and deploy them for inference. The models
+trained this way expect inputs to be spectrograms in a format consistent with
+[WebAudio's `getFloatFrequencyData`](https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode/getFloatFrequencyData).
+Therefore they can be deployed to the browser using the speech-commands library
+for inference.
+
+Specifically,
+
+- [training_custom_audio_model_in_python.ipynb](./training_custom_audio_model_in_python.ipynb)
+ contains steps to preprocess a directory with audio examples stored as .wav
+ files and the steps in which a tf.keras model can be trained on the
+ preprocessed data. It then demonstrates how the trained tf.keras model can be
+ converted to a TensorFlow.js `LayersModel` that can be loaded with the
+ speech-command library's `create()` API. In addition, the notebook also shows
+ the steps to convert the trained tf.keras model to a TFLite model for
+ inference on mobile devices.
+- [tflite_conversion.ipynb](./tflite_conversion.ipynb) illustrates how
+ an audio model trained on [Teachable Machine](https://teachablemachine.withgoogle.com/train/audio)
+ can be converted to TFLite directly.
diff --git a/音频分类/speech-commands/training/browser-fft/tflite_conversion.ipynb b/音频分类/speech-commands/training/browser-fft/tflite_conversion.ipynb
new file mode 100644
index 0000000..f0c9dc1
--- /dev/null
+++ b/音频分类/speech-commands/training/browser-fft/tflite_conversion.ipynb
@@ -0,0 +1,349 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Converting a TensorFlow.js Speech-Commands Model to Python and TFLite formats\n",
+ "\n",
+ "This notebook showcases how to convert a [TensorFlow.js (TF.js) Speech Commands model](https://www.npmjs.com/package/@tensorflow-models/speech-commands) to the Python (`tensorflow.keras`) and [TFLite](https://www.tensorflow.org/lite) formats. The TFLite format enables the model to be deployed to mobile enviroments such as Android phones.\n",
+ "\n",
+ "The technique outlined in this notebook are applicable to:\n",
+ "- the original Speech Commands models (including the 18w and directional4w) variants,\n",
+ "- transfer-learned models based on the original models, which can be trained and exported from [Teachable Machine's Audio Project](https://teachablemachine.withgoogle.com/train/audio)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "First, install the required `tensorflow` and `tensorflowjs` Python packages."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "scrolled": false
+ },
+ "outputs": [],
+ "source": [
+ "# We need scipy for .wav file IO.\n",
+ "!pip install tensorflowjs==2.1.0 scipy==1.4.1\n",
+ "# TensorFlow 2.3.0 is required due to https://github.com/tensorflow/tensorflow/issues/38135\n",
+ "# TODO: Switch to 2.3.0 final release when it comes out.\n",
+ "!pip install tensorflow-cpu==2.3.0"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Below we download the files of the original or transfer-learned TF.js Speech Commands model. \n",
+ "The code example here downloads the original model. But the approach is the same for a transfer-learned model downloaded from Teachable Machine, except that the files may come in as a ZIP archive in the case of Teachable Machine and hence requires unzippping."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "!mkdir -p /tmp/tfjs-sc-model\n",
+ "!curl -o /tmp/tfjs-sc-model/metadata.json -fsSL https://storage.googleapis.com/tfjs-models/tfjs/speech-commands/v0.3/browser_fft/18w/metadata.json\n",
+ "!curl -o /tmp/tfjs-sc-model/model.json -fsSL https://storage.googleapis.com/tfjs-models/tfjs/speech-commands/v0.3/browser_fft/18w/model.json\n",
+ "!curl -o /tmp/tfjs-sc-model/group1-shard1of2 -fSsL https://storage.googleapis.com/tfjs-models/tfjs/speech-commands/v0.3/browser_fft/18w/group1-shard1of2\n",
+ "!curl -o /tmp/tfjs-sc-model/group1-shard2of2 -fsSL https://storage.googleapis.com/tfjs-models/tfjs/speech-commands/v0.3/browser_fft/18w/group1-shard2of2"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import json\n",
+ "\n",
+ "import tensorflow as tf\n",
+ "import tensorflowjs as tfjs"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Specify the path to the TensorFlow.js Speech Commands model,\n",
+ "# either original or transfer-learned on https://teachablemachine.withgoogle.com/)\n",
+ "tfjs_model_json_path = '/tmp/tfjs-sc-model/model.json'\n",
+ "\n",
+ "# This is the main classifier model.\n",
+ "model = tfjs.converters.load_keras_model(tfjs_model_json_path)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "As a required step, we download the audio preprocessing layer that replicates\n",
+ "[WebAudio](https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API)'s\n",
+ "[Fourier transform](https://en.wikipedia.org/wiki/Fast_Fourier_transform) for\n",
+ "non-browser environments such as Android phones."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "./sc_preproc_model/\r\n",
+ "./sc_preproc_model/assets/\r\n",
+ "./sc_preproc_model/variables/\r\n",
+ "./sc_preproc_model/variables/variables.data-00000-of-00001\r\n",
+ "./sc_preproc_model/variables/variables.index\r\n",
+ "./sc_preproc_model/saved_model.pb\r\n"
+ ]
+ }
+ ],
+ "source": [
+ "!curl -o /tmp/tfjs-sc-model/sc_preproc_model.tar.gz -fSsL https://storage.googleapis.com/tfjs-models/tfjs/speech-commands/conversion/sc_preproc_model.tar.gz\n",
+ "!cd /tmp/tfjs-sc-model && tar xzvf ./sc_preproc_model.tar.gz"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+ "Model: \"audio_preproc\"\n",
+ "_________________________________________________________________\n",
+ "Layer (type) Output Shape Param # \n",
+ "=================================================================\n",
+ "audio_preprocessing_layer (A (None, None, None, 1) 2048 \n",
+ "=================================================================\n",
+ "Total params: 2,048\n",
+ "Trainable params: 0\n",
+ "Non-trainable params: 2,048\n",
+ "_________________________________________________________________\n",
+ "Input audio length = 44032\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Load the preprocessing layer (wrapped in a tf.keras Model).\n",
+ "preproc_model_path = '/tmp/tfjs-sc-model/sc_preproc_model'\n",
+ "preproc_model = tf.keras.models.load_model(preproc_model_path)\n",
+ "preproc_model.summary()\n",
+ "\n",
+ "# From the input_shape of the preproc_model, we can determine the\n",
+ "# required length of the input audio snippet.\n",
+ "input_length = preproc_model.input_shape[-1]\n",
+ "print(\"Input audio length = %d\" % input_length)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Model: \"combined_model\"\n",
+ "_________________________________________________________________\n",
+ "Layer (type) Output Shape Param # \n",
+ "=================================================================\n",
+ "audio_preproc (Sequential) (None, None, None, 1) 2048 \n",
+ "_________________________________________________________________\n",
+ "sequential (Sequential) (None, 20) 1468684 \n",
+ "=================================================================\n",
+ "Total params: 1,470,732\n",
+ "Trainable params: 1,468,684\n",
+ "Non-trainable params: 2,048\n",
+ "_________________________________________________________________\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Construct the new non-browser model by combining the preprocessing\n",
+ "# layer with the main classifier model.\n",
+ "\n",
+ "combined_model = tf.keras.Sequential(name='combined_model')\n",
+ "combined_model.add(preproc_model)\n",
+ "combined_model.add(model)\n",
+ "combined_model.build([None, input_length])\n",
+ "combined_model.summary()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In order to quickly test that the converted model works, let's download a sample .wav file."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "!curl -o /tmp/tfjs-sc-model/audio_sample_one_male_adult.wav -fSsL https://storage.googleapis.com/tfjs-models/tfjs/speech-commands/conversion/audio_sample_one_male_adult.wav"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " Your browser does not support the audio element.\n",
+ " \n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Listen to the audio sample.\n",
+ "wav_file_path = '/tmp/tfjs-sc-model/audio_sample_one_male_adult.wav'\n",
+ "import IPython.display as ipd\n",
+ "ipd.Audio(wav_file_path) # Play the .wav file."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Read the wav file and truncate it to the an input length\n",
+ "# suitable for the model.\n",
+ "from scipy.io import wavfile\n",
+ "\n",
+ "# fs: sample rate in Hz; xs: the audio PCM samples.\n",
+ "fs, xs = wavfile.read(wav_file_path)\n",
+ "\n",
+ "if len(xs) >= input_length:\n",
+ " xs = xs[:input_length]\n",
+ "else:\n",
+ " raise ValueError(\"Audio from .wav file is too short\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "top-5 class probabilities:\n",
+ " one: 1.0000e+00\n",
+ " nine: 5.0455e-19\n",
+ " _unknown_: 1.0553e-20\n",
+ " down: 4.0031e-26\n",
+ " no: 3.8358e-26\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Try running some examples through the combined model.\n",
+ "input_tensor = tf.constant(xs, shape=(1, input_length), dtype=tf.float32) / 32768.0\n",
+ "# The model outputs the probabilties for the classes (`probs`).\n",
+ "probs = combined_model.predict(input_tensor)\n",
+ "\n",
+ "# Read class labels of the model.\n",
+ "metadata_json_path = '/tmp/tfjs-sc-model/metadata.json'\n",
+ "\n",
+ "with open(metadata_json_path, 'r') as f:\n",
+ " metadata = json.load(f)\n",
+ " class_labels = metadata[\"words\"]\n",
+ "\n",
+ "# Get sorted probabilities and their corresponding class labels.\n",
+ "probs_and_labels = list(zip(probs[0].tolist(), class_labels))\n",
+ "# Sort the probabilities in descending order.\n",
+ "probs_and_labels = sorted(probs_and_labels, key=lambda x: -x[0])\n",
+ "probs_and_labels\n",
+ "# len(probs_and_labels)\n",
+ "\n",
+ "# Print the top-5 labels:\n",
+ "print('top-5 class probabilities:')\n",
+ "for i in range(5):\n",
+ " prob, label = probs_and_labels[i]\n",
+ " print('%20s: %.4e' % (label, prob))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "WARNING:tensorflow:From /usr/local/google/home/cais/venv_tfjs/lib/python3.7/site-packages/tensorflow/python/training/tracking/tracking.py:111: Model.state_updates (from tensorflow.python.keras.engine.training) is deprecated and will be removed in a future version.\n",
+ "Instructions for updating:\n",
+ "This property should not be used in TensorFlow 2.0, as updates are applied automatically.\n",
+ "WARNING:tensorflow:From /usr/local/google/home/cais/venv_tfjs/lib/python3.7/site-packages/tensorflow/python/training/tracking/tracking.py:111: Layer.updates (from tensorflow.python.keras.engine.base_layer) is deprecated and will be removed in a future version.\n",
+ "Instructions for updating:\n",
+ "This property should not be used in TensorFlow 2.0, as updates are applied automatically.\n",
+ "INFO:tensorflow:Assets written to: /tmp/tmplb12fskv/assets\n",
+ "Saved tflite file at: /tmp/tfjs-sc-model/combined_model.tflite\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Save the model as a tflite file.\n",
+ "tflite_output_path = '/tmp/tfjs-sc-model/combined_model.tflite'\n",
+ "converter = tf.lite.TFLiteConverter.from_keras_model(combined_model)\n",
+ "converter.target_spec.supported_ops = [\n",
+ " tf.lite.OpsSet.TFLITE_BUILTINS, tf.lite.OpsSet.SELECT_TF_OPS\n",
+ "]\n",
+ "with open(tflite_output_path, 'wb') as f:\n",
+ " f.write(converter.convert())\n",
+ "print(\"Saved tflite file at: %s\" % tflite_output_path)"
+ ]
+ }
+ ],
+ "metadata": {
+ "colab": {
+ "name": "tflite_conversion.ipynb",
+ "provenance": [],
+ "toc_visible": true
+ },
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
diff --git a/音频分类/speech-commands/training/browser-fft/training_custom_audio_model_in_python.ipynb b/音频分类/speech-commands/training/browser-fft/training_custom_audio_model_in_python.ipynb
new file mode 100644
index 0000000..9a91b44
--- /dev/null
+++ b/音频分类/speech-commands/training/browser-fft/training_custom_audio_model_in_python.ipynb
@@ -0,0 +1,860 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "colab_type": "text",
+ "id": "z6uizglMgQ26"
+ },
+ "source": [
+ "# Training a Custom TensorFlow.js Audio Model\n",
+ "\n",
+ "In this notebook, we show how to train a custom audio model based on the model topology of the\n",
+ "[TensorFlow.js Speech Commands model](https://www.npmjs.com/package/@tensorflow-models/speech-commands).\n",
+ "The training is done in Python by using a set of audio examples stored as .wav files.\n",
+ "The trained model is convertible to the\n",
+ "[TensorFlow.js LayersModel](https://js.tensorflow.org/api/latest/#loadLayersModel) format for\n",
+ "inference and further fine-tuning in the browser.\n",
+ "It may also be converted to the [TFLite](https://www.tensorflow.org/lite) format\n",
+ "for inference on mobile devices.\n",
+ "\n",
+ "This example uses a small subset of the\n",
+ "[Speech Commands v0.02](https://arxiv.org/abs/1804.03209) dataset, and builds\n",
+ "a model that detects two English words (\"yes\" and \"no\") against background noises. But the methodology demonstrated here is general and can be applied to\n",
+ "other sounds, as long as they are stored in the same .wav file format as in this example.\n",
+ "\n",
+ "## Data format\n",
+ "\n",
+ "The training procedure in this notebook makes the following assumption about the raw audio data:\n",
+ "\n",
+ "1. The root data directory contains a number of folders. The name of each folder is the name\n",
+ " of the audio class. You can select any subset of the folders (i.e., classes) to train the\n",
+ " model on.\n",
+ "2. Within each folder, there are a number of .wav files. Each .wav file corresponds to an\n",
+ " example. Each .wav file is mono (single-channel) and has the typical pulse-code modulation\n",
+ " (PCM) encoding. The duration of each wave file should be 1 second or slightly longer. \n",
+ "3. There can be a special folder called \"_background_noise_\" that contains .wav files for\n",
+ " audio samples that fall into the background noise class. Each of these .wav files can be\n",
+ " much longer than 1 second in duration. This notebook contains code that extracts 1-second\n",
+ " snippets from these .wav files\n",
+ " \n",
+ "The Speech Commands v0.3 dataset used in this notebook meets these data format requirements."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {},
+ "colab_type": "code",
+ "id": "Grv5UK5rHxyY"
+ },
+ "outputs": [],
+ "source": [
+ "!pip install librosa tensorflowjs"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {},
+ "colab_type": "code",
+ "id": "3BbsTxcuCwYO"
+ },
+ "outputs": [],
+ "source": [
+ "import glob\n",
+ "import json\n",
+ "import os\n",
+ "import random\n",
+ "\n",
+ "import librosa\n",
+ "import matplotlib.pyplot as plt\n",
+ "import numpy as np\n",
+ "from scipy import signal\n",
+ "from scipy.io import wavfile\n",
+ "import tensorflow as tf\n",
+ "import tensorflowjs as tfjs\n",
+ "import tqdm\n",
+ "\n",
+ "print(tf.__version__)\n",
+ "print(tfjs.__version__)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 119
+ },
+ "colab_type": "code",
+ "id": "wkPnHDHITAJH",
+ "outputId": "8c64930f-b03e-48df-fc93-7ab894307ee7"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "sc_preproc_model/\n",
+ "sc_preproc_model/assets/\n",
+ "sc_preproc_model/variables/\n",
+ "sc_preproc_model/variables/variables.data-00000-of-00001\n",
+ "sc_preproc_model/variables/variables.index\n",
+ "sc_preproc_model/saved_model.pb\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Download the TensorFlow.js Speech Commands model and the associated\n",
+ "# preprocesssing model.\n",
+ "!mkdir -p /tmp/tfjs-sc-model\n",
+ "!curl -o /tmp/tfjs-sc-model/metadata.json -fsSL https://storage.googleapis.com/tfjs-models/tfjs/speech-commands/v0.3/browser_fft/18w/metadata.json\n",
+ "!curl -o /tmp/tfjs-sc-model/model.json -fsSL https://storage.googleapis.com/tfjs-models/tfjs/speech-commands/v0.3/browser_fft/18w/model.json\n",
+ "!curl -o /tmp/tfjs-sc-model/group1-shard1of2 -fSsL https://storage.googleapis.com/tfjs-models/tfjs/speech-commands/v0.3/browser_fft/18w/group1-shard1of2\n",
+ "!curl -o /tmp/tfjs-sc-model/group1-shard2of2 -fsSL https://storage.googleapis.com/tfjs-models/tfjs/speech-commands/v0.3/browser_fft/18w/group1-shard2of2\n",
+ "!curl -o /tmp/tfjs-sc-model/sc_preproc_model.tar.gz -fSsL https://storage.googleapis.com/tfjs-models/tfjs/speech-commands/conversion/sc_preproc_model.tar.gz\n",
+ "!cd /tmp/tfjs-sc-model/ && tar xzvf sc_preproc_model.tar.gz"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {},
+ "colab_type": "code",
+ "id": "ioTiCDp4HO_V"
+ },
+ "outputs": [],
+ "source": [
+ "# Download Speech Commands v0.02 dataset. The dataset contains 30+ word and\n",
+ "# sound categories, but we will only use a subset of them\n",
+ "\n",
+ "!mkdir -p /tmp/speech_commands_v0.02\n",
+ "!curl -o /tmp/speech_commands_v0.02/speech_commands_v0.02.tar.gz -fSsL http://download.tensorflow.org/data/speech_commands_v0.02.tar.gz\n",
+ "!cd /tmp/speech_commands_v0.02 && tar xzf speech_commands_v0.02.tar.gz"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 221
+ },
+ "colab_type": "code",
+ "id": "TqnjnnPoTR8E",
+ "outputId": "447dd1df-edc1-4829-ce31-4e8f2f9bb328"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n",
+ "Model: \"audio_preproc\"\n",
+ "_________________________________________________________________\n",
+ "Layer (type) Output Shape Param # \n",
+ "=================================================================\n",
+ "audio_preprocessing_layer (A (None, None, None, 1) 2048 \n",
+ "=================================================================\n",
+ "Total params: 2,048\n",
+ "Trainable params: 0\n",
+ "Non-trainable params: 2,048\n",
+ "_________________________________________________________________\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "(None, 44032)"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {
+ "tags": []
+ },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Load the preprocessing model, which transforms audio waveform into \n",
+ "# spectrograms (2D image-like representation of sound).\n",
+ "# This preprocessing model replicates WebAudio's AnalyzerNode.getFloatFrequencyData\n",
+ "# (https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode/getFloatFrequencyData).\n",
+ "# It performs short-time Fourier transform (STFT) using a length-2048 Blackman\n",
+ "# window. It opeartes on mono audio at the 44100-Hz sample rate.\n",
+ "\n",
+ "preproc_model_path = '/tmp/tfjs-sc-model/sc_preproc_model'\n",
+ "preproc_model = tf.keras.models.load_model(preproc_model_path)\n",
+ "preproc_model.summary()\n",
+ "preproc_model.input_shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {},
+ "colab_type": "code",
+ "id": "mihiFei-dE3u"
+ },
+ "outputs": [],
+ "source": [
+ "# Create some constants to be used later.\n",
+ "\n",
+ "# Target sampling rate. It is required by the audio preprocessing model.\n",
+ "TARGET_SAMPLE_RATE = 44100\n",
+ "# The specific audio tensor length expected by the preprocessing model.\n",
+ "EXPECTED_WAVEFORM_LEN = preproc_model.input_shape[-1]\n",
+ "\n",
+ "# Where the Speech Commands v0.02 dataset has been downloaded.\n",
+ "DATA_ROOT = \"/tmp/speech_commands_v0.02\"\n",
+ "\n",
+ "WORDS = (\"_background_noise_snippets_\", \"no\", \"yes\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 153
+ },
+ "colab_type": "code",
+ "id": "0jl1n0SCNYUj",
+ "outputId": "1a524c46-ddd4-4162-f60a-c2511fd14626"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Extracting snippets from /tmp/speech_commands_v0.02/_background_noise_/pink_noise.wav...\n",
+ "Extracting snippets from /tmp/speech_commands_v0.02/_background_noise_/exercise_bike.wav...\n",
+ "Extracting snippets from /tmp/speech_commands_v0.02/_background_noise_/dude_miaowing.wav...\n",
+ "Extracting snippets from /tmp/speech_commands_v0.02/_background_noise_/running_tap.wav...\n",
+ "Extracting snippets from /tmp/speech_commands_v0.02/_background_noise_/doing_the_dishes.wav...\n",
+ "Extracting snippets from /tmp/speech_commands_v0.02/_background_noise_/white_noise.wav...\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:13: WavFileWarning: Chunk (non-data) not understood, skipping it.\n",
+ " del sys.path[0]\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Unlike word examples, the noise samples in the Speech Commands v0.02 dataset\n",
+ "# are not divided into 1-second snippets. Instead, they are stored as longer\n",
+ "# recordings. Therefore we need to cut them up in to 1-second snippet .wav\n",
+ "# files.\n",
+ "\n",
+ "noise_wav_paths = glob.glob(os.path.join(DATA_ROOT, \"_background_noise_\", \"*.wav\"))\n",
+ "snippets_dir = os.path.join(DATA_ROOT, \"_background_noise_snippets_\")\n",
+ "os.makedirs(snippets_dir, exist_ok=True)\n",
+ "\n",
+ "\n",
+ "def extract_snippets(wav_path, snippet_duration_sec=1.0):\n",
+ " basename = os.path.basename(os.path.splitext(wav_path)[0])\n",
+ " sample_rate, xs = wavfile.read(wav_path)\n",
+ " assert xs.dtype == np.int16\n",
+ " n_samples_per_snippet = int(snippet_duration_sec * sample_rate)\n",
+ " i = 0\n",
+ " while i + n_samples_per_snippet < len(xs):\n",
+ " snippet_wav_path = os.path.join(snippets_dir, \"%s_%.5d.wav\" % (basename, i))\n",
+ " snippet = xs[i : i + n_samples_per_snippet].astype(np.int16)\n",
+ " wavfile.write(snippet_wav_path, sample_rate, snippet)\n",
+ " i += n_samples_per_snippet\n",
+ "\n",
+ "for noise_wav_path in noise_wav_paths:\n",
+ " print(\"Extracting snippets from %s...\" % noise_wav_path)\n",
+ " extract_snippets(noise_wav_path, snippet_duration_sec=1.0)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {},
+ "colab_type": "code",
+ "id": "FSjiThysWrTx"
+ },
+ "outputs": [],
+ "source": [
+ "def resample_wavs(dir_path, target_sample_rate=44100):\n",
+ " \"\"\"Resample the .wav files in an input directory to given sampling rate.\n",
+ " \n",
+ " The resampled waveforms are written to .wav files in the same directory with\n",
+ " file names that ends in \"_44100hz.wav\".\n",
+ "\n",
+ " 44100 Hz is the sample rate required by the preprocessing model. It is also\n",
+ " the most widely supported sample rate among web browsers and mobile devices.\n",
+ " For example, see:\n",
+ " https://developer.mozilla.org/en-US/docs/Web/API/AudioContextOptions/sampleRate\n",
+ " https://developer.android.com/ndk/guides/audio/sampling-audio\n",
+ "\n",
+ " Args:\n",
+ " dir_path: Path to a directory that contains .wav files.\n",
+ " target_sapmle_rate: Target sampling rate in Hz.\n",
+ " \"\"\"\n",
+ " wav_paths = glob.glob(os.path.join(dir_path, \"*.wav\"))\n",
+ " resampled_suffix = \"_%shz.wav\" % target_sample_rate\n",
+ " for i, wav_path in tqdm.tqdm(enumerate(wav_paths)):\n",
+ " if wav_path.endswith(resampled_suffix):\n",
+ " continue\n",
+ " sample_rate, xs = wavfile.read(wav_path)\n",
+ " xs = xs.astype(np.float32)\n",
+ " xs = librosa.resample(xs, sample_rate, TARGET_SAMPLE_RATE).astype(np.int16)\n",
+ " resampled_path = os.path.splitext(wav_path)[0] + resampled_suffix\n",
+ " wavfile.write(resampled_path, target_sample_rate, xs)\n",
+ "\n",
+ "\n",
+ "for word in WORDS:\n",
+ " word_dir = os.path.join(DATA_ROOT, word)\n",
+ " assert os.path.isdir(word_dir)\n",
+ " resample_wavs(word_dir, target_sample_rate=TARGET_SAMPLE_RATE)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {},
+ "colab_type": "code",
+ "id": "aFA-TSmpK935"
+ },
+ "outputs": [],
+ "source": [
+ "@tf.function\n",
+ "def read_wav(filepath):\n",
+ " file_contents = tf.io.read_file(filepath)\n",
+ " return tf.expand_dims(tf.squeeze(tf.audio.decode_wav(\n",
+ " file_contents, \n",
+ " desired_channels=-1,\n",
+ " desired_samples=TARGET_SAMPLE_RATE).audio, axis=-1), 0)\n",
+ "\n",
+ "\n",
+ "@tf.function\n",
+ "def filter_by_waveform_length(waveform, label):\n",
+ " return tf.size(waveform) > EXPECTED_WAVEFORM_LEN\n",
+ "\n",
+ "\n",
+ "@tf.function\n",
+ "def crop_and_convert_to_spectrogram(waveform, label):\n",
+ " cropped = tf.slice(waveform, begin=[0, 0], size=[1, EXPECTED_WAVEFORM_LEN])\n",
+ " return tf.squeeze(preproc_model(cropped), axis=0), label\n",
+ "\n",
+ "\n",
+ "@tf.function\n",
+ "def spectrogram_elements_finite(spectrogram, label):\n",
+ " return tf.math.reduce_all(tf.math.is_finite(spectrogram))\n",
+ "\n",
+ "\n",
+ "def get_dataset(input_wav_paths, labels):\n",
+ " \"\"\"Get a tf.data.Dataset given input .wav files and their labels.\n",
+ "\n",
+ " The returned dataset emits 2-tuples of `(spectrogram, label)`, wherein\n",
+ " - `spectrogram` is a tensor of dtype tf.float32 and shape [43, 232, 1].\n",
+ " It is z-normalized (i.e., have a mean of ~0.0 and variance of ~1.0).\n",
+ " - `label` is a tensor of dtype tf.int32 and shape [] (scalar).\n",
+ " \n",
+ " Args:\n",
+ " input_wav_paths: Input audio .wav file paths as a list of string.\n",
+ " labels: integer labels (class indices) of the input .wav files. Must have\n",
+ " the same lengh as `input_wav_paths`.\n",
+ "\n",
+ " Returns:\n",
+ " A tf.data.Dataset object as described above.\n",
+ " \"\"\"\n",
+ " ds = tf.data.Dataset.from_tensor_slices(input_wav_paths)\n",
+ " # Read audio waveform from the .wav files.\n",
+ " ds = ds.map(read_wav)\n",
+ " ds = tf.data.Dataset.zip((ds, tf.data.Dataset.from_tensor_slices(labels)))\n",
+ " # Keep only the waveforms longer than `EXPECTED_WAVEFORM_LEN`.\n",
+ " ds = ds.filter(filter_by_waveform_length)\n",
+ " # Crop the waveforms to `EXPECTED_WAVEFORM_LEN` and convert them to\n",
+ " # spectrograms using the preprocessing layer.\n",
+ " ds = ds.map(crop_and_convert_to_spectrogram)\n",
+ " # Discard examples that contain infinite or NaN elements.\n",
+ " ds = ds.filter(spectrogram_elements_finite)\n",
+ " return ds"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 333
+ },
+ "colab_type": "code",
+ "id": "tU6gho3nuvQl",
+ "outputId": "07dea6f2-9b7c-477e-8814-f69772fb39da"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Found 396 examples for class _background_noise_snippets_\n",
+ "Found 3941 examples for class no\n",
+ "Found 4044 examples for class yes\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light",
+ "tags": []
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "input_wav_paths_and_labels = []\n",
+ "for i, word in enumerate(WORDS):\n",
+ " wav_paths = glob.glob(os.path.join(DATA_ROOT, word, \"*_%shz.wav\" % TARGET_SAMPLE_RATE))\n",
+ " print(\"Found %d examples for class %s\" % (len(wav_paths), word))\n",
+ " labels = [i] * len(wav_paths)\n",
+ " input_wav_paths_and_labels.extend(zip(wav_paths, labels))\n",
+ "random.shuffle(input_wav_paths_and_labels)\n",
+ " \n",
+ "input_wav_paths, labels = ([t[0] for t in input_wav_paths_and_labels],\n",
+ " [t[1] for t in input_wav_paths_and_labels])\n",
+ "dataset = get_dataset(input_wav_paths, labels)\n",
+ "\n",
+ "# Show some example spectrograms for inspection.\n",
+ "fig = plt.figure(figsize=(40, 100))\n",
+ "dataset_iter = iter(dataset)\n",
+ "num_spectrograms_to_show = 10\n",
+ "for i in range(num_spectrograms_to_show):\n",
+ " ax = fig.add_subplot(1, num_spectrograms_to_show, i + 1)\n",
+ " spectrogram, label = next(dataset_iter)\n",
+ " spectrogram = spectrogram.numpy()\n",
+ " label = label.numpy()\n",
+ " plt.imshow(np.flipud(np.squeeze(spectrogram, -1).T), aspect=0.2)\n",
+ " ax.set_title(\"Example of \\\"%s\\\"\" % WORDS[label])\n",
+ " ax.set_xlabel(\"Time frame #\")\n",
+ " if i == 0:\n",
+ " ax.set_ylabel(\"Frequency bin #\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 51
+ },
+ "colab_type": "code",
+ "id": "ZvWr-_R2ym7d",
+ "outputId": "4784a0d3-d0a3-406a-9199-2c626efe454f"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Loading dataset and converting data to numpy arrays. This may take a few minutes...\n",
+ "Done.\n"
+ ]
+ }
+ ],
+ "source": [
+ "# The amount of data we have is relatively small. It fits into typical host RAM\n",
+ "# or GPU memory. For better training performance, we preload the data and\n",
+ "# put it into numpy arrays:\n",
+ "# - xs: The audio features (normalized spectrograms).\n",
+ "# - ys: The labels (class indices).\n",
+ "print(\n",
+ " \"Loading dataset and converting data to numpy arrays. \"\n",
+ " \"This may take a few minutes...\")\n",
+ "xs_and_ys = list(dataset)\n",
+ "xs = np.stack([item[0] for item in xs_and_ys])\n",
+ "ys = np.stack([item[1] for item in xs_and_ys])\n",
+ "print(\"Done.\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 595
+ },
+ "colab_type": "code",
+ "id": "o6sV5t2Kwi7p",
+ "outputId": "d127e5ce-24ef-4ced-bd2e-19f8ca31e586"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Model: \"TransferLearnedModel\"\n",
+ "_________________________________________________________________\n",
+ "Layer (type) Output Shape Param # \n",
+ "=================================================================\n",
+ "conv2d_1 (Conv2D) (None, 42, 225, 8) 136 \n",
+ "_________________________________________________________________\n",
+ "max_pooling2d_1 (MaxPooling2 (None, 21, 112, 8) 0 \n",
+ "_________________________________________________________________\n",
+ "conv2d_2 (Conv2D) (None, 20, 109, 32) 2080 \n",
+ "_________________________________________________________________\n",
+ "max_pooling2d_2 (MaxPooling2 (None, 10, 54, 32) 0 \n",
+ "_________________________________________________________________\n",
+ "conv2d_3 (Conv2D) (None, 9, 51, 32) 8224 \n",
+ "_________________________________________________________________\n",
+ "max_pooling2d_3 (MaxPooling2 (None, 4, 25, 32) 0 \n",
+ "_________________________________________________________________\n",
+ "conv2d_4 (Conv2D) (None, 3, 22, 32) 8224 \n",
+ "_________________________________________________________________\n",
+ "max_pooling2d_4 (MaxPooling2 (None, 2, 11, 32) 0 \n",
+ "_________________________________________________________________\n",
+ "flatten_1 (Flatten) (None, 704) 0 \n",
+ "_________________________________________________________________\n",
+ "dropout_1 (Dropout) (None, 704) 0 \n",
+ "_________________________________________________________________\n",
+ "dense_1 (Dense) (None, 2000) 1410000 \n",
+ "_________________________________________________________________\n",
+ "dropout_2 (Dropout) (None, 2000) 0 \n",
+ "_________________________________________________________________\n",
+ "dense (Dense) (None, 3) 6003 \n",
+ "=================================================================\n",
+ "Total params: 1,434,667\n",
+ "Trainable params: 6,003\n",
+ "Non-trainable params: 1,428,664\n",
+ "_________________________________________________________________\n"
+ ]
+ }
+ ],
+ "source": [
+ "tfjs_model_json_path = '/tmp/tfjs-sc-model/model.json'\n",
+ "\n",
+ "# Load the Speech Commands model. Weights are loaded along with the topology,\n",
+ "# since we train the model from scratch. Instead, we will perform transfer\n",
+ "# learning based on the model.\n",
+ "orig_model = tfjs.converters.load_keras_model(tfjs_model_json_path, load_weights=True)\n",
+ "\n",
+ "# Remove the top Dense layer and add a new Dense layer of which the output\n",
+ "# size fits the number of sound classes we care about.\n",
+ "model = tf.keras.Sequential(name=\"TransferLearnedModel\")\n",
+ "for layer in orig_model.layers[:-1]:\n",
+ " model.add(layer)\n",
+ "model.add(tf.keras.layers.Dense(units=len(WORDS), activation=\"softmax\"))\n",
+ "\n",
+ "# Freeze all but the last layer of the model. The last layer will be fine-tuned\n",
+ "# during transfer learning.\n",
+ "for layer in model.layers[:-1]:\n",
+ " layer.trainable = False\n",
+ "\n",
+ "model.compile(optimizer=\"sgd\", loss=\"sparse_categorical_crossentropy\", metrics=[\"acc\"])\n",
+ "model.summary()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 1000
+ },
+ "colab_type": "code",
+ "id": "zRNtKeuPFIaq",
+ "outputId": "7cd176f4-db38-448f-a153-7d78dcbd24fc"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Epoch 1/50\n",
+ "21/21 [==============================] - 11s 538ms/step - loss: 0.4393 - acc: 0.8521 - val_loss: 0.0732 - val_acc: 0.9756\n",
+ "Epoch 2/50\n",
+ "21/21 [==============================] - 11s 527ms/step - loss: 0.1562 - acc: 0.9438 - val_loss: 0.0571 - val_acc: 0.9823\n",
+ "Epoch 3/50\n",
+ "21/21 [==============================] - 11s 528ms/step - loss: 0.1207 - acc: 0.9584 - val_loss: 0.0536 - val_acc: 0.9810\n",
+ "Epoch 4/50\n",
+ "21/21 [==============================] - 11s 532ms/step - loss: 0.0987 - acc: 0.9653 - val_loss: 0.0471 - val_acc: 0.9827\n",
+ "Epoch 5/50\n",
+ "21/21 [==============================] - 11s 528ms/step - loss: 0.0894 - acc: 0.9662 - val_loss: 0.0455 - val_acc: 0.9836\n",
+ "Epoch 6/50\n",
+ "21/21 [==============================] - 11s 527ms/step - loss: 0.0818 - acc: 0.9730 - val_loss: 0.0442 - val_acc: 0.9841\n",
+ "Epoch 7/50\n",
+ "21/21 [==============================] - 11s 528ms/step - loss: 0.0791 - acc: 0.9738 - val_loss: 0.0422 - val_acc: 0.9849\n",
+ "Epoch 8/50\n",
+ "21/21 [==============================] - 11s 529ms/step - loss: 0.0749 - acc: 0.9757 - val_loss: 0.0407 - val_acc: 0.9858\n",
+ "Epoch 9/50\n",
+ "21/21 [==============================] - 11s 529ms/step - loss: 0.0748 - acc: 0.9736 - val_loss: 0.0399 - val_acc: 0.9863\n",
+ "Epoch 10/50\n",
+ "21/21 [==============================] - 11s 532ms/step - loss: 0.0698 - acc: 0.9761 - val_loss: 0.0400 - val_acc: 0.9858\n",
+ "Epoch 11/50\n",
+ "21/21 [==============================] - 11s 528ms/step - loss: 0.0670 - acc: 0.9774 - val_loss: 0.0389 - val_acc: 0.9867\n",
+ "Epoch 12/50\n",
+ "21/21 [==============================] - 11s 528ms/step - loss: 0.0676 - acc: 0.9768 - val_loss: 0.0385 - val_acc: 0.9876\n",
+ "Epoch 13/50\n",
+ "21/21 [==============================] - 11s 527ms/step - loss: 0.0655 - acc: 0.9770 - val_loss: 0.0378 - val_acc: 0.9872\n",
+ "Epoch 14/50\n",
+ "21/21 [==============================] - 11s 527ms/step - loss: 0.0615 - acc: 0.9799 - val_loss: 0.0360 - val_acc: 0.9876\n",
+ "Epoch 15/50\n",
+ "21/21 [==============================] - 11s 529ms/step - loss: 0.0651 - acc: 0.9765 - val_loss: 0.0362 - val_acc: 0.9876\n",
+ "Epoch 16/50\n",
+ "21/21 [==============================] - 11s 528ms/step - loss: 0.0477 - acc: 0.9818 - val_loss: 0.0361 - val_acc: 0.9880\n",
+ "Epoch 17/50\n",
+ "21/21 [==============================] - 11s 529ms/step - loss: 0.0561 - acc: 0.9801 - val_loss: 0.0357 - val_acc: 0.9889\n",
+ "Epoch 18/50\n",
+ "21/21 [==============================] - 11s 529ms/step - loss: 0.0521 - acc: 0.9816 - val_loss: 0.0350 - val_acc: 0.9885\n",
+ "Epoch 19/50\n",
+ "21/21 [==============================] - 11s 528ms/step - loss: 0.0659 - acc: 0.9803 - val_loss: 0.0345 - val_acc: 0.9885\n",
+ "Epoch 20/50\n",
+ "21/21 [==============================] - 11s 528ms/step - loss: 0.0544 - acc: 0.9812 - val_loss: 0.0358 - val_acc: 0.9872\n",
+ "Epoch 21/50\n",
+ "21/21 [==============================] - 11s 529ms/step - loss: 0.0573 - acc: 0.9787 - val_loss: 0.0333 - val_acc: 0.9885\n",
+ "Epoch 22/50\n",
+ "21/21 [==============================] - 11s 530ms/step - loss: 0.0442 - acc: 0.9839 - val_loss: 0.0332 - val_acc: 0.9889\n",
+ "Epoch 23/50\n",
+ "21/21 [==============================] - 11s 529ms/step - loss: 0.0528 - acc: 0.9820 - val_loss: 0.0335 - val_acc: 0.9889\n",
+ "Epoch 24/50\n",
+ "21/21 [==============================] - 11s 530ms/step - loss: 0.0411 - acc: 0.9861 - val_loss: 0.0343 - val_acc: 0.9894\n",
+ "Epoch 25/50\n",
+ "21/21 [==============================] - 11s 528ms/step - loss: 0.0535 - acc: 0.9812 - val_loss: 0.0333 - val_acc: 0.9889\n",
+ "Epoch 26/50\n",
+ "21/21 [==============================] - 11s 529ms/step - loss: 0.0418 - acc: 0.9848 - val_loss: 0.0341 - val_acc: 0.9889\n",
+ "Epoch 27/50\n",
+ "21/21 [==============================] - 11s 528ms/step - loss: 0.0484 - acc: 0.9820 - val_loss: 0.0334 - val_acc: 0.9885\n",
+ "Epoch 28/50\n",
+ "21/21 [==============================] - 11s 527ms/step - loss: 0.0474 - acc: 0.9823 - val_loss: 0.0339 - val_acc: 0.9885\n",
+ "Epoch 29/50\n",
+ "21/21 [==============================] - 11s 529ms/step - loss: 0.0452 - acc: 0.9831 - val_loss: 0.0334 - val_acc: 0.9889\n",
+ "Epoch 30/50\n",
+ "21/21 [==============================] - 11s 531ms/step - loss: 0.0465 - acc: 0.9833 - val_loss: 0.0325 - val_acc: 0.9889\n",
+ "Epoch 31/50\n",
+ "21/21 [==============================] - 11s 530ms/step - loss: 0.0419 - acc: 0.9860 - val_loss: 0.0327 - val_acc: 0.9889\n",
+ "Epoch 32/50\n",
+ "21/21 [==============================] - 11s 528ms/step - loss: 0.0415 - acc: 0.9854 - val_loss: 0.0326 - val_acc: 0.9889\n",
+ "Epoch 33/50\n",
+ "21/21 [==============================] - 11s 529ms/step - loss: 0.0450 - acc: 0.9842 - val_loss: 0.0320 - val_acc: 0.9898\n",
+ "Epoch 34/50\n",
+ "21/21 [==============================] - 11s 529ms/step - loss: 0.0419 - acc: 0.9863 - val_loss: 0.0325 - val_acc: 0.9889\n",
+ "Epoch 35/50\n",
+ "21/21 [==============================] - 11s 528ms/step - loss: 0.0447 - acc: 0.9841 - val_loss: 0.0318 - val_acc: 0.9898\n",
+ "Epoch 36/50\n",
+ "21/21 [==============================] - 11s 530ms/step - loss: 0.0417 - acc: 0.9848 - val_loss: 0.0317 - val_acc: 0.9894\n",
+ "Epoch 37/50\n",
+ "21/21 [==============================] - 11s 532ms/step - loss: 0.0464 - acc: 0.9850 - val_loss: 0.0318 - val_acc: 0.9894\n",
+ "Epoch 38/50\n",
+ "21/21 [==============================] - 11s 530ms/step - loss: 0.0355 - acc: 0.9878 - val_loss: 0.0320 - val_acc: 0.9898\n",
+ "Epoch 39/50\n",
+ "21/21 [==============================] - 11s 529ms/step - loss: 0.0452 - acc: 0.9829 - val_loss: 0.0326 - val_acc: 0.9898\n",
+ "Epoch 40/50\n",
+ "21/21 [==============================] - 11s 528ms/step - loss: 0.0373 - acc: 0.9875 - val_loss: 0.0320 - val_acc: 0.9898\n",
+ "Epoch 41/50\n",
+ "21/21 [==============================] - 11s 528ms/step - loss: 0.0389 - acc: 0.9858 - val_loss: 0.0312 - val_acc: 0.9894\n",
+ "Epoch 42/50\n",
+ "21/21 [==============================] - 11s 528ms/step - loss: 0.0416 - acc: 0.9867 - val_loss: 0.0310 - val_acc: 0.9898\n",
+ "Epoch 43/50\n",
+ "21/21 [==============================] - 11s 528ms/step - loss: 0.0400 - acc: 0.9863 - val_loss: 0.0315 - val_acc: 0.9898\n",
+ "Epoch 44/50\n",
+ "21/21 [==============================] - 11s 528ms/step - loss: 0.0420 - acc: 0.9835 - val_loss: 0.0313 - val_acc: 0.9898\n",
+ "Epoch 45/50\n",
+ "21/21 [==============================] - 11s 528ms/step - loss: 0.0423 - acc: 0.9856 - val_loss: 0.0305 - val_acc: 0.9894\n",
+ "Epoch 46/50\n",
+ "21/21 [==============================] - 11s 530ms/step - loss: 0.0353 - acc: 0.9871 - val_loss: 0.0311 - val_acc: 0.9894\n",
+ "Epoch 47/50\n",
+ "21/21 [==============================] - 11s 529ms/step - loss: 0.0439 - acc: 0.9837 - val_loss: 0.0329 - val_acc: 0.9898\n",
+ "Epoch 48/50\n",
+ "21/21 [==============================] - 11s 529ms/step - loss: 0.0409 - acc: 0.9858 - val_loss: 0.0310 - val_acc: 0.9894\n",
+ "Epoch 49/50\n",
+ "21/21 [==============================] - 11s 527ms/step - loss: 0.0386 - acc: 0.9858 - val_loss: 0.0298 - val_acc: 0.9898\n",
+ "Epoch 50/50\n",
+ "21/21 [==============================] - 11s 529ms/step - loss: 0.0357 - acc: 0.9886 - val_loss: 0.0306 - val_acc: 0.9894\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 20,
+ "metadata": {
+ "tags": []
+ },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Train the model.\n",
+ "model.fit(xs, ys, batch_size=256, validation_split=0.3, shuffle=True, epochs=50)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 139
+ },
+ "colab_type": "code",
+ "id": "LFHnTUroi_3u",
+ "outputId": "8a353c2d-b154-41fe-a53c-2d818bebe074"
+ },
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/usr/local/lib/python3.6/dist-packages/tensorflowjs/converters/keras_h5_conversion.py:123: H5pyDeprecationWarning: The default file mode will change to 'r' (read-only) in h5py 3.0. To suppress this warning, pass the mode you need to h5py.File(), or set the global default h5.get_config().default_file_mode, or set the environment variable H5PY_DEFAULT_READONLY=1. Available modes are: 'r', 'r+', 'w', 'w-'/'x', 'a'. See the docs for details.\n",
+ " return h5py.File(h5file)\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "total 5.5M\n",
+ "-rw-r--r-- 1 root root 4.0M Aug 10 13:34 group1-shard1of2.bin\n",
+ "-rw-r--r-- 1 root root 1.5M Aug 10 13:34 group1-shard2of2.bin\n",
+ "-rw-r--r-- 1 root root 65 Aug 10 13:34 metadata.json\n",
+ "-rw-r--r-- 1 root root 6.2K Aug 10 13:34 model.json\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Convert the model to TensorFlow.js Layers model format.\n",
+ "\n",
+ "tfjs_model_dir = \"/tmp/tfjs-model\"\n",
+ "tfjs.converters.save_keras_model(model, tfjs_model_dir)\n",
+ "\n",
+ "# Create the metadata.json file.\n",
+ "metadata = {\"words\": [\"_background_noise_\"] + WORDS[1:], \"frameSize\": model.input_shape[-2]}\n",
+ "with open(os.path.join(tfjs_model_dir, \"metadata.json\"), \"w\") as f:\n",
+ " json.dump(metadata, f)\n",
+ "\n",
+ "!ls -lh /tmp/tfjs_model"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "To deploy this model to the web, you can use the\n",
+ "[speech-commands NPM package](https://www.npmjs.com/package/@tensorflow-models/speech-commands).\n",
+ "\n",
+ "The model.json and metadata.json should be hosted together with the two weights (.bin) files in the same HTTP/HTTPS directory.\n",
+ "\n",
+ "Then the custom model can be loaded in JavaScript with:\n",
+ "\n",
+ "```js\n",
+ "import * as tf from '@tensorflow/tfjs-core';\n",
+ "import * as tfl from '@tensorflow/tfjs-layers';\n",
+ "import * as speechCommands from '@tensorflow-models/speech-commands';\n",
+ "\n",
+ "const recognizer = speechCommands.create(\n",
+ " 'BROWSER_FFT',\n",
+ " null,\n",
+ " 'http://test.com/my-audio-model/model.json', // URL to the custom model's model.json\n",
+ " 'http://test.com/my-audio-model/metadata.json' // URL to the custom model's metadata.json\n",
+ ");\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 357
+ },
+ "colab_type": "code",
+ "id": "AZDMFkxulS8C",
+ "outputId": "cbd28071-1a09-43f5-a16f-2b793e3fc4e1"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Model: \"CombinedModel\"\n",
+ "_________________________________________________________________\n",
+ "Layer (type) Output Shape Param # \n",
+ "=================================================================\n",
+ "audio_preproc (Sequential) (None, None, None, 1) 2048 \n",
+ "_________________________________________________________________\n",
+ "TransferLearnedModel (Sequen (None, 3) 1434667 \n",
+ "=================================================================\n",
+ "Total params: 1,436,715\n",
+ "Trainable params: 6,003\n",
+ "Non-trainable params: 1,430,712\n",
+ "_________________________________________________________________\n",
+ "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/training/tracking/tracking.py:111: Model.state_updates (from tensorflow.python.keras.engine.training) is deprecated and will be removed in a future version.\n",
+ "Instructions for updating:\n",
+ "This property should not be used in TensorFlow 2.0, as updates are applied automatically.\n",
+ "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/training/tracking/tracking.py:111: Layer.updates (from tensorflow.python.keras.engine.base_layer) is deprecated and will be removed in a future version.\n",
+ "Instructions for updating:\n",
+ "This property should not be used in TensorFlow 2.0, as updates are applied automatically.\n",
+ "INFO:tensorflow:Assets written to: /tmp/tmp865tq81o/assets\n",
+ "Saved tflite file at: /tmp/tfjs-sc-model/combined_model.tflite\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Convert the model to TFLite. \n",
+ "\n",
+ "# We need to combine the preprocessing model and the newly trained 3-class model\n",
+ "# so that the resultant model will be able to preform STFT and spectrogram \n",
+ "# calculation on mobile devices (i.e., without web browser's WebAudio).\n",
+ "\n",
+ "combined_model = tf.keras.Sequential(name='CombinedModel')\n",
+ "combined_model.add(preproc_model)\n",
+ "combined_model.add(model)\n",
+ "combined_model.build([None, EXPECTED_WAVEFORM_LEN])\n",
+ "combined_model.summary()\n",
+ "\n",
+ "tflite_output_path = '/tmp/tfjs-sc-model/combined_model.tflite'\n",
+ "converter = tf.lite.TFLiteConverter.from_keras_model(combined_model)\n",
+ "converter.target_spec.supported_ops = [\n",
+ " tf.lite.OpsSet.TFLITE_BUILTINS, tf.lite.OpsSet.SELECT_TF_OPS\n",
+ "]\n",
+ "with open(tflite_output_path, 'wb') as f:\n",
+ " f.write(converter.convert())\n",
+ "print(\"Saved tflite file at: %s\" % tflite_output_path)"
+ ]
+ }
+ ],
+ "metadata": {
+ "colab": {
+ "collapsed_sections": [],
+ "name": "training_custom_audio_model_in_python.ipynb",
+ "provenance": [],
+ "toc_visible": true
+ },
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
diff --git a/音频分类/speech-commands/training/soft-fft/README.md b/音频分类/speech-commands/training/soft-fft/README.md
new file mode 100644
index 0000000..3e55933
--- /dev/null
+++ b/音频分类/speech-commands/training/soft-fft/README.md
@@ -0,0 +1,125 @@
+# Training a TensorFlow.js model for Speech Commands Using node.js
+
+## Preparing data for training
+
+Before you can train your model that uses spectrogram from the browser's
+WebAudio as input features, you need to download the speech-commands [data set v0.01](https://storage.cloud.google.com/download.tensorflow.org/data/speech_commands_v0.01.tar.gz) or [data set v0.02](https://storage.cloud.google.com/download.tensorflow.org/data/speech_commands_v0.02.tar.gz).
+
+## Training the TensorFlow.js Model
+
+The node.js training package comes with a command line tool that will assist your training. Here are the steps:
+1. Prepare the node modules dependecies:
+
+```bash
+yarn
+```
+
+2. Start the CLI program:
+
+```none
+yarn start
+```
+
+Following are command supported by the CLI:
+
+```none
+ Commands:
+
+ help [command...] Provides help for a given command.
+ exit Exits application.
+ create_model [labels...] create the audio model
+ load_dataset all Load all the data from the root directory by the labels
+ load_dataset Load the dataset from the directory with the label
+ dataset size Show the size of the dataset
+ train [epoch] train all audio dataset
+ save_model save the audio model
+
+```
+
+3. You need to first create a model. For example create a model with four labels (up down left right):
+
+```none
+local@piyu~$ create up down left right
+
+_________________________________________________________________
+Layer (type) Output shape Param #
+=================================================================
+conv2d_Conv2D1 (Conv2D) [null,95,39,8] 72
+_________________________________________________________________
+max_pooling2d_MaxPooling2D1 [null,47,19,8] 0
+_________________________________________________________________
+conv2d_Conv2D2 (Conv2D) [null,44,18,32] 2080
+_________________________________________________________________
+max_pooling2d_MaxPooling2D2 [null,22,9,32] 0
+_________________________________________________________________
+conv2d_Conv2D3 (Conv2D) [null,19,8,32] 8224
+_________________________________________________________________
+max_pooling2d_MaxPooling2D3 [null,9,4,32] 0
+_________________________________________________________________
+conv2d_Conv2D4 (Conv2D) [null,6,3,32] 8224
+_________________________________________________________________
+max_pooling2d_MaxPooling2D4 [null,5,1,32] 0
+_________________________________________________________________
+flatten_Flatten1 (Flatten) [null,160] 0
+_________________________________________________________________
+dense_Dense1 (Dense) [null,2000] 322000
+_________________________________________________________________
+dropout_Dropout1 (Dropout) [null,2000] 0
+_________________________________________________________________
+dense_Dense2 (Dense) [null,4] 8004
+=================================================================
+Total params: 348604
+Trainable params: 348604
+Non-trainable params: 0
+
+```
+
+4. Load the dataset.
+You can use 'load_dataset all' command to load data for all labels that is configure for the previously created model. The root directory is where you untar the dataset file to. Each label should have corresponding directory in that root directory.
+
+```none
+local@piyu~$ load_dataset all /tmp/audio/data
+
+✔ finished loading label: up (0)
+✔ finished loading label: left (2)
+✔ finished loading label: down (1)
+✔ finished loading label: right (3)
+
+```
+
+You can also load data per label using 'load' command. For example loading data for the 'up' label.
+
+```none
+local@piyu~$ load_dataset /tmp/audio/data/up up
+```
+
+5. Show the dataset stats. You can review the dataset size and shape by running 'dataset size' command.
+
+```none
+local@piyu~$ dataset size
+
+dataset size = xs: 8534,98,40,1 ys: 8534,4
+```
+
+6. Training the model. You can also specify the epochs for the 'train' command.
+
+```none
+local@piyu~$ train 5
+
+✔ epoch: 0, loss: 1.35054, accuracy: 0.34792, validation accuracy: 0.42740
+✔ epoch: 1, loss: 1.23458, accuracy: 0.45339, validation accuracy: 0.50351
+✔ epoch: 2, loss: 1.06478, accuracy: 0.55833, validation accuracy: 0.62529
+✔ epoch: 3, loss: 0.88953, accuracy: 0.63073, validation accuracy: 0.68735
+✔ epoch: 4, loss: 0.78241, accuracy: 0.67799, validation accuracy: 0.73770
+
+```
+
+7 Save the trained model.
+
+```none
+local@piyu~$ save_model /tmp/audio_model
+
+✔ /tmp/audio_model saved.
+```
+
+## Development
\ No newline at end of file
diff --git a/音频分类/speech-commands/training/soft-fft/audio_model.ts b/音频分类/speech-commands/training/soft-fft/audio_model.ts
new file mode 100644
index 0000000..6ca8eb4
--- /dev/null
+++ b/音频分类/speech-commands/training/soft-fft/audio_model.ts
@@ -0,0 +1,229 @@
+/**
+ * @license
+ * Copyright 2019 Google LLC. All Rights Reserved.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =============================================================================
+ */
+
+import * as tf from '@tensorflow/tfjs-core';
+import * as tfl from '@tensorflow/tfjs-layers';
+import * as fs from 'fs';
+///
+import * as wav from 'node-wav';
+import * as path from 'path';
+
+import {Dataset} from './dataset';
+
+import {WavFileFeatureExtractor} from './wav_file_feature_extractor';
+
+/**
+ * Audio Model that creates tf.Model for a fix amount of labels. It requires a
+ * feature extractor to convert the audio stream into input tensors for the
+ * internal tf.Model.
+ * It provide datasets loading, training, and model saving functions.
+ */
+export class AudioModel {
+ private model: tfl.LayersModel;
+
+ /**
+ *
+ * @param inputShape Input tensor shape.
+ * @param labels Audio command label list
+ * @param dataset Dataset class to store the loaded data.
+ * @param featureExtractor converter to extractor features from audio stream
+ * as input tensors
+ */
+ constructor(
+ inputShape: number[], private labels: string[], private dataset: Dataset,
+ private featureExtractor: WavFileFeatureExtractor) {
+ this.featureExtractor.config({
+ melCount: 40,
+ bufferLength: 480,
+ hopLength: 160,
+ targetSr: 16000,
+ isMfccEnabled: true,
+ duration: 1.0
+ });
+
+ this.model = this.createModel(inputShape);
+ }
+
+ private createModel(inputShape: number[]): tfl.LayersModel {
+ const model = tfl.sequential();
+ model.add(tfl.layers.conv2d(
+ {filters: 8, kernelSize: [4, 2], activation: 'relu', inputShape}));
+ model.add(tfl.layers.maxPooling2d({poolSize: [2, 2], strides: [2, 2]}));
+ model.add(tfl.layers.conv2d(
+ {filters: 32, kernelSize: [4, 2], activation: 'relu'}));
+ model.add(tfl.layers.maxPooling2d({poolSize: [2, 2], strides: [2, 2]}));
+ model.add(tfl.layers.conv2d(
+ {filters: 32, kernelSize: [4, 2], activation: 'relu'}));
+ model.add(tfl.layers.maxPooling2d({poolSize: [2, 2], strides: [2, 2]}));
+ model.add(tfl.layers.conv2d(
+ {filters: 32, kernelSize: [4, 2], activation: 'relu'}));
+ model.add(tfl.layers.maxPooling2d({poolSize: [2, 2], strides: [1, 2]}));
+ model.add(tfl.layers.flatten({}));
+ model.add(tfl.layers.dropout({rate: 0.25}));
+ model.add(tfl.layers.dense({units: 2000, activation: 'relu'}));
+ model.add(tfl.layers.dropout({rate: 0.5}));
+ model.add(
+ tfl.layers.dense({units: this.labels.length, activation: 'softmax'}));
+
+ model.compile({
+ loss: 'categoricalCrossentropy',
+ optimizer: tf.train.sgd(0.01),
+ metrics: ['accuracy']
+ });
+ model.summary();
+ return model;
+ }
+
+ /**
+ * Load all dataset for the root directory, all the subdirectories that have
+ * matching name to the entries in model label list, contained audio files
+ * will be converted to input tensors and stored in the dataset for training.
+ * @param dir The root directory of the audio dataset
+ * @param callback Callback function for display training logs
+ */
+ async loadAll(dir: string, callback: Function) {
+ const promises = [];
+ this.labels.forEach(async (label, index) => {
+ callback(`loading label: ${label} (${index})`);
+ promises.push(
+ this.loadDataArray(path.resolve(dir, label), callback).then(v => {
+ callback(`finished loading label: ${label} (${index})`, true);
+ return [v, index];
+ }));
+ });
+
+ let allSpecs = await Promise.all(promises);
+ allSpecs = allSpecs
+ .map((specs, i) => {
+ const index = specs[1];
+ return specs[0].map(spec => [spec, index]);
+ })
+ .reduce((acc, currentValue) => acc.concat(currentValue), []);
+
+ tf.util.shuffle(allSpecs);
+ const specs = allSpecs.map(spec => spec[0]);
+ const labels = allSpecs.map(spec => spec[1]);
+ this.dataset.addExamples(
+ this.melSpectrogramToInput(specs),
+ tf.oneHot(labels, this.labels.length));
+ }
+
+ /**
+ * Load one dataset from directory, all contained audio files
+ * will be converted to input tensors and stored in the dataset for training.
+ * @param dir The directory of the audio dataset
+ * @param label The label for the audio dataset
+ * @param callback Callback function for display training logs
+ */
+ async loadData(dir: string, label: string, callback: Function) {
+ const index = this.labels.indexOf(label);
+ const specs = await this.loadDataArray(dir, callback);
+ this.dataset.addExamples(
+ this.melSpectrogramToInput(specs),
+ tf.oneHot(tf.fill([specs.length], index, 'int32'), this.labels.length));
+ }
+
+ private loadDataArray(dir: string, callback: Function) {
+ return new Promise((resolve, reject) => {
+ fs.readdir(dir, (err, filenames) => {
+ if (err) {
+ reject(err);
+ }
+ let specs: Float32Array[][] = [];
+ filenames.forEach((filename) => {
+ callback('decoding ' + dir + '/' + filename + '...');
+ const spec = this.splitSpecs(this.decode(dir + '/' + filename));
+ if (!!spec) {
+ specs = specs.concat(spec);
+ }
+ callback('decoding ' + dir + '/' + filename + '...done');
+ });
+ resolve(specs);
+ });
+ });
+ }
+
+ private decode(filename: string) {
+ const result = wav.decode(fs.readFileSync(filename));
+ return this.featureExtractor.start(result.channelData[0]);
+ }
+
+ /**
+ * Train the model for stored dataset. The method call be called multiple
+ * times.
+ * @param epochs iteration of the training
+ * @param trainCallback
+ */
+ async train(epochs?: number, trainCallback?: tfl.CustomCallbackArgs) {
+ return this.model.fit(this.dataset.xs, this.dataset.ys, {
+ batchSize: 64,
+ epochs: epochs || 100,
+ shuffle: true,
+ validationSplit: 0.1,
+ callbacks: trainCallback
+ });
+ }
+
+ /**
+ * Save the model to the specified directory.
+ * @param dir Directory to store the model.
+ */
+ save(dir: string): Promise {
+ return this.model.save('file://' + dir);
+ }
+
+ /**
+ * Return the size of the dataset in string.
+ */
+ size(): string {
+ return this.dataset.xs ?
+ `xs: ${this.dataset.xs.shape} ys: ${this.dataset.ys.shape}` :
+ '0';
+ }
+
+ private splitSpecs(spec: Float32Array[]) {
+ if (spec.length >= 98) {
+ const output = [];
+ for (let i = 0; i <= (spec.length - 98); i += 32) {
+ output.push(spec.slice(i, i + 98));
+ }
+ return output;
+ }
+ return undefined;
+ }
+
+ private melSpectrogramToInput(specs: Float32Array[][]): tf.Tensor {
+ // Flatten this spectrogram into a 2D array.
+ const batch = specs.length;
+ const times = specs[0].length;
+ const freqs = specs[0][0].length;
+ const data = new Float32Array(batch * times * freqs);
+ console.log(data.length);
+ for (let j = 0; j < batch; j++) {
+ const spec = specs[j];
+ for (let i = 0; i < times; i++) {
+ const mel = spec[i];
+ const offset = j * freqs * times + i * freqs;
+ data.set(mel, offset);
+ }
+ }
+ // Normalize the whole input to be in [0, 1].
+ const shape: [number, number, number, number] = [batch, times, freqs, 1];
+ // this.normalizeInPlace(data, 0, 1);
+ return tf.tensor4d(data, shape);
+ }
+}
diff --git a/音频分类/speech-commands/training/soft-fft/cli.ts b/音频分类/speech-commands/training/soft-fft/cli.ts
new file mode 100644
index 0000000..6bee2dc
--- /dev/null
+++ b/音频分类/speech-commands/training/soft-fft/cli.ts
@@ -0,0 +1,139 @@
+/**
+ * @license
+ * Copyright 2019 Google LLC. All Rights Reserved.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =============================================================================
+ */
+
+// Load the binding
+import '@tensorflow/tfjs-node';
+
+import chalk from 'chalk';
+import * as ora from 'ora';
+import * as Vorpal from 'vorpal';
+
+import {AudioModel} from './audio_model';
+import {Dataset} from './dataset';
+import {WavFileFeatureExtractor} from './wav_file_feature_extractor';
+
+// tslint:disable-next-line:no-any
+(global as any).AudioContext = class AudioContext {};
+
+export const MODEL_SHAPE = [98, 40, 1];
+export const labelsMsg = [
+ {type: 'input', name: 'labels', message: 'Enter labels (seperate by comma)'}
+];
+export const trainingMsg = [
+ {type: 'input', name: 'dir', message: 'Enter file directory'},
+ {type: 'input', name: 'label', message: 'Enter label for the directory'}
+];
+export const filenameMsg = [{
+ type: 'input',
+ name: 'filename',
+ message: 'Enter target filename for the model'
+}];
+let model: AudioModel;
+let labels: string[];
+const vorpal = new Vorpal();
+let spinner = ora();
+vorpal.command('create_model [labels...]')
+ .alias('c')
+ .description('create the audio model')
+ .action((args, cb) => {
+ console.log(args.labels);
+ labels = args.labels as string[];
+ model = new AudioModel(
+ MODEL_SHAPE, labels, new Dataset(labels.length),
+ new WavFileFeatureExtractor());
+ cb();
+ });
+
+vorpal
+ .command(
+ 'load_dataset all ',
+ 'Load all the data from the root directory by the labels')
+ .alias('la')
+ .action((args) => {
+ spinner.start('load dataset ...');
+ return model
+ .loadAll(
+ args.dir as string,
+ (text: string, finished?: boolean) => {
+ if (finished) {
+ spinner.succeed(text);
+ } else {
+ spinner.start();
+ spinner.text = text;
+ spinner.render();
+ }
+ })
+ .then(() => spinner.stop());
+ });
+vorpal
+ .command(
+ 'load_dataset ',
+ 'Load the dataset from the directory with the label')
+ .alias('l')
+ .action((args) => {
+ spinner = ora('creating tensors ...');
+ spinner.start();
+ return model
+ .loadData(
+ args.dir as string, args.label as string,
+ (text: string) => {
+ // console.log(text);
+ spinner.text = text;
+ spinner.render();
+ })
+ .then(() => spinner.stop(), (err) => {
+ spinner.fail(`failed to load: ${err}`);
+ });
+ });
+vorpal.command('dataset size', 'Show the size of the dataset')
+ .alias('d')
+ .action((args, cb) => {
+ console.log(chalk.green(`dataset size = ${model.size()}`));
+ cb();
+ });
+vorpal.command('train [epoch]')
+ .alias('t')
+ .description('train all audio dataset')
+ .action((args) => {
+ spinner = ora('training models ...').start();
+ return model
+ .train(parseInt(args.epoch as string, 10) || 20, {
+ onBatchEnd: async (batch, logs) => {
+ spinner.text = chalk.green(`loss: ${logs.loss.toFixed(5)}`);
+ spinner.render();
+ },
+ onEpochEnd: async (epoch, logs) => {
+ spinner.succeed(chalk.green(
+ `epoch: ${epoch}, loss: ${logs.loss.toFixed(5)}` +
+ `, accuracy: ${logs.acc.toFixed(5)}` +
+ `, validation accuracy: ${logs.val_acc.toFixed(5)}`));
+ spinner.start();
+ }
+ })
+ .then(() => spinner.stop());
+ });
+vorpal.command('save_model ')
+ .alias('s')
+ .description('save the audio model')
+ .action((args) => {
+ spinner.start(`saving to ${args.filename} ...`);
+ return model.save(args.filename as string).then(() => {
+ spinner.succeed(`${args.filename} saved.`);
+ }, () => spinner.fail(`failed to save ${args.filename}`));
+ });
+
+vorpal.show();
diff --git a/音频分类/speech-commands/training/soft-fft/dataset.ts b/音频分类/speech-commands/training/soft-fft/dataset.ts
new file mode 100644
index 0000000..f18e295
--- /dev/null
+++ b/音频分类/speech-commands/training/soft-fft/dataset.ts
@@ -0,0 +1,54 @@
+/**
+ * @license
+ * Copyright 2019 Google LLC. All Rights Reserved.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =============================================================================
+ */
+import * as tf from '@tensorflow/tfjs-core';
+
+/**
+ * A dataset for webcam controls which allows the user to add example Tensors
+ * for particular labels. This object will concat them into two large xs and ys.
+ */
+export class Dataset {
+ xs: tf.Tensor;
+ ys: tf.Tensor;
+ constructor(public numClasses: number) {}
+
+ /**
+ * Adding data pair to the dataset, examples and labels should have the
+ * matching shape. For example, if the input shape is [2, 20, 20], 2 is the
+ * batch size, the labels shape should be [2,10] (num of classes is 10).
+ *
+ * @param examples Batch of inputs
+ * @param labels Matching labels for inputs
+ */
+ addExamples(examples: tf.Tensor, labels: tf.Tensor) {
+ if (this.xs == null) {
+ // For the first example that gets added, keep example and y so that the
+ // Dataset owns the memory of the inputs. This makes sure that
+ // if addExample() is called in a tf.tidy(), these Tensors will not get
+ // disposed.
+ this.xs = tf.keep(examples);
+ this.ys = tf.keep(labels);
+ } else {
+ const oldX = this.xs;
+ this.xs = tf.keep(this.xs.concat(examples, 0));
+
+ const oldY = this.ys;
+ this.ys = tf.keep(oldY.concat(labels, 0));
+ oldX.dispose();
+ oldY.dispose();
+ }
+ }
+}
diff --git a/音频分类/speech-commands/training/soft-fft/package.json b/音频分类/speech-commands/training/soft-fft/package.json
new file mode 100644
index 0000000..80e44bc
--- /dev/null
+++ b/音频分类/speech-commands/training/soft-fft/package.json
@@ -0,0 +1,38 @@
+{
+ "name": "audio-command-model-node",
+ "version": "0.0.1",
+ "description": "tfjs audio command model training in node.js",
+ "main": "./cli",
+ "license": "Apache-2.0",
+ "private": true,
+ "bin": "./cli",
+ "dependencies": {
+ "@tensorflow/tfjs": "^3.3.0",
+ "@tensorflow/tfjs-node": "^3.3.0",
+ "chalk": "^2.4.1",
+ "vorpal": "1.12.0",
+ "node-wav": "^0.0.2",
+ "ora": "^2.1.0",
+ "ts-node": "7.0.0",
+ "dct": "^0.0.3",
+ "kissfft-js": "0.1.8"
+ },
+ "scripts": {
+ "build": "tsc",
+ "lint": "tslint -p . -t verbose",
+ "start": "nodemon --exec ts-node -- cli.ts",
+ "ts-node": "ts-node cli.ts"
+ },
+ "devDependencies": {
+ "@types/chalk": "^2.2.0",
+ "@types/node": "^10.5.2",
+ "@types/ora": "^1.3.4",
+ "@types/inquirer": "^0.0.42",
+ "@types/minimist": "^1.2.0",
+ "clang-format": "~1.2.2",
+ "typescript": "3.5.3",
+ "nodemon": "1.18.2",
+ "tslint": "~6.1.3",
+ "tslint-no-circular-imports": "~0.7.0"
+ }
+}
diff --git a/音频分类/speech-commands/training/soft-fft/tsconfig.json b/音频分类/speech-commands/training/soft-fft/tsconfig.json
new file mode 100644
index 0000000..cd7fe01
--- /dev/null
+++ b/音频分类/speech-commands/training/soft-fft/tsconfig.json
@@ -0,0 +1,26 @@
+{
+ "compilerOptions": {
+ "module": "commonjs",
+ //"noImplicitAny": true,
+ "sourceMap": true,
+ "removeComments": true,
+ "preserveConstEnums": true,
+ "declaration": true,
+ "target": "es5",
+ "lib": ["es2015", "dom"],
+ "outDir": "./dist",
+ "noUnusedLocals": true,
+ "noImplicitReturns": true,
+ "noImplicitThis": true,
+ "alwaysStrict": true,
+ "noUnusedParameters": false,
+ "pretty": true,
+ "noFallthroughCasesInSwitch": true,
+ "allowUnreachableCode": false,
+ "downlevelIteration": true,
+ "moduleResolution": "node"
+ },
+ "include": [
+ "*.ts", "utils/**/*"
+ ]
+}
diff --git a/音频分类/speech-commands/training/soft-fft/types/node-wav.d.ts b/音频分类/speech-commands/training/soft-fft/types/node-wav.d.ts
new file mode 100644
index 0000000..d2d55d3
--- /dev/null
+++ b/音频分类/speech-commands/training/soft-fft/types/node-wav.d.ts
@@ -0,0 +1,17 @@
+/**
+ * @license
+ * Copyright 2019 Google LLC. All Rights Reserved.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =============================================================================
+ */
+declare module 'node-wav';
diff --git a/音频分类/speech-commands/training/soft-fft/types/vorpal.d.ts b/音频分类/speech-commands/training/soft-fft/types/vorpal.d.ts
new file mode 100644
index 0000000..773e00d
--- /dev/null
+++ b/音频分类/speech-commands/training/soft-fft/types/vorpal.d.ts
@@ -0,0 +1,18 @@
+/**
+ * @license
+ * Copyright 2019 Google LLC. All Rights Reserved.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =============================================================================
+ */
+
+declare module 'vorpal';
diff --git a/音频分类/speech-commands/training/soft-fft/utils/audio_utils.ts b/音频分类/speech-commands/training/soft-fft/utils/audio_utils.ts
new file mode 100644
index 0000000..d06904d
--- /dev/null
+++ b/音频分类/speech-commands/training/soft-fft/utils/audio_utils.ts
@@ -0,0 +1,259 @@
+/**
+ * Copyright 2019 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+import * as DCT from 'dct';
+import * as KissFFT from 'kissfft-js';
+
+const SR = 16000;
+const hannWindowMap: {[key: number]: number[]} = {};
+let context: AudioContext;
+
+export class AudioUtils {
+ startIndex = 0;
+ endIndex = 0;
+ bandMapper: number[] = [];
+ context: AudioContext;
+
+ constructor() {}
+
+ /**
+ * Gets periodic hann window
+ * @param windowLength size of the hann window
+ * @returns periodic hann map
+ */
+ GetPeriodicHann(windowLength: number): number[] {
+ if (!hannWindowMap[windowLength]) {
+ const window = [];
+ // Some platforms don't have M_PI, so define a local constant here.
+ for (let i = 0; i < windowLength; ++i) {
+ window[i] = 0.5 - 0.5 * Math.cos((2 * Math.PI * i) / windowLength);
+ }
+ hannWindowMap[windowLength] = window;
+ }
+ return hannWindowMap[windowLength];
+ }
+
+ /**
+ * Calculates the FFT for an array buffer. Output is an array.
+ */
+ fft(y: Float32Array) {
+ const window = this.GetPeriodicHann(y.length);
+ y = y.map((v, index) => v * window[index]);
+ const fftSize = nextPowerOfTwo(y.length);
+ for (let i = y.length; i < fftSize; i++) {
+ y[i] = 0;
+ }
+ const fftr = new KissFFT.FFTR(fftSize);
+ const transform = fftr.forward(y);
+ fftr.dispose();
+ transform[fftSize] = transform[1];
+ transform[fftSize + 1] = 0;
+ transform[1] = 0;
+ return transform;
+ }
+
+ /**
+ * Calculate the DCT encoding for spectrogram.
+ * @param y spectrogram data
+ * @returns DCT encoded
+ */
+ dct(y: Float32Array): Float32Array {
+ const scale = Math.sqrt(2.0 / y.length);
+ return DCT(y, scale);
+ }
+
+ /**
+ * Given an interlaced complex array (y_i is real, y_(i+1) is imaginary),
+ * calculates the energies. Output is half the size.
+ */
+ fftEnergies(y: Float32Array): Float32Array {
+ const out = new Float32Array(y.length / 2);
+ for (let i = 0; i < y.length / 2; i++) {
+ out[i] = y[i * 2] * y[i * 2] + y[i * 2 + 1] * y[i * 2 + 1];
+ }
+ return out;
+ }
+
+ /**
+ * Creates mel filterbank map for the give melCount size
+ * @param fftSize FFT frequence count
+ * @param [melCount] Mel filterbank count
+ * @param [lowHz] low bank filter frequence
+ * @param [highHz] high bank filter frequence
+ * @param [sr] sampling rate
+ * @returns mel filterbank map
+ */
+ createMelFilterbank(
+ fftSize: number, melCount = 40, lowHz = 20, highHz = 4000,
+ sr = SR): Float32Array {
+ const lowMel = this.hzToMel(lowHz);
+ const highMel = this.hzToMel(highHz);
+
+ // Construct linearly spaced array of melCount intervals, between lowMel and
+ // highMel.
+ const mels = [];
+
+ const melSpan = highMel - lowMel;
+ const melSpacing = melSpan / (melCount + 1);
+ for (let i = 0; i < melCount + 1; ++i) {
+ mels[i] = lowMel + (melSpacing * (i + 1));
+ }
+
+ // Always exclude DC; emulate HTK.
+ const hzPerSbin = 0.5 * sr / (fftSize - 1);
+ this.startIndex = Math.floor(1.5 + (lowHz / hzPerSbin));
+ this.endIndex = Math.ceil(highHz / hzPerSbin);
+
+ // Maps the input spectrum bin indices to filter bank channels/indices. For
+ // each FFT bin, band_mapper tells us which channel this bin contributes to
+ // on the right side of the triangle. Thus this bin also contributes to the
+ // left side of the next channel's triangle response.
+ this.bandMapper = [];
+ let channel = 0;
+ for (let i = 0; i < fftSize; ++i) {
+ const melf = this.hzToMel(i * hzPerSbin);
+ if ((i < this.startIndex) || (i > this.endIndex)) {
+ this.bandMapper[i] = -2; // Indicate an unused Fourier coefficient.
+ } else {
+ while ((mels[channel] < melf) && (channel < melCount)) {
+ ++channel;
+ }
+ this.bandMapper[i] = channel - 1; // Can be == -1
+ }
+ }
+
+ // Create the weighting functions to taper the band edges. The contribution
+ // of any one FFT bin is based on its distance along the continuum between
+ // two mel-channel center frequencies. This bin contributes weights_[i] to
+ // the current channel and 1-weights_[i] to the next channel.
+ const weights = new Float32Array(fftSize);
+ for (let i = 0; i < fftSize; ++i) {
+ channel = this.bandMapper[i];
+ if ((i < this.startIndex) || (i > this.endIndex)) {
+ weights[i] = 0.0;
+ } else {
+ if (channel >= 0) {
+ weights[i] = (mels[channel + 1] - this.hzToMel(i * hzPerSbin)) /
+ (mels[channel + 1] - mels[channel]);
+ } else {
+ weights[i] =
+ (mels[0] - this.hzToMel(i * hzPerSbin)) / (mels[0] - lowMel);
+ }
+ }
+ }
+
+ return weights;
+ }
+
+ /**
+ * Given an array of FFT magnitudes, apply a filterbank. Output should be an
+ * array with size |filterbank|.
+ */
+ applyFilterbank(
+ fftEnergies: Float32Array, filterbank: Float32Array,
+ melCount = 40): Float32Array {
+ const out = new Float32Array(melCount);
+ for (let i = this.startIndex; i <= this.endIndex;
+ i++) { // For each FFT bin
+ const specVal = Math.sqrt(fftEnergies[i]);
+ const weighted = specVal * filterbank[i];
+ let channel = this.bandMapper[i];
+ if (channel >= 0) {
+ out[channel] += weighted; // Right side of triangle, downward slope
+ }
+ channel++;
+ if (channel < melCount) {
+ out[channel] += (specVal - weighted); // Left side of triangle
+ }
+ }
+ for (let i = 0; i < out.length; ++i) {
+ let val = out[i];
+ if (val < 1e-12) {
+ val = 1e-12;
+ }
+ out[i] = Math.log(val);
+ }
+ return out;
+ }
+
+ private hzToMel(hz: number) {
+ return 1127.0 * Math.log(1.0 + hz / 700.0);
+ }
+
+ /**
+ * Cepstrums from the energy spectrumgram
+ * @param melEnergies array of melbank energies
+ * @returns
+ */
+ cepstrumFromEnergySpectrum(melEnergies: Float32Array) {
+ return this.dct(melEnergies);
+ }
+
+ /**
+ * Playbacks audio data from array buffer using the given sample rate.
+ * @param buffer audio data
+ * @param [sampleRate] playback sample rate
+ */
+ playbackArrayBuffer(buffer: Float32Array, sampleRate?: number) {
+ if (!context) {
+ context = new AudioContext();
+ }
+ if (!sampleRate) {
+ sampleRate = this.context.sampleRate;
+ }
+ const audioBuffer = context.createBuffer(1, buffer.length, sampleRate);
+ const audioBufferData = audioBuffer.getChannelData(0);
+ audioBufferData.set(buffer);
+
+ const source = context.createBufferSource();
+ source.buffer = audioBuffer;
+ source.connect(context.destination);
+ source.start();
+ }
+
+ /**
+ * Resamples web audio data by the target sample rate.
+ * @param audioBuffer Audio data
+ * @param targetSr Target sample rate
+ * @returns resampled web audio data
+ */
+ resampleWebAudio(audioBuffer: AudioBuffer, targetSr: number):
+ Promise {
+ const sourceSr = audioBuffer.sampleRate;
+ const lengthRes = audioBuffer.length * targetSr / sourceSr;
+ const offlineCtx = new OfflineAudioContext(1, lengthRes, targetSr);
+
+ return new Promise((resolve, reject) => {
+ const bufferSource = offlineCtx.createBufferSource();
+ bufferSource.buffer = audioBuffer;
+ offlineCtx.oncomplete = (event) => {
+ resolve(event.renderedBuffer);
+ };
+ bufferSource.connect(offlineCtx.destination);
+ bufferSource.start();
+ offlineCtx.startRendering();
+ });
+ }
+}
+
+/**
+ * Next power of two value for the given number.
+ * @param value
+ * @returns
+ */
+export function nextPowerOfTwo(value: number) {
+ const exponent = Math.ceil(Math.log2(value));
+ return 1 << exponent;
+}
diff --git a/音频分类/speech-commands/training/soft-fft/utils/circular_audio_buffer.ts b/音频分类/speech-commands/training/soft-fft/utils/circular_audio_buffer.ts
new file mode 100644
index 0000000..8d0a0eb
--- /dev/null
+++ b/音频分类/speech-commands/training/soft-fft/utils/circular_audio_buffer.ts
@@ -0,0 +1,108 @@
+/**
+ * Copyright 2019 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+/**
+ * Save Float32Array in arbitrarily sized chunks.
+ * Load Float32Array in arbitrarily sized chunks.
+ * Determine if there's enough data to grab a certain amount.
+ */
+export class CircularAudioBuffer {
+ buffer: Float32Array;
+ // The index that we are currently full up to. New data is written from
+ // [currentIndex + 1, maxLength]. Data can be read from [0, currentIndex].
+ currentIndex: number;
+
+ constructor(maxLength: number) {
+ this.buffer = new Float32Array(maxLength);
+ this.currentIndex = 0;
+ }
+
+ /**
+ * Add a new buffer of data. Called when we get new audio input samples.
+ */
+ addBuffer(newBuffer: Float32Array) {
+ // Do we have enough data in this buffer?
+ const remaining = this.buffer.length - this.currentIndex;
+ if (this.currentIndex + newBuffer.length > this.buffer.length) {
+ console.error(
+ `Not enough space to write ${newBuffer.length}` +
+ ` to this circular buffer with ${remaining} left.`);
+ return;
+ }
+ this.buffer.set(newBuffer, this.currentIndex);
+ this.currentIndex += newBuffer.length;
+ }
+
+ /**
+ * How many samples are stored currently?
+ */
+ getLength() {
+ return this.currentIndex;
+ }
+
+ /**
+ * How much space remains?
+ */
+ getRemainingLength() {
+ return this.buffer.length - this.currentIndex;
+ }
+
+ /**
+ * Return the first N samples of the buffer, and remove them. Called when we
+ * want to get a buffer of audio data of a fixed size.
+ */
+ popBuffer(length: number) {
+ // Do we have enough data to read back?
+ if (this.currentIndex < length) {
+ console.error(
+ `This circular buffer doesn't have ${length} entries in it.`);
+ return undefined;
+ }
+ if (length === 0) {
+ console.warn(`Calling popBuffer(0) does nothing.`);
+ return undefined;
+ }
+ const popped = this.buffer.slice(0, length);
+ const remaining = this.buffer.slice(length, this.buffer.length);
+ // Remove the popped entries from the buffer.
+ this.buffer.fill(0);
+ this.buffer.set(remaining, 0);
+ // Send the currentIndex back.
+ this.currentIndex -= length;
+ return popped;
+ }
+
+ /**
+ * Get the the first part of the buffer without mutating it.
+ */
+ getBuffer(length?: number) {
+ if (!length) {
+ length = this.getLength();
+ }
+ // Do we have enough data to read back?
+ if (this.currentIndex < length) {
+ console.error(
+ `This circular buffer doesn't have ${length} entries in it.`);
+ return undefined;
+ }
+ return this.buffer.slice(0, length);
+ }
+
+ clear() {
+ this.currentIndex = 0;
+ this.buffer.fill(0);
+ }
+}
diff --git a/音频分类/speech-commands/training/soft-fft/utils/dataset.ts b/音频分类/speech-commands/training/soft-fft/utils/dataset.ts
new file mode 100644
index 0000000..c55339b
--- /dev/null
+++ b/音频分类/speech-commands/training/soft-fft/utils/dataset.ts
@@ -0,0 +1,60 @@
+/**
+ * @license
+ * Copyright 2019 Google LLC. All Rights Reserved.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =============================================================================
+ */
+import * as tf from '@tensorflow/tfjs-core';
+
+/**
+ * A dataset for webcam controls which allows the user to add example Tensors
+ * for particular labels. This object will concat them into two large xs and ys.
+ */
+export class Dataset {
+ xs: tf.Tensor[];
+ ys: tf.Tensor;
+ constructor(public numClasses: number) {}
+
+ /**
+ * Adds an example to the controller dataset.
+ * @param {Tensor} example A tensor representing the example.
+ * It can be an image, an activation, or any other type of Tensor.
+ * @param {number} label The label of the example. Should be an number.
+ */
+ addExample(example: tf.Tensor|tf.Tensor[], label: number) {
+ example = Array.isArray(example) ? example : [example];
+ // One-hot encode the label.
+ const y =
+ tf.tidy(() => tf.oneHot(tf.tensor1d([label]).toInt(), this.numClasses));
+
+ if (this.xs == null) {
+ // For the first example that gets added, keep example and y so that the
+ // Dataset owns the memory of the inputs. This makes sure that
+ // if addExample() is called in a tf.tidy(), these Tensors will not get
+ // disposed.
+ this.xs = example.map(tensor => tf.keep(tensor));
+ this.ys = tf.keep(y);
+ } else {
+ const oldX = this.xs;
+ this.xs = example.map(
+ (tensor, index) => tf.keep(this.xs[index].concat(tensor, 0)));
+
+ const oldY = this.ys;
+ this.ys = tf.keep(oldY.concat(y, 0));
+
+ oldX.forEach(tensor => tensor.dispose());
+ oldY.dispose();
+ y.dispose();
+ }
+ }
+}
diff --git a/音频分类/speech-commands/training/soft-fft/utils/types.ts b/音频分类/speech-commands/training/soft-fft/utils/types.ts
new file mode 100644
index 0000000..3298e5d
--- /dev/null
+++ b/音频分类/speech-commands/training/soft-fft/utils/types.ts
@@ -0,0 +1,53 @@
+/**
+ * @license
+ * Copyright 2019 Google LLC. All Rights Reserved.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =============================================================================
+ */
+import {InferenceModel} from '@tensorflow/tfjs';
+
+export interface Params {
+ inputBufferLength?: number;
+ bufferLength?: number;
+ hopLength?: number;
+ duration?: number;
+ fftSize?: number;
+ melCount?: number;
+ targetSr?: number;
+ isMfccEnabled?: boolean;
+}
+
+export interface FeatureExtractor {
+ config(params: Params): void;
+ start(samples?: Float32Array): Promise|void;
+ stop(): void;
+ getFeatures(): Float32Array[];
+ getImages(): Float32Array[];
+}
+
+export enum ModelType {
+ FROZEN_MODEL = 0,
+ FROZEN_MODEL_NATIVE,
+ TF_MODEL
+}
+
+export const BUFFER_LENGTH = 1024;
+export const HOP_LENGTH = 444;
+export const MEL_COUNT = 40;
+export const EXAMPLE_SR = 44100;
+export const DURATION = 1.0;
+export const IS_MFCC_ENABLED = true;
+export const MIN_SAMPLE = 3;
+export const DETECTION_THRESHOLD = 0.5;
+export const SUPPRESSION_TIME = 500;
+export const MODELS: {[key: number]: InferenceModel} = {};
diff --git a/音频分类/speech-commands/training/soft-fft/utils/types/dct.d.ts b/音频分类/speech-commands/training/soft-fft/utils/types/dct.d.ts
new file mode 100644
index 0000000..7c9df65
--- /dev/null
+++ b/音频分类/speech-commands/training/soft-fft/utils/types/dct.d.ts
@@ -0,0 +1,17 @@
+/**
+ * @license
+ * Copyright 2019 Google LLC. All Rights Reserved.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =============================================================================
+ */
+declare module 'dct';
diff --git a/音频分类/speech-commands/training/soft-fft/utils/types/kissfft-js.d.ts b/音频分类/speech-commands/training/soft-fft/utils/types/kissfft-js.d.ts
new file mode 100644
index 0000000..8b8e5d1
--- /dev/null
+++ b/音频分类/speech-commands/training/soft-fft/utils/types/kissfft-js.d.ts
@@ -0,0 +1,17 @@
+/**
+ * @license
+ * Copyright 2019 Google LLC. All Rights Reserved.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =============================================================================
+ */
+declare module 'kissfft-js';
diff --git a/音频分类/speech-commands/training/soft-fft/wav_file_feature_extractor.ts b/音频分类/speech-commands/training/soft-fft/wav_file_feature_extractor.ts
new file mode 100644
index 0000000..dc01e74
--- /dev/null
+++ b/音频分类/speech-commands/training/soft-fft/wav_file_feature_extractor.ts
@@ -0,0 +1,95 @@
+import {AudioUtils} from './utils/audio_utils';
+import {Params} from './utils/types';
+import {nextPowerOfTwo} from './utils/audio_utils';
+
+export class WavFileFeatureExtractor {
+ private features: Float32Array[];
+ // Target sample rate.
+ targetSr = 16000;
+ // How long the buffer is.
+ bufferLength = 480;
+ // How many mel bins to use.
+ melCount = 40;
+ // Number of samples to hop over for every new column.
+ hopLength = 160;
+ // How long the total duration is.
+ duration = 1.0;
+ // Whether to use MFCC or Mel features.
+ isMfccEnabled = true;
+ fftSize = 512;
+ // How many buffers to keep in the spectrogram.
+ bufferCount: number;
+ // The mel filterbank (calculate it only once).
+ melFilterbank: Float32Array;
+ audioUtils = new AudioUtils();
+ config(params: Params) {
+ Object.assign(this, params);
+ this.bufferCount = Math.floor(
+ (this.duration * this.targetSr - this.bufferLength) /
+ this.hopLength) +
+ 1;
+
+ if (this.hopLength > this.bufferLength) {
+ console.error('Hop length must be smaller than buffer length.');
+ }
+
+ // The mel filterbank is actually half of the size of the number of samples,
+ // since the FFT array is complex valued.
+ this.fftSize = nextPowerOfTwo(this.bufferLength);
+ this.melFilterbank = this.audioUtils.createMelFilterbank(
+ this.fftSize / 2 + 1, this.melCount);
+ }
+
+ start(samples: Float32Array): Float32Array[] {
+ this.features = [];
+ // Get buffer(s) out of the circular buffer. Note that there may be
+ // multiple available, and if there are, we should get them all.
+ const buffers = this.getFullBuffers(samples);
+
+ for (const buffer of buffers) {
+ // console.log(`Got buffer of length ${buffer.length}.`);
+ // Extract the mel values for this new frame of audio data.
+ const fft = this.audioUtils.fft(buffer);
+ const fftEnergies = this.audioUtils.fftEnergies(fft);
+ const melEnergies =
+ this.audioUtils.applyFilterbank(fftEnergies, this.melFilterbank);
+ const mfccs = this.audioUtils.cepstrumFromEnergySpectrum(melEnergies);
+
+ if (this.isMfccEnabled) {
+ this.features.push(mfccs);
+ } else {
+ this.features.push(melEnergies);
+ }
+ }
+ return this.features;
+ }
+
+ stop() {}
+
+ transform(data: Float32Array) {
+ return data;
+ }
+
+ getFeatures(): Float32Array[] {
+ return this.features;
+ }
+
+ getImages(): Float32Array[] {
+ throw new Error('Method not implemented.');
+ }
+ /**
+ * Get as many full buffers as are available in the circular buffer.
+ */
+ private getFullBuffers(sample: Float32Array) {
+ const out = [];
+ let index = 0;
+ // While we have enough data in the buffer.
+ while (index <= sample.length - this.bufferLength) {
+ // Get a buffer of desired size.
+ const buffer = sample.slice(index, index + this.bufferLength);
+ index += this.hopLength;
+ out.push(buffer);
+ }
+ return out;
+ }
+}
diff --git a/音频分类/speech-commands/training/soft-fft/yarn.lock b/音频分类/speech-commands/training/soft-fft/yarn.lock
new file mode 100644
index 0000000..7c1980c
--- /dev/null
+++ b/音频分类/speech-commands/training/soft-fft/yarn.lock
@@ -0,0 +1,2690 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@babel/code-frame@^7.0.0":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658"
+ integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==
+ dependencies:
+ "@babel/highlight" "^7.12.13"
+
+"@babel/helper-validator-identifier@^7.12.11":
+ version "7.12.11"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed"
+ integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==
+
+"@babel/highlight@^7.12.13":
+ version "7.13.10"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.13.10.tgz#a8b2a66148f5b27d666b15d81774347a731d52d1"
+ integrity sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.12.11"
+ chalk "^2.0.0"
+ js-tokens "^4.0.0"
+
+"@tensorflow/tfjs-backend-cpu@3.3.0":
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/@tensorflow/tfjs-backend-cpu/-/tfjs-backend-cpu-3.3.0.tgz#aa0a3ed2c6237a6e0c169678c5bd4b5a88766b1c"
+ integrity sha512-DLctv+PUZni26kQW1hq8jwQQ8u+GGc/p764WQIC4/IDagGtfGAUW1mHzWcTxtni2l4re1VrwE41ogWLhv4sGHg==
+ dependencies:
+ "@types/seedrandom" "2.4.27"
+ seedrandom "2.4.3"
+
+"@tensorflow/tfjs-backend-webgl@3.3.0":
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/@tensorflow/tfjs-backend-webgl/-/tfjs-backend-webgl-3.3.0.tgz#29dd665f6a856c9defcb9108164f845e1fdcd02e"
+ integrity sha512-GWCtXbrjPTyye3ooId9GlcNDwnIMskZarUpNIQ5g/zeISLfwEQoutA/UqJF+HzuEHgGMsWFkmaO3xKVT7UMpdg==
+ dependencies:
+ "@tensorflow/tfjs-backend-cpu" "3.3.0"
+ "@types/offscreencanvas" "~2019.3.0"
+ "@types/seedrandom" "2.4.27"
+ "@types/webgl-ext" "0.0.30"
+ "@types/webgl2" "0.0.5"
+ seedrandom "2.4.3"
+
+"@tensorflow/tfjs-converter@3.3.0":
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/@tensorflow/tfjs-converter/-/tfjs-converter-3.3.0.tgz#d9f2ffd0fbdbb47c07d5fd7c3e5dc180cff317aa"
+ integrity sha512-k57wN4yelePhmO9orcT/wzGMIuyedrMpVtg0FhxpV6BQu0+TZ/ti3W4Kb97GWJsoHKXMoing9SnioKfVnBW6hw==
+
+"@tensorflow/tfjs-core@3.3.0":
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/@tensorflow/tfjs-core/-/tfjs-core-3.3.0.tgz#3d26bd03cb58e0ecf46c96d118c39c4a90b7f5ed"
+ integrity sha512-6G+LcCiQBl4Kza5mDbWbf8QSWBTW3l7SDjGhQzMO1ITtQatHzxkuHGHcJ4CTUJvNA0JmKf4QJWOvlFqEmxwyLQ==
+ dependencies:
+ "@types/offscreencanvas" "~2019.3.0"
+ "@types/seedrandom" "2.4.27"
+ "@types/webgl-ext" "0.0.30"
+ node-fetch "~2.6.1"
+ seedrandom "2.4.3"
+
+"@tensorflow/tfjs-data@3.3.0":
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/@tensorflow/tfjs-data/-/tfjs-data-3.3.0.tgz#ba943bd6a486fa4cb3ca312c12646ea4dcf6cce4"
+ integrity sha512-0x28tRe6RJu5GmYq3IYN2GNnOgXU0nY+o6zZrlijkK+W3vjSTJlZzaBSifoeD6J8gzVpjs8W8qd/JKHQ1MQp8w==
+ dependencies:
+ "@types/node-fetch" "^2.1.2"
+ node-fetch "~2.6.1"
+
+"@tensorflow/tfjs-layers@3.3.0":
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/@tensorflow/tfjs-layers/-/tfjs-layers-3.3.0.tgz#d2097c5b22ec12e5fdbe470a88ca0a34a95ca11f"
+ integrity sha512-qO+TL2I29vWUiuFcQJXNyayWFYagwR+SIfbex8p5jjYaCGHGwE5GQcrH+ngoCgKZxm5tdMvYJsJPnih2M3fYzQ==
+
+"@tensorflow/tfjs-node@^3.3.0":
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/@tensorflow/tfjs-node/-/tfjs-node-3.3.0.tgz#7066b619b067eec480af4c13ec701a9c2bbaeaa6"
+ integrity sha512-grRgaXereQt5mQnu31gHCPkzA6SGReXW94b5FEMk1Psenmb0APnT7MGgZbujiMruQ81vG0/8gYA28uyZeZKcJw==
+ dependencies:
+ "@tensorflow/tfjs" "3.3.0"
+ adm-zip "^0.4.11"
+ google-protobuf "^3.9.2"
+ https-proxy-agent "^2.2.1"
+ node-pre-gyp "0.14.0"
+ progress "^2.0.0"
+ rimraf "^2.6.2"
+ tar "^4.4.6"
+
+"@tensorflow/tfjs@3.3.0", "@tensorflow/tfjs@^3.3.0":
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/@tensorflow/tfjs/-/tfjs-3.3.0.tgz#db92099dd48c0eb1c1673f705125d2b57496a1a3"
+ integrity sha512-xo22GCUCGcPtNGIdDpLPrp9ms3atXmzX8AF4y3aIBEwK5KlvGe+ZhcoQ2xEOCPQGBr7NB7AO6rwT8gRoziAHVg==
+ dependencies:
+ "@tensorflow/tfjs-backend-cpu" "3.3.0"
+ "@tensorflow/tfjs-backend-webgl" "3.3.0"
+ "@tensorflow/tfjs-converter" "3.3.0"
+ "@tensorflow/tfjs-core" "3.3.0"
+ "@tensorflow/tfjs-data" "3.3.0"
+ "@tensorflow/tfjs-layers" "3.3.0"
+ argparse "^1.0.10"
+ chalk "^4.1.0"
+ core-js "3"
+ regenerator-runtime "^0.13.5"
+ yargs "^16.0.3"
+
+"@types/chalk@^2.2.0":
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@types/chalk/-/chalk-2.2.0.tgz#b7f6e446f4511029ee8e3f43075fb5b73fbaa0ba"
+ integrity sha512-1zzPV9FDe1I/WHhRkf9SNgqtRJWZqrBWgu7JGveuHmmyR9CnAPCie2N/x+iHrgnpYBIcCJWHBoMRv2TRWktsvw==
+ dependencies:
+ chalk "*"
+
+"@types/inquirer@^0.0.42":
+ version "0.0.42"
+ resolved "https://registry.yarnpkg.com/@types/inquirer/-/inquirer-0.0.42.tgz#2310fd8623053bead72247adae416aa32bacdf0c"
+ integrity sha512-flMaNWU2g9NrtZ4bIV+7SEY2W7OdWNNhmJ0rE1lWVxGrkp3TfFGMcFCxRIBmGWigI8e6n+2HqLjizTTfgcpHLg==
+ dependencies:
+ "@types/rx" "*"
+ "@types/through" "*"
+
+"@types/minimist@^1.2.0":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.1.tgz#283f669ff76d7b8260df8ab7a4262cc83d988256"
+ integrity sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==
+
+"@types/node-fetch@^2.1.2":
+ version "2.5.8"
+ resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.8.tgz#e199c835d234c7eb0846f6618012e558544ee2fb"
+ integrity sha512-fbjI6ja0N5ZA8TV53RUqzsKNkl9fv8Oj3T7zxW7FGv1GSH7gwJaNF8dzCjrqKaxKeUpTz4yT1DaJFq/omNpGfw==
+ dependencies:
+ "@types/node" "*"
+ form-data "^3.0.0"
+
+"@types/node@*":
+ version "14.14.36"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.36.tgz#5637905dbb15c30a33a3c65b9ef7c20e3c85ebad"
+ integrity sha512-kjivUwDJfIjngzbhooRnOLhGYz6oRFi+L+EpMjxroDYXwDw9lHrJJ43E+dJ6KAd3V3WxWAJ/qZE9XKYHhjPOFQ==
+
+"@types/node@^10.5.2":
+ version "10.17.55"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.55.tgz#a147f282edec679b894d4694edb5abeb595fecbd"
+ integrity sha512-koZJ89uLZufDvToeWO5BrC4CR4OUfHnUz2qoPs/daQH6qq3IN62QFxCTZ+bKaCE0xaoCAJYE4AXre8AbghCrhg==
+
+"@types/offscreencanvas@~2019.3.0":
+ version "2019.3.0"
+ resolved "https://registry.yarnpkg.com/@types/offscreencanvas/-/offscreencanvas-2019.3.0.tgz#3336428ec7e9180cf4566dfea5da04eb586a6553"
+ integrity sha512-esIJx9bQg+QYF0ra8GnvfianIY8qWB0GBx54PK5Eps6m+xTj86KLavHv6qDhzKcu5UUOgNfJ2pWaIIV7TRUd9Q==
+
+"@types/ora@^1.3.4":
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/@types/ora/-/ora-1.3.5.tgz#1a08bf64902c1473d3d47de58549a49e07140f1c"
+ integrity sha512-CZe3oXbO1XylJT1feg+/aCzNt6tfR4XO+IkLetc85O/yaZRw271cZtS8LL/2mknd+PoR5IKAjFLzo4KWZXxung==
+ dependencies:
+ "@types/node" "*"
+
+"@types/rx-core-binding@*":
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/@types/rx-core-binding/-/rx-core-binding-4.0.4.tgz#d969d32f15a62b89e2862c17b3ee78fe329818d3"
+ integrity sha512-5pkfxnC4w810LqBPUwP5bg7SFR/USwhMSaAeZQQbEHeBp57pjKXRlXmqpMrLJB4y1oglR/c2502853uN0I+DAQ==
+ dependencies:
+ "@types/rx-core" "*"
+
+"@types/rx-core@*":
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/@types/rx-core/-/rx-core-4.0.3.tgz#0b3354b1238cedbe2b74f6326f139dbc7a591d60"
+ integrity sha1-CzNUsSOM7b4rdPYybxOdvHpZHWA=
+
+"@types/rx-lite-aggregates@*":
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/@types/rx-lite-aggregates/-/rx-lite-aggregates-4.0.3.tgz#6efb2b7f3d5f07183a1cb2bd4b1371d7073384c2"
+ integrity sha512-MAGDAHy8cRatm94FDduhJF+iNS5//jrZ/PIfm+QYw9OCeDgbymFHChM8YVIvN2zArwsRftKgE33QfRWvQk4DPg==
+ dependencies:
+ "@types/rx-lite" "*"
+
+"@types/rx-lite-async@*":
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/@types/rx-lite-async/-/rx-lite-async-4.0.2.tgz#27fbf0caeff029f41e2d2aae638b05e91ceb600c"
+ integrity sha512-vTEv5o8l6702ZwfAM5aOeVDfUwBSDOs+ARoGmWAKQ6LOInQ8J4/zjM7ov12fuTpktUKdMQjkeCp07Vd73mPkxw==
+ dependencies:
+ "@types/rx-lite" "*"
+
+"@types/rx-lite-backpressure@*":
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/@types/rx-lite-backpressure/-/rx-lite-backpressure-4.0.3.tgz#05abb19bdf87cc740196c355e5d0b37bb50b5d56"
+ integrity sha512-Y6aIeQCtNban5XSAF4B8dffhIKu6aAy/TXFlScHzSxh6ivfQBQw6UjxyEJxIOt3IT49YkS+siuayM2H/Q0cmgA==
+ dependencies:
+ "@types/rx-lite" "*"
+
+"@types/rx-lite-coincidence@*":
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/@types/rx-lite-coincidence/-/rx-lite-coincidence-4.0.3.tgz#80bd69acc4054a15cdc1638e2dc8843498cd85c0"
+ integrity sha512-1VNJqzE9gALUyMGypDXZZXzR0Tt7LC9DdAZQ3Ou/Q0MubNU35agVUNXKGHKpNTba+fr8GdIdkC26bRDqtCQBeQ==
+ dependencies:
+ "@types/rx-lite" "*"
+
+"@types/rx-lite-experimental@*":
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/@types/rx-lite-experimental/-/rx-lite-experimental-4.0.1.tgz#c532f5cbdf3f2c15da16ded8930d1b2984023cbd"
+ integrity sha1-xTL1y98/LBXaFt7Ykw0bKYQCPL0=
+ dependencies:
+ "@types/rx-lite" "*"
+
+"@types/rx-lite-joinpatterns@*":
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/@types/rx-lite-joinpatterns/-/rx-lite-joinpatterns-4.0.1.tgz#f70fe370518a8432f29158cc92ffb56b4e4afc3e"
+ integrity sha1-9w/jcFGKhDLykVjMkv+1a05K/D4=
+ dependencies:
+ "@types/rx-lite" "*"
+
+"@types/rx-lite-testing@*":
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/@types/rx-lite-testing/-/rx-lite-testing-4.0.1.tgz#21b19d11f4dfd6ffef5a9d1648e9c8879bfe21e9"
+ integrity sha1-IbGdEfTf1v/vWp0WSOnIh5v+Iek=
+ dependencies:
+ "@types/rx-lite-virtualtime" "*"
+
+"@types/rx-lite-time@*":
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/@types/rx-lite-time/-/rx-lite-time-4.0.3.tgz#0eda65474570237598f3448b845d2696f2dbb1c4"
+ integrity sha512-ukO5sPKDRwCGWRZRqPlaAU0SKVxmWwSjiOrLhoQDoWxZWg6vyB9XLEZViKOzIO6LnTIQBlk4UylYV0rnhJLxQw==
+ dependencies:
+ "@types/rx-lite" "*"
+
+"@types/rx-lite-virtualtime@*":
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/@types/rx-lite-virtualtime/-/rx-lite-virtualtime-4.0.3.tgz#4b30cacd0fe2e53af29f04f7438584c7d3959537"
+ integrity sha512-3uC6sGmjpOKatZSVHI2xB1+dedgml669ZRvqxy+WqmGJDVusOdyxcKfyzjW0P3/GrCiN4nmRkLVMhPwHCc5QLg==
+ dependencies:
+ "@types/rx-lite" "*"
+
+"@types/rx-lite@*":
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/@types/rx-lite/-/rx-lite-4.0.6.tgz#3c02921c4244074234f26b772241bcc20c18c253"
+ integrity sha512-oYiDrFIcor9zDm0VDUca1UbROiMYBxMLMaM6qzz4ADAfOmA9r1dYEcAFH+2fsPI5BCCjPvV9pWC3X3flbrvs7w==
+ dependencies:
+ "@types/rx-core" "*"
+ "@types/rx-core-binding" "*"
+
+"@types/rx@*":
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/@types/rx/-/rx-4.1.2.tgz#a4061b3d72b03cf11a38d69e2022a17334c54dc0"
+ integrity sha512-1r8ZaT26Nigq7o4UBGl+aXB2UMFUIdLPP/8bLIP0x3d0pZL46ybKKjhWKaJQWIkLl5QCLD0nK3qTOO1QkwdFaA==
+ dependencies:
+ "@types/rx-core" "*"
+ "@types/rx-core-binding" "*"
+ "@types/rx-lite" "*"
+ "@types/rx-lite-aggregates" "*"
+ "@types/rx-lite-async" "*"
+ "@types/rx-lite-backpressure" "*"
+ "@types/rx-lite-coincidence" "*"
+ "@types/rx-lite-experimental" "*"
+ "@types/rx-lite-joinpatterns" "*"
+ "@types/rx-lite-testing" "*"
+ "@types/rx-lite-time" "*"
+ "@types/rx-lite-virtualtime" "*"
+
+"@types/seedrandom@2.4.27":
+ version "2.4.27"
+ resolved "https://registry.yarnpkg.com/@types/seedrandom/-/seedrandom-2.4.27.tgz#9db563937dd86915f69092bc43259d2f48578e41"
+ integrity sha1-nbVjk33YaRX2kJK8QyWdL0hXjkE=
+
+"@types/through@*":
+ version "0.0.30"
+ resolved "https://registry.yarnpkg.com/@types/through/-/through-0.0.30.tgz#e0e42ce77e897bd6aead6f6ea62aeb135b8a3895"
+ integrity sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==
+ dependencies:
+ "@types/node" "*"
+
+"@types/webgl-ext@0.0.30":
+ version "0.0.30"
+ resolved "https://registry.yarnpkg.com/@types/webgl-ext/-/webgl-ext-0.0.30.tgz#0ce498c16a41a23d15289e0b844d945b25f0fb9d"
+ integrity sha512-LKVgNmBxN0BbljJrVUwkxwRYqzsAEPcZOe6S2T6ZaBDIrFp0qu4FNlpc5sM1tGbXUYFgdVQIoeLk1Y1UoblyEg==
+
+"@types/webgl2@0.0.5":
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/@types/webgl2/-/webgl2-0.0.5.tgz#dd925e20ab8ace80eb4b1e46fda5b109c508fb0d"
+ integrity sha512-oGaKsBbxQOY5+aJFV3KECDhGaXt+yZJt2y/OZsnQGLRkH6Fvr7rv4pCt3SRH1somIHfej/c4u7NSpCyd9x+1Ow==
+
+abbrev@1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+ integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
+
+adm-zip@^0.4.11:
+ version "0.4.16"
+ resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365"
+ integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==
+
+agent-base@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee"
+ integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==
+ dependencies:
+ es6-promisify "^5.0.0"
+
+ansi-align@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f"
+ integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=
+ dependencies:
+ string-width "^2.0.0"
+
+ansi-escapes@^1.0.0, ansi-escapes@^1.1.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
+ integrity sha1-06ioOzGapneTZisT52HHkRQiMG4=
+
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+ integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
+
+ansi-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
+ integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=
+
+ansi-regex@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
+ integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
+
+ansi-styles@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+ integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=
+
+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"
+
+anymatch@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
+ integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==
+ dependencies:
+ micromatch "^3.1.4"
+ normalize-path "^2.1.1"
+
+aproba@^1.0.3:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
+ integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
+
+are-we-there-yet@~1.1.2:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
+ integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==
+ dependencies:
+ delegates "^1.0.0"
+ readable-stream "^2.0.6"
+
+argparse@^1.0.10, 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"
+
+arr-diff@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+ integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=
+
+arr-flatten@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+ integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
+
+arr-union@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+ integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
+
+array-unique@^0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+ integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
+
+arrify@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
+ integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=
+
+assign-symbols@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+ integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
+
+async-each@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf"
+ integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==
+
+async@^1.5.2:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
+ integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
+
+atob@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
+ integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
+
+babel-polyfill@^6.3.14:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153"
+ integrity sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=
+ dependencies:
+ babel-runtime "^6.26.0"
+ core-js "^2.5.0"
+ regenerator-runtime "^0.10.5"
+
+babel-runtime@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
+ integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4=
+ dependencies:
+ core-js "^2.4.0"
+ regenerator-runtime "^0.11.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==
+
+base@^0.11.1:
+ version "0.11.2"
+ resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+ integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==
+ dependencies:
+ cache-base "^1.0.1"
+ class-utils "^0.3.5"
+ component-emitter "^1.2.1"
+ define-property "^1.0.0"
+ isobject "^3.0.1"
+ mixin-deep "^1.2.0"
+ pascalcase "^0.1.1"
+
+binary-extensions@^1.0.0:
+ version "1.13.1"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65"
+ integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==
+
+bindings@^1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df"
+ integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==
+ dependencies:
+ file-uri-to-path "1.0.0"
+
+boxen@^1.2.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b"
+ integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==
+ dependencies:
+ ansi-align "^2.0.0"
+ camelcase "^4.0.0"
+ chalk "^2.0.1"
+ cli-boxes "^1.0.0"
+ string-width "^2.0.0"
+ term-size "^1.2.0"
+ widest-line "^2.0.0"
+
+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@^2.3.1, braces@^2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
+ integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
+ dependencies:
+ arr-flatten "^1.1.0"
+ array-unique "^0.3.2"
+ extend-shallow "^2.0.1"
+ fill-range "^4.0.0"
+ isobject "^3.0.1"
+ repeat-element "^1.1.2"
+ snapdragon "^0.8.1"
+ snapdragon-node "^2.0.1"
+ split-string "^3.0.2"
+ to-regex "^3.0.1"
+
+buffer-from@^1.0.0, buffer-from@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
+ integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
+
+builtin-modules@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
+ integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=
+
+cache-base@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+ integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==
+ dependencies:
+ collection-visit "^1.0.0"
+ component-emitter "^1.2.1"
+ get-value "^2.0.6"
+ has-value "^1.0.0"
+ isobject "^3.0.1"
+ set-value "^2.0.0"
+ to-object-path "^0.3.0"
+ union-value "^1.0.0"
+ unset-value "^1.0.0"
+
+camelcase@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
+ integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=
+
+capture-stack-trace@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d"
+ integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==
+
+chalk@*, chalk@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a"
+ integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+chalk@^1.0.0, chalk@^1.1.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+ integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
+ dependencies:
+ ansi-styles "^2.2.1"
+ escape-string-regexp "^1.0.2"
+ has-ansi "^2.0.0"
+ strip-ansi "^3.0.0"
+ supports-color "^2.0.0"
+
+chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4.1:
+ 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"
+
+chokidar@^2.0.2:
+ version "2.1.8"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917"
+ integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==
+ dependencies:
+ anymatch "^2.0.0"
+ async-each "^1.0.1"
+ braces "^2.3.2"
+ glob-parent "^3.1.0"
+ inherits "^2.0.3"
+ is-binary-path "^1.0.0"
+ is-glob "^4.0.0"
+ normalize-path "^3.0.0"
+ path-is-absolute "^1.0.0"
+ readdirp "^2.2.1"
+ upath "^1.1.1"
+ optionalDependencies:
+ fsevents "^1.2.7"
+
+chownr@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
+ integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
+
+ci-info@^1.5.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497"
+ integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==
+
+clang-format@~1.2.2:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/clang-format/-/clang-format-1.2.4.tgz#4bb4b0a98180428deb093cf20982e9fc1af20b6c"
+ integrity sha512-sw+nrGUp3hvmANd1qF8vZPuezSYQAiXgGBiEtkXTtJnnu6b00fCqkkDIsnRKrNgg4nv6NYZE92ejvOMIXZoejw==
+ dependencies:
+ async "^1.5.2"
+ glob "^7.0.0"
+ resolve "^1.1.6"
+
+class-utils@^0.3.5:
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+ integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==
+ dependencies:
+ arr-union "^3.1.0"
+ define-property "^0.2.5"
+ isobject "^3.0.0"
+ static-extend "^0.1.1"
+
+cli-boxes@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143"
+ integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM=
+
+cli-cursor@^1.0.1, cli-cursor@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987"
+ integrity sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=
+ dependencies:
+ restore-cursor "^1.0.1"
+
+cli-cursor@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
+ integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=
+ dependencies:
+ restore-cursor "^2.0.0"
+
+cli-spinners@^1.1.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a"
+ integrity sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==
+
+cli-width@^1.0.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-1.1.1.tgz#a4d293ef67ebb7b88d4a4d42c0ccf00c4d1e366d"
+ integrity sha1-pNKT72frt7iNSk1CwMzwDE0eNm0=
+
+cliui@^7.0.2:
+ version "7.0.4"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f"
+ integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.0"
+ wrap-ansi "^7.0.0"
+
+clone@^1.0.2:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
+ integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4=
+
+code-point-at@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+ integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
+
+collection-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+ integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=
+ dependencies:
+ map-visit "^1.0.0"
+ object-visit "^1.0.0"
+
+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 sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
+
+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==
+
+combined-stream@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
+commander@^2.12.1:
+ version "2.20.3"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
+ integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
+
+component-emitter@^1.2.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
+ integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
+
+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==
+
+configstore@^3.0.0:
+ version "3.1.5"
+ resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.5.tgz#e9af331fadc14dabd544d3e7e76dc446a09a530f"
+ integrity sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==
+ dependencies:
+ dot-prop "^4.2.1"
+ graceful-fs "^4.1.2"
+ make-dir "^1.0.0"
+ unique-string "^1.0.0"
+ write-file-atomic "^2.0.0"
+ xdg-basedir "^3.0.0"
+
+console-control-strings@^1.0.0, console-control-strings@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+ integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=
+
+copy-descriptor@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+ integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
+
+core-js@3:
+ version "3.9.1"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.9.1.tgz#cec8de593db8eb2a85ffb0dbdeb312cb6e5460ae"
+ integrity sha512-gSjRvzkxQc1zjM/5paAmL4idJBFzuJoo+jDjF1tStYFMV2ERfD02HhahhCGXUyHxQRG4yFKVSdO6g62eoRMcDg==
+
+core-js@^2.4.0, core-js@^2.5.0:
+ version "2.6.12"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec"
+ integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
+
+core-util-is@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+ integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
+
+create-error-class@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6"
+ integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=
+ dependencies:
+ capture-stack-trace "^1.0.0"
+
+cross-spawn@^5.0.1:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
+ integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=
+ dependencies:
+ lru-cache "^4.0.1"
+ shebang-command "^1.2.0"
+ which "^1.2.9"
+
+crypto-random-string@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e"
+ integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=
+
+dct@^0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/dct/-/dct-0.0.3.tgz#19390a834388a1d3a1373f9edfe50622074849d3"
+ integrity sha1-GTkKg0OIodOhNz+e3+UGIgdISdM=
+
+debug@^2.2.0, debug@^2.3.3:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ dependencies:
+ ms "2.0.0"
+
+debug@^3.1.0, debug@^3.2.6:
+ version "3.2.7"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
+ integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
+ dependencies:
+ ms "^2.1.1"
+
+decode-uri-component@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+ integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
+
+deep-extend@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
+ integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
+
+defaults@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
+ integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=
+ dependencies:
+ clone "^1.0.2"
+
+define-property@^0.2.5:
+ version "0.2.5"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+ integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=
+ dependencies:
+ is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+ integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY=
+ dependencies:
+ is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+ integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==
+ dependencies:
+ is-descriptor "^1.0.2"
+ isobject "^3.0.1"
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
+
+delegates@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+ integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
+
+detect-libc@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
+ integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=
+
+diff@^3.1.0:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
+ integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==
+
+diff@^4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
+ integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
+
+dot-prop@^4.2.1:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.1.tgz#45884194a71fc2cda71cbb4bceb3a4dd2f433ba4"
+ integrity sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==
+ dependencies:
+ is-obj "^1.0.0"
+
+duplexer3@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
+ integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
+
+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==
+
+es6-promise@^4.0.3:
+ version "4.2.8"
+ resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a"
+ integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==
+
+es6-promisify@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203"
+ integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=
+ dependencies:
+ es6-promise "^4.0.3"
+
+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.2, 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 sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+
+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@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
+ integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=
+ dependencies:
+ cross-spawn "^5.0.1"
+ get-stream "^3.0.0"
+ is-stream "^1.1.0"
+ npm-run-path "^2.0.0"
+ p-finally "^1.0.0"
+ signal-exit "^3.0.0"
+ strip-eof "^1.0.0"
+
+exit-hook@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8"
+ integrity sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=
+
+expand-brackets@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+ integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI=
+ dependencies:
+ debug "^2.3.3"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ posix-character-classes "^0.1.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+extend-shallow@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+ integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=
+ dependencies:
+ is-extendable "^0.1.0"
+
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+ integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=
+ dependencies:
+ assign-symbols "^1.0.0"
+ is-extendable "^1.0.1"
+
+extglob@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+ integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==
+ dependencies:
+ array-unique "^0.3.2"
+ define-property "^1.0.0"
+ expand-brackets "^2.1.4"
+ extend-shallow "^2.0.1"
+ fragment-cache "^0.2.1"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+figures@^1.3.5:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
+ integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=
+ dependencies:
+ escape-string-regexp "^1.0.5"
+ object-assign "^4.1.0"
+
+file-uri-to-path@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
+ integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==
+
+fill-range@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+ integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+ to-regex-range "^2.1.0"
+
+for-in@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+ integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
+
+form-data@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f"
+ integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ mime-types "^2.1.12"
+
+fragment-cache@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+ integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=
+ dependencies:
+ map-cache "^0.2.2"
+
+fs-minipass@^1.2.7:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7"
+ integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==
+ dependencies:
+ minipass "^2.6.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 sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
+
+fsevents@^1.2.7:
+ version "1.2.13"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38"
+ integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==
+ dependencies:
+ bindings "^1.5.0"
+ nan "^2.12.1"
+
+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==
+
+gauge@~2.7.3:
+ version "2.7.4"
+ resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
+ integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=
+ dependencies:
+ aproba "^1.0.3"
+ console-control-strings "^1.0.0"
+ has-unicode "^2.0.0"
+ object-assign "^4.1.0"
+ signal-exit "^3.0.0"
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wide-align "^1.1.0"
+
+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-stream@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
+ integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=
+
+get-value@^2.0.3, get-value@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+ integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=
+
+glob-parent@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
+ integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=
+ dependencies:
+ is-glob "^3.1.0"
+ path-dirname "^1.0.0"
+
+glob@^7.0.0, glob@^7.1.1, glob@^7.1.3:
+ version "7.1.6"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
+ integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+global-dirs@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445"
+ integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=
+ dependencies:
+ ini "^1.3.4"
+
+google-protobuf@^3.9.2:
+ version "3.15.6"
+ resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.15.6.tgz#2048055828530993a51df4d4ca2c08322fc1ec7c"
+ integrity sha512-p65NyhIZFHFUxbIPOm6cygg2rCjK+2uDCxruOG3RaWKM9R4rBGX0STmlJoSOhoyAG8Fha7U8FP4pQomAV1JXsA==
+
+got@^6.7.1:
+ version "6.7.1"
+ resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0"
+ integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=
+ dependencies:
+ create-error-class "^3.0.0"
+ duplexer3 "^0.1.4"
+ get-stream "^3.0.0"
+ is-redirect "^1.0.0"
+ is-retry-allowed "^1.0.0"
+ is-stream "^1.0.0"
+ lowercase-keys "^1.0.0"
+ safe-buffer "^5.0.1"
+ timed-out "^4.0.0"
+ unzip-response "^2.0.1"
+ url-parse-lax "^1.0.0"
+
+graceful-fs@^4.1.11, graceful-fs@^4.1.2:
+ version "4.2.6"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee"
+ integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==
+
+has-ansi@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+ integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=
+ dependencies:
+ ansi-regex "^2.0.0"
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+
+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-unicode@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+ integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=
+
+has-value@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+ integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=
+ dependencies:
+ get-value "^2.0.3"
+ has-values "^0.1.4"
+ isobject "^2.0.0"
+
+has-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+ integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=
+ dependencies:
+ get-value "^2.0.6"
+ has-values "^1.0.0"
+ isobject "^3.0.0"
+
+has-values@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+ integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E=
+
+has-values@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+ integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=
+ dependencies:
+ is-number "^3.0.0"
+ kind-of "^4.0.0"
+
+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"
+
+https-proxy-agent@^2.2.1:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b"
+ integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==
+ dependencies:
+ agent-base "^4.3.0"
+ debug "^3.1.0"
+
+iconv-lite@^0.4.4:
+ version "0.4.24"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+ignore-by-default@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09"
+ integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk=
+
+ignore-walk@^3.0.1:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37"
+ integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==
+ dependencies:
+ minimatch "^3.0.4"
+
+import-lazy@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43"
+ integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+ integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
+
+in-publish@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.1.tgz#948b1a535c8030561cea522f73f78f4be357e00c"
+ integrity sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@^2.0.3, inherits@~2.0.3:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+ini@^1.3.4, ini@~1.3.0:
+ version "1.3.8"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
+ integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
+
+inquirer@0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.11.0.tgz#7448bfa924092af311d47173bbab990cae2bb027"
+ integrity sha1-dEi/qSQJKvMR1HFzu6uZDK4rsCc=
+ dependencies:
+ ansi-escapes "^1.1.0"
+ ansi-regex "^2.0.0"
+ chalk "^1.0.0"
+ cli-cursor "^1.0.1"
+ cli-width "^1.0.1"
+ figures "^1.3.5"
+ lodash "^3.3.1"
+ readline2 "^1.0.1"
+ run-async "^0.1.0"
+ rx-lite "^3.1.2"
+ strip-ansi "^3.0.0"
+ through "^2.3.6"
+
+is-accessor-descriptor@^0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
+ integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-accessor-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
+ integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==
+ dependencies:
+ kind-of "^6.0.0"
+
+is-binary-path@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
+ integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=
+ dependencies:
+ binary-extensions "^1.0.0"
+
+is-buffer@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+ integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
+
+is-ci@^1.0.10:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c"
+ integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==
+ dependencies:
+ ci-info "^1.5.0"
+
+is-core-module@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a"
+ integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==
+ dependencies:
+ has "^1.0.3"
+
+is-data-descriptor@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
+ integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-data-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
+ integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==
+ dependencies:
+ kind-of "^6.0.0"
+
+is-descriptor@^0.1.0:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
+ integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==
+ dependencies:
+ is-accessor-descriptor "^0.1.6"
+ is-data-descriptor "^0.1.4"
+ kind-of "^5.0.0"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
+ integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==
+ dependencies:
+ is-accessor-descriptor "^1.0.0"
+ is-data-descriptor "^1.0.0"
+ kind-of "^6.0.2"
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+ integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=
+
+is-extendable@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+ integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==
+ dependencies:
+ is-plain-object "^2.0.4"
+
+is-extglob@^2.1.0, is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
+
+is-fullwidth-code-point@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+ integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs=
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+ integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
+
+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-glob@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
+ integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=
+ dependencies:
+ is-extglob "^2.1.0"
+
+is-glob@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
+ integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-installed-globally@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80"
+ integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=
+ dependencies:
+ global-dirs "^0.1.0"
+ is-path-inside "^1.0.0"
+
+is-npm@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4"
+ integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ=
+
+is-number@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+ integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-obj@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
+ integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8=
+
+is-path-inside@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036"
+ integrity sha1-jvW33lBDej/cprToZe96pVy0gDY=
+ dependencies:
+ path-is-inside "^1.0.1"
+
+is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+ integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
+ dependencies:
+ isobject "^3.0.1"
+
+is-redirect@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24"
+ integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=
+
+is-retry-allowed@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4"
+ integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==
+
+is-stream@^1.0.0, is-stream@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+ integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
+
+is-windows@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+ integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
+
+isarray@1.0.0, isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+ integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
+
+isobject@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+ integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=
+ dependencies:
+ isarray "1.0.0"
+
+isobject@^3.0.0, isobject@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+ integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
+
+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"
+
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+ integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+ integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc=
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
+ integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
+
+kind-of@^6.0.0, kind-of@^6.0.2:
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
+ integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
+
+kissfft-js@0.1.8:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/kissfft-js/-/kissfft-js-0.1.8.tgz#fdc418cd6b8268aad6d2841a7f43db923679e11a"
+ integrity sha512-P3kZXvlFGYe+7N9RJvve5bpq9P0S1tZroSbqmiJZzYi6DlLJMrFpr/CFLpySIYJpZ4WJLYQE17Pj7QY3LNhfxA==
+
+latest-version@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15"
+ integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=
+ dependencies:
+ package-json "^4.0.0"
+
+lodash@^3.3.1:
+ version "3.10.1"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
+ integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=
+
+lodash@^4.5.1:
+ version "4.17.21"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+log-symbols@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a"
+ integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==
+ dependencies:
+ chalk "^2.0.1"
+
+log-update@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/log-update/-/log-update-1.0.2.tgz#19929f64c4093d2d2e7075a1dad8af59c296b8d1"
+ integrity sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE=
+ dependencies:
+ ansi-escapes "^1.0.0"
+ cli-cursor "^1.0.2"
+
+lowercase-keys@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
+ integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==
+
+lru-cache@^4.0.1:
+ version "4.1.5"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
+ integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==
+ dependencies:
+ pseudomap "^1.0.2"
+ yallist "^2.1.2"
+
+make-dir@^1.0.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
+ integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==
+ dependencies:
+ pify "^3.0.0"
+
+make-error@^1.1.1:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
+ integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
+
+map-cache@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+ integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=
+
+map-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+ integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=
+ dependencies:
+ object-visit "^1.0.0"
+
+micromatch@^3.1.10, micromatch@^3.1.4:
+ version "3.1.10"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
+ integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ braces "^2.3.1"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ extglob "^2.0.4"
+ fragment-cache "^0.2.1"
+ kind-of "^6.0.2"
+ nanomatch "^1.2.9"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.2"
+
+mime-db@1.46.0:
+ version "1.46.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.46.0.tgz#6267748a7f799594de3cbc8cde91def349661cee"
+ integrity sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==
+
+mime-types@^2.1.12:
+ version "2.1.29"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.29.tgz#1d4ab77da64b91f5f72489df29236563754bb1b2"
+ integrity sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==
+ dependencies:
+ mime-db "1.46.0"
+
+mimic-fn@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
+ integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==
+
+minimatch@^3.0.4:
+ 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"
+
+minimist@^1.2.0, minimist@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
+ integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
+
+minipass@^2.6.0, minipass@^2.9.0:
+ version "2.9.0"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6"
+ integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==
+ dependencies:
+ safe-buffer "^5.1.2"
+ yallist "^3.0.0"
+
+minizlib@^1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d"
+ integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==
+ dependencies:
+ minipass "^2.9.0"
+
+mixin-deep@^1.2.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566"
+ integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==
+ dependencies:
+ for-in "^1.0.2"
+ is-extendable "^1.0.1"
+
+mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5:
+ version "0.5.5"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
+ integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
+ dependencies:
+ minimist "^1.2.5"
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+ integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
+
+ms@^2.1.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+mute-stream@0.0.5:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0"
+ integrity sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=
+
+nan@^2.12.1:
+ version "2.14.2"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19"
+ integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==
+
+nanomatch@^1.2.9:
+ version "1.2.13"
+ resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
+ integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ fragment-cache "^0.2.1"
+ is-windows "^1.0.2"
+ kind-of "^6.0.2"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+needle@^2.2.1:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/needle/-/needle-2.6.0.tgz#24dbb55f2509e2324b4a99d61f413982013ccdbe"
+ integrity sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg==
+ dependencies:
+ debug "^3.2.6"
+ iconv-lite "^0.4.4"
+ sax "^1.2.4"
+
+node-fetch@~2.6.1:
+ version "2.6.7"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad"
+ integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==
+ dependencies:
+ whatwg-url "^5.0.0"
+
+node-localstorage@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/node-localstorage/-/node-localstorage-0.6.0.tgz#45a0601c6932dfde6644a23361f1be173c75d3af"
+ integrity sha1-RaBgHGky395mRKIzYfG+Fzx1068=
+
+node-pre-gyp@0.14.0:
+ version "0.14.0"
+ resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83"
+ integrity sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==
+ dependencies:
+ detect-libc "^1.0.2"
+ mkdirp "^0.5.1"
+ needle "^2.2.1"
+ nopt "^4.0.1"
+ npm-packlist "^1.1.6"
+ npmlog "^4.0.2"
+ rc "^1.2.7"
+ rimraf "^2.6.1"
+ semver "^5.3.0"
+ tar "^4.4.2"
+
+node-wav@^0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/node-wav/-/node-wav-0.0.2.tgz#89cb63cf8cd66ec8ab455f5ba4864e5fcb4605e8"
+ integrity sha1-ictjz4zWbsirRV9bpIZOX8tGBeg=
+
+nodemon@1.18.2:
+ version "1.18.2"
+ resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.18.2.tgz#36b89c790da70c4f270e2cc0718723131bc04abb"
+ integrity sha512-FKuvzVurERMgX231T9KexWWWopjd93vapFY8rLn2JlPZ58uCW2s7U8utKElpGUEAqU5Y33///KFza5O9ndVRHQ==
+ dependencies:
+ chokidar "^2.0.2"
+ debug "^3.1.0"
+ ignore-by-default "^1.0.1"
+ minimatch "^3.0.4"
+ pstree.remy "^1.1.0"
+ semver "^5.5.0"
+ supports-color "^5.2.0"
+ touch "^3.1.0"
+ undefsafe "^2.0.2"
+ update-notifier "^2.3.0"
+
+nopt@^4.0.1:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48"
+ integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==
+ dependencies:
+ abbrev "1"
+ osenv "^0.1.4"
+
+nopt@~1.0.10:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee"
+ integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=
+ dependencies:
+ abbrev "1"
+
+normalize-path@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+ integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=
+ dependencies:
+ remove-trailing-separator "^1.0.1"
+
+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-bundled@^1.0.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b"
+ integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==
+ dependencies:
+ npm-normalize-package-bin "^1.0.1"
+
+npm-normalize-package-bin@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2"
+ integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==
+
+npm-packlist@^1.1.6:
+ version "1.4.8"
+ resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e"
+ integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==
+ dependencies:
+ ignore-walk "^3.0.1"
+ npm-bundled "^1.0.1"
+ npm-normalize-package-bin "^1.0.1"
+
+npm-run-path@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
+ integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=
+ dependencies:
+ path-key "^2.0.0"
+
+npmlog@^4.0.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
+ integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
+ dependencies:
+ are-we-there-yet "~1.1.2"
+ console-control-strings "~1.1.0"
+ gauge "~2.7.3"
+ set-blocking "~2.0.0"
+
+number-is-nan@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+ integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
+
+object-assign@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
+
+object-copy@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+ integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw=
+ dependencies:
+ copy-descriptor "^0.1.0"
+ define-property "^0.2.5"
+ kind-of "^3.0.3"
+
+object-visit@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+ integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=
+ dependencies:
+ isobject "^3.0.0"
+
+object.pick@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+ integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=
+ dependencies:
+ isobject "^3.0.1"
+
+once@^1.3.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
+ dependencies:
+ wrappy "1"
+
+onetime@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789"
+ integrity sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=
+
+onetime@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
+ integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=
+ dependencies:
+ mimic-fn "^1.0.0"
+
+ora@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/ora/-/ora-2.1.0.tgz#6caf2830eb924941861ec53a173799e008b51e5b"
+ integrity sha512-hNNlAd3gfv/iPmsNxYoAPLvxg7HuPozww7fFonMZvL84tP6Ox5igfk5j/+a9rtJJwqMgKK+JgWsAQik5o0HTLA==
+ dependencies:
+ chalk "^2.3.1"
+ cli-cursor "^2.1.0"
+ cli-spinners "^1.1.0"
+ log-symbols "^2.2.0"
+ strip-ansi "^4.0.0"
+ wcwidth "^1.0.1"
+
+os-homedir@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+ integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
+
+os-tmpdir@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+ integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
+
+osenv@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
+ integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.0"
+
+p-finally@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+ integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
+
+package-json@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed"
+ integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=
+ dependencies:
+ got "^6.7.1"
+ registry-auth-token "^3.0.1"
+ registry-url "^3.0.3"
+ semver "^5.1.0"
+
+pascalcase@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+ integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
+
+path-dirname@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
+ integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=
+
+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 sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
+
+path-is-inside@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
+ integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=
+
+path-key@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+ integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
+
+path-parse@^1.0.6:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+pify@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
+ integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
+
+posix-character-classes@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+ integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
+
+prepend-http@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
+ integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=
+
+process-nextick-args@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
+ integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+
+progress@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
+ integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
+
+pseudomap@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+ integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
+
+pstree.remy@^1.1.0:
+ version "1.1.8"
+ resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a"
+ integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==
+
+rc@^1.0.1, rc@^1.1.6, rc@^1.2.7:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
+ integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
+ dependencies:
+ deep-extend "^0.6.0"
+ ini "~1.3.0"
+ minimist "^1.2.0"
+ strip-json-comments "~2.0.1"
+
+readable-stream@^2.0.2, readable-stream@^2.0.6:
+ version "2.3.7"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
+ integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.3"
+ isarray "~1.0.0"
+ process-nextick-args "~2.0.0"
+ safe-buffer "~5.1.1"
+ string_decoder "~1.1.1"
+ util-deprecate "~1.0.1"
+
+readdirp@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525"
+ integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==
+ dependencies:
+ graceful-fs "^4.1.11"
+ micromatch "^3.1.10"
+ readable-stream "^2.0.2"
+
+readline2@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35"
+ integrity sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ mute-stream "0.0.5"
+
+regenerator-runtime@^0.10.5:
+ version "0.10.5"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658"
+ integrity sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=
+
+regenerator-runtime@^0.11.0:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
+ integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
+
+regenerator-runtime@^0.13.5:
+ version "0.13.7"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55"
+ integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==
+
+regex-not@^1.0.0, regex-not@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+ integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==
+ dependencies:
+ extend-shallow "^3.0.2"
+ safe-regex "^1.1.0"
+
+registry-auth-token@^3.0.1:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e"
+ integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==
+ dependencies:
+ rc "^1.1.6"
+ safe-buffer "^5.0.1"
+
+registry-url@^3.0.3:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942"
+ integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI=
+ dependencies:
+ rc "^1.0.1"
+
+remove-trailing-separator@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+ integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8=
+
+repeat-element@^1.1.2:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce"
+ integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==
+
+repeat-string@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+ integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
+
+resolve-url@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+ integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
+
+resolve@^1.1.6, resolve@^1.3.2:
+ version "1.20.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
+ integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
+ dependencies:
+ is-core-module "^2.2.0"
+ path-parse "^1.0.6"
+
+restore-cursor@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541"
+ integrity sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=
+ dependencies:
+ exit-hook "^1.0.0"
+ onetime "^1.0.0"
+
+restore-cursor@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
+ integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368=
+ dependencies:
+ onetime "^2.0.0"
+ signal-exit "^3.0.2"
+
+ret@~0.1.10:
+ version "0.1.15"
+ resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+ integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
+
+rimraf@^2.6.1, rimraf@^2.6.2:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
+ integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
+ dependencies:
+ glob "^7.1.3"
+
+run-async@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389"
+ integrity sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=
+ dependencies:
+ once "^1.3.0"
+
+rx-lite@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102"
+ integrity sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@^5.2.1:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+safe-regex@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+ integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4=
+ dependencies:
+ ret "~0.1.10"
+
+"safer-buffer@>= 2.1.2 < 3":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+sax@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+ integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
+
+seedrandom@2.4.3:
+ version "2.4.3"
+ resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-2.4.3.tgz#2438504dad33917314bff18ac4d794f16d6aaecc"
+ integrity sha1-JDhQTa0zkXMUv/GKxNeU8W1qrsw=
+
+semver-diff@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36"
+ integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=
+ dependencies:
+ semver "^5.0.3"
+
+semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.5.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
+ integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
+
+set-blocking@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+ integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
+
+set-value@^2.0.0, set-value@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b"
+ integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.3"
+ split-string "^3.0.1"
+
+shebang-command@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+ integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
+ dependencies:
+ shebang-regex "^1.0.0"
+
+shebang-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+ integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
+
+signal-exit@^3.0.0, signal-exit@^3.0.2:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
+ integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
+
+snapdragon-node@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+ integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==
+ dependencies:
+ define-property "^1.0.0"
+ isobject "^3.0.0"
+ snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+ integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==
+ dependencies:
+ kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
+ integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==
+ dependencies:
+ base "^0.11.1"
+ debug "^2.2.0"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ map-cache "^0.2.2"
+ source-map "^0.5.6"
+ source-map-resolve "^0.5.0"
+ use "^3.1.0"
+
+source-map-resolve@^0.5.0:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a"
+ integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==
+ dependencies:
+ atob "^2.1.2"
+ decode-uri-component "^0.2.0"
+ resolve-url "^0.2.1"
+ source-map-url "^0.4.0"
+ urix "^0.1.0"
+
+source-map-support@^0.5.6:
+ version "0.5.19"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
+ integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map-url@^0.4.0:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56"
+ integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==
+
+source-map@^0.5.6:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+ integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
+
+source-map@^0.6.0:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+split-string@^3.0.1, split-string@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+ integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==
+ dependencies:
+ extend-shallow "^3.0.0"
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+ integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
+
+static-extend@^0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+ integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=
+ dependencies:
+ define-property "^0.2.5"
+ object-copy "^0.1.0"
+
+string-width@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+ integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ strip-ansi "^3.0.0"
+
+"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+ integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
+ dependencies:
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^4.0.0"
+
+string-width@^4.1.0, string-width@^4.2.0:
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5"
+ integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.0"
+
+string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+ integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+ dependencies:
+ safe-buffer "~5.1.0"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+ integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
+ dependencies:
+ ansi-regex "^2.0.0"
+
+strip-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+ integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8=
+ dependencies:
+ ansi-regex "^3.0.0"
+
+strip-ansi@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
+ integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
+ dependencies:
+ ansi-regex "^5.0.0"
+
+strip-eof@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
+ integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=
+
+strip-json-comments@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+ integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
+
+supports-color@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+ integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=
+
+supports-color@^5.2.0, 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"
+
+tar@^4.4.2, tar@^4.4.6:
+ version "4.4.19"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3"
+ integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==
+ dependencies:
+ chownr "^1.1.4"
+ fs-minipass "^1.2.7"
+ minipass "^2.9.0"
+ minizlib "^1.3.3"
+ mkdirp "^0.5.5"
+ safe-buffer "^5.2.1"
+ yallist "^3.1.1"
+
+term-size@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69"
+ integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=
+ dependencies:
+ execa "^0.7.0"
+
+through@^2.3.6:
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+ integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
+
+timed-out@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
+ integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=
+
+to-object-path@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+ integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=
+ dependencies:
+ kind-of "^3.0.2"
+
+to-regex-range@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+ integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=
+ dependencies:
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+
+to-regex@^3.0.1, to-regex@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+ integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==
+ dependencies:
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ regex-not "^1.0.2"
+ safe-regex "^1.1.0"
+
+touch@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b"
+ integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==
+ dependencies:
+ nopt "~1.0.10"
+
+tr46@~0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
+ integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=
+
+ts-node@7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.0.tgz#a94a13c75e5e1aa6b82814b84c68deb339ba7bff"
+ integrity sha512-klJsfswHP0FuOLsvBZ/zzCfUvakOSSxds78mVeK7I+qP76YWtxf16hEZsp3U+b0kIo82R5UatGFeblYMqabb2Q==
+ dependencies:
+ arrify "^1.0.0"
+ buffer-from "^1.1.0"
+ diff "^3.1.0"
+ make-error "^1.1.1"
+ minimist "^1.2.0"
+ mkdirp "^0.5.1"
+ source-map-support "^0.5.6"
+ yn "^2.0.0"
+
+tslib@^1.13.0, tslib@^1.8.1:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
+ integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+
+tslint-no-circular-imports@~0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/tslint-no-circular-imports/-/tslint-no-circular-imports-0.7.0.tgz#9df0a15654d66b172e0b7843eed073fa5ae99b5f"
+ integrity sha512-k3wxpeMC4ef40UbpfBVHEHIzKfNZq5/SCtAO1YjGsaNTklo+K53/TWLrym+poA65RJFDiYgYNWvkeIIkJNA0Vw==
+
+tslint@~6.1.3:
+ version "6.1.3"
+ resolved "https://registry.yarnpkg.com/tslint/-/tslint-6.1.3.tgz#5c23b2eccc32487d5523bd3a470e9aa31789d904"
+ integrity sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ builtin-modules "^1.1.1"
+ chalk "^2.3.0"
+ commander "^2.12.1"
+ diff "^4.0.1"
+ glob "^7.1.1"
+ js-yaml "^3.13.1"
+ minimatch "^3.0.4"
+ mkdirp "^0.5.3"
+ resolve "^1.3.2"
+ semver "^5.3.0"
+ tslib "^1.13.0"
+ tsutils "^2.29.0"
+
+tsutils@^2.29.0:
+ version "2.29.0"
+ resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99"
+ integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==
+ dependencies:
+ tslib "^1.8.1"
+
+typescript@3.5.3:
+ version "3.5.3"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.5.3.tgz#c830f657f93f1ea846819e929092f5fe5983e977"
+ integrity sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g==
+
+undefsafe@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.3.tgz#6b166e7094ad46313b2202da7ecc2cd7cc6e7aae"
+ integrity sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==
+ dependencies:
+ debug "^2.2.0"
+
+union-value@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847"
+ integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==
+ dependencies:
+ arr-union "^3.1.0"
+ get-value "^2.0.6"
+ is-extendable "^0.1.1"
+ set-value "^2.0.1"
+
+unique-string@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a"
+ integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=
+ dependencies:
+ crypto-random-string "^1.0.0"
+
+unset-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+ integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=
+ dependencies:
+ has-value "^0.3.1"
+ isobject "^3.0.0"
+
+unzip-response@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97"
+ integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=
+
+upath@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894"
+ integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==
+
+update-notifier@^2.3.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6"
+ integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==
+ dependencies:
+ boxen "^1.2.1"
+ chalk "^2.0.1"
+ configstore "^3.0.0"
+ import-lazy "^2.1.0"
+ is-ci "^1.0.10"
+ is-installed-globally "^0.1.0"
+ is-npm "^1.0.0"
+ latest-version "^3.0.0"
+ semver-diff "^2.0.0"
+ xdg-basedir "^3.0.0"
+
+urix@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+ integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
+
+url-parse-lax@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73"
+ integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=
+ dependencies:
+ prepend-http "^1.0.1"
+
+use@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
+ integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
+
+util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
+
+vorpal@1.12.0:
+ version "1.12.0"
+ resolved "https://registry.yarnpkg.com/vorpal/-/vorpal-1.12.0.tgz#4be7b2a4e48f8fcfc9cf3648c419d311c522159d"
+ integrity sha1-S+eypOSPj8/JzzZIxBnTEcUiFZ0=
+ dependencies:
+ babel-polyfill "^6.3.14"
+ chalk "^1.1.0"
+ in-publish "^2.0.0"
+ inquirer "0.11.0"
+ lodash "^4.5.1"
+ log-update "^1.0.2"
+ minimist "^1.2.0"
+ node-localstorage "^0.6.0"
+ strip-ansi "^3.0.0"
+ wrap-ansi "^2.0.0"
+
+wcwidth@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
+ integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=
+ dependencies:
+ defaults "^1.0.3"
+
+webidl-conversions@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
+ integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=
+
+whatwg-url@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d"
+ integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0=
+ dependencies:
+ tr46 "~0.0.3"
+ webidl-conversions "^3.0.0"
+
+which@^1.2.9:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+ integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
+ dependencies:
+ isexe "^2.0.0"
+
+wide-align@^1.1.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
+ integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==
+ dependencies:
+ string-width "^1.0.2 || 2"
+
+widest-line@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc"
+ integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==
+ dependencies:
+ string-width "^2.1.1"
+
+wrap-ansi@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
+ integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+
+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 sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+
+write-file-atomic@^2.0.0:
+ version "2.4.3"
+ resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481"
+ integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==
+ dependencies:
+ graceful-fs "^4.1.11"
+ imurmurhash "^0.1.4"
+ signal-exit "^3.0.2"
+
+xdg-basedir@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4"
+ integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=
+
+y18n@^5.0.5:
+ version "5.0.5"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18"
+ integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==
+
+yallist@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+ integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=
+
+yallist@^3.0.0, yallist@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
+ integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
+yargs-parser@^20.2.2:
+ version "20.2.7"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a"
+ integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==
+
+yargs@^16.0.3:
+ version "16.2.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
+ integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==
+ dependencies:
+ cliui "^7.0.2"
+ escalade "^3.1.1"
+ get-caller-file "^2.0.5"
+ require-directory "^2.1.1"
+ string-width "^4.2.0"
+ y18n "^5.0.5"
+ yargs-parser "^20.2.2"
+
+yn@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a"
+ integrity sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=
diff --git a/音频分类/speech-commands/tsconfig.json b/音频分类/speech-commands/tsconfig.json
new file mode 100644
index 0000000..5ea8add
--- /dev/null
+++ b/音频分类/speech-commands/tsconfig.json
@@ -0,0 +1,13 @@
+{
+ "extends": "../tsconfig",
+ "include": [
+ "src/"
+ ],
+ "exclude": [
+ "node_modules/"
+ ],
+ "compilerOptions": {
+ "outDir": "./dist",
+ "downlevelIteration": true
+ }
+}
diff --git a/音频分类/speech-commands/tsconfig.test.json b/音频分类/speech-commands/tsconfig.test.json
new file mode 100644
index 0000000..96824ae
--- /dev/null
+++ b/音频分类/speech-commands/tsconfig.test.json
@@ -0,0 +1,14 @@
+{
+ "extends": "../tsconfig.test",
+ "include": [
+ "src/"
+ ],
+ "exclude": [
+ "node_modules/"
+ ],
+ "compilerOptions": {
+ "importHelpers": true,
+ "outDir": "./dist",
+ "downlevelIteration": true
+ }
+}
diff --git a/音频分类/speech-commands/tslint.json b/音频分类/speech-commands/tslint.json
new file mode 100644
index 0000000..ec365f1
--- /dev/null
+++ b/音频分类/speech-commands/tslint.json
@@ -0,0 +1,3 @@
+{
+ "extends": "../tslint.json"
+}
diff --git a/音频分类/speech-commands/yarn.lock b/音频分类/speech-commands/yarn.lock
new file mode 100644
index 0000000..5a3e46a
--- /dev/null
+++ b/音频分类/speech-commands/yarn.lock
@@ -0,0 +1,1572 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@babel/code-frame@^7.0.0":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658"
+ integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==
+ dependencies:
+ "@babel/highlight" "^7.12.13"
+
+"@babel/helper-validator-identifier@^7.12.11":
+ version "7.12.11"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed"
+ integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==
+
+"@babel/highlight@^7.12.13":
+ version "7.13.10"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.13.10.tgz#a8b2a66148f5b27d666b15d81774347a731d52d1"
+ integrity sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.12.11"
+ chalk "^2.0.0"
+ js-tokens "^4.0.0"
+
+"@tensorflow/tfjs-backend-cpu@3.3.0":
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/@tensorflow/tfjs-backend-cpu/-/tfjs-backend-cpu-3.3.0.tgz#aa0a3ed2c6237a6e0c169678c5bd4b5a88766b1c"
+ integrity sha512-DLctv+PUZni26kQW1hq8jwQQ8u+GGc/p764WQIC4/IDagGtfGAUW1mHzWcTxtni2l4re1VrwE41ogWLhv4sGHg==
+ dependencies:
+ "@types/seedrandom" "2.4.27"
+ seedrandom "2.4.3"
+
+"@tensorflow/tfjs-backend-webgl@3.3.0":
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/@tensorflow/tfjs-backend-webgl/-/tfjs-backend-webgl-3.3.0.tgz#29dd665f6a856c9defcb9108164f845e1fdcd02e"
+ integrity sha512-GWCtXbrjPTyye3ooId9GlcNDwnIMskZarUpNIQ5g/zeISLfwEQoutA/UqJF+HzuEHgGMsWFkmaO3xKVT7UMpdg==
+ dependencies:
+ "@tensorflow/tfjs-backend-cpu" "3.3.0"
+ "@types/offscreencanvas" "~2019.3.0"
+ "@types/seedrandom" "2.4.27"
+ "@types/webgl-ext" "0.0.30"
+ "@types/webgl2" "0.0.5"
+ seedrandom "2.4.3"
+
+"@tensorflow/tfjs-converter@3.3.0":
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/@tensorflow/tfjs-converter/-/tfjs-converter-3.3.0.tgz#d9f2ffd0fbdbb47c07d5fd7c3e5dc180cff317aa"
+ integrity sha512-k57wN4yelePhmO9orcT/wzGMIuyedrMpVtg0FhxpV6BQu0+TZ/ti3W4Kb97GWJsoHKXMoing9SnioKfVnBW6hw==
+
+"@tensorflow/tfjs-core@3.3.0", "@tensorflow/tfjs-core@^3.0.0":
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/@tensorflow/tfjs-core/-/tfjs-core-3.3.0.tgz#3d26bd03cb58e0ecf46c96d118c39c4a90b7f5ed"
+ integrity sha512-6G+LcCiQBl4Kza5mDbWbf8QSWBTW3l7SDjGhQzMO1ITtQatHzxkuHGHcJ4CTUJvNA0JmKf4QJWOvlFqEmxwyLQ==
+ dependencies:
+ "@types/offscreencanvas" "~2019.3.0"
+ "@types/seedrandom" "2.4.27"
+ "@types/webgl-ext" "0.0.30"
+ node-fetch "~2.6.1"
+ seedrandom "2.4.3"
+
+"@tensorflow/tfjs-data@3.3.0", "@tensorflow/tfjs-data@^3.0.0":
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/@tensorflow/tfjs-data/-/tfjs-data-3.3.0.tgz#ba943bd6a486fa4cb3ca312c12646ea4dcf6cce4"
+ integrity sha512-0x28tRe6RJu5GmYq3IYN2GNnOgXU0nY+o6zZrlijkK+W3vjSTJlZzaBSifoeD6J8gzVpjs8W8qd/JKHQ1MQp8w==
+ dependencies:
+ "@types/node-fetch" "^2.1.2"
+ node-fetch "~2.6.1"
+
+"@tensorflow/tfjs-layers@3.3.0", "@tensorflow/tfjs-layers@^3.0.0":
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/@tensorflow/tfjs-layers/-/tfjs-layers-3.3.0.tgz#d2097c5b22ec12e5fdbe470a88ca0a34a95ca11f"
+ integrity sha512-qO+TL2I29vWUiuFcQJXNyayWFYagwR+SIfbex8p5jjYaCGHGwE5GQcrH+ngoCgKZxm5tdMvYJsJPnih2M3fYzQ==
+
+"@tensorflow/tfjs-node@^3.0.0":
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/@tensorflow/tfjs-node/-/tfjs-node-3.3.0.tgz#7066b619b067eec480af4c13ec701a9c2bbaeaa6"
+ integrity sha512-grRgaXereQt5mQnu31gHCPkzA6SGReXW94b5FEMk1Psenmb0APnT7MGgZbujiMruQ81vG0/8gYA28uyZeZKcJw==
+ dependencies:
+ "@tensorflow/tfjs" "3.3.0"
+ adm-zip "^0.4.11"
+ google-protobuf "^3.9.2"
+ https-proxy-agent "^2.2.1"
+ node-pre-gyp "0.14.0"
+ progress "^2.0.0"
+ rimraf "^2.6.2"
+ tar "^4.4.6"
+
+"@tensorflow/tfjs@3.3.0":
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/@tensorflow/tfjs/-/tfjs-3.3.0.tgz#db92099dd48c0eb1c1673f705125d2b57496a1a3"
+ integrity sha512-xo22GCUCGcPtNGIdDpLPrp9ms3atXmzX8AF4y3aIBEwK5KlvGe+ZhcoQ2xEOCPQGBr7NB7AO6rwT8gRoziAHVg==
+ dependencies:
+ "@tensorflow/tfjs-backend-cpu" "3.3.0"
+ "@tensorflow/tfjs-backend-webgl" "3.3.0"
+ "@tensorflow/tfjs-converter" "3.3.0"
+ "@tensorflow/tfjs-core" "3.3.0"
+ "@tensorflow/tfjs-data" "3.3.0"
+ "@tensorflow/tfjs-layers" "3.3.0"
+ argparse "^1.0.10"
+ chalk "^4.1.0"
+ core-js "3"
+ regenerator-runtime "^0.13.5"
+ yargs "^16.0.3"
+
+"@types/estree@0.0.38":
+ version "0.0.38"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.38.tgz#c1be40aa933723c608820a99a373a16d215a1ca2"
+ integrity sha512-F/v7t1LwS4vnXuPooJQGBRKRGIoxWUTmA4VHfqjOccFsNDThD5bfUNpITive6s352O7o384wcpEaDV8rHCehDA==
+
+"@types/glob@*":
+ version "7.1.3"
+ resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183"
+ integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==
+ dependencies:
+ "@types/minimatch" "*"
+ "@types/node" "*"
+
+"@types/jasmine@~2.8.8":
+ version "2.8.17"
+ resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.8.17.tgz#65fa3be377126253f6c7988b365dfc78d62d536e"
+ integrity sha512-lXmY2lBjE38ASvP7ah38yZwXCdc7DTCKhHqx4J3WGNiVzp134U0BD9VKdL5x9q9AAfhnpJeQr4owL6ZOXhOpfA==
+
+"@types/minimatch@*":
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.4.tgz#f0ec25dbf2f0e4b18647313ac031134ca5b24b21"
+ integrity sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==
+
+"@types/node-fetch@^2.1.2":
+ version "2.5.8"
+ resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.8.tgz#e199c835d234c7eb0846f6618012e558544ee2fb"
+ integrity sha512-fbjI6ja0N5ZA8TV53RUqzsKNkl9fv8Oj3T7zxW7FGv1GSH7gwJaNF8dzCjrqKaxKeUpTz4yT1DaJFq/omNpGfw==
+ dependencies:
+ "@types/node" "*"
+ form-data "^3.0.0"
+
+"@types/node@*":
+ version "14.14.37"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.37.tgz#a3dd8da4eb84a996c36e331df98d82abd76b516e"
+ integrity sha512-XYmBiy+ohOR4Lh5jE379fV2IU+6Jn4g5qASinhitfyO71b/sCo6MKsMLF5tc7Zf2CE8hViVQyYSobJNke8OvUw==
+
+"@types/offscreencanvas@~2019.3.0":
+ version "2019.3.0"
+ resolved "https://registry.yarnpkg.com/@types/offscreencanvas/-/offscreencanvas-2019.3.0.tgz#3336428ec7e9180cf4566dfea5da04eb586a6553"
+ integrity sha512-esIJx9bQg+QYF0ra8GnvfianIY8qWB0GBx54PK5Eps6m+xTj86KLavHv6qDhzKcu5UUOgNfJ2pWaIIV7TRUd9Q==
+
+"@types/rimraf@^2.0.2":
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-2.0.4.tgz#403887b0b53c6100a6c35d2ab24f6ccc042fec46"
+ integrity sha512-8gBudvllD2A/c0CcEX/BivIDorHFt5UI5m46TsNj8DjWCCTTZT74kEe4g+QsY7P/B9WdO98d82zZgXO/RQzu2Q==
+ dependencies:
+ "@types/glob" "*"
+ "@types/node" "*"
+
+"@types/seedrandom@2.4.27":
+ version "2.4.27"
+ resolved "https://registry.yarnpkg.com/@types/seedrandom/-/seedrandom-2.4.27.tgz#9db563937dd86915f69092bc43259d2f48578e41"
+ integrity sha1-nbVjk33YaRX2kJK8QyWdL0hXjkE=
+
+"@types/tempfile@^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@types/tempfile/-/tempfile-2.0.0.tgz#90dbc3f634a02355ac91562e36b9a1ffd1b83bd1"
+ integrity sha512-2NfUUXChL0L4ZFx0+GtmfoXNwj7c03KQT/4i/cn/CCfpLKglqGz4GB7Gc3KSREet18b+e8A4FnlwA8jJCeowdQ==
+
+"@types/webgl-ext@0.0.30":
+ version "0.0.30"
+ resolved "https://registry.yarnpkg.com/@types/webgl-ext/-/webgl-ext-0.0.30.tgz#0ce498c16a41a23d15289e0b844d945b25f0fb9d"
+ integrity sha512-LKVgNmBxN0BbljJrVUwkxwRYqzsAEPcZOe6S2T6ZaBDIrFp0qu4FNlpc5sM1tGbXUYFgdVQIoeLk1Y1UoblyEg==
+
+"@types/webgl2@0.0.5":
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/@types/webgl2/-/webgl2-0.0.5.tgz#dd925e20ab8ace80eb4b1e46fda5b109c508fb0d"
+ integrity sha512-oGaKsBbxQOY5+aJFV3KECDhGaXt+yZJt2y/OZsnQGLRkH6Fvr7rv4pCt3SRH1somIHfej/c4u7NSpCyd9x+1Ow==
+
+abbrev@1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+ integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
+
+adm-zip@^0.4.11:
+ version "0.4.16"
+ resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365"
+ integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==
+
+agent-base@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee"
+ integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==
+ dependencies:
+ es6-promisify "^5.0.0"
+
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+ integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
+
+ansi-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
+ integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=
+
+ansi-regex@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
+ integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
+
+ansi-styles@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+ integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=
+
+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"
+
+aproba@^1.0.3:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
+ integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
+
+are-we-there-yet@~1.1.2:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
+ integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==
+ dependencies:
+ delegates "^1.0.0"
+ readable-stream "^2.0.6"
+
+argparse@^1.0.10, 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"
+
+arrify@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
+ integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=
+
+async@^1.5.2:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
+ integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
+
+babel-code-frame@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
+ integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=
+ dependencies:
+ chalk "^1.1.3"
+ esutils "^2.0.2"
+ js-tokens "^3.0.2"
+
+babel-core@^6.26.0, babel-core@~6.26.0:
+ version "6.26.3"
+ resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207"
+ integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==
+ dependencies:
+ babel-code-frame "^6.26.0"
+ babel-generator "^6.26.0"
+ babel-helpers "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-register "^6.26.0"
+ babel-runtime "^6.26.0"
+ babel-template "^6.26.0"
+ babel-traverse "^6.26.0"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+ convert-source-map "^1.5.1"
+ debug "^2.6.9"
+ json5 "^0.5.1"
+ lodash "^4.17.4"
+ minimatch "^3.0.4"
+ path-is-absolute "^1.0.1"
+ private "^0.1.8"
+ slash "^1.0.0"
+ source-map "^0.5.7"
+
+babel-generator@^6.26.0:
+ version "6.26.1"
+ resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90"
+ integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==
+ dependencies:
+ babel-messages "^6.23.0"
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ detect-indent "^4.0.0"
+ jsesc "^1.3.0"
+ lodash "^4.17.4"
+ source-map "^0.5.7"
+ trim-right "^1.0.1"
+
+babel-helpers@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
+ integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-messages@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
+ integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-runtime@~6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz#88490d446502ea9b8e7efb0fe09ec4d99479b1ee"
+ integrity sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-register@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071"
+ integrity sha1-btAhFz4vy0htestFxgCahW9kcHE=
+ dependencies:
+ babel-core "^6.26.0"
+ babel-runtime "^6.26.0"
+ core-js "^2.5.0"
+ home-or-tmp "^2.0.0"
+ lodash "^4.17.4"
+ mkdirp "^0.5.1"
+ source-map-support "^0.4.15"
+
+babel-runtime@^6.22.0, babel-runtime@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
+ integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4=
+ dependencies:
+ core-js "^2.4.0"
+ regenerator-runtime "^0.11.0"
+
+babel-template@^6.24.1, babel-template@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
+ integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=
+ dependencies:
+ babel-runtime "^6.26.0"
+ babel-traverse "^6.26.0"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+ lodash "^4.17.4"
+
+babel-traverse@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
+ integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=
+ dependencies:
+ babel-code-frame "^6.26.0"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+ debug "^2.6.8"
+ globals "^9.18.0"
+ invariant "^2.2.2"
+ lodash "^4.17.4"
+
+babel-types@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
+ integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=
+ dependencies:
+ babel-runtime "^6.26.0"
+ esutils "^2.0.2"
+ lodash "^4.17.4"
+ to-fast-properties "^1.0.3"
+
+babylon@^6.18.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
+ integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==
+
+balanced-match@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+ integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
+
+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"
+
+buffer-from@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
+ integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
+
+builtin-modules@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
+ integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=
+
+builtin-modules@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-2.0.0.tgz#60b7ef5ae6546bd7deefa74b08b62a43a232648e"
+ integrity sha512-3U5kUA5VPsRUA3nofm/BXX7GVHKfxz0hOBAPxXrIvHzlDRkQVqEn6yi8QJegxl4LzOHLdvb7XF5dVawa/VVYBg==
+
+chalk@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+ integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
+ dependencies:
+ ansi-styles "^2.2.1"
+ escape-string-regexp "^1.0.2"
+ has-ansi "^2.0.0"
+ strip-ansi "^3.0.0"
+ supports-color "^2.0.0"
+
+chalk@^2.0.0, chalk@^2.3.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.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a"
+ integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+chownr@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
+ integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
+
+clang-format@^1.2.4:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/clang-format/-/clang-format-1.5.0.tgz#1bd4c47b66a1a02556b192b93f5505e7ccec84fb"
+ integrity sha512-C1LucFX7E+ABVYcPEbBHM4PYQ2+WInXsqsLpFlQ9cmRfSbk7A7b1I06h/nE4bQ3MsyEkb31jY2gC0Dtc76b4IA==
+ dependencies:
+ async "^1.5.2"
+ glob "^7.0.0"
+ resolve "^1.1.6"
+
+cliui@^7.0.2:
+ version "7.0.4"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f"
+ integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.0"
+ wrap-ansi "^7.0.0"
+
+code-point-at@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+ integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
+
+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 sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
+
+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==
+
+combined-stream@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
+commander@^2.12.1:
+ version "2.20.3"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
+ integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
+
+commander@~2.13.0:
+ version "2.13.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c"
+ integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
+
+console-control-strings@^1.0.0, console-control-strings@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+ integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=
+
+convert-source-map@^1.5.1:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442"
+ integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==
+ dependencies:
+ safe-buffer "~5.1.1"
+
+core-js@3:
+ version "3.9.1"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.9.1.tgz#cec8de593db8eb2a85ffb0dbdeb312cb6e5460ae"
+ integrity sha512-gSjRvzkxQc1zjM/5paAmL4idJBFzuJoo+jDjF1tStYFMV2ERfD02HhahhCGXUyHxQRG4yFKVSdO6g62eoRMcDg==
+
+core-js@^2.4.0, core-js@^2.5.0:
+ version "2.6.12"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec"
+ integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
+
+core-util-is@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+ integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
+
+dct@^0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/dct/-/dct-0.0.3.tgz#19390a834388a1d3a1373f9edfe50622074849d3"
+ integrity sha1-GTkKg0OIodOhNz+e3+UGIgdISdM=
+
+debug@^2.6.8, debug@^2.6.9:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ dependencies:
+ ms "2.0.0"
+
+debug@^3.1.0, debug@^3.2.6:
+ version "3.2.7"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
+ integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
+ dependencies:
+ ms "^2.1.1"
+
+deep-extend@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
+ integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
+
+delegates@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+ integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
+
+detect-indent@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
+ integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg=
+ dependencies:
+ repeating "^2.0.0"
+
+detect-indent@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.0.0.tgz#0abd0f549f69fc6659a254fe96786186b6f528fd"
+ integrity sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==
+
+detect-libc@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
+ integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=
+
+diff@^3.1.0, diff@^3.2.0:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
+ integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==
+
+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==
+
+es6-promise@^4.0.3:
+ version "4.2.8"
+ resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a"
+ integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==
+
+es6-promisify@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203"
+ integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=
+ dependencies:
+ es6-promise "^4.0.3"
+
+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.2, 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 sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+
+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==
+
+estree-walker@^0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362"
+ integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+form-data@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f"
+ integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ mime-types "^2.1.12"
+
+fs-extra@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd"
+ integrity sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
+fs-extra@^8.0.1:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
+ integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==
+ dependencies:
+ graceful-fs "^4.2.0"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
+fs-minipass@^1.2.7:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7"
+ integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==
+ dependencies:
+ minipass "^2.6.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 sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
+
+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==
+
+gauge@~2.7.3:
+ version "2.7.4"
+ resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
+ integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=
+ dependencies:
+ aproba "^1.0.3"
+ console-control-strings "^1.0.0"
+ has-unicode "^2.0.0"
+ object-assign "^4.1.0"
+ signal-exit "^3.0.0"
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wide-align "^1.1.0"
+
+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==
+
+glob@^7.0.0, glob@^7.0.5, glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
+ version "7.1.6"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
+ integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+globals@^9.18.0:
+ version "9.18.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
+ integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==
+
+google-protobuf@^3.9.2:
+ version "3.15.6"
+ resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.15.6.tgz#2048055828530993a51df4d4ca2c08322fc1ec7c"
+ integrity sha512-p65NyhIZFHFUxbIPOm6cygg2rCjK+2uDCxruOG3RaWKM9R4rBGX0STmlJoSOhoyAG8Fha7U8FP4pQomAV1JXsA==
+
+graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0:
+ version "4.2.6"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee"
+ integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==
+
+has-ansi@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+ integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=
+ dependencies:
+ ansi-regex "^2.0.0"
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+
+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-unicode@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+ integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=
+
+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"
+
+home-or-tmp@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
+ integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg=
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.1"
+
+https-proxy-agent@^2.2.1:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b"
+ integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==
+ dependencies:
+ agent-base "^4.3.0"
+ debug "^3.1.0"
+
+iconv-lite@^0.4.4:
+ version "0.4.24"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+ignore-walk@^3.0.1:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37"
+ integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==
+ dependencies:
+ minimatch "^3.0.4"
+
+ignore@^5.0.4:
+ version "5.1.8"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57"
+ integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@~2.0.3:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+ini@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5"
+ integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==
+
+ini@~1.3.0:
+ version "1.3.8"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
+ integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
+
+invariant@^2.2.2:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
+ integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
+ dependencies:
+ loose-envify "^1.0.0"
+
+is-core-module@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a"
+ integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==
+ dependencies:
+ has "^1.0.3"
+
+is-finite@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3"
+ integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==
+
+is-fullwidth-code-point@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+ integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs=
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+ integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
+
+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-module@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591"
+ integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=
+
+isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+ integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
+
+jasmine-core@^3.2.1, jasmine-core@~3.7.0:
+ version "3.7.1"
+ resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.7.1.tgz#0401327f6249eac993d47bbfa18d4e8efacfb561"
+ integrity sha512-DH3oYDS/AUvvr22+xUBW62m1Xoy7tUlY1tsxKEJvl5JeJ7q8zd1K5bUwiOxdH+erj6l2vAMM3hV25Xs9/WrmuQ==
+
+jasmine@^3.2.0:
+ version "3.7.0"
+ resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-3.7.0.tgz#d36638c0c815e6ad5666676e386d79e2ccb70835"
+ integrity sha512-wlzGQ+cIFzMEsI+wDqmOwvnjTvolLFwlcpYLCqSPPH0prOQaW3P+IzMhHYn934l1imNvw07oCyX+vGUv3wmtSQ==
+ dependencies:
+ glob "^7.1.6"
+ jasmine-core "~3.7.0"
+
+"js-tokens@^3.0.0 || ^4.0.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-tokens@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
+ integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls=
+
+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@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
+ integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s=
+
+json5@^0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+ integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=
+
+jsonfile@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
+ integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+kissfft-js@^0.1.8:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/kissfft-js/-/kissfft-js-0.1.8.tgz#fdc418cd6b8268aad6d2841a7f43db923679e11a"
+ integrity sha512-P3kZXvlFGYe+7N9RJvve5bpq9P0S1tZroSbqmiJZzYi6DlLJMrFpr/CFLpySIYJpZ4WJLYQE17Pj7QY3LNhfxA==
+
+lodash@^4.17.4:
+ version "4.17.21"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+loose-envify@^1.0.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+ integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
+make-error@^1.1.1:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
+ integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
+
+mime-db@1.46.0:
+ version "1.46.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.46.0.tgz#6267748a7f799594de3cbc8cde91def349661cee"
+ integrity sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==
+
+mime-types@^2.1.12:
+ version "2.1.29"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.29.tgz#1d4ab77da64b91f5f72489df29236563754bb1b2"
+ integrity sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==
+ dependencies:
+ mime-db "1.46.0"
+
+minimatch@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+ integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@^1.2.0, minimist@^1.2.5:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
+ integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
+
+minipass@^2.6.0, minipass@^2.9.0:
+ version "2.9.0"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6"
+ integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==
+ dependencies:
+ safe-buffer "^5.1.2"
+ yallist "^3.0.0"
+
+minizlib@^1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d"
+ integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==
+ dependencies:
+ minipass "^2.9.0"
+
+mkdirp@^0.5.1, mkdirp@^0.5.5:
+ version "0.5.5"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
+ integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
+ dependencies:
+ minimist "^1.2.5"
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+ integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
+
+ms@^2.1.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+needle@^2.2.1:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/needle/-/needle-2.6.0.tgz#24dbb55f2509e2324b4a99d61f413982013ccdbe"
+ integrity sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg==
+ dependencies:
+ debug "^3.2.6"
+ iconv-lite "^0.4.4"
+ sax "^1.2.4"
+
+node-fetch@~2.6.1:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052"
+ integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==
+
+node-pre-gyp@0.14.0:
+ version "0.14.0"
+ resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83"
+ integrity sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==
+ dependencies:
+ detect-libc "^1.0.2"
+ mkdirp "^0.5.1"
+ needle "^2.2.1"
+ nopt "^4.0.1"
+ npm-packlist "^1.1.6"
+ npmlog "^4.0.2"
+ rc "^1.2.7"
+ rimraf "^2.6.1"
+ semver "^5.3.0"
+ tar "^4.4.2"
+
+nopt@^4.0.1:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48"
+ integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==
+ dependencies:
+ abbrev "1"
+ osenv "^0.1.4"
+
+npm-bundled@^1.0.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b"
+ integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==
+ dependencies:
+ npm-normalize-package-bin "^1.0.1"
+
+npm-normalize-package-bin@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2"
+ integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==
+
+npm-packlist@^1.1.6, npm-packlist@^1.4.1:
+ version "1.4.8"
+ resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e"
+ integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==
+ dependencies:
+ ignore-walk "^3.0.1"
+ npm-bundled "^1.0.1"
+ npm-normalize-package-bin "^1.0.1"
+
+npmlog@^4.0.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
+ integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
+ dependencies:
+ are-we-there-yet "~1.1.2"
+ console-control-strings "~1.1.0"
+ gauge "~2.7.3"
+ set-blocking "~2.0.0"
+
+number-is-nan@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+ integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
+
+object-assign@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
+
+once@^1.3.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
+ dependencies:
+ wrappy "1"
+
+os-homedir@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+ integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
+
+os-tmpdir@^1.0.0, os-tmpdir@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+ integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
+
+osenv@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
+ integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.0"
+
+path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
+
+path-parse@^1.0.6:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+private@^0.1.8:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
+ integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==
+
+process-nextick-args@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
+ integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+
+progress@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
+ integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
+
+rc@^1.2.7:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
+ integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
+ dependencies:
+ deep-extend "^0.6.0"
+ ini "~1.3.0"
+ minimist "^1.2.0"
+ strip-json-comments "~2.0.1"
+
+readable-stream@^2.0.6:
+ version "2.3.7"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
+ integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.3"
+ isarray "~1.0.0"
+ process-nextick-args "~2.0.0"
+ safe-buffer "~5.1.1"
+ string_decoder "~1.1.1"
+ util-deprecate "~1.0.1"
+
+regenerator-runtime@^0.11.0:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
+ integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
+
+regenerator-runtime@^0.13.5:
+ version "0.13.7"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55"
+ integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==
+
+repeating@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
+ integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=
+ dependencies:
+ is-finite "^1.0.0"
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
+
+resolve@^1.1.6, resolve@^1.3.2, resolve@^1.7.1:
+ version "1.20.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
+ integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
+ dependencies:
+ is-core-module "^2.2.0"
+ path-parse "^1.0.6"
+
+rimraf@2.6.2:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
+ integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==
+ dependencies:
+ glob "^7.0.5"
+
+rimraf@^2.6.1, rimraf@^2.6.2:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
+ integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
+ dependencies:
+ glob "^7.1.3"
+
+rollup-plugin-node-resolve@~3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.3.0.tgz#c26d110a36812cbefa7ce117cadcd3439aa1c713"
+ integrity sha512-9zHGr3oUJq6G+X0oRMYlzid9fXicBdiydhwGChdyeNRGPcN/majtegApRKHLR5drboUvEWU+QeUmGTyEZQs3WA==
+ dependencies:
+ builtin-modules "^2.0.0"
+ is-module "^1.0.0"
+ resolve "^1.1.6"
+
+rollup-plugin-typescript2@~0.13.0:
+ version "0.13.0"
+ resolved "https://registry.yarnpkg.com/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.13.0.tgz#5fc838657d05af82e04554832cadf06cdb32f657"
+ integrity sha512-E+NgtKWuT7QaQAjWz9KKFqC+aoBRR9HeiN/N2EJcAzGggqpcK+jLJGeqnyq+/g0ptaVQCzkyDGhqG0skSn4JHg==
+ dependencies:
+ fs-extra "^5.0.0"
+ resolve "^1.7.1"
+ rollup-pluginutils "^2.0.1"
+ tslib "^1.9.0"
+
+rollup-plugin-uglify@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/rollup-plugin-uglify/-/rollup-plugin-uglify-3.0.0.tgz#a34eca24617709c6bf1778e9653baafa06099b86"
+ integrity sha512-dehLu9eRRoV4l09aC+ySntRw1OAfoyKdbk8Nelblj03tHoynkSybqyEpgavemi1LBOH6S1vzI58/mpxkZIe1iQ==
+ dependencies:
+ uglify-es "^3.3.7"
+
+rollup-pluginutils@^2.0.1:
+ version "2.8.2"
+ resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e"
+ integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==
+ dependencies:
+ estree-walker "^0.6.1"
+
+rollup@~0.58.2:
+ version "0.58.2"
+ resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.58.2.tgz#2feddea8c0c022f3e74b35c48e3c21b3433803ce"
+ integrity sha512-RZVvCWm9BHOYloaE6LLiE/ibpjv1CmI8F8k0B0Cp+q1eezo3cswszJH1DN0djgzSlo0hjuuCmyeI+1XOYLl4wg==
+ dependencies:
+ "@types/estree" "0.0.38"
+ "@types/node" "*"
+
+safe-buffer@^5.1.2, safe-buffer@^5.2.1:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+"safer-buffer@>= 2.1.2 < 3":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+sax@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+ integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
+
+seedrandom@2.4.3:
+ version "2.4.3"
+ resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-2.4.3.tgz#2438504dad33917314bff18ac4d794f16d6aaecc"
+ integrity sha1-JDhQTa0zkXMUv/GKxNeU8W1qrsw=
+
+semver@^5.3.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
+ integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
+
+set-blocking@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+ integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
+
+signal-exit@^3.0.0:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
+ integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
+
+slash@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
+ integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=
+
+source-map-support@^0.4.15:
+ version "0.4.18"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
+ integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==
+ dependencies:
+ source-map "^0.5.6"
+
+source-map-support@^0.5.3:
+ version "0.5.19"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
+ integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map@^0.5.6, source-map@^0.5.7:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+ integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
+
+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 sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
+
+string-width@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+ integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ strip-ansi "^3.0.0"
+
+"string-width@^1.0.2 || 2":
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+ integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
+ dependencies:
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^4.0.0"
+
+string-width@^4.1.0, string-width@^4.2.0:
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5"
+ integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.0"
+
+string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+ integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+ dependencies:
+ safe-buffer "~5.1.0"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+ integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
+ dependencies:
+ ansi-regex "^2.0.0"
+
+strip-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+ integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8=
+ dependencies:
+ ansi-regex "^3.0.0"
+
+strip-ansi@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
+ integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
+ dependencies:
+ ansi-regex "^5.0.0"
+
+strip-json-comments@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+ integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
+
+supports-color@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+ integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=
+
+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"
+
+tar@^4.4.2, tar@^4.4.6:
+ version "4.4.19"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3"
+ integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==
+ dependencies:
+ chownr "^1.1.4"
+ fs-minipass "^1.2.7"
+ minipass "^2.9.0"
+ minizlib "^1.3.3"
+ mkdirp "^0.5.5"
+ safe-buffer "^5.2.1"
+ yallist "^3.1.1"
+
+temp-dir@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d"
+ integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=
+
+tempfile@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-2.0.0.tgz#6b0446856a9b1114d1856ffcbe509cccb0977265"
+ integrity sha1-awRGhWqbERTRhW/8vlCczLCXcmU=
+ dependencies:
+ temp-dir "^1.0.0"
+ uuid "^3.0.1"
+
+to-fast-properties@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
+ integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=
+
+trim-right@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
+ integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=
+
+ts-node@~5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-5.0.1.tgz#78e5d1cb3f704de1b641e43b76be2d4094f06f81"
+ integrity sha512-XK7QmDcNHVmZkVtkiwNDWiERRHPyU8nBqZB1+iv2UhOG0q3RQ9HsZ2CMqISlFbxjrYFGfG2mX7bW4dAyxBVzUw==
+ dependencies:
+ arrify "^1.0.0"
+ chalk "^2.3.0"
+ diff "^3.1.0"
+ make-error "^1.1.1"
+ minimist "^1.2.0"
+ mkdirp "^0.5.1"
+ source-map-support "^0.5.3"
+ yn "^2.0.0"
+
+tslib@1.8.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.8.0.tgz#dc604ebad64bcbf696d613da6c954aa0e7ea1eb6"
+ integrity sha512-ymKWWZJST0/CkgduC2qkzjMOWr4bouhuURNXCn/inEX0L57BnRG6FhX76o7FOnsjHazCjfU2LKeSrlS2sIKQJg==
+
+tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
+ integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+
+tslint-no-circular-imports@^0.6.1:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/tslint-no-circular-imports/-/tslint-no-circular-imports-0.6.2.tgz#ee00dbf6ebb98f8de45a8e3bf743d2656b2e8df4"
+ integrity sha512-WtOE8ArVcZzFDw62Ya/tzk0VeB4xLh4V0Eft2jxKHqUpDzz2S6J63AnhQv3YVyChaj7G4tBhPBE0tcVAflsw4A==
+
+tslint@~5.18.0:
+ version "5.18.0"
+ resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.18.0.tgz#f61a6ddcf372344ac5e41708095bbf043a147ac6"
+ integrity sha512-Q3kXkuDEijQ37nXZZLKErssQVnwCV/+23gFEMROi8IlbaBG6tXqLPQJ5Wjcyt/yHPKBC+hD5SzuGaMora+ZS6w==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ builtin-modules "^1.1.1"
+ chalk "^2.3.0"
+ commander "^2.12.1"
+ diff "^3.2.0"
+ glob "^7.1.1"
+ js-yaml "^3.13.1"
+ minimatch "^3.0.4"
+ mkdirp "^0.5.1"
+ resolve "^1.3.2"
+ semver "^5.3.0"
+ tslib "^1.8.0"
+ tsutils "^2.29.0"
+
+tsutils@^2.29.0:
+ version "2.29.0"
+ resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99"
+ integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==
+ dependencies:
+ tslib "^1.8.1"
+
+typescript@~3.5.3:
+ version "3.5.3"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.5.3.tgz#c830f657f93f1ea846819e929092f5fe5983e977"
+ integrity sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g==
+
+uglify-es@^3.3.7:
+ version "3.3.9"
+ resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677"
+ integrity sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==
+ dependencies:
+ commander "~2.13.0"
+ source-map "~0.6.1"
+
+universalify@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
+ integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
+
+util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
+
+uuid@^3.0.1:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
+ integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
+
+wide-align@^1.1.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
+ integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==
+ dependencies:
+ string-width "^1.0.2 || 2"
+
+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 sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+
+y18n@^5.0.5:
+ version "5.0.5"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18"
+ integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==
+
+yalc@~1.0.0-pre.21:
+ version "1.0.0-pre.50"
+ resolved "https://registry.yarnpkg.com/yalc/-/yalc-1.0.0-pre.50.tgz#e654e5af5f739cf255eedad1d66ba05a17de78f9"
+ integrity sha512-HGFjFFUhXSpQcxyOwJQl3jhERMn7XBgSCCoJ1k3dDPMbH6n56onv6Cp6cDGMiTho8tLIF4x02/Kb4g6pHavzgA==
+ dependencies:
+ chalk "^4.1.0"
+ detect-indent "^6.0.0"
+ fs-extra "^8.0.1"
+ glob "^7.1.4"
+ ignore "^5.0.4"
+ ini "^2.0.0"
+ npm-packlist "^1.4.1"
+ yargs "^16.1.1"
+
+yallist@^3.0.0, yallist@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
+ integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
+yargs-parser@^20.2.2:
+ version "20.2.7"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a"
+ integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==
+
+yargs@^16.0.3, yargs@^16.1.1:
+ version "16.2.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
+ integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==
+ dependencies:
+ cliui "^7.0.2"
+ escalade "^3.1.1"
+ get-caller-file "^2.0.5"
+ require-directory "^2.1.1"
+ string-width "^4.2.0"
+ y18n "^5.0.5"
+ yargs-parser "^20.2.2"
+
+yn@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a"
+ integrity sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=
diff --git a/音频分类/voice.html b/音频分类/voice.html
index 5ea31d4..c9396ae 100644
--- a/音频分类/voice.html
+++ b/音频分类/voice.html
@@ -168,10 +168,11 @@
等待模型训练完成并开始识别...
-
+
+
-
-
+
+