├── .vscode └── settings.json ├── CHANGELOG.md ├── .github └── wb-logo.png ├── SECURITY.md ├── .gitignore ├── .prettierrc ├── legacy └── terraform │ ├── aws │ ├── install_wandb.sh │ ├── local.tf │ ├── README.md │ ├── kube │ │ └── kube.tf │ └── infra │ │ └── infra.tf │ └── azure │ ├── infra │ ├── variables.tf │ ├── outputs.tf │ └── main.tf │ ├── kube_yaml │ └── main.tf │ ├── local.tf │ ├── kube │ └── main.tf │ └── README.md ├── package.json ├── LICENSE ├── README.md ├── tsconfig.json └── yarn.lock /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.formatOnSave": true 3 | } -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | Checkout github [releases](https://github.com/wandb/server/releases). -------------------------------------------------------------------------------- /.github/wb-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wandb/server/HEAD/.github/wb-logo.png -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Reporting a Vulnerability 4 | 5 | Please report all vulnerabilites to security@wandb.com. 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.tfstate* 2 | .terraform 3 | *.lock.hcl 4 | kubeconfig.yaml 5 | wandb.yaml 6 | cert-issuer.yaml 7 | *.tfvars 8 | node_modules 9 | staging/* 10 | js/ -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "parser": "typescript", 3 | "trailingComma": "es5", 4 | "singleQuote": true, 5 | "bracketSpacing": false, 6 | "jsxBracketSameLine": true, 7 | "tabWidth": 2 8 | } 9 | -------------------------------------------------------------------------------- /legacy/terraform/aws/install_wandb.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # This script runs all the necessary terraform commands for you. 4 | set -e 5 | 6 | if [ ! -e ".terraform" ]; then 7 | terraform init 8 | fi 9 | 10 | terraform apply -target module.infra -auto-approve && \ 11 | terraform apply -target module.kube -auto-approve 12 | 13 | echo -e " 14 | 15 | 16 | 17 | ------------------------------------------------------------------ 18 | \033[0;32mSuccess! Your instance should be online at $(terraform output url)\033[0m 19 | " 20 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "local", 3 | "version": "0.76.3", 4 | "description": "W&B Local is the self hosted version of Weights & Biases", 5 | "repository": "git@github.com:wandb/local.git", 6 | "author": "Chris Van Pelt ", 7 | "license": "MIT", 8 | "private": true, 9 | "devDependencies": { 10 | "@octokit/rest": "^18.0.6", 11 | "@types/lodash": "^4.14.171", 12 | "auto-release-notes": "git://github.com/wandb/auto-release-notes.git#v0.2.0", 13 | "lodash": "^4.17.21", 14 | "release-it": "^14.1.0", 15 | "typescript": "^4.3.5" 16 | }, 17 | "release-it": { 18 | "git": { 19 | "requireCleanWorkingDir": false 20 | }, 21 | "github": { 22 | "release": true, 23 | "releaseNotes": "cat ./staging/RELEASE.md" 24 | }, 25 | "npm": { 26 | "publish": false, 27 | "release": false 28 | }, 29 | "hooks": { 30 | "before:init": "rm -rf ./staging/RELEASE.md" 31 | }, 32 | "plugins": { 33 | "./js/plugins/release.js": { 34 | "legacy": false 35 | } 36 | } 37 | } 38 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Weights and Biases 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /legacy/terraform/azure/infra/variables.tf: -------------------------------------------------------------------------------- 1 | variable "global_environment_name" { 2 | description = "A globally unique environment name for S3 buckets." 3 | type = string 4 | } 5 | 6 | variable "region" { 7 | description = "The Azure region in which to place the resources." 8 | type = string 9 | default = "westus2" 10 | } 11 | 12 | variable "db_password" { 13 | description = "Password for the database instance. NOTE: Database is not publicly accessible by default." 14 | type = string 15 | } 16 | 17 | variable "deployment_is_private" { 18 | description = "If true, the load balancer will be placed in a private subnet, and the kubernetes API server endpoint will be private." 19 | type = bool 20 | default = false 21 | } 22 | 23 | variable "use_web_application_firewall" { 24 | description = "If true, we'll provision a web application firewall for increased security" 25 | type = bool 26 | default = false 27 | } 28 | 29 | variable "kubernetes_api_is_private" { 30 | description = "If true, the kubernetes API server endpoint will be private." 31 | type = bool 32 | default = false 33 | } 34 | 35 | variable "vpc_cidr_block" { 36 | description = "CIDR block for the VPC." 37 | type = string 38 | default = "10.10.0.0/16" 39 | } 40 | 41 | variable "public_subnet_cidr_blocks" { 42 | description = "CIDR blocks for the public VPC subnets. Should be a list of 1 CIDR blocks." 43 | type = list(string) 44 | default = ["10.10.0.0/24"] 45 | } 46 | 47 | variable "private_ip" { 48 | description = "The IP address to use when the deployment is private, must be in the public_subnet_cidr_blocks" 49 | type = string 50 | default = "10.10.0.10" 51 | } 52 | 53 | variable "private_subnet_cidr_blocks" { 54 | description = "CIDR blocks for the private VPC subnets. Should be a list of 1 CIDR blocks." 55 | type = list(string) 56 | default = ["10.10.1.0/24"] 57 | } 58 | 59 | variable "firewall_ip_address_allow" { 60 | description = "List of IP addresses that can access the instance via the API. Defaults to anyone." 61 | type = list(string) 62 | default = [] 63 | } 64 | -------------------------------------------------------------------------------- /legacy/terraform/azure/infra/outputs.tf: -------------------------------------------------------------------------------- 1 | output "subnet_id" { 2 | value = azurerm_kubernetes_cluster.wandb.default_node_pool[0].vnet_subnet_id 3 | } 4 | 5 | output "blob_container" { 6 | value = "az://${azurerm_storage_account.wandb.name}/${azurerm_storage_container.wandb.name}" 7 | } 8 | 9 | output "queue" { 10 | value = "az://${azurerm_storage_account.wandb.name}/${azurerm_storage_queue.wandb.name}" 11 | } 12 | 13 | output "mysql" { 14 | value = "mysql://${urlencode(join("@", [azurerm_mysql_server.wandb.administrator_login, azurerm_mysql_server.wandb.name]))}:${urlencode(azurerm_mysql_server.wandb.administrator_login_password)}@${data.azurerm_private_endpoint_connection.wandb.private_service_connection.0.private_ip_address}/${azurerm_mysql_database.wandb.name}" 15 | } 16 | 17 | output "storage_key" { 18 | value = azurerm_storage_account.wandb.primary_access_key 19 | } 20 | 21 | output "storage_account" { 22 | value = azurerm_storage_account.wandb.name 23 | } 24 | 25 | output "public_ip" { 26 | value = azurerm_public_ip.wandb.ip_address 27 | } 28 | 29 | output "public_dns" { 30 | value = azurerm_public_ip.wandb.fqdn 31 | } 32 | 33 | output "resource" { 34 | value = azurerm_public_ip.wandb.resource_group_name 35 | } 36 | 37 | output "virtual_network_id" { 38 | value = azurerm_virtual_network.wandb.id 39 | } 40 | 41 | output "private_ip" { 42 | value = azurerm_application_gateway.wandb.frontend_ip_configuration[1].private_ip_address 43 | } 44 | 45 | #output "private_ip" { 46 | # value = data.azurerm_private_endpoint_connection.wandb_web.private_service_connection.0.private_ip_address 47 | #} 48 | 49 | output "kube_cluster_endpoint" { 50 | value = azurerm_kubernetes_cluster.wandb.kube_config.0.host 51 | } 52 | 53 | output "kube_cert_data" { 54 | value = base64decode(azurerm_kubernetes_cluster.wandb.kube_config.0.client_certificate) 55 | } 56 | 57 | output "kube_client_key" { 58 | value = base64decode(azurerm_kubernetes_cluster.wandb.kube_config.0.client_key) 59 | } 60 | 61 | output "kube_cert_ca" { 62 | value = base64decode(azurerm_kubernetes_cluster.wandb.kube_config.0.cluster_ca_certificate) 63 | } 64 | 65 | output "identity" { 66 | value = data.azurerm_user_assigned_identity.wandb.id 67 | } 68 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | Weights & Biases 3 |

4 | 5 |

Weights & Biases Server

6 |

Server is the self hosted version of Weights & Biases.

7 | 8 |

9 | Quickstart • 10 | Documentation • 11 | AWS Terraform • 12 | Google Terraform • 13 | Azure Terraform 14 |

15 | 16 | ## Quickstart 17 | 18 | 1. On a machine with [Docker](https://docker.com) and [Python](https://www.python.org/) installed, run: 19 | ``` 20 | 1 pip install wandb --upgrade 21 | 2 wandb server start 22 | ``` 23 | 2. Generate a free license from the [Deployer](https://deploy.wandb.ai/). 24 | 3. Add it to your W&B Server's localhost's settings. 25 | 26 | **Paste the license in the /system-admin page on your localhost** 27 | 28 | ![2022-02-24 22 13 59](https://user-images.githubusercontent.com/25806817/166265834-6a9d1be8-2af5-4c63-872e-8e5b3e4082aa.gif) 29 | 30 | 31 | ## Docker 32 | 33 | Running `wandb server start` will start our server and forward port 8080 on the host. 34 | To have other machines report metrics to this server run: `wandb login 35 | --host=http://X.X.X.X:8080`. You can also configure other machines with the 36 | following environment variables: 37 | 38 | ``` 39 | WANDB_BASE_URL=http://X.X.X.X:8080 40 | WANDB_API_KEY=XXXX 41 | ``` 42 | 43 | To run W&B local manually, you can use the following docker command: 44 | 45 | ``` 46 | docker run --rm -d -v wandb:/vol -p 8080:8080 --name wandb-local wandb/local 47 | ``` 48 | 49 | ## Production 50 | 51 | By default this Docker container is not appropriate for production environments. 52 | You can email `contact@wandb.com` to obtain a license that unlocks production 53 | features such as external MySQL, cloud storage, and SSO. 54 | 55 | You can find [Terraform](https://www.terraform.io/) scripts for provisioning 56 | wandb/local in a production environment: 57 | 58 | - [Google](https://github.com/wandb/terraform-google-wandb) 59 | - [AWS](https://github.com/wandb/terraform-aws-wandb) 60 | - [Azure](https://github.com/wandb/local/tree/main/terraform/azure) 61 | 62 | ## Documentation 63 | 64 | More documentation about running wandb/local on your own servers can be found 65 | [here](https://docs.wandb.com/self-hosted/local). 66 | -------------------------------------------------------------------------------- /legacy/terraform/aws/local.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_version = "~> 0.12.25" 3 | backend "local" {} 4 | } 5 | 6 | variable "global_environment_name" { 7 | description = "A globally unique environment name for S3 buckets." 8 | type = string 9 | } 10 | 11 | variable "aws_region" { 12 | description = "The AWS region in which to place the resources." 13 | type = string 14 | default = "us-west-2" 15 | } 16 | 17 | variable "license" { 18 | description = "The license string for your local instance." 19 | type = string 20 | } 21 | 22 | variable "db_password" { 23 | description = "Password for the database instance. NOTE: Database is not publicly accessible by default." 24 | default = "wandb_root_password" 25 | type = string 26 | } 27 | 28 | variable "wandb_version" { 29 | description = "The version of wandb to deploy." 30 | type = string 31 | default = "0.22.0" 32 | } 33 | 34 | variable "deployment_is_private" { 35 | description = "If true, the load balancer will be placed in a private subnet." 36 | type = bool 37 | default = false 38 | } 39 | 40 | 41 | variable "kubernetes_version" { 42 | description = "Kubernetes version to use with aws_eks_cluster and node group." 43 | type = string 44 | default = "1.18" 45 | } 46 | 47 | variable "kubernetes_api_is_private" { 48 | description = "If true, the kubernetes API server endpoint will be private." 49 | type = bool 50 | default = false 51 | } 52 | variable "vpc_cidr_block" { 53 | description = "CIDR block for the VPC." 54 | type = string 55 | default = "10.10.0.0/16" 56 | } 57 | 58 | variable "public_subnet_cidr_blocks" { 59 | description = "CIDR blocks for the public VPC subnets. Should be a list of 2 CIDR blocks." 60 | type = list(string) 61 | default = ["10.10.0.0/24", "10.10.1.0/24"] 62 | } 63 | 64 | variable "private_subnet_cidr_blocks" { 65 | description = "CIDR blocks for the private VPC subnets. Should be a list of 2 CIDR blocks." 66 | type = list(string) 67 | default = ["10.10.2.0/24", "10.10.3.0/24"] 68 | } 69 | 70 | 71 | module "infra" { 72 | source = "./infra" 73 | 74 | global_environment_name = var.global_environment_name 75 | aws_region = var.aws_region 76 | db_password = var.db_password 77 | deployment_is_private = var.deployment_is_private 78 | kubernetes_api_is_private = var.kubernetes_api_is_private 79 | vpc_cidr_block = var.vpc_cidr_block 80 | public_subnet_cidr_blocks = var.public_subnet_cidr_blocks 81 | private_subnet_cidr_blocks = var.private_subnet_cidr_blocks 82 | kubernetes_version = var.kubernetes_version 83 | } 84 | 85 | module "kube" { 86 | source = "./kube" 87 | 88 | license = var.license 89 | wandb_version = var.wandb_version 90 | kube_cluster_endpoint = module.infra.eks_cluster_endpoint 91 | kube_cert_data = module.infra.eks_cert_data 92 | file_storage_bucket_name = module.infra.s3_bucket_name 93 | file_storage_bucket_region = module.infra.s3_bucket_region 94 | file_metadata_queue_name = module.infra.sqs_queue_name 95 | database_endpoint = module.infra.rds_connection_string 96 | token = module.infra.eks_cluster_token 97 | } 98 | 99 | output "url" { 100 | value = "http://${module.infra.lb_dns_name}" 101 | } 102 | -------------------------------------------------------------------------------- /legacy/terraform/aws/README.md: -------------------------------------------------------------------------------- 1 | # This terraform module has been deprecated, please use our [new module](https://github.com/wandb/terraform-aws-wandb) instead. 2 | 3 | ## Installing W&B Local in AWS 4 | 5 | This repo contains a terraform stack you can use to deploy your very own W&B Local instance into your AWS account. 6 | 7 | ### Prerequisites 8 | 9 | To use this install guide, you must have the following utilities installed already: 10 | * [Terraform 0.12.25](https://releases.hashicorp.com/terraform/0.12.25/) 11 | * [AWS CLI](https://aws.amazon.com/cli/) 12 | 13 | ### Preparing for Install 14 | For best results, we recommend applying this terraform stack in an empty AWS subaccount. We also recommend against making custom modifications to this terraform stack (outside of specifying configurable variables) -- we can only guarantee that the default stack in the main branch of this repo is fully functional. 15 | 16 | First, make sure you can access your AWS account with the AWS CLI. You may need to copy credentials into `~/.aws/credentials` and set your `AWS_PROFILE` environment variable. 17 | 18 | Next, create a file in this directory (or wherever you plan to run terraform) called `terraform.tfvars`. In this file, you'll define some variables to configure your install. This file should have at least the following entries: 19 | 20 | ``` 21 | global_environment_name = "" 22 | license = "" 23 | ``` 24 | 25 | Finally, run the following command to initialize terraform: 26 | ``` 27 | terraform init 28 | ``` 29 | 30 | ### Private Installs 31 | This stack has an option to deploy W&B entirely inside a VPC and expose nothing to the internet. To choose this option, specify `deployment_is_private = true` in your `terraform.tfvars` file. Note that if you choose this option, you will only be able to access your W&B instance from inside your VPC (or via VPN connection). 32 | 33 | This stack also contains an option to make the kubernetes API server endpoint private. To choose this option, specify `kubernetes_api_is_private = true` in your `terraform.tfvars` file. If you choose this option, you'll have to run the "Installing W&B in the Cluster" step below with a VPN connection active, since the kubernetes API server endpoint will be private to the VPC. This stack does not provision any VPN resources -- you will have to set up VPN access manually between the two terraform steps described below. 34 | 35 | ### Creating the Cluster (and other resources) 36 | To create the cluster, run the following command: 37 | ``` 38 | terraform apply -target module.infra -auto-approve 39 | ``` 40 | 41 | ## Installing W&B in the Cluster 42 | To install W&B in the cluster, run the following command: 43 | ``` 44 | terraform apply -target module.kube -auto-approve 45 | ``` 46 | ### Alternatively: Quick Install 47 | If you'd like to run all the terraform steps in one go, you can use our included shell script: 48 | ``` 49 | ./install_wandb.sh 50 | ``` 51 | 52 | ### (IMPORTANT!) Save TF State 53 | After install, terraform will generate a `terraform.tfstate` file. It is *extremely* important that you do not lose this file. Without this state file, you will no longer be able to manage your W&B install with terraform. `terraform.tfstate` must be present in your working directory whenever you run any terraform commands. We recommend backing this file up to a well known location. 54 | 55 | ### Cluster Administration 56 | After install, this terraform stack will output a `kubeconfig.yaml` file you can use to administer the cluster. Once the cluster is done installing, try running the following command to see pod status: 57 | ``` 58 | kubectl --kubeconfig=kubeconfig.yaml get pods 59 | ``` 60 | -------------------------------------------------------------------------------- /legacy/terraform/aws/kube/kube.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | kubernetes = "~> 2.1.0" 4 | } 5 | } 6 | 7 | provider "kubernetes" { 8 | host = var.kube_cluster_endpoint 9 | 10 | cluster_ca_certificate = base64decode(var.kube_cert_data) 11 | 12 | config_context_auth_info = "aws" 13 | config_context_cluster = "kubernetes" 14 | 15 | token = var.token 16 | } 17 | 18 | ########################################## 19 | # Variables 20 | ########################################## 21 | 22 | variable "token" { 23 | description = "The token of the kubernetes cluster." 24 | type = string 25 | } 26 | 27 | variable "license" { 28 | description = "The license string for your local instance." 29 | type = string 30 | } 31 | 32 | variable "wandb_version" { 33 | description = "The version of wandb to deploy." 34 | type = string 35 | } 36 | 37 | variable "kube_cluster_endpoint" { 38 | description = "The endpoint for the kube cluster." 39 | type = string 40 | } 41 | 42 | variable "kube_cert_data" { 43 | description = "Certificate authority data for the kube cluster." 44 | type = string 45 | } 46 | 47 | variable "file_storage_bucket_name" { 48 | description = "The name of the file storage bucket." 49 | type = string 50 | } 51 | 52 | variable "file_storage_bucket_region" { 53 | description = "The region in which the file storage bucket resides." 54 | type = string 55 | } 56 | 57 | variable "file_metadata_queue_name" { 58 | description = "The name of the file metadata queue." 59 | type = string 60 | } 61 | 62 | variable "database_endpoint" { 63 | description = "The endpoint for the database." 64 | type = string 65 | } 66 | 67 | ########################################## 68 | # Kubernetes 69 | ########################################## 70 | 71 | resource "kubernetes_deployment" "wandb" { 72 | metadata { 73 | name = "wandb" 74 | labels = { 75 | app = "wandb" 76 | } 77 | } 78 | 79 | spec { 80 | strategy { 81 | type = "RollingUpdate" 82 | } 83 | 84 | replicas = 1 85 | 86 | selector { 87 | match_labels = { 88 | app = "wandb" 89 | } 90 | } 91 | 92 | template { 93 | metadata { 94 | labels = { 95 | app = "wandb" 96 | } 97 | } 98 | 99 | spec { 100 | container { 101 | name = "wandb" 102 | image = "wandb/local:${var.wandb_version}" 103 | image_pull_policy = "Always" 104 | 105 | env { 106 | name = "LICENSE" 107 | value = var.license 108 | } 109 | env { 110 | name = "BUCKET" 111 | value = "s3://${var.file_storage_bucket_name}" 112 | } 113 | env { 114 | name = "BUCKET_QUEUE" 115 | value = "sqs://${var.file_metadata_queue_name}" 116 | } 117 | env { 118 | name = "AWS_REGION" 119 | value = var.file_storage_bucket_region 120 | } 121 | env { 122 | name = "MYSQL" 123 | value = "mysql://${var.database_endpoint}" 124 | } 125 | 126 | port { 127 | name = "http" 128 | container_port = 8080 129 | protocol = "TCP" 130 | } 131 | 132 | liveness_probe { 133 | http_get { 134 | path = "/healthz" 135 | port = "http" 136 | } 137 | } 138 | readiness_probe { 139 | http_get { 140 | path = "/ready" 141 | port = "http" 142 | } 143 | } 144 | startup_probe { 145 | http_get { 146 | path = "/ready" 147 | port = "http" 148 | } 149 | failure_threshold = 60 150 | } 151 | 152 | resources { 153 | requests = { 154 | cpu = "1500m" 155 | memory = "4G" 156 | } 157 | limits = { 158 | cpu = "4000m" 159 | memory = "8G" 160 | } 161 | } 162 | } 163 | } 164 | } 165 | } 166 | } 167 | 168 | resource "kubernetes_service" "wandb_service" { 169 | metadata { 170 | name = "wandb" 171 | } 172 | 173 | spec { 174 | type = "NodePort" 175 | selector = { 176 | app = "wandb" 177 | } 178 | port { 179 | port = 8080 180 | node_port = 32543 181 | } 182 | } 183 | } 184 | 185 | resource "local_file" "kubeconfig" { 186 | filename = "kubeconfig.yaml" 187 | content = <= 0.12.25](https://releases.hashicorp.com/terraform/0.12.25/) 9 | * [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest) 10 | 11 | ## Overview 12 | 13 | This terraform will deploy an application gateway and AKS cluster running wandb connected to a blob container and MySQL database. 14 | 15 | ## Preparing for install 16 | 17 | You'll need to ensure your az command is logged in to the right account by running `az login`. By default we deploy an AKS cluster with the control plane on the internet. If you want to keep the kubernetes control plane off the internet see Private Control Plane below. 18 | 19 | You'll want to store your state in a safe place, here are [instructions for using Azure](https://docs.microsoft.com/en-us/azure/developer/terraform/create-k8s-cluster-with-aks-applicationgateway-ingress#configure-azure-storage-to-store-terraform-state). 20 | 21 | ## Variables 22 | 23 | Check the source code of this repo to see all variables, at a minimum you should be aware the following variables and specify them in a file named `terraform.tfvars`: 24 | 25 | ### Required 26 | 27 | - global_environment_name - _This must be unique to your org as we'll create a storage account / container using this name as well as an azure resource group, eg (my-company-name-wandb)_ 28 | - license - _The W&B license key provided by your account executive_ 29 | - region - _By default we use westus2, if you would like to use a different region override it here_ 30 | 31 | ### Optional 32 | 33 | - db_password - _The password used to connect to your database, you should probably override this_ 34 | - lets_encrypt_email - _If you use lets encrypt to handle SSL we'll create a cluster issuer using this email address, see SSL below_ 35 | - frontend_host - _By default we'll use the azure provided dns at envname.regionname.cloudapp.azure.com_ 36 | - kubernetes_api_is_private - _By default the k8s control is on the internet, to make your installation more secure set this to true, see Private Control Plane below_ 37 | - deployment_is_private - _By default we'll provision an IP address that's accessible on the internet. Adding this flag will make the load balancer only listen on the VPC. We can't provision SSL certificates in this mode, so you'll have to do it manually._ 38 | - ssl_certificate_name - _If you're running the application privately, you'll need to configure an SSL certificate manually. This variable attaches that certificate to the k8s ingress_ 39 | - use_web_application_firewall - _When running the service on the internet, additional security can be provided by enabling a web application firewall. This will incur additional charges_ 40 | - firewall_ip_address_allow - _By default we allow any IP address to log data and use our API's. Providing a list of IP ranges will limit all programmatic access to those IP's. Access to the UI will still be allowed from anywhere on the internet. This only works when the web application firewall is enabled_ 41 | 42 | ## Installation 43 | 44 | Be sure you created a file named `terraform.tfvars` in this directory then run: 45 | 46 | ``` 47 | terraform init 48 | terraform apply 49 | ``` 50 | 51 | Be sure to save all `terraform.*` files in a safe place. 52 | 53 | ## SSL 54 | 55 | If you don't have an SSL certificate we recommend using [lets-encrypt](https://letsencrypt.org). Install cert manager with: 56 | 57 | ``` 58 | kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.7.1/cert-manager.yaml 59 | kubectl apply -f cert-issuer.yaml 60 | ``` 61 | 62 | > NOTE: You can't use cert manager when the deployment is private, see "Private Deployment SSL". 63 | 64 | ## Upgrades 65 | 66 | Modify the `wandb_version` value in `terraform.tfvars` to the latest version of wandb found in this repositories releases and run `terraform apply`. 67 | 68 | ### Private Control Plane 69 | 70 | The simplest way to communicate with a private kubernetes cluster is using a preview feature in Azure called [AKS Run Command](https://docs.microsoft.com/en-us/azure/aks/private-clusters#aks-run-command-preview). You can enable it by running: 71 | 72 | ``` 73 | az feature register --namespace "Microsoft.ContainerService" --name "RunCommandPreview" 74 | ``` 75 | 76 | Wait 10-60 seconds, then run: `az provider register --namespace Microsoft.ContainerService` 77 | 78 | Alternatively you can use the [Azure VPN](https://docs.microsoft.com/en-us/azure/vpn-gateway/openvpn-azure-ad-tenant) app to connect to the VPN after creating the infra with: 79 | 80 | ``` 81 | terraform init 82 | terraform apply -t module.infra 83 | # Connect to VPN 84 | terraform apply -t module.kube 85 | ``` 86 | 87 | If you can't connect to the VPN we output a `wandb.yaml` k8s manifest in the infra step that you can apply with: 88 | 89 | ``` 90 | az aks command invoke -g $GLOBAL_ENV_NAME -n $GLOBAL_ENV_NAME-k8s -c "kubectl apply -f wandb.yaml" -f wandb.yaml 91 | ``` 92 | 93 | ## Private Deployments 94 | 95 | Setting `deployment_is_private` will make the load balancer only listen on the internal network. You'll need to setup DNS and SSL manually. After the terraform has completed you can use the private_ip to add an A record to your DNS service. 96 | 97 | > NOTE: Because of [current limitations](https://github.com/Azure/application-gateway-kubernetes-ingress/issues/741) with the way the Azure Application Gateway integrates with Azure Kubernetes Engine we must provision a public IP address. When `var.deployment_is_private` we block all internet traffic to the public IP. 98 | 99 | ### DNS 100 | 101 | When the deployment is private all we can provide is an IP address. For SSL to work, you'll need to configure your internal DNS to resolve the IP address (10.10.0.10 by default). 102 | 103 | ### Private Deployment SSL 104 | 105 | When the application is running privately we can not automatically provision SSL certificates. You'll need to provision an SSL certificate yourself. You should obtain a certificate from a trusted provider, using self-signed certificates will cause lot's of angst for your end users. 106 | 107 | Once you've obtained a trusted certificate see the [following documentation](https://azure.github.io/application-gateway-kubernetes-ingress/annotations/#appgw-ssl-certificate) for configuring it with your application gateway. You'll need to set the `var.ssl_certificate_name` variable for it to be associated with your deployment. 108 | 109 | ### VPC Peering 110 | 111 | If you're deploying this resource into an isolated VPC, you'll need to peer it with your existing VPC. 112 | You can find the wandb_vpc_id in the output of `terraform apply`. Here's example terraform for configuring 113 | VPC peering: 114 | 115 | ```terraform 116 | resource "azurerm_virtual_network_peering" "wandb" { 117 | name = "my_virtual_network" 118 | resource_group_name = "my_resource_group" 119 | virtual_network_name = "wandb_network" 120 | remote_virtual_network_id = outputs.wandb_vpc_id 121 | } 122 | ``` 123 | 124 | ## References 125 | 126 | - https://azure.github.io/application-gateway-kubernetes-ingress 127 | - https://github.com/Azure/terraform-azurerm-appgw-ingress-k8s-cluster/blob/master/main.tf 128 | - https://github.com/gustavozimm/terraform-aks-app-gateway-ingress/blob/master/main.tf 129 | - https://blog.baeke.info/2020/10/25/ 130 | - https://docs.microsoft.com/en-us/azure/application-gateway/ingress-controller-letsencrypt-certificate-application-gateway 131 | - https://docs.microsoft.com/en-us/azure/web-application-firewall/ag/create-custom-waf-rules 132 | - https://github.com/Azure/application-gateway-kubernetes-ingress/issues/741 -------------------------------------------------------------------------------- /legacy/terraform/azure/infra/main.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | azurerm = { 4 | source = "hashicorp/azurerm" 5 | version = ">=2.63.0" 6 | } 7 | } 8 | } 9 | 10 | provider "azurerm" { 11 | features {} 12 | } 13 | 14 | locals { 15 | backend_address_pool_name = "${azurerm_virtual_network.wandb.name}-beap" 16 | frontend_port_name = "${azurerm_virtual_network.wandb.name}-feport" 17 | frontend_ip_configuration_name = "${azurerm_virtual_network.wandb.name}-feip" 18 | http_setting_name = "${azurerm_virtual_network.wandb.name}-be-htst" 19 | listener_name = "${azurerm_virtual_network.wandb.name}-httplstn" 20 | request_routing_rule_name = "${azurerm_virtual_network.wandb.name}-rqrt" 21 | redirect_configuration_name = "${azurerm_virtual_network.wandb.name}-rdrcfg" 22 | # TODO: this might break if Azure changes the name 23 | app_gateway_uid_name = "ingressapplicationgateway-${var.global_environment_name}-k8s" 24 | 25 | app_gateway_subnet_name = "${var.global_environment_name}-appgw-subnet" 26 | k8s_gateway_subnet_name = "${var.global_environment_name}-k8s-subnet" 27 | 28 | } 29 | 30 | resource "azurerm_resource_group" "wandb" { 31 | name = var.global_environment_name 32 | location = var.region 33 | lifecycle { 34 | ignore_changes = [tags] 35 | } 36 | } 37 | 38 | resource "azurerm_virtual_network" "wandb" { 39 | name = "${var.global_environment_name}-vpc" 40 | address_space = [var.vpc_cidr_block] 41 | location = azurerm_resource_group.wandb.location 42 | resource_group_name = azurerm_resource_group.wandb.name 43 | } 44 | 45 | resource "azurerm_subnet" "backend" { 46 | name = local.k8s_gateway_subnet_name 47 | resource_group_name = azurerm_resource_group.wandb.name 48 | virtual_network_name = azurerm_virtual_network.wandb.name 49 | address_prefixes = var.private_subnet_cidr_blocks 50 | 51 | service_endpoints = ["Microsoft.Sql"] # "Microsoft.Storage", "Microsoft.Web"] 52 | enforce_private_link_endpoint_network_policies = true 53 | enforce_private_link_service_network_policies = true 54 | 55 | # azurerm_subnet_network_security_group_association 56 | } 57 | 58 | resource "azurerm_subnet" "frontend" { 59 | name = local.app_gateway_subnet_name 60 | resource_group_name = azurerm_resource_group.wandb.name 61 | virtual_network_name = azurerm_virtual_network.wandb.name 62 | address_prefixes = var.public_subnet_cidr_blocks 63 | } 64 | 65 | resource "azurerm_public_ip" "wandb" { 66 | name = "wandb-public-ip" 67 | sku = "Standard" 68 | location = azurerm_resource_group.wandb.location 69 | resource_group_name = azurerm_resource_group.wandb.name 70 | allocation_method = "Static" 71 | domain_name_label = var.global_environment_name 72 | } 73 | 74 | resource "azurerm_web_application_firewall_policy" "wandb" { 75 | name = "wandb-wafpolicy" 76 | resource_group_name = azurerm_resource_group.wandb.name 77 | location = azurerm_resource_group.wandb.location 78 | tags = {} 79 | 80 | 81 | custom_rules { 82 | name = "APIAccessRestrictions" 83 | priority = 1 84 | rule_type = "MatchRule" 85 | 86 | match_conditions { 87 | transforms = [] 88 | match_variables { 89 | variable_name = "RemoteAddr" 90 | } 91 | 92 | operator = "IPMatch" 93 | negation_condition = true 94 | match_values = length(var.firewall_ip_address_allow) == 0 ? ["10.10.0.0/16"] : var.firewall_ip_address_allow 95 | } 96 | 97 | match_conditions { 98 | transforms = [] 99 | match_variables { 100 | variable_name = "RequestHeaders" 101 | selector = "Authorization" 102 | } 103 | 104 | operator = "Contains" 105 | negation_condition = false 106 | match_values = ["Basic"] 107 | } 108 | 109 | action = length(var.firewall_ip_address_allow) == 0 ? "Allow" : "Block" 110 | } 111 | 112 | policy_settings { 113 | enabled = true 114 | mode = "Prevention" 115 | request_body_check = false 116 | } 117 | 118 | managed_rules { 119 | managed_rule_set { 120 | version = "3.2" 121 | rule_group_override { 122 | rule_group_name = "REQUEST-942-APPLICATION-ATTACK-SQLI" 123 | disabled_rules = [ 124 | "942200", 125 | "942210", 126 | "942260", 127 | "942450", 128 | "942340", 129 | "942370", 130 | "942440" 131 | ] 132 | } 133 | rule_group_override { 134 | rule_group_name = "REQUEST-941-APPLICATION-ATTACK-XSS" 135 | disabled_rules = [ 136 | "941101", 137 | "941120" 138 | ] 139 | } 140 | rule_group_override { 141 | rule_group_name = "REQUEST-920-PROTOCOL-ENFORCEMENT" 142 | disabled_rules = [ 143 | "920300", 144 | "920440" 145 | ] 146 | } 147 | rule_group_override { 148 | rule_group_name = "REQUEST-913-SCANNER-DETECTION" 149 | disabled_rules = [ 150 | "913101" 151 | ] 152 | } 153 | } 154 | } 155 | } 156 | 157 | resource "azurerm_network_security_group" "wandb" { 158 | # The AKS Application Gateway ingress controller is only able to use a private IP 159 | # if the gateway is using Standard_v2 or WAF_v2. They both currently require 160 | # a public IP, see: https://github.com/Azure/application-gateway-kubernetes-ingress/issues/741 161 | # This rule blocks all internet access to the gateway and is only used if 162 | # var.deployment_is_private 163 | name = "wandb-private-deployment-security-group" 164 | location = azurerm_resource_group.wandb.location 165 | resource_group_name = azurerm_resource_group.wandb.name 166 | 167 | security_rule { 168 | name = "asg-required-management-ports" 169 | priority = 100 170 | direction = "Inbound" 171 | access = "Allow" 172 | protocol = "TCP" 173 | source_port_range = "*" 174 | destination_port_range = "65200-65535" 175 | source_address_prefix = "GatewayManager" 176 | destination_address_prefix = "*" 177 | } 178 | } 179 | 180 | resource "azurerm_subnet_network_security_group_association" "wandb" { 181 | count = var.deployment_is_private ? 1 : 0 182 | subnet_id = azurerm_subnet.frontend.id 183 | network_security_group_id = azurerm_network_security_group.wandb.id 184 | } 185 | 186 | resource "azurerm_application_gateway" "wandb" { 187 | name = "wandb-appgateway" 188 | resource_group_name = azurerm_resource_group.wandb.name 189 | location = azurerm_resource_group.wandb.location 190 | 191 | sku { 192 | name = var.use_web_application_firewall ? "WAF_v2" : "Standard_v2" 193 | tier = var.use_web_application_firewall ? "WAF_v2" : "Standard_v2" 194 | capacity = 2 195 | } 196 | 197 | gateway_ip_configuration { 198 | name = "my-gateway-ip-configuration" 199 | subnet_id = azurerm_subnet.frontend.id 200 | } 201 | 202 | frontend_port { 203 | name = local.frontend_port_name 204 | port = 80 205 | } 206 | 207 | frontend_port { 208 | name = "https_port" 209 | port = 443 210 | } 211 | 212 | frontend_ip_configuration { 213 | name = local.frontend_ip_configuration_name 214 | public_ip_address_id = azurerm_public_ip.wandb.id 215 | } 216 | 217 | frontend_ip_configuration { 218 | name = "${local.frontend_ip_configuration_name}-private" 219 | subnet_id = azurerm_subnet.frontend.id 220 | private_ip_address_allocation = "Static" 221 | private_ip_address = var.private_ip 222 | } 223 | 224 | backend_address_pool { 225 | name = local.backend_address_pool_name 226 | } 227 | 228 | backend_http_settings { 229 | name = local.http_setting_name 230 | cookie_based_affinity = "Disabled" 231 | port = 80 232 | protocol = "http" 233 | request_timeout = 60 234 | } 235 | 236 | http_listener { 237 | name = local.listener_name 238 | frontend_ip_configuration_name = local.frontend_ip_configuration_name 239 | frontend_port_name = local.frontend_port_name 240 | protocol = "http" 241 | } 242 | 243 | request_routing_rule { 244 | name = local.request_routing_rule_name 245 | rule_type = "Basic" 246 | http_listener_name = local.listener_name 247 | backend_address_pool_name = local.backend_address_pool_name 248 | backend_http_settings_name = local.http_setting_name 249 | } 250 | 251 | firewall_policy_id = var.use_web_application_firewall ? azurerm_web_application_firewall_policy.wandb.id : null 252 | 253 | depends_on = [ 254 | azurerm_virtual_network.wandb, 255 | azurerm_public_ip.wandb, 256 | ] 257 | 258 | lifecycle { 259 | # K8S will be changing all of these settings so we ignore them. 260 | # We really only needed this resource to assign a known public IP. 261 | ignore_changes = [ 262 | ssl_certificate, 263 | request_routing_rule, 264 | probe, 265 | frontend_port, 266 | http_listener, 267 | backend_http_settings, 268 | backend_address_pool, 269 | tags 270 | ] 271 | } 272 | } 273 | 274 | data "azurerm_application_gateway" "wandb" { 275 | name = "wandb-appgateway" 276 | resource_group_name = azurerm_resource_group.wandb.name 277 | 278 | depends_on = [ 279 | azurerm_application_gateway.wandb 280 | ] 281 | } 282 | 283 | 284 | data "azurerm_user_assigned_identity" "wandb" { 285 | resource_group_name = azurerm_kubernetes_cluster.wandb.node_resource_group 286 | # The ingress_application_gateway creates a user identity with this name 287 | # TODO: Figure out how to not rely on this convention 288 | name = local.app_gateway_uid_name 289 | } 290 | 291 | resource "azurerm_role_assignment" "ra3" { 292 | scope = azurerm_application_gateway.wandb.id 293 | role_definition_name = "Contributor" 294 | # TODO: we can likely use: data.azurerm_application_gateway.wandb.identity.identity_ids ? 295 | principal_id = data.azurerm_user_assigned_identity.wandb.principal_id 296 | depends_on = [ 297 | data.azurerm_kubernetes_cluster.wandb, 298 | data.azurerm_application_gateway.wandb, 299 | ] 300 | } 301 | 302 | resource "azurerm_role_assignment" "ra4" { 303 | scope = azurerm_resource_group.wandb.id 304 | role_definition_name = "Reader" 305 | # TODO: we can likely use: data.azurerm_application_gateway.wandb.identity.identity_ids ? 306 | principal_id = data.azurerm_user_assigned_identity.wandb.principal_id 307 | depends_on = [ 308 | data.azurerm_kubernetes_cluster.wandb, 309 | data.azurerm_application_gateway.wandb, 310 | ] 311 | } 312 | 313 | resource "azurerm_kubernetes_cluster" "wandb" { 314 | name = "${var.global_environment_name}-k8s" 315 | location = azurerm_resource_group.wandb.location 316 | resource_group_name = azurerm_resource_group.wandb.name 317 | dns_prefix = var.global_environment_name 318 | 319 | default_node_pool { 320 | name = "default" 321 | node_count = 2 322 | vm_size = "Standard_D4s_v3" 323 | vnet_subnet_id = azurerm_subnet.backend.id 324 | type = "VirtualMachineScaleSets" 325 | availability_zones = ["1", "2"] 326 | } 327 | 328 | network_profile { 329 | network_plugin = "azure" 330 | load_balancer_sku = "standard" 331 | # TODO: output firewall? 332 | # load_balancer_profile { 333 | # outbound_ip_address_ids = ["${azurerm_public_ip.outbound.id}"] 334 | # } 335 | } 336 | 337 | # TODO: RBAC? 338 | identity { 339 | type = "SystemAssigned" 340 | } 341 | 342 | # TODO: move outside of addon_profile to avoid breaking in 3.0 343 | addon_profile { 344 | http_application_routing { 345 | enabled = false 346 | } 347 | ingress_application_gateway { 348 | enabled = true 349 | gateway_id = azurerm_application_gateway.wandb.id 350 | } 351 | } 352 | automatic_channel_upgrade = "stable" 353 | 354 | private_cluster_enabled = var.kubernetes_api_is_private 355 | 356 | depends_on = [ 357 | azurerm_virtual_network.wandb, 358 | azurerm_application_gateway.wandb, 359 | ] 360 | } 361 | 362 | data "azurerm_kubernetes_cluster" "wandb" { 363 | depends_on = [azurerm_kubernetes_cluster.wandb] 364 | name = azurerm_kubernetes_cluster.wandb.name 365 | resource_group_name = azurerm_resource_group.wandb.name 366 | } 367 | 368 | resource "azurerm_mysql_server" "wandb" { 369 | name = var.global_environment_name 370 | location = azurerm_resource_group.wandb.location 371 | resource_group_name = azurerm_resource_group.wandb.name 372 | 373 | administrator_login = "wandb" 374 | administrator_login_password = var.db_password 375 | 376 | sku_name = "GP_Gen5_4" 377 | storage_mb = 10240 378 | version = "5.7" 379 | 380 | auto_grow_enabled = true 381 | backup_retention_days = 14 382 | geo_redundant_backup_enabled = false 383 | infrastructure_encryption_enabled = true 384 | public_network_access_enabled = false 385 | ssl_enforcement_enabled = true 386 | ssl_minimal_tls_version_enforced = "TLS1_2" 387 | 388 | lifecycle { 389 | # The DB can scale, just use whatever value it's currently scaled to 390 | ignore_changes = [ 391 | storage_mb 392 | ] 393 | } 394 | } 395 | 396 | resource "azurerm_mysql_database" "wandb" { 397 | name = "wandb" 398 | resource_group_name = azurerm_resource_group.wandb.name 399 | server_name = azurerm_mysql_server.wandb.name 400 | charset = "utf8mb4" 401 | collation = "utf8mb4_general_ci" 402 | } 403 | 404 | # TODO: can we just use a subnet like?: https://github.com/gustavozimm/terraform-aks-app-gateway-ingress/blob/master/main.tf 405 | resource "azurerm_private_endpoint" "wandb" { 406 | name = "wandb-mysql-endpoint" 407 | location = azurerm_resource_group.wandb.location 408 | resource_group_name = azurerm_resource_group.wandb.name 409 | subnet_id = azurerm_subnet.backend.id 410 | 411 | private_service_connection { 412 | name = "wandb-mysql-connection" 413 | private_connection_resource_id = azurerm_mysql_server.wandb.id 414 | subresource_names = ["mysqlServer"] 415 | is_manual_connection = false 416 | } 417 | } 418 | 419 | data "azurerm_private_endpoint_connection" "wandb" { 420 | depends_on = [azurerm_private_endpoint.wandb] 421 | name = azurerm_private_endpoint.wandb.name 422 | resource_group_name = azurerm_resource_group.wandb.name 423 | } 424 | 425 | resource "azurerm_storage_account" "wandb" { 426 | name = replace("${var.global_environment_name}-storage", "-", "") 427 | resource_group_name = azurerm_resource_group.wandb.name 428 | location = azurerm_resource_group.wandb.location 429 | account_tier = "Standard" 430 | account_replication_type = "ZRS" 431 | min_tls_version = "TLS1_2" 432 | 433 | blob_properties { 434 | cors_rule { 435 | allowed_headers = ["*"] 436 | allowed_methods = ["GET", "HEAD", "PUT"] 437 | allowed_origins = ["*"] 438 | exposed_headers = ["ETag"] 439 | max_age_in_seconds = 3600 440 | } 441 | } 442 | } 443 | 444 | resource "azurerm_storage_container" "wandb" { 445 | name = "wandb-files" 446 | storage_account_name = azurerm_storage_account.wandb.name 447 | container_access_type = "private" 448 | } 449 | 450 | resource "azurerm_storage_queue" "wandb" { 451 | name = "wandb-file-metadata" 452 | storage_account_name = azurerm_storage_account.wandb.name 453 | } 454 | 455 | resource "azurerm_eventgrid_system_topic" "wandb" { 456 | name = "wandb-file-metadata-topic" 457 | location = azurerm_resource_group.wandb.location 458 | resource_group_name = azurerm_resource_group.wandb.name 459 | source_arm_resource_id = azurerm_storage_account.wandb.id 460 | topic_type = "Microsoft.Storage.StorageAccounts" 461 | } 462 | 463 | resource "azurerm_eventgrid_system_topic_event_subscription" "wandb" { 464 | name = "wandb-file-metadata-subscription" 465 | # scope = azurerm_resource_group.wandb.id 466 | system_topic = azurerm_eventgrid_system_topic.wandb.name 467 | resource_group_name = azurerm_resource_group.wandb.name 468 | included_event_types = ["Microsoft.Storage.BlobCreated"] 469 | subject_filter { 470 | subject_begins_with = "/blobServices/default/containers/wandb-files/blobs/" 471 | } 472 | 473 | storage_queue_endpoint { 474 | storage_account_id = azurerm_storage_account.wandb.id 475 | queue_name = azurerm_storage_queue.wandb.name 476 | } 477 | } 478 | -------------------------------------------------------------------------------- /legacy/terraform/aws/infra/infra.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | aws = "~> 3.37.0" 4 | } 5 | } 6 | 7 | provider "aws" { 8 | region = var.aws_region 9 | } 10 | 11 | ########################################## 12 | # Variables 13 | ########################################## 14 | 15 | variable "global_environment_name" { 16 | description = "A globally unique environment name for S3 buckets." 17 | type = string 18 | } 19 | 20 | variable "aws_region" { 21 | description = "The AWS region in which to place the resources." 22 | type = string 23 | default = "us-west-2" 24 | } 25 | 26 | variable "db_password" { 27 | description = "Password for the database instance. NOTE: Database is not publicly accessible by default." 28 | type = string 29 | } 30 | 31 | variable "deployment_is_private" { 32 | description = "If true, the load balancer will be placed in a private subnet, and the kubernetes API server endpoint will be private." 33 | type = bool 34 | default = false 35 | } 36 | 37 | variable "kubernetes_version" { 38 | description = "Kubernetes version to use with aws_eks_cluster and node group." 39 | type = string 40 | default = "1.18" 41 | } 42 | 43 | variable "kubernetes_api_is_private" { 44 | description = "If true, the kubernetes API server endpoint will be private." 45 | type = bool 46 | default = false 47 | } 48 | 49 | variable "vpc_cidr_block" { 50 | description = "CIDR block for the VPC." 51 | type = string 52 | default = "10.10.0.0/16" 53 | } 54 | 55 | variable "public_subnet_cidr_blocks" { 56 | description = "CIDR blocks for the public VPC subnets. Should be a list of 2 CIDR blocks." 57 | type = list(string) 58 | default = ["10.10.0.0/24", "10.10.1.0/24"] 59 | } 60 | 61 | variable "private_subnet_cidr_blocks" { 62 | description = "CIDR blocks for the private VPC subnets. Should be a list of 2 CIDR blocks." 63 | type = list(string) 64 | default = ["10.10.2.0/24", "10.10.3.0/24"] 65 | } 66 | 67 | ########################################## 68 | # Data 69 | ########################################## 70 | 71 | data "aws_region" "current" { 72 | } 73 | 74 | data "aws_availability_zones" "available" { 75 | } 76 | 77 | ########################################## 78 | # VPC resources 79 | ########################################## 80 | 81 | resource "aws_vpc" "wandb" { 82 | cidr_block = var.vpc_cidr_block 83 | enable_dns_support = true 84 | enable_dns_hostnames = true 85 | 86 | tags = { 87 | "Name" = "wandb" 88 | "kubernetes.io/cluster/wandb" = "shared" 89 | } 90 | } 91 | 92 | resource "aws_subnet" "wandb_public" { 93 | count = 2 94 | 95 | availability_zone = data.aws_availability_zones.available.names[count.index] 96 | cidr_block = var.public_subnet_cidr_blocks[count.index] 97 | vpc_id = aws_vpc.wandb.id 98 | map_public_ip_on_launch = true 99 | 100 | tags = { 101 | "Name" = "wandb-public-${count.index}" 102 | "kubernetes.io/cluster/wandb" = "shared" 103 | } 104 | } 105 | 106 | resource "aws_subnet" "wandb_private" { 107 | count = 2 108 | 109 | availability_zone = data.aws_availability_zones.available.names[count.index] 110 | cidr_block = var.private_subnet_cidr_blocks[count.index] 111 | vpc_id = aws_vpc.wandb.id 112 | 113 | depends_on = [aws_subnet.wandb_public] 114 | 115 | tags = { 116 | "Name" = "wandb-private-${count.index}" 117 | "kubernetes.io/cluster/wandb" = "shared" 118 | } 119 | } 120 | 121 | resource "aws_eip" "wandb" { 122 | count = 2 123 | 124 | vpc = true 125 | 126 | tags = { 127 | Name = "wandb-eip-${count.index}" 128 | } 129 | } 130 | 131 | resource "aws_nat_gateway" "wandb" { 132 | count = 2 133 | 134 | allocation_id = aws_eip.wandb[count.index].id 135 | subnet_id = aws_subnet.wandb_public[count.index].id 136 | 137 | depends_on = [aws_internet_gateway.wandb] 138 | 139 | tags = { 140 | Name = "wandb-nat-gateway-${count.index}" 141 | } 142 | } 143 | resource "aws_internet_gateway" "wandb" { 144 | vpc_id = aws_vpc.wandb.id 145 | 146 | tags = { 147 | Name = "wandb-gateway" 148 | } 149 | } 150 | 151 | resource "aws_route_table" "wandb_public" { 152 | vpc_id = aws_vpc.wandb.id 153 | 154 | route { 155 | cidr_block = "0.0.0.0/0" 156 | gateway_id = aws_internet_gateway.wandb.id 157 | } 158 | 159 | tags = { 160 | Name = "wandb-route-table-public" 161 | } 162 | } 163 | 164 | resource "aws_route_table_association" "wandb_public" { 165 | count = 2 166 | 167 | subnet_id = aws_subnet.wandb_public[count.index].id 168 | route_table_id = aws_route_table.wandb_public.id 169 | } 170 | 171 | resource "aws_route_table" "wandb_private" { 172 | count = 2 173 | 174 | vpc_id = aws_vpc.wandb.id 175 | 176 | route { 177 | cidr_block = "0.0.0.0/0" 178 | nat_gateway_id = aws_nat_gateway.wandb[count.index].id 179 | } 180 | 181 | tags = { 182 | Name = "wandb-route-table-private-${count.index}" 183 | } 184 | } 185 | 186 | resource "aws_route_table_association" "wandb_private" { 187 | count = 2 188 | 189 | subnet_id = aws_subnet.wandb_private[count.index].id 190 | route_table_id = aws_route_table.wandb_private[count.index].id 191 | } 192 | 193 | ########################################## 194 | # EKS resources 195 | ########################################## 196 | 197 | resource "aws_security_group" "eks_master" { 198 | name = "wandb-eks-master" 199 | description = "Cluster communication with worker nodes" 200 | vpc_id = aws_vpc.wandb.id 201 | 202 | egress { 203 | from_port = 0 204 | to_port = 0 205 | protocol = "-1" 206 | cidr_blocks = ["0.0.0.0/0"] 207 | } 208 | 209 | tags = { 210 | Name = "wandb-eks-master" 211 | } 212 | } 213 | 214 | resource "aws_eks_cluster" "wandb" { 215 | name = "wandb" 216 | role_arn = aws_iam_role.wandb_cluster_role.arn 217 | version = var.kubernetes_version 218 | 219 | vpc_config { 220 | endpoint_private_access = true 221 | endpoint_public_access = ! var.kubernetes_api_is_private 222 | security_group_ids = [aws_security_group.eks_master.id] 223 | subnet_ids = aws_subnet.wandb_private[*].id 224 | } 225 | 226 | depends_on = [ 227 | aws_iam_role_policy_attachment.wandb_eks_cluster_policy, 228 | aws_iam_role_policy_attachment.wandb_eks_service_policy, 229 | ] 230 | } 231 | 232 | data "aws_eks_cluster_auth" "wandb" { 233 | name = "wandb" 234 | } 235 | 236 | output "eks_cluster_token" { 237 | value = data.aws_eks_cluster_auth.wandb.token 238 | } 239 | 240 | output "eks_cluster_endpoint" { 241 | value = aws_eks_cluster.wandb.endpoint 242 | } 243 | 244 | output "eks_cert_data" { 245 | value = aws_eks_cluster.wandb.certificate_authority[0].data 246 | } 247 | 248 | resource "aws_security_group_rule" "eks_worker_ingress" { 249 | description = "Allow comntainer NodePort service to receive load balancer traffic" 250 | protocol = "tcp" 251 | security_group_id = aws_eks_cluster.wandb.vpc_config[0].cluster_security_group_id 252 | source_security_group_id = aws_security_group.wandb_alb.id 253 | from_port = 32543 254 | to_port = 32543 255 | type = "ingress" 256 | } 257 | 258 | resource "aws_iam_role" "wandb_cluster_role" { 259 | name = "wandb-cluster-role" 260 | 261 | assume_role_policy = <= 8" 255 | 256 | "@octokit/types@^6.0.3", "@octokit/types@^6.16.1", "@octokit/types@^6.18.0", "@octokit/types@^6.22.0": 257 | version "6.22.0" 258 | resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.22.0.tgz#389bade20955c919241b6ffb9dd33f6e0cf1cc6c" 259 | integrity sha512-Y8GR0BJHQDpO09qw/ZQpN+DXrFzCWaE0pvK4frDm3zJ+h99AktsFfBoDazbCtHxiL8d0jD8xRH4BeynlKLeChg== 260 | dependencies: 261 | "@octokit/openapi-types" "^9.2.0" 262 | 263 | "@sindresorhus/is@^0.14.0": 264 | version "0.14.0" 265 | resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" 266 | integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== 267 | 268 | "@sindresorhus/is@^3.1.1": 269 | version "3.1.2" 270 | resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-3.1.2.tgz#548650de521b344e3781fbdb0ece4aa6f729afb8" 271 | integrity sha512-JiX9vxoKMmu8Y3Zr2RVathBL1Cdu4Nt4MuNWemt1Nc06A0RAin9c5FArkhGsyMBWfCu4zj+9b+GxtjAnE4qqLQ== 272 | 273 | "@szmarczak/http-timer@^1.1.2": 274 | version "1.1.2" 275 | resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" 276 | integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== 277 | dependencies: 278 | defer-to-connect "^1.0.1" 279 | 280 | "@szmarczak/http-timer@^4.0.5": 281 | version "4.0.5" 282 | resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.5.tgz#bfbd50211e9dfa51ba07da58a14cdfd333205152" 283 | integrity sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ== 284 | dependencies: 285 | defer-to-connect "^2.0.0" 286 | 287 | "@types/cacheable-request@^6.0.1": 288 | version "6.0.1" 289 | resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.1.tgz#5d22f3dded1fd3a84c0bbeb5039a7419c2c91976" 290 | integrity sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ== 291 | dependencies: 292 | "@types/http-cache-semantics" "*" 293 | "@types/keyv" "*" 294 | "@types/node" "*" 295 | "@types/responselike" "*" 296 | 297 | "@types/http-cache-semantics@*": 298 | version "4.0.0" 299 | resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz#9140779736aa2655635ee756e2467d787cfe8a2a" 300 | integrity sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A== 301 | 302 | "@types/keyv@*": 303 | version "3.1.1" 304 | resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.1.tgz#e45a45324fca9dab716ab1230ee249c9fb52cfa7" 305 | integrity sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw== 306 | dependencies: 307 | "@types/node" "*" 308 | 309 | "@types/lodash@^4.14.171": 310 | version "4.14.171" 311 | resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.171.tgz#f01b3a5fe3499e34b622c362a46a609fdb23573b" 312 | integrity sha512-7eQ2xYLLI/LsicL2nejW9Wyko3lcpN6O/z0ZLHrEQsg280zIdCv1t/0m6UtBjUHokCGBQ3gYTbHzDkZ1xOBwwg== 313 | 314 | "@types/node@*", "@types/node@>= 8": 315 | version "14.11.8" 316 | resolved "https://registry.yarnpkg.com/@types/node/-/node-14.11.8.tgz#fe2012f2355e4ce08bca44aeb3abbb21cf88d33f" 317 | integrity sha512-KPcKqKm5UKDkaYPTuXSx8wEP7vE9GnuaXIZKijwRYcePpZFDVuy2a57LarFKiORbHOuTOOwYzxVxcUzsh2P2Pw== 318 | 319 | "@types/parse-json@^4.0.0": 320 | version "4.0.0" 321 | resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" 322 | integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== 323 | 324 | "@types/responselike@*", "@types/responselike@^1.0.0": 325 | version "1.0.0" 326 | resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" 327 | integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== 328 | dependencies: 329 | "@types/node" "*" 330 | 331 | ansi-align@^3.0.0: 332 | version "3.0.0" 333 | resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb" 334 | integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw== 335 | dependencies: 336 | string-width "^3.0.0" 337 | 338 | ansi-escapes@^4.2.1: 339 | version "4.3.1" 340 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" 341 | integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== 342 | dependencies: 343 | type-fest "^0.11.0" 344 | 345 | ansi-regex@^4.1.0: 346 | version "4.1.0" 347 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" 348 | integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== 349 | 350 | ansi-regex@^5.0.0: 351 | version "5.0.0" 352 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" 353 | integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== 354 | 355 | ansi-styles@^3.2.1: 356 | version "3.2.1" 357 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 358 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 359 | dependencies: 360 | color-convert "^1.9.0" 361 | 362 | ansi-styles@^4.1.0: 363 | version "4.3.0" 364 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 365 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 366 | dependencies: 367 | color-convert "^2.0.1" 368 | 369 | array-union@^2.1.0: 370 | version "2.1.0" 371 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" 372 | integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== 373 | 374 | async-retry@1.3.1: 375 | version "1.3.1" 376 | resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.1.tgz#139f31f8ddce50c0870b0ba558a6079684aaed55" 377 | integrity sha512-aiieFW/7h3hY0Bq5d+ktDBejxuwR78vRu9hDUdR8rNhSaQ29VzPL4AoIRG7D/c7tdenwOcKvgPM6tIxB3cB6HA== 378 | dependencies: 379 | retry "0.12.0" 380 | 381 | asynckit@^0.4.0: 382 | version "0.4.0" 383 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 384 | integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= 385 | 386 | "auto-release-notes@git://github.com/wandb/auto-release-notes.git#v0.2.0": 387 | version "0.2.0" 388 | resolved "git://github.com/wandb/auto-release-notes.git#e76554df3d2cf3db0c6f58e4e6b9ec6541f26a9c" 389 | dependencies: 390 | "@actions/core" "^1.2.6" 391 | "@actions/github" "^5.0.0" 392 | "@octokit/rest" "^18.7.2" 393 | external-editor "^3.1.0" 394 | 395 | balanced-match@^1.0.0: 396 | version "1.0.0" 397 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 398 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 399 | 400 | before-after-hook@^2.1.0: 401 | version "2.1.0" 402 | resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.1.0.tgz#b6c03487f44e24200dd30ca5e6a1979c5d2fb635" 403 | integrity sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A== 404 | 405 | before-after-hook@^2.2.0: 406 | version "2.2.2" 407 | resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.2.tgz#a6e8ca41028d90ee2c24222f201c90956091613e" 408 | integrity sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ== 409 | 410 | boxen@^4.2.0: 411 | version "4.2.0" 412 | resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64" 413 | integrity sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ== 414 | dependencies: 415 | ansi-align "^3.0.0" 416 | camelcase "^5.3.1" 417 | chalk "^3.0.0" 418 | cli-boxes "^2.2.0" 419 | string-width "^4.1.0" 420 | term-size "^2.1.0" 421 | type-fest "^0.8.1" 422 | widest-line "^3.1.0" 423 | 424 | brace-expansion@^1.1.7: 425 | version "1.1.11" 426 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 427 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 428 | dependencies: 429 | balanced-match "^1.0.0" 430 | concat-map "0.0.1" 431 | 432 | braces@^3.0.1: 433 | version "3.0.2" 434 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 435 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 436 | dependencies: 437 | fill-range "^7.0.1" 438 | 439 | cacheable-lookup@^5.0.3: 440 | version "5.0.3" 441 | resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.3.tgz#049fdc59dffdd4fc285e8f4f82936591bd59fec3" 442 | integrity sha512-W+JBqF9SWe18A72XFzN/V/CULFzPm7sBXzzR6ekkE+3tLG72wFZrBiBZhrZuDoYexop4PHJVdFAKb/Nj9+tm9w== 443 | 444 | cacheable-request@^6.0.0: 445 | version "6.1.0" 446 | resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" 447 | integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== 448 | dependencies: 449 | clone-response "^1.0.2" 450 | get-stream "^5.1.0" 451 | http-cache-semantics "^4.0.0" 452 | keyv "^3.0.0" 453 | lowercase-keys "^2.0.0" 454 | normalize-url "^4.1.0" 455 | responselike "^1.0.2" 456 | 457 | cacheable-request@^7.0.1: 458 | version "7.0.1" 459 | resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.1.tgz#062031c2856232782ed694a257fa35da93942a58" 460 | integrity sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw== 461 | dependencies: 462 | clone-response "^1.0.2" 463 | get-stream "^5.1.0" 464 | http-cache-semantics "^4.0.0" 465 | keyv "^4.0.0" 466 | lowercase-keys "^2.0.0" 467 | normalize-url "^4.1.0" 468 | responselike "^2.0.0" 469 | 470 | callsites@^3.0.0: 471 | version "3.1.0" 472 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 473 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 474 | 475 | camelcase@^5.3.1: 476 | version "5.3.1" 477 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" 478 | integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== 479 | 480 | chalk@4.1.0, chalk@^4.0.0, chalk@^4.1.0: 481 | version "4.1.0" 482 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" 483 | integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== 484 | dependencies: 485 | ansi-styles "^4.1.0" 486 | supports-color "^7.1.0" 487 | 488 | chalk@^2.0.0: 489 | version "2.4.2" 490 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 491 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 492 | dependencies: 493 | ansi-styles "^3.2.1" 494 | escape-string-regexp "^1.0.5" 495 | supports-color "^5.3.0" 496 | 497 | chalk@^3.0.0: 498 | version "3.0.0" 499 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" 500 | integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== 501 | dependencies: 502 | ansi-styles "^4.1.0" 503 | supports-color "^7.1.0" 504 | 505 | chardet@^0.7.0: 506 | version "0.7.0" 507 | resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" 508 | integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== 509 | 510 | ci-info@^2.0.0: 511 | version "2.0.0" 512 | resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" 513 | integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== 514 | 515 | cli-boxes@^2.2.0: 516 | version "2.2.1" 517 | resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" 518 | integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== 519 | 520 | cli-cursor@^3.1.0: 521 | version "3.1.0" 522 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" 523 | integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== 524 | dependencies: 525 | restore-cursor "^3.1.0" 526 | 527 | cli-spinners@^2.4.0: 528 | version "2.5.0" 529 | resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.5.0.tgz#12763e47251bf951cb75c201dfa58ff1bcb2d047" 530 | integrity sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ== 531 | 532 | cli-width@^3.0.0: 533 | version "3.0.0" 534 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" 535 | integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== 536 | 537 | clone-response@^1.0.2: 538 | version "1.0.2" 539 | resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" 540 | integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= 541 | dependencies: 542 | mimic-response "^1.0.0" 543 | 544 | clone@^1.0.2: 545 | version "1.0.4" 546 | resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" 547 | integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= 548 | 549 | color-convert@^1.9.0: 550 | version "1.9.3" 551 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 552 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 553 | dependencies: 554 | color-name "1.1.3" 555 | 556 | color-convert@^2.0.1: 557 | version "2.0.1" 558 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 559 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 560 | dependencies: 561 | color-name "~1.1.4" 562 | 563 | color-name@1.1.3: 564 | version "1.1.3" 565 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 566 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 567 | 568 | color-name@~1.1.4: 569 | version "1.1.4" 570 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 571 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 572 | 573 | combined-stream@^1.0.8: 574 | version "1.0.8" 575 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 576 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 577 | dependencies: 578 | delayed-stream "~1.0.0" 579 | 580 | concat-map@0.0.1: 581 | version "0.0.1" 582 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 583 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 584 | 585 | configstore@^5.0.1: 586 | version "5.0.1" 587 | resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" 588 | integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== 589 | dependencies: 590 | dot-prop "^5.2.0" 591 | graceful-fs "^4.1.2" 592 | make-dir "^3.0.0" 593 | unique-string "^2.0.0" 594 | write-file-atomic "^3.0.0" 595 | xdg-basedir "^4.0.0" 596 | 597 | cosmiconfig@7.0.0: 598 | version "7.0.0" 599 | resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" 600 | integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA== 601 | dependencies: 602 | "@types/parse-json" "^4.0.0" 603 | import-fresh "^3.2.1" 604 | parse-json "^5.0.0" 605 | path-type "^4.0.0" 606 | yaml "^1.10.0" 607 | 608 | cross-spawn@^7.0.0: 609 | version "7.0.3" 610 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 611 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 612 | dependencies: 613 | path-key "^3.1.0" 614 | shebang-command "^2.0.0" 615 | which "^2.0.1" 616 | 617 | crypto-random-string@^2.0.0: 618 | version "2.0.0" 619 | resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" 620 | integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== 621 | 622 | debug@4.2.0: 623 | version "4.2.0" 624 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" 625 | integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== 626 | dependencies: 627 | ms "2.1.2" 628 | 629 | decompress-response@^3.3.0: 630 | version "3.3.0" 631 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" 632 | integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= 633 | dependencies: 634 | mimic-response "^1.0.0" 635 | 636 | decompress-response@^6.0.0: 637 | version "6.0.0" 638 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" 639 | integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== 640 | dependencies: 641 | mimic-response "^3.1.0" 642 | 643 | deep-extend@^0.6.0: 644 | version "0.6.0" 645 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 646 | integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== 647 | 648 | defaults@^1.0.3: 649 | version "1.0.3" 650 | resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" 651 | integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= 652 | dependencies: 653 | clone "^1.0.2" 654 | 655 | defer-to-connect@^1.0.1: 656 | version "1.1.3" 657 | resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" 658 | integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== 659 | 660 | defer-to-connect@^2.0.0: 661 | version "2.0.0" 662 | resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.0.tgz#83d6b199db041593ac84d781b5222308ccf4c2c1" 663 | integrity sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg== 664 | 665 | delayed-stream@~1.0.0: 666 | version "1.0.0" 667 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 668 | integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= 669 | 670 | deprecated-obj@2.0.0: 671 | version "2.0.0" 672 | resolved "https://registry.yarnpkg.com/deprecated-obj/-/deprecated-obj-2.0.0.tgz#e6ba93a3989f6ed18d685e7d99fb8d469b4beffc" 673 | integrity sha512-CkdywZC2rJ8RGh+y3MM1fw1EJ4oO/oNExGbRFv0AQoMS+faTd3nO7slYjkj/6t8OnIMUE+wxh6G97YHhK1ytrw== 674 | dependencies: 675 | flat "^5.0.2" 676 | lodash "^4.17.20" 677 | 678 | deprecation@^2.0.0, deprecation@^2.3.1: 679 | version "2.3.1" 680 | resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" 681 | integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== 682 | 683 | dir-glob@^3.0.1: 684 | version "3.0.1" 685 | resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" 686 | integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== 687 | dependencies: 688 | path-type "^4.0.0" 689 | 690 | dot-prop@^5.2.0: 691 | version "5.3.0" 692 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" 693 | integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== 694 | dependencies: 695 | is-obj "^2.0.0" 696 | 697 | duplexer3@^0.1.4: 698 | version "0.1.4" 699 | resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" 700 | integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= 701 | 702 | emoji-regex@^7.0.1: 703 | version "7.0.3" 704 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" 705 | integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== 706 | 707 | emoji-regex@^8.0.0: 708 | version "8.0.0" 709 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 710 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 711 | 712 | end-of-stream@^1.1.0: 713 | version "1.4.4" 714 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" 715 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== 716 | dependencies: 717 | once "^1.4.0" 718 | 719 | error-ex@^1.3.1: 720 | version "1.3.2" 721 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" 722 | integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== 723 | dependencies: 724 | is-arrayish "^0.2.1" 725 | 726 | escape-goat@^2.0.0: 727 | version "2.1.1" 728 | resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" 729 | integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== 730 | 731 | escape-string-regexp@^1.0.5: 732 | version "1.0.5" 733 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 734 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 735 | 736 | execa@4.0.3, execa@^4.0.2: 737 | version "4.0.3" 738 | resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.3.tgz#0a34dabbad6d66100bd6f2c576c8669403f317f2" 739 | integrity sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A== 740 | dependencies: 741 | cross-spawn "^7.0.0" 742 | get-stream "^5.0.0" 743 | human-signals "^1.1.1" 744 | is-stream "^2.0.0" 745 | merge-stream "^2.0.0" 746 | npm-run-path "^4.0.0" 747 | onetime "^5.1.0" 748 | signal-exit "^3.0.2" 749 | strip-final-newline "^2.0.0" 750 | 751 | external-editor@^3.0.3, external-editor@^3.1.0: 752 | version "3.1.0" 753 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" 754 | integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== 755 | dependencies: 756 | chardet "^0.7.0" 757 | iconv-lite "^0.4.24" 758 | tmp "^0.0.33" 759 | 760 | fast-glob@^3.1.1: 761 | version "3.2.4" 762 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3" 763 | integrity sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ== 764 | dependencies: 765 | "@nodelib/fs.stat" "^2.0.2" 766 | "@nodelib/fs.walk" "^1.2.3" 767 | glob-parent "^5.1.0" 768 | merge2 "^1.3.0" 769 | micromatch "^4.0.2" 770 | picomatch "^2.2.1" 771 | 772 | fastq@^1.6.0: 773 | version "1.8.0" 774 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.8.0.tgz#550e1f9f59bbc65fe185cb6a9b4d95357107f481" 775 | integrity sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q== 776 | dependencies: 777 | reusify "^1.0.4" 778 | 779 | figures@^3.0.0: 780 | version "3.2.0" 781 | resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" 782 | integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== 783 | dependencies: 784 | escape-string-regexp "^1.0.5" 785 | 786 | fill-range@^7.0.1: 787 | version "7.0.1" 788 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 789 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 790 | dependencies: 791 | to-regex-range "^5.0.1" 792 | 793 | find-up@5.0.0: 794 | version "5.0.0" 795 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 796 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 797 | dependencies: 798 | locate-path "^6.0.0" 799 | path-exists "^4.0.0" 800 | 801 | flat@^5.0.2: 802 | version "5.0.2" 803 | resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" 804 | integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== 805 | 806 | form-data@3.0.0: 807 | version "3.0.0" 808 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.0.tgz#31b7e39c85f1355b7139ee0c647cf0de7f83c682" 809 | integrity sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg== 810 | dependencies: 811 | asynckit "^0.4.0" 812 | combined-stream "^1.0.8" 813 | mime-types "^2.1.12" 814 | 815 | fs.realpath@^1.0.0: 816 | version "1.0.0" 817 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 818 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 819 | 820 | get-stream@^4.1.0: 821 | version "4.1.0" 822 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" 823 | integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== 824 | dependencies: 825 | pump "^3.0.0" 826 | 827 | get-stream@^5.0.0, get-stream@^5.1.0: 828 | version "5.2.0" 829 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" 830 | integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== 831 | dependencies: 832 | pump "^3.0.0" 833 | 834 | git-up@^4.0.0: 835 | version "4.0.2" 836 | resolved "https://registry.yarnpkg.com/git-up/-/git-up-4.0.2.tgz#10c3d731051b366dc19d3df454bfca3f77913a7c" 837 | integrity sha512-kbuvus1dWQB2sSW4cbfTeGpCMd8ge9jx9RKnhXhuJ7tnvT+NIrTVfYZxjtflZddQYcmdOTlkAcjmx7bor+15AQ== 838 | dependencies: 839 | is-ssh "^1.3.0" 840 | parse-url "^5.0.0" 841 | 842 | git-url-parse@11.3.0: 843 | version "11.3.0" 844 | resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-11.3.0.tgz#1515b4574c4eb2efda7d25cc50b29ce8beaefaae" 845 | integrity sha512-i3XNa8IKmqnUqWBcdWBjOcnyZYfN3C1WRvnKI6ouFWwsXCZEnlgbwbm55ZpJ3OJMhfEP/ryFhqW8bBhej3C5Ug== 846 | dependencies: 847 | git-up "^4.0.0" 848 | 849 | glob-parent@^5.1.0: 850 | version "5.1.1" 851 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" 852 | integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== 853 | dependencies: 854 | is-glob "^4.0.1" 855 | 856 | glob@^7.0.0: 857 | version "7.1.6" 858 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 859 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 860 | dependencies: 861 | fs.realpath "^1.0.0" 862 | inflight "^1.0.4" 863 | inherits "2" 864 | minimatch "^3.0.4" 865 | once "^1.3.0" 866 | path-is-absolute "^1.0.0" 867 | 868 | global-dirs@^2.0.1: 869 | version "2.0.1" 870 | resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.0.1.tgz#acdf3bb6685bcd55cb35e8a052266569e9469201" 871 | integrity sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A== 872 | dependencies: 873 | ini "^1.3.5" 874 | 875 | globby@11.0.1: 876 | version "11.0.1" 877 | resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" 878 | integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== 879 | dependencies: 880 | array-union "^2.1.0" 881 | dir-glob "^3.0.1" 882 | fast-glob "^3.1.1" 883 | ignore "^5.1.4" 884 | merge2 "^1.3.0" 885 | slash "^3.0.0" 886 | 887 | got@11.7.0: 888 | version "11.7.0" 889 | resolved "https://registry.yarnpkg.com/got/-/got-11.7.0.tgz#a386360305571a74548872e674932b4ef70d3b24" 890 | integrity sha512-7en2XwH2MEqOsrK0xaKhbWibBoZqy+f1RSUoIeF1BLcnf+pyQdDsljWMfmOh+QKJwuvDIiKx38GtPh5wFdGGjg== 891 | dependencies: 892 | "@sindresorhus/is" "^3.1.1" 893 | "@szmarczak/http-timer" "^4.0.5" 894 | "@types/cacheable-request" "^6.0.1" 895 | "@types/responselike" "^1.0.0" 896 | cacheable-lookup "^5.0.3" 897 | cacheable-request "^7.0.1" 898 | decompress-response "^6.0.0" 899 | http2-wrapper "^1.0.0-beta.5.2" 900 | lowercase-keys "^2.0.0" 901 | p-cancelable "^2.0.0" 902 | responselike "^2.0.0" 903 | 904 | got@^9.6.0: 905 | version "9.6.0" 906 | resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" 907 | integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== 908 | dependencies: 909 | "@sindresorhus/is" "^0.14.0" 910 | "@szmarczak/http-timer" "^1.1.2" 911 | cacheable-request "^6.0.0" 912 | decompress-response "^3.3.0" 913 | duplexer3 "^0.1.4" 914 | get-stream "^4.1.0" 915 | lowercase-keys "^1.0.1" 916 | mimic-response "^1.0.1" 917 | p-cancelable "^1.0.0" 918 | to-readable-stream "^1.0.0" 919 | url-parse-lax "^3.0.0" 920 | 921 | graceful-fs@^4.1.2: 922 | version "4.2.4" 923 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" 924 | integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== 925 | 926 | has-flag@^3.0.0: 927 | version "3.0.0" 928 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 929 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 930 | 931 | has-flag@^4.0.0: 932 | version "4.0.0" 933 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 934 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 935 | 936 | has-yarn@^2.1.0: 937 | version "2.1.0" 938 | resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" 939 | integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== 940 | 941 | http-cache-semantics@^4.0.0: 942 | version "4.1.0" 943 | resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" 944 | integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== 945 | 946 | http2-wrapper@^1.0.0-beta.5.2: 947 | version "1.0.0-beta.5.2" 948 | resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.0-beta.5.2.tgz#8b923deb90144aea65cf834b016a340fc98556f3" 949 | integrity sha512-xYz9goEyBnC8XwXDTuC/MZ6t+MrKVQZOk4s7+PaDkwIsQd8IwqvM+0M6bA/2lvG8GHXcPdf+MejTUeO2LCPCeQ== 950 | dependencies: 951 | quick-lru "^5.1.1" 952 | resolve-alpn "^1.0.0" 953 | 954 | human-signals@^1.1.1: 955 | version "1.1.1" 956 | resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" 957 | integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== 958 | 959 | iconv-lite@^0.4.24: 960 | version "0.4.24" 961 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 962 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 963 | dependencies: 964 | safer-buffer ">= 2.1.2 < 3" 965 | 966 | ignore@^5.1.4: 967 | version "5.1.8" 968 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" 969 | integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== 970 | 971 | import-cwd@3.0.0: 972 | version "3.0.0" 973 | resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-3.0.0.tgz#20845547718015126ea9b3676b7592fb8bd4cf92" 974 | integrity sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg== 975 | dependencies: 976 | import-from "^3.0.0" 977 | 978 | import-fresh@^3.2.1: 979 | version "3.2.1" 980 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" 981 | integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== 982 | dependencies: 983 | parent-module "^1.0.0" 984 | resolve-from "^4.0.0" 985 | 986 | import-from@^3.0.0: 987 | version "3.0.0" 988 | resolved "https://registry.yarnpkg.com/import-from/-/import-from-3.0.0.tgz#055cfec38cd5a27d8057ca51376d7d3bf0891966" 989 | integrity sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ== 990 | dependencies: 991 | resolve-from "^5.0.0" 992 | 993 | import-lazy@^2.1.0: 994 | version "2.1.0" 995 | resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" 996 | integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= 997 | 998 | imurmurhash@^0.1.4: 999 | version "0.1.4" 1000 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 1001 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 1002 | 1003 | inflight@^1.0.4: 1004 | version "1.0.6" 1005 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1006 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 1007 | dependencies: 1008 | once "^1.3.0" 1009 | wrappy "1" 1010 | 1011 | inherits@2: 1012 | version "2.0.4" 1013 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 1014 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 1015 | 1016 | ini@^1.3.5, ini@~1.3.0: 1017 | version "1.3.5" 1018 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" 1019 | integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== 1020 | 1021 | inquirer@7.3.3: 1022 | version "7.3.3" 1023 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" 1024 | integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== 1025 | dependencies: 1026 | ansi-escapes "^4.2.1" 1027 | chalk "^4.1.0" 1028 | cli-cursor "^3.1.0" 1029 | cli-width "^3.0.0" 1030 | external-editor "^3.0.3" 1031 | figures "^3.0.0" 1032 | lodash "^4.17.19" 1033 | mute-stream "0.0.8" 1034 | run-async "^2.4.0" 1035 | rxjs "^6.6.0" 1036 | string-width "^4.1.0" 1037 | strip-ansi "^6.0.0" 1038 | through "^2.3.6" 1039 | 1040 | interpret@^1.0.0: 1041 | version "1.4.0" 1042 | resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" 1043 | integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== 1044 | 1045 | is-arrayish@^0.2.1: 1046 | version "0.2.1" 1047 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 1048 | integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= 1049 | 1050 | is-ci@2.0.0, is-ci@^2.0.0: 1051 | version "2.0.0" 1052 | resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" 1053 | integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== 1054 | dependencies: 1055 | ci-info "^2.0.0" 1056 | 1057 | is-extglob@^2.1.1: 1058 | version "2.1.1" 1059 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1060 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 1061 | 1062 | is-fullwidth-code-point@^2.0.0: 1063 | version "2.0.0" 1064 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 1065 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 1066 | 1067 | is-fullwidth-code-point@^3.0.0: 1068 | version "3.0.0" 1069 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 1070 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 1071 | 1072 | is-glob@^4.0.1: 1073 | version "4.0.1" 1074 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 1075 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 1076 | dependencies: 1077 | is-extglob "^2.1.1" 1078 | 1079 | is-installed-globally@^0.3.1: 1080 | version "0.3.2" 1081 | resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.3.2.tgz#fd3efa79ee670d1187233182d5b0a1dd00313141" 1082 | integrity sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g== 1083 | dependencies: 1084 | global-dirs "^2.0.1" 1085 | is-path-inside "^3.0.1" 1086 | 1087 | is-interactive@^1.0.0: 1088 | version "1.0.0" 1089 | resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" 1090 | integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== 1091 | 1092 | is-npm@^5.0.0: 1093 | version "5.0.0" 1094 | resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" 1095 | integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== 1096 | 1097 | is-number@^7.0.0: 1098 | version "7.0.0" 1099 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 1100 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 1101 | 1102 | is-obj@^2.0.0: 1103 | version "2.0.0" 1104 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" 1105 | integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== 1106 | 1107 | is-path-inside@^3.0.1: 1108 | version "3.0.2" 1109 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" 1110 | integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== 1111 | 1112 | is-plain-object@^5.0.0: 1113 | version "5.0.0" 1114 | resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" 1115 | integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== 1116 | 1117 | is-ssh@^1.3.0: 1118 | version "1.3.2" 1119 | resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.3.2.tgz#a4b82ab63d73976fd8263cceee27f99a88bdae2b" 1120 | integrity sha512-elEw0/0c2UscLrNG+OAorbP539E3rhliKPg+hDMWN9VwrDXfYK+4PBEykDPfxlYYtQvl84TascnQyobfQLHEhQ== 1121 | dependencies: 1122 | protocols "^1.1.0" 1123 | 1124 | is-stream@^2.0.0: 1125 | version "2.0.0" 1126 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" 1127 | integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== 1128 | 1129 | is-typedarray@^1.0.0: 1130 | version "1.0.0" 1131 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 1132 | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= 1133 | 1134 | is-yarn-global@^0.3.0: 1135 | version "0.3.0" 1136 | resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" 1137 | integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== 1138 | 1139 | isexe@^2.0.0: 1140 | version "2.0.0" 1141 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1142 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 1143 | 1144 | js-tokens@^4.0.0: 1145 | version "4.0.0" 1146 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 1147 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 1148 | 1149 | json-buffer@3.0.0: 1150 | version "3.0.0" 1151 | resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" 1152 | integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= 1153 | 1154 | json-buffer@3.0.1: 1155 | version "3.0.1" 1156 | resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" 1157 | integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== 1158 | 1159 | json-parse-even-better-errors@^2.3.0: 1160 | version "2.3.1" 1161 | resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" 1162 | integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== 1163 | 1164 | keyv@^3.0.0: 1165 | version "3.1.0" 1166 | resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" 1167 | integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== 1168 | dependencies: 1169 | json-buffer "3.0.0" 1170 | 1171 | keyv@^4.0.0: 1172 | version "4.0.3" 1173 | resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.0.3.tgz#4f3aa98de254803cafcd2896734108daa35e4254" 1174 | integrity sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA== 1175 | dependencies: 1176 | json-buffer "3.0.1" 1177 | 1178 | latest-version@^5.0.0: 1179 | version "5.1.0" 1180 | resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" 1181 | integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== 1182 | dependencies: 1183 | package-json "^6.3.0" 1184 | 1185 | lines-and-columns@^1.1.6: 1186 | version "1.1.6" 1187 | resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" 1188 | integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= 1189 | 1190 | locate-path@^6.0.0: 1191 | version "6.0.0" 1192 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 1193 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 1194 | dependencies: 1195 | p-locate "^5.0.0" 1196 | 1197 | lodash@4.17.20, lodash@^4.17.19, lodash@^4.17.20: 1198 | version "4.17.20" 1199 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" 1200 | integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== 1201 | 1202 | lodash@^4.17.21: 1203 | version "4.17.21" 1204 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 1205 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 1206 | 1207 | log-symbols@^4.0.0: 1208 | version "4.0.0" 1209 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" 1210 | integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== 1211 | dependencies: 1212 | chalk "^4.0.0" 1213 | 1214 | lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: 1215 | version "1.0.1" 1216 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" 1217 | integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== 1218 | 1219 | lowercase-keys@^2.0.0: 1220 | version "2.0.0" 1221 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" 1222 | integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== 1223 | 1224 | macos-release@^2.2.0: 1225 | version "2.4.1" 1226 | resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.4.1.tgz#64033d0ec6a5e6375155a74b1a1eba8e509820ac" 1227 | integrity sha512-H/QHeBIN1fIGJX517pvK8IEK53yQOW7YcEI55oYtgjDdoCQQz7eJS94qt5kNrscReEyuD/JcdFCm2XBEcGOITg== 1228 | 1229 | make-dir@^3.0.0: 1230 | version "3.1.0" 1231 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" 1232 | integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== 1233 | dependencies: 1234 | semver "^6.0.0" 1235 | 1236 | merge-stream@^2.0.0: 1237 | version "2.0.0" 1238 | resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" 1239 | integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== 1240 | 1241 | merge2@^1.3.0: 1242 | version "1.4.1" 1243 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 1244 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 1245 | 1246 | micromatch@^4.0.2: 1247 | version "4.0.2" 1248 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" 1249 | integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== 1250 | dependencies: 1251 | braces "^3.0.1" 1252 | picomatch "^2.0.5" 1253 | 1254 | mime-db@1.44.0: 1255 | version "1.44.0" 1256 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" 1257 | integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== 1258 | 1259 | mime-types@2.1.27, mime-types@^2.1.12: 1260 | version "2.1.27" 1261 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" 1262 | integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== 1263 | dependencies: 1264 | mime-db "1.44.0" 1265 | 1266 | mimic-fn@^2.1.0: 1267 | version "2.1.0" 1268 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 1269 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 1270 | 1271 | mimic-response@^1.0.0, mimic-response@^1.0.1: 1272 | version "1.0.1" 1273 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" 1274 | integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== 1275 | 1276 | mimic-response@^3.1.0: 1277 | version "3.1.0" 1278 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" 1279 | integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== 1280 | 1281 | minimatch@^3.0.4: 1282 | version "3.0.4" 1283 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1284 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 1285 | dependencies: 1286 | brace-expansion "^1.1.7" 1287 | 1288 | minimist@^1.2.0: 1289 | version "1.2.5" 1290 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 1291 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 1292 | 1293 | ms@2.1.2: 1294 | version "2.1.2" 1295 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1296 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1297 | 1298 | mute-stream@0.0.8: 1299 | version "0.0.8" 1300 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" 1301 | integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== 1302 | 1303 | node-fetch@^2.6.1: 1304 | version "2.6.1" 1305 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" 1306 | integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== 1307 | 1308 | normalize-url@^3.3.0: 1309 | version "3.3.0" 1310 | resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" 1311 | integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== 1312 | 1313 | normalize-url@^4.1.0: 1314 | version "4.5.0" 1315 | resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" 1316 | integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== 1317 | 1318 | npm-run-path@^4.0.0: 1319 | version "4.0.1" 1320 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" 1321 | integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== 1322 | dependencies: 1323 | path-key "^3.0.0" 1324 | 1325 | once@^1.3.0, once@^1.3.1, once@^1.4.0: 1326 | version "1.4.0" 1327 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1328 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1329 | dependencies: 1330 | wrappy "1" 1331 | 1332 | onetime@^5.1.0: 1333 | version "5.1.2" 1334 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" 1335 | integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== 1336 | dependencies: 1337 | mimic-fn "^2.1.0" 1338 | 1339 | ora@5.1.0: 1340 | version "5.1.0" 1341 | resolved "https://registry.yarnpkg.com/ora/-/ora-5.1.0.tgz#b188cf8cd2d4d9b13fd25383bc3e5cba352c94f8" 1342 | integrity sha512-9tXIMPvjZ7hPTbk8DFq1f7Kow/HU/pQYB60JbNq+QnGwcyhWVZaQ4hM9zQDEsPxw/muLpgiHSaumUZxCAmod/w== 1343 | dependencies: 1344 | chalk "^4.1.0" 1345 | cli-cursor "^3.1.0" 1346 | cli-spinners "^2.4.0" 1347 | is-interactive "^1.0.0" 1348 | log-symbols "^4.0.0" 1349 | mute-stream "0.0.8" 1350 | strip-ansi "^6.0.0" 1351 | wcwidth "^1.0.1" 1352 | 1353 | os-name@4.0.0: 1354 | version "4.0.0" 1355 | resolved "https://registry.yarnpkg.com/os-name/-/os-name-4.0.0.tgz#6c05c09c41c15848ea74658d12c9606f0f286599" 1356 | integrity sha512-caABzDdJMbtykt7GmSogEat3faTKQhmZf0BS5l/pZGmP0vPWQjXWqOhbLyK+b6j2/DQPmEvYdzLXJXXLJNVDNg== 1357 | dependencies: 1358 | macos-release "^2.2.0" 1359 | windows-release "^4.0.0" 1360 | 1361 | os-tmpdir@~1.0.2: 1362 | version "1.0.2" 1363 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1364 | integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= 1365 | 1366 | p-cancelable@^1.0.0: 1367 | version "1.1.0" 1368 | resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" 1369 | integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== 1370 | 1371 | p-cancelable@^2.0.0: 1372 | version "2.0.0" 1373 | resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.0.0.tgz#4a3740f5bdaf5ed5d7c3e34882c6fb5d6b266a6e" 1374 | integrity sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg== 1375 | 1376 | p-limit@^3.0.2: 1377 | version "3.0.2" 1378 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.0.2.tgz#1664e010af3cadc681baafd3e2a437be7b0fb5fe" 1379 | integrity sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg== 1380 | dependencies: 1381 | p-try "^2.0.0" 1382 | 1383 | p-locate@^5.0.0: 1384 | version "5.0.0" 1385 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 1386 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 1387 | dependencies: 1388 | p-limit "^3.0.2" 1389 | 1390 | p-try@^2.0.0: 1391 | version "2.2.0" 1392 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 1393 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 1394 | 1395 | package-json@^6.3.0: 1396 | version "6.5.0" 1397 | resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" 1398 | integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== 1399 | dependencies: 1400 | got "^9.6.0" 1401 | registry-auth-token "^4.0.0" 1402 | registry-url "^5.0.0" 1403 | semver "^6.2.0" 1404 | 1405 | parent-module@^1.0.0: 1406 | version "1.0.1" 1407 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 1408 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 1409 | dependencies: 1410 | callsites "^3.0.0" 1411 | 1412 | parse-json@5.1.0, parse-json@^5.0.0: 1413 | version "5.1.0" 1414 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.1.0.tgz#f96088cdf24a8faa9aea9a009f2d9d942c999646" 1415 | integrity sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ== 1416 | dependencies: 1417 | "@babel/code-frame" "^7.0.0" 1418 | error-ex "^1.3.1" 1419 | json-parse-even-better-errors "^2.3.0" 1420 | lines-and-columns "^1.1.6" 1421 | 1422 | parse-path@^4.0.0: 1423 | version "4.0.2" 1424 | resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-4.0.2.tgz#ef14f0d3d77bae8dd4bc66563a4c151aac9e65aa" 1425 | integrity sha512-HSqVz6iuXSiL8C1ku5Gl1Z5cwDd9Wo0q8CoffdAghP6bz8pJa1tcMC+m4N+z6VAS8QdksnIGq1TB6EgR4vPR6w== 1426 | dependencies: 1427 | is-ssh "^1.3.0" 1428 | protocols "^1.4.0" 1429 | 1430 | parse-url@^5.0.0: 1431 | version "5.0.2" 1432 | resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-5.0.2.tgz#856a3be1fcdf78dc93fc8b3791f169072d898b59" 1433 | integrity sha512-Czj+GIit4cdWtxo3ISZCvLiUjErSo0iI3wJ+q9Oi3QuMYTI6OZu+7cewMWZ+C1YAnKhYTk6/TLuhIgCypLthPA== 1434 | dependencies: 1435 | is-ssh "^1.3.0" 1436 | normalize-url "^3.3.0" 1437 | parse-path "^4.0.0" 1438 | protocols "^1.4.0" 1439 | 1440 | path-exists@^4.0.0: 1441 | version "4.0.0" 1442 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1443 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1444 | 1445 | path-is-absolute@^1.0.0: 1446 | version "1.0.1" 1447 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1448 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1449 | 1450 | path-key@^3.0.0, path-key@^3.1.0: 1451 | version "3.1.1" 1452 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1453 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1454 | 1455 | path-parse@^1.0.6: 1456 | version "1.0.6" 1457 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 1458 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 1459 | 1460 | path-type@^4.0.0: 1461 | version "4.0.0" 1462 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" 1463 | integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== 1464 | 1465 | picomatch@^2.0.5, picomatch@^2.2.1: 1466 | version "2.2.2" 1467 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" 1468 | integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== 1469 | 1470 | prepend-http@^2.0.0: 1471 | version "2.0.0" 1472 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" 1473 | integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= 1474 | 1475 | protocols@^1.1.0, protocols@^1.4.0: 1476 | version "1.4.8" 1477 | resolved "https://registry.yarnpkg.com/protocols/-/protocols-1.4.8.tgz#48eea2d8f58d9644a4a32caae5d5db290a075ce8" 1478 | integrity sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg== 1479 | 1480 | pump@^3.0.0: 1481 | version "3.0.0" 1482 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 1483 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 1484 | dependencies: 1485 | end-of-stream "^1.1.0" 1486 | once "^1.3.1" 1487 | 1488 | pupa@^2.0.1: 1489 | version "2.0.1" 1490 | resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.0.1.tgz#dbdc9ff48ffbea4a26a069b6f9f7abb051008726" 1491 | integrity sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA== 1492 | dependencies: 1493 | escape-goat "^2.0.0" 1494 | 1495 | quick-lru@^5.1.1: 1496 | version "5.1.1" 1497 | resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" 1498 | integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== 1499 | 1500 | rc@^1.2.8: 1501 | version "1.2.8" 1502 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 1503 | integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== 1504 | dependencies: 1505 | deep-extend "^0.6.0" 1506 | ini "~1.3.0" 1507 | minimist "^1.2.0" 1508 | strip-json-comments "~2.0.1" 1509 | 1510 | rechoir@^0.6.2: 1511 | version "0.6.2" 1512 | resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" 1513 | integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= 1514 | dependencies: 1515 | resolve "^1.1.6" 1516 | 1517 | registry-auth-token@^4.0.0: 1518 | version "4.2.0" 1519 | resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.0.tgz#1d37dffda72bbecd0f581e4715540213a65eb7da" 1520 | integrity sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w== 1521 | dependencies: 1522 | rc "^1.2.8" 1523 | 1524 | registry-url@^5.0.0: 1525 | version "5.1.0" 1526 | resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" 1527 | integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== 1528 | dependencies: 1529 | rc "^1.2.8" 1530 | 1531 | release-it@^14.1.0: 1532 | version "14.1.0" 1533 | resolved "https://registry.yarnpkg.com/release-it/-/release-it-14.1.0.tgz#44dce71e35fcd57e0518c6dfdca1486a0c2889e6" 1534 | integrity sha512-S3yFUl7dv4D5+/Gqe7Qi3zKKDlH5KtrrZfSiNX6QanQ1B21htfzGWfU+JmE89aKJgZPmNG7W0vuiSGXoRzbFZA== 1535 | dependencies: 1536 | "@iarna/toml" "2.2.5" 1537 | "@octokit/rest" "18.0.6" 1538 | async-retry "1.3.1" 1539 | chalk "4.1.0" 1540 | cosmiconfig "7.0.0" 1541 | debug "4.2.0" 1542 | deprecated-obj "2.0.0" 1543 | execa "4.0.3" 1544 | find-up "5.0.0" 1545 | form-data "3.0.0" 1546 | git-url-parse "11.3.0" 1547 | globby "11.0.1" 1548 | got "11.7.0" 1549 | import-cwd "3.0.0" 1550 | inquirer "7.3.3" 1551 | is-ci "2.0.0" 1552 | lodash "4.17.20" 1553 | mime-types "2.1.27" 1554 | ora "5.1.0" 1555 | os-name "4.0.0" 1556 | parse-json "5.1.0" 1557 | semver "7.3.2" 1558 | shelljs "0.8.4" 1559 | update-notifier "5.0.0" 1560 | url-join "4.0.1" 1561 | uuid "8.3.1" 1562 | yaml "1.10.0" 1563 | yargs-parser "20.2.1" 1564 | 1565 | resolve-alpn@^1.0.0: 1566 | version "1.0.0" 1567 | resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.0.0.tgz#745ad60b3d6aff4b4a48e01b8c0bdc70959e0e8c" 1568 | integrity sha512-rTuiIEqFmGxne4IovivKSDzld2lWW9QCjqv80SYjPgf+gS35eaCAjaP54CCwGAwBtnCsvNLYtqxe1Nw+i6JEmA== 1569 | 1570 | resolve-from@^4.0.0: 1571 | version "4.0.0" 1572 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 1573 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 1574 | 1575 | resolve-from@^5.0.0: 1576 | version "5.0.0" 1577 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" 1578 | integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== 1579 | 1580 | resolve@^1.1.6: 1581 | version "1.17.0" 1582 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" 1583 | integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== 1584 | dependencies: 1585 | path-parse "^1.0.6" 1586 | 1587 | responselike@^1.0.2: 1588 | version "1.0.2" 1589 | resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" 1590 | integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= 1591 | dependencies: 1592 | lowercase-keys "^1.0.0" 1593 | 1594 | responselike@^2.0.0: 1595 | version "2.0.0" 1596 | resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.0.tgz#26391bcc3174f750f9a79eacc40a12a5c42d7723" 1597 | integrity sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw== 1598 | dependencies: 1599 | lowercase-keys "^2.0.0" 1600 | 1601 | restore-cursor@^3.1.0: 1602 | version "3.1.0" 1603 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" 1604 | integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== 1605 | dependencies: 1606 | onetime "^5.1.0" 1607 | signal-exit "^3.0.2" 1608 | 1609 | retry@0.12.0: 1610 | version "0.12.0" 1611 | resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" 1612 | integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= 1613 | 1614 | reusify@^1.0.4: 1615 | version "1.0.4" 1616 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 1617 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 1618 | 1619 | run-async@^2.4.0: 1620 | version "2.4.1" 1621 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" 1622 | integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== 1623 | 1624 | run-parallel@^1.1.9: 1625 | version "1.1.9" 1626 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" 1627 | integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== 1628 | 1629 | rxjs@^6.6.0: 1630 | version "6.6.3" 1631 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" 1632 | integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== 1633 | dependencies: 1634 | tslib "^1.9.0" 1635 | 1636 | "safer-buffer@>= 2.1.2 < 3": 1637 | version "2.1.2" 1638 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1639 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1640 | 1641 | semver-diff@^3.1.1: 1642 | version "3.1.1" 1643 | resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" 1644 | integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== 1645 | dependencies: 1646 | semver "^6.3.0" 1647 | 1648 | semver@7.3.2, semver@^7.3.2: 1649 | version "7.3.2" 1650 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" 1651 | integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== 1652 | 1653 | semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: 1654 | version "6.3.0" 1655 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 1656 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 1657 | 1658 | shebang-command@^2.0.0: 1659 | version "2.0.0" 1660 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 1661 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1662 | dependencies: 1663 | shebang-regex "^3.0.0" 1664 | 1665 | shebang-regex@^3.0.0: 1666 | version "3.0.0" 1667 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 1668 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1669 | 1670 | shelljs@0.8.4: 1671 | version "0.8.4" 1672 | resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.4.tgz#de7684feeb767f8716b326078a8a00875890e3c2" 1673 | integrity sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ== 1674 | dependencies: 1675 | glob "^7.0.0" 1676 | interpret "^1.0.0" 1677 | rechoir "^0.6.2" 1678 | 1679 | signal-exit@^3.0.2: 1680 | version "3.0.3" 1681 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" 1682 | integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== 1683 | 1684 | slash@^3.0.0: 1685 | version "3.0.0" 1686 | resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" 1687 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 1688 | 1689 | string-width@^3.0.0: 1690 | version "3.1.0" 1691 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" 1692 | integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== 1693 | dependencies: 1694 | emoji-regex "^7.0.1" 1695 | is-fullwidth-code-point "^2.0.0" 1696 | strip-ansi "^5.1.0" 1697 | 1698 | string-width@^4.0.0, string-width@^4.1.0: 1699 | version "4.2.0" 1700 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" 1701 | integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== 1702 | dependencies: 1703 | emoji-regex "^8.0.0" 1704 | is-fullwidth-code-point "^3.0.0" 1705 | strip-ansi "^6.0.0" 1706 | 1707 | strip-ansi@^5.1.0: 1708 | version "5.2.0" 1709 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" 1710 | integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== 1711 | dependencies: 1712 | ansi-regex "^4.1.0" 1713 | 1714 | strip-ansi@^6.0.0: 1715 | version "6.0.0" 1716 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" 1717 | integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== 1718 | dependencies: 1719 | ansi-regex "^5.0.0" 1720 | 1721 | strip-final-newline@^2.0.0: 1722 | version "2.0.0" 1723 | resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" 1724 | integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== 1725 | 1726 | strip-json-comments@~2.0.1: 1727 | version "2.0.1" 1728 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1729 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 1730 | 1731 | supports-color@^5.3.0: 1732 | version "5.5.0" 1733 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1734 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1735 | dependencies: 1736 | has-flag "^3.0.0" 1737 | 1738 | supports-color@^7.1.0: 1739 | version "7.2.0" 1740 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1741 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1742 | dependencies: 1743 | has-flag "^4.0.0" 1744 | 1745 | term-size@^2.1.0: 1746 | version "2.2.0" 1747 | resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.0.tgz#1f16adedfe9bdc18800e1776821734086fcc6753" 1748 | integrity sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw== 1749 | 1750 | through@^2.3.6: 1751 | version "2.3.8" 1752 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 1753 | integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= 1754 | 1755 | tmp@^0.0.33: 1756 | version "0.0.33" 1757 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" 1758 | integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== 1759 | dependencies: 1760 | os-tmpdir "~1.0.2" 1761 | 1762 | to-readable-stream@^1.0.0: 1763 | version "1.0.0" 1764 | resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" 1765 | integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== 1766 | 1767 | to-regex-range@^5.0.1: 1768 | version "5.0.1" 1769 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1770 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1771 | dependencies: 1772 | is-number "^7.0.0" 1773 | 1774 | tslib@^1.9.0: 1775 | version "1.14.1" 1776 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" 1777 | integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== 1778 | 1779 | tunnel@0.0.6: 1780 | version "0.0.6" 1781 | resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" 1782 | integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== 1783 | 1784 | type-fest@^0.11.0: 1785 | version "0.11.0" 1786 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" 1787 | integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== 1788 | 1789 | type-fest@^0.8.1: 1790 | version "0.8.1" 1791 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" 1792 | integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== 1793 | 1794 | typedarray-to-buffer@^3.1.5: 1795 | version "3.1.5" 1796 | resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" 1797 | integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== 1798 | dependencies: 1799 | is-typedarray "^1.0.0" 1800 | 1801 | typescript@^4.3.5: 1802 | version "4.3.5" 1803 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4" 1804 | integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA== 1805 | 1806 | unique-string@^2.0.0: 1807 | version "2.0.0" 1808 | resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" 1809 | integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== 1810 | dependencies: 1811 | crypto-random-string "^2.0.0" 1812 | 1813 | universal-user-agent@^6.0.0: 1814 | version "6.0.0" 1815 | resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" 1816 | integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== 1817 | 1818 | update-notifier@5.0.0: 1819 | version "5.0.0" 1820 | resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.0.0.tgz#308e0ae772f71d66df0303159a945bc1e1fb819a" 1821 | integrity sha512-8tqsiVrMv7aZsKNSjqA6DdBLKJpZG1hRpkj1RbOJu1PgyP69OX+EInAnP1EK/ShX5YdPFgwWdk19oquZ0HTM8g== 1822 | dependencies: 1823 | boxen "^4.2.0" 1824 | chalk "^4.1.0" 1825 | configstore "^5.0.1" 1826 | has-yarn "^2.1.0" 1827 | import-lazy "^2.1.0" 1828 | is-ci "^2.0.0" 1829 | is-installed-globally "^0.3.1" 1830 | is-npm "^5.0.0" 1831 | is-yarn-global "^0.3.0" 1832 | latest-version "^5.0.0" 1833 | pupa "^2.0.1" 1834 | semver "^7.3.2" 1835 | semver-diff "^3.1.1" 1836 | xdg-basedir "^4.0.0" 1837 | 1838 | url-join@4.0.1: 1839 | version "4.0.1" 1840 | resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7" 1841 | integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA== 1842 | 1843 | url-parse-lax@^3.0.0: 1844 | version "3.0.0" 1845 | resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" 1846 | integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= 1847 | dependencies: 1848 | prepend-http "^2.0.0" 1849 | 1850 | uuid@8.3.1: 1851 | version "8.3.1" 1852 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.1.tgz#2ba2e6ca000da60fce5a196954ab241131e05a31" 1853 | integrity sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg== 1854 | 1855 | wcwidth@^1.0.1: 1856 | version "1.0.1" 1857 | resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" 1858 | integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= 1859 | dependencies: 1860 | defaults "^1.0.3" 1861 | 1862 | which@^2.0.1: 1863 | version "2.0.2" 1864 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 1865 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 1866 | dependencies: 1867 | isexe "^2.0.0" 1868 | 1869 | widest-line@^3.1.0: 1870 | version "3.1.0" 1871 | resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" 1872 | integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== 1873 | dependencies: 1874 | string-width "^4.0.0" 1875 | 1876 | windows-release@^4.0.0: 1877 | version "4.0.0" 1878 | resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-4.0.0.tgz#4725ec70217d1bf6e02c7772413b29cdde9ec377" 1879 | integrity sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg== 1880 | dependencies: 1881 | execa "^4.0.2" 1882 | 1883 | wrappy@1: 1884 | version "1.0.2" 1885 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1886 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1887 | 1888 | write-file-atomic@^3.0.0: 1889 | version "3.0.3" 1890 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" 1891 | integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== 1892 | dependencies: 1893 | imurmurhash "^0.1.4" 1894 | is-typedarray "^1.0.0" 1895 | signal-exit "^3.0.2" 1896 | typedarray-to-buffer "^3.1.5" 1897 | 1898 | xdg-basedir@^4.0.0: 1899 | version "4.0.0" 1900 | resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" 1901 | integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== 1902 | 1903 | yaml@1.10.0, yaml@^1.10.0: 1904 | version "1.10.0" 1905 | resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" 1906 | integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== 1907 | 1908 | yargs-parser@20.2.1: 1909 | version "20.2.1" 1910 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.1.tgz#28f3773c546cdd8a69ddae68116b48a5da328e77" 1911 | integrity sha512-yYsjuSkjbLMBp16eaOt7/siKTjNVjMm3SoJnIg3sEh/JsvqVVDyjRKmaJV4cl+lNIgq6QEco2i3gDebJl7/vLA== 1912 | --------------------------------------------------------------------------------