diff --git a/.bazelignore b/.bazelignore
new file mode 100644
index 0000000..3c3629e
--- /dev/null
+++ b/.bazelignore
@@ -0,0 +1 @@
+node_modules
diff --git a/.bazelrc b/.bazelrc
new file mode 100644
index 0000000..f8b9a02
--- /dev/null
+++ b/.bazelrc
@@ -0,0 +1,56 @@
+# Common Bazel settings for JavaScript/NodeJS workspaces
+# This rc file is automatically discovered when Bazel is run in this workspace,
+# see https://docs.bazel.build/versions/master/guide.html#bazelrc
+#
+# The full list of Bazel options: https://docs.bazel.build/versions/master/command-line-reference.html
+
+# Bazel will create symlinks from the workspace directory to output artifacts.
+# Build results will be placed in a directory called "dist/bin"
+# Other directories will be created like "dist/testlogs"
+# Be aware that this will still create a bazel-out symlink in
+# your project directory, which you must exclude from version control and your
+# editor's search path.
+build --symlink_prefix=dist/
+
+# Specifies desired output mode for running tests.
+# Valid values are
+# 'summary' to output only test status summary
+# 'errors' to also print test logs for failed tests
+# 'all' to print logs for all tests
+# 'streamed' to output logs for all tests in real time
+# (this will force tests to be executed locally one at a time regardless of --test_strategy value).
+test --test_output=errors
+
+# Support for debugging NodeJS tests
+# Add the Bazel option `--config=debug` to enable this
+test:debug --test_arg=--node_options=--inspect-brk --test_output=streamed --test_strategy=exclusive --test_timeout=9999 --nocache_test_results
+
+# Turn off legacy external runfiles
+# This prevents accidentally depending on this feature, which Bazel will remove.
+run --nolegacy_external_runfiles
+test --nolegacy_external_runfiles
+
+# Turn on the "Managed Directories" feature.
+# This allows Bazel to share the same node_modules directory with other tools
+# NB: this option was introduced in Bazel 0.26
+# See https://docs.bazel.build/versions/master/command-line-reference.html#flag--experimental_allow_incremental_repository_updates
+common --experimental_allow_incremental_repository_updates
+
+# Turn on --incompatible_strict_action_env which was on by default
+# in Bazel 0.21.0 but turned off again in 0.22.0. Follow
+# https://github.com/bazelbuild/bazel/issues/7026 for more details.
+# This flag is needed to so that the bazel cache is not invalidated
+# when running bazel via `yarn bazel`.
+# See https://github.com/angular/angular/issues/27514.
+build --incompatible_strict_action_env
+run --incompatible_strict_action_env
+
+# Load any settings specific to the current user.
+# .bazelrc.user should appear in .gitignore so that settings are not shared with team members
+# This needs to be last statement in this
+# config, as the user configuration should be able to overwrite flags from this file.
+# See https://docs.bazel.build/versions/master/best-practices.html#bazelrc
+# (Note that we use .bazelrc.user so the file appears next to .bazelrc in directory listing,
+# rather than user.bazelrc as suggested in the Bazel docs)
+try-import %workspace%/.bazelrc.user
+
diff --git a/.gitignore b/.gitignore
index 7ec005e..3c9ced5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
-node_modules/
-/build/*.spec.*
/yarn-error.log
+dist
+bazel-out
+node_modules
diff --git a/.travis.yml b/.travis.yml
index fd7b464..0e9d896 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -12,18 +12,24 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-language: node_js
+dist: trusty
+language: minimal
-node_js:
- - 10
+addons:
+ apt:
+ sources:
+ - ubuntu-toolchain-r-test
+ packages:
+ - wget
+ - pkg-config
cache:
yarn: true
before_install:
- # https://docs.travis-ci.com/user/languages/javascript-with-nodejs#Travis-CI-supports-yarn
- - curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version 1.13.0
- - export PATH="$HOME/.yarn/bin:$PATH"
+ - wget https://github.com/bazelbuild/bazel/releases/download/0.28.1/bazel_0.28.1-linux-x86_64.deb
+ - sha256sum -c tools/bazel_0.28.1-linux-x86_64.deb.sha256
+ - sudo dpkg -i bazel_0.28.1-linux-x86_64.deb
script:
- - yarn test
+ - bazel --bazelrc=tools/travis.bazelrc test //src/...
diff --git a/BUILD.bazel b/BUILD.bazel
new file mode 100644
index 0000000..2cb5e84
--- /dev/null
+++ b/BUILD.bazel
@@ -0,0 +1,33 @@
+# Copyright 2019 The Outline Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Add rules here to build your software
+# See https://docs.bazel.build/versions/master/build-ref.html#BUILD_files
+
+load("@build_bazel_rules_nodejs//:defs.bzl", "npm_package")
+
+# Allow any ts_library rules in this workspace to reference the config
+# Note: if you move the tsconfig.json file to a subdirectory, you can add an alias() here instead
+# so that ts_library rules still use it by default.
+# See https://www.npmjs.com/package/@bazel/typescript#installation
+exports_files(
+ ["tsconfig.json"],
+ visibility = ["//:__subpackages__"],
+)
+
+npm_package(
+ name = "shadowsocks_config_npm",
+ srcs = [":package.json"],
+ deps = ["//src:shadowsocks_config"],
+)
diff --git a/WORKSPACE b/WORKSPACE
new file mode 100644
index 0000000..a38e4f5
--- /dev/null
+++ b/WORKSPACE
@@ -0,0 +1,56 @@
+# Copyright 2019 The Outline Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Bazel workspace created by @bazel/create 0.35.0
+
+# Declares that this directory is the root of a Bazel workspace.
+# See https://docs.bazel.build/versions/master/build-ref.html#workspace
+workspace(
+ # How this workspace would be referenced with absolute labels from another workspace
+ name = "outline_shadowsocksconfig",
+ # Map the @npm bazel workspace to the node_modules directory.
+ # This lets Bazel use the same node_modules as other local tooling.
+ managed_directories = {"@npm": ["node_modules"]},
+)
+
+# Install the nodejs "bootstrap" package
+# This provides the basic tools for running and packaging nodejs programs in Bazel
+load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
+
+http_archive(
+ name = "build_bazel_rules_nodejs",
+ sha256 = "6625259f9f77ef90d795d20df1d0385d9b3ce63b6619325f702b6358abb4ab33",
+ urls = ["https://github.com/bazelbuild/rules_nodejs/releases/download/0.35.0/rules_nodejs-0.35.0.tar.gz"],
+)
+
+# The yarn_install rule runs yarn anytime the package.json or yarn.lock file changes.
+# It also extracts and installs any Bazel rules distributed in an npm package.
+load("@build_bazel_rules_nodejs//:defs.bzl", "yarn_install")
+
+yarn_install(
+ # Name this npm so that Bazel Label references look like @npm//package
+ name = "npm",
+ package_json = "//:package.json",
+ yarn_lock = "//:yarn.lock",
+)
+
+# Install any Bazel rules which were extracted earlier by the yarn_install rule.
+load("@npm//:install_bazel_dependencies.bzl", "install_bazel_dependencies")
+
+install_bazel_dependencies()
+
+# Setup TypeScript toolchain
+load("@npm_bazel_typescript//:index.bzl", "ts_setup_workspace")
+
+ts_setup_workspace()
diff --git a/bower.json b/bower.json
deleted file mode 100644
index 68069ea..0000000
--- a/bower.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "name": "shadowsocks-config",
- "version": "0.0.8",
- "license": "Apache-2.0",
- "main": "shadowsocks_config.js",
- "dependencies": {
- "punycode": "^1.4.1"
- }
-}
diff --git a/build/shadowsocks_config.d.ts b/build/shadowsocks_config.d.ts
old mode 100644
new mode 100755
index c977245..aff58a7
--- a/build/shadowsocks_config.d.ts
+++ b/build/shadowsocks_config.d.ts
@@ -1,3 +1,4 @@
+///
export declare class ShadowsocksConfigError extends Error {
constructor(message: string);
}
diff --git a/build/shadowsocks_config.js b/build/shadowsocks_config.js
old mode 100644
new mode 100755
index 446ae41..5961e56
--- a/build/shadowsocks_config.js
+++ b/build/shadowsocks_config.js
@@ -1,4 +1,3 @@
-"use strict";
// Copyright 2018 The Outline Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
@@ -12,352 +11,319 @@
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
-var __extends = (this && this.__extends) || (function () {
- var extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
- function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-/* tslint:disable */
-var isBrowser = typeof window !== 'undefined';
-var b64Encode = isBrowser ? btoa : require('base-64').encode;
-var b64Decode = isBrowser ? atob : require('base-64').decode;
-var URL = isBrowser ? window.URL : require('url').URL;
-var punycode = isBrowser ? window.punycode : require('punycode');
-if (!punycode) {
- throw new Error("Could not find punycode. Did you forget to add e.g.\n ?");
-}
-/* tslint:enable */
-// Custom error base class
-var ShadowsocksConfigError = /** @class */ (function (_super) {
- __extends(ShadowsocksConfigError, _super);
- function ShadowsocksConfigError(message) {
- var _newTarget = this.constructor;
- var _this = _super.call(this, message) || this;
- Object.setPrototypeOf(_this, _newTarget.prototype); // restore prototype chain
- _this.name = _newTarget.name;
- return _this;
- }
- return ShadowsocksConfigError;
-}(Error));
-exports.ShadowsocksConfigError = ShadowsocksConfigError;
-var InvalidConfigField = /** @class */ (function (_super) {
- __extends(InvalidConfigField, _super);
- function InvalidConfigField() {
- return _super !== null && _super.apply(this, arguments) || this;
+(function (factory) {
+ if (typeof module === "object" && typeof module.exports === "object") {
+ var v = factory(require, exports);
+ if (v !== undefined) module.exports = v;
}
- return InvalidConfigField;
-}(ShadowsocksConfigError));
-exports.InvalidConfigField = InvalidConfigField;
-var InvalidUri = /** @class */ (function (_super) {
- __extends(InvalidUri, _super);
- function InvalidUri() {
- return _super !== null && _super.apply(this, arguments) || this;
+ else if (typeof define === "function" && define.amd) {
+ define("outline_shadowsocksconfig/src/shadowsocks_config", ["require", "exports"], factory);
}
- return InvalidUri;
-}(ShadowsocksConfigError));
-exports.InvalidUri = InvalidUri;
-// Self-validating/normalizing config data types implement this ValidatedConfigField interface.
-// Constructors take some data, validate, normalize, and store if valid, or throw otherwise.
-var ValidatedConfigField = /** @class */ (function () {
- function ValidatedConfigField() {
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ /* tslint:disable */
+ const isBrowser = typeof window !== 'undefined';
+ const b64Encode = isBrowser ? btoa : require('base-64').encode;
+ const b64Decode = isBrowser ? atob : require('base-64').decode;
+ const URL = isBrowser ? window.URL : require('url').URL;
+ const punycode = isBrowser ? window.punycode : require('punycode');
+ if (!punycode) {
+ throw new Error(`Could not find punycode. Did you forget to add e.g.
+ ?`);
}
- return ValidatedConfigField;
-}());
-exports.ValidatedConfigField = ValidatedConfigField;
-function throwErrorForInvalidField(name, value, reason) {
- throw new InvalidConfigField("Invalid " + name + ": " + value + " " + (reason || ''));
-}
-var Host = /** @class */ (function (_super) {
- __extends(Host, _super);
- function Host(host) {
- var _this = _super.call(this) || this;
- if (!host) {
- throwErrorForInvalidField('host', host);
+ /* tslint:enable */
+ // Custom error base class
+ class ShadowsocksConfigError extends Error {
+ constructor(message) {
+ super(message); // 'Error' breaks prototype chain here if this is transpiled to es5
+ Object.setPrototypeOf(this, new.target.prototype); // restore prototype chain
+ this.name = new.target.name;
}
- if (host instanceof Host) {
- host = host.data;
- }
- host = punycode.toASCII(host);
- _this.isIPv4 = Host.IPV4_PATTERN.test(host);
- _this.isIPv6 = _this.isIPv4 ? false : Host.IPV6_PATTERN.test(host);
- _this.isHostname = _this.isIPv4 || _this.isIPv6 ? false : Host.HOSTNAME_PATTERN.test(host);
- if (!(_this.isIPv4 || _this.isIPv6 || _this.isHostname)) {
- throwErrorForInvalidField('host', host);
+ }
+ exports.ShadowsocksConfigError = ShadowsocksConfigError;
+ class InvalidConfigField extends ShadowsocksConfigError {
+ }
+ exports.InvalidConfigField = InvalidConfigField;
+ class InvalidUri extends ShadowsocksConfigError {
+ }
+ exports.InvalidUri = InvalidUri;
+ // Self-validating/normalizing config data types implement this ValidatedConfigField interface.
+ // Constructors take some data, validate, normalize, and store if valid, or throw otherwise.
+ class ValidatedConfigField {
+ }
+ exports.ValidatedConfigField = ValidatedConfigField;
+ function throwErrorForInvalidField(name, value, reason) {
+ throw new InvalidConfigField(`Invalid ${name}: ${value} ${reason || ''}`);
+ }
+ class Host extends ValidatedConfigField {
+ constructor(host) {
+ super();
+ if (!host) {
+ throwErrorForInvalidField('host', host);
+ }
+ if (host instanceof Host) {
+ host = host.data;
+ }
+ host = punycode.toASCII(host);
+ this.isIPv4 = Host.IPV4_PATTERN.test(host);
+ this.isIPv6 = this.isIPv4 ? false : Host.IPV6_PATTERN.test(host);
+ this.isHostname = this.isIPv4 || this.isIPv6 ? false : Host.HOSTNAME_PATTERN.test(host);
+ if (!(this.isIPv4 || this.isIPv6 || this.isHostname)) {
+ throwErrorForInvalidField('host', host);
+ }
+ this.data = host;
}
- _this.data = host;
- return _this;
}
Host.IPV4_PATTERN = /^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$/;
Host.IPV6_PATTERN = /^(?:[A-F0-9]{1,4}:){7}[A-F0-9]{1,4}$/i;
Host.HOSTNAME_PATTERN = /^[A-z0-9]+[A-z0-9_.-]*$/;
- return Host;
-}(ValidatedConfigField));
-exports.Host = Host;
-var Port = /** @class */ (function (_super) {
- __extends(Port, _super);
- function Port(port) {
- var _this = _super.call(this) || this;
- if (port instanceof Port) {
- port = port.data;
- }
- if (typeof port === 'number') {
- // Stringify in case negative or floating point -> the regex test below will catch.
- port = port.toString();
- }
- if (!Port.PATTERN.test(port)) {
- throwErrorForInvalidField('port', port);
- }
- // Could exceed the maximum port number, so convert to Number to check. Could also have leading
- // zeros. Converting to Number drops those, so we get normalization for free. :)
- port = Number(port);
- if (port > 65535) {
- throwErrorForInvalidField('port', port);
+ exports.Host = Host;
+ class Port extends ValidatedConfigField {
+ constructor(port) {
+ super();
+ if (port instanceof Port) {
+ port = port.data;
+ }
+ if (typeof port === 'number') {
+ // Stringify in case negative or floating point -> the regex test below will catch.
+ port = port.toString();
+ }
+ if (!Port.PATTERN.test(port)) {
+ throwErrorForInvalidField('port', port);
+ }
+ // Could exceed the maximum port number, so convert to Number to check. Could also have leading
+ // zeros. Converting to Number drops those, so we get normalization for free. :)
+ port = Number(port);
+ if (port > 65535) {
+ throwErrorForInvalidField('port', port);
+ }
+ this.data = port;
}
- _this.data = port;
- return _this;
}
Port.PATTERN = /^[0-9]{1,5}$/;
- return Port;
-}(ValidatedConfigField));
-exports.Port = Port;
-// A method value must exactly match an element in the set of known ciphers.
-// ref: https://github.com/shadowsocks/shadowsocks-libev/blob/10a2d3e3/completions/bash/ss-redir#L5
-exports.METHODS = new Set([
- 'rc4-md5',
- 'aes-128-gcm',
- 'aes-192-gcm',
- 'aes-256-gcm',
- 'aes-128-cfb',
- 'aes-192-cfb',
- 'aes-256-cfb',
- 'aes-128-ctr',
- 'aes-192-ctr',
- 'aes-256-ctr',
- 'camellia-128-cfb',
- 'camellia-192-cfb',
- 'camellia-256-cfb',
- 'bf-cfb',
- 'chacha20-ietf-poly1305',
- 'salsa20',
- 'chacha20',
- 'chacha20-ietf',
- 'xchacha20-ietf-poly1305',
-]);
-var Method = /** @class */ (function (_super) {
- __extends(Method, _super);
- function Method(method) {
- var _this = _super.call(this) || this;
- if (method instanceof Method) {
- method = method.data;
- }
- if (!exports.METHODS.has(method)) {
- throwErrorForInvalidField('method', method);
+ exports.Port = Port;
+ // A method value must exactly match an element in the set of known ciphers.
+ // ref: https://github.com/shadowsocks/shadowsocks-libev/blob/10a2d3e3/completions/bash/ss-redir#L5
+ exports.METHODS = new Set([
+ 'rc4-md5',
+ 'aes-128-gcm',
+ 'aes-192-gcm',
+ 'aes-256-gcm',
+ 'aes-128-cfb',
+ 'aes-192-cfb',
+ 'aes-256-cfb',
+ 'aes-128-ctr',
+ 'aes-192-ctr',
+ 'aes-256-ctr',
+ 'camellia-128-cfb',
+ 'camellia-192-cfb',
+ 'camellia-256-cfb',
+ 'bf-cfb',
+ 'chacha20-ietf-poly1305',
+ 'salsa20',
+ 'chacha20',
+ 'chacha20-ietf',
+ 'xchacha20-ietf-poly1305',
+ ]);
+ class Method extends ValidatedConfigField {
+ constructor(method) {
+ super();
+ if (method instanceof Method) {
+ method = method.data;
+ }
+ if (!exports.METHODS.has(method)) {
+ throwErrorForInvalidField('method', method);
+ }
+ this.data = method;
}
- _this.data = method;
- return _this;
- }
- return Method;
-}(ValidatedConfigField));
-exports.Method = Method;
-var Password = /** @class */ (function (_super) {
- __extends(Password, _super);
- function Password(password) {
- var _this = _super.call(this) || this;
- _this.data = password instanceof Password ? password.data : password;
- return _this;
}
- return Password;
-}(ValidatedConfigField));
-exports.Password = Password;
-var Tag = /** @class */ (function (_super) {
- __extends(Tag, _super);
- function Tag(tag) {
- if (tag === void 0) { tag = ''; }
- var _this = _super.call(this) || this;
- _this.data = tag instanceof Tag ? tag.data : tag;
- return _this;
+ exports.Method = Method;
+ class Password extends ValidatedConfigField {
+ constructor(password) {
+ super();
+ this.data = password instanceof Password ? password.data : password;
+ }
}
- return Tag;
-}(ValidatedConfigField));
-exports.Tag = Tag;
-// tslint:disable-next-line:no-any
-function makeConfig(input) {
- // Use "!" for the required fields to tell tsc that we handle undefined in the
- // ValidatedConfigFields we call; tsc can't figure that out otherwise.
- var config = {
- host: new Host(input.host),
- port: new Port(input.port),
- method: new Method(input.method),
- password: new Password(input.password),
- tag: new Tag(input.tag),
- extra: {},
- };
- // Put any remaining fields in `input` into `config.extra`.
- for (var _i = 0, _a = Object.keys(input); _i < _a.length; _i++) {
- var key = _a[_i];
- if (!/^(host|port|method|password|tag)$/.test(key)) {
- config.extra[key] = input[key] && input[key].toString();
+ exports.Password = Password;
+ class Tag extends ValidatedConfigField {
+ constructor(tag = '') {
+ super();
+ this.data = tag instanceof Tag ? tag.data : tag;
}
}
- return config;
-}
-exports.makeConfig = makeConfig;
-exports.SHADOWSOCKS_URI = {
- PROTOCOL: 'ss:',
- getUriFormattedHost: function (host) {
- return host.isIPv6 ? "[" + host.data + "]" : host.data;
- },
- getHash: function (tag) {
- return tag.data ? "#" + encodeURIComponent(tag.data) : '';
- },
- validateProtocol: function (uri) {
- if (!uri.startsWith(exports.SHADOWSOCKS_URI.PROTOCOL)) {
- throw new InvalidUri("URI must start with \"" + exports.SHADOWSOCKS_URI.PROTOCOL + "\"");
+ exports.Tag = Tag;
+ // tslint:disable-next-line:no-any
+ function makeConfig(input) {
+ // Use "!" for the required fields to tell tsc that we handle undefined in the
+ // ValidatedConfigFields we call; tsc can't figure that out otherwise.
+ const config = {
+ host: new Host(input.host),
+ port: new Port(input.port),
+ method: new Method(input.method),
+ password: new Password(input.password),
+ tag: new Tag(input.tag),
+ extra: {},
+ };
+ // Put any remaining fields in `input` into `config.extra`.
+ for (const key of Object.keys(input)) {
+ if (!/^(host|port|method|password|tag)$/.test(key)) {
+ config.extra[key] = input[key] && input[key].toString();
+ }
}
- },
- parse: function (uri) {
- var error;
- for (var _i = 0, _a = [exports.SIP002_URI, exports.LEGACY_BASE64_URI]; _i < _a.length; _i++) {
- var uriType = _a[_i];
+ return config;
+ }
+ exports.makeConfig = makeConfig;
+ exports.SHADOWSOCKS_URI = {
+ PROTOCOL: 'ss:',
+ getUriFormattedHost: (host) => {
+ return host.isIPv6 ? `[${host.data}]` : host.data;
+ },
+ getHash: (tag) => {
+ return tag.data ? `#${encodeURIComponent(tag.data)}` : '';
+ },
+ validateProtocol: (uri) => {
+ if (!uri.startsWith(exports.SHADOWSOCKS_URI.PROTOCOL)) {
+ throw new InvalidUri(`URI must start with "${exports.SHADOWSOCKS_URI.PROTOCOL}"`);
+ }
+ },
+ parse: (uri) => {
+ let error;
+ for (const uriType of [exports.SIP002_URI, exports.LEGACY_BASE64_URI]) {
+ try {
+ return uriType.parse(uri);
+ }
+ catch (e) {
+ error = e;
+ }
+ }
+ if (!(error instanceof InvalidUri)) {
+ const originalErrorName = error.name || '(Unnamed Error)';
+ const originalErrorMessage = error.message || '(no error message provided)';
+ const originalErrorString = `${originalErrorName}: ${originalErrorMessage}`;
+ const newErrorMessage = `Invalid input: ${originalErrorString}`;
+ error = new InvalidUri(newErrorMessage);
+ }
+ throw error;
+ },
+ };
+ // Ref: https://shadowsocks.org/en/config/quick-guide.html
+ exports.LEGACY_BASE64_URI = {
+ parse: (uri) => {
+ exports.SHADOWSOCKS_URI.validateProtocol(uri);
+ const hashIndex = uri.indexOf('#');
+ const hasTag = hashIndex !== -1;
+ const b64EndIndex = hasTag ? hashIndex : uri.length;
+ const tagStartIndex = hasTag ? hashIndex + 1 : uri.length;
+ const tag = new Tag(decodeURIComponent(uri.substring(tagStartIndex)));
+ const b64EncodedData = uri.substring('ss://'.length, b64EndIndex);
+ const b64DecodedData = b64Decode(b64EncodedData);
+ const atSignIndex = b64DecodedData.lastIndexOf('@');
+ if (atSignIndex === -1) {
+ throw new InvalidUri(`Missing "@"`);
+ }
+ const methodAndPassword = b64DecodedData.substring(0, atSignIndex);
+ const methodEndIndex = methodAndPassword.indexOf(':');
+ if (methodEndIndex === -1) {
+ throw new InvalidUri(`Missing password`);
+ }
+ const methodString = methodAndPassword.substring(0, methodEndIndex);
+ const method = new Method(methodString);
+ const passwordStartIndex = methodEndIndex + 1;
+ const passwordString = methodAndPassword.substring(passwordStartIndex);
+ const password = new Password(passwordString);
+ const hostStartIndex = atSignIndex + 1;
+ const hostAndPort = b64DecodedData.substring(hostStartIndex);
+ const hostEndIndex = hostAndPort.lastIndexOf(':');
+ if (hostEndIndex === -1) {
+ throw new InvalidUri(`Missing port`);
+ }
+ const uriFormattedHost = hostAndPort.substring(0, hostEndIndex);
+ let host;
try {
- return uriType.parse(uri);
+ host = new Host(uriFormattedHost);
}
- catch (e) {
- error = e;
+ catch (_) {
+ // Could be IPv6 host formatted with surrounding brackets, so try stripping first and last
+ // characters. If this throws, give up and let the exception propagate.
+ host = new Host(uriFormattedHost.substring(1, uriFormattedHost.length - 1));
}
- }
- if (!(error instanceof InvalidUri)) {
- var originalErrorName = error.name || '(Unnamed Error)';
- var originalErrorMessage = error.message || '(no error message provided)';
- var originalErrorString = originalErrorName + ": " + originalErrorMessage;
- var newErrorMessage = "Invalid input: " + originalErrorString;
- error = new InvalidUri(newErrorMessage);
- }
- throw error;
- },
-};
-// Ref: https://shadowsocks.org/en/config/quick-guide.html
-exports.LEGACY_BASE64_URI = {
- parse: function (uri) {
- exports.SHADOWSOCKS_URI.validateProtocol(uri);
- var hashIndex = uri.indexOf('#');
- var hasTag = hashIndex !== -1;
- var b64EndIndex = hasTag ? hashIndex : uri.length;
- var tagStartIndex = hasTag ? hashIndex + 1 : uri.length;
- var tag = new Tag(decodeURIComponent(uri.substring(tagStartIndex)));
- var b64EncodedData = uri.substring('ss://'.length, b64EndIndex);
- var b64DecodedData = b64Decode(b64EncodedData);
- var atSignIndex = b64DecodedData.lastIndexOf('@');
- if (atSignIndex === -1) {
- throw new InvalidUri("Missing \"@\"");
- }
- var methodAndPassword = b64DecodedData.substring(0, atSignIndex);
- var methodEndIndex = methodAndPassword.indexOf(':');
- if (methodEndIndex === -1) {
- throw new InvalidUri("Missing password");
- }
- var methodString = methodAndPassword.substring(0, methodEndIndex);
- var method = new Method(methodString);
- var passwordStartIndex = methodEndIndex + 1;
- var passwordString = methodAndPassword.substring(passwordStartIndex);
- var password = new Password(passwordString);
- var hostStartIndex = atSignIndex + 1;
- var hostAndPort = b64DecodedData.substring(hostStartIndex);
- var hostEndIndex = hostAndPort.lastIndexOf(':');
- if (hostEndIndex === -1) {
- throw new InvalidUri("Missing port");
- }
- var uriFormattedHost = hostAndPort.substring(0, hostEndIndex);
- var host;
- try {
- host = new Host(uriFormattedHost);
- }
- catch (_) {
- // Could be IPv6 host formatted with surrounding brackets, so try stripping first and last
- // characters. If this throws, give up and let the exception propagate.
- host = new Host(uriFormattedHost.substring(1, uriFormattedHost.length - 1));
- }
- var portStartIndex = hostEndIndex + 1;
- var portString = hostAndPort.substring(portStartIndex);
- var port = new Port(portString);
- var extra = {}; // empty because LegacyBase64Uri can't hold extra
- return { method: method, password: password, host: host, port: port, tag: tag, extra: extra };
- },
- stringify: function (config) {
- var host = config.host, port = config.port, method = config.method, password = config.password, tag = config.tag;
- var hash = exports.SHADOWSOCKS_URI.getHash(tag);
- var b64EncodedData = b64Encode(method.data + ":" + password.data + "@" + host.data + ":" + port.data);
- var dataLength = b64EncodedData.length;
- var paddingLength = 0;
- for (; b64EncodedData[dataLength - 1 - paddingLength] === '='; paddingLength++)
- ;
- b64EncodedData = paddingLength === 0 ? b64EncodedData :
- b64EncodedData.substring(0, dataLength - paddingLength);
- return "ss://" + b64EncodedData + hash;
- },
-};
-// Ref: https://shadowsocks.org/en/spec/SIP002-URI-Scheme.html
-exports.SIP002_URI = {
- parse: function (uri) {
- exports.SHADOWSOCKS_URI.validateProtocol(uri);
- // Can use built-in URL parser for expedience. Just have to replace "ss" with "http" to ensure
- // correct results, otherwise browsers like Safari fail to parse it.
- var inputForUrlParser = "http" + uri.substring(2);
- // The built-in URL parser throws as desired when given URIs with invalid syntax.
- var urlParserResult = new URL(inputForUrlParser);
- var uriFormattedHost = urlParserResult.hostname;
- // URI-formatted IPv6 hostnames have surrounding brackets.
- var last = uriFormattedHost.length - 1;
- var brackets = uriFormattedHost[0] === '[' && uriFormattedHost[last] === ']';
- var hostString = brackets ? uriFormattedHost.substring(1, last) : uriFormattedHost;
- var host = new Host(hostString);
- var parsedPort = urlParserResult.port;
- if (!parsedPort && uri.match(/:80($|\/)/g)) {
- // The default URL parser fails to recognize the default port (80) when the URI being parsed
- // is HTTP. Check if the port is present at the end of the string or before the parameters.
- parsedPort = 80;
- }
- var port = new Port(parsedPort);
- var tag = new Tag(decodeURIComponent(urlParserResult.hash.substring(1)));
- var b64EncodedUserInfo = urlParserResult.username.replace(/%3D/g, '=');
- // base64.decode throws as desired when given invalid base64 input.
- var b64DecodedUserInfo = b64Decode(b64EncodedUserInfo);
- var colonIdx = b64DecodedUserInfo.indexOf(':');
- if (colonIdx === -1) {
- throw new InvalidUri("Missing password");
- }
- var methodString = b64DecodedUserInfo.substring(0, colonIdx);
- var method = new Method(methodString);
- var passwordString = b64DecodedUserInfo.substring(colonIdx + 1);
- var password = new Password(passwordString);
- var queryParams = urlParserResult.search.substring(1).split('&');
- var extra = {};
- for (var _i = 0, queryParams_1 = queryParams; _i < queryParams_1.length; _i++) {
- var pair = queryParams_1[_i];
- var _a = pair.split('=', 2), key = _a[0], value = _a[1];
- if (!key)
- continue;
- extra[key] = decodeURIComponent(value || '');
- }
- return { method: method, password: password, host: host, port: port, tag: tag, extra: extra };
- },
- stringify: function (config) {
- var host = config.host, port = config.port, method = config.method, password = config.password, tag = config.tag, extra = config.extra;
- var userInfo = b64Encode(method.data + ":" + password.data);
- var uriHost = exports.SHADOWSOCKS_URI.getUriFormattedHost(host);
- var hash = exports.SHADOWSOCKS_URI.getHash(tag);
- var queryString = '';
- for (var key in extra) {
- if (!key)
- continue;
- queryString += (queryString ? '&' : '?') + (key + "=" + encodeURIComponent(extra[key]));
- }
- return "ss://" + userInfo + "@" + uriHost + ":" + port.data + "/" + queryString + hash;
- },
-};
+ const portStartIndex = hostEndIndex + 1;
+ const portString = hostAndPort.substring(portStartIndex);
+ const port = new Port(portString);
+ const extra = {}; // empty because LegacyBase64Uri can't hold extra
+ return { method, password, host, port, tag, extra };
+ },
+ stringify: (config) => {
+ const { host, port, method, password, tag } = config;
+ const hash = exports.SHADOWSOCKS_URI.getHash(tag);
+ let b64EncodedData = b64Encode(`${method.data}:${password.data}@${host.data}:${port.data}`);
+ const dataLength = b64EncodedData.length;
+ let paddingLength = 0;
+ for (; b64EncodedData[dataLength - 1 - paddingLength] === '='; paddingLength++)
+ ;
+ b64EncodedData = paddingLength === 0 ? b64EncodedData :
+ b64EncodedData.substring(0, dataLength - paddingLength);
+ return `ss://${b64EncodedData}${hash}`;
+ },
+ };
+ // Ref: https://shadowsocks.org/en/spec/SIP002-URI-Scheme.html
+ exports.SIP002_URI = {
+ parse: (uri) => {
+ exports.SHADOWSOCKS_URI.validateProtocol(uri);
+ // Can use built-in URL parser for expedience. Just have to replace "ss" with "http" to ensure
+ // correct results, otherwise browsers like Safari fail to parse it.
+ const inputForUrlParser = `http${uri.substring(2)}`;
+ // The built-in URL parser throws as desired when given URIs with invalid syntax.
+ const urlParserResult = new URL(inputForUrlParser);
+ const uriFormattedHost = urlParserResult.hostname;
+ // URI-formatted IPv6 hostnames have surrounding brackets.
+ const last = uriFormattedHost.length - 1;
+ const brackets = uriFormattedHost[0] === '[' && uriFormattedHost[last] === ']';
+ const hostString = brackets ? uriFormattedHost.substring(1, last) : uriFormattedHost;
+ const host = new Host(hostString);
+ let parsedPort = urlParserResult.port;
+ if (!parsedPort && uri.match(/:80($|\/)/g)) {
+ // The default URL parser fails to recognize the default port (80) when the URI being parsed
+ // is HTTP. Check if the port is present at the end of the string or before the parameters.
+ parsedPort = 80;
+ }
+ const port = new Port(parsedPort);
+ const tag = new Tag(decodeURIComponent(urlParserResult.hash.substring(1)));
+ const b64EncodedUserInfo = urlParserResult.username.replace(/%3D/g, '=');
+ // base64.decode throws as desired when given invalid base64 input.
+ const b64DecodedUserInfo = b64Decode(b64EncodedUserInfo);
+ const colonIdx = b64DecodedUserInfo.indexOf(':');
+ if (colonIdx === -1) {
+ throw new InvalidUri(`Missing password`);
+ }
+ const methodString = b64DecodedUserInfo.substring(0, colonIdx);
+ const method = new Method(methodString);
+ const passwordString = b64DecodedUserInfo.substring(colonIdx + 1);
+ const password = new Password(passwordString);
+ const queryParams = urlParserResult.search.substring(1).split('&');
+ const extra = {};
+ for (const pair of queryParams) {
+ const [key, value] = pair.split('=', 2);
+ if (!key)
+ continue;
+ extra[key] = decodeURIComponent(value || '');
+ }
+ return { method, password, host, port, tag, extra };
+ },
+ stringify: (config) => {
+ const { host, port, method, password, tag, extra } = config;
+ const userInfo = b64Encode(`${method.data}:${password.data}`);
+ const uriHost = exports.SHADOWSOCKS_URI.getUriFormattedHost(host);
+ const hash = exports.SHADOWSOCKS_URI.getHash(tag);
+ let queryString = '';
+ for (const key in extra) {
+ if (!key)
+ continue;
+ queryString += (queryString ? '&' : '?') + `${key}=${encodeURIComponent(extra[key])}`;
+ }
+ return `ss://${userInfo}@${uriHost}:${port.data}/${queryString}${hash}`;
+ },
+ };
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhZG93c29ja3NfY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NoYWRvd3NvY2tzX2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxxQ0FBcUM7QUFDckMsRUFBRTtBQUNGLGtFQUFrRTtBQUNsRSxtRUFBbUU7QUFDbkUsMENBQTBDO0FBQzFDLEVBQUU7QUFDRixrREFBa0Q7QUFDbEQsRUFBRTtBQUNGLHNFQUFzRTtBQUN0RSxvRUFBb0U7QUFDcEUsMkVBQTJFO0FBQzNFLHNFQUFzRTtBQUN0RSxpQ0FBaUM7Ozs7Ozs7Ozs7OztJQUVqQyxvQkFBb0I7SUFDcEIsTUFBTSxTQUFTLEdBQUcsT0FBTyxNQUFNLEtBQUssV0FBVyxDQUFDO0lBQ2hELE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQy9ELE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQy9ELE1BQU0sR0FBRyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUN4RCxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFFLE1BQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM1RSxJQUFJLENBQUMsUUFBUSxFQUFFO1FBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQztxRUFDbUQsQ0FBQyxDQUFDO0tBQ3RFO0lBQ0QsbUJBQW1CO0lBRW5CLDBCQUEwQjtJQUMxQixNQUFhLHNCQUF1QixTQUFRLEtBQUs7UUFDL0MsWUFBWSxPQUFl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dkY7WUFDRCxPQUFPLFFBQVEsUUFBUSxJQUFJLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLFdBQVcsR0FBRyxJQUFJLEVBQUUsQ0FBQztRQUMxRSxDQUFDO0tBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDE4IFRoZSBPdXRsaW5lIEF1dGhvcnNcbi8vXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbi8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbi8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4vKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuY29uc3QgaXNCcm93c2VyID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCc7XG5jb25zdCBiNjRFbmNvZGUgPSBpc0Jyb3dzZXIgPyBidG9hIDogcmVxdWlyZSgnYmFzZS02NCcpLmVuY29kZTtcbmNvbnN0IGI2NERlY29kZSA9IGlzQnJvd3NlciA/IGF0b2IgOiByZXF1aXJlKCdiYXNlLTY0JykuZGVjb2RlO1xuY29uc3QgVVJMID0gaXNCcm93c2VyID8gd2luZG93LlVSTCA6IHJlcXVpcmUoJ3VybCcpLlVSTDtcbmNvbnN0IHB1bnljb2RlID0gaXNCcm93c2VyID8gKHdpbmRvdyBhcyBhbnkpLnB1bnljb2RlIDogcmVxdWlyZSgncHVueWNvZGUnKTtcbmlmICghcHVueWNvZGUpIHtcbiAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBwdW55Y29kZS4gRGlkIHlvdSBmb3JnZXQgdG8gYWRkIGUuZy5cbiAgPHNjcmlwdCBzcmM9XCJib3dlcl9jb21wb25lbnRzL3B1bnljb2RlL3B1bnljb2RlLm1pbi5qc1wiPjwvc2NyaXB0Pj9gKTtcbn1cbi8qIHRzbGludDplbmFibGUgKi9cblxuLy8gQ3VzdG9tIGVycm9yIGJhc2UgY2xhc3NcbmV4cG9ydCBjbGFzcyBTaGFkb3dzb2Nrc0NvbmZpZ0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTsgIC8vICdFcnJvcicgYnJlYWtzIHByb3RvdHlwZSBjaGFpbiBoZXJlIGlmIHRoaXMgaXMgdHJhbnNwaWxlZCB0byBlczVcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgbmV3LnRhcmdldC5wcm90b3R5cGUpOyAgLy8gcmVzdG9yZSBwcm90b3R5cGUgY2hhaW5cbiAgICB0aGlzLm5hbWUgPSBuZXcudGFyZ2V0Lm5hbWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludmFsaWRDb25maWdGaWVsZCBleHRlbmRzIFNoYWRvd3NvY2tzQ29uZmlnRXJyb3Ige31cblxuZXhwb3J0IGNsYXNzIEludmFsaWRVcmkgZXh0ZW5kcyBTaGFkb3dzb2Nrc0NvbmZpZ0Vycm9yIHt9XG5cbi8vIFNlbGYtdmFsaWRhdGluZy9ub3JtYWxpemluZyBjb25maWcgZGF0YSB0eXBlcyBpbXBsZW1lbnQgdGhpcyBWYWxpZGF0ZWRDb25maWdGaWVsZCBpbnRlcmZhY2UuXG4vLyBDb25zdHJ1Y3RvcnMgdGFrZSBzb21lIGRhdGEsIHZhbGlkYXRlLCBub3JtYWxpemUsIGFuZCBzdG9yZSBpZiB2YWxpZCwgb3IgdGhyb3cgb3RoZXJ3aXNlLlxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFZhbGlkYXRlZENvbmZpZ0ZpZWxkIHt9XG5cbmZ1bmN0aW9uIHRocm93RXJyb3JGb3JJbnZhbGlkRmllbGQobmFtZTogc3RyaW5nLCB2YWx1ZToge30sIHJlYXNvbj86IHN0cmluZykge1xuICB0aHJvdyBuZXcgSW52YWxpZENvbmZpZ0ZpZWxkKGBJbnZhbGlkICR7bmFtZX06ICR7dmFsdWV9ICR7cmVhc29uIHx8ICcnfWApO1xufVxuXG5leHBvcnQgY2xhc3MgSG9zdCBleHRlbmRzIFZhbGlkYXRlZENvbmZpZ0ZpZWxkIHtcbiAgcHVibGljIHN0YXRpYyBJUFY0X1BBVFRFUk4gPSAvXig/OlswLTldezEsM31cXC4pezN9WzAtOV17MSwzfSQvO1xuICBwdWJsaWMgc3RhdGljIElQVjZfUEFUVEVSTiA9IC9eKD86W0EtRjAtOV17MSw0fTopezd9W0EtRjAtOV17MSw0fSQvaTtcbiAgcHVibGljIHN0YXRpYyBIT1NUTkFNRV9QQVRURVJOID0gL15bQS16MC05XStbQS16MC05Xy4tXSokLztcbiAgcHVibGljIHJlYWRvbmx5IGRhdGE6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGlzSVB2NDogYm9vbGVhbjtcbiAgcHVibGljIHJlYWRvbmx5IGlzSVB2NjogYm9vbGVhbjtcbiAgcHVibGljIHJlYWRvbmx5IGlzSG9zdG5hbWU6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoaG9zdDogSG9zdCB8IHN0cmluZykge1xuICAgIHN1cGVyKCk7XG4gICAgaWYgKCFob3N0KSB7XG4gICAgICB0aHJvd0Vycm9yRm9ySW52YWxpZEZpZWxkKCdob3N0JywgaG9zdCk7XG4gICAgfVxuICAgIGlmIChob3N0IGluc3RhbmNlb2YgSG9zdCkge1xuICAgICAgaG9zdCA9IGhvc3QuZGF0YTtcbiAgICB9XG4gICAgaG9zdCA9IHB1bnljb2RlLnRvQVNDSUkoaG9zdCkgYXMgc3RyaW5nO1xuICAgIHRoaXMuaXNJUHY0ID0gSG9zdC5JUFY0X1BBVFRFUk4udGVzdChob3N0KTtcbiAgICB0aGlzLmlzSVB2NiA9IHRoaXMuaXNJUHY0ID8gZmFsc2UgOiBIb3N0LklQVjZfUEFUVEVSTi50ZXN0KGhvc3QpO1xuICAgIHRoaXMuaXNIb3N0bmFtZSA9IHRoaXMuaXNJUHY0IHx8IHRoaXMuaXNJUHY2ID8gZmFsc2UgOiBIb3N0LkhPU1ROQU1FX1BBVFRFUk4udGVzdChob3N0KTtcbiAgICBpZiAoISh0aGlzLmlzSVB2NCB8fCB0aGlzLmlzSVB2NiB8fCB0aGlzLmlzSG9zdG5hbWUpKSB7XG4gICAgICB0aHJvd0Vycm9yRm9ySW52YWxpZEZpZWxkKCdob3N0JywgaG9zdCk7XG4gICAgfVxuICAgIHRoaXMuZGF0YSA9IGhvc3Q7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBvcnQgZXh0ZW5kcyBWYWxpZGF0ZWRDb25maWdGaWVsZCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUEFUVEVSTiA9IC9eWzAtOV17MSw1fSQvO1xuICBwdWJsaWMgcmVhZG9ubHkgZGF0YTogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHBvcnQ6IFBvcnQgfCBzdHJpbmcgfCBudW1iZXIpIHtcbiAgICBzdXBlcigpO1xuICAgIGlmIChwb3J0IGluc3RhbmNlb2YgUG9ydCkge1xuICAgICAgcG9ydCA9IHBvcnQuZGF0YTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwb3J0ID09PSAnbnVtYmVyJykge1xuICAgICAgLy8gU3RyaW5naWZ5IGluIGNhc2UgbmVnYXRpdmUgb3IgZmxvYXRpbmcgcG9pbnQgLT4gdGhlIHJlZ2V4IHRlc3QgYmVsb3cgd2lsbCBjYXRjaC5cbiAgICAgIHBvcnQgPSBwb3J0LnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGlmICghUG9ydC5QQVRURVJOLnRlc3QocG9ydCkpIHtcbiAgICAgIHRocm93RXJyb3JGb3JJbnZhbGlkRmllbGQoJ3BvcnQnLCBwb3J0KTtcbiAgICB9XG4gICAgLy8gQ291bGQgZXhjZWVkIHRoZSBtYXhpbXVtIHBvcnQgbnVtYmVyLCBzbyBjb252ZXJ0IHRvIE51bWJlciB0byBjaGVjay4gQ291bGQgYWxzbyBoYXZlIGxlYWRpbmdcbiAgICAvLyB6ZXJvcy4gQ29udmVydGluZyB0byBOdW1iZXIgZHJvcHMgdGhvc2UsIHNvIHdlIGdldCBub3JtYWxpemF0aW9uIGZvciBmcmVlLiA6KVxuICAgIHBvcnQgPSBOdW1iZXIocG9ydCk7XG4gICAgaWYgKHBvcnQgPiA2NTUzNSkge1xuICAgICAgdGhyb3dFcnJvckZvckludmFsaWRGaWVsZCgncG9ydCcsIHBvcnQpO1xuICAgIH1cbiAgICB0aGlzLmRhdGEgPSBwb3J0O1xuICB9XG59XG5cbi8vIEEgbWV0aG9kIHZhbHVlIG11c3QgZXhhY3RseSBtYXRjaCBhbiBlbGVtZW50IGluIHRoZSBzZXQgb2Yga25vd24gY2lwaGVycy5cbi8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL3NoYWRvd3NvY2tzL3NoYWRvd3NvY2tzLWxpYmV2L2Jsb2IvMTBhMmQzZTMvY29tcGxldGlvbnMvYmFzaC9zcy1yZWRpciNMNVxuZXhwb3J0IGNvbnN0IE1FVEhPRFMgPSBuZXcgU2V0KFtcbiAgJ3JjNC1tZDUnLFxuICAnYWVzLTEyOC1nY20nLFxuICAnYWVzLTE5Mi1nY20nLFxuICAnYWVzLTI1Ni1nY20nLFxuICAnYWVzLTEyOC1jZmInLFxuICAnYWVzLTE5Mi1jZmInLFxuICAnYWVzLTI1Ni1jZmInLFxuICAnYWVzLTEyOC1jdHInLFxuICAnYWVzLTE5Mi1jdHInLFxuICAnYWVzLTI1Ni1jdHInLFxuICAnY2FtZWxsaWEtMTI4LWNmYicsXG4gICdjYW1lbGxpYS0xOTItY2ZiJyxcbiAgJ2NhbWVsbGlhLTI1Ni1jZmInLFxuICAnYmYtY2ZiJyxcbiAgJ2NoYWNoYTIwLWlldGYtcG9seTEzMDUnLFxuICAnc2Fsc2EyMCcsXG4gICdjaGFjaGEyMCcsXG4gICdjaGFjaGEyMC1pZXRmJyxcbiAgJ3hjaGFjaGEyMC1pZXRmLXBvbHkxMzA1Jyxcbl0pO1xuXG5leHBvcnQgY2xhc3MgTWV0aG9kIGV4dGVuZHMgVmFsaWRhdGVkQ29uZmlnRmllbGQge1xuICBwdWJsaWMgcmVhZG9ubHkgZGF0YTogc3RyaW5nO1xuICBjb25zdHJ1Y3RvcihtZXRob2Q6IE1ldGhvZCB8IHN0cmluZykge1xuICAgIHN1cGVyKCk7XG4gICAgaWYgKG1ldGhvZCBpbnN0YW5jZW9mIE1ldGhvZCkge1xuICAgICAgbWV0aG9kID0gbWV0aG9kLmRhdGE7XG4gICAgfVxuICAgIGlmICghTUVUSE9EUy5oYXMobWV0aG9kKSkge1xuICAgICAgdGhyb3dFcnJvckZvckludmFsaWRGaWVsZCgnbWV0aG9kJywgbWV0aG9kKTtcbiAgICB9XG4gICAgdGhpcy5kYXRhID0gbWV0aG9kO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQYXNzd29yZCBleHRlbmRzIFZhbGlkYXRlZENvbmZpZ0ZpZWxkIHtcbiAgcHVibGljIHJlYWRvbmx5IGRhdGE6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihwYXNzd29yZDogUGFzc3dvcmQgfCBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZGF0YSA9IHBhc3N3b3JkIGluc3RhbmNlb2YgUGFzc3dvcmQgPyBwYXNzd29yZC5kYXRhIDogcGFzc3dvcmQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRhZyBleHRlbmRzIFZhbGlkYXRlZENvbmZpZ0ZpZWxkIHtcbiAgcHVibGljIHJlYWRvbmx5IGRhdGE6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcih0YWc6IFRhZyB8IHN0cmluZyA9ICcnKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmRhdGEgPSB0YWcgaW5zdGFuY2VvZiBUYWcgPyB0YWcuZGF0YSA6IHRhZztcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbmZpZyB7XG4gIGhvc3Q6IEhvc3Q7XG4gIHBvcnQ6IFBvcnQ7XG4gIG1ldGhvZDogTWV0aG9kO1xuICBwYXNzd29yZDogUGFzc3dvcmQ7XG4gIHRhZzogVGFnO1xuICAvLyBBbnkgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uIChlLmcuIGB0aW1lb3V0YCwgU0lQMDAzIGBwbHVnaW5gLCBldGMuKSBtYXkgYmUgc3RvcmVkIGhlcmUuXG4gIGV4dHJhOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcbn1cblxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VDb25maWcoaW5wdXQ6IHtba2V5OiBzdHJpbmddOiBhbnl9KTogQ29uZmlnIHtcbiAgLy8gVXNlIFwiIVwiIGZvciB0aGUgcmVxdWlyZWQgZmllbGRzIHRvIHRlbGwgdHNjIHRoYXQgd2UgaGFuZGxlIHVuZGVmaW5lZCBpbiB0aGVcbiAgLy8gVmFsaWRhdGVkQ29uZmlnRmllbGRzIHdlIGNhbGw7IHRzYyBjYW4ndCBmaWd1cmUgdGhhdCBvdXQgb3RoZXJ3aXNlLlxuICBjb25zdCBjb25maWcgPSB7XG4gICAgaG9zdDogbmV3IEhvc3QoaW5wdXQuaG9zdCEpLFxuICAgIHBvcnQ6IG5ldyBQb3J0KGlucHV0LnBvcnQhKSxcbiAgICBtZXRob2Q6IG5ldyBNZXRob2QoaW5wdXQubWV0aG9kISksXG4gICAgcGFzc3dvcmQ6IG5ldyBQYXNzd29yZChpbnB1dC5wYXNzd29yZCEpLFxuICAgIHRhZzogbmV3IFRhZyhpbnB1dC50YWcpLCAgLy8gaW5wdXQudGFnIG1pZ2h0IGJlIHVuZGVmaW5lZCBidXQgVGFnKCkgaGFuZGxlcyB0aGF0IGZpbmUuXG4gICAgZXh0cmE6IHt9IGFzIHtba2V5OiBzdHJpbmddOiBzdHJpbmd9LFxuICB9O1xuICAvLyBQdXQgYW55IHJlbWFpbmluZyBmaWVsZHMgaW4gYGlucHV0YCBpbnRvIGBjb25maWcuZXh0cmFgLlxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhpbnB1dCkpIHtcbiAgICBpZiAoIS9eKGhvc3R8cG9ydHxtZXRob2R8cGFzc3dvcmR8dGFnKSQvLnRlc3Qoa2V5KSkge1xuICAgICAgY29uZmlnLmV4dHJhW2tleV0gPSBpbnB1dFtrZXldICYmIGlucHV0W2tleV0udG9TdHJpbmcoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvbmZpZztcbn1cblxuZXhwb3J0IGNvbnN0IFNIQURPV1NPQ0tTX1VSSSA9IHtcbiAgUFJPVE9DT0w6ICdzczonLFxuXG4gIGdldFVyaUZvcm1hdHRlZEhvc3Q6IChob3N0OiBIb3N0KSA9PiB7XG4gICAgcmV0dXJuIGhvc3QuaXNJUHY2ID8gYFske2hvc3QuZGF0YX1dYCA6IGhvc3QuZGF0YTtcbiAgfSxcblxuICBnZXRIYXNoOiAodGFnOiBUYWcpID0+IHtcbiAgICByZXR1cm4gdGFnLmRhdGEgPyBgIyR7ZW5jb2RlVVJJQ29tcG9uZW50KHRhZy5kYXRhKX1gIDogJyc7XG4gIH0sXG5cbiAgdmFsaWRhdGVQcm90b2NvbDogKHVyaTogc3RyaW5nKSA9PiB7XG4gICAgaWYgKCF1cmkuc3RhcnRzV2l0aChTSEFET1dTT0NLU19VUkkuUFJPVE9DT0wpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFVyaShgVVJJIG11c3Qgc3RhcnQgd2l0aCBcIiR7U0hBRE9XU09DS1NfVVJJLlBST1RPQ09MfVwiYCk7XG4gICAgfVxuICB9LFxuXG4gIHBhcnNlOiAodXJpOiBzdHJpbmcpOiBDb25maWcgPT4ge1xuICAgIGxldCBlcnJvcjogRXJyb3IgfCB1bmRlZmluZWQ7XG4gICAgZm9yIChjb25zdCB1cmlUeXBlIG9mIFtTSVAwMDJfVVJJLCBMRUdBQ1lfQkFTRTY0X1VSSV0pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cmlUeXBlLnBhcnNlKHVyaSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGVycm9yID0gZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBJbnZhbGlkVXJpKSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxFcnJvck5hbWUgPSBlcnJvciEubmFtZSEgfHwgJyhVbm5hbWVkIEVycm9yKSc7XG4gICAgICBjb25zdCBvcmlnaW5hbEVycm9yTWVzc2FnZSA9IGVycm9yIS5tZXNzYWdlISB8fCAnKG5vIGVycm9yIG1lc3NhZ2UgcHJvdmlkZWQpJztcbiAgICAgIGNvbnN0IG9yaWdpbmFsRXJyb3JTdHJpbmcgPSBgJHtvcmlnaW5hbEVycm9yTmFtZX06ICR7b3JpZ2luYWxFcnJvck1lc3NhZ2V9YDtcbiAgICAgIGNvbnN0IG5ld0Vycm9yTWVzc2FnZSA9IGBJbnZhbGlkIGlucHV0OiAke29yaWdpbmFsRXJyb3JTdHJpbmd9YDtcbiAgICAgIGVycm9yID0gbmV3IEludmFsaWRVcmkobmV3RXJyb3JNZXNzYWdlKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH0sXG59O1xuXG4vLyBSZWY6IGh0dHBzOi8vc2hhZG93c29ja3Mub3JnL2VuL2NvbmZpZy9xdWljay1ndWlkZS5odG1sXG5leHBvcnQgY29uc3QgTEVHQUNZX0JBU0U2NF9VUkkgPSB7XG4gIHBhcnNlOiAodXJpOiBzdHJpbmcpOiBDb25maWcgPT4ge1xuICAgIFNIQURPV1NPQ0tTX1VSSS52YWxpZGF0ZVByb3RvY29sKHVyaSk7XG4gICAgY29uc3QgaGFzaEluZGV4ID0gdXJpLmluZGV4T2YoJyMnKTtcbiAgICBjb25zdCBoYXNUYWcgPSBoYXNoSW5kZXggIT09IC0xO1xuICAgIGNvbnN0IGI2NEVuZEluZGV4ID0gaGFzVGFnID8gaGFzaEluZGV4IDogdXJpLmxlbmd0aDtcbiAgICBjb25zdCB0YWdTdGFydEluZGV4ID0gaGFzVGFnID8gaGFzaEluZGV4ICsgMSA6IHVyaS5sZW5ndGg7XG4gICAgY29uc3QgdGFnID0gbmV3IFRhZyhkZWNvZGVVUklDb21wb25lbnQodXJpLnN1YnN0cmluZyh0YWdTdGFydEluZGV4KSkpO1xuICAgIGNvbnN0IGI2NEVuY29kZWREYXRhID0gdXJpLnN1YnN0cmluZygnc3M6Ly8nLmxlbmd0aCwgYjY0RW5kSW5kZXgpO1xuICAgIGNvbnN0IGI2NERlY29kZWREYXRhID0gYjY0RGVjb2RlKGI2NEVuY29kZWREYXRhKTtcbiAgICBjb25zdCBhdFNpZ25JbmRleCA9IGI2NERlY29kZWREYXRhLmxhc3RJbmRleE9mKCdAJyk7XG4gICAgaWYgKGF0U2lnbkluZGV4ID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRVcmkoYE1pc3NpbmcgXCJAXCJgKTtcbiAgICB9XG4gICAgY29uc3QgbWV0aG9kQW5kUGFzc3dvcmQgPSBiNjREZWNvZGVkRGF0YS5zdWJzdHJpbmcoMCwgYXRTaWduSW5kZXgpO1xuICAgIGNvbnN0IG1ldGhvZEVuZEluZGV4ID0gbWV0aG9kQW5kUGFzc3dvcmQuaW5kZXhPZignOicpO1xuICAgIGlmIChtZXRob2RFbmRJbmRleCA9PT0gLTEpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVXJpKGBNaXNzaW5nIHBhc3N3b3JkYCk7XG4gICAgfVxuICAgIGNvbnN0IG1ldGhvZFN0cmluZyA9IG1ldGhvZEFuZFBhc3N3b3JkLnN1YnN0cmluZygwLCBtZXRob2RFbmRJbmRleCk7XG4gICAgY29uc3QgbWV0aG9kID0gbmV3IE1ldGhvZChtZXRob2RTdHJpbmcpO1xuICAgIGNvbnN0IHBhc3N3b3JkU3RhcnRJbmRleCA9IG1ldGhvZEVuZEluZGV4ICsgMTtcbiAgICBjb25zdCBwYXNzd29yZFN0cmluZyA9IG1ldGhvZEFuZFBhc3N3b3JkLnN1YnN0cmluZyhwYXNzd29yZFN0YXJ0SW5kZXgpO1xuICAgIGNvbnN0IHBhc3N3b3JkID0gbmV3IFBhc3N3b3JkKHBhc3N3b3JkU3RyaW5nKTtcbiAgICBjb25zdCBob3N0U3RhcnRJbmRleCA9IGF0U2lnbkluZGV4ICsgMTtcbiAgICBjb25zdCBob3N0QW5kUG9ydCA9IGI2NERlY29kZWREYXRhLnN1YnN0cmluZyhob3N0U3RhcnRJbmRleCk7XG4gICAgY29uc3QgaG9zdEVuZEluZGV4ID0gaG9zdEFuZFBvcnQubGFzdEluZGV4T2YoJzonKTtcbiAgICBpZiAoaG9zdEVuZEluZGV4ID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRVcmkoYE1pc3NpbmcgcG9ydGApO1xuICAgIH1cbiAgICBjb25zdCB1cmlGb3JtYXR0ZWRIb3N0ID0gaG9zdEFuZFBvcnQuc3Vic3RyaW5nKDAsIGhvc3RFbmRJbmRleCk7XG4gICAgbGV0IGhvc3Q6IEhvc3Q7XG4gICAgdHJ5IHtcbiAgICAgIGhvc3QgPSBuZXcgSG9zdCh1cmlGb3JtYXR0ZWRIb3N0KTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICAvLyBDb3VsZCBiZSBJUHY2IGhvc3QgZm9ybWF0dGVkIHdpdGggc3Vycm91bmRpbmcgYnJhY2tldHMsIHNvIHRyeSBzdHJpcHBpbmcgZmlyc3QgYW5kIGxhc3RcbiAgICAgIC8vIGNoYXJhY3RlcnMuIElmIHRoaXMgdGhyb3dzLCBnaXZlIHVwIGFuZCBsZXQgdGhlIGV4Y2VwdGlvbiBwcm9wYWdhdGUuXG4gICAgICBob3N0ID0gbmV3IEhvc3QodXJpRm9ybWF0dGVkSG9zdC5zdWJzdHJpbmcoMSwgdXJpRm9ybWF0dGVkSG9zdC5sZW5ndGggLSAxKSk7XG4gICAgfVxuICAgIGNvbnN0IHBvcnRTdGFydEluZGV4ID0gaG9zdEVuZEluZGV4ICsgMTtcbiAgICBjb25zdCBwb3J0U3RyaW5nID0gaG9zdEFuZFBvcnQuc3Vic3RyaW5nKHBvcnRTdGFydEluZGV4KTtcbiAgICBjb25zdCBwb3J0ID0gbmV3IFBvcnQocG9ydFN0cmluZyk7XG4gICAgY29uc3QgZXh0cmEgPSB7fSBhcyB7W2tleTogc3RyaW5nXTogc3RyaW5nfTsgIC8vIGVtcHR5IGJlY2F1c2UgTGVnYWN5QmFzZTY0VXJpIGNhbid0IGhvbGQgZXh0cmFcbiAgICByZXR1cm4ge21ldGhvZCwgcGFzc3dvcmQsIGhvc3QsIHBvcnQsIHRhZywgZXh0cmF9O1xuICB9LFxuXG4gIHN0cmluZ2lmeTogKGNvbmZpZzogQ29uZmlnKSA9PiB7XG4gICAgY29uc3Qge2hvc3QsIHBvcnQsIG1ldGhvZCwgcGFzc3dvcmQsIHRhZ30gPSBjb25maWc7XG4gICAgY29uc3QgaGFzaCA9IFNIQURPV1NPQ0tTX1VSSS5nZXRIYXNoKHRhZyk7XG4gICAgbGV0IGI2NEVuY29kZWREYXRhID0gYjY0RW5jb2RlKGAke21ldGhvZC5kYXRhfToke3Bhc3N3b3JkLmRhdGF9QCR7aG9zdC5kYXRhfToke3BvcnQuZGF0YX1gKTtcbiAgICBjb25zdCBkYXRhTGVuZ3RoID0gYjY0RW5jb2RlZERhdGEubGVuZ3RoO1xuICAgIGxldCBwYWRkaW5nTGVuZ3RoID0gMDtcbiAgICBmb3IgKDsgYjY0RW5jb2RlZERhdGFbZGF0YUxlbmd0aCAtIDEgLSBwYWRkaW5nTGVuZ3RoXSA9PT0gJz0nOyBwYWRkaW5nTGVuZ3RoKyspO1xuICAgIGI2NEVuY29kZWREYXRhID0gcGFkZGluZ0xlbmd0aCA9PT0gMCA/IGI2NEVuY29kZWREYXRhIDpcbiAgICAgICAgYjY0RW5jb2RlZERhdGEuc3Vic3RyaW5nKDAsIGRhdGFMZW5ndGggLSBwYWRkaW5nTGVuZ3RoKTtcbiAgICByZXR1cm4gYHNzOi8vJHtiNjRFbmNvZGVkRGF0YX0ke2hhc2h9YDtcbiAgfSxcbn07XG5cbi8vIFJlZjogaHR0cHM6Ly9zaGFkb3dzb2Nrcy5vcmcvZW4vc3BlYy9TSVAwMDItVVJJLVNjaGVtZS5odG1sXG5leHBvcnQgY29uc3QgU0lQMDAyX1VSSSA9IHtcbiAgcGFyc2U6ICh1cmk6IHN0cmluZyk6IENvbmZpZyA9PiB7XG4gICAgU0hBRE9XU09DS1NfVVJJLnZhbGlkYXRlUHJvdG9jb2wodXJpKTtcbiAgICAvLyBDYW4gdXNlIGJ1aWx0LWluIFVSTCBwYXJzZXIgZm9yIGV4cGVkaWVuY2UuIEp1c3QgaGF2ZSB0byByZXBsYWNlIFwic3NcIiB3aXRoIFwiaHR0cFwiIHRvIGVuc3VyZVxuICAgIC8vIGNvcnJlY3QgcmVzdWx0cywgb3RoZXJ3aXNlIGJyb3dzZXJzIGxpa2UgU2FmYXJpIGZhaWwgdG8gcGFyc2UgaXQuXG4gICAgY29uc3QgaW5wdXRGb3JVcmxQYXJzZXIgPSBgaHR0cCR7dXJpLnN1YnN0cmluZygyKX1gO1xuICAgIC8vIFRoZSBidWlsdC1pbiBVUkwgcGFyc2VyIHRocm93cyBhcyBkZXNpcmVkIHdoZW4gZ2l2ZW4gVVJJcyB3aXRoIGludmFsaWQgc3ludGF4LlxuICAgIGNvbnN0IHVybFBhcnNlclJlc3VsdCA9IG5ldyBVUkwoaW5wdXRGb3JVcmxQYXJzZXIpO1xuICAgIGNvbnN0IHVyaUZvcm1hdHRlZEhvc3QgPSB1cmxQYXJzZXJSZXN1bHQuaG9zdG5hbWU7XG4gICAgLy8gVVJJLWZvcm1hdHRlZCBJUHY2IGhvc3RuYW1lcyBoYXZlIHN1cnJvdW5kaW5nIGJyYWNrZXRzLlxuICAgIGNvbnN0IGxhc3QgPSB1cmlGb3JtYXR0ZWRIb3N0Lmxlbmd0aCAtIDE7XG4gICAgY29uc3QgYnJhY2tldHMgPSB1cmlGb3JtYXR0ZWRIb3N0WzBdID09PSAnWycgJiYgdXJpRm9ybWF0dGVkSG9zdFtsYXN0XSA9PT0gJ10nO1xuICAgIGNvbnN0IGhvc3RTdHJpbmcgPSBicmFja2V0cyA/IHVyaUZvcm1hdHRlZEhvc3Quc3Vic3RyaW5nKDEsIGxhc3QpIDogdXJpRm9ybWF0dGVkSG9zdDtcbiAgICBjb25zdCBob3N0ID0gbmV3IEhvc3QoaG9zdFN0cmluZyk7XG4gICAgbGV0IHBhcnNlZFBvcnQgPSB1cmxQYXJzZXJSZXN1bHQucG9ydDtcbiAgICBpZiAoIXBhcnNlZFBvcnQgJiYgdXJpLm1hdGNoKC86ODAoJHxcXC8pL2cpKSB7XG4gICAgICAvLyBUaGUgZGVmYXVsdCBVUkwgcGFyc2VyIGZhaWxzIHRvIHJlY29nbml6ZSB0aGUgZGVmYXVsdCBwb3J0ICg4MCkgd2hlbiB0aGUgVVJJIGJlaW5nIHBhcnNlZFxuICAgICAgLy8gaXMgSFRUUC4gQ2hlY2sgaWYgdGhlIHBvcnQgaXMgcHJlc2VudCBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgb3IgYmVmb3JlIHRoZSBwYXJhbWV0ZXJzLlxuICAgICAgcGFyc2VkUG9ydCA9IDgwO1xuICAgIH1cbiAgICBjb25zdCBwb3J0ID0gbmV3IFBvcnQocGFyc2VkUG9ydCk7XG4gICAgY29uc3QgdGFnID0gbmV3IFRhZyhkZWNvZGVVUklDb21wb25lbnQodXJsUGFyc2VyUmVzdWx0Lmhhc2guc3Vic3RyaW5nKDEpKSk7XG4gICAgY29uc3QgYjY0RW5jb2RlZFVzZXJJbmZvID0gdXJsUGFyc2VyUmVzdWx0LnVzZXJuYW1lLnJlcGxhY2UoLyUzRC9nLCAnPScpO1xuICAgIC8vIGJhc2U2NC5kZWNvZGUgdGhyb3dzIGFzIGRlc2lyZWQgd2hlbiBnaXZlbiBpbnZhbGlkIGJhc2U2NCBpbnB1dC5cbiAgICBjb25zdCBiNjREZWNvZGVkVXNlckluZm8gPSBiNjREZWNvZGUoYjY0RW5jb2RlZFVzZXJJbmZvKTtcbiAgICBjb25zdCBjb2xvbklkeCA9IGI2NERlY29kZWRVc2VySW5mby5pbmRleE9mKCc6Jyk7XG4gICAgaWYgKGNvbG9uSWR4ID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRVcmkoYE1pc3NpbmcgcGFzc3dvcmRgKTtcbiAgICB9XG4gICAgY29uc3QgbWV0aG9kU3RyaW5nID0gYjY0RGVjb2RlZFVzZXJJbmZvLnN1YnN0cmluZygwLCBjb2xvbklkeCk7XG4gICAgY29uc3QgbWV0aG9kID0gbmV3IE1ldGhvZChtZXRob2RTdHJpbmcpO1xuICAgIGNvbnN0IHBhc3N3b3JkU3RyaW5nID0gYjY0RGVjb2RlZFVzZXJJbmZvLnN1YnN0cmluZyhjb2xvbklkeCArIDEpO1xuICAgIGNvbnN0IHBhc3N3b3JkID0gbmV3IFBhc3N3b3JkKHBhc3N3b3JkU3RyaW5nKTtcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHVybFBhcnNlclJlc3VsdC5zZWFyY2guc3Vic3RyaW5nKDEpLnNwbGl0KCcmJyk7XG4gICAgY29uc3QgZXh0cmEgPSB7fSBhcyB7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcbiAgICBmb3IgKGNvbnN0IHBhaXIgb2YgcXVlcnlQYXJhbXMpIHtcbiAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IHBhaXIuc3BsaXQoJz0nLCAyKTtcbiAgICAgIGlmICgha2V5KSBjb250aW51ZTtcbiAgICAgIGV4dHJhW2tleV0gPSBkZWNvZGVVUklDb21wb25lbnQodmFsdWUgfHwgJycpO1xuICAgIH1cbiAgICByZXR1cm4ge21ldGhvZCwgcGFzc3dvcmQsIGhvc3QsIHBvcnQsIHRhZywgZXh0cmF9O1xuICB9LFxuXG4gIHN0cmluZ2lmeTogKGNvbmZpZzogQ29uZmlnKSA9PiB7XG4gICAgY29uc3Qge2hvc3QsIHBvcnQsIG1ldGhvZCwgcGFzc3dvcmQsIHRhZywgZXh0cmF9ID0gY29uZmlnO1xuICAgIGNvbnN0IHVzZXJJbmZvID0gYjY0RW5jb2RlKGAke21ldGhvZC5kYXRhfToke3Bhc3N3b3JkLmRhdGF9YCk7XG4gICAgY29uc3QgdXJpSG9zdCA9IFNIQURPV1NPQ0tTX1VSSS5nZXRVcmlGb3JtYXR0ZWRIb3N0KGhvc3QpO1xuICAgIGNvbnN0IGhhc2ggPSBTSEFET1dTT0NLU19VUkkuZ2V0SGFzaCh0YWcpO1xuICAgIGxldCBxdWVyeVN0cmluZyA9ICcnO1xuICAgIGZvciAoY29uc3Qga2V5IGluIGV4dHJhKSB7XG4gICAgICBpZiAoIWtleSkgY29udGludWU7XG4gICAgICBxdWVyeVN0cmluZyArPSAocXVlcnlTdHJpbmcgPyAnJicgOiAnPycpICsgYCR7a2V5fT0ke2VuY29kZVVSSUNvbXBvbmVudChleHRyYVtrZXldKX1gO1xuICAgIH1cbiAgICByZXR1cm4gYHNzOi8vJHt1c2VySW5mb31AJHt1cmlIb3N0fToke3BvcnQuZGF0YX0vJHtxdWVyeVN0cmluZ30ke2hhc2h9YDtcbiAgfSxcbn07XG4iXX0=
\ No newline at end of file
diff --git a/jasmine.json b/jasmine.json
deleted file mode 100644
index ba2ec92..0000000
--- a/jasmine.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "spec_dir": ".",
- "spec_files": [
- "build/**/*.spec.js"
- ]
-}
\ No newline at end of file
diff --git a/package.json b/package.json
index 6eb3462..15af371 100644
--- a/package.json
+++ b/package.json
@@ -1,27 +1,34 @@
{
- "name": "outline-shadowsocksconfig",
- "version": "0.0.8",
+ "name": "outline_shadowsocksconfig",
+ "author": "The Outline Team",
+ "version": "0.1.0",
+ "private": true,
"license": "Apache-2.0",
"scripts": {
- "build": "tsc",
- "test": "yarn build && jasmine --config=jasmine.json",
- "clean": "rm -rf build/*.spec.* node_modules/"
+ "build": "bazel build //...",
+ "test": "bazel test //..."
},
"main": "./build/shadowsocks_config.js",
"types": "./build/shadowsocks_config.d.ts",
"devDependencies": {
+ "@bazel/bazel": "latest",
+ "@bazel/buildifier": "latest",
+ "@bazel/ibazel": "latest",
+ "@bazel/jasmine": "^0.35.0",
+ "@bazel/typescript": "latest",
"@types/base-64": "^0.1.2",
"@types/jasmine": "^2.8.6",
"@types/node": "^8.0.41",
+ "@types/punycode": "^2.1.0",
"clang-format": "^1.2.2",
"husky": "^1.3.1",
"jasmine": "^3.1.0",
"tslint": "^5.12.1",
- "typescript": "^2.5.3"
+ "typescript": "~3.4.0"
},
"dependencies": {
"base-64": "^0.1.0",
- "punycode": "^1.4.1"
+ "punycode": "^2.1.1"
},
"husky": {
"hooks": {
diff --git a/punycode.d.ts b/punycode.d.ts
deleted file mode 100644
index f9d887d..0000000
--- a/punycode.d.ts
+++ /dev/null
@@ -1,144 +0,0 @@
-// Copyright 2018 The Outline Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-/**
- * Converts a Punycode string of ASCII-only symbols to a string of Unicode
- * symbols.
- *
- * ```js
- * // decode domain name parts
- * punycode.decode('maana-pta'); // 'mañana'
- * punycode.decode('--dqo34k'); // '☃-⌘'
- * ```
- *
- * @param {string} input The Punycode string of ASCII-only symbols.
- * @returns {string} The resulting string of Unicode symbols.
- */
-export function decode(input: string): string;
-
-/**
- * Converts a string of Unicode symbols (e.g. a domain name label) to a
- * Punycode string of ASCII symbols.
- *
- * ```js
- * // encode domain name parts
- * punycode.encode('mañana'); // 'maana-pta'
- * punycode.encode('☃-⌘'); // '--dqo34k'
- * ```
- *
- * @param {string} input The string of Unicode symbols.
- * @returns {string} The resulting Punycode string of ASCII-only symbols.
- */
-export function encode(input: string): string;
-
-/**
- * Converts a Punycode string representing a domain name or an email address
- * to Unicode. Only the Punycoded parts of the input will be converted,
- * i.e. it doesn’t matter if you call it on a string that has already been
- * converted to Unicode.
- *
- * ```js
- * // decode domain names
- * punycode.toUnicode('xn--maana-pta.com');
- * // → 'mañana.com'
- * punycode.toUnicode('xn----dqo34k.com');
- * // → '☃-⌘.com'
- *
- * // decode email addresses
- * punycode.toUnicode('джумла@xn--p-8sbkgc5ag7bhce.xn--ba-lmcq');
- * // → 'джумла@джpумлатест.bрфa'
- * ```
- *
- * @param {string} input The Punycoded domain name or email address to
- * convert to Unicode.
- * @returns {string} The Unicode representation of the given Punycode
- * string.
- */
-export function toUnicode(input: string): string;
-
-/**
- * Converts a lowercased Unicode string representing a domain name or an
- * email address to Punycode. Only the non-ASCII parts of the input will be
- * converted, i.e. it doesn’t matter if you call it with a domain that’s
- * already in ASCII.
- *
- * ```js
- * // encode domain names
- * punycode.toASCII('mañana.com');
- * // → 'xn--maana-pta.com'
- * punycode.toASCII('☃-⌘.com');
- * // → 'xn----dqo34k.com'
- *
- * // encode email addresses
- * punycode.toASCII('джумла@джpумлатест.bрфa');
- * // → 'джумла@xn--p-8sbkgc5ag7bhce.xn--ba-lmcq'
- * ```
- *
- * @param {string} input The domain name or email address to convert, as a
- * Unicode string.
- * @returns {string} The Punycode representation of the given domain name or
- * email address.
- */
-export function toASCII(input: string): string;
-
-/**
- * An object of methods to convert from JavaScript's internal character
- * representation (UCS-2) to Unicode code points, and back.
- *
- * @see
- */
-export namespace ucs2 {
- /**
- * Creates an array containing the numeric code points of each Unicode
- * character in the string. While JavaScript uses UCS-2 internally,
- * this function will convert a pair of surrogate halves (each of which
- * UCS-2 exposes as separate characters) into a single code point,
- * matching UTF-16.
- *
- * ```js
- * punycode.ucs2.decode('abc');
- * // → [0x61, 0x62, 0x63]
- * // surrogate pair for U+1D306 TETRAGRAM FOR CENTRE:
- * punycode.ucs2.decode('\uD834\uDF06');
- * // → [0x1D306]
- * ```
- *
- * @see `punycode.ucs2.encode`
- * @see
- * @param {string} string The Unicode input string (UCS-2).
- * @returns {number[]} The new array of code points.
- */
- export function decode(string: string): number[];
-
- /**
- * Creates a string based on an array of numeric code point values.
- *
- * ```js
- * punycode.ucs2.encode([0x61, 0x62, 0x63]);
- * // → 'abc'
- * punycode.ucs2.encode([0x1D306]);
- * // → '\uD834\uDF06'
- * ```
- *
- * @see `punycode.ucs2.decode`
- * @param {number[]} codePoints The array of numeric code points.
- * @returns {string} The new Unicode string (UCS-2).
- */
- export function encode(codePoints: number[]): string;
-}
-
-/**
- * A string representing the current Punycode.js version number.
- */
-export const version: string;
diff --git a/src/BUILD b/src/BUILD
new file mode 100644
index 0000000..191a539
--- /dev/null
+++ b/src/BUILD
@@ -0,0 +1,44 @@
+# Copyright 2019 The Outline Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+package(default_visibility = ["//visibility:public"])
+
+load("@npm_bazel_typescript//:index.bzl", "ts_library")
+load("@npm_bazel_jasmine//:index.bzl", "jasmine_node_test")
+
+ts_library(
+ name = "shadowsocks_config",
+ srcs = ["shadowsocks_config.ts"],
+ deps = [
+ "@npm//@types/node",
+ "@npm//base-64",
+ "@npm//punycode",
+ ],
+)
+
+ts_library(
+ name = "shadowsocks_config_test_lib",
+ testonly = True,
+ srcs = ["shadowsocks_config.spec.ts"],
+ deps = [
+ ":shadowsocks_config",
+ "@npm//@types/jasmine",
+ ],
+)
+
+jasmine_node_test(
+ name = "shadowsocks_config_test",
+ size = "small",
+ deps = [":shadowsocks_config_test_lib"],
+)
diff --git a/tools/bazel_0.28.1-linux-x86_64.deb.sha256 b/tools/bazel_0.28.1-linux-x86_64.deb.sha256
new file mode 100644
index 0000000..5a310b6
--- /dev/null
+++ b/tools/bazel_0.28.1-linux-x86_64.deb.sha256
@@ -0,0 +1 @@
+238795b1850d4c155c8f280828c344c22d096756d206b8be2ba423731dca52c0 bazel_0.28.1-linux-x86_64.deb
diff --git a/tools/release.sh b/tools/release.sh
new file mode 100755
index 0000000..5beb9a5
--- /dev/null
+++ b/tools/release.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+# Copyright 2019 The Outline Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+bazel build :shadowsocks_config_npm
+
+rm -rf build
+mkdir -p build
+cp -r dist/bin/shadowsocks_config_npm/src/* build/
diff --git a/tools/travis.bazelrc b/tools/travis.bazelrc
new file mode 100644
index 0000000..df46e04
--- /dev/null
+++ b/tools/travis.bazelrc
@@ -0,0 +1,19 @@
+# From https://github.com/korfuri/bazel-travis/blob/master/.bazelrc
+
+# This is from Bazel's former travis setup, to avoid blowing up the RAM usage.
+startup --host_jvm_args=-Xms2500m
+test --ram_utilization_factor=10
+
+# This is so we understand failures better
+build --verbose_failures
+
+# This is so we don't use sandboxed execution. Sandboxed execution
+# runs stuff in a container, and since Travis already runs its script
+# in a container (unless you require sudo in your .travis.yml) this
+# fails to run tests.
+build --spawn_strategy=standalone --genrule_strategy=standalone
+test --test_strategy=standalone
+
+# Below this line, .travis.yml will cat the default bazelrc.
+# This is needed so Bazel starts with the base workspace in its
+# package path.
diff --git a/tsconfig.json b/tsconfig.json
index 5bc489f..18f7112 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,19 +1,11 @@
{
- "compilerOptions": {
- "target": "es5",
- "outDir": "build",
- "declaration": true,
- "removeComments": false,
- "strict": true,
- "module": "commonjs",
- "lib": [
- "dom",
- "es5",
- "scripthost",
- "es2016"
- ]
- },
- "include": [
- "src/**/*.ts"
- ]
+ "compilerOptions": {
+ "target": "es5",
+ "lib": [
+ "dom",
+ "es5",
+ "scripthost",
+ "es2016"
+ ]
+ }
}
\ No newline at end of file
diff --git a/yarn.lock b/yarn.lock
index b7fb0a8..197f13f 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,37 +2,171 @@
# yarn lockfile v1
+"@babel/code-frame@^7.0.0":
+ version "7.5.5"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d"
+ dependencies:
+ "@babel/highlight" "^7.0.0"
+
+"@babel/highlight@^7.0.0":
+ version "7.5.0"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540"
+ dependencies:
+ chalk "^2.0.0"
+ esutils "^2.0.2"
+ js-tokens "^4.0.0"
+
+"@bazel/bazel-darwin_x64@0.28.1":
+ version "0.28.1"
+ resolved "https://registry.yarnpkg.com/@bazel/bazel-darwin_x64/-/bazel-darwin_x64-0.28.1.tgz#415658785e1dbd6f7ab5c8f2b98c1c99c614e1d5"
+
+"@bazel/bazel-linux_x64@0.28.1":
+ version "0.28.1"
+ resolved "https://registry.yarnpkg.com/@bazel/bazel-linux_x64/-/bazel-linux_x64-0.28.1.tgz#f78006089e17660261088272a0e04fc886572e34"
+
+"@bazel/bazel-win32_x64@0.28.1":
+ version "0.28.1"
+ resolved "https://registry.yarnpkg.com/@bazel/bazel-win32_x64/-/bazel-win32_x64-0.28.1.tgz#60a2819618cf7582cc35ac16c01763a5e807b414"
+
+"@bazel/bazel@latest":
+ version "0.28.1"
+ resolved "https://registry.yarnpkg.com/@bazel/bazel/-/bazel-0.28.1.tgz#3a6b9b7a74d566c66805242ccaa2f907592b5bff"
+ dependencies:
+ "@bazel/hide-bazel-files" latest
+ optionalDependencies:
+ "@bazel/bazel-darwin_x64" "0.28.1"
+ "@bazel/bazel-linux_x64" "0.28.1"
+ "@bazel/bazel-win32_x64" "0.28.1"
+
+"@bazel/buildifier-darwin_x64@0.26.0":
+ version "0.26.0"
+ resolved "https://registry.yarnpkg.com/@bazel/buildifier-darwin_x64/-/buildifier-darwin_x64-0.26.0.tgz#0e4f5066750f7984689857e332f93368e0d782dd"
+
+"@bazel/buildifier-linux_x64@0.26.0":
+ version "0.26.0"
+ resolved "https://registry.yarnpkg.com/@bazel/buildifier-linux_x64/-/buildifier-linux_x64-0.26.0.tgz#05020641f17441145056821ec33a2c667e253a3f"
+
+"@bazel/buildifier-win32_x64@0.26.0":
+ version "0.26.0"
+ resolved "https://registry.yarnpkg.com/@bazel/buildifier-win32_x64/-/buildifier-win32_x64-0.26.0.tgz#51d983d36fd41f59063347e027487a447e4ea83e"
+
+"@bazel/buildifier@latest":
+ version "0.26.0"
+ resolved "https://registry.yarnpkg.com/@bazel/buildifier/-/buildifier-0.26.0.tgz#65af3851f9ebe8b9ac651185d051b1a155012dbb"
+ optionalDependencies:
+ "@bazel/buildifier-darwin_x64" "0.26.0"
+ "@bazel/buildifier-linux_x64" "0.26.0"
+ "@bazel/buildifier-win32_x64" "0.26.0"
+
+"@bazel/hide-bazel-files@latest":
+ version "0.35.0"
+ resolved "https://registry.yarnpkg.com/@bazel/hide-bazel-files/-/hide-bazel-files-0.35.0.tgz#66ff148c1076534204d755024557609492718b7f"
+
+"@bazel/ibazel@latest":
+ version "0.10.3"
+ resolved "https://registry.yarnpkg.com/@bazel/ibazel/-/ibazel-0.10.3.tgz#2e2b8a1d3e885946eac41db2b1aa6801fb319887"
+
+"@bazel/jasmine@^0.35.0":
+ version "0.35.0"
+ resolved "https://registry.yarnpkg.com/@bazel/jasmine/-/jasmine-0.35.0.tgz#1f55145b01761579f8a9f0b525762912ea832d42"
+ dependencies:
+ jasmine "~3.4.0"
+ jasmine-core "~3.4.0"
+ v8-coverage "1.0.9"
+
+"@bazel/typescript@latest":
+ version "0.35.0"
+ resolved "https://registry.yarnpkg.com/@bazel/typescript/-/typescript-0.35.0.tgz#ffc69b7db0c1c7acd9dce1ecbd4381d6af2773a8"
+ dependencies:
+ protobufjs "6.8.8"
+ semver "5.6.0"
+ source-map-support "0.5.9"
+ tsutils "2.27.2"
+
+"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf"
+
+"@protobufjs/base64@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735"
+
+"@protobufjs/codegen@^2.0.4":
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb"
+
+"@protobufjs/eventemitter@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70"
+
+"@protobufjs/fetch@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45"
+ dependencies:
+ "@protobufjs/aspromise" "^1.1.1"
+ "@protobufjs/inquire" "^1.1.0"
+
+"@protobufjs/float@^1.0.2":
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1"
+
+"@protobufjs/inquire@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089"
+
+"@protobufjs/path@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d"
+
+"@protobufjs/pool@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54"
+
+"@protobufjs/utf8@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570"
+
"@types/base-64@^0.1.2":
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/@types/base-64/-/base-64-0.1.2.tgz#63ac318302cdabb5f04e8ae2a56e54d4832107e2"
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/@types/base-64/-/base-64-0.1.3.tgz#875320c0d019f576a179324124cdbd5031a411f5"
"@types/jasmine@^2.8.6":
- version "2.8.6"
- resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.8.6.tgz#14445b6a1613cf4e05dd61c3c3256d0e95c0421e"
+ version "2.8.16"
+ resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.8.16.tgz#a6cb24b1149d65293bd616923500014838e14e7d"
+
+"@types/long@^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.0.tgz#719551d2352d301ac8b81db732acb6bdc28dbdef"
+
+"@types/node@^10.1.0":
+ version "10.14.15"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-10.14.15.tgz#e8f7729b631be1b02ae130ff0b61f3e018000640"
"@types/node@^8.0.41":
- version "8.0.45"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.45.tgz#89fad82439d5624e1b5c6b42f0f5d85136dcdecc"
+ version "8.10.51"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.51.tgz#80600857c0a47a8e8bafc2dae6daed6db58e3627"
+
+"@types/punycode@^2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@types/punycode/-/punycode-2.1.0.tgz#89e4f3d09b3f92e87a80505af19be7e0c31d4e83"
ansi-regex@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
-ansi-styles@^2.2.1:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+ansi-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
ansi-styles@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
- integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
dependencies:
color-convert "^1.9.0"
argparse@^1.0.7:
version "1.0.10"
resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
- integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
dependencies:
sprintf-js "~1.0.2"
@@ -40,15 +174,6 @@ async@^1.5.2:
version "1.5.2"
resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
-babel-code-frame@^6.22.0:
- version "6.26.0"
- resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
- integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=
- dependencies:
- chalk "^1.1.3"
- esutils "^2.0.2"
- js-tokens "^3.0.2"
-
balanced-match@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
@@ -58,50 +183,43 @@ base-64@^0.1.0:
resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb"
brace-expansion@^1.1.7:
- version "1.1.8"
- resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292"
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
dependencies:
balanced-match "^1.0.0"
concat-map "0.0.1"
+buffer-from@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
+
builtin-modules@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
- integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=
caller-callsite@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134"
- integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=
dependencies:
callsites "^2.0.0"
caller-path@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4"
- integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=
dependencies:
caller-callsite "^2.0.0"
callsites@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
- integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=
-chalk@^1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
- dependencies:
- ansi-styles "^2.2.1"
- escape-string-regexp "^1.0.2"
- has-ansi "^2.0.0"
- strip-ansi "^3.0.0"
- supports-color "^2.0.0"
+camelcase@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
-chalk@^2.3.0:
+chalk@^2.0.0, chalk@^2.3.0:
version "2.4.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
- integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
dependencies:
ansi-styles "^3.2.1"
escape-string-regexp "^1.0.5"
@@ -110,52 +228,72 @@ chalk@^2.3.0:
ci-info@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
- integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
clang-format@^1.2.2:
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/clang-format/-/clang-format-1.2.2.tgz#a7277a03fce9aa4e387ddaa83b60d99dab115737"
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/clang-format/-/clang-format-1.2.4.tgz#4bb4b0a98180428deb093cf20982e9fc1af20b6c"
dependencies:
async "^1.5.2"
glob "^7.0.0"
resolve "^1.1.6"
+cliui@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49"
+ dependencies:
+ string-width "^2.1.1"
+ strip-ansi "^4.0.0"
+ wrap-ansi "^2.0.0"
+
+code-point-at@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+
color-convert@^1.9.0:
version "1.9.3"
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
- integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
dependencies:
color-name "1.1.3"
color-name@1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
- integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
-commander@^2.12.1:
- version "2.19.0"
- resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
- integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==
+commander@^2.12.1, commander@~2.20.0:
+ version "2.20.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422"
concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
cosmiconfig@^5.0.7:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.1.0.tgz#6c5c35e97f37f985061cdf653f114784231185cf"
- integrity sha512-kCNPvthka8gvLtzAxQXvWo4FxqRB+ftRZyPZNuab5ngvM9Y7yw7hbEysglptLgpkGX9nAOKTBVkHUAe8xtYR6Q==
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a"
dependencies:
import-fresh "^2.0.0"
is-directory "^0.3.1"
- js-yaml "^3.9.0"
- lodash.get "^4.4.2"
+ js-yaml "^3.13.1"
parse-json "^4.0.0"
+cross-spawn@^4:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41"
+ dependencies:
+ lru-cache "^4.0.1"
+ which "^1.2.9"
+
+cross-spawn@^5.0.1:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
+ dependencies:
+ lru-cache "^4.0.1"
+ shebang-command "^1.2.0"
+ which "^1.2.9"
+
cross-spawn@^6.0.0:
version "6.0.5"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
- integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
dependencies:
nice-try "^1.0.4"
path-key "^2.0.1"
@@ -163,43 +301,59 @@ cross-spawn@^6.0.0:
shebang-command "^1.2.0"
which "^1.2.9"
+debug@^3.1.0:
+ version "3.2.6"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
+ dependencies:
+ ms "^2.1.1"
+
+decamelize@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+
diff@^3.2.0:
version "3.5.0"
resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
- integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==
end-of-stream@^1.1.0:
version "1.4.1"
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43"
- integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==
dependencies:
once "^1.4.0"
error-ex@^1.3.1:
version "1.3.2"
resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
- integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
dependencies:
is-arrayish "^0.2.1"
-escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+escape-string-regexp@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
esprima@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
- integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
esutils@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
- integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+
+execa@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
+ dependencies:
+ cross-spawn "^5.0.1"
+ get-stream "^3.0.0"
+ is-stream "^1.1.0"
+ npm-run-path "^2.0.0"
+ p-finally "^1.0.0"
+ signal-exit "^3.0.0"
+ strip-eof "^1.0.0"
execa@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8"
- integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==
dependencies:
cross-spawn "^6.0.0"
get-stream "^4.0.0"
@@ -209,32 +363,50 @@ execa@^1.0.0:
signal-exit "^3.0.0"
strip-eof "^1.0.0"
+find-up@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+ dependencies:
+ locate-path "^2.0.0"
+
find-up@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
- integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
dependencies:
locate-path "^3.0.0"
+foreground-child@^1.5.6:
+ version "1.5.6"
+ resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-1.5.6.tgz#4fd71ad2dfde96789b980a5c0a295937cb2f5ce9"
+ dependencies:
+ cross-spawn "^4"
+ signal-exit "^3.0.0"
+
fs.realpath@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+get-caller-file@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
+
get-stdin@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b"
- integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==
+
+get-stream@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
get-stream@^4.0.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
- integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
dependencies:
pump "^3.0.0"
-glob@^7.0.0, glob@^7.0.6:
- version "7.1.2"
- resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
+glob@^7.0.0, glob@^7.1.1, glob@^7.1.3:
+ version "7.1.4"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255"
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
@@ -243,38 +415,37 @@ glob@^7.0.0, glob@^7.0.6:
once "^1.3.0"
path-is-absolute "^1.0.0"
-glob@^7.1.1:
- version "7.1.3"
- resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1"
- integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==
- dependencies:
- fs.realpath "^1.0.0"
- inflight "^1.0.4"
- inherits "2"
- minimatch "^3.0.4"
- once "^1.3.0"
- path-is-absolute "^1.0.0"
+graceful-fs@^4.1.2:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.1.tgz#1c1f0c364882c868f5bff6512146328336a11b1d"
-has-ansi@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+handlebars@^4.0.3:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.2.tgz#b6b37c1ced0306b221e094fc7aca3ec23b131b67"
dependencies:
- ansi-regex "^2.0.0"
+ neo-async "^2.6.0"
+ optimist "^0.6.1"
+ source-map "^0.6.1"
+ optionalDependencies:
+ uglify-js "^3.1.4"
+
+has-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
has-flag@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
- integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
hosted-git-info@^2.1.4:
- version "2.7.1"
- resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047"
- integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==
+ version "2.8.2"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.2.tgz#a35c3f355ac1249f1093c0c2a542ace8818c171a"
+ dependencies:
+ lru-cache "^5.1.1"
husky@^1.3.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/husky/-/husky-1.3.1.tgz#26823e399300388ca2afff11cfa8a86b0033fae0"
- integrity sha512-86U6sVVVf4b5NYSZ0yvv88dRgBSSXXmHaiq5pP4KDj5JVzdwKgBjEtUPOm8hcoytezFwbU+7gotXNhpHdystlg==
dependencies:
cosmiconfig "^5.0.7"
execa "^1.0.0"
@@ -290,7 +461,6 @@ husky@^1.3.1:
import-fresh@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546"
- integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY=
dependencies:
caller-path "^2.0.0"
resolve-from "^3.0.0"
@@ -303,56 +473,82 @@ inflight@^1.0.4:
wrappy "1"
inherits@2:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+
+invert-kv@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
is-arrayish@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
- integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
is-ci@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c"
- integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==
dependencies:
ci-info "^2.0.0"
is-directory@^0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
- integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=
+
+is-fullwidth-code-point@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
is-stream@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
- integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
isexe@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
- integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
-jasmine-core@~3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.1.0.tgz#a4785e135d5df65024dfc9224953df585bd2766c"
+istanbul-lib-coverage@^1.2.0, istanbul-lib-coverage@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz#ccf7edcd0a0bb9b8f729feeb0930470f9af664f0"
-jasmine@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-3.1.0.tgz#2bd59fd7ec6ec0e8acb64e09f45a68ed2ad1952a"
+istanbul-lib-report@^1.1.3:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz#f2a657fc6282f96170aaf281eb30a458f7f4170c"
dependencies:
- glob "^7.0.6"
- jasmine-core "~3.1.0"
+ istanbul-lib-coverage "^1.2.1"
+ mkdirp "^0.5.1"
+ path-parse "^1.0.5"
+ supports-color "^3.1.2"
-js-tokens@^3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
- integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls=
+istanbul-reports@^1.3.0:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.5.1.tgz#97e4dbf3b515e8c484caea15d6524eebd3ff4e1a"
+ dependencies:
+ handlebars "^4.0.3"
+
+jasmine-core@~3.4.0:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.4.0.tgz#2a74618e966026530c3518f03e9f845d26473ce3"
+
+jasmine@^3.1.0, jasmine@~3.4.0:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-3.4.0.tgz#0fa68903ff0c9697459cd044b44f4dcef5ec8bdc"
+ dependencies:
+ glob "^7.1.3"
+ jasmine-core "~3.4.0"
-js-yaml@^3.7.0, js-yaml@^3.9.0:
- version "3.12.1"
- resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.1.tgz#295c8632a18a23e054cf5c9d3cecafe678167600"
- integrity sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==
+js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+
+js-yaml@^3.13.1:
+ version "3.13.1"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
dependencies:
argparse "^1.0.7"
esprima "^4.0.0"
@@ -360,20 +556,62 @@ js-yaml@^3.7.0, js-yaml@^3.9.0:
json-parse-better-errors@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
- integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
+
+lcid@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
+ dependencies:
+ invert-kv "^1.0.0"
+
+load-json-file@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b"
+ dependencies:
+ graceful-fs "^4.1.2"
+ parse-json "^4.0.0"
+ pify "^3.0.0"
+ strip-bom "^3.0.0"
+
+locate-path@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+ dependencies:
+ p-locate "^2.0.0"
+ path-exists "^3.0.0"
locate-path@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
- integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==
dependencies:
p-locate "^3.0.0"
path-exists "^3.0.0"
-lodash.get@^4.4.2:
- version "4.4.2"
- resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99"
- integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=
+long@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28"
+
+lru-cache@^4.0.1:
+ version "4.1.5"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
+ dependencies:
+ pseudomap "^1.0.2"
+ yallist "^2.1.2"
+
+lru-cache@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
+ dependencies:
+ yallist "^3.0.2"
+
+mem@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76"
+ dependencies:
+ mimic-fn "^1.0.0"
+
+mimic-fn@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
minimatch@^3.0.4:
version "3.0.4"
@@ -381,15 +619,35 @@ minimatch@^3.0.4:
dependencies:
brace-expansion "^1.1.7"
+minimist@0.0.8:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+
+minimist@~0.0.1:
+ version "0.0.10"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
+
+mkdirp@^0.5.0, mkdirp@^0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+ dependencies:
+ minimist "0.0.8"
+
+ms@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+
+neo-async@^2.6.0:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c"
+
nice-try@^1.0.4:
version "1.0.5"
resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
- integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
normalize-package-data@^2.3.2:
version "2.5.0"
resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
- integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
dependencies:
hosted-git-info "^2.1.4"
resolve "^1.10.0"
@@ -399,44 +657,77 @@ normalize-package-data@^2.3.2:
npm-run-path@^2.0.0:
version "2.0.2"
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
- integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=
dependencies:
path-key "^2.0.0"
+number-is-nan@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+
once@^1.3.0, once@^1.3.1, once@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
dependencies:
wrappy "1"
+optimist@^0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686"
+ dependencies:
+ minimist "~0.0.1"
+ wordwrap "~0.0.2"
+
+os-homedir@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+
+os-locale@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2"
+ dependencies:
+ execa "^0.7.0"
+ lcid "^1.0.0"
+ mem "^1.1.0"
+
p-finally@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
- integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
+
+p-limit@^1.1.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
+ dependencies:
+ p-try "^1.0.0"
p-limit@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.1.0.tgz#1d5a0d20fb12707c758a655f6bbc4386b5930d68"
- integrity sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2"
dependencies:
p-try "^2.0.0"
+p-locate@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+ dependencies:
+ p-limit "^1.1.0"
+
p-locate@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
- integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==
dependencies:
p-limit "^2.0.0"
+p-try@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+
p-try@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1"
- integrity sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
parse-json@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
- integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=
dependencies:
error-ex "^1.3.1"
json-parse-better-errors "^1.0.1"
@@ -444,7 +735,6 @@ parse-json@^4.0.0:
path-exists@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
- integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
path-is-absolute@^1.0.0:
version "1.0.1"
@@ -453,123 +743,180 @@ path-is-absolute@^1.0.0:
path-key@^2.0.0, path-key@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
- integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
-path-parse@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1"
-
-path-parse@^1.0.6:
+path-parse@^1.0.5, path-parse@^1.0.6:
version "1.0.6"
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
- integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
+
+path-type@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f"
+ dependencies:
+ pify "^3.0.0"
pify@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
- integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
pkg-dir@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3"
- integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==
dependencies:
find-up "^3.0.0"
please-upgrade-node@^3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.1.1.tgz#ed320051dfcc5024fae696712c8288993595e8ac"
- integrity sha512-KY1uHnQ2NlQHqIJQpnh/i54rKkuxCEBx+voJIS/Mvb+L2iYd2NMotwduhKTMjfC1uKoX3VXOxLjIYG66dfJTVQ==
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942"
dependencies:
semver-compare "^1.0.0"
+protobufjs@6.8.8:
+ version "6.8.8"
+ resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.8.8.tgz#c8b4f1282fd7a90e6f5b109ed11c84af82908e7c"
+ dependencies:
+ "@protobufjs/aspromise" "^1.1.2"
+ "@protobufjs/base64" "^1.1.2"
+ "@protobufjs/codegen" "^2.0.4"
+ "@protobufjs/eventemitter" "^1.1.0"
+ "@protobufjs/fetch" "^1.1.0"
+ "@protobufjs/float" "^1.0.2"
+ "@protobufjs/inquire" "^1.1.0"
+ "@protobufjs/path" "^1.1.2"
+ "@protobufjs/pool" "^1.1.0"
+ "@protobufjs/utf8" "^1.1.0"
+ "@types/long" "^4.0.0"
+ "@types/node" "^10.1.0"
+ long "^4.0.0"
+
+pseudomap@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+
pump@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
- integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
dependencies:
end-of-stream "^1.1.0"
once "^1.3.1"
-punycode@^1.4.1:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+punycode@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+
+read-pkg-up@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978"
+ dependencies:
+ find-up "^3.0.0"
+ read-pkg "^3.0.0"
+
+read-pkg@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389"
+ dependencies:
+ load-json-file "^4.0.0"
+ normalize-package-data "^2.3.2"
+ path-type "^3.0.0"
read-pkg@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz#963625378f3e1c4d48c85872b5a6ec7d5d093237"
- integrity sha1-ljYlN48+HE1IyFhytabsfV0JMjc=
dependencies:
normalize-package-data "^2.3.2"
parse-json "^4.0.0"
pify "^3.0.0"
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+
+require-main-filename@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
+
+require-main-filename@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
+
resolve-from@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
- integrity sha1-six699nWiBvItuZTM17rywoYh0g=
-
-resolve@^1.1.6:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.4.0.tgz#a75be01c53da25d934a98ebd0e4c4a7312f92a86"
- dependencies:
- path-parse "^1.0.5"
-resolve@^1.10.0:
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba"
- integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==
+resolve@^1.1.6, resolve@^1.10.0, resolve@^1.3.2:
+ version "1.12.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6"
dependencies:
path-parse "^1.0.6"
-resolve@^1.3.2:
- version "1.9.0"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.9.0.tgz#a14c6fdfa8f92a7df1d996cb7105fa744658ea06"
- integrity sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==
+rimraf@^2.6.2:
+ version "2.6.3"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
dependencies:
- path-parse "^1.0.6"
+ glob "^7.1.3"
run-node@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/run-node/-/run-node-1.0.0.tgz#46b50b946a2aa2d4947ae1d886e9856fd9cabe5e"
- integrity sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A==
semver-compare@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc"
- integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w=
"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0:
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b"
+
+semver@5.6.0:
version "5.6.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004"
- integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==
+
+set-blocking@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
shebang-command@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
- integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
dependencies:
shebang-regex "^1.0.0"
shebang-regex@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
- integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
-signal-exit@^3.0.0:
+signal-exit@^3.0.0, signal-exit@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
- integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=
slash@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44"
- integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==
+
+source-map-support@0.5.9:
+ version "0.5.9"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f"
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+
+spawn-wrap@^1.4.2:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-1.4.2.tgz#cff58e73a8224617b6561abdc32586ea0c82248c"
+ dependencies:
+ foreground-child "^1.5.6"
+ mkdirp "^0.5.0"
+ os-homedir "^1.0.1"
+ rimraf "^2.6.2"
+ signal-exit "^3.0.2"
+ which "^1.3.0"
spdx-correct@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4"
- integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==
dependencies:
spdx-expression-parse "^3.0.0"
spdx-license-ids "^3.0.0"
@@ -577,101 +924,212 @@ spdx-correct@^3.0.0:
spdx-exceptions@^2.1.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977"
- integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==
spdx-expression-parse@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0"
- integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==
dependencies:
spdx-exceptions "^2.1.0"
spdx-license-ids "^3.0.0"
spdx-license-ids@^3.0.0:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz#81c0ce8f21474756148bbb5f3bfc0f36bf15d76e"
- integrity sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==
+ version "3.0.5"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654"
sprintf-js@~1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
- integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
-strip-ansi@^3.0.0:
+string-width@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ strip-ansi "^3.0.0"
+
+string-width@^2.0.0, string-width@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+ dependencies:
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^4.0.0"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
dependencies:
ansi-regex "^2.0.0"
+strip-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+ dependencies:
+ ansi-regex "^3.0.0"
+
+strip-bom@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+
strip-eof@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
- integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=
-supports-color@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+supports-color@^3.1.2:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
+ dependencies:
+ has-flag "^1.0.0"
supports-color@^5.3.0:
version "5.5.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
- integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
dependencies:
has-flag "^3.0.0"
-tslib@^1.8.0:
- version "1.8.0"
- resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.8.0.tgz#dc604ebad64bcbf696d613da6c954aa0e7ea1eb6"
+test-exclude@^5.2.2:
+ version "5.2.3"
+ resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0"
+ dependencies:
+ glob "^7.1.3"
+ minimatch "^3.0.4"
+ read-pkg-up "^4.0.0"
+ require-main-filename "^2.0.0"
-tslib@^1.8.1:
- version "1.9.3"
- resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
- integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==
+tslib@^1.8.0, tslib@^1.8.1:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a"
tslint@^5.12.1:
- version "5.12.1"
- resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.12.1.tgz#8cec9d454cf8a1de9b0a26d7bdbad6de362e52c1"
- integrity sha512-sfodBHOucFg6egff8d1BvuofoOQ/nOeYNfbp7LDlKBcLNrL3lmS5zoiDGyOMdT7YsEXAwWpTdAHwOGOc8eRZAw==
+ version "5.18.0"
+ resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.18.0.tgz#f61a6ddcf372344ac5e41708095bbf043a147ac6"
dependencies:
- babel-code-frame "^6.22.0"
+ "@babel/code-frame" "^7.0.0"
builtin-modules "^1.1.1"
chalk "^2.3.0"
commander "^2.12.1"
diff "^3.2.0"
glob "^7.1.1"
- js-yaml "^3.7.0"
+ js-yaml "^3.13.1"
minimatch "^3.0.4"
+ mkdirp "^0.5.1"
resolve "^1.3.2"
semver "^5.3.0"
tslib "^1.8.0"
- tsutils "^2.27.2"
+ tsutils "^2.29.0"
-tsutils@^2.27.2:
+tsutils@2.27.2:
+ version "2.27.2"
+ resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.27.2.tgz#60ba88a23d6f785ec4b89c6e8179cac9b431f1c7"
+ dependencies:
+ tslib "^1.8.1"
+
+tsutils@^2.29.0:
version "2.29.0"
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99"
- integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==
dependencies:
tslib "^1.8.1"
-typescript@^2.5.3:
- version "2.5.3"
- resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.5.3.tgz#df3dcdc38f3beb800d4bc322646b04a3f6ca7f0d"
+typescript@~3.4.0:
+ version "3.4.5"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.4.5.tgz#2d2618d10bb566572b8d7aad5180d84257d70a99"
+
+uglify-js@^3.1.4:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.6.0.tgz#704681345c53a8b2079fb6cec294b05ead242ff5"
+ dependencies:
+ commander "~2.20.0"
+ source-map "~0.6.1"
+
+uuid@^3.3.2:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131"
+
+v8-coverage@1.0.9:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/v8-coverage/-/v8-coverage-1.0.9.tgz#780889680c0fea0f587adf22e2b5f443b9434745"
+ dependencies:
+ debug "^3.1.0"
+ foreground-child "^1.5.6"
+ istanbul-lib-coverage "^1.2.0"
+ istanbul-lib-report "^1.1.3"
+ istanbul-reports "^1.3.0"
+ mkdirp "^0.5.1"
+ rimraf "^2.6.2"
+ signal-exit "^3.0.2"
+ spawn-wrap "^1.4.2"
+ test-exclude "^5.2.2"
+ uuid "^3.3.2"
+ v8-to-istanbul "1.2.0"
+ yargs "^11.0.0"
+
+v8-to-istanbul@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-1.2.0.tgz#f6a22ffb08b2202aaba8c2be497d1d41fe8fb4b6"
validate-npm-package-license@^3.0.1:
version "3.0.4"
resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
- integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
dependencies:
spdx-correct "^3.0.0"
spdx-expression-parse "^3.0.0"
-which@^1.2.9:
+which-module@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
+
+which@^1.2.9, which@^1.3.0:
version "1.3.1"
resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
- integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
dependencies:
isexe "^2.0.0"
+wordwrap@~0.0.2:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
+
+wrap-ansi@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+
wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+
+y18n@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
+
+yallist@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+
+yallist@^3.0.2:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9"
+
+yargs-parser@^9.0.2:
+ version "9.0.2"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077"
+ dependencies:
+ camelcase "^4.1.0"
+
+yargs@^11.0.0:
+ version "11.1.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77"
+ dependencies:
+ cliui "^4.0.0"
+ decamelize "^1.1.1"
+ find-up "^2.1.0"
+ get-caller-file "^1.0.1"
+ os-locale "^2.0.0"
+ require-directory "^2.1.1"
+ require-main-filename "^1.0.1"
+ set-blocking "^2.0.0"
+ string-width "^2.0.0"
+ which-module "^2.0.0"
+ y18n "^3.2.1"
+ yargs-parser "^9.0.2"