diff --git a/.gitignore b/.gitignore index 46759872637..b5590ff8572 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,10 @@ scripts/run_mix.sh scripts/start_local_tmux_network.sh /.floo /.flooignore +qa-v4-topology.json +qa-v6-topology.json +v4-topology.json +v6-topology.json +/explorer/downloads/topology.json +/explorer/public/downloads/mixmining.json +/explorer/public/downloads/topology.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 01b257ef59c..9991a2b6740 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,113 @@ # Changelog +## [v0.9.0](https://github.com/nymtech/nym/tree/v0.9.0) (2020-11-13) + +[Full Changelog](https://github.com/nymtech/nym/compare/v0.8.1...v0.9.0) + +The main features of this release are: + +* a reputation tracking system which starts to link node reputation to quality of service +* a new component, the `nym-network-monitor`, which tracks whether nodes are working properly and providing good service +* automatic node registration and de-registration at node startup +* working Cosmos validators with a `nym` token +* starting to decentralize the old directory server into the validators +* a new block explorer at https://testnet-explorer.nymtech.net which looks the same as the old dashboard but is the basis of something much more advanced. It can be run by anyone. +* de-coupling metrics collection from directory services to make the system scale better overall +* reliability and performance improvements for mixnode networking + +See the changelog for detailed release notes. + +**Implemented enhancements:** + +- Nicer error if trying to run an uninitialised client/node [\#389](https://github.com/nymtech/nym/issues/389) +- Gateway announcement [\#383](https://github.com/nymtech/nym/issues/383) +- Add init flag for incentives address [\#382](https://github.com/nymtech/nym/issues/382) +- Ed25519 Identity Keys for Mixnodes [\#379](https://github.com/nymtech/nym/issues/379) +- Introduce version field to config files [\#375](https://github.com/nymtech/nym/issues/375) +- Change `init` to not blow away existing keys \(if exist\) [\#368](https://github.com/nymtech/nym/issues/368) +- Introduce an explicit `upgrade` command [\#367](https://github.com/nymtech/nym/issues/367) +- Show remote hostname in socks5 connection messages [\#365](https://github.com/nymtech/nym/issues/365) +- Make all `const` duration values more explicit. [\#333](https://github.com/nymtech/nym/issues/333) +- Feature/socks improvements [\#423](https://github.com/nymtech/nym/pull/423) ([jstuczyn](https://github.com/jstuczyn)) +- Feature/instant sending [\#359](https://github.com/nymtech/nym/pull/359) ([jstuczyn](https://github.com/jstuczyn)) + +**Fixed bugs:** + +- React wasm example not compiling [\#394](https://github.com/nymtech/nym/issues/394) +- Update main.js [\#441](https://github.com/nymtech/nym/pull/441) ([jstuczyn](https://github.com/jstuczyn)) +- Bugfix/metrics fixes [\#434](https://github.com/nymtech/nym/pull/434) ([jstuczyn](https://github.com/jstuczyn)) +- Bugfix/upgrade fix [\#421](https://github.com/nymtech/nym/pull/421) ([jstuczyn](https://github.com/jstuczyn)) +- Explicitly handling base58 key recovery errors [\#396](https://github.com/nymtech/nym/pull/396) ([jstuczyn](https://github.com/jstuczyn)) +- Corrected version on client-core [\#377](https://github.com/nymtech/nym/pull/377) ([jstuczyn](https://github.com/jstuczyn)) + +**Closed issues:** + +- Make validator URL configurable [\#438](https://github.com/nymtech/nym/issues/438) +- Change default directory location [\#432](https://github.com/nymtech/nym/issues/432) +- Crank up the default bandwidth settings. [\#429](https://github.com/nymtech/nym/issues/429) +- Change "sphinx-socks" to "nym-requester" [\#428](https://github.com/nymtech/nym/issues/428) +- Clients should use only "active" nodes [\#390](https://github.com/nymtech/nym/issues/390) +- Allow persistently changing config values from command line [\#387](https://github.com/nymtech/nym/issues/387) +- Remove `--config` flag in `run` [\#385](https://github.com/nymtech/nym/issues/385) +- Metrics server should return a metrics rate value [\#374](https://github.com/nymtech/nym/issues/374) +- Integer staking [\#372](https://github.com/nymtech/nym/issues/372) +- Mixnode and gateway blockchain registration [\#371](https://github.com/nymtech/nym/issues/371) +- Remove presence notifications [\#370](https://github.com/nymtech/nym/issues/370) +- Handle invalid base58 encoding for asymmetric key recovery \(encryption and identity\) [\#285](https://github.com/nymtech/nym/issues/285) +- Socks5 nym client + bitcoin service provider [\#254](https://github.com/nymtech/nym/issues/254) +- Message reception in webassembly client [\#204](https://github.com/nymtech/nym/issues/204) +- Simplest possible staking system [\#157](https://github.com/nymtech/nym/issues/157) +- Validator should hold topology [\#77](https://github.com/nymtech/nym/issues/77) + +**Merged pull requests:** + +- Removed incentives form url [\#451](https://github.com/nymtech/nym/pull/451) ([jstuczyn](https://github.com/jstuczyn)) +- Removed hardcoded 'good gateways' in favour of pseusorandom choice fr… [\#450](https://github.com/nymtech/nym/pull/450) ([jstuczyn](https://github.com/jstuczyn)) +- Fixed the URL of the websocket [\#449](https://github.com/nymtech/nym/pull/449) ([futurechimp](https://github.com/futurechimp)) +- Extra argument to specify metrics websocket + long attribute [\#448](https://github.com/nymtech/nym/pull/448) ([jstuczyn](https://github.com/jstuczyn)) +- Explorer public folder being relative to the binary [\#447](https://github.com/nymtech/nym/pull/447) ([jstuczyn](https://github.com/jstuczyn)) +- Slightly friendlier upgrade argument description [\#446](https://github.com/nymtech/nym/pull/446) ([jstuczyn](https://github.com/jstuczyn)) +- Updated nym-run gateway id [\#445](https://github.com/nymtech/nym/pull/445) ([jstuczyn](https://github.com/jstuczyn)) +- Adjusted 'fastmode' settings [\#444](https://github.com/nymtech/nym/pull/444) ([jstuczyn](https://github.com/jstuczyn)) +- Added validators to dashboard + validator and block count [\#443](https://github.com/nymtech/nym/pull/443) ([jstuczyn](https://github.com/jstuczyn)) +- Adding keybase to allowed.list.sample [\#442](https://github.com/nymtech/nym/pull/442) ([futurechimp](https://github.com/futurechimp)) +- Spawning rocket as a blocking task [\#440](https://github.com/nymtech/nym/pull/440) ([jstuczyn](https://github.com/jstuczyn)) +- Passing validator base url as an argument [\#439](https://github.com/nymtech/nym/pull/439) ([jstuczyn](https://github.com/jstuczyn)) +- Changing default validator location to make it clear we're testnet [\#437](https://github.com/nymtech/nym/pull/437) ([futurechimp](https://github.com/futurechimp)) +- Added nym prefix to binary names [\#436](https://github.com/nymtech/nym/pull/436) ([jstuczyn](https://github.com/jstuczyn)) +- Feature/explorer [\#431](https://github.com/nymtech/nym/pull/431) ([jstuczyn](https://github.com/jstuczyn)) +- Updated default sending rates [\#430](https://github.com/nymtech/nym/pull/430) ([jstuczyn](https://github.com/jstuczyn)) +- Fixed bunch of clippy warnings [\#427](https://github.com/nymtech/nym/pull/427) ([jstuczyn](https://github.com/jstuczyn)) +- Starting cover traffic stream under correct condition [\#422](https://github.com/nymtech/nym/pull/422) ([jstuczyn](https://github.com/jstuczyn)) +- Updated validator topology [\#420](https://github.com/nymtech/nym/pull/420) ([jstuczyn](https://github.com/jstuczyn)) +- Added option to set incentives address during mix and gateway init [\#419](https://github.com/nymtech/nym/pull/419) ([jstuczyn](https://github.com/jstuczyn)) +- Flag to start network requester in open proxy mode [\#418](https://github.com/nymtech/nym/pull/418) ([jstuczyn](https://github.com/jstuczyn)) +- Renamed 'sphinx-socks' to 'network-requester' [\#417](https://github.com/nymtech/nym/pull/417) ([jstuczyn](https://github.com/jstuczyn)) +- Updated upgrade commands to set new default validator [\#413](https://github.com/nymtech/nym/pull/413) ([jstuczyn](https://github.com/jstuczyn)) +- Feature/network monitor file topology [\#412](https://github.com/nymtech/nym/pull/412) ([jstuczyn](https://github.com/jstuczyn)) +- Removed debug print statement [\#411](https://github.com/nymtech/nym/pull/411) ([jstuczyn](https://github.com/jstuczyn)) +- Feature/controlled reinit [\#410](https://github.com/nymtech/nym/pull/410) ([jstuczyn](https://github.com/jstuczyn)) +- Feature/max retry [\#409](https://github.com/nymtech/nym/pull/409) ([jstuczyn](https://github.com/jstuczyn)) +- Renamed directory arguments to validator [\#408](https://github.com/nymtech/nym/pull/408) ([jstuczyn](https://github.com/jstuczyn)) +- Feature/no run config flag [\#405](https://github.com/nymtech/nym/pull/405) ([jstuczyn](https://github.com/jstuczyn)) +- Feature/error on noninit [\#404](https://github.com/nymtech/nym/pull/404) ([jstuczyn](https://github.com/jstuczyn)) +- Using metrics interval received from server [\#403](https://github.com/nymtech/nym/pull/403) ([jstuczyn](https://github.com/jstuczyn)) +- Feature/validator api update [\#402](https://github.com/nymtech/nym/pull/402) ([jstuczyn](https://github.com/jstuczyn)) +- Feature/directory server transition [\#401](https://github.com/nymtech/nym/pull/401) ([jstuczyn](https://github.com/jstuczyn)) +- Feature/wasm client fix [\#399](https://github.com/nymtech/nym/pull/399) ([futurechimp](https://github.com/futurechimp)) +- Fix compiler warnings for unneeded mut [\#398](https://github.com/nymtech/nym/pull/398) ([ethanfrey](https://github.com/ethanfrey)) +- Feature/fix dependabot alerts [\#393](https://github.com/nymtech/nym/pull/393) ([futurechimp](https://github.com/futurechimp)) +- moved new\_v4\_with\_node to test only section [\#392](https://github.com/nymtech/nym/pull/392) ([jstuczyn](https://github.com/jstuczyn)) +- Feature/duration cleanup [\#391](https://github.com/nymtech/nym/pull/391) ([jstuczyn](https://github.com/jstuczyn)) +- Feature/mix ed25519 identity [\#388](https://github.com/nymtech/nym/pull/388) ([jstuczyn](https://github.com/jstuczyn)) +- Feature/double init prevention [\#386](https://github.com/nymtech/nym/pull/386) ([jstuczyn](https://github.com/jstuczyn)) +- Feature/upgrade command [\#381](https://github.com/nymtech/nym/pull/381) ([jstuczyn](https://github.com/jstuczyn)) +- Feature/remove validator [\#380](https://github.com/nymtech/nym/pull/380) ([futurechimp](https://github.com/futurechimp)) +- Feature/version in config [\#376](https://github.com/nymtech/nym/pull/376) ([jstuczyn](https://github.com/jstuczyn)) +- Feature/network monitor [\#369](https://github.com/nymtech/nym/pull/369) ([jstuczyn](https://github.com/jstuczyn)) +- Added sphinx socks to default workspace members [\#358](https://github.com/nymtech/nym/pull/358) ([jstuczyn](https://github.com/jstuczyn)) +- Feature/wasm update [\#341](https://github.com/nymtech/nym/pull/341) ([jstuczyn](https://github.com/jstuczyn)) + ## [v0.8.1](https://github.com/nymtech/nym/tree/v0.8.1) (2020-09-28) [Full Changelog](https://github.com/nymtech/nym/compare/v0.8.0...v0.8.1) @@ -16,7 +124,7 @@ **Merged pull requests:** -- Feature/wasm update [\#341](https://github.com/nymtech/nym/pull/341) ([jstuczyn](https://github.com/jstuczyn)) +- Hotfix/0.8.1 [\#357](https://github.com/nymtech/nym/pull/357) ([jstuczyn](https://github.com/jstuczyn)) ## [v0.8.0](https://github.com/nymtech/nym/tree/v0.8.0) (2020-09-10) @@ -332,6 +440,7 @@ This release fixes bugs in v0.5.0. All testnet node operators are advised to up **Merged pull requests:** - Bugfix/healthcheck on provided topology [\#108](https://github.com/nymtech/nym/pull/108) ([jstuczyn](https://github.com/jstuczyn)) +- Feature/check packet length [\#99](https://github.com/nymtech/nym/pull/99) ([futurechimp](https://github.com/futurechimp)) ## [v0.4.0](https://github.com/nymtech/nym/tree/v0.4.0) (2020-01-28) @@ -382,7 +491,6 @@ This release also integrates a health-checker and network topology refresh into - Feature/base58 [\#102](https://github.com/nymtech/nym/pull/102) ([futurechimp](https://github.com/futurechimp)) - Feature/panic improvements [\#101](https://github.com/nymtech/nym/pull/101) ([jstuczyn](https://github.com/jstuczyn)) - Feature/fix sphinx unwraps [\#100](https://github.com/nymtech/nym/pull/100) ([futurechimp](https://github.com/futurechimp)) -- Feature/check packet length [\#99](https://github.com/nymtech/nym/pull/99) ([futurechimp](https://github.com/futurechimp)) - Feature/version filtering improvements [\#96](https://github.com/nymtech/nym/pull/96) ([futurechimp](https://github.com/futurechimp)) - Feature/refreshing topology [\#94](https://github.com/nymtech/nym/pull/94) ([jstuczyn](https://github.com/jstuczyn)) - Feature/consistent logging [\#93](https://github.com/nymtech/nym/pull/93) ([futurechimp](https://github.com/futurechimp)) diff --git a/Cargo.lock b/Cargo.lock index dff4b742652..d2c6fa414a5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,22 +1,5 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -[[package]] -name = "abci" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfb90d266d6ca61cea4d155dd5033c9516495f4f74f82faf1ca5c4feeb82577" -dependencies = [ - "byteorder", - "bytes 0.4.12", - "env_logger 0.7.1", - "futures 0.3.5", - "integer-encoding", - "log 0.4.11", - "protobuf", - "protobuf-codegen-pure", - "tokio 0.1.22", -] - [[package]] name = "addr2line" version = "0.13.0" @@ -164,12 +147,6 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "autocfg" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" - [[package]] name = "autocfg" version = "1.0.1" @@ -190,16 +167,6 @@ dependencies = [ "rustc-demangle", ] -[[package]] -name = "base64" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "489d6c0ed21b11d038c31b6ceccca973e65d73ba3bd8ecb9a2babf5546164643" -dependencies = [ - "byteorder", - "safemem", -] - [[package]] name = "base64" version = "0.11.0" @@ -304,34 +271,12 @@ dependencies = [ "byte-tools", ] -[[package]] -name = "bodyparser" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f023abfa58aad6f6bc4ae0630799e24d5ee0ab8bb2e49f651d9b1f9aa4f52f30" -dependencies = [ - "iron", - "persistent", - "plugin", - "serde", - "serde_json", -] - [[package]] name = "bs58" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "476e9cd489f9e121e02ffa6014a8ef220ecb15c05ed23fc34cca13925dc283fb" -[[package]] -name = "built" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fa7899958f4aa3c40edc1b033d0e956763319e398924abb80a0034dda5bb198" -dependencies = [ - "cargo-lock", -] - [[package]] name = "bumpalo" version = "3.4.0" @@ -350,34 +295,12 @@ version = "1.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" -[[package]] -name = "bytes" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" -dependencies = [ - "byteorder", - "iovec", -] - [[package]] name = "bytes" version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" -[[package]] -name = "cargo-lock" -version = "4.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8504b63dd1249fd1745b7b4ef9b6f7b107ddeb3c95370043c7dbcc38653a2679" -dependencies = [ - "semver", - "serde", - "toml", - "url 2.1.1", -] - [[package]] name = "cc" version = "1.0.59" @@ -428,25 +351,26 @@ dependencies = [ [[package]] name = "client-core" -version = "0.8.0-dev" +version = "0.9.0" dependencies = [ - "built", "config", "crypto", - "directory-client", "dirs 2.0.2", "futures 0.3.5", "gateway-client", "gateway-requests", - "log 0.4.11", + "humantime-serde", + "log", + "nonexhaustive-delayqueue", "nymsphinx", "pemstore", - "rand 0.7.3", + "rand", "serde", "sled 0.33.0", "tempfile", - "tokio 0.2.22", + "tokio", "topology", + "validator-client", ] [[package]] @@ -534,24 +458,13 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "crossbeam-deque" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f02af974daeee82218205558e51ec8768b48cf524bd01d550abe5573a608285" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", - "maybe-uninit", -] - [[package]] name = "crossbeam-epoch" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace" dependencies = [ - "autocfg 1.0.1", + "autocfg", "cfg-if", "crossbeam-utils", "lazy_static", @@ -560,24 +473,13 @@ dependencies = [ "scopeguard", ] -[[package]] -name = "crossbeam-queue" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "774ba60a54c213d409d5353bda12d49cd68d14e45036a285234c8d6f91f92570" -dependencies = [ - "cfg-if", - "crossbeam-utils", - "maybe-uninit", -] - [[package]] name = "crossbeam-utils" version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" dependencies = [ - "autocfg 1.0.1", + "autocfg", "cfg-if", "lazy_static", ] @@ -594,11 +496,11 @@ dependencies = [ "generic-array 0.14.4", "hkdf 0.9.0", "hmac 0.8.1", - "log 0.4.11", + "log", "nymsphinx-types", "pemstore", "pretty_env_logger", - "rand 0.7.3", + "rand", "stream-cipher 0.4.1", "x25519-dalek", ] @@ -650,7 +552,7 @@ checksum = "5d85653f070353a16313d0046f173f70d1aadd5b42600a14de626f0dfb3473a5" dependencies = [ "byteorder", "digest 0.8.1", - "rand_core 0.5.1", + "rand_core", "subtle 2.2.3", "zeroize", ] @@ -663,11 +565,20 @@ checksum = "c8492de420e9e60bc9a1d66e2dbb91825390b738a388606600663fc529b4b307" dependencies = [ "byteorder", "digest 0.9.0", - "rand_core 0.5.1", + "rand_core", "subtle 2.2.3", "zeroize", ] +[[package]] +name = "dashmap" +version = "4.0.0-rc6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "308a6703be2d759cb5fb7b80a23547fe73a8d5ebf70d3a4ca7f0ef4c0bfc2265" +dependencies = [ + "once_cell", +] + [[package]] name = "difference" version = "2.0.0" @@ -692,28 +603,6 @@ dependencies = [ "generic-array 0.14.4", ] -[[package]] -name = "directory-client" -version = "0.1.0" -dependencies = [ - "directory-client-models", - "log 0.4.11", - "mockito", - "pretty_env_logger", - "reqwest", - "serde", - "tokio 0.2.22", -] - -[[package]] -name = "directory-client-models" -version = "0.1.0" -dependencies = [ - "crypto", - "serde", - "topology", -] - [[package]] name = "dirs" version = "2.0.2" @@ -779,7 +668,7 @@ checksum = "53d2e93f837d749c16d118e7ddf7a4dfd0ac8f452cf51e46e9348824e5ef6851" dependencies = [ "curve25519-dalek 3.0.0", "ed25519", - "rand 0.7.3", + "rand", "serde", "sha2 0.9.1", "zeroize", @@ -801,21 +690,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aafcde04e90a5226a6443b7aabdb016ba2f8307c847d524724bd9b346dd1a2d3" dependencies = [ "atty", - "humantime", - "log 0.4.11", - "regex", - "termcolor", -] - -[[package]] -name = "env_logger" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" -dependencies = [ - "atty", - "humantime", - "log 0.4.11", + "humantime 1.3.0", + "log", "regex", "termcolor", ] @@ -826,7 +702,7 @@ version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d2f06b9cac1506ece98fe3231e3cc9c4410ec3d5b1f24ae1c8946f0742cdefc" dependencies = [ - "version_check 0.9.2", + "version_check", ] [[package]] @@ -878,12 +754,6 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "fuchsia-cprng" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" - [[package]] name = "fuchsia-zircon" version = "0.3.3" @@ -1017,11 +887,11 @@ dependencies = [ "crypto", "futures 0.3.5", "gateway-requests", - "log 0.4.11", + "log", "nymsphinx", - "tokio 0.2.22", + "tokio", "tokio-tungstenite", - "tungstenite 0.11.1", + "tungstenite", "wasm-bindgen", "wasm-bindgen-futures 0.4.17", "wasm-timer", @@ -1035,13 +905,13 @@ dependencies = [ "bs58", "crypto", "futures 0.3.5", - "log 0.4.11", + "log", "nymsphinx", "pemstore", - "rand 0.7.3", + "rand", "serde", "serde_json", - "tungstenite 0.11.1", + "tungstenite", ] [[package]] @@ -1060,7 +930,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" dependencies = [ "typenum", - "version_check 0.9.2", + "version_check", ] [[package]] @@ -1087,7 +957,7 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "993f9e0baeed60001cf565546b0d3dbe6a6ad23f2bd31644a133c641eccf6d53" dependencies = [ - "bytes 0.5.6", + "bytes", "fnv", "futures-core", "futures-sink", @@ -1095,7 +965,7 @@ dependencies = [ "http", "indexmap", "slab", - "tokio 0.2.22", + "tokio", "tokio-util", "tracing", ] @@ -1106,7 +976,7 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5deefd4816fb852b1ff3cb48f6c41da67be2d0e1d20b26a7a3b076da11f064b1" dependencies = [ - "log 0.4.11", + "log", "pest", "pest_derive", "quick-error 2.0.0", @@ -1175,7 +1045,7 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d569972648b2c512421b5f2a405ad6ac9666547189d0c5477a3f200f3e02f9" dependencies = [ - "bytes 0.5.6", + "bytes", "fnv", "itoa", ] @@ -1186,7 +1056,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13d5ff830006f7646652e057693569bfe0d51760c0085a071769d142a205111b" dependencies = [ - "bytes 0.5.6", + "bytes", "http", ] @@ -1206,22 +1076,19 @@ dependencies = [ ] [[package]] -name = "hyper" -version = "0.10.16" +name = "humantime" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c1ad908cc71012b7bea4d0c53ba96a8cba9962f048fa68d143376143d863b7a" + +[[package]] +name = "humantime-serde" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a0652d9a2609a968c14be1a9ea00bf4b1d64e2e1f53a1b51b6fff3a6e829273" +checksum = "ac34a56cfd4acddb469cc7fff187ed5ac36f498ba085caf8bbc725e3ff474058" dependencies = [ - "base64 0.9.3", - "httparse", - "language-tags", - "log 0.3.9", - "mime 0.2.6", - "num_cpus", - "time", - "traitobject", - "typeable", - "unicase 1.4.2", - "url 1.7.2", + "humantime 2.0.1", + "serde", ] [[package]] @@ -1230,7 +1097,7 @@ version = "0.13.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e68a8dd9716185d9e64ea473ea6ef63529252e3e27623295a0378a19665d5eb" dependencies = [ - "bytes 0.5.6", + "bytes", "futures-channel", "futures-core", "futures-util", @@ -1242,7 +1109,7 @@ dependencies = [ "pin-project", "socket2", "time", - "tokio 0.2.22", + "tokio", "tower-service", "tracing", "want", @@ -1254,24 +1121,13 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d979acc56dcb5b8dddba3917601745e877576475aa046df3226eabdecef78eed" dependencies = [ - "bytes 0.5.6", - "hyper 0.13.7", + "bytes", + "hyper", "native-tls", - "tokio 0.2.22", + "tokio", "tokio-tls", ] -[[package]] -name = "idna" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" -dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", -] - [[package]] name = "idna" version = "0.2.0" @@ -1289,7 +1145,7 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55e2e4c765aa53a0424761bf9f41aa7a6ac1efa87238f59560640e27fca028f2" dependencies = [ - "autocfg 1.0.1", + "autocfg", "hashbrown", ] @@ -1299,7 +1155,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19a8a95243d5a0398cae618ec29477c6e3cb631152be5c19481f80bc71559754" dependencies = [ - "bytes 0.5.6", + "bytes", ] [[package]] @@ -1308,12 +1164,6 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b141fdc7836c525d4d594027d318c84161ca17aaf8113ab1f81ab93ae897485" -[[package]] -name = "integer-encoding" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f4ebd0bd29be0f11973e9b3e219005661042a019fd757798c36a47c87852625" - [[package]] name = "iovec" version = "0.1.4" @@ -1329,22 +1179,6 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47be2f14c678be2fdcab04ab1171db51b2762ce6f0a8ee87c8dd4a04ed216135" -[[package]] -name = "iron" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6d308ca2d884650a8bf9ed2ff4cb13fbb2207b71f64cda11dc9b892067295e8" -dependencies = [ - "hyper 0.10.16", - "log 0.3.9", - "mime_guess 1.8.8", - "modifier", - "num_cpus", - "plugin", - "typemap", - "url 1.7.2", -] - [[package]] name = "itoa" version = "0.4.6" @@ -1376,12 +1210,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c33070833c9ee02266356de0c43f723152bd38bd96ddf52c82b3af10c9138b28" -[[package]] -name = "language-tags" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" - [[package]] name = "lazy_static" version = "1.4.0" @@ -1424,15 +1252,6 @@ dependencies = [ "scopeguard", ] -[[package]] -name = "log" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" -dependencies = [ - "log 0.4.11", -] - [[package]] name = "log" version = "0.4.11" @@ -1472,7 +1291,7 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c198b026e1bbf08a937e94c6c60f9ec4a2267f5b0d2eec9c1b21b061ce2be55f" dependencies = [ - "autocfg 1.0.1", + "autocfg", ] [[package]] @@ -1482,12 +1301,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8452105ba047068f40ff7093dd1d9da90898e63dd61736462e9cdda6a90ad3c3" [[package]] -name = "mime" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0" +name = "metrics-client" +version = "0.1.0" dependencies = [ - "log 0.3.9", + "mockito", + "reqwest", + "serde", + "tokio", ] [[package]] @@ -1496,26 +1316,14 @@ version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" -[[package]] -name = "mime_guess" -version = "1.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "216929a5ee4dd316b1702eedf5e74548c123d370f47841ceaac38ca154690ca3" -dependencies = [ - "mime 0.2.6", - "phf", - "phf_codegen", - "unicase 1.4.2", -] - [[package]] name = "mime_guess" version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2684d4c2e97d99848d30b324b00c8fcc7e5c897b7cbb5819b09e7c90e8baf212" dependencies = [ - "mime 0.3.16", - "unicase 2.6.0", + "mime", + "unicase", ] [[package]] @@ -1539,7 +1347,7 @@ dependencies = [ "iovec", "kernel32-sys", "libc", - "log 0.4.11", + "log", "miow 0.2.1", "net2", "slab", @@ -1552,7 +1360,7 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0840c1c50fd55e521b247f949c241c9997709f23bd7f023b9762cd561e935656" dependencies = [ - "log 0.4.11", + "log", "mio", "miow 0.3.5", "winapi 0.3.9", @@ -1596,12 +1404,29 @@ name = "mixnet-client" version = "0.1.0" dependencies = [ "futures 0.3.5", - "log 0.4.11", + "log", "nymsphinx", - "tokio 0.2.22", + "tokio", "tokio-util", ] +[[package]] +name = "mixnode-common" +version = "0.1.0" +dependencies = [ + "dashmap", + "futures 0.3.5", + "log", + "nonexhaustive-delayqueue", + "nymsphinx-acknowledgements", + "nymsphinx-addressing", + "nymsphinx-forwarding", + "nymsphinx-framing", + "nymsphinx-params", + "nymsphinx-types", + "tokio", +] + [[package]] name = "mockito" version = "0.23.3" @@ -1613,19 +1438,13 @@ dependencies = [ "difference", "httparse", "lazy_static", - "log 0.4.11", - "percent-encoding 2.1.0", - "rand 0.7.3", + "log", + "percent-encoding", + "rand", "regex", "serde_json", ] -[[package]] -name = "modifier" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f5c9112cb662acd3b204077e0de5bc66305fa8df65c8019d5adb10e9ab6e58" - [[package]] name = "native-tls" version = "0.2.4" @@ -1634,7 +1453,7 @@ checksum = "2b0d88c06fe90d5ee94048ba40409ef1d9315d86f6f38c2efdaad4fb50c58b2d" dependencies = [ "lazy_static", "libc", - "log 0.4.11", + "log", "openssl", "openssl-probe", "openssl-sys", @@ -1655,13 +1474,20 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "nonexhaustive-delayqueue" +version = "0.1.0" +dependencies = [ + "tokio", +] + [[package]] name = "num-integer" version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d59457e662d541ba17869cf51cf177c0b5f0cbf476c66bdc90bf1edac4f875b" dependencies = [ - "autocfg 1.0.1", + "autocfg", "num-traits", ] @@ -1671,7 +1497,7 @@ version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac267bcc07f48ee5f8935ab0d24f316fb722d7a1292e2913f0cc196b29ffd611" dependencies = [ - "autocfg 1.0.1", + "autocfg", ] [[package]] @@ -1686,50 +1512,48 @@ dependencies = [ [[package]] name = "nym-client" -version = "0.8.1" +version = "0.9.0" dependencies = [ - "built", "clap", "client-core", "config", "crypto", - "directory-client", "dirs 3.0.1", "dotenv", "futures 0.3.5", "gateway-client", "gateway-requests", - "log 0.4.11", + "log", "nymsphinx", "pemstore", "pretty_env_logger", - "rand 0.7.3", + "rand", "serde", "serde_json", "sled 0.33.0", - "tempfile", - "tokio 0.2.22", + "tokio", "tokio-tungstenite", "topology", - "url 2.1.1", + "url", + "validator-client", + "version-checker", "websocket-requests", ] [[package]] name = "nym-client-wasm" -version = "0.8.1" +version = "0.9.0" dependencies = [ - "built", "console_error_panic_hook", "crypto", - "directory-client", "futures 0.3.5", "gateway-client", "js-sys", "nymsphinx", - "rand 0.7.3", + "rand", "serde", "topology", + "validator-client", "wasm-bindgen", "wasm-bindgen-futures 0.4.17", "wasm-bindgen-test", @@ -1739,109 +1563,130 @@ dependencies = [ [[package]] name = "nym-gateway" -version = "0.8.1" +version = "0.9.0" dependencies = [ - "built", "clap", "config", "crypto", - "directory-client", + "dashmap", "dirs 2.0.2", "dotenv", "futures 0.3.5", "gateway-requests", - "log 0.4.11", + "humantime-serde", + "log", "mixnet-client", + "mixnode-common", "nymsphinx", "pemstore", "pretty_env_logger", - "rand 0.7.3", + "rand", "serde", "sled 0.31.0", - "tempfile", - "tokio 0.2.22", + "tokio", "tokio-tungstenite", "tokio-util", - "tungstenite 0.10.1", + "tungstenite", + "validator-client", + "version-checker", ] [[package]] name = "nym-mixnode" -version = "0.8.1" +version = "0.9.0" dependencies = [ "bs58", - "built", "clap", "config", "crypto", "curve25519-dalek 2.1.0", - "directory-client", "dirs 2.0.2", "dotenv", "futures 0.3.5", - "log 0.4.11", + "humantime-serde", + "log", + "metrics-client", "mixnet-client", + "mixnode-common", "nymsphinx", "pemstore", "pretty_env_logger", "serde", - "tempfile", - "tokio 0.2.22", + "tokio", "tokio-util", "topology", + "validator-client", + "version-checker", ] [[package]] -name = "nym-socks5-client" -version = "0.8.1" +name = "nym-network-monitor" +version = "0.9.0" dependencies = [ - "built", "clap", - "client-core", - "config", "crypto", - "directory-client", - "dirs 3.0.1", "dotenv", "futures 0.3.5", "gateway-client", - "gateway-requests", - "log 0.4.11", + "log", + "nymsphinx", + "pretty_env_logger", + "rand", + "serde", + "serde_json", + "tokio", + "topology", + "validator-client", + "version-checker", +] + +[[package]] +name = "nym-network-requester" +version = "0.9.0" +dependencies = [ + "clap", + "dirs 2.0.2", + "futures 0.3.5", + "log", "nymsphinx", "ordered-buffer", - "pin-project", "pretty_env_logger", "proxy-helpers", - "rand 0.7.3", - "serde", - "snafu", + "publicsuffix", + "rand", "socks5-requests", - "tempfile", - "tokio 0.2.22", - "topology", + "tokio", + "tokio-tungstenite", + "websocket-requests", ] [[package]] -name = "nym-validator" -version = "0.8.0" +name = "nym-socks5-client" +version = "0.9.0" dependencies = [ - "abci", - "bodyparser", - "built", - "byteorder", "clap", + "client-core", "config", - "dirs 2.0.2", + "crypto", + "dirs 3.0.1", "dotenv", "futures 0.3.5", - "iron", - "log 0.4.11", + "gateway-client", + "gateway-requests", + "log", + "nymsphinx", + "ordered-buffer", + "pin-project", "pretty_env_logger", - "router", + "proxy-helpers", + "rand", "serde", - "serde_json", - "tempfile", - "tokio 0.2.22", + "snafu", + "socks5-requests", + "tokio", + "topology", + "validator-client", + "version-checker", ] [[package]] @@ -1854,11 +1699,13 @@ dependencies = [ "nymsphinx-anonymous-replies", "nymsphinx-chunking", "nymsphinx-cover", + "nymsphinx-forwarding", "nymsphinx-framing", "nymsphinx-params", "nymsphinx-types", - "rand 0.7.3", + "rand", "rand_distr", + "tokio", "topology", ] @@ -1871,7 +1718,7 @@ dependencies = [ "nymsphinx-params", "nymsphinx-types", "pemstore", - "rand 0.7.3", + "rand", "topology", ] @@ -1893,7 +1740,7 @@ dependencies = [ "nymsphinx-addressing", "nymsphinx-params", "nymsphinx-types", - "rand 0.7.3", + "rand", "serde", "topology", ] @@ -1902,11 +1749,11 @@ dependencies = [ name = "nymsphinx-chunking" version = "0.1.0" dependencies = [ - "log 0.4.11", + "log", "nymsphinx-addressing", "nymsphinx-params", "nymsphinx-types", - "rand 0.7.3", + "rand", ] [[package]] @@ -1917,17 +1764,27 @@ dependencies = [ "nymsphinx-acknowledgements", "nymsphinx-addressing", "nymsphinx-chunking", + "nymsphinx-forwarding", "nymsphinx-params", "nymsphinx-types", - "rand 0.7.3", + "rand", "topology", ] +[[package]] +name = "nymsphinx-forwarding" +version = "0.1.0" +dependencies = [ + "nymsphinx-addressing", + "nymsphinx-params", + "nymsphinx-types", +] + [[package]] name = "nymsphinx-framing" version = "0.1.0" dependencies = [ - "bytes 0.5.6", + "bytes", "nymsphinx-params", "nymsphinx-types", "tokio-util", @@ -1998,7 +1855,7 @@ version = "0.9.58" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a842db4709b604f0fe5d1170ae3565899be2ad3d9cbc72dedc789ac0511f78de" dependencies = [ - "autocfg 1.0.1", + "autocfg", "cc", "libc", "pkg-config", @@ -2009,33 +1866,22 @@ dependencies = [ name = "ordered-buffer" version = "0.1.0" dependencies = [ - "log 0.4.11", + "log", ] [[package]] name = "parking_lot" -version = "0.9.0" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252" +checksum = "d3a704eb390aafdc107b0e392f56a82b668e3a71366993b5340f5833fd62505e" dependencies = [ "lock_api 0.3.4", - "parking_lot_core 0.6.2", - "rustc_version", + "parking_lot_core 0.7.2", ] [[package]] name = "parking_lot" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3a704eb390aafdc107b0e392f56a82b668e3a71366993b5340f5833fd62505e" -dependencies = [ - "lock_api 0.3.4", - "parking_lot_core 0.7.2", -] - -[[package]] -name = "parking_lot" -version = "0.11.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4893845fa2ca272e647da5d0e46660a314ead9c2fdd9a883aabc32e481a8733" dependencies = [ @@ -2044,21 +1890,6 @@ dependencies = [ "parking_lot_core 0.8.0", ] -[[package]] -name = "parking_lot_core" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b876b1b9e7ac6e1a74a6da34d25c42e17e8862aa409cbbbdcfc8d86c6f3bc62b" -dependencies = [ - "cfg-if", - "cloudabi 0.0.3", - "libc", - "redox_syscall", - "rustc_version", - "smallvec 0.6.13", - "winapi 0.3.9", -] - [[package]] name = "parking_lot_core" version = "0.7.2" @@ -2069,7 +1900,7 @@ dependencies = [ "cloudabi 0.0.3", "libc", "redox_syscall", - "smallvec 1.4.2", + "smallvec", "winapi 0.3.9", ] @@ -2084,7 +1915,7 @@ dependencies = [ "instant", "libc", "redox_syscall", - "smallvec 1.4.2", + "smallvec", "winapi 0.3.9", ] @@ -2106,28 +1937,12 @@ dependencies = [ "pem", ] -[[package]] -name = "percent-encoding" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" - [[package]] name = "percent-encoding" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" -[[package]] -name = "persistent" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e8fa0009c4f3d350281309909c618abddf10bb7e3145f28410782f6a5ec74c5" -dependencies = [ - "iron", - "plugin", -] - [[package]] name = "pest" version = "2.1.3" @@ -2171,45 +1986,6 @@ dependencies = [ "sha-1 0.8.2", ] -[[package]] -name = "phf" -version = "0.7.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3da44b85f8e8dfaec21adae67f95d93244b2ecf6ad2a692320598dcc8e6dd18" -dependencies = [ - "phf_shared", -] - -[[package]] -name = "phf_codegen" -version = "0.7.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b03e85129e324ad4166b06b2c7491ae27fe3ec353af72e72cd1654c7225d517e" -dependencies = [ - "phf_generator", - "phf_shared", -] - -[[package]] -name = "phf_generator" -version = "0.7.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09364cc93c159b8b06b1f4dd8a4398984503483891b0c26b867cf431fb132662" -dependencies = [ - "phf_shared", - "rand 0.6.5", -] - -[[package]] -name = "phf_shared" -version = "0.7.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234f71a15de2288bcb7e3b6515828d22af7ec8598ee6d24c3b526fa0a80b67a0" -dependencies = [ - "siphasher", - "unicase 1.4.2", -] - [[package]] name = "pin-project" version = "0.4.23" @@ -2248,15 +2024,6 @@ version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d36492546b6af1463394d46f0c834346f31548646f6ba10849802c9c9a27ac33" -[[package]] -name = "plugin" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a6a0dc3910bc8db877ffed8e457763b317cf880df4ae19109b9f77d277cf6e0" -dependencies = [ - "typemap", -] - [[package]] name = "ppv-lite86" version = "0.2.9" @@ -2270,8 +2037,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "717ee476b1690853d222af4634056d830b5197ffd747726a9a1eee6da9f49074" dependencies = [ "chrono", - "env_logger 0.6.2", - "log 0.4.11", + "env_logger", + "log", ] [[package]] @@ -2284,7 +2051,7 @@ dependencies = [ "proc-macro2 1.0.20", "quote 1.0.7", "syn 1.0.40", - "version_check 0.9.2", + "version_check", ] [[package]] @@ -2295,7 +2062,7 @@ checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ "proc-macro2 1.0.20", "quote 1.0.7", - "version_check 0.9.2", + "version_check", ] [[package]] @@ -2328,41 +2095,16 @@ dependencies = [ "unicode-xid 0.2.1", ] -[[package]] -name = "protobuf" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6563a657a014b771e7f69f06447d88d8fbb5a215ffc4cab724afb3acedcc7701" - -[[package]] -name = "protobuf-codegen" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f1bbc6db30d5d3e730b6e2326e9a64a75ca9c80d6427d6f054dc8cacc79d225" -dependencies = [ - "protobuf", -] - -[[package]] -name = "protobuf-codegen-pure" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db5473ffa23d2ea3b9046764f1a22149791967aad946b6cbd99601e720afc4d0" -dependencies = [ - "protobuf", - "protobuf-codegen", -] - [[package]] name = "proxy-helpers" version = "0.1.0" dependencies = [ - "bytes 0.5.6", + "bytes", "futures 0.3.5", - "log 0.4.11", + "log", "ordered-buffer", "socks5-requests", - "tokio 0.2.22", + "tokio", "tokio-test", ] @@ -2373,11 +2115,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3bbaa49075179162b49acac1c6aa45fb4dafb5f13cf6794276d77bc7fd95757b" dependencies = [ "error-chain", - "idna 0.2.0", + "idna", "lazy_static", "native-tls", "regex", - "url 2.1.1", + "url", ] [[package]] @@ -2410,25 +2152,6 @@ dependencies = [ "proc-macro2 1.0.20", ] -[[package]] -name = "rand" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" -dependencies = [ - "autocfg 0.1.7", - "libc", - "rand_chacha 0.1.1", - "rand_core 0.4.2", - "rand_hc 0.1.0", - "rand_isaac", - "rand_jitter", - "rand_os", - "rand_pcg", - "rand_xorshift", - "winapi 0.3.9", -] - [[package]] name = "rand" version = "0.7.3" @@ -2437,19 +2160,9 @@ checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ "getrandom", "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc 0.2.0", -] - -[[package]] -name = "rand_chacha" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" -dependencies = [ - "autocfg 0.1.7", - "rand_core 0.3.1", + "rand_chacha", + "rand_core", + "rand_hc", ] [[package]] @@ -2459,24 +2172,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ "ppv-lite86", - "rand_core 0.5.1", + "rand_core", ] -[[package]] -name = "rand_core" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" -dependencies = [ - "rand_core 0.4.2", -] - -[[package]] -name = "rand_core" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" - [[package]] name = "rand_core" version = "0.5.1" @@ -2492,16 +2190,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96977acbdd3a6576fb1d27391900035bf3863d4a16422973a409b488cf29ffb2" dependencies = [ - "rand 0.7.3", -] - -[[package]] -name = "rand_hc" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" -dependencies = [ - "rand_core 0.3.1", + "rand", ] [[package]] @@ -2510,69 +2199,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core 0.5.1", -] - -[[package]] -name = "rand_isaac" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "rand_jitter" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" -dependencies = [ - "libc", - "rand_core 0.4.2", - "winapi 0.3.9", -] - -[[package]] -name = "rand_os" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" -dependencies = [ - "cloudabi 0.0.3", - "fuchsia-cprng", - "libc", - "rand_core 0.4.2", - "rdrand", - "winapi 0.3.9", -] - -[[package]] -name = "rand_pcg" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" -dependencies = [ - "autocfg 0.1.7", - "rand_core 0.4.2", -] - -[[package]] -name = "rand_xorshift" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "rdrand" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" -dependencies = [ - "rand_core 0.3.1", + "rand_core", ] [[package]] @@ -2626,52 +2253,35 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e9eaa17ac5d7b838b7503d118fa16ad88f440498bf9ffe5424e621f93190d61e" dependencies = [ "base64 0.12.3", - "bytes 0.5.6", + "bytes", "encoding_rs", "futures-core", "futures-util", "http", "http-body", - "hyper 0.13.7", + "hyper", "hyper-tls", "ipnet", "js-sys", "lazy_static", - "log 0.4.11", - "mime 0.3.16", - "mime_guess 2.0.3", + "log", + "mime", + "mime_guess", "native-tls", - "percent-encoding 2.1.0", + "percent-encoding", "pin-project-lite", "serde", "serde_json", "serde_urlencoded", - "tokio 0.2.22", + "tokio", "tokio-tls", - "url 2.1.1", + "url", "wasm-bindgen", "wasm-bindgen-futures 0.4.17", "web-sys", "winreg", ] -[[package]] -name = "route-recognizer" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea509065eb0b3c446acdd0102f0d46567dc30902dc0be91d6552035d92b0f4f8" - -[[package]] -name = "router" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc63b6f3b8895b0d04e816b2b1aa58fdba2d5acca3cbb8f0ab8e017347d57397" -dependencies = [ - "iron", - "route-recognizer", - "url 1.7.2", -] - [[package]] name = "rust-argon2" version = "0.8.2" @@ -2690,27 +2300,12 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783" -[[package]] -name = "rustc_version" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -dependencies = [ - "semver", -] - [[package]] name = "ryu" version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" -[[package]] -name = "safemem" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" - [[package]] name = "schannel" version = "0.1.19" @@ -2763,7 +2358,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" dependencies = [ "semver-parser", - "serde", ] [[package]] @@ -2812,7 +2406,7 @@ dependencies = [ "dtoa", "itoa", "serde", - "url 2.1.1", + "url", ] [[package]] @@ -2881,12 +2475,6 @@ version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29f060a7d147e33490ec10da418795238fd7545bba241504d6b31a409f2e6210" -[[package]] -name = "siphasher" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac" - [[package]] name = "slab" version = "0.4.2" @@ -2905,7 +2493,7 @@ dependencies = [ "fs2", "fxhash", "libc", - "log 0.4.11", + "log", "parking_lot 0.10.2", ] @@ -2922,19 +2510,10 @@ dependencies = [ "fs2", "fxhash", "libc", - "log 0.4.11", + "log", "parking_lot 0.11.0", ] -[[package]] -name = "smallvec" -version = "0.6.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7b0758c52e15a8b5e3691eae6cc559f08eee9406e548a4477ba4e67770a82b6" -dependencies = [ - "maybe-uninit", -] - [[package]] name = "smallvec" version = "1.4.2" @@ -2986,7 +2565,7 @@ dependencies = [ [[package]] name = "sphinx" version = "0.1.0" -source = "git+https://github.com/nymtech/sphinx?rev=18aa34e1a39a5f3f14ba493ded9209658ff2cbfa#18aa34e1a39a5f3f14ba493ded9209658ff2cbfa" +source = "git+https://github.com/nymtech/sphinx?rev=283dcc77dec8ee9ed3bed58c2b878e9c18320723#283dcc77dec8ee9ed3bed58c2b878e9c18320723" dependencies = [ "aes-ctr 0.3.0", "arrayref", @@ -2994,36 +2573,16 @@ dependencies = [ "bs58", "byteorder", "chacha", - "curve25519-dalek 2.1.0", + "curve25519-dalek 3.0.0", "hkdf 0.8.0", "hmac 0.7.1", "lioness", - "log 0.4.11", - "rand 0.7.3", + "log", + "rand", "rand_distr", "sha2 0.8.2", ] -[[package]] -name = "sphinx-socks" -version = "0.8.1" -dependencies = [ - "clap", - "dirs 2.0.2", - "futures 0.3.5", - "log 0.4.11", - "nymsphinx", - "ordered-buffer", - "pretty_env_logger", - "proxy-helpers", - "publicsuffix", - "rand 0.7.3", - "socks5-requests", - "tokio 0.2.22", - "tokio-tungstenite", - "websocket-requests", -] - [[package]] name = "stream-cipher" version = "0.3.2" @@ -3103,7 +2662,7 @@ checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" dependencies = [ "cfg-if", "libc", - "rand 0.7.3", + "rand", "redox_syscall", "remove_dir_all", "winapi 0.3.9", @@ -3153,33 +2712,13 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "238ce071d267c5710f9d31451efec16c5ee22de34df17cc05e56cbc92e967117" -[[package]] -name = "tokio" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a09c0b5bb588872ab2f09afa13ee6e9dac11e10a0ec9e8e3ba39a5a5d530af6" -dependencies = [ - "bytes 0.4.12", - "futures 0.1.29", - "mio", - "num_cpus", - "tokio-codec", - "tokio-current-thread", - "tokio-executor", - "tokio-io", - "tokio-reactor", - "tokio-tcp", - "tokio-threadpool", - "tokio-timer", -] - [[package]] name = "tokio" version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d34ca54d84bf2b5b4d7d31e901a8464f7b60ac145a284fba25ceb801f2ddccd" dependencies = [ - "bytes 0.5.6", + "bytes", "fnv", "futures-core", "iovec", @@ -3197,48 +2736,6 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "tokio-codec" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25b2998660ba0e70d18684de5d06b70b70a3a747469af9dea7618cc59e75976b" -dependencies = [ - "bytes 0.4.12", - "futures 0.1.29", - "tokio-io", -] - -[[package]] -name = "tokio-current-thread" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1de0e32a83f131e002238d7ccde18211c0a5397f60cbfffcb112868c2e0e20e" -dependencies = [ - "futures 0.1.29", - "tokio-executor", -] - -[[package]] -name = "tokio-executor" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb2d1b8f4548dbf5e1f7818512e9c406860678f29c300cdf0ebac72d1a3a1671" -dependencies = [ - "crossbeam-utils", - "futures 0.1.29", -] - -[[package]] -name = "tokio-io" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57fc868aae093479e3131e3d165c93b1c7474109d13c90ec0dda2a1bbfff0674" -dependencies = [ - "bytes 0.4.12", - "futures 0.1.29", - "log 0.4.11", -] - [[package]] name = "tokio-macros" version = "0.2.5" @@ -3250,87 +2747,15 @@ dependencies = [ "syn 1.0.40", ] -[[package]] -name = "tokio-reactor" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09bc590ec4ba8ba87652da2068d150dcada2cfa2e07faae270a5e0409aa51351" -dependencies = [ - "crossbeam-utils", - "futures 0.1.29", - "lazy_static", - "log 0.4.11", - "mio", - "num_cpus", - "parking_lot 0.9.0", - "slab", - "tokio-executor", - "tokio-io", - "tokio-sync", -] - -[[package]] -name = "tokio-sync" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edfe50152bc8164fcc456dab7891fa9bf8beaf01c5ee7e1dd43a397c3cf87dee" -dependencies = [ - "fnv", - "futures 0.1.29", -] - -[[package]] -name = "tokio-tcp" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98df18ed66e3b72e742f185882a9e201892407957e45fbff8da17ae7a7c51f72" -dependencies = [ - "bytes 0.4.12", - "futures 0.1.29", - "iovec", - "mio", - "tokio-io", - "tokio-reactor", -] - [[package]] name = "tokio-test" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed0049c119b6d505c4447f5c64873636c7af6c75ab0d45fd9f618d82acb8016d" dependencies = [ - "bytes 0.5.6", + "bytes", "futures-core", - "tokio 0.2.22", -] - -[[package]] -name = "tokio-threadpool" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df720b6581784c118f0eb4310796b12b1d242a7eb95f716a8367855325c25f89" -dependencies = [ - "crossbeam-deque", - "crossbeam-queue", - "crossbeam-utils", - "futures 0.1.29", - "lazy_static", - "log 0.4.11", - "num_cpus", - "slab", - "tokio-executor", -] - -[[package]] -name = "tokio-timer" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93044f2d313c95ff1cb7809ce9a7a05735b012288a888b62d4434fd58c94f296" -dependencies = [ - "crossbeam-utils", - "futures 0.1.29", - "slab", - "tokio-executor", + "tokio", ] [[package]] @@ -3340,7 +2765,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a70f4fcd7b3b24fb194f837560168208f669ca8cb70d0c4b862944452396343" dependencies = [ "native-tls", - "tokio 0.2.22", + "tokio", ] [[package]] @@ -3350,10 +2775,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d9e878ad426ca286e4dcae09cbd4e1973a7f8987d97570e2469703dd7f5720c" dependencies = [ "futures-util", - "log 0.4.11", + "log", "pin-project", - "tokio 0.2.22", - "tungstenite 0.11.1", + "tokio", + "tungstenite", ] [[package]] @@ -3362,12 +2787,12 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be8242891f2b6cbef26a2d7e8605133c2c554cd35b3e4948ea892d6d68436499" dependencies = [ - "bytes 0.5.6", + "bytes", "futures-core", "futures-sink", - "log 0.4.11", + "log", "pin-project-lite", - "tokio 0.2.22", + "tokio", ] [[package]] @@ -3385,11 +2810,11 @@ version = "0.1.0" dependencies = [ "bs58", "crypto", - "log 0.4.11", + "log", "nymsphinx-addressing", "nymsphinx-types", "pretty_env_logger", - "rand 0.7.3", + "rand", "version-checker", ] @@ -3406,7 +2831,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d79ca061b032d6ce30c660fded31189ca0b9922bf483cd70759f13a2d86786c" dependencies = [ "cfg-if", - "log 0.4.11", + "log", "tracing-core", ] @@ -3419,37 +2844,12 @@ dependencies = [ "lazy_static", ] -[[package]] -name = "traitobject" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" - [[package]] name = "try-lock" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" -[[package]] -name = "tungstenite" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfea31758bf674f990918962e8e5f07071a3161bd7c4138ed23e416e1ac4264e" -dependencies = [ - "base64 0.11.0", - "byteorder", - "bytes 0.5.6", - "http", - "httparse", - "input_buffer", - "log 0.4.11", - "rand 0.7.3", - "sha-1 0.8.2", - "url 2.1.1", - "utf-8", -] - [[package]] name = "tungstenite" version = "0.11.1" @@ -3458,32 +2858,17 @@ checksum = "f0308d80d86700c5878b9ef6321f020f29b1bb9d5ff3cab25e75e23f3a492a23" dependencies = [ "base64 0.12.3", "byteorder", - "bytes 0.5.6", + "bytes", "http", "httparse", "input_buffer", - "log 0.4.11", - "rand 0.7.3", + "log", + "rand", "sha-1 0.9.1", - "url 2.1.1", + "url", "utf-8", ] -[[package]] -name = "typeable" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887" - -[[package]] -name = "typemap" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "653be63c80a3296da5551e1bfd2cca35227e13cdd08c6668903ae2f4f77aa1f6" -dependencies = [ - "unsafe-any", -] - [[package]] name = "typenum" version = "1.12.0" @@ -3496,22 +2881,13 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" -[[package]] -name = "unicase" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" -dependencies = [ - "version_check 0.1.5", -] - [[package]] name = "unicase" version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" dependencies = [ - "version_check 0.9.2", + "version_check", ] [[package]] @@ -3550,35 +2926,15 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" -[[package]] -name = "unsafe-any" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30360d7979f5e9c6e6cea48af192ea8fab4afb3cf72597154b8f08935bc9c7f" -dependencies = [ - "traitobject", -] - -[[package]] -name = "url" -version = "1.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" -dependencies = [ - "idna 0.1.5", - "matches", - "percent-encoding 1.0.1", -] - [[package]] name = "url" version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "829d4a8476c35c9bf0bbce5a3b23f4106f79728039b726d292bb93bc106787cb" dependencies = [ - "idna 0.2.0", + "idna", "matches", - "percent-encoding 2.1.0", + "percent-encoding", ] [[package]] @@ -3591,8 +2947,13 @@ checksum = "05e42f7c18b8f902290b009cde6d651262f956c98bc51bca4cd1d511c9cd85c7" name = "validator-client" version = "0.1.0" dependencies = [ - "log 0.4.11", - "pretty_env_logger", + "crypto", + "log", + "mockito", + "reqwest", + "serde", + "tokio", + "topology", ] [[package]] @@ -3614,12 +2975,6 @@ dependencies = [ "semver", ] -[[package]] -name = "version_check" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" - [[package]] name = "version_check" version = "0.9.2" @@ -3632,7 +2987,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" dependencies = [ - "log 0.4.11", + "log", "try-lock", ] @@ -3668,7 +3023,7 @@ checksum = "bc71e4c5efa60fb9e74160e89b93353bc24059999c0ae0fb03affc39770310b0" dependencies = [ "bumpalo", "lazy_static", - "log 0.4.11", + "log", "proc-macro2 1.0.20", "quote 1.0.7", "syn 1.0.40", @@ -3775,7 +3130,7 @@ version = "0.1.0" dependencies = [ "futures 0.3.5", "js-sys", - "tungstenite 0.11.1", + "tungstenite", "wasm-bindgen", "wasm-bindgen-futures 0.4.17", "web-sys", @@ -3876,12 +3231,12 @@ dependencies = [ [[package]] name = "x25519-dalek" -version = "0.6.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "637ff90c9540fa3073bb577e65033069e4bae7c79d49d74aa3ffdf5342a53217" +checksum = "bc614d95359fd7afc321b66d2107ede58b246b844cf5d8a0adcca413e439f088" dependencies = [ - "curve25519-dalek 2.1.0", - "rand_core 0.5.1", + "curve25519-dalek 3.0.0", + "rand_core", "zeroize", ] diff --git a/Cargo.toml b/Cargo.toml index ffa921ff237..9cc49579f1f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,19 +13,21 @@ members = [ "clients/socks5", "clients/webassembly", "clients/client-core", - "common/client-libs/directory-client", - "common/client-libs/directory-client/models", "common/client-libs/gateway-client", + "common/client-libs/metrics-client", "common/client-libs/mixnet-client", "common/client-libs/validator-client", "common/config", "common/crypto", + "common/mixnode-common", + "common/nonexhaustive-delayqueue", "common/nymsphinx", "common/nymsphinx/acknowledgements", "common/nymsphinx/addressing", "common/nymsphinx/anonymous-replies", "common/nymsphinx/chunking", "common/nymsphinx/cover", + "common/nymsphinx/forwarding", "common/nymsphinx/framing", "common/nymsphinx/params", "common/nymsphinx/types", @@ -36,9 +38,9 @@ members = [ "common/wasm-utils", "gateway", "gateway/gateway-requests", - "service-providers/sphinx-socks", "mixnode", - "validator", + "network-monitor", + "service-providers/network-requester", ] default-members = [ @@ -46,6 +48,9 @@ default-members = [ "clients/socks5", # "clients/webassembly", "gateway", + "service-providers/network-requester", "mixnode", - "validator", + "network-monitor", ] + +exclude = ["explorer"] \ No newline at end of file diff --git a/README.md b/README.md index f104d9a3dc6..08b33bddb62 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,12 @@ ## The Nym Privacy Platform -This repository contains the full Nym platform. +This repository contains the Nym mixnet. The platform is composed of multiple Rust crates. Top-level executable binary crates include: * nym-mixnode - shuffles [Sphinx](https://github.com/nymtech/sphinx) packets together to provide privacy against network-level attackers. * nym-client - an executable which you can build into your own applications. Use it for interacting with Nym nodes. -* nym-sfw-provider - a store-and-forward service provider. The provider acts sort of like a mailbox for mixnet messages. -* nym-validator - currently just starting development. Handles consensus ordering of transactions, mixmining, and coconut credential generation and validation. +* nym-gateway - acts sort of like a mailbox for mixnet messages, removing the need for directly delivery to potentially offline or firewalled devices. [](https://travis-ci.com/nymtech/nym) diff --git a/clients/client-core/Cargo.toml b/clients/client-core/Cargo.toml index 9860343c9c1..505c72acbd6 100644 --- a/clients/client-core/Cargo.toml +++ b/clients/client-core/Cargo.toml @@ -1,7 +1,6 @@ [package] -build = "build.rs" name = "client-core" -version = "0.8.0-dev" +version = "0.9.0" authors = ["Dave Hrycyszyn <futurechimp@users.noreply.github.com>"] edition = "2018" @@ -10,6 +9,7 @@ edition = "2018" [dependencies] dirs = "2.0.2" futures = "0.3.1" +humantime-serde = "1.0.1" log = "0.4" rand = { version = "0.7.3", features = ["wasm-bindgen"] } serde = { version = "1.0.104", features = ["derive"] } @@ -19,15 +19,13 @@ tokio = { version = "0.2", features = ["full"] } # internal config = { path = "../../common/config" } crypto = { path = "../../common/crypto" } -directory-client = { path = "../../common/client-libs/directory-client" } gateway-client = { path = "../../common/client-libs/gateway-client" } gateway-requests = { path = "../../gateway/gateway-requests" } +nonexhaustive-delayqueue = { path = "../../common/nonexhaustive-delayqueue" } nymsphinx = { path = "../../common/nymsphinx" } pemstore = { path = "../../common/pemstore" } topology = { path = "../../common/topology" } - -[build-dependencies] -built = "0.4.3" +validator-client = { path = "../../common/client-libs/validator-client" } [dev-dependencies] tempfile = "3.1.0" \ No newline at end of file diff --git a/clients/client-core/src/built_info.rs b/clients/client-core/src/built_info.rs deleted file mode 100644 index 38b46d59e64..00000000000 --- a/clients/client-core/src/built_info.rs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -// The file has been placed there by the build script. -include!(concat!(env!("OUT_DIR"), "/built.rs")); diff --git a/clients/client-core/src/client/cover_traffic_stream.rs b/clients/client-core/src/client/cover_traffic_stream.rs index 0ba912a54de..6d68046a8e0 100644 --- a/clients/client-core/src/client/cover_traffic_stream.rs +++ b/clients/client-core/src/client/cover_traffic_stream.rs @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::client::mix_traffic::{MixMessage, MixMessageSender}; +use crate::client::mix_traffic::BatchMixMessageSender; use crate::client::topology_control::TopologyAccessor; use futures::task::{Context, Poll}; use futures::{Future, Stream, StreamExt}; @@ -50,7 +50,7 @@ where /// Channel used for sending prepared sphinx packets to `MixTrafficController` that sends them /// out to the network without any further delays. - mix_tx: MixMessageSender, + mix_tx: BatchMixMessageSender, /// Represents full address of this client. our_full_destination: Recipient, @@ -101,7 +101,7 @@ impl LoopCoverTrafficStream<OsRng> { average_ack_delay: time::Duration, average_packet_delay: time::Duration, average_cover_message_sending_delay: time::Duration, - mix_tx: MixMessageSender, + mix_tx: BatchMixMessageSender, our_full_destination: Recipient, topology_access: TopologyAccessor, ) -> Self { @@ -152,9 +152,7 @@ impl LoopCoverTrafficStream<OsRng> { // - we run out of memory // - the receiver channel is closed // in either case there's no recovery and we can only panic - self.mix_tx - .unbounded_send(MixMessage::new(cover_message.0, cover_message.1)) - .unwrap(); + self.mix_tx.unbounded_send(vec![cover_message]).unwrap(); // TODO: I'm not entirely sure whether this is really required, because I'm not 100% // sure how `yield_now()` works - whether it just notifies the scheduler or whether it @@ -173,7 +171,7 @@ impl LoopCoverTrafficStream<OsRng> { self.average_cover_message_sending_delay, )); - while let Some(_) = self.next().await { + while self.next().await.is_some() { self.on_new_message().await; } } diff --git a/clients/client-core/src/client/mix_traffic.rs b/clients/client-core/src/client/mix_traffic.rs index 1817d0dba18..1b092f95b64 100644 --- a/clients/client-core/src/client/mix_traffic.rs +++ b/clients/client-core/src/client/mix_traffic.rs @@ -16,19 +16,12 @@ use futures::channel::mpsc; use futures::StreamExt; use gateway_client::GatewayClient; use log::*; -use nymsphinx::{addressing::nodes::NymNodeRoutingAddress, SphinxPacket}; +use nymsphinx::forwarding::packet::MixPacket; use tokio::runtime::Handle; use tokio::task::JoinHandle; -pub struct MixMessage(NymNodeRoutingAddress, SphinxPacket); -pub type MixMessageSender = mpsc::UnboundedSender<MixMessage>; -pub type MixMessageReceiver = mpsc::UnboundedReceiver<MixMessage>; - -impl MixMessage { - pub fn new(address: NymNodeRoutingAddress, packet: SphinxPacket) -> Self { - MixMessage(address, packet) - } -} +pub type BatchMixMessageSender = mpsc::UnboundedSender<Vec<MixPacket>>; +pub type BatchMixMessageReceiver = mpsc::UnboundedReceiver<Vec<MixPacket>>; const MAX_FAILURE_COUNT: usize = 100; @@ -36,7 +29,7 @@ pub struct MixTrafficController { // TODO: most likely to be replaced by some higher level construct as // later on gateway_client will need to be accessible by other entities gateway_client: GatewayClient, - mix_rx: MixMessageReceiver, + mix_rx: BatchMixMessageReceiver, // TODO: this is temporary work-around. // in long run `gateway_client` will be moved away from `MixTrafficController` anyway. @@ -44,7 +37,10 @@ pub struct MixTrafficController { } impl MixTrafficController { - pub fn new(mix_rx: MixMessageReceiver, gateway_client: GatewayClient) -> MixTrafficController { + pub fn new( + mix_rx: BatchMixMessageReceiver, + gateway_client: GatewayClient, + ) -> MixTrafficController { MixTrafficController { gateway_client, mix_rx, @@ -52,31 +48,38 @@ impl MixTrafficController { } } - async fn on_message(&mut self, mix_message: MixMessage) { - debug!("Got a mix_message for {:?}", mix_message.0); - match self - .gateway_client - .send_sphinx_packet(mix_message.0, mix_message.1) - .await - { + async fn on_messages(&mut self, mut mix_packets: Vec<MixPacket>) { + debug_assert!(!mix_packets.is_empty()); + + let success = if mix_packets.len() == 1 { + let mix_packet = mix_packets.pop().unwrap(); + self.gateway_client.send_mix_packet(mix_packet).await + } else { + self.gateway_client + .batch_send_mix_packets(mix_packets) + .await + }; + + match success { Err(e) => { - error!("Failed to send sphinx packet to the gateway! - {:?}", e); + error!("Failed to send sphinx packet(s) to the gateway! - {:?}", e); self.consecutive_gateway_failure_count += 1; if self.consecutive_gateway_failure_count == MAX_FAILURE_COUNT { - // todo: in the future this should initiate a 'graceful' shutdown + // todo: in the future this should initiate a 'graceful' shutdown or try + // to reconnect? panic!("failed to send sphinx packet to the gateway {} times in a row - assuming the gateway is dead. Can't do anything about it yet :(", MAX_FAILURE_COUNT) } } Ok(_) => { - trace!("We *might* have managed to forward sphinx packet to the gateway!"); + trace!("We *might* have managed to forward sphinx packet(s) to the gateway!"); self.consecutive_gateway_failure_count = 0; } } } pub async fn run(&mut self) { - while let Some(mix_message) = self.mix_rx.next().await { - self.on_message(mix_message).await; + while let Some(mix_packets) = self.mix_rx.next().await { + self.on_messages(mix_packets).await; } } diff --git a/clients/client-core/src/client/real_messages_control/acknowledgement_control/action_controller.rs b/clients/client-core/src/client/real_messages_control/acknowledgement_control/action_controller.rs index 5d44e00695f..34e1edf5bcf 100644 --- a/clients/client-core/src/client/real_messages_control/acknowledgement_control/action_controller.rs +++ b/clients/client-core/src/client/real_messages_control/acknowledgement_control/action_controller.rs @@ -13,10 +13,10 @@ // limitations under the License. use super::PendingAcknowledgement; -use crate::client::real_messages_control::acknowledgement_control::ack_delay_queue::AckDelayQueue; use crate::client::real_messages_control::acknowledgement_control::RetransmissionRequestSender; use futures::channel::mpsc::{self, UnboundedReceiver, UnboundedSender}; use log::*; +use nonexhaustive_delayqueue::NonExhaustiveDelayQueue; use nymsphinx::chunking::fragment::FragmentIdentifier; use nymsphinx::Delay as SphinxDelay; use std::collections::HashMap; @@ -105,7 +105,7 @@ pub(super) struct ActionController { // previous version. /// DelayQueue with all `PendingAcknowledgement` that are waiting to be either received or /// retransmitted if their timer fires up. - pending_acks_timers: AckDelayQueue<FragmentIdentifier>, + pending_acks_timers: NonExhaustiveDelayQueue<FragmentIdentifier>, /// Channel for receiving `Action`s from other modules. incoming_actions: UnboundedReceiver<Action>, @@ -124,7 +124,7 @@ impl ActionController { ActionController { config, pending_acks_data: HashMap::new(), - pending_acks_timers: AckDelayQueue::new(), + pending_acks_timers: NonExhaustiveDelayQueue::new(), incoming_actions: receiver, retransmission_sender, }, diff --git a/clients/client-core/src/client/real_messages_control/acknowledgement_control/input_message_listener.rs b/clients/client-core/src/client/real_messages_control/acknowledgement_control/input_message_listener.rs index 84976629091..ff807a26ae9 100644 --- a/clients/client-core/src/client/real_messages_control/acknowledgement_control/input_message_listener.rs +++ b/clients/client-core/src/client/real_messages_control/acknowledgement_control/input_message_listener.rs @@ -17,7 +17,7 @@ use super::PendingAcknowledgement; use crate::client::reply_key_storage::ReplyKeyStorage; use crate::client::{ inbound_messages::{InputMessage, InputMessageReceiver}, - real_messages_control::real_traffic_stream::{RealMessage, RealMessageSender}, + real_messages_control::real_traffic_stream::{BatchRealMessageSender, RealMessage}, topology_control::TopologyAccessor, }; use futures::StreamExt; @@ -40,7 +40,7 @@ where input_receiver: InputMessageReceiver, message_preparer: MessagePreparer<R>, action_sender: ActionSender, - real_message_sender: RealMessageSender, + real_message_sender: BatchRealMessageSender, topology_access: TopologyAccessor, reply_key_storage: ReplyKeyStorage, } @@ -55,7 +55,7 @@ where input_receiver: InputMessageReceiver, message_preparer: MessagePreparer<R>, action_sender: ActionSender, - real_message_sender: RealMessageSender, + real_message_sender: BatchRealMessageSender, topology_access: TopologyAccessor, reply_key_storage: ReplyKeyStorage, ) -> Self { @@ -85,12 +85,13 @@ where match self .message_preparer .prepare_reply_for_use(data, reply_surb, topology, &self.ack_key) + .await { - Ok((reply_id, sphinx_packet, first_hop)) => { + Ok((mix_packet, reply_id)) => { // TODO: later probably write pending ack here // and deal with them.... // ... somehow - Some(RealMessage::new(first_hop, sphinx_packet, reply_id)) + Some(RealMessage::new(mix_packet, reply_id)) } Err(err) => { // TODO: should we have some mechanism to indicate to the user that the `reply_surb` @@ -140,18 +141,18 @@ where let prepared_fragment = self .message_preparer .prepare_chunk_for_sending(chunk_clone, topology, &self.ack_key, &recipient) + .await .unwrap(); real_messages.push(RealMessage::new( - prepared_fragment.first_hop_address, - prepared_fragment.sphinx_packet, + prepared_fragment.mix_packet, message_chunk.fragment_identifier(), )); pending_acks.push(PendingAcknowledgement::new( message_chunk, prepared_fragment.total_delay, - recipient.clone(), + recipient, )); } @@ -183,11 +184,9 @@ where }; // tells real message sender (with the poisson timer) to send this to the mix network - for real_message in real_messages { - self.real_message_sender - .unbounded_send(real_message) - .unwrap(); - } + self.real_message_sender + .unbounded_send(real_messages) + .unwrap(); } pub(super) async fn run(&mut self) { diff --git a/clients/client-core/src/client/real_messages_control/acknowledgement_control/mod.rs b/clients/client-core/src/client/real_messages_control/acknowledgement_control/mod.rs index 17a579e5816..8f57f5bbf48 100644 --- a/clients/client-core/src/client/real_messages_control/acknowledgement_control/mod.rs +++ b/clients/client-core/src/client/real_messages_control/acknowledgement_control/mod.rs @@ -18,12 +18,13 @@ use self::{ retransmission_request_listener::RetransmissionRequestListener, sent_notification_listener::SentNotificationListener, }; -use super::real_traffic_stream::RealMessageSender; +use super::real_traffic_stream::BatchRealMessageSender; use crate::client::reply_key_storage::ReplyKeyStorage; use crate::client::{inbound_messages::InputMessageReceiver, topology_control::TopologyAccessor}; use futures::channel::mpsc; use gateway_client::AcknowledgementReceiver; use log::*; +use nymsphinx::params::PacketMode; use nymsphinx::{ acknowledgements::AckKey, addressing::clients::Recipient, @@ -38,7 +39,6 @@ use std::{ }; use tokio::task::JoinHandle; -mod ack_delay_queue; mod acknowledgement_listener; mod action_controller; mod input_message_listener; @@ -87,7 +87,7 @@ impl PendingAcknowledgement { pub(super) struct AcknowledgementControllerConnectors { /// Channel used for forwarding prepared sphinx messages into the poisson sender /// to be sent to the mix network. - real_message_sender: RealMessageSender, + real_message_sender: BatchRealMessageSender, /// Channel used for receiving raw messages from a client. The messages need to be put /// into sphinx packets first. @@ -104,7 +104,7 @@ pub(super) struct AcknowledgementControllerConnectors { impl AcknowledgementControllerConnectors { pub(super) fn new( - real_message_sender: RealMessageSender, + real_message_sender: BatchRealMessageSender, input_receiver: InputMessageReceiver, sent_notifier: SentPacketNotificationReceiver, ack_receiver: AcknowledgementReceiver, @@ -131,6 +131,14 @@ pub(super) struct Config { /// Average delay a data packet is going to get delayed at a single mixnode. average_packet_delay: Duration, + + /// Mode of all mix packets created - VPN or Mix. They indicate whether packets should get delayed + /// and keys reused. + packet_mode: PacketMode, + + /// If the mode of the client is set to VPN it specifies number of packets created with the + /// same initial secret until it gets rotated. + vpn_key_reuse_limit: Option<usize>, } impl Config { @@ -139,12 +147,16 @@ impl Config { ack_wait_multiplier: f64, average_ack_delay: Duration, average_packet_delay: Duration, + packet_mode: PacketMode, + vpn_key_reuse_limit: Option<usize>, ) -> Self { Config { ack_wait_addition, ack_wait_multiplier, average_ack_delay, average_packet_delay, + packet_mode, + vpn_key_reuse_limit, } } } @@ -182,9 +194,11 @@ where let message_preparer = MessagePreparer::new( rng, - ack_recipient.clone(), + ack_recipient, config.average_packet_delay, config.average_ack_delay, + config.packet_mode, + config.vpn_key_reuse_limit, ); // will listen for any acks coming from the network @@ -197,7 +211,7 @@ where // will listen for any new messages from the client let input_message_listener = InputMessageListener::new( Arc::clone(&ack_key), - ack_recipient.clone(), + ack_recipient, connectors.input_receiver, message_preparer.clone(), action_sender.clone(), diff --git a/clients/client-core/src/client/real_messages_control/acknowledgement_control/retransmission_request_listener.rs b/clients/client-core/src/client/real_messages_control/acknowledgement_control/retransmission_request_listener.rs index 92641e7e432..1e4c01dbc1d 100644 --- a/clients/client-core/src/client/real_messages_control/acknowledgement_control/retransmission_request_listener.rs +++ b/clients/client-core/src/client/real_messages_control/acknowledgement_control/retransmission_request_listener.rs @@ -16,7 +16,7 @@ use super::action_controller::{Action, ActionSender}; use super::PendingAcknowledgement; use super::RetransmissionRequestReceiver; use crate::client::{ - real_messages_control::real_traffic_stream::{RealMessage, RealMessageSender}, + real_messages_control::real_traffic_stream::{BatchRealMessageSender, RealMessage}, topology_control::TopologyAccessor, }; use futures::StreamExt; @@ -35,7 +35,7 @@ where ack_recipient: Recipient, message_preparer: MessagePreparer<R>, action_sender: ActionSender, - real_message_sender: RealMessageSender, + real_message_sender: BatchRealMessageSender, request_receiver: RetransmissionRequestReceiver, topology_access: TopologyAccessor, } @@ -49,7 +49,7 @@ where ack_recipient: Recipient, message_preparer: MessagePreparer<R>, action_sender: ActionSender, - real_message_sender: RealMessageSender, + real_message_sender: BatchRealMessageSender, request_receiver: RetransmissionRequestReceiver, topology_access: TopologyAccessor, ) -> Self { @@ -94,6 +94,7 @@ where let prepared_fragment = self .message_preparer .prepare_chunk_for_sending(chunk_clone, topology_ref, &self.ack_key, packet_recipient) + .await .unwrap(); // if we have the ONLY strong reference to the ack data, it means it was removed from the @@ -123,11 +124,10 @@ where // send to `OutQueueControl` to eventually send to the mix network self.real_message_sender - .unbounded_send(RealMessage::new( - prepared_fragment.first_hop_address, - prepared_fragment.sphinx_packet, + .unbounded_send(vec![RealMessage::new( + prepared_fragment.mix_packet, frag_id, - )) + )]) .unwrap(); } diff --git a/clients/client-core/src/client/real_messages_control/mod.rs b/clients/client-core/src/client/real_messages_control/mod.rs index a632ae8d1d6..5bc8e0f2161 100644 --- a/clients/client-core/src/client/real_messages_control/mod.rs +++ b/clients/client-core/src/client/real_messages_control/mod.rs @@ -22,7 +22,7 @@ use self::{ use crate::client::real_messages_control::acknowledgement_control::AcknowledgementControllerConnectors; use crate::client::reply_key_storage::ReplyKeyStorage; use crate::client::{ - inbound_messages::InputMessageReceiver, mix_traffic::MixMessageSender, + inbound_messages::InputMessageReceiver, mix_traffic::BatchMixMessageSender, topology_control::TopologyAccessor, }; use futures::channel::mpsc; @@ -30,6 +30,7 @@ use gateway_client::AcknowledgementReceiver; use log::*; use nymsphinx::acknowledgements::AckKey; use nymsphinx::addressing::clients::Recipient; +use nymsphinx::params::PacketMode; use rand::{rngs::OsRng, CryptoRng, Rng}; use std::sync::Arc; use std::time::Duration; @@ -41,13 +42,34 @@ mod real_traffic_stream; // TODO: ack_key and self_recipient shouldn't really be part of this config pub struct Config { + /// Key used to decrypt contents of received SURBAcks ack_key: Arc<AckKey>, - ack_wait_multiplier: f64, + + /// Given ack timeout in the form a * BASE_DELAY + b, it specifies the additive part `b` ack_wait_addition: Duration, + + /// Given ack timeout in the form a * BASE_DELAY + b, it specifies the multiplier `a` + ack_wait_multiplier: f64, + + /// Address of `this` client. self_recipient: Recipient, + + /// Average delay between sending subsequent packets from this client. + average_message_sending_delay: Duration, + + /// Average delay a data packet is going to get delayed at a single mixnode. average_packet_delay_duration: Duration, + + /// Average delay an acknowledgement packet is going to get delayed at a single mixnode. average_ack_delay_duration: Duration, - average_message_sending_delay: Duration, + + /// Mode of all mix packets created - VPN or Mix. They indicate whether packets should get delayed + /// and keys reused. + packet_mode: PacketMode, + + /// If the mode of the client is set to VPN it specifies number of packets created with the + /// same initial secret until it gets rotated. + vpn_key_reuse_limit: Option<usize>, } impl Config { @@ -59,6 +81,8 @@ impl Config { average_message_sending_delay: Duration, average_packet_delay_duration: Duration, self_recipient: Recipient, + packet_mode: PacketMode, + vpn_key_reuse_limit: Option<usize>, ) -> Self { Config { ack_key, @@ -68,6 +92,8 @@ impl Config { average_message_sending_delay, ack_wait_multiplier, ack_wait_addition, + packet_mode, + vpn_key_reuse_limit, } } } @@ -87,7 +113,7 @@ impl RealMessagesController<OsRng> { config: Config, ack_receiver: AcknowledgementReceiver, input_receiver: InputMessageReceiver, - mix_sender: MixMessageSender, + mix_sender: BatchMixMessageSender, topology_access: TopologyAccessor, reply_key_storage: ReplyKeyStorage, ) -> Self { @@ -108,6 +134,8 @@ impl RealMessagesController<OsRng> { config.ack_wait_multiplier, config.average_ack_delay_duration, config.average_packet_delay_duration, + config.packet_mode, + config.vpn_key_reuse_limit, ); let ack_control = AcknowledgementController::new( @@ -115,7 +143,7 @@ impl RealMessagesController<OsRng> { rng, topology_access.clone(), Arc::clone(&config.ack_key), - config.self_recipient.clone(), + config.self_recipient, reply_key_storage, ack_controller_connectors, ); @@ -143,7 +171,7 @@ impl RealMessagesController<OsRng> { } } - pub(super) async fn run(&mut self) { + pub(super) async fn run(&mut self, vpn_mode: bool) { let mut out_queue_control = self.out_queue_control.take().unwrap(); let mut ack_control = self.ack_control.take().unwrap(); @@ -151,7 +179,7 @@ impl RealMessagesController<OsRng> { // the task to ever finish. This will of course change once we introduce // graceful shutdowns. let out_queue_control_fut = tokio::spawn(async move { - out_queue_control.run_out_queue_control().await; + out_queue_control.run_out_queue_control(vpn_mode).await; error!("The out queue controller has finished execution!"); out_queue_control }); @@ -170,9 +198,9 @@ impl RealMessagesController<OsRng> { // &Handle is only passed for consistency sake with other client modules, but I think // when we get to refactoring, we should apply gateway approach and make it implicit - pub fn start(mut self, handle: &Handle) -> JoinHandle<Self> { + pub fn start(mut self, handle: &Handle, vpn_mode: bool) -> JoinHandle<Self> { handle.spawn(async move { - self.run().await; + self.run(vpn_mode).await; self }) } diff --git a/clients/client-core/src/client/real_messages_control/real_traffic_stream.rs b/clients/client-core/src/client/real_messages_control/real_traffic_stream.rs index 0626070575e..f45400c720b 100644 --- a/clients/client-core/src/client/real_messages_control/real_traffic_stream.rs +++ b/clients/client-core/src/client/real_messages_control/real_traffic_stream.rs @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::client::mix_traffic::{MixMessage, MixMessageSender}; +use crate::client::mix_traffic::BatchMixMessageSender; use crate::client::real_messages_control::acknowledgement_control::SentPacketNotificationSender; use crate::client::topology_control::TopologyAccessor; use futures::channel::mpsc; @@ -20,12 +20,13 @@ use futures::task::{Context, Poll}; use futures::{Future, Stream, StreamExt}; use log::*; use nymsphinx::acknowledgements::AckKey; -use nymsphinx::addressing::{clients::Recipient, nodes::NymNodeRoutingAddress}; +use nymsphinx::addressing::clients::Recipient; use nymsphinx::chunking::fragment::FragmentIdentifier; use nymsphinx::cover::generate_loop_cover_packet; +use nymsphinx::forwarding::packet::MixPacket; use nymsphinx::utils::sample_poisson_duration; -use nymsphinx::SphinxPacket; use rand::{CryptoRng, Rng}; +use std::collections::VecDeque; use std::pin::Pin; use std::sync::Arc; use std::time::Duration; @@ -76,11 +77,11 @@ where /// Channel used for sending prepared sphinx packets to `MixTrafficController` that sends them /// out to the network without any further delays. - mix_tx: MixMessageSender, + mix_tx: BatchMixMessageSender, /// Channel used for receiving real, prepared, messages that must be first sufficiently delayed /// before being sent out into the network. - real_receiver: RealMessageReceiver, + real_receiver: BatchRealMessageReceiver, /// Represents full address of this client. our_full_destination: Recipient, @@ -90,23 +91,20 @@ where /// Accessor to the common instance of network topology. topology_access: TopologyAccessor, + + /// Buffer containing all real messages received. It is first exhausted before more are pulled. + received_buffer: VecDeque<RealMessage>, } pub(crate) struct RealMessage { - first_hop_address: NymNodeRoutingAddress, - packet: SphinxPacket, + mix_packet: MixPacket, fragment_id: FragmentIdentifier, } impl RealMessage { - pub(crate) fn new( - first_hop_address: NymNodeRoutingAddress, - packet: SphinxPacket, - fragment_id: FragmentIdentifier, - ) -> Self { + pub(crate) fn new(mix_packet: MixPacket, fragment_id: FragmentIdentifier) -> Self { RealMessage { - first_hop_address, - packet, + mix_packet, fragment_id, } } @@ -114,8 +112,8 @@ impl RealMessage { // messages are already prepared, etc. the real point of it is to forward it to mix_traffic // after sufficient delay -pub(crate) type RealMessageSender = mpsc::UnboundedSender<RealMessage>; -type RealMessageReceiver = mpsc::UnboundedReceiver<RealMessage>; +pub(crate) type BatchRealMessageSender = mpsc::UnboundedSender<Vec<RealMessage>>; +type BatchRealMessageReceiver = mpsc::UnboundedReceiver<Vec<RealMessage>>; pub(crate) enum StreamMessage { Cover, @@ -145,14 +143,25 @@ where let next = now + next_poisson_delay; self.next_delay.reset(next); + // check if we have anything immediately available + if let Some(real_available) = self.received_buffer.pop_front() { + return Poll::Ready(Some(StreamMessage::Real(real_available))); + } + // decide what kind of message to send match Pin::new(&mut self.real_receiver).poll_next(cx) { // in the case our real message channel stream was closed, we should also indicate we are closed // (and whoever is using the stream should panic) Poll::Ready(None) => Poll::Ready(None), - // if there's an actual message - return it - Poll::Ready(Some(real_message)) => Poll::Ready(Some(StreamMessage::Real(real_message))), + // if there are more messages available, return first one and store the rest + Poll::Ready(Some(real_messages)) => { + self.received_buffer = real_messages.into(); + // we MUST HAVE received at least ONE message + Poll::Ready(Some(StreamMessage::Real( + self.received_buffer.pop_front().unwrap(), + ))) + } // otherwise construct a dummy one Poll::Pending => Poll::Ready(Some(StreamMessage::Cover)), @@ -168,8 +177,8 @@ where config: Config, ack_key: Arc<AckKey>, sent_notifier: SentPacketNotificationSender, - mix_tx: MixMessageSender, - real_receiver: RealMessageReceiver, + mix_tx: BatchMixMessageSender, + real_receiver: BatchRealMessageReceiver, rng: R, our_full_destination: Recipient, topology_access: TopologyAccessor, @@ -184,9 +193,18 @@ where our_full_destination, rng, topology_access, + received_buffer: VecDeque::with_capacity(0), // we won't be putting any data into this guy directly } } + fn sent_notify(&self, frag_id: FragmentIdentifier) { + // well technically the message was not sent just yet, but now it's up to internal + // queues and client load rather than the required delay. So realistically we can treat + // whatever is about to happen as negligible additional delay. + trace!("{} is about to get sent to the mixnet", frag_id); + self.sent_notifier.unbounded_send(frag_id).unwrap(); + } + async fn on_message(&mut self, next_message: StreamMessage) { trace!("created new message"); @@ -209,7 +227,7 @@ where } let topology_ref = topology_ref_option.unwrap(); - let cover_message = generate_loop_cover_packet( + generate_loop_cover_packet( &mut self.rng, topology_ref, &*self.ack_key, @@ -217,22 +235,11 @@ where self.config.average_ack_delay, self.config.average_packet_delay, ) - .expect("Somehow failed to generate a loop cover message with a valid topology"); - - MixMessage::new(cover_message.0, cover_message.1) + .expect("Somehow failed to generate a loop cover message with a valid topology") } StreamMessage::Real(real_message) => { - // well technically the message was not sent just yet, but now it's up to internal - // queues and client load rather than the required delay. So realistically we can treat - // whatever is about to happen as negligible additional delay. - trace!( - "{} is about to get sent to the mixnet", - real_message.fragment_id - ); - self.sent_notifier - .unbounded_send(real_message.fragment_id) - .unwrap(); - MixMessage::new(real_message.first_hop_address, real_message.packet) + self.sent_notify(real_message.fragment_id); + real_message.mix_packet } }; @@ -240,7 +247,7 @@ where // - we run out of memory // - the receiver channel is closed // in either case there's no recovery and we can only panic - self.mix_tx.unbounded_send(next_message).unwrap(); + self.mix_tx.unbounded_send(vec![next_message]).unwrap(); // JS: Not entirely sure why or how it fixes stuff, but without the yield call, // the UnboundedReceiver [of mix_rx] will not get a chance to read anything @@ -250,16 +257,42 @@ where tokio::task::yield_now().await; } - pub(crate) async fn run_out_queue_control(&mut self) { + async fn on_batch_received(&mut self, real_messages: Vec<RealMessage>) { + let mut mix_packets = Vec::with_capacity(real_messages.len()); + for real_message in real_messages.into_iter() { + self.sent_notify(real_message.fragment_id); + mix_packets.push(real_message.mix_packet); + } + self.mix_tx.unbounded_send(mix_packets).unwrap(); + } + + // Send messages at certain rate and if no real traffic is available, send cover message. + async fn run_normal_out_queue(&mut self) { // we should set initial delay only when we actually start the stream self.next_delay = time::delay_for(sample_poisson_duration( &mut self.rng, self.config.average_message_sending_delay, )); - debug!("Starting out queue controller..."); while let Some(next_message) = self.next().await { self.on_message(next_message).await; } } + + // Send real message as soon as it's available and don't inject ANY cover traffic. + async fn run_vpn_out_queue(&mut self) { + while let Some(next_messages) = self.real_receiver.next().await { + self.on_batch_received(next_messages).await + } + } + + pub(crate) async fn run_out_queue_control(&mut self, vpn_mode: bool) { + if vpn_mode { + debug!("Starting out queue controller in vpn mode..."); + self.run_vpn_out_queue().await + } else { + debug!("Starting out queue controller..."); + self.run_normal_out_queue().await + } + } } diff --git a/clients/client-core/src/client/topology_control.rs b/clients/client-core/src/client/topology_control.rs index b39297bc17b..df87eb7d6e2 100644 --- a/clients/client-core/src/client/topology_control.rs +++ b/clients/client-core/src/client/topology_control.rs @@ -12,12 +12,9 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::built_info; -use directory_client::DirectoryClient; use log::*; use nymsphinx::addressing::clients::Recipient; use nymsphinx::params::DEFAULT_NUM_MIX_HOPS; -use std::convert::TryInto; use std::ops::Deref; use std::sync::Arc; use std::time; @@ -147,7 +144,7 @@ impl TopologyRefresherConfig { } pub struct TopologyRefresher { - directory_client: directory_client::Client, + validator_client: validator_client::Client, topology_accessor: TopologyAccessor, refresh_rate: Duration, } @@ -157,25 +154,25 @@ impl TopologyRefresher { cfg: TopologyRefresherConfig, topology_accessor: TopologyAccessor, ) -> Self { - let directory_client_config = directory_client::Config::new(cfg.directory_server); - let directory_client = directory_client::Client::new(directory_client_config); + let validator_client_config = validator_client::Config::new(cfg.directory_server); + let validator_client = validator_client::Client::new(validator_client_config); TopologyRefresher { - directory_client, + validator_client, topology_accessor, refresh_rate: cfg.refresh_rate, } } async fn get_current_compatible_topology(&self) -> Option<NymTopology> { - match self.directory_client.get_topology().await { + match self.validator_client.get_active_topology().await { Err(err) => { - error!("failed to get network topology! - {:?}", err); + error!("failed to get active network topology! - {:?}", err); None } Ok(topology) => { - let nym_topology: NymTopology = topology.try_into().ok()?; - Some(nym_topology.filter_system_version(built_info::PKG_VERSION)) + let nym_topology: NymTopology = topology.into(); + Some(nym_topology.filter_system_version(env!("CARGO_PKG_VERSION"))) } } } diff --git a/clients/client-core/src/config/mod.rs b/clients/client-core/src/config/mod.rs index b14cdc26ae6..2ce486cb623 100644 --- a/clients/client-core/src/config/mod.rs +++ b/clients/client-core/src/config/mod.rs @@ -13,27 +13,85 @@ // limitations under the License. use config::NymConfig; -use serde::{Deserialize, Serialize}; +use serde::{ + de::{self, IntoDeserializer, Visitor}, + Deserialize, Deserializer, Serialize, +}; use std::marker::PhantomData; use std::path::PathBuf; -use std::time; +use std::time::Duration; pub mod persistence; +pub const MISSING_VALUE: &str = "MISSING VALUE"; + // 'CLIENT' -const DEFAULT_DIRECTORY_SERVER: &str = "https://directory.nymtech.net"; +pub const DEFAULT_VALIDATOR_REST_ENDPOINT: &str = "http://testnet-validator1.nymtech.net:8081"; + // 'DEBUG' -// where applicable, the below are defined in milliseconds const DEFAULT_ACK_WAIT_MULTIPLIER: f64 = 1.5; -// all delays are in milliseconds -const DEFAULT_ACK_WAIT_ADDITION: u64 = 800; -const DEFAULT_LOOP_COVER_STREAM_AVERAGE_DELAY: u64 = 1000; -const DEFAULT_MESSAGE_STREAM_AVERAGE_DELAY: u64 = 100; -const DEFAULT_AVERAGE_PACKET_DELAY: u64 = 100; -const DEFAULT_TOPOLOGY_REFRESH_RATE: u64 = 30_000; -const DEFAULT_TOPOLOGY_RESOLUTION_TIMEOUT: u64 = 5_000; -const DEFAULT_GATEWAY_RESPONSE_TIMEOUT: u64 = 1_500; +const DEFAULT_ACK_WAIT_ADDITION: Duration = Duration::from_millis(1_500); +const DEFAULT_LOOP_COVER_STREAM_AVERAGE_DELAY: Duration = Duration::from_millis(200); +const DEFAULT_MESSAGE_STREAM_AVERAGE_DELAY: Duration = Duration::from_millis(20); +const DEFAULT_AVERAGE_PACKET_DELAY: Duration = Duration::from_millis(50); +const DEFAULT_TOPOLOGY_REFRESH_RATE: Duration = Duration::from_millis(30_000); +const DEFAULT_TOPOLOGY_RESOLUTION_TIMEOUT: Duration = Duration::from_millis(5_000); +const DEFAULT_GATEWAY_RESPONSE_TIMEOUT: Duration = Duration::from_millis(1_500); +const DEFAULT_VPN_KEY_REUSE_LIMIT: usize = 1000; + +const ZERO_DELAY: Duration = Duration::from_nanos(0); + +// custom function is defined to deserialize based on whether field contains a pre 0.9.0 +// u64 interpreted as milliseconds or proper duration introduced in 0.9.0 +// +// TODO: when we get to refactoring down the line, this code can just be removed +// and all Duration fields could just have #[serde(with = "humantime_serde")] instead +// reason for that is that we don't expect anyone to be upgrading from pre 0.9.0 when we have, +// for argument sake, 0.11.0 out +fn deserialize_duration<'de, D>(deserializer: D) -> Result<Duration, D::Error> +where + D: Deserializer<'de>, +{ + struct DurationVisitor; + + impl<'de> Visitor<'de> for DurationVisitor { + type Value = Duration; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("u64 or a duration") + } + + fn visit_i64<E>(self, value: i64) -> Result<Duration, E> + where + E: de::Error, + { + self.visit_u64(value as u64) + } + + fn visit_u64<E>(self, value: u64) -> Result<Duration, E> + where + E: de::Error, + { + Ok(Duration::from_millis(Deserialize::deserialize( + value.into_deserializer(), + )?)) + } + + fn visit_str<E>(self, value: &str) -> Result<Duration, E> + where + E: de::Error, + { + humantime_serde::deserialize(value.into_deserializer()) + } + } + + deserializer.deserialize_any(DurationVisitor) +} + +pub fn missing_string_value() -> String { + MISSING_VALUE.to_string() +} #[derive(Debug, Deserialize, PartialEq, Serialize)] #[serde(deny_unknown_fields)] @@ -118,14 +176,26 @@ impl<T: NymConfig> Config<T> { self.client.gateway_listener = gateway_listener.into(); } - pub fn with_custom_directory<S: Into<String>>(&mut self, directory_server: S) { - self.client.directory_server = directory_server.into(); + pub fn set_custom_validator<S: Into<String>>(&mut self, validator: S) { + self.client.validator_rest_url = validator.into(); } pub fn set_high_default_traffic_volume(&mut self) { - self.debug.average_packet_delay = 10; - self.debug.loop_cover_traffic_average_delay = 20; // 50 cover messages / s - self.debug.message_sending_average_delay = 5; // 200 "real" messages / s + self.debug.average_packet_delay = Duration::from_millis(1); + self.debug.loop_cover_traffic_average_delay = Duration::from_millis(2000000); // basically don't really send cover messages + self.debug.message_sending_average_delay = Duration::from_millis(4); // 250 "real" messages / s + } + + pub fn set_vpn_mode(&mut self, vpn_mode: bool) { + self.client.vpn_mode = vpn_mode; + } + + pub fn set_vpn_key_reuse_limit(&mut self, reuse_limit: usize) { + self.debug.vpn_key_reuse_limit = Some(reuse_limit) + } + + pub fn set_custom_version(&mut self, version: &str) { + self.client.version = version.to_string(); } pub fn get_id(&self) -> String { @@ -164,8 +234,8 @@ impl<T: NymConfig> Config<T> { self.client.ack_key_file.clone() } - pub fn get_directory_server(&self) -> String { - self.client.directory_server.clone() + pub fn get_validator_rest_endpoint(&self) -> String { + self.client.validator_rest_url.clone() } pub fn get_gateway_id(&self) -> String { @@ -177,40 +247,71 @@ impl<T: NymConfig> Config<T> { } // Debug getters - pub fn get_average_packet_delay(&self) -> time::Duration { - time::Duration::from_millis(self.debug.average_packet_delay) + pub fn get_average_packet_delay(&self) -> Duration { + if self.client.vpn_mode { + ZERO_DELAY + } else { + self.debug.average_packet_delay + } } - pub fn get_average_ack_delay(&self) -> time::Duration { - time::Duration::from_millis(self.debug.average_ack_delay) + pub fn get_average_ack_delay(&self) -> Duration { + if self.client.vpn_mode { + ZERO_DELAY + } else { + self.debug.average_ack_delay + } } pub fn get_ack_wait_multiplier(&self) -> f64 { self.debug.ack_wait_multiplier } - pub fn get_ack_wait_addition(&self) -> time::Duration { - time::Duration::from_millis(self.debug.ack_wait_addition) + pub fn get_ack_wait_addition(&self) -> Duration { + self.debug.ack_wait_addition + } + + pub fn get_loop_cover_traffic_average_delay(&self) -> Duration { + self.debug.loop_cover_traffic_average_delay } - pub fn get_loop_cover_traffic_average_delay(&self) -> time::Duration { - time::Duration::from_millis(self.debug.loop_cover_traffic_average_delay) + pub fn get_message_sending_average_delay(&self) -> Duration { + if self.client.vpn_mode { + ZERO_DELAY + } else { + self.debug.message_sending_average_delay + } + } + + pub fn get_gateway_response_timeout(&self) -> Duration { + self.debug.gateway_response_timeout + } + + pub fn get_topology_refresh_rate(&self) -> Duration { + self.debug.topology_refresh_rate } - pub fn get_message_sending_average_delay(&self) -> time::Duration { - time::Duration::from_millis(self.debug.message_sending_average_delay) + pub fn get_topology_resolution_timeout(&self) -> Duration { + self.debug.topology_resolution_timeout } - pub fn get_gateway_response_timeout(&self) -> time::Duration { - time::Duration::from_millis(self.debug.gateway_response_timeout) + pub fn get_vpn_mode(&self) -> bool { + self.client.vpn_mode } - pub fn get_topology_refresh_rate(&self) -> time::Duration { - time::Duration::from_millis(self.debug.topology_refresh_rate) + pub fn get_vpn_key_reuse_limit(&self) -> Option<usize> { + match self.get_vpn_mode() { + false => None, + true => Some( + self.debug + .vpn_key_reuse_limit + .unwrap_or_else(|| DEFAULT_VPN_KEY_REUSE_LIMIT), + ), + } } - pub fn get_topology_resolution_timeout(&self) -> time::Duration { - time::Duration::from_millis(self.debug.topology_resolution_timeout) + pub fn get_version(&self) -> &str { + &self.client.version } } @@ -225,13 +326,23 @@ impl<T: NymConfig> Default for Config<T> { } #[derive(Debug, Deserialize, PartialEq, Serialize)] -#[serde(deny_unknown_fields)] pub struct Client<T> { + /// Version of the client for which this configuration was created. + #[serde(default = "missing_string_value")] + version: String, + /// ID specifies the human readable ID of this particular client. id: String, - /// URL to the directory server. - directory_server: String, + /// URL to the validator server for obtaining network topology. + #[serde(default = "missing_string_value")] + validator_rest_url: String, + + /// Special mode of the system such that all messages are sent as soon as they are received + /// and no cover traffic is generated. If set all message delays are set to 0 and overwriting + /// 'Debug' values will have no effect. + #[serde(default)] + vpn_mode: bool, /// Path to file containing private identity key. private_identity_key_file: PathBuf, @@ -269,15 +380,17 @@ pub struct Client<T> { nym_root_directory: PathBuf, #[serde(skip)] - super_struct: PhantomData<T>, + super_struct: PhantomData<*const T>, } impl<T: NymConfig> Default for Client<T> { fn default() -> Self { // there must be explicit checks for whether id is not empty later Client { + version: env!("CARGO_PKG_VERSION").to_string(), id: "".to_string(), - directory_server: DEFAULT_DIRECTORY_SERVER.to_string(), + validator_rest_url: DEFAULT_VALIDATOR_REST_ENDPOINT.to_string(), + vpn_mode: false, private_identity_key_file: Default::default(), public_identity_key_file: Default::default(), private_encryption_key_file: Default::default(), @@ -295,31 +408,31 @@ impl<T: NymConfig> Default for Client<T> { impl<T: NymConfig> Client<T> { fn default_private_identity_key_file(id: &str) -> PathBuf { - T::default_data_directory(Some(id)).join("private_identity.pem") + T::default_data_directory(id).join("private_identity.pem") } fn default_public_identity_key_file(id: &str) -> PathBuf { - T::default_data_directory(Some(id)).join("public_identity.pem") + T::default_data_directory(id).join("public_identity.pem") } fn default_private_encryption_key_file(id: &str) -> PathBuf { - T::default_data_directory(Some(id)).join("private_encryption.pem") + T::default_data_directory(id).join("private_encryption.pem") } fn default_public_encryption_key_file(id: &str) -> PathBuf { - T::default_data_directory(Some(id)).join("public_encryption.pem") + T::default_data_directory(id).join("public_encryption.pem") } fn default_gateway_shared_key_file(id: &str) -> PathBuf { - T::default_data_directory(Some(id)).join("gateway_shared.pem") + T::default_data_directory(id).join("gateway_shared.pem") } fn default_ack_key_file(id: &str) -> PathBuf { - T::default_data_directory(Some(id)).join("ack_key.pem") + T::default_data_directory(id).join("ack_key.pem") } fn default_reply_encryption_key_store_path(id: &str) -> PathBuf { - T::default_data_directory(Some(id)).join("reply_key_store") + T::default_data_directory(id).join("reply_key_store") } } @@ -340,15 +453,21 @@ pub struct Debug { /// sent packet is going to be delayed at any given mix node. /// So for a packet going through three mix nodes, on average, it will take three times this value /// until the packet reaches its destination. - /// The provided value is interpreted as milliseconds. - average_packet_delay: u64, + #[serde( + deserialize_with = "deserialize_duration", + serialize_with = "humantime_serde::serialize" + )] + average_packet_delay: Duration, /// The parameter of Poisson distribution determining how long, on average, /// sent acknowledgement is going to be delayed at any given mix node. /// So for an ack going through three mix nodes, on average, it will take three times this value /// until the packet reaches its destination. - /// The provided value is interpreted as milliseconds. - average_ack_delay: u64, + #[serde( + deserialize_with = "deserialize_duration", + serialize_with = "humantime_serde::serialize" + )] + average_ack_delay: Duration, /// Value multiplied with the expected round trip time of an acknowledgement packet before /// it is assumed it was lost and retransmission of the data packet happens. @@ -358,36 +477,58 @@ pub struct Debug { /// Value added to the expected round trip time of an acknowledgement packet before /// it is assumed it was lost and retransmission of the data packet happens. /// In an ideal network with 0 latency, this value would have been 0. - /// The provided value is interpreted as milliseconds. - ack_wait_addition: u64, + #[serde( + deserialize_with = "deserialize_duration", + serialize_with = "humantime_serde::serialize" + )] + ack_wait_addition: Duration, /// The parameter of Poisson distribution determining how long, on average, /// it is going to take for another loop cover traffic message to be sent. - /// The provided value is interpreted as milliseconds. - loop_cover_traffic_average_delay: u64, + #[serde( + deserialize_with = "deserialize_duration", + serialize_with = "humantime_serde::serialize" + )] + loop_cover_traffic_average_delay: Duration, /// The parameter of Poisson distribution determining how long, on average, /// it is going to take another 'real traffic stream' message to be sent. /// If no real packets are available and cover traffic is enabled, /// a loop cover message is sent instead in order to preserve the rate. - /// The provided value is interpreted as milliseconds. - message_sending_average_delay: u64, + #[serde( + deserialize_with = "deserialize_duration", + serialize_with = "humantime_serde::serialize" + )] + message_sending_average_delay: Duration, /// How long we're willing to wait for a response to a message sent to the gateway, /// before giving up on it. - /// The provided value is interpreted as milliseconds. - gateway_response_timeout: u64, + #[serde( + deserialize_with = "deserialize_duration", + serialize_with = "humantime_serde::serialize" + )] + gateway_response_timeout: Duration, /// The uniform delay every which clients are querying the directory server /// to try to obtain a compatible network topology to send sphinx packets through. - /// The provided value is interpreted as milliseconds. - topology_refresh_rate: u64, + #[serde( + deserialize_with = "deserialize_duration", + serialize_with = "humantime_serde::serialize" + )] + topology_refresh_rate: Duration, /// During topology refresh, test packets are sent through every single possible network /// path. This timeout determines waiting period until it is decided that the packet /// did not reach its destination. - /// The provided value is interpreted as milliseconds. - topology_resolution_timeout: u64, + #[serde( + deserialize_with = "deserialize_duration", + serialize_with = "humantime_serde::serialize" + )] + topology_resolution_timeout: Duration, + + /// If the mode of the client is set to VPN it specifies number of packets created with the + /// same initial secret until it gets rotated. + vpn_key_reuse_limit: Option<usize>, } impl Default for Debug { @@ -402,6 +543,7 @@ impl Default for Debug { gateway_response_timeout: DEFAULT_GATEWAY_RESPONSE_TIMEOUT, topology_refresh_rate: DEFAULT_TOPOLOGY_REFRESH_RATE, topology_resolution_timeout: DEFAULT_TOPOLOGY_RESOLUTION_TIMEOUT, + vpn_key_reuse_limit: None, } } } diff --git a/clients/client-core/src/config/template.rs b/clients/client-core/src/config/template.rs deleted file mode 100644 index fbe0f404c24..00000000000 --- a/clients/client-core/src/config/template.rs +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -pub(crate) fn config_template() -> &'static str { - // While using normal toml marshalling would have been way simpler with less overhead, - // I think it's useful to have comments attached to the saved config file to explain behaviour of - // particular fields. - // Note: any changes to the template must be reflected in the appropriate structs in mod.rs. - r#" -# This is a TOML config file. -# For more information, see https://github.com/toml-lang/toml - -##### main base client config options ##### - -[client] -# Human readable ID of this particular client. -id = '{{ client.id }}' - -# URL to the directory server. -directory_server = '{{ client.directory_server }}' - -# Path to file containing private identity key. -private_identity_key_file = '{{ client.private_identity_key_file }}' - -# Path to file containing public identity key. -public_identity_key_file = '{{ client.public_identity_key_file }}' - -# Path to file containing private encryption key. -private_encryption_key_file = '{{ client.private_encryption_key_file }}' - -# Path to file containing public encryption key. -public_encryption_key_file = '{{ client.public_encryption_key_file }}' - -# Full path to file containing reply encryption keys of all reply-SURBs we have ever -# sent but not received back. -reply_encryption_key_store_path = '{{ client.reply_encryption_key_store_path }}' - -##### additional client config options ##### - -# ID of the gateway from which the client should be fetching messages. -gateway_id = '{{ client.gateway_id }}' - -# Address of the gateway listener to which all client requests should be sent. -gateway_listener = '{{ client.gateway_listener }}' - -# A gateway specific, optional, base58 stringified shared key used for -# communication with particular gateway. -gateway_shared_key_file = '{{ client.gateway_shared_key_file }}' - -# Path to file containing key used for encrypting and decrypting the content of an -# acknowledgement so that nobody besides the client knows which packet it refers to. -ack_key_file = '{{ client.ack_key_file }}' - -##### advanced configuration options ##### - -# Absolute path to the home Nym Clients directory. -nym_root_directory = '{{ client.nym_root_directory }}' - - -##### socket config options ##### - -[socket] - -# allowed values are 'WebSocket' or 'None' -socket_type = '{{ socket.socket_type }}' - -# if applicable (for the case of 'WebSocket'), the port on which the client -# will be listening for incoming requests -listening_port = {{ socket.listening_port }} - - -##### logging configuration options ##### - -[logging] - -# TODO - - -##### debug configuration options ##### -# The following options should not be modified unless you know EXACTLY what you are doing -# as if set incorrectly, they may impact your anonymity. - -[debug] - -average_packet_delay = {{ debug.average_packet_delay }} -average_ack_delay = {{ debug.average_ack_delay }} -loop_cover_traffic_average_delay = {{ debug.loop_cover_traffic_average_delay }} -message_sending_average_delay = {{ debug.message_sending_average_delay }} - -"# -} diff --git a/clients/client-core/src/lib.rs b/clients/client-core/src/lib.rs index a557c4a3b9f..9dfb96a5d08 100644 --- a/clients/client-core/src/lib.rs +++ b/clients/client-core/src/lib.rs @@ -1,3 +1,2 @@ -pub mod built_info; pub mod client; pub mod config; diff --git a/clients/native/Cargo.toml b/clients/native/Cargo.toml index 0f5086c9080..602fabdfb82 100644 --- a/clients/native/Cargo.toml +++ b/clients/native/Cargo.toml @@ -1,7 +1,6 @@ [package] -build = "build.rs" name = "nym-client" -version = "0.8.1" +version = "0.9.0" authors = ["Dave Hrycyszyn <futurechimp@users.noreply.github.com>", "Jędrzej Stuczyński <andrew@nymtech.net>"] edition = "2018" @@ -34,17 +33,14 @@ tokio-tungstenite = "0.11.0" # websocket client-core = { path = "../client-core" } config = { path = "../../common/config" } crypto = { path = "../../common/crypto" } -directory-client = { path = "../../common/client-libs/directory-client" } gateway-client = { path = "../../common/client-libs/gateway-client" } gateway-requests = { path = "../../gateway/gateway-requests" } nymsphinx = { path = "../../common/nymsphinx" } pemstore = { path = "../../common/pemstore" } topology = { path = "../../common/topology" } websocket-requests = { path = "websocket-requests" } - -[build-dependencies] -built = "0.4.3" +validator-client = { path = "../../common/client-libs/validator-client" } +version-checker = { path = "../../common/version-checker" } [dev-dependencies] -tempfile = "3.1.0" serde_json = "1.0" # for the "textsend" example \ No newline at end of file diff --git a/clients/native/build.rs b/clients/native/build.rs deleted file mode 100644 index 56d753472cf..00000000000 --- a/clients/native/build.rs +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -use built; - -fn main() { - built::write_built_file().expect("Failed to acquire build-time information"); -} diff --git a/clients/native/examples/js-examples/websocket/package-lock.json b/clients/native/examples/js-examples/websocket/package-lock.json index ecd79961082..7e0bc591518 100644 --- a/clients/native/examples/js-examples/websocket/package-lock.json +++ b/clients/native/examples/js-examples/websocket/package-lock.json @@ -3232,9 +3232,9 @@ } }, "node-forge": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", - "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", "dev": true }, "node-libs-browser": { @@ -4145,12 +4145,12 @@ "dev": true }, "selfsigned": { - "version": "1.10.7", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", - "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", + "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", "dev": true, "requires": { - "node-forge": "0.9.0" + "node-forge": "^0.10.0" } }, "semver": { diff --git a/clients/native/src/built_info.rs b/clients/native/src/built_info.rs deleted file mode 100644 index 38b46d59e64..00000000000 --- a/clients/native/src/built_info.rs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -// The file has been placed there by the build script. -include!(concat!(env!("OUT_DIR"), "/built.rs")); diff --git a/clients/native/src/client/config/mod.rs b/clients/native/src/client/config/mod.rs index 9de9b8ee90f..e86f4aa212a 100644 --- a/clients/native/src/client/config/mod.rs +++ b/clients/native/src/client/config/mod.rs @@ -14,6 +14,7 @@ use crate::client::config::template::config_template; use client_core::config::Config as BaseConfig; +pub use client_core::config::MISSING_VALUE; use config::NymConfig; use serde::{Deserialize, Serialize}; use std::path::PathBuf; @@ -54,10 +55,6 @@ impl NymConfig for Config { config_template() } - fn config_file_name() -> String { - "config.toml".to_string() - } - fn default_root_directory() -> PathBuf { dirs::home_dir() .expect("Failed to evaluate $HOME value") @@ -135,23 +132,3 @@ impl Default for Socket { } } } - -#[cfg(test)] -mod client_config { - use super::*; - - #[test] - fn after_saving_default_config_the_loaded_one_is_identical() { - // need to figure out how to do something similar but without touching the disk - // or the file system at all... - let temp_location = tempfile::tempdir().unwrap().path().join("config.toml"); - let default_config = Config::new("foomp".to_string()); - default_config - .save_to_file(Some(temp_location.clone())) - .unwrap(); - - let loaded_config = Config::load_from_file(Some(temp_location), None).unwrap(); - - assert_eq!(default_config, loaded_config); - } -} diff --git a/clients/native/src/client/config/template.rs b/clients/native/src/client/config/template.rs index fbe0f404c24..792c2ac30be 100644 --- a/clients/native/src/client/config/template.rs +++ b/clients/native/src/client/config/template.rs @@ -24,11 +24,19 @@ pub(crate) fn config_template() -> &'static str { ##### main base client config options ##### [client] +# Version of the client for which this configuration was created. +version = '{{ client.version }}' + # Human readable ID of this particular client. id = '{{ client.id }}' -# URL to the directory server. -directory_server = '{{ client.directory_server }}' +# URL to the validator server for obtaining network topology. +validator_rest_url = '{{ client.validator_rest_url }}' + +# Special mode of the system such that all messages are sent as soon as they are received +# and no cover traffic is generated. If set all message delays are set to 0 and overwriting +# 'Debug' values will have no effect. +vpn_mode = {{ client.vpn_mode }} # Path to file containing private identity key. private_identity_key_file = '{{ client.private_identity_key_file }}' @@ -93,10 +101,10 @@ listening_port = {{ socket.listening_port }} [debug] -average_packet_delay = {{ debug.average_packet_delay }} -average_ack_delay = {{ debug.average_ack_delay }} -loop_cover_traffic_average_delay = {{ debug.loop_cover_traffic_average_delay }} -message_sending_average_delay = {{ debug.message_sending_average_delay }} +average_packet_delay = '{{ debug.average_packet_delay }}' +average_ack_delay = '{{ debug.average_ack_delay }}' +loop_cover_traffic_average_delay = '{{ debug.loop_cover_traffic_average_delay }}' +message_sending_average_delay = '{{ debug.message_sending_average_delay }}' "# } diff --git a/clients/native/src/client/mod.rs b/clients/native/src/client/mod.rs index 9931f36829a..e94d9fe518d 100644 --- a/clients/native/src/client/mod.rs +++ b/clients/native/src/client/mod.rs @@ -20,7 +20,7 @@ use client_core::client::inbound_messages::{ }; use client_core::client::key_manager::KeyManager; use client_core::client::mix_traffic::{ - MixMessageReceiver, MixMessageSender, MixTrafficController, + BatchMixMessageReceiver, BatchMixMessageSender, MixTrafficController, }; use client_core::client::real_messages_control; use client_core::client::real_messages_control::RealMessagesController; @@ -43,6 +43,7 @@ use log::*; use nymsphinx::addressing::clients::Recipient; use nymsphinx::addressing::nodes::NodeIdentity; use nymsphinx::anonymous_replies::ReplySURB; +use nymsphinx::params::PacketMode; use nymsphinx::receiver::ReconstructedMessage; use tokio::runtime::Runtime; @@ -88,7 +89,7 @@ impl NymClient { pub fn as_mix_recipient(&self) -> Recipient { Recipient::new( *self.key_manager.identity_keypair().public_key(), - self.key_manager.encryption_keypair().public_key().clone(), + *self.key_manager.encryption_keypair().public_key(), // TODO: below only works under assumption that gateway address == gateway id // (which currently is true) NodeIdentity::from_base58_string(self.config.get_base().get_gateway_id()).unwrap(), @@ -100,7 +101,7 @@ impl NymClient { fn start_cover_traffic_stream( &self, topology_accessor: TopologyAccessor, - mix_tx: MixMessageSender, + mix_tx: BatchMixMessageSender, ) { info!("Starting loop cover traffic stream..."); // we need to explicitly enter runtime due to "next_delay: time::delay_for(Default::default())" @@ -128,8 +129,14 @@ impl NymClient { reply_key_storage: ReplyKeyStorage, ack_receiver: AcknowledgementReceiver, input_receiver: InputMessageReceiver, - mix_sender: MixMessageSender, + mix_sender: BatchMixMessageSender, ) { + let packet_mode = if self.config.get_base().get_vpn_mode() { + PacketMode::VPN + } else { + PacketMode::Mix + }; + let controller_config = real_messages_control::Config::new( self.key_manager.ack_key(), self.config.get_base().get_ack_wait_multiplier(), @@ -138,6 +145,8 @@ impl NymClient { self.config.get_base().get_message_sending_average_delay(), self.config.get_base().get_average_packet_delay(), self.as_mix_recipient(), + packet_mode, + self.config.get_base().get_vpn_key_reuse_limit(), ); info!("Starting real traffic stream..."); @@ -154,7 +163,8 @@ impl NymClient { reply_key_storage, ) }); - real_messages_controller.start(self.runtime.handle()); + real_messages_controller + .start(self.runtime.handle(), self.config.get_base().get_vpn_mode()); } // buffer controlling all messages fetched from provider @@ -216,7 +226,7 @@ impl NymClient { // the current global view of topology fn start_topology_refresher(&mut self, topology_accessor: TopologyAccessor) { let topology_refresher_config = TopologyRefresherConfig::new( - self.config.get_base().get_directory_server(), + self.config.get_base().get_validator_rest_endpoint(), self.config.get_base().get_topology_refresh_rate(), ); let mut topology_refresher = @@ -225,7 +235,7 @@ impl NymClient { // components depending on topology would see a non-empty view info!( "Obtaining initial network topology from {}", - self.config.get_base().get_directory_server() + self.config.get_base().get_validator_rest_endpoint() ); self.runtime.block_on(topology_refresher.refresh()); @@ -250,7 +260,7 @@ impl NymClient { // requests? fn start_mix_traffic_controller( &mut self, - mix_rx: MixMessageReceiver, + mix_rx: BatchMixMessageReceiver, gateway_client: GatewayClient, ) { info!("Starting mix traffic controller..."); @@ -378,7 +388,10 @@ impl NymClient { input_receiver, sphinx_message_sender.clone(), ); - self.start_cover_traffic_stream(shared_topology_accessor, sphinx_message_sender); + + if !self.config.get_base().get_vpn_mode() { + self.start_cover_traffic_stream(shared_topology_accessor, sphinx_message_sender); + } match self.config.get_socket_type() { SocketType::WebSocket => { diff --git a/clients/native/src/commands/init.rs b/clients/native/src/commands/init.rs index 56aeb628a1d..2a17b38c765 100644 --- a/clients/native/src/commands/init.rs +++ b/clients/native/src/commands/init.rs @@ -12,7 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::built_info; use crate::client::config::Config; use crate::commands::override_config; use clap::{App, Arg, ArgMatches}; @@ -20,21 +19,14 @@ use client_core::client::key_manager::KeyManager; use client_core::config::persistence::key_pathfinder::ClientKeyPathfinder; use config::NymConfig; use crypto::asymmetric::identity; -use directory_client::DirectoryClient; use gateway_client::GatewayClient; use gateway_requests::registration::handshake::SharedKeys; use rand::rngs::OsRng; use rand::seq::SliceRandom; -use std::convert::TryInto; use std::sync::Arc; use std::time::Duration; use topology::{gateway, NymTopology}; -const GOOD_GATEWAYS: [&str; 2] = [ - "D6YaMzLSY7mANtSQRKXsmMZpqgqiVkeiagKM4V4oFPFr", - "5nrYxPR8gt2Gzo2BbHtsGf66KAEQY91WmM1eW78EphNy", -]; - pub fn command_args<'a, 'b>() -> clap::App<'a, 'b> { App::new("init") .about("Initialise a Nym client. Do this first!") @@ -49,9 +41,9 @@ pub fn command_args<'a, 'b>() -> clap::App<'a, 'b> { .help("Id of the gateway we are going to connect to.") .takes_value(true) ) - .arg(Arg::with_name("directory") - .long("directory") - .help("Address of the directory server the client is getting topology from") + .arg(Arg::with_name("validator") + .long("validator") + .help("Address of the validator server the client is getting topology from") .takes_value(true), ) .arg(Arg::with_name("disable-socket") @@ -64,6 +56,17 @@ pub fn command_args<'a, 'b>() -> clap::App<'a, 'b> { .help("Port for the socket (if applicable) to listen on in all subsequent runs") .takes_value(true) ) + .arg(Arg::with_name("vpn-mode") + .long("vpn-mode") + .help("Set the vpn mode of the client") + .long_help( + r#" + Special mode of the system such that all messages are sent as soon as they are received + and no cover traffic is generated. If set all message delays are set to 0 and overwriting + 'Debug' values will have no effect. + "# + ) + ) .arg(Arg::with_name("fastmode") .long("fastmode") .hidden(true) // this will prevent this flag from being displayed in `--help` @@ -92,28 +95,30 @@ async fn register_with_gateway( .expect("failed to register with the gateway!") } -async fn gateway_details(directory_server: &str, gateway_id: &str) -> gateway::Node { - let directory_client_config = directory_client::Config::new(directory_server.to_string()); - let directory_client = directory_client::Client::new(directory_client_config); - let topology = directory_client.get_topology().await.unwrap(); - let nym_topology: NymTopology = topology.try_into().expect("Invalid topology data!"); - let version_filtered_topology = nym_topology.filter_system_version(built_info::PKG_VERSION); - - version_filtered_topology - .gateways() - .iter() - .find(|gateway| gateway.identity_key.to_base58_string() == gateway_id) - .expect(&*format!("no gateway with id {} exists!", gateway_id)) - .clone() -} - -fn select_gateway(arg: Option<&str>) -> &str { - if let Some(gateway_id) = arg { - gateway_id +async fn gateway_details(validator_server: &str, chosen_gateway_id: Option<&str>) -> gateway::Node { + let validator_client_config = validator_client::Config::new(validator_server.to_string()); + let validator_client = validator_client::Client::new(validator_client_config); + let topology = validator_client.get_active_topology().await.unwrap(); + let nym_topology: NymTopology = topology.into(); + let version_filtered_topology = nym_topology.filter_system_version(env!("CARGO_PKG_VERSION")); + + // if we have chosen particular gateway - use it, otherwise choose a random one. + // (remember that in active topology all gateways have at least 100 reputation so should + // be working correctly) + + if let Some(gateway_id) = chosen_gateway_id { + version_filtered_topology + .gateways() + .iter() + .find(|gateway| gateway.identity_key.to_base58_string() == gateway_id) + .expect(&*format!("no gateway with id {} exists!", gateway_id)) + .clone() } else { - // TODO1: this should only be done on testnet - // TODO2: it should probably check if chosen gateway is actually online - GOOD_GATEWAYS.choose(&mut rand::thread_rng()).unwrap() + version_filtered_topology + .gateways() + .choose(&mut rand::thread_rng()) + .expect("there are no gateways on the network!") + .clone() } } @@ -121,7 +126,16 @@ pub fn execute(matches: &ArgMatches) { println!("Initialising client..."); let id = matches.value_of("id").unwrap(); // required for now + + let already_init = if Config::default_config_file_path(id).exists() { + println!("Client \"{}\" was already initialised before! Config information will be overwritten (but keys will be kept)!", id); + true + } else { + false + }; + let mut config = Config::new(id); + let mut rng = OsRng; // TODO: ideally that should be the last thing that's being done to config. @@ -131,33 +145,42 @@ pub fn execute(matches: &ArgMatches) { config.get_base_mut().set_high_default_traffic_volume(); } - // create identity, encryption and ack keys. - let mut key_manager = KeyManager::new(&mut rng); - - let gateway_id = select_gateway(matches.value_of("gateway")); - config.get_base_mut().with_gateway_id(gateway_id); - - let registration_fut = async { - let gate_details = - gateway_details(&config.get_base().get_directory_server(), gateway_id).await; - let shared_keys = - register_with_gateway(&gate_details, key_manager.identity_keypair()).await; - (shared_keys, gate_details.client_listener) - }; - - // TODO: is there perhaps a way to make it work without having to spawn entire runtime? - let mut rt = tokio::runtime::Runtime::new().unwrap(); - let (shared_keys, gateway_listener) = rt.block_on(registration_fut); - config - .get_base_mut() - .with_gateway_listener(gateway_listener); - key_manager.insert_gateway_shared_key(shared_keys); - - let pathfinder = ClientKeyPathfinder::new_from_config(config.get_base()); - key_manager - .store_keys(&pathfinder) - .expect("Failed to generated keys"); - println!("Saved all generated keys"); + // if client was already initialised, don't generate new keys, not re-register with gateway + // (because this would create new shared key) + if !already_init { + // create identity, encryption and ack keys. + let mut key_manager = KeyManager::new(&mut rng); + + let chosen_gateway_id = matches.value_of("gateway"); + + let registration_fut = async { + let gate_details = gateway_details( + &config.get_base().get_validator_rest_endpoint(), + chosen_gateway_id, + ) + .await; + config + .get_base_mut() + .with_gateway_id(gate_details.identity_key.to_base58_string()); + let shared_keys = + register_with_gateway(&gate_details, key_manager.identity_keypair()).await; + (shared_keys, gate_details.client_listener) + }; + + // TODO: is there perhaps a way to make it work without having to spawn entire runtime? + let mut rt = tokio::runtime::Runtime::new().unwrap(); + let (shared_keys, gateway_listener) = rt.block_on(registration_fut); + config + .get_base_mut() + .with_gateway_listener(gateway_listener); + key_manager.insert_gateway_shared_key(shared_keys); + + let pathfinder = ClientKeyPathfinder::new_from_config(config.get_base()); + key_manager + .store_keys(&pathfinder) + .expect("Failed to generated keys"); + println!("Saved all generated keys"); + } let config_save_location = config.get_config_file_save_location(); config diff --git a/clients/native/src/commands/mod.rs b/clients/native/src/commands/mod.rs index ceb9c81aeaa..6523653c361 100644 --- a/clients/native/src/commands/mod.rs +++ b/clients/native/src/commands/mod.rs @@ -15,12 +15,13 @@ use crate::client::config::{Config, SocketType}; use clap::ArgMatches; -pub mod init; -pub mod run; +pub(crate) mod init; +pub(crate) mod run; +pub(crate) mod upgrade; pub(crate) fn override_config(mut config: Config, matches: &ArgMatches) -> Config { - if let Some(directory) = matches.value_of("directory") { - config.get_base_mut().with_custom_directory(directory); + if let Some(validator) = matches.value_of("validator") { + config.get_base_mut().set_custom_validator(validator); } if let Some(gateway_id) = matches.value_of("gateway") { @@ -31,6 +32,10 @@ pub(crate) fn override_config(mut config: Config, matches: &ArgMatches) -> Confi config = config.with_socket(SocketType::None); } + if matches.is_present("vpn-mode") { + config.get_base_mut().set_vpn_mode(true); + } + if let Some(port) = matches.value_of("port").map(|port| port.parse::<u16>()) { if let Err(err) = port { // if port was overridden, it must be parsable diff --git a/clients/native/src/commands/run.rs b/clients/native/src/commands/run.rs index eb0486f918b..0d08129e8c5 100644 --- a/clients/native/src/commands/run.rs +++ b/clients/native/src/commands/run.rs @@ -17,6 +17,8 @@ use crate::client::NymClient; use crate::commands::override_config; use clap::{App, Arg, ArgMatches}; use config::NymConfig; +use log::*; +use version_checker::is_minor_version_compatible; pub fn command_args<'a, 'b>() -> clap::App<'a, 'b> { App::new("run") @@ -28,14 +30,9 @@ pub fn command_args<'a, 'b>() -> clap::App<'a, 'b> { .required(true) ) // the rest of arguments are optional, they are used to override settings in config file - .arg(Arg::with_name("config") - .long("config") - .help("Custom path to the nym-mixnet-client configuration file") - .takes_value(true) - ) - .arg(Arg::with_name("directory") - .long("directory") - .help("Address of the directory server the client is getting topology from") + .arg(Arg::with_name("validator") + .long("validator") + .help("Address of the validator server the client is getting topology from") .takes_value(true), ) .arg(Arg::with_name("gateway") @@ -47,6 +44,17 @@ pub fn command_args<'a, 'b>() -> clap::App<'a, 'b> { .long("disable-socket") .help("Whether to not start the websocket") ) + .arg(Arg::with_name("vpn-mode") + .long("vpn-mode") + .help("Set the vpn mode of the client") + .long_help( + r#" + Special mode of the system such that all messages are sent as soon as they are received + and no cover traffic is generated. If set all message delays are set to 0 and overwriting + 'Debug' values will have no effect. + "# + ) + ) .arg(Arg::with_name("port") .short("p") .long("port") @@ -55,14 +63,42 @@ pub fn command_args<'a, 'b>() -> clap::App<'a, 'b> { ) } +// this only checks compatibility between config the binary. It does not take into consideration +// network version. It might do so in the future. +fn version_check(cfg: &Config) -> bool { + let binary_version = env!("CARGO_PKG_VERSION"); + let config_version = cfg.get_base().get_version(); + if binary_version != config_version { + warn!("The mixnode binary has different version than what is specified in config file! {} and {}", binary_version, config_version); + if is_minor_version_compatible(binary_version, config_version) { + info!("but they are still semver compatible. However, consider running the `upgrade` command"); + true + } else { + error!("and they are semver incompatible! - please run the `upgrade` command before attempting `run` again"); + false + } + } else { + true + } +} + pub fn execute(matches: &ArgMatches) { let id = matches.value_of("id").unwrap(); - let mut config = - Config::load_from_file(matches.value_of("config").map(|path| path.into()), Some(id)) - .expect("Failed to load config file"); + let mut config = match Config::load_from_file(id) { + Ok(cfg) => cfg, + Err(err) => { + error!("Failed to load config for {}. Are you sure you have run `init` before? (Error was: {})", id, err); + return; + } + }; config = override_config(config, matches); + if !version_check(&config) { + error!("failed the local version check"); + return; + } + NymClient::new(config).run_forever(); } diff --git a/clients/native/src/commands/upgrade.rs b/clients/native/src/commands/upgrade.rs new file mode 100644 index 00000000000..4ea784c6b2f --- /dev/null +++ b/clients/native/src/commands/upgrade.rs @@ -0,0 +1,187 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +use crate::client::config::{Config, MISSING_VALUE}; +use clap::{App, Arg, ArgMatches}; +use client_core::config::DEFAULT_VALIDATOR_REST_ENDPOINT; +use config::NymConfig; +use std::fmt::Display; +use std::process; +use version_checker::{parse_version, Version}; + +fn print_start_upgrade<D1: Display, D2: Display>(from: D1, to: D2) { + println!( + "\n==================\nTrying to upgrade mixnode from {} to {} ...", + from, to + ); +} + +fn print_failed_upgrade<D1: Display, D2: Display>(from: D1, to: D2) { + eprintln!( + "Upgrade from {} to {} failed!\n==================\n", + from, to + ); +} + +fn print_successful_upgrade<D1: Display, D2: Display>(from: D1, to: D2) { + println!( + "Upgrade from {} to {} was successful!\n==================\n", + from, to + ); +} + +fn pre_090_upgrade(from: &str, mut config: Config) -> Config { + // this is not extracted to separate function as you only have to manually pass version + // if upgrading from pre090 version + let from = match from.strip_prefix("v") { + Some(stripped) => stripped, + None => from, + }; + + let from = match from.strip_prefix("V") { + Some(stripped) => stripped, + None => from, + }; + + let from_version = parse_version(from).expect("invalid version provided!"); + if from_version.major == 0 && from_version.minor < 8 { + // technically this could be implemented, but is there any point in that? + eprintln!("upgrading node from before v0.8.0 is not supported. Please run `init` with new binary instead"); + process::exit(1) + } + + if (from_version.major == 0 && from_version.minor >= 9) || from_version.major >= 1 { + eprintln!("self reported version is higher than 0.9.0. Those releases should have already contained version numbers in config! Make sure you provided correct version"); + process::exit(1) + } + + // note: current is guaranteed to not have any `build` information suffix (nor pre-release + // information), as this was asserted at the beginning of this command) + // + // upgrade to current (if it's a 0.9.X) or try to upgrade to 0.9.0 as an intermediate + // step in future upgrades (so, for example, we might go 0.8.0 -> 0.9.0 -> 0.10.0) + // this way we don't need to have all the crazy paths on how to upgrade from any version to any + // other version. We just upgrade one minor version at a time. + let current = Version::parse(env!("CARGO_PKG_VERSION")).unwrap(); + let to_version = if current.major == 0 && current.minor == 9 { + current + } else { + Version::new(0, 9, 0) + }; + + if config.get_base().get_validator_rest_endpoint() != MISSING_VALUE { + eprintln!("existing config seems to have specified new validator rest endpoint which was only introduced in 0.9.0! Can't perform upgrade."); + print_failed_upgrade(&from_version, &to_version); + process::exit(1); + } + + print_start_upgrade(&from_version, &to_version); + + config + .get_base_mut() + .set_custom_version(to_version.to_string().as_ref()); + + println!( + "Setting validator REST endpoint to to {}", + DEFAULT_VALIDATOR_REST_ENDPOINT + ); + + config + .get_base_mut() + .set_custom_validator(DEFAULT_VALIDATOR_REST_ENDPOINT); + + config.save_to_file(None).unwrap_or_else(|err| { + eprintln!("failed to overwrite config file! - {:?}", err); + print_failed_upgrade(&from_version, &to_version); + process::exit(1); + }); + + print_successful_upgrade(from_version, to_version); + + config +} + +pub fn command_args<'a, 'b>() -> App<'a, 'b> { + App::new("upgrade").about("Try to upgrade the mixnode") + .arg( + Arg::with_name("id") + .long("id") + .help("Id of the nym-client we want to upgrade") + .takes_value(true) + .required(true), + ) + // the rest of arguments depend on the upgrade path + .arg(Arg::with_name("current version") + .long("current-version") + .help("REQUIRED FOR PRE-0.9.0 UPGRADES. Specifies current version of the configuration file to help to determine a valid upgrade path. Valid formats include '0.8.1', 'v0.8.1' or 'V0.8.1'") + .takes_value(true) + ) +} + +pub fn execute(matches: &ArgMatches) { + let current = Version::parse(env!("CARGO_PKG_VERSION")).unwrap(); + + // technically this is not a correct way of checking it as a released version might contain valid build identifiers + // however, we are not using them ourselves at the moment and hence it should be fine. + // if we change our mind, we could easily tweak this code + if current.is_prerelease() || !current.build.is_empty() { + eprintln!( + "Trying to upgrade to a non-released version {}. This is not supported!", + current + ); + process::exit(1) + } + + let id = matches.value_of("id").unwrap(); + + let mut existing_config = Config::load_from_file(id).unwrap_or_else(|err| { + eprintln!("failed to load existing config file! - {:?}", err); + process::exit(1) + }); + + // versions fields were added in 0.9.0 + if existing_config.get_base().get_version() == MISSING_VALUE { + let self_reported_version = matches.value_of("current version").unwrap_or_else(|| { + eprintln!( + "trying to upgrade from pre v0.9.0 without providing current system version!" + ); + process::exit(1) + }); + + // upgrades up to 0.9.0 + existing_config = pre_090_upgrade(self_reported_version, existing_config); + } + + let config_version = + Version::parse(existing_config.get_base().get_version()).unwrap_or_else(|err| { + eprintln!("failed to parse node version! - {:?}", err); + process::exit(1) + }); + + if config_version.is_prerelease() || !config_version.build.is_empty() { + eprintln!( + "Trying to upgrade to from non-released version {}. This is not supported!", + current + ); + process::exit(1) + } + + // here be upgrade path to 0.10.0 and beyond based on version number from config + if config_version == current { + println!("You're using the most recent version!"); + } else { + eprintln!("Cannot perform upgrade from {} to {}. Please let the developers know about this issue!", config_version, current); + process::exit(1) + } +} diff --git a/clients/native/src/lib.rs b/clients/native/src/lib.rs index 0934a2e435c..c38ba575666 100644 --- a/clients/native/src/lib.rs +++ b/clients/native/src/lib.rs @@ -12,6 +12,5 @@ // See the License for the specific language governing permissions and // limitations under the License. -pub mod built_info; pub mod client; pub mod websocket; diff --git a/clients/native/src/main.rs b/clients/native/src/main.rs index 04e74a88c3d..a59fd482393 100644 --- a/clients/native/src/main.rs +++ b/clients/native/src/main.rs @@ -14,7 +14,6 @@ use clap::{App, ArgMatches}; -pub mod built_info; pub mod client; pub mod commands; pub mod websocket; @@ -25,11 +24,12 @@ fn main() { println!("{}", banner()); let arg_matches = App::new("Nym Client") - .version(built_info::PKG_VERSION) + .version(env!("CARGO_PKG_VERSION")) .author("Nymtech") .about("Implementation of the Nym Client") .subcommand(commands::init::command_args()) .subcommand(commands::run::command_args()) + .subcommand(commands::upgrade::command_args()) .get_matches(); execute(arg_matches); @@ -39,6 +39,7 @@ fn execute(matches: ArgMatches) { match matches.subcommand() { ("init", Some(m)) => commands::init::execute(m), ("run", Some(m)) => commands::run::execute(m), + ("upgrade", Some(m)) => commands::upgrade::execute(m), _ => println!("{}", usage()), } } @@ -60,7 +61,7 @@ fn banner() -> String { (client - version {:}) "#, - built_info::PKG_VERSION + env!("CARGO_PKG_VERSION") ) } diff --git a/clients/native/src/websocket/handler.rs b/clients/native/src/websocket/handler.rs index f47383fe858..44fe122bacf 100644 --- a/clients/native/src/websocket/handler.rs +++ b/clients/native/src/websocket/handler.rs @@ -57,7 +57,7 @@ impl Clone for Handler { Handler { msg_input: self.msg_input.clone(), buffer_requester: self.buffer_requester.clone(), - self_full_address: self.self_full_address.clone(), + self_full_address: self.self_full_address, socket: None, received_response_type: Default::default(), } @@ -112,7 +112,7 @@ impl Handler { } fn handle_self_address(&self) -> ServerResponse { - ServerResponse::SelfAddress(self.self_full_address.clone()) + ServerResponse::SelfAddress(self.self_full_address) } fn handle_request(&mut self, request: ClientRequest) -> Option<ServerResponse> { diff --git a/clients/native/src/websocket/listener.rs b/clients/native/src/websocket/listener.rs index 170fbaa52ca..0d0b99ad60e 100644 --- a/clients/native/src/websocket/listener.rs +++ b/clients/native/src/websocket/listener.rs @@ -28,10 +28,7 @@ enum State { impl State { fn is_connected(&self) -> bool { - match self { - State::Connected => true, - _ => false, - } + matches!(self, State::Connected) } } diff --git a/clients/native/websocket-requests/src/requests.rs b/clients/native/websocket-requests/src/requests.rs index 27159f1f1ac..49bdb139e93 100644 --- a/clients/native/websocket-requests/src/requests.rs +++ b/clients/native/websocket-requests/src/requests.rs @@ -288,7 +288,7 @@ mod tests { let recipient_string = recipient.to_string(); let send_request_no_surb = ClientRequest::Send { - recipient: recipient.clone(), + recipient, message: b"foomp".to_vec(), with_reply_surb: false, }; diff --git a/clients/native/websocket-requests/src/responses.rs b/clients/native/websocket-requests/src/responses.rs index 235ddf91891..c47f8dcd999 100644 --- a/clients/native/websocket-requests/src/responses.rs +++ b/clients/native/websocket-requests/src/responses.rs @@ -310,12 +310,10 @@ impl ServerResponse { RECEIVED_RESPONSE_TAG => Self::deserialize_received(b), SELF_ADDRESS_RESPONSE_TAG => Self::deserialize_self_address(b), ERROR_RESPONSE_TAG => Self::deserialize_error(b), - n => { - return Err(error::Error::new( - ErrorKind::UnknownResponse, - format!("type {}", n), - )) - } + n => Err(error::Error::new( + ErrorKind::UnknownResponse, + format!("type {}", n), + )), } } diff --git a/clients/socks5/Cargo.toml b/clients/socks5/Cargo.toml index 9bfed2c0359..8746321f358 100644 --- a/clients/socks5/Cargo.toml +++ b/clients/socks5/Cargo.toml @@ -1,7 +1,6 @@ [package] -build = "build.rs" name = "nym-socks5-client" -version = "0.8.1" +version = "0.9.0" authors = ["Dave Hrycyszyn <futurechimp@users.noreply.github.com>"] edition = "2018" @@ -26,7 +25,6 @@ tokio = { version = "0.2", features = ["rt-threaded"] } client-core = { path = "../client-core" } config = { path = "../../common/config" } crypto = { path = "../../common/crypto" } -directory-client = { path = "../../common/client-libs/directory-client" } gateway-client = { path = "../../common/client-libs/gateway-client" } gateway-requests = { path = "../../gateway/gateway-requests" } nymsphinx = { path = "../../common/nymsphinx" } @@ -34,9 +32,5 @@ ordered-buffer = {path = "../../common/socks5/ordered-buffer"} socks5-requests = { path = "../../common/socks5/requests" } topology = { path = "../../common/topology" } proxy-helpers = { path = "../../common/socks5/proxy-helpers" } - -[build-dependencies] -built = "0.4.3" - -[dev-dependencies] -tempfile = "3.1.0" \ No newline at end of file +validator-client = { path = "../../common/client-libs/validator-client" } +version-checker = { path = "../../common/version-checker" } diff --git a/clients/socks5/build.rs b/clients/socks5/build.rs deleted file mode 100644 index 56d753472cf..00000000000 --- a/clients/socks5/build.rs +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -use built; - -fn main() { - built::write_built_file().expect("Failed to acquire build-time information"); -} diff --git a/clients/socks5/src/built_info.rs b/clients/socks5/src/built_info.rs deleted file mode 100644 index 38b46d59e64..00000000000 --- a/clients/socks5/src/built_info.rs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -// The file has been placed there by the build script. -include!(concat!(env!("OUT_DIR"), "/built.rs")); diff --git a/clients/socks5/src/client/config/mod.rs b/clients/socks5/src/client/config/mod.rs index 6779ade2306..705c7615f89 100644 --- a/clients/socks5/src/client/config/mod.rs +++ b/clients/socks5/src/client/config/mod.rs @@ -14,6 +14,7 @@ use crate::client::config::template::config_template; use client_core::config::Config as BaseConfig; +pub use client_core::config::MISSING_VALUE; use config::NymConfig; use nymsphinx::addressing::clients::Recipient; use serde::{Deserialize, Serialize}; @@ -37,10 +38,6 @@ impl NymConfig for Config { config_template() } - fn config_file_name() -> String { - "config.toml".to_string() - } - fn default_root_directory() -> PathBuf { dirs::home_dir() .expect("Failed to evaluate $HOME value") @@ -131,24 +128,3 @@ impl Default for Socks5 { } } } - -#[cfg(test)] -mod client_config { - use super::*; - - #[test] - fn after_saving_default_config_the_loaded_one_is_identical() { - // need to figure out how to do something similar but without touching the disk - // or the file system at all... - let temp_location = tempfile::tempdir().unwrap().path().join("config.toml"); - let fake_address = "CytBseW6yFXUMzz4SGAKdNLGR7q3sJLLYxyBGvutNEQV.4QXYyEVc5fUDjmmi8PrHN9tdUFV4PCvSJE1278cHyvoe@FioFa8nMmPpQnYi7JyojoTuwGLeyNS8BF4ChPr29zUML"; - let default_config = Config::new("foomp", fake_address); - default_config - .save_to_file(Some(temp_location.clone())) - .unwrap(); - - let loaded_config = Config::load_from_file(Some(temp_location), None).unwrap(); - - assert_eq!(default_config, loaded_config); - } -} diff --git a/clients/socks5/src/client/config/template.rs b/clients/socks5/src/client/config/template.rs index 80861a7bc43..939aa5da4e1 100644 --- a/clients/socks5/src/client/config/template.rs +++ b/clients/socks5/src/client/config/template.rs @@ -24,11 +24,19 @@ pub(crate) fn config_template() -> &'static str { ##### main base client config options ##### [client] +# Version of the client for which this configuration was created. +version = '{{ client.version }}' + # Human readable ID of this particular client. id = '{{ client.id }}' -# URL to the directory server. -directory_server = '{{ client.directory_server }}' +# URL to the validator server for obtaining network topology. +validator_rest_url = '{{ client.validator_rest_url }}' + +# Special mode of the system such that all messages are sent as soon as they are received +# and no cover traffic is generated. If set all message delays are set to 0 and overwriting +# 'Debug' values will have no effect. +vpn_mode = {{ client.vpn_mode }} # Path to file containing private identity key. private_identity_key_file = '{{ client.private_identity_key_file }}' @@ -92,10 +100,10 @@ listening_port = {{ socks5.listening_port }} [debug] -average_packet_delay = {{ debug.average_packet_delay }} -average_ack_delay = {{ debug.average_ack_delay }} -loop_cover_traffic_average_delay = {{ debug.loop_cover_traffic_average_delay }} -message_sending_average_delay = {{ debug.message_sending_average_delay }} +average_packet_delay = '{{ debug.average_packet_delay }}' +average_ack_delay = '{{ debug.average_ack_delay }}' +loop_cover_traffic_average_delay = '{{ debug.loop_cover_traffic_average_delay }}' +message_sending_average_delay = '{{ debug.message_sending_average_delay }}' "# } diff --git a/clients/socks5/src/client/mod.rs b/clients/socks5/src/client/mod.rs index 727752a160b..982f1feab78 100644 --- a/clients/socks5/src/client/mod.rs +++ b/clients/socks5/src/client/mod.rs @@ -23,7 +23,7 @@ use client_core::client::inbound_messages::{ }; use client_core::client::key_manager::KeyManager; use client_core::client::mix_traffic::{ - MixMessageReceiver, MixMessageSender, MixTrafficController, + BatchMixMessageReceiver, BatchMixMessageSender, MixTrafficController, }; use client_core::client::real_messages_control::RealMessagesController; use client_core::client::received_buffer::{ @@ -43,6 +43,7 @@ use gateway_client::{ use log::*; use nymsphinx::addressing::clients::Recipient; use nymsphinx::addressing::nodes::NodeIdentity; +use nymsphinx::params::PacketMode; use tokio::runtime::Runtime; pub(crate) mod config; @@ -76,7 +77,7 @@ impl NymClient { pub fn as_mix_recipient(&self) -> Recipient { Recipient::new( *self.key_manager.identity_keypair().public_key(), - self.key_manager.encryption_keypair().public_key().clone(), + *self.key_manager.encryption_keypair().public_key(), // TODO: below only works under assumption that gateway address == gateway id // (which currently is true) NodeIdentity::from_base58_string(self.config.get_base().get_gateway_id()).unwrap(), @@ -88,7 +89,7 @@ impl NymClient { fn start_cover_traffic_stream( &self, topology_accessor: TopologyAccessor, - mix_tx: MixMessageSender, + mix_tx: BatchMixMessageSender, ) { info!("Starting loop cover traffic stream..."); // we need to explicitly enter runtime due to "next_delay: time::delay_for(Default::default())" @@ -116,8 +117,14 @@ impl NymClient { reply_key_storage: ReplyKeyStorage, ack_receiver: AcknowledgementReceiver, input_receiver: InputMessageReceiver, - mix_sender: MixMessageSender, + mix_sender: BatchMixMessageSender, ) { + let packet_mode = if self.config.get_base().get_vpn_mode() { + PacketMode::VPN + } else { + PacketMode::Mix + }; + let controller_config = client_core::client::real_messages_control::Config::new( self.key_manager.ack_key(), self.config.get_base().get_ack_wait_multiplier(), @@ -126,6 +133,8 @@ impl NymClient { self.config.get_base().get_message_sending_average_delay(), self.config.get_base().get_average_packet_delay(), self.as_mix_recipient(), + packet_mode, + self.config.get_base().get_vpn_key_reuse_limit(), ); info!("Starting real traffic stream..."); @@ -142,7 +151,8 @@ impl NymClient { reply_key_storage, ) }); - real_messages_controller.start(self.runtime.handle()); + real_messages_controller + .start(self.runtime.handle(), self.config.get_base().get_vpn_mode()); } // buffer controlling all messages fetched from provider @@ -204,7 +214,7 @@ impl NymClient { // the current global view of topology fn start_topology_refresher(&mut self, topology_accessor: TopologyAccessor) { let topology_refresher_config = TopologyRefresherConfig::new( - self.config.get_base().get_directory_server(), + self.config.get_base().get_validator_rest_endpoint(), self.config.get_base().get_topology_refresh_rate(), ); let mut topology_refresher = @@ -213,7 +223,7 @@ impl NymClient { // components depending on topology would see a non-empty view info!( "Obtaining initial network topology from {}", - self.config.get_base().get_directory_server() + self.config.get_base().get_validator_rest_endpoint() ); self.runtime.block_on(topology_refresher.refresh()); @@ -238,7 +248,7 @@ impl NymClient { // requests? fn start_mix_traffic_controller( &mut self, - mix_rx: MixMessageReceiver, + mix_rx: BatchMixMessageReceiver, gateway_client: GatewayClient, ) { info!("Starting mix traffic controller..."); @@ -330,7 +340,9 @@ impl NymClient { input_receiver, sphinx_message_sender.clone(), ); - self.start_cover_traffic_stream(shared_topology_accessor, sphinx_message_sender); + if !self.config.get_base().get_vpn_mode() { + self.start_cover_traffic_stream(shared_topology_accessor, sphinx_message_sender); + } self.start_socks5_listener(received_buffer_request_sender, input_sender); info!("Client startup finished!"); diff --git a/clients/socks5/src/commands/init.rs b/clients/socks5/src/commands/init.rs index a22b5bfc85b..54436ec8f5b 100644 --- a/clients/socks5/src/commands/init.rs +++ b/clients/socks5/src/commands/init.rs @@ -12,7 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::built_info; use crate::client::config::Config; use crate::commands::override_config; use clap::{App, Arg, ArgMatches}; @@ -20,20 +19,13 @@ use client_core::client::key_manager::KeyManager; use client_core::config::persistence::key_pathfinder::ClientKeyPathfinder; use config::NymConfig; use crypto::asymmetric::identity; -use directory_client::DirectoryClient; use gateway_client::GatewayClient; use gateway_requests::registration::handshake::SharedKeys; use rand::{prelude::SliceRandom, rngs::OsRng}; -use std::convert::TryInto; use std::sync::Arc; use std::time::Duration; use topology::{gateway, NymTopology}; -const GOOD_GATEWAYS: [&str; 2] = [ - "D6YaMzLSY7mANtSQRKXsmMZpqgqiVkeiagKM4V4oFPFr", - "5nrYxPR8gt2Gzo2BbHtsGf66KAEQY91WmM1eW78EphNy", -]; - pub fn command_args<'a, 'b>() -> clap::App<'a, 'b> { App::new("init") .about("Initialise a Nym client. Do this first!") @@ -54,9 +46,9 @@ pub fn command_args<'a, 'b>() -> clap::App<'a, 'b> { .help("Id of the gateway we are going to connect to.") .takes_value(true) ) - .arg(Arg::with_name("directory") - .long("directory") - .help("Address of the directory server the client is getting topology from") + .arg(Arg::with_name("validator") + .long("validator") + .help("Address of the validator server the client is getting topology from") .takes_value(true), ) .arg(Arg::with_name("port") @@ -65,6 +57,17 @@ pub fn command_args<'a, 'b>() -> clap::App<'a, 'b> { .help("Port for the socket to listen on in all subsequent runs") .takes_value(true) ) + .arg(Arg::with_name("vpn-mode") + .long("vpn-mode") + .help("Set the vpn mode of the client") + .long_help( + r#" + Special mode of the system such that all messages are sent as soon as they are received + and no cover traffic is generated. If set all message delays are set to 0 and overwriting + 'Debug' values will have no effect. + "# + ) + ) .arg(Arg::with_name("fastmode") .long("fastmode") .hidden(true) // this will prevent this flag from being displayed in `--help` @@ -93,28 +96,30 @@ async fn register_with_gateway( .expect("failed to register with the gateway!") } -async fn gateway_details(directory_server: &str, gateway_id: &str) -> gateway::Node { - let directory_client_config = directory_client::Config::new(directory_server.to_string()); - let directory_client = directory_client::Client::new(directory_client_config); - let topology = directory_client.get_topology().await.unwrap(); - let nym_topology: NymTopology = topology.try_into().expect("Invalid topology data!"); - let version_filtered_topology = nym_topology.filter_system_version(built_info::PKG_VERSION); - - version_filtered_topology - .gateways() - .iter() - .find(|gateway| gateway.identity_key.to_base58_string() == gateway_id) - .expect(&*format!("no gateway with id {} exists!", gateway_id)) - .clone() -} - -fn select_gateway(arg: Option<&str>) -> &str { - if let Some(gateway_id) = arg { - gateway_id +async fn gateway_details(validator_server: &str, chosen_gateway_id: Option<&str>) -> gateway::Node { + let validator_client_config = validator_client::Config::new(validator_server.to_string()); + let validator_client = validator_client::Client::new(validator_client_config); + let topology = validator_client.get_active_topology().await.unwrap(); + let nym_topology: NymTopology = topology.into(); + let version_filtered_topology = nym_topology.filter_system_version(env!("CARGO_PKG_VERSION")); + + // if we have chosen particular gateway - use it, otherwise choose a random one. + // (remember that in active topology all gateways have at least 100 reputation so should + // be working correctly) + + if let Some(gateway_id) = chosen_gateway_id { + version_filtered_topology + .gateways() + .iter() + .find(|gateway| gateway.identity_key.to_base58_string() == gateway_id) + .expect(&*format!("no gateway with id {} exists!", gateway_id)) + .clone() } else { - // TODO1: this should only be done on testnet - // TODO2: it should probably check if chosen gateway is actually online - GOOD_GATEWAYS.choose(&mut rand::thread_rng()).unwrap() + version_filtered_topology + .gateways() + .choose(&mut rand::thread_rng()) + .expect("there are no gateways on the network!") + .clone() } } @@ -124,7 +129,15 @@ pub fn execute(matches: &ArgMatches) { let id = matches.value_of("id").unwrap(); // required for now let provider_address = matches.value_of("provider").unwrap(); + let already_init = if Config::default_config_file_path(id).exists() { + println!("Socks5 client \"{}\" was already initialised before! Config information will be overwritten (but keys will be kept)!", id); + true + } else { + false + }; + let mut config = Config::new(id, provider_address); + let mut rng = OsRng; // TODO: ideally that should be the last thing that's being done to config. @@ -134,33 +147,42 @@ pub fn execute(matches: &ArgMatches) { config.get_base_mut().set_high_default_traffic_volume(); } - // create identity, encryption and ack keys. - let mut key_manager = KeyManager::new(&mut rng); - - let gateway_id = select_gateway(matches.value_of("gateway")); - config.get_base_mut().with_gateway_id(gateway_id); - - let registration_fut = async { - let gate_details = - gateway_details(&config.get_base().get_directory_server(), gateway_id).await; - let shared_keys = - register_with_gateway(&gate_details, key_manager.identity_keypair()).await; - (shared_keys, gate_details.client_listener) - }; - - // TODO: is there perhaps a way to make it work without having to spawn entire runtime? - let mut rt = tokio::runtime::Runtime::new().unwrap(); - let (shared_keys, gateway_listener) = rt.block_on(registration_fut); - config - .get_base_mut() - .with_gateway_listener(gateway_listener); - key_manager.insert_gateway_shared_key(shared_keys); - - let pathfinder = ClientKeyPathfinder::new_from_config(config.get_base()); - key_manager - .store_keys(&pathfinder) - .expect("Failed to generated keys"); - println!("Saved all generated keys"); + // if client was already initialised, don't generate new keys, not re-register with gateway + // (because this would create new shared key) + if !already_init { + // create identity, encryption and ack keys. + let mut key_manager = KeyManager::new(&mut rng); + + let chosen_gateway_id = matches.value_of("gateway"); + + let registration_fut = async { + let gate_details = gateway_details( + &config.get_base().get_validator_rest_endpoint(), + chosen_gateway_id, + ) + .await; + config + .get_base_mut() + .with_gateway_id(gate_details.identity_key.to_base58_string()); + let shared_keys = + register_with_gateway(&gate_details, key_manager.identity_keypair()).await; + (shared_keys, gate_details.client_listener) + }; + + // TODO: is there perhaps a way to make it work without having to spawn entire runtime? + let mut rt = tokio::runtime::Runtime::new().unwrap(); + let (shared_keys, gateway_listener) = rt.block_on(registration_fut); + config + .get_base_mut() + .with_gateway_listener(gateway_listener); + key_manager.insert_gateway_shared_key(shared_keys); + + let pathfinder = ClientKeyPathfinder::new_from_config(config.get_base()); + key_manager + .store_keys(&pathfinder) + .expect("Failed to generated keys"); + println!("Saved all generated keys"); + } let config_save_location = config.get_config_file_save_location(); config diff --git a/clients/socks5/src/commands/mod.rs b/clients/socks5/src/commands/mod.rs index 2906c40d9ed..ef75167f5b4 100644 --- a/clients/socks5/src/commands/mod.rs +++ b/clients/socks5/src/commands/mod.rs @@ -15,18 +15,23 @@ use crate::client::config::Config; use clap::ArgMatches; -pub mod init; -pub mod run; +pub(crate) mod init; +pub(crate) mod run; +pub(crate) mod upgrade; pub(crate) fn override_config(mut config: Config, matches: &ArgMatches) -> Config { - if let Some(directory) = matches.value_of("directory") { - config.get_base_mut().with_custom_directory(directory); + if let Some(validator) = matches.value_of("validator") { + config.get_base_mut().set_custom_validator(validator); } if let Some(gateway_id) = matches.value_of("gateway") { config.get_base_mut().with_gateway_id(gateway_id); } + if matches.is_present("vpn-mode") { + config.get_base_mut().set_vpn_mode(true); + } + if let Some(port) = matches.value_of("port").map(|port| port.parse::<u16>()) { if let Err(err) = port { // if port was overridden, it must be parsable diff --git a/clients/socks5/src/commands/run.rs b/clients/socks5/src/commands/run.rs index f8c9aea11c3..e1f8e840c99 100644 --- a/clients/socks5/src/commands/run.rs +++ b/clients/socks5/src/commands/run.rs @@ -17,6 +17,8 @@ use crate::client::NymClient; use crate::commands::override_config; use clap::{App, Arg, ArgMatches}; use config::NymConfig; +use log::*; +use version_checker::is_minor_version_compatible; pub fn command_args<'a, 'b>() -> clap::App<'a, 'b> { App::new("run") @@ -38,9 +40,9 @@ pub fn command_args<'a, 'b>() -> clap::App<'a, 'b> { .help("Address of the socks5 provider to send messages to.") .takes_value(true) ) - .arg(Arg::with_name("directory") - .long("directory") - .help("Address of the directory server the client is getting topology from") + .arg(Arg::with_name("validator") + .long("validator") + .help("Address of the validator server the client is getting topology from") .takes_value(true), ) .arg(Arg::with_name("gateway") @@ -48,6 +50,17 @@ pub fn command_args<'a, 'b>() -> clap::App<'a, 'b> { .help("Id of the gateway we want to connect to. If overridden, it is user's responsibility to ensure prior registration happened") .takes_value(true) ) + .arg(Arg::with_name("vpn-mode") + .long("vpn-mode") + .help("Set the vpn mode of the client") + .long_help( + r#" + Special mode of the system such that all messages are sent as soon as they are received + and no cover traffic is generated. If set all message delays are set to 0 and overwriting + 'Debug' values will have no effect. + "# + ) + ) .arg(Arg::with_name("port") .short("p") .long("port") @@ -56,14 +69,42 @@ pub fn command_args<'a, 'b>() -> clap::App<'a, 'b> { ) } +// this only checks compatibility between config the binary. It does not take into consideration +// network version. It might do so in the future. +fn version_check(cfg: &Config) -> bool { + let binary_version = env!("CARGO_PKG_VERSION"); + let config_version = cfg.get_base().get_version(); + if binary_version != config_version { + warn!("The mixnode binary has different version than what is specified in config file! {} and {}", binary_version, config_version); + if is_minor_version_compatible(binary_version, config_version) { + info!("but they are still semver compatible. However, consider running the `upgrade` command"); + true + } else { + error!("and they are semver incompatible! - please run the `upgrade` command before attempting `run` again"); + false + } + } else { + true + } +} + pub fn execute(matches: &ArgMatches) { let id = matches.value_of("id").unwrap(); - let mut config = - Config::load_from_file(matches.value_of("config").map(|path| path.into()), Some(id)) - .expect("Failed to load config file"); + let mut config = match Config::load_from_file(id) { + Ok(cfg) => cfg, + Err(err) => { + error!("Failed to load config for {}. Are you sure you have run `init` before? (Error was: {})", id, err); + return; + } + }; config = override_config(config, matches); + if !version_check(&config) { + error!("failed the local version check"); + return; + } + NymClient::new(config).run_forever(); } diff --git a/clients/socks5/src/commands/upgrade.rs b/clients/socks5/src/commands/upgrade.rs new file mode 100644 index 00000000000..6d44227286a --- /dev/null +++ b/clients/socks5/src/commands/upgrade.rs @@ -0,0 +1,187 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +use crate::client::config::{Config, MISSING_VALUE}; +use clap::{App, Arg, ArgMatches}; +use client_core::config::DEFAULT_VALIDATOR_REST_ENDPOINT; +use config::NymConfig; +use std::fmt::Display; +use std::process; +use version_checker::{parse_version, Version}; + +fn print_start_upgrade<D1: Display, D2: Display>(from: D1, to: D2) { + println!( + "\n==================\nTrying to upgrade mixnode from {} to {} ...", + from, to + ); +} + +fn print_failed_upgrade<D1: Display, D2: Display>(from: D1, to: D2) { + eprintln!( + "Upgrade from {} to {} failed!\n==================\n", + from, to + ); +} + +fn print_successful_upgrade<D1: Display, D2: Display>(from: D1, to: D2) { + println!( + "Upgrade from {} to {} was successful!\n==================\n", + from, to + ); +} + +fn pre_090_upgrade(from: &str, mut config: Config) -> Config { + // this is not extracted to separate function as you only have to manually pass version + // if upgrading from pre090 version + let from = match from.strip_prefix("v") { + Some(stripped) => stripped, + None => from, + }; + + let from = match from.strip_prefix("V") { + Some(stripped) => stripped, + None => from, + }; + + let from_version = parse_version(from).expect("invalid version provided!"); + if from_version.major == 0 && from_version.minor < 8 { + // technically this could be implemented, but is there any point in that? + eprintln!("upgrading node from before v0.8.0 is not supported. Please run `init` with new binary instead"); + process::exit(1) + } + + if (from_version.major == 0 && from_version.minor >= 9) || from_version.major >= 1 { + eprintln!("self reported version is higher than 0.9.0. Those releases should have already contained version numbers in config! Make sure you provided correct version"); + process::exit(1) + } + + // note: current is guaranteed to not have any `build` information suffix (nor pre-release + // information), as this was asserted at the beginning of this command) + // + // upgrade to current (if it's a 0.9.X) or try to upgrade to 0.9.0 as an intermediate + // step in future upgrades (so, for example, we might go 0.8.0 -> 0.9.0 -> 0.10.0) + // this way we don't need to have all the crazy paths on how to upgrade from any version to any + // other version. We just upgrade one minor version at a time. + let current = Version::parse(env!("CARGO_PKG_VERSION")).unwrap(); + let to_version = if current.major == 0 && current.minor == 9 { + current + } else { + Version::new(0, 9, 0) + }; + + if config.get_base().get_validator_rest_endpoint() != MISSING_VALUE { + eprintln!("existing config seems to have specified new validator rest endpoint which was only introduced in 0.9.0! Can't perform upgrade."); + print_failed_upgrade(&from_version, &to_version); + process::exit(1); + } + + print_start_upgrade(&from_version, &to_version); + + config + .get_base_mut() + .set_custom_version(to_version.to_string().as_ref()); + + println!( + "Setting validator REST endpoint to to {}", + DEFAULT_VALIDATOR_REST_ENDPOINT + ); + + config + .get_base_mut() + .set_custom_validator(DEFAULT_VALIDATOR_REST_ENDPOINT); + + config.save_to_file(None).unwrap_or_else(|err| { + eprintln!("failed to overwrite config file! - {:?}", err); + print_failed_upgrade(&from_version, &to_version); + process::exit(1); + }); + + print_successful_upgrade(from_version, to_version); + + config +} + +pub fn command_args<'a, 'b>() -> App<'a, 'b> { + App::new("upgrade").about("Try to upgrade the mixnode") + .arg( + Arg::with_name("id") + .long("id") + .help("Id of the nym-socks5-client we want to upgrade") + .takes_value(true) + .required(true), + ) + // the rest of arguments depend on the upgrade path + .arg(Arg::with_name("current version") + .long("current-version") + .help("REQUIRED FOR PRE-0.9.0 UPGRADES. Specifies current version of the configuration file to help to determine a valid upgrade path. Valid formats include '0.8.1', 'v0.8.1' or 'V0.8.1'") + .takes_value(true) + ) +} + +pub fn execute(matches: &ArgMatches) { + let current = Version::parse(env!("CARGO_PKG_VERSION")).unwrap(); + + // technically this is not a correct way of checking it as a released version might contain valid build identifiers + // however, we are not using them ourselves at the moment and hence it should be fine. + // if we change our mind, we could easily tweak this code + if current.is_prerelease() || !current.build.is_empty() { + eprintln!( + "Trying to upgrade to a non-released version {}. This is not supported!", + current + ); + process::exit(1) + } + + let id = matches.value_of("id").unwrap(); + + let mut existing_config = Config::load_from_file(id).unwrap_or_else(|err| { + eprintln!("failed to load existing config file! - {:?}", err); + process::exit(1) + }); + + // versions fields were added in 0.9.0 + if existing_config.get_base().get_version() == MISSING_VALUE { + let self_reported_version = matches.value_of("current version").unwrap_or_else(|| { + eprintln!( + "trying to upgrade from pre v0.9.0 without providing current system version!" + ); + process::exit(1) + }); + + // upgrades up to 0.9.0 + existing_config = pre_090_upgrade(self_reported_version, existing_config); + } + + let config_version = + Version::parse(existing_config.get_base().get_version()).unwrap_or_else(|err| { + eprintln!("failed to parse node version! - {:?}", err); + process::exit(1) + }); + + if config_version.is_prerelease() || !config_version.build.is_empty() { + eprintln!( + "Trying to upgrade to from non-released version {}. This is not supported!", + current + ); + process::exit(1) + } + + // here be upgrade path to 0.10.0 and beyond based on version number from config + if config_version == current { + println!("You're using the most recent version!"); + } else { + eprintln!("Cannot perform upgrade from {} to {}. Please let the developers know about this issue!", config_version, current); + process::exit(1) + } +} diff --git a/clients/socks5/src/lib.rs b/clients/socks5/src/lib.rs index 694607032aa..c200a3501e2 100644 --- a/clients/socks5/src/lib.rs +++ b/clients/socks5/src/lib.rs @@ -11,6 +11,5 @@ // 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. -pub mod built_info; pub mod client; pub mod socks; diff --git a/clients/socks5/src/main.rs b/clients/socks5/src/main.rs index dfcbc72f156..a04f8ec90da 100644 --- a/clients/socks5/src/main.rs +++ b/clients/socks5/src/main.rs @@ -14,7 +14,6 @@ use clap::{App, ArgMatches}; -pub mod built_info; pub mod client; mod commands; pub mod socks; @@ -25,11 +24,12 @@ fn main() { println!("{}", banner()); let arg_matches = App::new("Nym Socks5 Proxy") - .version(built_info::PKG_VERSION) + .version(env!("CARGO_PKG_VERSION")) .author("Nymtech") .about("A Socks5 localhost proxy that converts incoming messages to Sphinx and sends them to a Nym address") .subcommand(commands::init::command_args()) .subcommand(commands::run::command_args()) + .subcommand(commands::upgrade::command_args()) .get_matches(); execute(arg_matches); @@ -39,6 +39,7 @@ fn execute(matches: ArgMatches) { match matches.subcommand() { ("init", Some(m)) => commands::init::execute(m), ("run", Some(m)) => commands::run::execute(m), + ("upgrade", Some(m)) => commands::upgrade::execute(m), _ => println!("{}", usage()), } } @@ -60,7 +61,7 @@ fn banner() -> String { (socks5 proxy - version {:}) "#, - built_info::PKG_VERSION + env!("CARGO_PKG_VERSION") ) } diff --git a/clients/socks5/src/socks/client.rs b/clients/socks5/src/socks/client.rs index 9e782d30ac8..db17fe56402 100644 --- a/clients/socks5/src/socks/client.rs +++ b/clients/socks5/src/socks/client.rs @@ -10,15 +10,13 @@ use futures::channel::mpsc; use futures::task::{Context, Poll}; use log::*; use nymsphinx::addressing::clients::Recipient; -use ordered_buffer::{OrderedMessageBuffer, OrderedMessageSender}; use pin_project::pin_project; -use proxy_helpers::available_reader::AvailableReader; use proxy_helpers::connection_controller::{ ConnectionReceiver, ControllerCommand, ControllerSender, }; use proxy_helpers::proxy_runner::ProxyRunner; use rand::RngCore; -use socks5_requests::{ConnectionId, Request}; +use socks5_requests::{ConnectionId, RemoteAddress, Request}; use std::net::{Shutdown, SocketAddr}; use std::pin::Pin; use tokio::prelude::*; @@ -145,8 +143,7 @@ pub(crate) struct SocksClient { impl Drop for SocksClient { fn drop(&mut self) { // TODO: decrease to debug/trace - info!("socksclient is going out of scope - the stream is getting dropped!"); - info!("Connection {} is getting closed", self.connection_id); + debug!("Connection {} is getting closed", self.connection_id); self.controller_sender .unbounded_send(ControllerCommand::Remove(self.connection_id)) .unwrap(); @@ -222,26 +219,38 @@ impl SocksClient { Ok(()) } - async fn send_request_to_mixnet(&mut self, request: Request) { - self.send_to_mixnet(request.into_bytes()).await; + async fn send_connect_to_mixnet(&mut self, remote_address: RemoteAddress) { + let req = Request::new_connect( + self.connection_id, + remote_address.clone(), + self.self_address.clone(), + ); + + let input_message = + InputMessage::new_fresh(self.service_provider.clone(), req.into_bytes(), false); + self.input_sender.unbounded_send(input_message).unwrap(); } - async fn run_proxy( - &mut self, - conn_receiver: ConnectionReceiver, - message_sender: OrderedMessageSender, - ) { + async fn run_proxy(&mut self, conn_receiver: ConnectionReceiver, remote_proxy_target: String) { + self.send_connect_to_mixnet(remote_proxy_target.clone()) + .await; + let stream = self.stream.run_proxy(); + let local_stream_remote = stream + .peer_addr() + .expect("failed to extract peer address") + .to_string(); let connection_id = self.connection_id; let input_sender = self.input_sender.clone(); - let recipient = self.service_provider.clone(); + let recipient = self.service_provider; let (stream, _) = ProxyRunner::new( stream, + local_stream_remote, + remote_proxy_target, conn_receiver, input_sender, connection_id, - message_sender, ) .run(move |conn_id, read_data, socket_closed| { let provider_request = Request::new_send(conn_id, read_data, socket_closed); @@ -262,14 +271,9 @@ impl SocksClient { // setup for receiving from the mixnet let (mix_sender, mix_receiver) = mpsc::unbounded(); - let ordered_buffer = OrderedMessageBuffer::new(); self.controller_sender - .unbounded_send(ControllerCommand::Insert( - self.connection_id, - mix_sender, - ordered_buffer, - )) + .unbounded_send(ControllerCommand::Insert(self.connection_id, mix_sender)) .unwrap(); match request.command { @@ -278,26 +282,16 @@ impl SocksClient { trace!("Connecting to: {:?}", remote_address.clone()); self.acknowledge_socks5().await; - let mut message_sender = OrderedMessageSender::new(); - // 'connect' needs to be handled manually due to different structure, - // but still needs to have correct sequence number on it! - - // read whatever we can - let available_reader = AvailableReader::new(&mut self.stream); - let (request_data_bytes, _) = available_reader.await?; - let ordered_message = message_sender.wrap_message(request_data_bytes.to_vec()); - - let socks_provider_request = Request::new_connect( - self.connection_id, + info!( + "Starting proxy for {} (id: {})", remote_address.clone(), - ordered_message, - self.self_address.clone(), + self.connection_id + ); + self.run_proxy(mix_receiver, remote_address.clone()).await; + info!( + "Proxy for {} is finished (id: {})", + remote_address, self.connection_id ); - - self.send_request_to_mixnet(socks_provider_request).await; - info!("Starting proxy for {}", remote_address.clone()); - self.run_proxy(mix_receiver, message_sender).await; - info!("Proxy for {} is finished", remote_address); } SocksCommand::Bind => unimplemented!(), // not handled @@ -307,16 +301,6 @@ impl SocksClient { Ok(()) } - /// Send serialized Socks5 request bytes to the mixnet. The request stream - /// will be chunked up into a series of one or more Sphinx packets and - /// reassembled at the destination service provider at the other end, then - /// sent onwards anonymously. - async fn send_to_mixnet(&self, request_bytes: Vec<u8>) { - let input_message = - InputMessage::new_fresh(self.service_provider.clone(), request_bytes, false); - self.input_sender.unbounded_send(input_message).unwrap(); - } - /// Writes a Socks5 header back to the requesting client's TCP stream, /// basically saying "I acknowledge your request and am dealing with it". async fn acknowledge_socks5(&mut self) { @@ -381,27 +365,12 @@ impl SocksClient { // Username parsing let ulen = header[1]; - - let mut username = Vec::with_capacity(ulen as usize); - - // For some reason the vector needs to actually be full - for _ in 0..ulen { - username.push(0); - } - + let mut username = vec![0; ulen as usize]; self.stream.read_exact(&mut username).await?; // Password Parsing - let mut plen = [0u8; 1]; - self.stream.read_exact(&mut plen).await?; - - let mut password = Vec::with_capacity(plen[0] as usize); - - // For some reason the vector needs to actually be full - for _ in 0..plen[0] { - password.push(0); - } - + let plen = self.stream.read_u8().await?; + let mut password = vec![0; plen as usize]; self.stream.read_exact(&mut password).await?; let username_str = String::from_utf8(username)?; diff --git a/clients/socks5/src/socks/request.rs b/clients/socks5/src/socks/request.rs index d3e4fac6112..5869d0d60d4 100644 --- a/clients/socks5/src/socks/request.rs +++ b/clients/socks5/src/socks/request.rs @@ -1,6 +1,7 @@ use super::types::{AddrType, ResponseCode, SocksProxyError}; use super::{utils as socks_utils, SOCKS_VERSION}; use log::*; +use std::fmt::{self, Display}; use tokio::prelude::*; /// A Socks5 request hitting the proxy. @@ -95,12 +96,14 @@ impl SocksRequest { port, }) } +} +impl Display for SocksRequest { /// Print out the address and port to a String. /// This might return domain:port, ipv6:port, or ipv4:port. - pub(crate) fn to_string(&self) -> String { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let address = socks_utils::pretty_print_addr(&self.addr_type, &self.addr); - format!("{}:{}", address, self.port) + write!(f, "{}:{}", address, self.port) } } diff --git a/clients/socks5/src/socks/server.rs b/clients/socks5/src/socks/server.rs index 6350bed3fec..e222b106a79 100644 --- a/clients/socks5/src/socks/server.rs +++ b/clients/socks5/src/socks/server.rs @@ -72,9 +72,9 @@ impl SphinxSocksServer { stream, self.authenticator.clone(), input_sender.clone(), - self.service_provider.clone(), + self.service_provider, controller_sender.clone(), - self.self_address.clone(), + self.self_address, ); tokio::spawn(async move { diff --git a/clients/webassembly/Cargo.toml b/clients/webassembly/Cargo.toml index db3004b0acc..74bc66287ef 100644 --- a/clients/webassembly/Cargo.toml +++ b/clients/webassembly/Cargo.toml @@ -1,8 +1,7 @@ [package] -build = "build.rs" name = "nym-client-wasm" authors = ["Dave Hrycyszyn <futurechimp@users.noreply.github.com>", "Jedrzej Stuczynski <andrew@nymtech.net>"] -version = "0.8.1" +version = "0.9.0" edition = "2018" keywords = ["nym", "sphinx", "wasm", "webassembly", "privacy", "client"] license = "Apache-2.0" @@ -28,8 +27,8 @@ rand = { version = "0.7.3", features = ["wasm-bindgen"] } crypto = { path = "../../common/crypto" } nymsphinx = { path = "../../common/nymsphinx" } topology = { path = "../../common/topology" } -directory-client = { path = "../../common/client-libs/directory-client" } gateway-client = { path = "../../common/client-libs/gateway-client" } +validator-client = { path = "../../common/client-libs/validator-client" } wasm-utils = { path = "../../common/wasm-utils" } # The `console_error_panic_hook` crate provides better debugging of panics by @@ -45,14 +44,10 @@ console_error_panic_hook = { version = "0.1", optional = true } # Unfortunately, `wee_alloc` requires nightly Rust when targeting wasm for now. wee_alloc = { version = "0.4", optional = true } -[build-dependencies] -built = "0.4.3" - [dev-dependencies] wasm-bindgen-test = "0.2" [package.metadata.wasm-pack.profile.release] -# this needs to be disabled until https://github.com/rustwasm/wasm-pack/issues/886 is resolved -wasm-opt = ["-Oz", "--enable-mutable-globals"] +wasm-opt = false diff --git a/clients/webassembly/build.rs b/clients/webassembly/build.rs deleted file mode 100644 index 56d753472cf..00000000000 --- a/clients/webassembly/build.rs +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -use built; - -fn main() { - built::write_built_file().expect("Failed to acquire build-time information"); -} diff --git a/clients/webassembly/js-example/index.js b/clients/webassembly/js-example/index.js index 54a46254d16..05842638ba8 100644 --- a/clients/webassembly/js-example/index.js +++ b/clients/webassembly/js-example/index.js @@ -24,10 +24,10 @@ async function main() { // sets up better stack traces in case of in-rust panics set_panic_hook(); - // directory server we will use to get topology from - const directory = "https://qa-directory.nymtech.net"; //"http://localhost:8080"; + // validator server we will use to get topology from + const validator = "http://testnet-validator1.nymtech.net:8081"; //"http://localhost:8081"; - client = new NymClient(directory); + client = new NymClient(validator); const on_message = (msg) => displayReceived(msg); const on_connect = () => console.log("Established (and authenticated) gateway connection!"); diff --git a/clients/webassembly/js-example/package-lock.json b/clients/webassembly/js-example/package-lock.json index 61890a61d30..26381bfa714 100644 --- a/clients/webassembly/js-example/package-lock.json +++ b/clients/webassembly/js-example/package-lock.json @@ -358,9 +358,10 @@ "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", "dev": true, "requires": { - "bn.js": "4.11.8", + "bn.js": "4.11.9", "inherits": "2.0.4", - "minimalistic-assert": "1.0.1" + "minimalistic-assert": "1.0.1", + "safer-buffer": "2.1.2" }, "dependencies": { "bn.js": { @@ -410,7 +411,7 @@ "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", "dev": true, "requires": { - "lodash": "4.17.15" + "lodash": "4.17.20" } }, "async-each": { @@ -662,44 +663,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, - "requires": { - "bn.js": "5.1.1", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "elliptic": "6.5.2", - "inherits": "2.0.4", - "parse-asn1": "5.1.5", - "readable-stream": "3.6.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "2.0.4", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", "dev": true } } @@ -823,9 +789,9 @@ } }, "chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", - "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", + "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", "dev": true, "optional": true, "requires": { @@ -836,7 +802,7 @@ "is-binary-path": "2.1.0", "is-glob": "4.0.1", "normalize-path": "3.0.0", - "readdirp": "3.4.0" + "readdirp": "3.5.0" }, "dependencies": { "braces": { @@ -1113,7 +1079,7 @@ "normalize-path": "3.0.0", "p-limit": "2.3.0", "schema-utils": "1.0.0", - "serialize-javascript": "2.1.2", + "serialize-javascript": "4.0.0", "webpack-log": "2.0.0" } }, @@ -1123,24 +1089,6 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, - "create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "elliptic": "6.5.2" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, "create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", @@ -1198,6 +1146,66 @@ "public-encrypt": "4.0.3", "randombytes": "2.1.0", "randomfill": "1.0.4" + }, + "dependencies": { + "browserify-sign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.1.0.tgz", + "integrity": "sha512-VYxo7cDCeYUoBZ0ZCy4UyEUCP3smyBd4DRQM5nrFS1jJjPJjX7rP3oLRpPoWfkhQfyJ0I9ZbHbKafrFD/SGlrg==", + "dev": true, + "requires": { + "bn.js": "5.1.3", + "browserify-rsa": "4.0.1", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "elliptic": "6.5.3", + "inherits": "2.0.4", + "parse-asn1": "5.1.6", + "readable-stream": "3.6.0" + } + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "4.11.9", + "elliptic": "6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "ripemd160": "2.0.2", + "safe-buffer": "5.1.2", + "sha.js": "2.4.11" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "2.0.4", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + } } }, "cyclist": { @@ -1385,9 +1393,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", "dev": true } } @@ -1466,9 +1474,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", "dev": true } } @@ -1582,15 +1590,17 @@ "requires": { "esrecurse": "4.2.1", "estraverse": "4.3.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "4.3.0" + }, + "dependencies": { + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "4.3.0" + } + } } }, "estraverse": { @@ -1611,12 +1621,6 @@ "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", "dev": true }, - "events": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", - "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", - "dev": true - }, "eventsource": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", @@ -2336,7 +2340,7 @@ "requires": { "http-proxy": "1.18.1", "is-glob": "4.0.1", - "lodash": "4.17.15", + "lodash": "4.17.20", "micromatch": "3.1.10" } }, @@ -2490,7 +2494,7 @@ "dev": true, "optional": true, "requires": { - "binary-extensions": "2.0.0" + "binary-extensions": "2.1.0" } }, "is-buffer": { @@ -2723,15 +2727,6 @@ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "2.0.0" - } - }, "loader-runner": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", @@ -2760,9 +2755,9 @@ } }, "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", "dev": true }, "loglevel": { @@ -2790,15 +2785,6 @@ "semver": "5.7.1" } }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "1.0.0" - } - }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -2831,17 +2817,6 @@ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "0.1.3", - "mimic-fn": "2.1.0", - "p-is-promise": "2.1.0" - } - }, "memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", @@ -2896,9 +2871,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", "dev": true } } @@ -3073,9 +3048,9 @@ "dev": true }, "node-forge": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", - "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", "dev": true }, "node-libs-browser": { @@ -3109,6 +3084,12 @@ "vm-browserify": "1.1.2" }, "dependencies": { + "events": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", + "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", + "dev": true + }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", @@ -3275,23 +3256,6 @@ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "1.0.0", - "lcid": "2.0.0", - "mem": "4.3.0" - } - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -3360,12 +3324,26 @@ "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", "dev": true, "requires": { - "asn1.js": "4.10.1", + "asn1.js": "5.4.1", "browserify-aes": "1.2.0", - "create-hash": "1.2.0", "evp_bytestokey": "1.0.3", "pbkdf2": "3.0.17", "safe-buffer": "5.1.2" + }, + "dependencies": { + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "ripemd160": "2.0.2", + "safe-buffer": "5.1.2", + "sha.js": "2.4.11" + } + } } }, "parse-passwd": { @@ -3576,11 +3554,36 @@ "safe-buffer": "5.1.2" }, "dependencies": { + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "inherits": "2.0.4", + "minimalistic-assert": "1.0.1" + } + }, "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", "dev": true + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "dev": true, + "requires": { + "asn1.js": "4.10.1", + "browserify-aes": "1.2.0", + "create-hash": "1.2.0", + "evp_bytestokey": "1.0.3", + "pbkdf2": "3.1.1", + "safe-buffer": "5.1.2" + } } } }, @@ -3708,9 +3711,9 @@ } }, "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", "dev": true, "optional": true, "requires": { @@ -3896,12 +3899,12 @@ "dev": true }, "selfsigned": { - "version": "1.10.7", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", - "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", + "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", "dev": true, "requires": { - "node-forge": "0.9.0" + "node-forge": "0.10.0" } }, "semver": { @@ -3945,7 +3948,7 @@ "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", "dev": true, "requires": { - "randombytes": "^2.1.0" + "randombytes": "2.1.0" } }, "serve-index": { @@ -4563,9 +4566,9 @@ "find-cache-dir": "2.1.0", "is-wsl": "1.1.0", "schema-utils": "1.0.0", - "serialize-javascript": "2.1.2", + "serialize-javascript": "4.0.0", "source-map": "0.6.1", - "terser": "4.6.13", + "terser": "4.8.0", "webpack-sources": "1.4.3", "worker-farm": "1.7.0" }, @@ -4875,9 +4878,9 @@ "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==", "dev": true, "requires": { - "chokidar": "3.4.0", + "chokidar": "3.4.3", "graceful-fs": "4.2.4", - "neo-async": "2.6.1", + "neo-async": "2.6.2", "watchpack-chokidar2": "2.0.0" } }, @@ -4996,7 +4999,7 @@ "ajv": "6.12.2", "ajv-keywords": "3.4.1", "chrome-trace-event": "1.0.2", - "enhanced-resolve": "4.1.1", + "enhanced-resolve": "4.3.0", "eslint-scope": "4.0.3", "json-parse-better-errors": "1.0.2", "loader-runner": "2.4.0", @@ -5008,58 +5011,59 @@ "node-libs-browser": "2.2.1", "schema-utils": "1.0.0", "tapable": "1.1.3", - "terser-webpack-plugin": "1.4.3", - "watchpack": "1.7.2", + "terser-webpack-plugin": "1.4.5", + "watchpack": "1.7.4", "webpack-sources": "1.4.3" + }, + "dependencies": { + "enhanced-resolve": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", + "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", + "dev": true, + "requires": { + "graceful-fs": "4.2.4", + "memory-fs": "0.5.0", + "tapable": "1.1.3" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "0.1.7", + "readable-stream": "2.3.7" + } + } + } + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + } } }, "webpack-cli": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.11.tgz", - "integrity": "sha512-dXlfuml7xvAFwYUPsrtQAA9e4DOe58gnzSxhgrO/ZM/gyXTBowrsYeubyN4mqGhYdpXMFNyQ6emjJS9M7OBd4g==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", + "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", "dev": true, "requires": { "chalk": "2.4.2", "cross-spawn": "6.0.5", - "enhanced-resolve": "4.1.0", + "enhanced-resolve": "4.3.0", "findup-sync": "3.0.0", "global-modules": "2.0.0", "import-local": "2.0.0", - "interpret": "1.2.0", - "loader-utils": "1.2.3", + "interpret": "1.4.0", + "loader-utils": "1.4.0", "supports-color": "6.1.0", - "v8-compile-cache": "2.0.3", - "yargs": "13.2.4" - }, - "dependencies": { - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", - "dev": true, - "requires": { - "graceful-fs": "4.2.4", - "memory-fs": "0.4.1", - "tapable": "1.1.3" - } - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "dev": true, - "requires": { - "big.js": "5.2.2", - "emojis-list": "2.1.0", - "json5": "1.0.1" - } - } + "v8-compile-cache": "2.1.1", + "yargs": "13.3.2" } }, "webpack-dev-middleware": { @@ -5109,7 +5113,7 @@ "p-retry": "3.0.1", "portfinder": "1.0.26", "schema-utils": "1.0.0", - "selfsigned": "1.10.7", + "selfsigned": "1.10.8", "semver": "6.3.0", "serve-index": "1.9.1", "sockjs": "0.3.20", @@ -5374,7 +5378,6 @@ "cliui": "5.0.0", "find-up": "3.0.0", "get-caller-file": "2.0.5", - "os-locale": "3.1.0", "require-directory": "2.1.1", "require-main-filename": "2.0.0", "set-blocking": "2.0.0", diff --git a/clients/webassembly/react-example/package-lock.json b/clients/webassembly/react-example/package-lock.json index 1e64ce46c63..3cb3219c4f5 100644 --- a/clients/webassembly/react-example/package-lock.json +++ b/clients/webassembly/react-example/package-lock.json @@ -13,50 +13,33 @@ } }, "@babel/compat-data": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz", - "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==", - "requires": { - "browserslist": "4.14.1", - "invariant": "2.2.4", - "semver": "5.7.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.1.tgz", + "integrity": "sha512-725AQupWJZ8ba0jbKceeFblZTY90McUBWMwHhkFQ9q1zKPJ95GUktljFcgcsIVwRnTnRKlcYzfiNImg5G9m6ZQ==" }, "@babel/core": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", - "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", + "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", "requires": { "@babel/code-frame": "7.10.4", - "@babel/generator": "7.11.6", - "@babel/helper-module-transforms": "7.11.0", - "@babel/helpers": "7.10.4", - "@babel/parser": "7.11.5", + "@babel/generator": "7.12.1", + "@babel/helper-module-transforms": "7.12.1", + "@babel/helpers": "7.12.1", + "@babel/parser": "7.12.3", "@babel/template": "7.10.4", - "@babel/traverse": "7.11.5", - "@babel/types": "7.11.5", + "@babel/traverse": "7.12.1", + "@babel/types": "7.12.1", "convert-source-map": "1.7.0", - "debug": "4.1.1", + "debug": "4.2.0", "gensync": "1.0.0-beta.1", "json5": "2.1.3", "lodash": "4.17.20", - "resolve": "1.17.0", + "resolve": "1.18.1", "semver": "5.7.1", "source-map": "0.5.7" }, "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -65,11 +48,11 @@ } }, "@babel/generator": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", - "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", + "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", "requires": { - "@babel/types": "7.11.5", + "@babel/types": "7.12.1", "jsesc": "2.5.2", "source-map": "0.5.7" }, @@ -86,7 +69,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", "requires": { - "@babel/types": "7.11.5" + "@babel/types": "7.12.1" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { @@ -94,8 +77,8 @@ "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", "requires": { - "@babel/helper-explode-assignable-expression": "7.11.4", - "@babel/types": "7.11.5" + "@babel/helper-explode-assignable-expression": "7.12.1", + "@babel/types": "7.12.1" } }, "@babel/helper-builder-react-jsx": { @@ -104,59 +87,50 @@ "integrity": "sha512-5nPcIZ7+KKDxT1427oBivl9V9YTal7qk0diccnh7RrcgrT/pGFOjgGw1dgryyx1GvHEpXVfoDF6Ak3rTiWh8Rg==", "requires": { "@babel/helper-annotate-as-pure": "7.10.4", - "@babel/types": "7.11.5" + "@babel/types": "7.12.1" } }, "@babel/helper-builder-react-jsx-experimental": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.11.5.tgz", - "integrity": "sha512-Vc4aPJnRZKWfzeCBsqTBnzulVNjABVdahSPhtdMD3Vs80ykx4a87jTHtF/VR+alSrDmNvat7l13yrRHauGcHVw==", + "version": "7.12.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.12.4.tgz", + "integrity": "sha512-AjEa0jrQqNk7eDQOo0pTfUOwQBMF+xVqrausQwT9/rTKy0g04ggFNaJpaE09IQMn9yExluigWMJcj0WC7bq+Og==", "requires": { "@babel/helper-annotate-as-pure": "7.10.4", - "@babel/helper-module-imports": "7.10.4", - "@babel/types": "7.11.5" + "@babel/helper-module-imports": "7.12.1", + "@babel/types": "7.12.1" } }, "@babel/helper-compilation-targets": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz", - "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.1.tgz", + "integrity": "sha512-jtBEif7jsPwP27GPHs06v4WBV0KrE8a/P7n0N0sSvHn2hwUCYnolP/CLmz51IzAW4NlN+HuoBtb9QcwnRo9F/g==", "requires": { - "@babel/compat-data": "7.11.0", - "browserslist": "4.14.1", - "invariant": "2.2.4", - "levenary": "1.1.1", + "@babel/compat-data": "7.12.1", + "@babel/helper-validator-option": "7.12.1", + "browserslist": "4.14.5", "semver": "5.7.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } } }, "@babel/helper-create-class-features-plugin": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz", - "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz", + "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==", "requires": { "@babel/helper-function-name": "7.10.4", - "@babel/helper-member-expression-to-functions": "7.11.0", + "@babel/helper-member-expression-to-functions": "7.12.1", "@babel/helper-optimise-call-expression": "7.10.4", - "@babel/helper-plugin-utils": "7.10.4", - "@babel/helper-replace-supers": "7.10.4", + "@babel/helper-replace-supers": "7.12.1", "@babel/helper-split-export-declaration": "7.11.0" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", - "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.1.tgz", + "integrity": "sha512-rsZ4LGvFTZnzdNZR5HZdmJVuXK8834R5QkF3WvcnBhrlVtF0HSIUC6zbreL9MgjTywhKokn8RIYRiq99+DLAxA==", "requires": { "@babel/helper-annotate-as-pure": "7.10.4", "@babel/helper-regex": "7.10.5", - "regexpu-core": "4.7.0" + "regexpu-core": "4.7.1" } }, "@babel/helper-define-map": { @@ -165,16 +139,16 @@ "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", "requires": { "@babel/helper-function-name": "7.10.4", - "@babel/types": "7.11.5", + "@babel/types": "7.12.1", "lodash": "4.17.20" } }, "@babel/helper-explode-assignable-expression": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz", - "integrity": "sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz", + "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==", "requires": { - "@babel/types": "7.11.5" + "@babel/types": "7.12.1" } }, "@babel/helper-function-name": { @@ -184,7 +158,7 @@ "requires": { "@babel/helper-get-function-arity": "7.10.4", "@babel/template": "7.10.4", - "@babel/types": "7.11.5" + "@babel/types": "7.12.1" } }, "@babel/helper-get-function-arity": { @@ -192,7 +166,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", "requires": { - "@babel/types": "7.11.5" + "@babel/types": "7.12.1" } }, "@babel/helper-hoist-variables": { @@ -200,36 +174,38 @@ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", "requires": { - "@babel/types": "7.11.5" + "@babel/types": "7.12.1" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", - "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", "requires": { - "@babel/types": "7.11.5" + "@babel/types": "7.12.1" } }, "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", + "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", "requires": { - "@babel/types": "7.11.5" + "@babel/types": "7.12.1" } }, "@babel/helper-module-transforms": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", - "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", "requires": { - "@babel/helper-module-imports": "7.10.4", - "@babel/helper-replace-supers": "7.10.4", - "@babel/helper-simple-access": "7.10.4", + "@babel/helper-module-imports": "7.12.1", + "@babel/helper-replace-supers": "7.12.1", + "@babel/helper-simple-access": "7.12.1", "@babel/helper-split-export-declaration": "7.11.0", + "@babel/helper-validator-identifier": "7.10.4", "@babel/template": "7.10.4", - "@babel/types": "7.11.5", + "@babel/traverse": "7.12.1", + "@babel/types": "7.12.1", "lodash": "4.17.20" } }, @@ -238,7 +214,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", "requires": { - "@babel/types": "7.11.5" + "@babel/types": "7.12.1" } }, "@babel/helper-plugin-utils": { @@ -255,42 +231,40 @@ } }, "@babel/helper-remap-async-to-generator": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz", - "integrity": "sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", + "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", "requires": { "@babel/helper-annotate-as-pure": "7.10.4", - "@babel/helper-wrap-function": "7.10.4", - "@babel/template": "7.10.4", - "@babel/types": "7.11.5" + "@babel/helper-wrap-function": "7.12.3", + "@babel/types": "7.12.1" } }, "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", + "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", "requires": { - "@babel/helper-member-expression-to-functions": "7.11.0", + "@babel/helper-member-expression-to-functions": "7.12.1", "@babel/helper-optimise-call-expression": "7.10.4", - "@babel/traverse": "7.11.5", - "@babel/types": "7.11.5" + "@babel/traverse": "7.12.1", + "@babel/types": "7.12.1" } }, "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", "requires": { - "@babel/template": "7.10.4", - "@babel/types": "7.11.5" + "@babel/types": "7.12.1" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz", - "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", "requires": { - "@babel/types": "7.11.5" + "@babel/types": "7.12.1" } }, "@babel/helper-split-export-declaration": { @@ -298,7 +272,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", "requires": { - "@babel/types": "7.11.5" + "@babel/types": "7.12.1" } }, "@babel/helper-validator-identifier": { @@ -306,25 +280,30 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" }, + "@babel/helper-validator-option": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz", + "integrity": "sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A==" + }, "@babel/helper-wrap-function": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", - "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz", + "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==", "requires": { "@babel/helper-function-name": "7.10.4", "@babel/template": "7.10.4", - "@babel/traverse": "7.11.5", - "@babel/types": "7.11.5" + "@babel/traverse": "7.12.1", + "@babel/types": "7.12.1" } }, "@babel/helpers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", - "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.1.tgz", + "integrity": "sha512-9JoDSBGoWtmbay98efmT2+mySkwjzeFeAL9BuWNoVQpkPFQF8SIIFUfY5os9u8wVzglzoiPRSW7cuJmBDUt43g==", "requires": { "@babel/template": "7.10.4", - "@babel/traverse": "7.11.5", - "@babel/types": "7.11.5" + "@babel/traverse": "7.12.1", + "@babel/types": "7.12.1" } }, "@babel/highlight": { @@ -338,137 +317,137 @@ } }, "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==" + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", + "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==" }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz", - "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz", + "integrity": "sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A==", "requires": { "@babel/helper-plugin-utils": "7.10.4", - "@babel/helper-remap-async-to-generator": "7.11.4", + "@babel/helper-remap-async-to-generator": "7.12.1", "@babel/plugin-syntax-async-generators": "7.8.4" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", - "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", + "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", "requires": { - "@babel/helper-create-class-features-plugin": "7.10.5", + "@babel/helper-create-class-features-plugin": "7.12.1", "@babel/helper-plugin-utils": "7.10.4" } }, "@babel/plugin-proposal-decorators": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.8.3.tgz", - "integrity": "sha512-e3RvdvS4qPJVTe288DlXjwKflpfy1hr0j5dz5WpIYYeP7vQZg2WfAEIp8k5/Lwis/m5REXEteIz6rrcDtXXG7w==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.12.1.tgz", + "integrity": "sha512-knNIuusychgYN8fGJHONL0RbFxLGawhXOJNLBk75TniTsZZeA+wdkDuv6wp4lGwzQEKjZi6/WYtnb3udNPmQmQ==", "requires": { - "@babel/helper-create-class-features-plugin": "7.10.5", + "@babel/helper-create-class-features-plugin": "7.12.1", "@babel/helper-plugin-utils": "7.10.4", - "@babel/plugin-syntax-decorators": "7.10.4" + "@babel/plugin-syntax-decorators": "7.12.1" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", - "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz", + "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==", "requires": { "@babel/helper-plugin-utils": "7.10.4", "@babel/plugin-syntax-dynamic-import": "7.8.3" } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz", - "integrity": "sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz", + "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==", "requires": { "@babel/helper-plugin-utils": "7.10.4", "@babel/plugin-syntax-export-namespace-from": "7.8.3" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", - "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz", + "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==", "requires": { "@babel/helper-plugin-utils": "7.10.4", "@babel/plugin-syntax-json-strings": "7.8.3" } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz", - "integrity": "sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz", + "integrity": "sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==", "requires": { "@babel/helper-plugin-utils": "7.10.4", "@babel/plugin-syntax-logical-assignment-operators": "7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", - "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", + "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", "requires": { "@babel/helper-plugin-utils": "7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "7.8.3" } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", - "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.1.tgz", + "integrity": "sha512-MR7Ok+Af3OhNTCxYVjJZHS0t97ydnJZt/DbR4WISO39iDnhiD8XHrY12xuSJ90FFEGjir0Fzyyn7g/zY6hxbxA==", "requires": { "@babel/helper-plugin-utils": "7.10.4", "@babel/plugin-syntax-numeric-separator": "7.10.4" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz", - "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", "requires": { "@babel/helper-plugin-utils": "7.10.4", "@babel/plugin-syntax-object-rest-spread": "7.8.3", - "@babel/plugin-transform-parameters": "7.10.5" + "@babel/plugin-transform-parameters": "7.12.1" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", - "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz", + "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==", "requires": { "@babel/helper-plugin-utils": "7.10.4", "@babel/plugin-syntax-optional-catch-binding": "7.8.3" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz", - "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz", + "integrity": "sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw==", "requires": { "@babel/helper-plugin-utils": "7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "7.11.0", + "@babel/helper-skip-transparent-expression-wrappers": "7.12.1", "@babel/plugin-syntax-optional-chaining": "7.8.3" } }, "@babel/plugin-proposal-private-methods": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz", - "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz", + "integrity": "sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==", "requires": { - "@babel/helper-create-class-features-plugin": "7.10.5", + "@babel/helper-create-class-features-plugin": "7.12.1", "@babel/helper-plugin-utils": "7.10.4" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", - "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz", + "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==", "requires": { - "@babel/helper-create-regexp-features-plugin": "7.10.4", + "@babel/helper-create-regexp-features-plugin": "7.12.1", "@babel/helper-plugin-utils": "7.10.4" } }, @@ -480,18 +459,26 @@ "@babel/helper-plugin-utils": "7.10.4" } }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "requires": { + "@babel/helper-plugin-utils": "7.10.4" + } + }, "@babel/plugin-syntax-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", - "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", + "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", "requires": { "@babel/helper-plugin-utils": "7.10.4" } }, "@babel/plugin-syntax-decorators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.10.4.tgz", - "integrity": "sha512-2NaoC6fAk2VMdhY1eerkfHV+lVYC1u8b+jmRJISqANCJlTxYy19HGdIkkQtix2UtkcPuPu+IlDgrVseZnU03bw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.1.tgz", + "integrity": "sha512-ir9YW5daRrTYiy9UJ2TzdNIJEZu8KclVzDcfSt4iEmOtwQ4llPtWInNKJyKnVXp1vE4bbVd5S31M/im3mYMO1w==", "requires": { "@babel/helper-plugin-utils": "7.10.4" } @@ -513,9 +500,17 @@ } }, "@babel/plugin-syntax-flow": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.1.tgz", + "integrity": "sha512-1lBLLmtxrwpm4VKmtVFselI/P3pX+G63fAtUUt6b2Nzgao77KNDwyuRt90Mj2/9pKobtt68FdvjfqohZjg/FCA==", + "requires": { + "@babel/helper-plugin-utils": "7.10.4" + } + }, + "@babel/plugin-syntax-import-meta": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.10.4.tgz", - "integrity": "sha512-yxQsX1dJixF4qEEdzVbst3SZQ58Nrooz8NV9Z9GL4byTE25BvJgl5lf0RECUf0fh28rZBb/RYTWn/eeKwCMrZQ==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "requires": { "@babel/helper-plugin-utils": "7.10.4" } @@ -529,9 +524,9 @@ } }, "@babel/plugin-syntax-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz", - "integrity": "sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", "requires": { "@babel/helper-plugin-utils": "7.10.4" } @@ -585,429 +580,420 @@ } }, "@babel/plugin-syntax-top-level-await": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", - "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", + "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", "requires": { "@babel/helper-plugin-utils": "7.10.4" } }, "@babel/plugin-syntax-typescript": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.4.tgz", - "integrity": "sha512-oSAEz1YkBCAKr5Yiq8/BNtvSAPwkp/IyUnwZogd8p+F0RuYQQrLeRUzIQhueQTTBy/F+a40uS7OFKxnkRvmvFQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.1.tgz", + "integrity": "sha512-UZNEcCY+4Dp9yYRCAHrHDU+9ZXLYaY9MgBXSRLkB9WjYFRR6quJBumfVrEkUxrePPBwFcpWfNKXqVRQQtm7mMA==", "requires": { "@babel/helper-plugin-utils": "7.10.4" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", - "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz", + "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==", "requires": { "@babel/helper-plugin-utils": "7.10.4" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", - "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz", + "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==", "requires": { - "@babel/helper-module-imports": "7.10.4", + "@babel/helper-module-imports": "7.12.1", "@babel/helper-plugin-utils": "7.10.4", - "@babel/helper-remap-async-to-generator": "7.11.4" + "@babel/helper-remap-async-to-generator": "7.12.1" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", - "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz", + "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==", "requires": { "@babel/helper-plugin-utils": "7.10.4" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz", - "integrity": "sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz", + "integrity": "sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w==", "requires": { "@babel/helper-plugin-utils": "7.10.4" } }, "@babel/plugin-transform-classes": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", - "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz", + "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==", "requires": { "@babel/helper-annotate-as-pure": "7.10.4", "@babel/helper-define-map": "7.10.5", "@babel/helper-function-name": "7.10.4", "@babel/helper-optimise-call-expression": "7.10.4", "@babel/helper-plugin-utils": "7.10.4", - "@babel/helper-replace-supers": "7.10.4", + "@babel/helper-replace-supers": "7.12.1", "@babel/helper-split-export-declaration": "7.11.0", "globals": "11.12.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", - "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz", + "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==", "requires": { "@babel/helper-plugin-utils": "7.10.4" } }, "@babel/plugin-transform-destructuring": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", - "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz", + "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==", "requires": { "@babel/helper-plugin-utils": "7.10.4" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", - "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz", + "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==", "requires": { - "@babel/helper-create-regexp-features-plugin": "7.10.4", + "@babel/helper-create-regexp-features-plugin": "7.12.1", "@babel/helper-plugin-utils": "7.10.4" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", - "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz", + "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==", "requires": { "@babel/helper-plugin-utils": "7.10.4" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", - "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz", + "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==", "requires": { "@babel/helper-builder-binary-assignment-operator-visitor": "7.10.4", "@babel/helper-plugin-utils": "7.10.4" } }, "@babel/plugin-transform-flow-strip-types": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.9.0.tgz", - "integrity": "sha512-7Qfg0lKQhEHs93FChxVLAvhBshOPQDtJUTVHr/ZwQNRccCm4O9D79r9tVSoV8iNwjP1YgfD+e/fgHcPkN1qEQg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.12.1.tgz", + "integrity": "sha512-8hAtkmsQb36yMmEtk2JZ9JnVyDSnDOdlB+0nEGzIDLuK4yR3JcEjfuFPYkdEPSh8Id+rAMeBEn+X0iVEyho6Hg==", "requires": { "@babel/helper-plugin-utils": "7.10.4", - "@babel/plugin-syntax-flow": "7.10.4" + "@babel/plugin-syntax-flow": "7.12.1" } }, "@babel/plugin-transform-for-of": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", - "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz", + "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==", "requires": { "@babel/helper-plugin-utils": "7.10.4" } }, "@babel/plugin-transform-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", - "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz", + "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==", "requires": { "@babel/helper-function-name": "7.10.4", "@babel/helper-plugin-utils": "7.10.4" } }, "@babel/plugin-transform-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", - "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz", + "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==", "requires": { "@babel/helper-plugin-utils": "7.10.4" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", - "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz", + "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==", "requires": { "@babel/helper-plugin-utils": "7.10.4" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz", - "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz", + "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==", "requires": { - "@babel/helper-module-transforms": "7.11.0", + "@babel/helper-module-transforms": "7.12.1", "@babel/helper-plugin-utils": "7.10.4", "babel-plugin-dynamic-import-node": "2.3.3" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", - "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz", + "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==", "requires": { - "@babel/helper-module-transforms": "7.11.0", + "@babel/helper-module-transforms": "7.12.1", "@babel/helper-plugin-utils": "7.10.4", - "@babel/helper-simple-access": "7.10.4", + "@babel/helper-simple-access": "7.12.1", "babel-plugin-dynamic-import-node": "2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz", - "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz", + "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==", "requires": { "@babel/helper-hoist-variables": "7.10.4", - "@babel/helper-module-transforms": "7.11.0", + "@babel/helper-module-transforms": "7.12.1", "@babel/helper-plugin-utils": "7.10.4", + "@babel/helper-validator-identifier": "7.10.4", "babel-plugin-dynamic-import-node": "2.3.3" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", - "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz", + "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==", "requires": { - "@babel/helper-module-transforms": "7.11.0", + "@babel/helper-module-transforms": "7.12.1", "@babel/helper-plugin-utils": "7.10.4" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", - "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz", + "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==", "requires": { - "@babel/helper-create-regexp-features-plugin": "7.10.4" + "@babel/helper-create-regexp-features-plugin": "7.12.1" } }, "@babel/plugin-transform-new-target": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", - "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz", + "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==", "requires": { "@babel/helper-plugin-utils": "7.10.4" } }, "@babel/plugin-transform-object-super": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", - "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz", + "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==", "requires": { "@babel/helper-plugin-utils": "7.10.4", - "@babel/helper-replace-supers": "7.10.4" + "@babel/helper-replace-supers": "7.12.1" } }, "@babel/plugin-transform-parameters": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz", - "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz", + "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==", "requires": { - "@babel/helper-get-function-arity": "7.10.4", "@babel/helper-plugin-utils": "7.10.4" } }, "@babel/plugin-transform-property-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", - "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz", + "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==", "requires": { "@babel/helper-plugin-utils": "7.10.4" } }, "@babel/plugin-transform-react-constant-elements": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.10.4.tgz", - "integrity": "sha512-cYmQBW1pXrqBte1raMkAulXmi7rjg3VI6ZLg9QIic8Hq7BtYXaWuZSxsr2siOMI6SWwpxjWfnwhTUrd7JlAV7g==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.12.1.tgz", + "integrity": "sha512-KOHd0tIRLoER+J+8f9DblZDa1fLGPwaaN1DI1TVHuQFOpjHV22C3CUB3obeC4fexHY9nx+fH0hQNvLFFfA1mxA==", "requires": { "@babel/helper-plugin-utils": "7.10.4" } }, "@babel/plugin-transform-react-display-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.4.tgz", - "integrity": "sha512-Zd4X54Mu9SBfPGnEcaGcOrVAYOtjT2on8QZkLKEq1S/tHexG39d9XXGZv19VfRrDjPJzFmPfTAqOQS1pfFOujw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.1.tgz", + "integrity": "sha512-cAzB+UzBIrekfYxyLlFqf/OagTvHLcVBb5vpouzkYkBclRPraiygVnafvAoipErZLI8ANv8Ecn6E/m5qPXD26w==", "requires": { "@babel/helper-plugin-utils": "7.10.4" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.4.tgz", - "integrity": "sha512-L+MfRhWjX0eI7Js093MM6MacKU4M6dnCRa/QPDwYMxjljzSCzzlzKzj9Pk4P3OtrPcxr2N3znR419nr3Xw+65A==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.1.tgz", + "integrity": "sha512-RmKejwnT0T0QzQUzcbP5p1VWlpnP8QHtdhEtLG55ZDQnJNalbF3eeDyu3dnGKvGzFIQiBzFhBYTwvv435p9Xpw==", "requires": { "@babel/helper-builder-react-jsx": "7.10.4", - "@babel/helper-builder-react-jsx-experimental": "7.11.5", + "@babel/helper-builder-react-jsx-experimental": "7.12.4", "@babel/helper-plugin-utils": "7.10.4", - "@babel/plugin-syntax-jsx": "7.10.4" + "@babel/plugin-syntax-jsx": "7.12.1" } }, "@babel/plugin-transform-react-jsx-development": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.11.5.tgz", - "integrity": "sha512-cImAmIlKJ84sDmpQzm4/0q/2xrXlDezQoixy3qoz1NJeZL/8PRon6xZtluvr4H4FzwlDGI5tCcFupMnXGtr+qw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.1.tgz", + "integrity": "sha512-IilcGWdN1yNgEGOrB96jbTplRh+V2Pz1EoEwsKsHfX1a/L40cUYuD71Zepa7C+ujv7kJIxnDftWeZbKNEqZjCQ==", "requires": { - "@babel/helper-builder-react-jsx-experimental": "7.11.5", + "@babel/helper-builder-react-jsx-experimental": "7.12.4", "@babel/helper-plugin-utils": "7.10.4", - "@babel/plugin-syntax-jsx": "7.10.4" + "@babel/plugin-syntax-jsx": "7.12.1" } }, "@babel/plugin-transform-react-jsx-self": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.4.tgz", - "integrity": "sha512-yOvxY2pDiVJi0axdTWHSMi5T0DILN+H+SaeJeACHKjQLezEzhLx9nEF9xgpBLPtkZsks9cnb5P9iBEi21En3gg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.12.1.tgz", + "integrity": "sha512-FbpL0ieNWiiBB5tCldX17EtXgmzeEZjFrix72rQYeq9X6nUK38HCaxexzVQrZWXanxKJPKVVIU37gFjEQYkPkA==", "requires": { - "@babel/helper-plugin-utils": "7.10.4", - "@babel/plugin-syntax-jsx": "7.10.4" + "@babel/helper-plugin-utils": "7.10.4" } }, "@babel/plugin-transform-react-jsx-source": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.5.tgz", - "integrity": "sha512-wTeqHVkN1lfPLubRiZH3o73f4rfon42HpgxUSs86Nc+8QIcm/B9s8NNVXu/gwGcOyd7yDib9ikxoDLxJP0UiDA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.12.1.tgz", + "integrity": "sha512-keQ5kBfjJNRc6zZN1/nVHCd6LLIHq4aUKcVnvE/2l+ZZROSbqoiGFRtT5t3Is89XJxBQaP7NLZX2jgGHdZvvFQ==", "requires": { - "@babel/helper-plugin-utils": "7.10.4", - "@babel/plugin-syntax-jsx": "7.10.4" + "@babel/helper-plugin-utils": "7.10.4" } }, "@babel/plugin-transform-react-pure-annotations": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.4.tgz", - "integrity": "sha512-+njZkqcOuS8RaPakrnR9KvxjoG1ASJWpoIv/doyWngId88JoFlPlISenGXjrVacZUIALGUr6eodRs1vmPnF23A==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz", + "integrity": "sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg==", "requires": { "@babel/helper-annotate-as-pure": "7.10.4", "@babel/helper-plugin-utils": "7.10.4" } }, "@babel/plugin-transform-regenerator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", - "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz", + "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==", "requires": { "regenerator-transform": "0.14.5" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz", - "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz", + "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==", "requires": { "@babel/helper-plugin-utils": "7.10.4" } }, "@babel/plugin-transform-runtime": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.0.tgz", - "integrity": "sha512-pUu9VSf3kI1OqbWINQ7MaugnitRss1z533436waNXp+0N3ur3zfut37sXiQMxkuCF4VUjwZucen/quskCh7NHw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz", + "integrity": "sha512-Ac/H6G9FEIkS2tXsZjL4RAdS3L3WHxci0usAnz7laPWUmFiGtj7tIASChqKZMHTSQTQY6xDbOq+V1/vIq3QrWg==", "requires": { - "@babel/helper-module-imports": "7.10.4", + "@babel/helper-module-imports": "7.12.1", "@babel/helper-plugin-utils": "7.10.4", - "resolve": "1.17.0", + "resolve": "1.18.1", "semver": "5.7.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", - "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz", + "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==", "requires": { "@babel/helper-plugin-utils": "7.10.4" } }, "@babel/plugin-transform-spread": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz", - "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz", + "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==", "requires": { "@babel/helper-plugin-utils": "7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "7.11.0" + "@babel/helper-skip-transparent-expression-wrappers": "7.12.1" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", - "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.1.tgz", + "integrity": "sha512-CiUgKQ3AGVk7kveIaPEET1jNDhZZEl1RPMWdTBE1799bdz++SwqDHStmxfCtDfBhQgCl38YRiSnrMuUMZIWSUQ==", "requires": { "@babel/helper-plugin-utils": "7.10.4", "@babel/helper-regex": "7.10.5" } }, "@babel/plugin-transform-template-literals": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz", - "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz", + "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==", "requires": { - "@babel/helper-annotate-as-pure": "7.10.4", "@babel/helper-plugin-utils": "7.10.4" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz", - "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.1.tgz", + "integrity": "sha512-EPGgpGy+O5Kg5pJFNDKuxt9RdmTgj5sgrus2XVeMp/ZIbOESadgILUbm50SNpghOh3/6yrbsH+NB5+WJTmsA7Q==", "requires": { "@babel/helper-plugin-utils": "7.10.4" } }, "@babel/plugin-transform-typescript": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.11.0.tgz", - "integrity": "sha512-edJsNzTtvb3MaXQwj8403B7mZoGu9ElDJQZOKjGUnvilquxBA3IQoEIOvkX/1O8xfAsnHS/oQhe2w/IXrr+w0w==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.12.1.tgz", + "integrity": "sha512-VrsBByqAIntM+EYMqSm59SiMEf7qkmI9dqMt6RbD/wlwueWmYcI0FFK5Fj47pP6DRZm+3teXjosKlwcZJ5lIMw==", "requires": { - "@babel/helper-create-class-features-plugin": "7.10.5", + "@babel/helper-create-class-features-plugin": "7.12.1", "@babel/helper-plugin-utils": "7.10.4", - "@babel/plugin-syntax-typescript": "7.10.4" + "@babel/plugin-syntax-typescript": "7.12.1" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz", - "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz", + "integrity": "sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q==", "requires": { "@babel/helper-plugin-utils": "7.10.4" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", - "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz", + "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==", "requires": { - "@babel/helper-create-regexp-features-plugin": "7.10.4", + "@babel/helper-create-regexp-features-plugin": "7.12.1", "@babel/helper-plugin-utils": "7.10.4" } }, "@babel/preset-env": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.5.tgz", - "integrity": "sha512-kXqmW1jVcnB2cdueV+fyBM8estd5mlNfaQi6lwLgRwCby4edpavgbFhiBNjmWA3JpB/yZGSISa7Srf+TwxDQoA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.1.tgz", + "integrity": "sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg==", "requires": { - "@babel/compat-data": "7.11.0", - "@babel/helper-compilation-targets": "7.10.4", - "@babel/helper-module-imports": "7.10.4", + "@babel/compat-data": "7.12.1", + "@babel/helper-compilation-targets": "7.12.1", + "@babel/helper-module-imports": "7.12.1", "@babel/helper-plugin-utils": "7.10.4", - "@babel/plugin-proposal-async-generator-functions": "7.10.5", - "@babel/plugin-proposal-class-properties": "7.10.4", - "@babel/plugin-proposal-dynamic-import": "7.10.4", - "@babel/plugin-proposal-export-namespace-from": "7.10.4", - "@babel/plugin-proposal-json-strings": "7.10.4", - "@babel/plugin-proposal-logical-assignment-operators": "7.11.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "7.10.4", - "@babel/plugin-proposal-numeric-separator": "7.10.4", - "@babel/plugin-proposal-object-rest-spread": "7.11.0", - "@babel/plugin-proposal-optional-catch-binding": "7.10.4", - "@babel/plugin-proposal-optional-chaining": "7.11.0", - "@babel/plugin-proposal-private-methods": "7.10.4", - "@babel/plugin-proposal-unicode-property-regex": "7.10.4", + "@babel/helper-validator-option": "7.12.1", + "@babel/plugin-proposal-async-generator-functions": "7.12.1", + "@babel/plugin-proposal-class-properties": "7.12.1", + "@babel/plugin-proposal-dynamic-import": "7.12.1", + "@babel/plugin-proposal-export-namespace-from": "7.12.1", + "@babel/plugin-proposal-json-strings": "7.12.1", + "@babel/plugin-proposal-logical-assignment-operators": "7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "7.12.1", + "@babel/plugin-proposal-numeric-separator": "7.12.1", + "@babel/plugin-proposal-object-rest-spread": "7.12.1", + "@babel/plugin-proposal-optional-catch-binding": "7.12.1", + "@babel/plugin-proposal-optional-chaining": "7.12.1", + "@babel/plugin-proposal-private-methods": "7.12.1", + "@babel/plugin-proposal-unicode-property-regex": "7.12.1", "@babel/plugin-syntax-async-generators": "7.8.4", - "@babel/plugin-syntax-class-properties": "7.10.4", + "@babel/plugin-syntax-class-properties": "7.12.1", "@babel/plugin-syntax-dynamic-import": "7.8.3", "@babel/plugin-syntax-export-namespace-from": "7.8.3", "@babel/plugin-syntax-json-strings": "7.8.3", @@ -1017,53 +1003,43 @@ "@babel/plugin-syntax-object-rest-spread": "7.8.3", "@babel/plugin-syntax-optional-catch-binding": "7.8.3", "@babel/plugin-syntax-optional-chaining": "7.8.3", - "@babel/plugin-syntax-top-level-await": "7.10.4", - "@babel/plugin-transform-arrow-functions": "7.10.4", - "@babel/plugin-transform-async-to-generator": "7.10.4", - "@babel/plugin-transform-block-scoped-functions": "7.10.4", - "@babel/plugin-transform-block-scoping": "7.11.1", - "@babel/plugin-transform-classes": "7.10.4", - "@babel/plugin-transform-computed-properties": "7.10.4", - "@babel/plugin-transform-destructuring": "7.10.4", - "@babel/plugin-transform-dotall-regex": "7.10.4", - "@babel/plugin-transform-duplicate-keys": "7.10.4", - "@babel/plugin-transform-exponentiation-operator": "7.10.4", - "@babel/plugin-transform-for-of": "7.10.4", - "@babel/plugin-transform-function-name": "7.10.4", - "@babel/plugin-transform-literals": "7.10.4", - "@babel/plugin-transform-member-expression-literals": "7.10.4", - "@babel/plugin-transform-modules-amd": "7.10.5", - "@babel/plugin-transform-modules-commonjs": "7.10.4", - "@babel/plugin-transform-modules-systemjs": "7.10.5", - "@babel/plugin-transform-modules-umd": "7.10.4", - "@babel/plugin-transform-named-capturing-groups-regex": "7.10.4", - "@babel/plugin-transform-new-target": "7.10.4", - "@babel/plugin-transform-object-super": "7.10.4", - "@babel/plugin-transform-parameters": "7.10.5", - "@babel/plugin-transform-property-literals": "7.10.4", - "@babel/plugin-transform-regenerator": "7.10.4", - "@babel/plugin-transform-reserved-words": "7.10.4", - "@babel/plugin-transform-shorthand-properties": "7.10.4", - "@babel/plugin-transform-spread": "7.11.0", - "@babel/plugin-transform-sticky-regex": "7.10.4", - "@babel/plugin-transform-template-literals": "7.10.5", - "@babel/plugin-transform-typeof-symbol": "7.10.4", - "@babel/plugin-transform-unicode-escapes": "7.10.4", - "@babel/plugin-transform-unicode-regex": "7.10.4", + "@babel/plugin-syntax-top-level-await": "7.12.1", + "@babel/plugin-transform-arrow-functions": "7.12.1", + "@babel/plugin-transform-async-to-generator": "7.12.1", + "@babel/plugin-transform-block-scoped-functions": "7.12.1", + "@babel/plugin-transform-block-scoping": "7.12.1", + "@babel/plugin-transform-classes": "7.12.1", + "@babel/plugin-transform-computed-properties": "7.12.1", + "@babel/plugin-transform-destructuring": "7.12.1", + "@babel/plugin-transform-dotall-regex": "7.12.1", + "@babel/plugin-transform-duplicate-keys": "7.12.1", + "@babel/plugin-transform-exponentiation-operator": "7.12.1", + "@babel/plugin-transform-for-of": "7.12.1", + "@babel/plugin-transform-function-name": "7.12.1", + "@babel/plugin-transform-literals": "7.12.1", + "@babel/plugin-transform-member-expression-literals": "7.12.1", + "@babel/plugin-transform-modules-amd": "7.12.1", + "@babel/plugin-transform-modules-commonjs": "7.12.1", + "@babel/plugin-transform-modules-systemjs": "7.12.1", + "@babel/plugin-transform-modules-umd": "7.12.1", + "@babel/plugin-transform-named-capturing-groups-regex": "7.12.1", + "@babel/plugin-transform-new-target": "7.12.1", + "@babel/plugin-transform-object-super": "7.12.1", + "@babel/plugin-transform-parameters": "7.12.1", + "@babel/plugin-transform-property-literals": "7.12.1", + "@babel/plugin-transform-regenerator": "7.12.1", + "@babel/plugin-transform-reserved-words": "7.12.1", + "@babel/plugin-transform-shorthand-properties": "7.12.1", + "@babel/plugin-transform-spread": "7.12.1", + "@babel/plugin-transform-sticky-regex": "7.12.1", + "@babel/plugin-transform-template-literals": "7.12.1", + "@babel/plugin-transform-typeof-symbol": "7.12.1", + "@babel/plugin-transform-unicode-escapes": "7.12.1", + "@babel/plugin-transform-unicode-regex": "7.12.1", "@babel/preset-modules": "0.1.4", - "@babel/types": "7.11.5", - "browserslist": "4.14.1", + "@babel/types": "7.12.1", "core-js-compat": "3.6.5", - "invariant": "2.2.4", - "levenary": "1.1.1", "semver": "5.7.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } } }, "@babel/preset-modules": { @@ -1072,47 +1048,47 @@ "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", "requires": { "@babel/helper-plugin-utils": "7.10.4", - "@babel/plugin-proposal-unicode-property-regex": "7.10.4", - "@babel/plugin-transform-dotall-regex": "7.10.4", - "@babel/types": "7.11.5", + "@babel/plugin-proposal-unicode-property-regex": "7.12.1", + "@babel/plugin-transform-dotall-regex": "7.12.1", + "@babel/types": "7.12.1", "esutils": "2.0.3" } }, "@babel/preset-react": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.10.4.tgz", - "integrity": "sha512-BrHp4TgOIy4M19JAfO1LhycVXOPWdDbTRep7eVyatf174Hff+6Uk53sDyajqZPu8W1qXRBiYOfIamek6jA7YVw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.12.1.tgz", + "integrity": "sha512-euCExymHCi0qB9u5fKw7rvlw7AZSjw/NaB9h7EkdTt5+yHRrXdiRTh7fkG3uBPpJg82CqLfp1LHLqWGSCrab+g==", "requires": { "@babel/helper-plugin-utils": "7.10.4", - "@babel/plugin-transform-react-display-name": "7.10.4", - "@babel/plugin-transform-react-jsx": "7.10.4", - "@babel/plugin-transform-react-jsx-development": "7.11.5", - "@babel/plugin-transform-react-jsx-self": "7.10.4", - "@babel/plugin-transform-react-jsx-source": "7.10.5", - "@babel/plugin-transform-react-pure-annotations": "7.10.4" + "@babel/plugin-transform-react-display-name": "7.12.1", + "@babel/plugin-transform-react-jsx": "7.12.1", + "@babel/plugin-transform-react-jsx-development": "7.12.1", + "@babel/plugin-transform-react-jsx-self": "7.12.1", + "@babel/plugin-transform-react-jsx-source": "7.12.1", + "@babel/plugin-transform-react-pure-annotations": "7.12.1" } }, "@babel/preset-typescript": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.9.0.tgz", - "integrity": "sha512-S4cueFnGrIbvYJgwsVFKdvOmpiL0XGw9MFW9D0vgRys5g36PBhZRL8NX8Gr2akz8XRtzq6HuDXPD/1nniagNUg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.12.1.tgz", + "integrity": "sha512-hNK/DhmoJPsksdHuI/RVrcEws7GN5eamhi28JkO52MqIxU8Z0QpmiSOQxZHWOHV7I3P4UjHV97ay4TcamMA6Kw==", "requires": { "@babel/helper-plugin-utils": "7.10.4", - "@babel/plugin-transform-typescript": "7.11.0" + "@babel/plugin-transform-typescript": "7.12.1" } }, "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", + "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", "requires": { "regenerator-runtime": "0.13.7" } }, "@babel/runtime-corejs3": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.11.2.tgz", - "integrity": "sha512-qh5IR+8VgFz83VBa6OkaET6uN/mJOhHONuy3m1sgF0CV6mXdPSEBdA7e1eUbVvyNtANjMbg22JUv71BaDXLY6A==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.12.1.tgz", + "integrity": "sha512-umhPIcMrlBZ2aTWlWjUseW9LjQKxi1dpFlQS8DzsxB//5K+u6GLTC/JliPKHsd5kJVPIU6X/Hy0YvWOYPcMxBw==", "requires": { "core-js-pure": "3.6.5", "regenerator-runtime": "0.13.7" @@ -1124,36 +1100,41 @@ "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", "requires": { "@babel/code-frame": "7.10.4", - "@babel/parser": "7.11.5", - "@babel/types": "7.11.5" + "@babel/parser": "7.12.3", + "@babel/types": "7.12.1" } }, "@babel/traverse": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", - "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", + "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", "requires": { "@babel/code-frame": "7.10.4", - "@babel/generator": "7.11.6", + "@babel/generator": "7.12.1", "@babel/helper-function-name": "7.10.4", "@babel/helper-split-export-declaration": "7.11.0", - "@babel/parser": "7.11.5", - "@babel/types": "7.11.5", - "debug": "4.1.1", + "@babel/parser": "7.12.3", + "@babel/types": "7.12.1", + "debug": "4.2.0", "globals": "11.12.0", "lodash": "4.17.20" } }, "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", "requires": { "@babel/helper-validator-identifier": "7.10.4", "lodash": "4.17.20", "to-fast-properties": "2.0.0" } }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" + }, "@cnakazawa/watch": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", @@ -1173,6 +1154,38 @@ "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" }, + "@eslint/eslintrc": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.0.tgz", + "integrity": "sha512-+cIGPCBdLCzqxdtwppswP+zTsH9BOIGzAeKfBIbtb4gW/giMlfMwP0HUSFfhzh20f9u8uZ8hOp62+4GPquTbwQ==", + "requires": { + "ajv": "6.12.6", + "debug": "4.2.0", + "espree": "7.3.0", + "globals": "12.4.0", + "ignore": "4.0.6", + "import-fresh": "3.2.1", + "js-yaml": "3.14.0", + "lodash": "4.17.20", + "minimatch": "3.0.4", + "strip-json-comments": "3.1.1" + }, + "dependencies": { + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "requires": { + "type-fest": "0.8.1" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + } + } + }, "@hapi/address": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", @@ -1207,353 +1220,210 @@ "@hapi/hoek": "8.5.1" } }, - "@jest/console": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", - "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", - "requires": { - "@jest/source-map": "24.9.0", - "chalk": "2.4.2", - "slash": "2.0.0" - } - }, - "@jest/core": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", - "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "requires": { - "@jest/console": "24.9.0", - "@jest/reporters": "24.9.0", - "@jest/test-result": "24.9.0", - "@jest/transform": "24.9.0", - "@jest/types": "24.9.0", - "ansi-escapes": "3.2.0", - "chalk": "2.4.2", - "exit": "0.1.2", - "graceful-fs": "4.2.4", - "jest-changed-files": "24.9.0", - "jest-config": "24.9.0", - "jest-haste-map": "24.9.0", - "jest-message-util": "24.9.0", - "jest-regex-util": "24.9.0", - "jest-resolve": "24.9.0", - "jest-resolve-dependencies": "24.9.0", - "jest-runner": "24.9.0", - "jest-runtime": "24.9.0", - "jest-snapshot": "24.9.0", - "jest-util": "24.9.0", - "jest-validate": "24.9.0", - "jest-watcher": "24.9.0", - "micromatch": "3.1.10", - "p-each-series": "1.0.0", - "realpath-native": "1.1.0", - "rimraf": "2.7.1", - "slash": "2.0.0", - "strip-ansi": "5.2.0" + "camelcase": "5.3.1", + "find-up": "4.1.0", + "get-package-type": "0.1.0", + "js-yaml": "3.14.0", + "resolve-from": "5.0.0" }, "dependencies": { - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "requires": { - "ansi-regex": "4.1.0" + "locate-path": "5.0.0", + "path-exists": "4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "2.3.0" } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" } } }, - "@jest/environment": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", - "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", - "requires": { - "@jest/fake-timers": "24.9.0", - "@jest/transform": "24.9.0", - "@jest/types": "24.9.0", - "jest-mock": "24.9.0" - } - }, - "@jest/fake-timers": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", - "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", - "requires": { - "@jest/types": "24.9.0", - "jest-message-util": "24.9.0", - "jest-mock": "24.9.0" - } - }, - "@jest/reporters": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", - "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", - "requires": { - "@jest/environment": "24.9.0", - "@jest/test-result": "24.9.0", - "@jest/transform": "24.9.0", - "@jest/types": "24.9.0", - "chalk": "2.4.2", - "exit": "0.1.2", - "glob": "7.1.6", - "istanbul-lib-coverage": "2.0.5", - "istanbul-lib-instrument": "3.3.0", - "istanbul-lib-report": "2.0.8", - "istanbul-lib-source-maps": "3.0.6", - "istanbul-reports": "2.2.7", - "jest-haste-map": "24.9.0", - "jest-resolve": "24.9.0", - "jest-runtime": "24.9.0", - "jest-util": "24.9.0", - "jest-worker": "24.9.0", - "node-notifier": "5.4.3", - "slash": "2.0.0", - "source-map": "0.6.1", - "string-length": "2.0.0" - } + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==" }, - "@jest/source-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", - "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "@jest/console": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.1.tgz", + "integrity": "sha512-cjqcXepwC5M+VeIhwT6Xpi/tT4AiNzlIx8SMJ9IihduHnsSrnWNvTBfKIpmqOOCNOPqtbBx6w2JqfoLOJguo8g==", "requires": { - "callsites": "3.1.0", - "graceful-fs": "4.2.4", - "source-map": "0.6.1" + "@jest/types": "26.6.1", + "@types/node": "14.14.3", + "chalk": "4.1.0", + "jest-message-util": "26.6.1", + "jest-util": "26.6.1", + "slash": "3.0.0" }, "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - } - } - }, - "@jest/test-result": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", - "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", - "requires": { - "@jest/console": "24.9.0", - "@jest/types": "24.9.0", - "@types/istanbul-lib-coverage": "2.0.3" - } - }, - "@jest/test-sequencer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", - "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", - "requires": { - "@jest/test-result": "24.9.0", - "jest-haste-map": "24.9.0", - "jest-runner": "24.9.0", - "jest-runtime": "24.9.0" - } - }, - "@jest/transform": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", - "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", - "requires": { - "@babel/core": "7.9.0", - "@jest/types": "24.9.0", - "babel-plugin-istanbul": "5.2.0", - "chalk": "2.4.2", - "convert-source-map": "1.7.0", - "fast-json-stable-stringify": "2.1.0", - "graceful-fs": "4.2.4", - "jest-haste-map": "24.9.0", - "jest-regex-util": "24.9.0", - "jest-util": "24.9.0", - "micromatch": "3.1.10", - "pirates": "4.0.1", - "realpath-native": "1.1.0", - "slash": "2.0.0", - "source-map": "0.6.1", - "write-file-atomic": "2.4.1" - } - }, - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "requires": { - "@types/istanbul-lib-coverage": "2.0.3", - "@types/istanbul-reports": "1.1.2", - "@types/yargs": "13.0.10" - } - }, - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", - "requires": { - "call-me-maybe": "1.0.1", - "glob-to-regexp": "0.3.0" - } - }, - "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" - }, - "@nymproject/nym-client-wasm": { - "version": "file:../pkg" - }, - "@sheerun/mutationobserver-shim": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.3.tgz", - "integrity": "sha512-DetpxZw1fzPD5xUBrIAoplLChO2VB8DlL5Gg+I1IR9b2wPqYIca2WSUxL5g1vLeR4MsQq1NeWriXAVffV+U1Fw==" - }, - "@svgr/babel-plugin-add-jsx-attribute": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz", - "integrity": "sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig==" - }, - "@svgr/babel-plugin-remove-jsx-attribute": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz", - "integrity": "sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ==" - }, - "@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz", - "integrity": "sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w==" - }, - "@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz", - "integrity": "sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w==" - }, - "@svgr/babel-plugin-svg-dynamic-title": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.3.tgz", - "integrity": "sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w==" - }, - "@svgr/babel-plugin-svg-em-dimensions": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz", - "integrity": "sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w==" - }, - "@svgr/babel-plugin-transform-react-native-svg": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz", - "integrity": "sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw==" - }, - "@svgr/babel-plugin-transform-svg-component": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz", - "integrity": "sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw==" - }, - "@svgr/babel-preset": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.3.tgz", - "integrity": "sha512-6PG80tdz4eAlYUN3g5GZiUjg2FMcp+Wn6rtnz5WJG9ITGEF1pmFdzq02597Hn0OmnQuCVaBYQE1OVFAnwOl+0A==", - "requires": { - "@svgr/babel-plugin-add-jsx-attribute": "4.2.0", - "@svgr/babel-plugin-remove-jsx-attribute": "4.2.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "4.2.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "4.2.0", - "@svgr/babel-plugin-svg-dynamic-title": "4.3.3", - "@svgr/babel-plugin-svg-em-dimensions": "4.2.0", - "@svgr/babel-plugin-transform-react-native-svg": "4.2.0", - "@svgr/babel-plugin-transform-svg-component": "4.2.0" - } - }, - "@svgr/core": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.3.3.tgz", - "integrity": "sha512-qNuGF1QON1626UCaZamWt5yedpgOytvLj5BQZe2j1k1B8DUG4OyugZyfEwBeXozCUwhLEpsrgPrE+eCu4fY17w==", - "requires": { - "@svgr/plugin-jsx": "4.3.3", - "camelcase": "5.3.1", - "cosmiconfig": "5.2.1" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + "@jest/types": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.1.tgz", + "integrity": "sha512-ywHavIKNpAVrStiRY5wiyehvcktpijpItvGiK72RAn5ctqmzvPk8OvKnvHeBqa1XdQr959CTWAJMqxI8BTibyg==", + "requires": { + "@types/istanbul-lib-coverage": "2.0.3", + "@types/istanbul-reports": "3.0.0", + "@types/node": "14.14.3", + "@types/yargs": "15.0.9", + "chalk": "4.1.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "requires": { + "@types/istanbul-lib-report": "3.0.0" + } + }, + "@types/yargs": { + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", + "requires": { + "@types/yargs-parser": "15.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "4.3.0", + "supports-color": "7.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "4.0.0" + } } } }, - "@svgr/hast-util-to-babel-ast": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz", - "integrity": "sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg==", - "requires": { - "@babel/types": "7.11.5" - } - }, - "@svgr/plugin-jsx": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.3.tgz", - "integrity": "sha512-cLOCSpNWQnDB1/v+SUENHH7a0XY09bfuMKdq9+gYvtuwzC2rU4I0wKGFEp1i24holdQdwodCtDQdFtJiTCWc+w==", - "requires": { - "@babel/core": "7.9.0", - "@svgr/babel-preset": "4.3.3", - "@svgr/hast-util-to-babel-ast": "4.3.2", - "svg-parser": "2.0.4" - } - }, - "@svgr/plugin-svgo": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz", - "integrity": "sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w==", - "requires": { - "cosmiconfig": "5.2.1", - "merge-deep": "3.0.2", - "svgo": "1.3.2" - } - }, - "@svgr/webpack": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.3.3.tgz", - "integrity": "sha512-bjnWolZ6KVsHhgyCoYRFmbd26p8XVbulCzSG53BDQqAr+JOAderYK7CuYrB3bDjHJuF6LJ7Wrr42+goLRV9qIg==", - "requires": { - "@babel/core": "7.9.0", - "@babel/plugin-transform-react-constant-elements": "7.10.4", - "@babel/preset-env": "7.11.5", - "@babel/preset-react": "7.10.4", - "@svgr/core": "4.3.3", - "@svgr/plugin-jsx": "4.3.3", - "@svgr/plugin-svgo": "4.3.1", - "loader-utils": "1.4.0" - } - }, - "@testing-library/dom": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-6.16.0.tgz", - "integrity": "sha512-lBD88ssxqEfz0wFL6MeUyyWZfV/2cjEZZV3YRpb2IoJRej/4f1jB0TzqIOznTpfR1r34CNesrubxwIlAQ8zgPA==", - "requires": { - "@babel/runtime": "7.11.2", - "@sheerun/mutationobserver-shim": "0.3.3", - "@types/testing-library__dom": "6.14.0", - "aria-query": "4.2.2", - "dom-accessibility-api": "0.3.0", - "pretty-format": "25.5.0", - "wait-for-expect": "3.0.2" + "@jest/core": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.1.tgz", + "integrity": "sha512-p4F0pgK3rKnoS9olXXXOkbus1Bsu6fd8pcvLMPsUy4CVXZ8WSeiwQ1lK5hwkCIqJ+amZOYPd778sbPha/S8Srw==", + "requires": { + "@jest/console": "26.6.1", + "@jest/reporters": "26.6.1", + "@jest/test-result": "26.6.1", + "@jest/transform": "26.6.1", + "@jest/types": "26.6.1", + "@types/node": "14.14.3", + "ansi-escapes": "4.3.1", + "chalk": "4.1.0", + "exit": "0.1.2", + "graceful-fs": "4.2.4", + "jest-changed-files": "26.6.1", + "jest-config": "26.6.1", + "jest-haste-map": "26.6.1", + "jest-message-util": "26.6.1", + "jest-regex-util": "26.0.0", + "jest-resolve": "26.6.1", + "jest-resolve-dependencies": "26.6.1", + "jest-runner": "26.6.1", + "jest-runtime": "26.6.1", + "jest-snapshot": "26.6.1", + "jest-util": "26.6.1", + "jest-validate": "26.6.1", + "jest-watcher": "26.6.1", + "micromatch": "4.0.2", + "p-each-series": "2.1.0", + "rimraf": "3.0.2", + "slash": "3.0.0", + "strip-ansi": "6.0.0" }, "dependencies": { "@jest/types": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", - "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.1.tgz", + "integrity": "sha512-ywHavIKNpAVrStiRY5wiyehvcktpijpItvGiK72RAn5ctqmzvPk8OvKnvHeBqa1XdQr959CTWAJMqxI8BTibyg==", "requires": { "@types/istanbul-lib-coverage": "2.0.3", - "@types/istanbul-reports": "1.1.2", - "@types/yargs": "15.0.5", - "chalk": "3.0.0" + "@types/istanbul-reports": "3.0.0", + "@types/node": "14.14.3", + "@types/yargs": "15.0.9", + "chalk": "4.1.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "requires": { + "@types/istanbul-lib-report": "3.0.0" } }, "@types/yargs": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", - "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==", + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", "requires": { "@types/yargs-parser": "15.0.0" } @@ -1564,20 +1434,19 @@ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "@types/color-name": "1.1.1", "color-convert": "2.0.1" } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "requires": { - "ansi-styles": "4.2.1", + "ansi-styles": "4.3.0", "supports-color": "7.2.0" } }, @@ -1594,20 +1463,109 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "5.0.0", + "path-exists": "4.0.0" + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, - "pretty-format": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", - "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "jest-resolve": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.1.tgz", + "integrity": "sha512-hiHfQH6rrcpAmw9xCQ0vD66SDuU+7ZulOuKwc4jpbmFFsz0bQG/Ib92K+9/489u5rVw0btr/ZhiHqBpmkbCvuQ==", "requires": { - "@jest/types": "25.5.0", - "ansi-regex": "5.0.0", - "ansi-styles": "4.2.1", - "react-is": "16.13.1" + "@jest/types": "26.6.1", + "chalk": "4.1.0", + "graceful-fs": "4.2.4", + "jest-pnp-resolver": "1.2.2", + "jest-util": "26.6.1", + "read-pkg-up": "7.0.1", + "resolve": "1.18.1", + "slash": "3.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "2.3.0" + } + }, + "parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "requires": { + "@babel/code-frame": "7.10.4", + "error-ex": "1.3.2", + "json-parse-even-better-errors": "2.3.1", + "lines-and-columns": "1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "requires": { + "@types/normalize-package-data": "2.4.0", + "normalize-package-data": "2.5.0", + "parse-json": "5.1.0", + "type-fest": "0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "requires": { + "find-up": "4.1.0", + "read-pkg": "5.2.0", + "type-fest": "0.8.1" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "7.1.6" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "5.0.0" } }, "supports-color": { @@ -1620,224 +1578,59 @@ } } }, - "@testing-library/jest-dom": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-4.2.4.tgz", - "integrity": "sha512-j31Bn0rQo12fhCWOUWy9fl7wtqkp7In/YP2p5ZFyRuiiB9Qs3g+hS4gAmDWONbAHcRmVooNJ5eOHQDCOmUFXHg==", - "requires": { - "@babel/runtime": "7.11.2", - "chalk": "2.4.2", - "css": "2.2.4", - "css.escape": "1.5.1", - "jest-diff": "24.9.0", - "jest-matcher-utils": "24.9.0", - "lodash": "4.17.20", - "pretty-format": "24.9.0", - "redent": "3.0.0" - } - }, - "@testing-library/react": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-9.5.0.tgz", - "integrity": "sha512-di1b+D0p+rfeboHO5W7gTVeZDIK5+maEgstrZbWZSSvxDyfDRkkyBE1AJR5Psd6doNldluXlCWqXriUfqu/9Qg==", - "requires": { - "@babel/runtime": "7.11.2", - "@testing-library/dom": "6.16.0", - "@types/testing-library__react": "9.1.3" - } - }, - "@testing-library/user-event": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-7.2.1.tgz", - "integrity": "sha512-oZ0Ib5I4Z2pUEcoo95cT1cr6slco9WY7yiPpG+RGNkj8YcYgJnM7pXmYmorNOReh8MIGcKSqXyeGjxnr8YiZbA==" - }, - "@types/babel__core": { - "version": "7.1.9", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.9.tgz", - "integrity": "sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw==", - "requires": { - "@babel/parser": "7.11.5", - "@babel/types": "7.11.5", - "@types/babel__generator": "7.6.1", - "@types/babel__template": "7.0.2", - "@types/babel__traverse": "7.0.13" - } - }, - "@types/babel__generator": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", - "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", - "requires": { - "@babel/types": "7.11.5" - } - }, - "@types/babel__template": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", - "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", - "requires": { - "@babel/parser": "7.11.5", - "@babel/types": "7.11.5" - } - }, - "@types/babel__traverse": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.13.tgz", - "integrity": "sha512-i+zS7t6/s9cdQvbqKDARrcbrPvtJGlbYsMkazo03nTAK3RX9FNrLllXys22uiTGJapPOTZTQ35nHh4ISph4SLQ==", - "requires": { - "@babel/types": "7.11.5" - } - }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" - }, - "@types/eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==" - }, - "@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", - "requires": { - "@types/minimatch": "3.0.3", - "@types/node": "14.6.4" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==" - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "requires": { - "@types/istanbul-lib-coverage": "2.0.3" - } - }, - "@types/istanbul-reports": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", - "requires": { - "@types/istanbul-lib-coverage": "2.0.3", - "@types/istanbul-lib-report": "3.0.0" - } - }, - "@types/json-schema": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", - "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==" - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" - }, - "@types/node": { - "version": "14.6.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.6.4.tgz", - "integrity": "sha512-Wk7nG1JSaMfMpoMJDKUsWYugliB2Vy55pdjLpmLixeyMi7HizW2I/9QoxsPCkXl3dO+ZOVqPumKaDUv5zJu2uQ==" - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" - }, - "@types/prop-types": { - "version": "15.7.3", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", - "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" - }, - "@types/q": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", - "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" - }, - "@types/react": { - "version": "16.9.49", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.49.tgz", - "integrity": "sha512-DtLFjSj0OYAdVLBbyjhuV9CdGVHCkHn2R+xr3XkBvK2rS1Y1tkc14XSGjYgm5Fjjr90AxH9tiSzc1pCFMGO06g==", - "requires": { - "@types/prop-types": "15.7.3", - "csstype": "3.0.3" - } - }, - "@types/react-dom": { - "version": "16.9.8", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.8.tgz", - "integrity": "sha512-ykkPQ+5nFknnlU6lDd947WbQ6TE3NNzbQAkInC2EKY1qeYdTKp7onFusmYZb+ityzx2YviqT6BXSu+LyWWJwcA==", - "requires": { - "@types/react": "16.9.49" - } - }, - "@types/stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==" - }, - "@types/testing-library__dom": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/testing-library__dom/-/testing-library__dom-6.14.0.tgz", - "integrity": "sha512-sMl7OSv0AvMOqn1UJ6j1unPMIHRXen0Ita1ujnMX912rrOcawe4f7wu0Zt9GIQhBhJvH2BaibqFgQ3lP+Pj2hA==", - "requires": { - "pretty-format": "24.9.0" - } - }, - "@types/testing-library__react": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/@types/testing-library__react/-/testing-library__react-9.1.3.tgz", - "integrity": "sha512-iCdNPKU3IsYwRK9JieSYAiX0+aYDXOGAmrC/3/M7AqqSDKnWWVv07X+Zk1uFSL7cMTUYzv4lQRfohucEocn5/w==", - "requires": { - "@types/react-dom": "16.9.8", - "@types/testing-library__dom": "6.14.0", - "pretty-format": "25.5.0" + "@jest/environment": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.1.tgz", + "integrity": "sha512-GNvHwkOFJtNgSwdzH9flUPzF9AYAZhUg124CBoQcwcZCM9s5TLz8Y3fMtiaWt4ffbigoetjGk5PU2Dd8nLrSEw==", + "requires": { + "@jest/fake-timers": "26.6.1", + "@jest/types": "26.6.1", + "@types/node": "14.14.3", + "jest-mock": "26.6.1" }, "dependencies": { "@jest/types": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", - "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.1.tgz", + "integrity": "sha512-ywHavIKNpAVrStiRY5wiyehvcktpijpItvGiK72RAn5ctqmzvPk8OvKnvHeBqa1XdQr959CTWAJMqxI8BTibyg==", "requires": { "@types/istanbul-lib-coverage": "2.0.3", - "@types/istanbul-reports": "1.1.2", - "@types/yargs": "15.0.5", - "chalk": "3.0.0" + "@types/istanbul-reports": "3.0.0", + "@types/node": "14.14.3", + "@types/yargs": "15.0.9", + "chalk": "4.1.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "requires": { + "@types/istanbul-lib-report": "3.0.0" } }, "@types/yargs": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", - "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==", + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", "requires": { "@types/yargs-parser": "15.0.0" } }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "@types/color-name": "1.1.1", "color-convert": "2.0.1" } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "requires": { - "ansi-styles": "4.2.1", + "ansi-styles": "4.3.0", "supports-color": "7.2.0" } }, @@ -1859,17 +1652,92 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, - "pretty-format": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", - "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { - "@jest/types": "25.5.0", - "ansi-regex": "5.0.0", - "ansi-styles": "4.2.1", - "react-is": "16.13.1" + "has-flag": "4.0.0" + } + } + } + }, + "@jest/fake-timers": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.1.tgz", + "integrity": "sha512-T/SkMLgOquenw/nIisBRD6XAYpFir0kNuclYLkse5BpzeDUukyBr+K31xgAo9M0hgjU9ORlekAYPSzc0DKfmKg==", + "requires": { + "@jest/types": "26.6.1", + "@sinonjs/fake-timers": "6.0.1", + "@types/node": "14.14.3", + "jest-message-util": "26.6.1", + "jest-mock": "26.6.1", + "jest-util": "26.6.1" + }, + "dependencies": { + "@jest/types": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.1.tgz", + "integrity": "sha512-ywHavIKNpAVrStiRY5wiyehvcktpijpItvGiK72RAn5ctqmzvPk8OvKnvHeBqa1XdQr959CTWAJMqxI8BTibyg==", + "requires": { + "@types/istanbul-lib-coverage": "2.0.3", + "@types/istanbul-reports": "3.0.0", + "@types/node": "14.14.3", + "@types/yargs": "15.0.9", + "chalk": "4.1.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "requires": { + "@types/istanbul-lib-report": "3.0.0" + } + }, + "@types/yargs": { + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", + "requires": { + "@types/yargs-parser": "15.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "4.3.0", + "supports-color": "7.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "1.1.4" } }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -1880,2209 +1748,1786 @@ } } }, - "@types/yargs": { - "version": "13.0.10", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.10.tgz", - "integrity": "sha512-MU10TSgzNABgdzKvQVW1nuuT+sgBMWeXNc3XOs5YXV5SDAK+PPja2eUuBNB9iqElu03xyEDqlnGw0jgl4nbqGQ==", - "requires": { - "@types/yargs-parser": "15.0.0" - } - }, - "@types/yargs-parser": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", - "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==" - }, - "@typescript-eslint/eslint-plugin": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz", - "integrity": "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==", - "requires": { - "@typescript-eslint/experimental-utils": "2.34.0", - "functional-red-black-tree": "1.0.1", - "regexpp": "3.1.0", - "tsutils": "3.17.1" - } - }, - "@typescript-eslint/experimental-utils": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", - "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", - "requires": { - "@types/json-schema": "7.0.6", - "@typescript-eslint/typescript-estree": "2.34.0", - "eslint-scope": "5.1.0", - "eslint-utils": "2.1.0" - } - }, - "@typescript-eslint/parser": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz", - "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==", - "requires": { - "@types/eslint-visitor-keys": "1.0.0", - "@typescript-eslint/experimental-utils": "2.34.0", - "@typescript-eslint/typescript-estree": "2.34.0", - "eslint-visitor-keys": "1.3.0" - } - }, - "@typescript-eslint/typescript-estree": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", - "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", - "requires": { - "debug": "4.1.1", - "eslint-visitor-keys": "1.3.0", - "glob": "7.1.6", - "is-glob": "4.0.1", - "lodash": "4.17.20", - "semver": "7.3.2", - "tsutils": "3.17.1" - } - }, - "@webassemblyjs/ast": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", - "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", - "requires": { - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", - "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==" - }, - "@webassemblyjs/helper-api-error": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", - "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==" - }, - "@webassemblyjs/helper-buffer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", - "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==" - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", - "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "@jest/globals": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.1.tgz", + "integrity": "sha512-acxXsSguuLV/CeMYmBseefw6apO7NuXqpE+v5r3yD9ye2PY7h1nS20vY7Obk2w6S7eJO4OIAJeDnoGcLC/McEQ==", "requires": { - "@webassemblyjs/wast-printer": "1.8.5" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", - "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==" - }, - "@webassemblyjs/helper-module-context": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", - "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", - "requires": { - "@webassemblyjs/ast": "1.8.5", - "mamacro": "0.0.3" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", - "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==" - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", - "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", - "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", - "requires": { - "@xtuc/ieee754": "1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", - "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", - "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==" - }, - "@webassemblyjs/wasm-edit": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", - "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/helper-wasm-section": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-opt": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "@webassemblyjs/wast-printer": "1.8.5" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", - "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", - "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", - "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", - "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/floating-point-hex-parser": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-code-frame": "1.8.5", - "@webassemblyjs/helper-fsm": "1.8.5", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", - "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" - }, - "abab": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.4.tgz", - "integrity": "sha512-Eu9ELJWCz/c1e9gTiCY+FceWxcqzjYEbqMgtndnuSqZSUCOL73TWNK2mHfIj4Cw2E/ongOp+JISVNCmovt2KYQ==" - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "requires": { - "mime-types": "2.1.27", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", - "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==" - }, - "acorn-globals": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", - "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", - "requires": { - "acorn": "6.4.1", - "acorn-walk": "6.2.0" - }, - "dependencies": { - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" - } - } - }, - "acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==" - }, - "acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==" - }, - "address": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", - "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" - }, - "adjust-sourcemap-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz", - "integrity": "sha512-4hFsTsn58+YjrU9qKzML2JSSDqKvN8mUGQ0nNIrfPi8hmIONT4L3uUaT6MKdMsZ9AjsU6D2xDkZxCkbQPxChrA==", - "requires": { - "assert": "1.4.1", - "camelcase": "5.0.0", - "loader-utils": "1.2.3", - "object-path": "0.11.4", - "regex-parser": "2.2.10" + "@jest/environment": "26.6.1", + "@jest/types": "26.6.1", + "expect": "26.6.1" }, "dependencies": { - "camelcase": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", - "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==" + "@jest/types": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.1.tgz", + "integrity": "sha512-ywHavIKNpAVrStiRY5wiyehvcktpijpItvGiK72RAn5ctqmzvPk8OvKnvHeBqa1XdQr959CTWAJMqxI8BTibyg==", + "requires": { + "@types/istanbul-lib-coverage": "2.0.3", + "@types/istanbul-reports": "3.0.0", + "@types/node": "14.14.3", + "@types/yargs": "15.0.9", + "chalk": "4.1.0" + } }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "requires": { + "@types/istanbul-lib-report": "3.0.0" + } }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "@types/yargs": { + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", "requires": { - "minimist": "1.2.5" + "@types/yargs-parser": "15.0.0" } }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "big.js": "5.2.2", - "emojis-list": "2.1.0", - "json5": "1.0.1" + "color-convert": "2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "4.3.0", + "supports-color": "7.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "4.0.0" } } } }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "requires": { - "clean-stack": "2.2.0", - "indent-string": "4.0.0" - } - }, - "ajv": { - "version": "6.12.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", - "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", - "requires": { - "fast-deep-equal": "3.1.3", - "fast-json-stable-stringify": "2.1.0", - "json-schema-traverse": "0.4.1", - "uri-js": "4.4.0" - } - }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" - }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" - }, - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" - }, - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "requires": { - "type-fest": "0.11.0" + "@jest/reporters": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.1.tgz", + "integrity": "sha512-J6OlXVFY3q1SXWJhjme5i7qT/BAZSikdOK2t8Ht5OS32BDo6KfG5CzIzzIFnAVd82/WWbc9Hb7SJ/jwSvVH9YA==", + "requires": { + "@bcoe/v8-coverage": "0.2.3", + "@jest/console": "26.6.1", + "@jest/test-result": "26.6.1", + "@jest/transform": "26.6.1", + "@jest/types": "26.6.1", + "chalk": "4.1.0", + "collect-v8-coverage": "1.0.1", + "exit": "0.1.2", + "glob": "7.1.6", + "graceful-fs": "4.2.4", + "istanbul-lib-coverage": "3.0.0", + "istanbul-lib-instrument": "4.0.3", + "istanbul-lib-report": "3.0.0", + "istanbul-lib-source-maps": "4.0.0", + "istanbul-reports": "3.0.2", + "jest-haste-map": "26.6.1", + "jest-resolve": "26.6.1", + "jest-util": "26.6.1", + "jest-worker": "26.6.1", + "node-notifier": "8.0.0", + "slash": "3.0.0", + "source-map": "0.6.1", + "string-length": "4.0.1", + "terminal-link": "2.1.1", + "v8-to-istanbul": "6.0.1" }, "dependencies": { - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" - } - } - }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "1.9.3" - } - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "requires": { - "micromatch": "3.1.10", - "normalize-path": "2.1.1" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.7" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "1.0.3" + "@jest/types": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.1.tgz", + "integrity": "sha512-ywHavIKNpAVrStiRY5wiyehvcktpijpItvGiK72RAn5ctqmzvPk8OvKnvHeBqa1XdQr959CTWAJMqxI8BTibyg==", + "requires": { + "@types/istanbul-lib-coverage": "2.0.3", + "@types/istanbul-reports": "3.0.0", + "@types/node": "14.14.3", + "@types/yargs": "15.0.9", + "chalk": "4.1.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "requires": { + "@types/istanbul-lib-report": "3.0.0" + } + }, + "@types/yargs": { + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", + "requires": { + "@types/yargs-parser": "15.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "4.3.0", + "supports-color": "7.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "5.0.0", + "path-exists": "4.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-resolve": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.1.tgz", + "integrity": "sha512-hiHfQH6rrcpAmw9xCQ0vD66SDuU+7ZulOuKwc4jpbmFFsz0bQG/Ib92K+9/489u5rVw0btr/ZhiHqBpmkbCvuQ==", + "requires": { + "@jest/types": "26.6.1", + "chalk": "4.1.0", + "graceful-fs": "4.2.4", + "jest-pnp-resolver": "1.2.2", + "jest-util": "26.6.1", + "read-pkg-up": "7.0.1", + "resolve": "1.18.1", + "slash": "3.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "2.3.0" + } + }, + "parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "requires": { + "@babel/code-frame": "7.10.4", + "error-ex": "1.3.2", + "json-parse-even-better-errors": "2.3.1", + "lines-and-columns": "1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "requires": { + "@types/normalize-package-data": "2.4.0", + "normalize-package-data": "2.5.0", + "parse-json": "5.1.0", + "type-fest": "0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "requires": { + "find-up": "4.1.0", + "read-pkg": "5.2.0", + "type-fest": "0.8.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "4.0.0" + } + } } }, - "aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "@jest/source-map": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.5.0.tgz", + "integrity": "sha512-jWAw9ZwYHJMe9eZq/WrsHlwF8E3hM9gynlcDpOyCb9bR8wEd9ZNBZCi7/jZyzHxC7t3thZ10gO2IDhu0bPKS5g==", "requires": { - "@babel/runtime": "7.11.2", - "@babel/runtime-corejs3": "7.11.2" + "callsites": "3.1.0", + "graceful-fs": "4.2.4", + "source-map": "0.6.1" } }, - "arity-n": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", - "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=" - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" - }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" - }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" - }, - "array-includes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", - "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "@jest/test-result": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.1.tgz", + "integrity": "sha512-wqAgIerIN2gSdT2A8WeA5+AFh9XQBqYGf8etK143yng3qYd0mF0ie2W5PVmgnjw4VDU6ammI9NdXrKgNhreawg==", "requires": { - "define-properties": "1.1.3", - "es-abstract": "1.17.6", - "is-string": "1.0.5" + "@jest/console": "26.6.1", + "@jest/types": "26.6.1", + "@types/istanbul-lib-coverage": "2.0.3", + "collect-v8-coverage": "1.0.1" + }, + "dependencies": { + "@jest/types": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.1.tgz", + "integrity": "sha512-ywHavIKNpAVrStiRY5wiyehvcktpijpItvGiK72RAn5ctqmzvPk8OvKnvHeBqa1XdQr959CTWAJMqxI8BTibyg==", + "requires": { + "@types/istanbul-lib-coverage": "2.0.3", + "@types/istanbul-reports": "3.0.0", + "@types/node": "14.14.3", + "@types/yargs": "15.0.9", + "chalk": "4.1.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "requires": { + "@types/istanbul-lib-report": "3.0.0" + } + }, + "@types/yargs": { + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", + "requires": { + "@types/yargs-parser": "15.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "4.3.0", + "supports-color": "7.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "4.0.0" + } + } } }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "@jest/test-sequencer": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.1.tgz", + "integrity": "sha512-0csqA/XApZiNeTIPYh6koIDCACSoR6hi29T61tKJMtCZdEC+tF3PoNt7MS0oK/zKC6daBgCbqXxia5ztr/NyCQ==", "requires": { - "array-uniq": "1.0.3" + "@jest/test-result": "26.6.1", + "graceful-fs": "4.2.4", + "jest-haste-map": "26.6.1", + "jest-runner": "26.6.1", + "jest-runtime": "26.6.1" } }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "array.prototype.flat": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", - "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", + "@jest/transform": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.1.tgz", + "integrity": "sha512-oNFAqVtqRxZRx6vXL3I4bPKUK0BIlEeaalkwxyQGGI8oXDQBtYQBpiMe5F7qPs4QdvvFYB42gPGIMMcxXaBBxQ==", "requires": { - "define-properties": "1.1.3", - "es-abstract": "1.17.6" - } - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "2.1.2" - } - }, - "asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "requires": { - "bn.js": "4.11.9", - "inherits": "2.0.4", - "minimalistic-assert": "1.0.1", - "safer-buffer": "2.1.2" + "@babel/core": "7.12.3", + "@jest/types": "26.6.1", + "babel-plugin-istanbul": "6.0.0", + "chalk": "4.1.0", + "convert-source-map": "1.7.0", + "fast-json-stable-stringify": "2.1.0", + "graceful-fs": "4.2.4", + "jest-haste-map": "26.6.1", + "jest-regex-util": "26.0.0", + "jest-util": "26.6.1", + "micromatch": "4.0.2", + "pirates": "4.0.1", + "slash": "3.0.0", + "source-map": "0.6.1", + "write-file-atomic": "3.0.3" }, "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + "@jest/types": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.1.tgz", + "integrity": "sha512-ywHavIKNpAVrStiRY5wiyehvcktpijpItvGiK72RAn5ctqmzvPk8OvKnvHeBqa1XdQr959CTWAJMqxI8BTibyg==", + "requires": { + "@types/istanbul-lib-coverage": "2.0.3", + "@types/istanbul-reports": "3.0.0", + "@types/node": "14.14.3", + "@types/yargs": "15.0.9", + "chalk": "4.1.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "requires": { + "@types/istanbul-lib-report": "3.0.0" + } + }, + "@types/yargs": { + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", + "requires": { + "@types/yargs-parser": "15.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "4.3.0", + "supports-color": "7.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "4.0.0" + } } } }, - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", "requires": { - "util": "0.10.3" + "@types/istanbul-lib-coverage": "2.0.3", + "@types/istanbul-reports": "1.1.2", + "@types/yargs": "13.0.11" } }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" - }, - "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" - }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", "requires": { - "lodash": "4.17.20" + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "1.1.9" } }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" - }, - "async-foreach": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=" - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==" }, - "autoprefixer": { - "version": "9.8.6", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", - "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", + "@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", "requires": { - "browserslist": "4.14.1", - "caniuse-lite": "1.0.30001124", - "colorette": "1.2.1", - "normalize-range": "0.1.2", - "num2fraction": "1.2.2", - "postcss": "7.0.32", - "postcss-value-parser": "4.1.0" + "@nodelib/fs.scandir": "2.1.3", + "fastq": "1.8.0" } }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", - "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==" - }, - "axobject-query": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", - "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "@npmcli/move-file": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.0.1.tgz", + "integrity": "sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==", "requires": { - "chalk": "1.1.3", - "esutils": "2.0.3", - "js-tokens": "3.0.2" + "mkdirp": "1.0.4" }, "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" } } }, - "babel-eslint": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", - "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "@nymproject/nym-client-wasm": { + "version": "file:../pkg" + }, + "@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.4.2.tgz", + "integrity": "sha512-Loc4UDGutcZ+Bd56hBInkm6JyjyCwWy4t2wcDXzN8EDPANgVRj0VP8Nxn0Zq2pc+WKauZwEivQgbDGg4xZO20A==", "requires": { - "@babel/code-frame": "7.10.4", - "@babel/parser": "7.11.5", - "@babel/traverse": "7.11.5", - "@babel/types": "7.11.5", - "eslint-visitor-keys": "1.3.0", - "resolve": "1.17.0" + "ansi-html": "0.0.7", + "error-stack-parser": "2.0.6", + "html-entities": "1.3.1", + "native-url": "0.2.6", + "schema-utils": "2.7.1", + "source-map": "0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } } }, - "babel-extract-comments": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz", - "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==", + "@rollup/plugin-node-resolve": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz", + "integrity": "sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q==", "requires": { - "babylon": "6.18.0" + "@rollup/pluginutils": "3.1.0", + "@types/resolve": "0.0.8", + "builtin-modules": "3.1.0", + "is-module": "1.0.0", + "resolve": "1.18.1" } }, - "babel-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", - "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", + "@rollup/plugin-replace": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.3.3.tgz", + "integrity": "sha512-XPmVXZ7IlaoWaJLkSCDaa0Y6uVo5XQYHhiMFzOd5qSv5rE+t/UJToPIOE56flKIxBFQI27ONsxb7dqHnwSsjKQ==", "requires": { - "@jest/transform": "24.9.0", - "@jest/types": "24.9.0", - "@types/babel__core": "7.1.9", - "babel-plugin-istanbul": "5.2.0", - "babel-preset-jest": "24.9.0", - "chalk": "2.4.2", - "slash": "2.0.0" + "@rollup/pluginutils": "3.1.0", + "magic-string": "0.25.7" } }, - "babel-loader": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", - "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", + "@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", "requires": { - "find-cache-dir": "2.1.0", - "loader-utils": "1.4.0", - "mkdirp": "0.5.5", - "pify": "4.0.1", - "schema-utils": "2.7.1" + "@types/estree": "0.0.39", + "estree-walker": "1.0.1", + "picomatch": "2.2.2" }, "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" } } }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "@sheerun/mutationobserver-shim": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.3.tgz", + "integrity": "sha512-DetpxZw1fzPD5xUBrIAoplLChO2VB8DlL5Gg+I1IR9b2wPqYIca2WSUxL5g1vLeR4MsQq1NeWriXAVffV+U1Fw==" + }, + "@sinonjs/commons": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", + "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", "requires": { - "object.assign": "4.1.0" + "type-detect": "4.0.8" } }, - "babel-plugin-istanbul": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", - "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", + "@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", "requires": { - "@babel/helper-plugin-utils": "7.10.4", - "find-up": "3.0.0", - "istanbul-lib-instrument": "3.3.0", - "test-exclude": "5.2.3" + "@sinonjs/commons": "1.8.1" + } + }, + "@surma/rollup-plugin-off-main-thread": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-1.4.1.tgz", + "integrity": "sha512-ZPBWYQDdO4JZiTmTP3DABsHhIPA7bEJk9Znk7tZsrbPGanoGo8YxMv//WLx5Cvb+lRgS42+6yiOIYYHCKDmkpQ==", + "requires": { + "ejs": "2.7.4", + "magic-string": "0.25.7" + } + }, + "@svgr/babel-plugin-add-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==" + }, + "@svgr/babel-plugin-remove-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==" + }, + "@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", + "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==" + }, + "@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", + "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==" + }, + "@svgr/babel-plugin-svg-dynamic-title": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", + "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==" + }, + "@svgr/babel-plugin-svg-em-dimensions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", + "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==" + }, + "@svgr/babel-plugin-transform-react-native-svg": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", + "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==" + }, + "@svgr/babel-plugin-transform-svg-component": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.4.0.tgz", + "integrity": "sha512-zLl4Fl3NvKxxjWNkqEcpdSOpQ3LGVH2BNFQ6vjaK6sFo2IrSznrhURIPI0HAphKiiIwNYjAfE0TNoQDSZv0U9A==" + }, + "@svgr/babel-preset": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.4.0.tgz", + "integrity": "sha512-Gyx7cCxua04DBtyILTYdQxeO/pwfTBev6+eXTbVbxe4HTGhOUW6yo7PSbG2p6eJMl44j6XSequ0ZDP7bl0nu9A==", + "requires": { + "@svgr/babel-plugin-add-jsx-attribute": "5.4.0", + "@svgr/babel-plugin-remove-jsx-attribute": "5.4.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "5.0.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "5.0.1", + "@svgr/babel-plugin-svg-dynamic-title": "5.4.0", + "@svgr/babel-plugin-svg-em-dimensions": "5.4.0", + "@svgr/babel-plugin-transform-react-native-svg": "5.4.0", + "@svgr/babel-plugin-transform-svg-component": "5.4.0" + } + }, + "@svgr/core": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.4.0.tgz", + "integrity": "sha512-hWGm1DCCvd4IEn7VgDUHYiC597lUYhFau2lwJBYpQWDirYLkX4OsXu9IslPgJ9UpP7wsw3n2Ffv9sW7SXJVfqQ==", + "requires": { + "@svgr/plugin-jsx": "5.4.0", + "camelcase": "6.1.0", + "cosmiconfig": "6.0.0" }, "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "3.0.0" - } + "camelcase": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.1.0.tgz", + "integrity": "sha512-WCMml9ivU60+8rEJgELlFp1gxFcEGxwYleE3bziHEDeqsqAWGHdimB7beBFGjLzVNgPGyDsfgXLQEYMpmIFnVQ==" } } }, - "babel-plugin-jest-hoist": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", - "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", + "@svgr/hast-util-to-babel-ast": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.4.0.tgz", + "integrity": "sha512-+U0TZZpPsP2V1WvVhqAOSTk+N+CjYHdZx+x9UBa1eeeZDXwH8pt0CrQf2+SvRl/h2CAPRFkm+Ey96+jKP8Bsgg==", "requires": { - "@types/babel__traverse": "7.0.13" + "@babel/types": "7.12.1" } }, - "babel-plugin-macros": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", - "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", + "@svgr/plugin-jsx": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.4.0.tgz", + "integrity": "sha512-SGzO4JZQ2HvGRKDzRga9YFSqOqaNrgLlQVaGvpZ2Iht2gwRp/tq+18Pvv9kS9ZqOMYgyix2LLxZMY1LOe9NPqw==", + "requires": { + "@babel/core": "7.12.3", + "@svgr/babel-preset": "5.4.0", + "@svgr/hast-util-to-babel-ast": "5.4.0", + "svg-parser": "2.0.4" + } + }, + "@svgr/plugin-svgo": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.4.0.tgz", + "integrity": "sha512-3Cgv3aYi1l6SHyzArV9C36yo4kgwVdF3zPQUC6/aCDUeXAofDYwE5kk3e3oT5ZO2a0N3lB+lLGvipBG6lnG8EA==", "requires": { - "@babel/runtime": "7.11.2", "cosmiconfig": "6.0.0", - "resolve": "1.17.0" + "merge-deep": "3.0.2", + "svgo": "1.3.2" + } + }, + "@svgr/webpack": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.4.0.tgz", + "integrity": "sha512-LjepnS/BSAvelnOnnzr6Gg0GcpLmnZ9ThGFK5WJtm1xOqdBE/1IACZU7MMdVzjyUkfFqGz87eRE4hFaSLiUwYg==", + "requires": { + "@babel/core": "7.12.3", + "@babel/plugin-transform-react-constant-elements": "7.12.1", + "@babel/preset-env": "7.12.1", + "@babel/preset-react": "7.12.1", + "@svgr/core": "5.4.0", + "@svgr/plugin-jsx": "5.4.0", + "@svgr/plugin-svgo": "5.4.0", + "loader-utils": "2.0.0" + } + }, + "@testing-library/dom": { + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-6.16.0.tgz", + "integrity": "sha512-lBD88ssxqEfz0wFL6MeUyyWZfV/2cjEZZV3YRpb2IoJRej/4f1jB0TzqIOznTpfR1r34CNesrubxwIlAQ8zgPA==", + "requires": { + "@babel/runtime": "7.12.1", + "@sheerun/mutationobserver-shim": "0.3.3", + "@types/testing-library__dom": "6.14.0", + "aria-query": "4.2.2", + "dom-accessibility-api": "0.3.0", + "pretty-format": "25.5.0", + "wait-for-expect": "3.0.2" }, "dependencies": { - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "@jest/types": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", "requires": { - "@types/parse-json": "4.0.0", - "import-fresh": "3.2.1", - "parse-json": "5.1.0", - "path-type": "4.0.0", - "yaml": "1.10.0" + "@types/istanbul-lib-coverage": "2.0.3", + "@types/istanbul-reports": "1.1.2", + "@types/yargs": "15.0.9", + "chalk": "3.0.0" } }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "@types/yargs": { + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", "requires": { - "parent-module": "1.0.1", - "resolve-from": "4.0.0" + "@types/yargs-parser": "15.0.0" } }, - "parse-json": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", - "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "@babel/code-frame": "7.10.4", - "error-ex": "1.3.2", - "json-parse-even-better-errors": "2.3.1", - "lines-and-columns": "1.1.6" + "color-convert": "2.0.1" } }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "4.3.0", + "supports-color": "7.2.0" + } }, - "resolve-from": { + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "pretty-format": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "requires": { + "@jest/types": "25.5.0", + "ansi-regex": "5.0.0", + "ansi-styles": "4.3.0", + "react-is": "16.13.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "4.0.0" + } } } }, - "babel-plugin-named-asset-import": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.6.tgz", - "integrity": "sha512-1aGDUfL1qOOIoqk9QKGIo2lANk+C7ko/fqH0uIyC71x3PEGz0uVP8ISgfEsFuG+FKmjHTvFK/nNM8dowpmUxLA==" + "@testing-library/jest-dom": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-4.2.4.tgz", + "integrity": "sha512-j31Bn0rQo12fhCWOUWy9fl7wtqkp7In/YP2p5ZFyRuiiB9Qs3g+hS4gAmDWONbAHcRmVooNJ5eOHQDCOmUFXHg==", + "requires": { + "@babel/runtime": "7.12.1", + "chalk": "2.4.2", + "css": "2.2.4", + "css.escape": "1.5.1", + "jest-diff": "24.9.0", + "jest-matcher-utils": "24.9.0", + "lodash": "4.17.20", + "pretty-format": "24.9.0", + "redent": "3.0.0" + } }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" + "@testing-library/react": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-9.5.0.tgz", + "integrity": "sha512-di1b+D0p+rfeboHO5W7gTVeZDIK5+maEgstrZbWZSSvxDyfDRkkyBE1AJR5Psd6doNldluXlCWqXriUfqu/9Qg==", + "requires": { + "@babel/runtime": "7.12.1", + "@testing-library/dom": "6.16.0", + "@types/testing-library__react": "9.1.3" + } }, - "babel-plugin-transform-object-rest-spread": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "@testing-library/user-event": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-7.2.1.tgz", + "integrity": "sha512-oZ0Ib5I4Z2pUEcoo95cT1cr6slco9WY7yiPpG+RGNkj8YcYgJnM7pXmYmorNOReh8MIGcKSqXyeGjxnr8YiZbA==" + }, + "@types/anymatch": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", + "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==" + }, + "@types/babel__core": { + "version": "7.1.10", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.10.tgz", + "integrity": "sha512-x8OM8XzITIMyiwl5Vmo2B1cR1S1Ipkyv4mdlbJjMa1lmuKvKY9FrBbEANIaMlnWn5Rf7uO+rC/VgYabNkE17Hw==", "requires": { - "babel-plugin-syntax-object-rest-spread": "6.13.0", - "babel-runtime": "6.26.0" + "@babel/parser": "7.12.3", + "@babel/types": "7.12.1", + "@types/babel__generator": "7.6.2", + "@types/babel__template": "7.0.3", + "@types/babel__traverse": "7.0.15" } }, - "babel-plugin-transform-react-remove-prop-types": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", - "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" + "@types/babel__generator": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", + "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", + "requires": { + "@babel/types": "7.12.1" + } }, - "babel-preset-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", - "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", + "@types/babel__template": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.3.tgz", + "integrity": "sha512-uCoznIPDmnickEi6D0v11SBpW0OuVqHJCa7syXqQHy5uktSCreIlt0iglsCnmvz8yCb38hGcWeseA8cWJSwv5Q==", "requires": { - "@babel/plugin-syntax-object-rest-spread": "7.8.3", - "babel-plugin-jest-hoist": "24.9.0" + "@babel/parser": "7.12.3", + "@babel/types": "7.12.1" } }, - "babel-preset-react-app": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-9.1.2.tgz", - "integrity": "sha512-k58RtQOKH21NyKtzptoAvtAODuAJJs3ZhqBMl456/GnXEQ/0La92pNmwgWoMn5pBTrsvk3YYXdY7zpY4e3UIxA==", - "requires": { - "@babel/core": "7.9.0", - "@babel/plugin-proposal-class-properties": "7.8.3", - "@babel/plugin-proposal-decorators": "7.8.3", - "@babel/plugin-proposal-nullish-coalescing-operator": "7.8.3", - "@babel/plugin-proposal-numeric-separator": "7.8.3", - "@babel/plugin-proposal-optional-chaining": "7.9.0", - "@babel/plugin-transform-flow-strip-types": "7.9.0", - "@babel/plugin-transform-react-display-name": "7.8.3", - "@babel/plugin-transform-runtime": "7.9.0", - "@babel/preset-env": "7.9.0", - "@babel/preset-react": "7.9.1", - "@babel/preset-typescript": "7.9.0", - "@babel/runtime": "7.9.0", - "babel-plugin-macros": "2.8.0", - "babel-plugin-transform-react-remove-prop-types": "0.4.24" - }, - "dependencies": { - "@babel/plugin-proposal-class-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz", - "integrity": "sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA==", - "requires": { - "@babel/helper-create-class-features-plugin": "7.10.5", - "@babel/helper-plugin-utils": "7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==", - "requires": { - "@babel/helper-plugin-utils": "7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "7.8.3" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz", - "integrity": "sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==", - "requires": { - "@babel/helper-plugin-utils": "7.10.4", - "@babel/plugin-syntax-numeric-separator": "7.10.4" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz", - "integrity": "sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==", - "requires": { - "@babel/helper-plugin-utils": "7.10.4", - "@babel/plugin-syntax-optional-chaining": "7.8.3" - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz", - "integrity": "sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A==", - "requires": { - "@babel/helper-plugin-utils": "7.10.4" - } - }, - "@babel/preset-env": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.0.tgz", - "integrity": "sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ==", - "requires": { - "@babel/compat-data": "7.11.0", - "@babel/helper-compilation-targets": "7.10.4", - "@babel/helper-module-imports": "7.10.4", - "@babel/helper-plugin-utils": "7.10.4", - "@babel/plugin-proposal-async-generator-functions": "7.10.5", - "@babel/plugin-proposal-dynamic-import": "7.10.4", - "@babel/plugin-proposal-json-strings": "7.10.4", - "@babel/plugin-proposal-nullish-coalescing-operator": "7.8.3", - "@babel/plugin-proposal-numeric-separator": "7.8.3", - "@babel/plugin-proposal-object-rest-spread": "7.11.0", - "@babel/plugin-proposal-optional-catch-binding": "7.10.4", - "@babel/plugin-proposal-optional-chaining": "7.9.0", - "@babel/plugin-proposal-unicode-property-regex": "7.10.4", - "@babel/plugin-syntax-async-generators": "7.8.4", - "@babel/plugin-syntax-dynamic-import": "7.8.3", - "@babel/plugin-syntax-json-strings": "7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "7.8.3", - "@babel/plugin-syntax-numeric-separator": "7.10.4", - "@babel/plugin-syntax-object-rest-spread": "7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "7.8.3", - "@babel/plugin-syntax-optional-chaining": "7.8.3", - "@babel/plugin-syntax-top-level-await": "7.10.4", - "@babel/plugin-transform-arrow-functions": "7.10.4", - "@babel/plugin-transform-async-to-generator": "7.10.4", - "@babel/plugin-transform-block-scoped-functions": "7.10.4", - "@babel/plugin-transform-block-scoping": "7.11.1", - "@babel/plugin-transform-classes": "7.10.4", - "@babel/plugin-transform-computed-properties": "7.10.4", - "@babel/plugin-transform-destructuring": "7.10.4", - "@babel/plugin-transform-dotall-regex": "7.10.4", - "@babel/plugin-transform-duplicate-keys": "7.10.4", - "@babel/plugin-transform-exponentiation-operator": "7.10.4", - "@babel/plugin-transform-for-of": "7.10.4", - "@babel/plugin-transform-function-name": "7.10.4", - "@babel/plugin-transform-literals": "7.10.4", - "@babel/plugin-transform-member-expression-literals": "7.10.4", - "@babel/plugin-transform-modules-amd": "7.10.5", - "@babel/plugin-transform-modules-commonjs": "7.10.4", - "@babel/plugin-transform-modules-systemjs": "7.10.5", - "@babel/plugin-transform-modules-umd": "7.10.4", - "@babel/plugin-transform-named-capturing-groups-regex": "7.10.4", - "@babel/plugin-transform-new-target": "7.10.4", - "@babel/plugin-transform-object-super": "7.10.4", - "@babel/plugin-transform-parameters": "7.10.5", - "@babel/plugin-transform-property-literals": "7.10.4", - "@babel/plugin-transform-regenerator": "7.10.4", - "@babel/plugin-transform-reserved-words": "7.10.4", - "@babel/plugin-transform-shorthand-properties": "7.10.4", - "@babel/plugin-transform-spread": "7.11.0", - "@babel/plugin-transform-sticky-regex": "7.10.4", - "@babel/plugin-transform-template-literals": "7.10.5", - "@babel/plugin-transform-typeof-symbol": "7.10.4", - "@babel/plugin-transform-unicode-regex": "7.10.4", - "@babel/preset-modules": "0.1.4", - "@babel/types": "7.11.5", - "browserslist": "4.14.1", - "core-js-compat": "3.6.5", - "invariant": "2.2.4", - "levenary": "1.1.1", - "semver": "5.7.1" - } - }, - "@babel/preset-react": { - "version": "7.9.1", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.9.1.tgz", - "integrity": "sha512-aJBYF23MPj0RNdp/4bHnAP0NVqqZRr9kl0NAOP4nJCex6OYVio59+dnQzsAWFuogdLyeaKA1hmfUIVZkY5J+TQ==", - "requires": { - "@babel/helper-plugin-utils": "7.10.4", - "@babel/plugin-transform-react-display-name": "7.8.3", - "@babel/plugin-transform-react-jsx": "7.10.4", - "@babel/plugin-transform-react-jsx-development": "7.11.5", - "@babel/plugin-transform-react-jsx-self": "7.10.4", - "@babel/plugin-transform-react-jsx-source": "7.10.5" - } - }, - "@babel/runtime": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.0.tgz", - "integrity": "sha512-cTIudHnzuWLS56ik4DnRnqqNf8MkdUzV4iFFI1h7Jo9xvrpQROYaAnaSd2mHLQAzzZAPfATynX5ord6YlNYNMA==", - "requires": { - "regenerator-runtime": "0.13.7" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } + "@types/babel__traverse": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.15.tgz", + "integrity": "sha512-Pzh9O3sTK8V6I1olsXpCfj2k/ygO2q1X0vhhnDrEQyYLHZesWz+zMZMVcwXLCYf0U36EtmyYaFGPfXlTtDHe3A==", + "requires": { + "@babel/types": "7.12.1" } }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "@types/eslint": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.4.tgz", + "integrity": "sha512-YCY4kzHMsHoyKspQH+nwSe+70Kep7Vjt2X+dZe5Vs2vkRudqtoFoUIv1RlJmZB8Hbp7McneupoZij4PadxsK5Q==", "requires": { - "core-js": "2.6.11", - "regenerator-runtime": "0.11.1" - }, - "dependencies": { - "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - } + "@types/estree": "0.0.45", + "@types/json-schema": "7.0.6" } }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + "@types/estree": { + "version": "0.0.45", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.45.tgz", + "integrity": "sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g==" }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "requires": { + "@types/minimatch": "3.0.3", + "@types/node": "14.14.3" + } }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "@types/graceful-fs": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.4.tgz", + "integrity": "sha512-mWA/4zFQhfvOA8zWkXobwJvBD7vzcxgrOQ0J5CH1votGqdq9m7+FwtGaqyCZqC3NyyBkc9z4m+iry4LlqcMWJg==", "requires": { - "cache-base": "1.0.1", - "class-utils": "0.3.6", - "component-emitter": "1.3.0", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.2", - "pascalcase": "0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "1.0.2" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "6.0.3" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "6.0.3" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.3" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - } + "@types/node": "14.14.3" } }, - "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + "@types/html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA==" }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" + "@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==" }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", "requires": { - "tweetnacl": "0.14.5" + "@types/istanbul-lib-coverage": "2.0.3" } }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" - }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==" - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", "requires": { - "inherits": "2.0.4" + "@types/istanbul-lib-coverage": "2.0.3", + "@types/istanbul-lib-report": "3.0.0" } }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "bn.js": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", - "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==" + "@types/json-schema": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", + "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==" }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "requires": { - "bytes": "3.1.0", - "content-type": "1.0.4", - "debug": "2.6.9", - "depd": "1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "1.6.18" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" - } - } + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "requires": { - "array-flatten": "2.1.2", - "deep-equal": "1.1.1", - "dns-equal": "1.0.0", - "dns-txt": "2.0.2", - "multicast-dns": "6.2.3", - "multicast-dns-service-types": "1.1.0" - } + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + "@types/node": { + "version": "14.14.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.3.tgz", + "integrity": "sha512-33/L34xS7HVUx23e0wOT2V1qPF1IrHgQccdJVm9uXGTB9vFBrrzBtkQymT8VskeKOxjz55MSqMv0xuLq+u98WQ==" }, - "bootstrap": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.5.2.tgz", - "integrity": "sha512-vlGn0bcySYl/iV+BGA544JkkZP5LB3jsmkeKLFQakCOwCM3AOk7VkldBz4jrzSe+Z0Ezn99NVXa1o45cQY4R6A==" + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==" }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.3", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "0.1.1" - } - } - } + "@types/prettier": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.1.5.tgz", + "integrity": "sha512-UEyp8LwZ4Dg30kVU2Q3amHHyTn1jEdhCIE59ANed76GaT1Vp76DD3ZWSAxgCrw6wJ0TqeoBpqmfUHiUDPs//HQ==" }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + "@types/prop-types": { + "version": "15.7.3", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", + "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + "@types/q": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" }, - "browser-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "@types/react": { + "version": "16.9.53", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.53.tgz", + "integrity": "sha512-4nW60Sd4L7+WMXH1D6jCdVftuW7j4Za6zdp6tJ33Rqv0nk1ZAmQKML9ZLD4H0dehA3FZxXR/GM8gXplf82oNGw==", "requires": { - "resolve": "1.1.7" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" - } + "@types/prop-types": "15.7.3", + "csstype": "3.0.4" } }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "@types/react-dom": { + "version": "16.9.8", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.8.tgz", + "integrity": "sha512-ykkPQ+5nFknnlU6lDd947WbQ6TE3NNzbQAkInC2EKY1qeYdTKp7onFusmYZb+ityzx2YviqT6BXSu+LyWWJwcA==", "requires": { - "buffer-xor": "1.0.3", - "cipher-base": "1.0.4", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "inherits": "2.0.4", - "safe-buffer": "5.1.2" + "@types/react": "16.9.53" } }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "@types/resolve": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", + "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", "requires": { - "browserify-aes": "1.2.0", - "browserify-des": "1.0.2", - "evp_bytestokey": "1.0.3" + "@types/node": "14.14.3" } }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==" + }, + "@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==" + }, + "@types/tapable": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.6.tgz", + "integrity": "sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA==" + }, + "@types/testing-library__dom": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/testing-library__dom/-/testing-library__dom-6.14.0.tgz", + "integrity": "sha512-sMl7OSv0AvMOqn1UJ6j1unPMIHRXen0Ita1ujnMX912rrOcawe4f7wu0Zt9GIQhBhJvH2BaibqFgQ3lP+Pj2hA==", "requires": { - "cipher-base": "1.0.4", - "des.js": "1.0.1", - "inherits": "2.0.4", - "safe-buffer": "5.1.2" + "pretty-format": "24.9.0" } }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "requires": { - "bn.js": "4.11.9", - "randombytes": "2.1.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" - } - } - }, - "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "@types/testing-library__react": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/@types/testing-library__react/-/testing-library__react-9.1.3.tgz", + "integrity": "sha512-iCdNPKU3IsYwRK9JieSYAiX0+aYDXOGAmrC/3/M7AqqSDKnWWVv07X+Zk1uFSL7cMTUYzv4lQRfohucEocn5/w==", "requires": { - "bn.js": "5.1.3", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "elliptic": "6.5.3", - "inherits": "2.0.4", - "parse-asn1": "5.1.6", - "readable-stream": "3.6.0", - "safe-buffer": "5.2.1" + "@types/react-dom": "16.9.8", + "@types/testing-library__dom": "6.14.0", + "pretty-format": "25.5.0" }, "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "@jest/types": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", "requires": { - "inherits": "2.0.4", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "@types/istanbul-lib-coverage": "2.0.3", + "@types/istanbul-reports": "1.1.2", + "@types/yargs": "15.0.9", + "chalk": "3.0.0" } }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + "@types/yargs": { + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", + "requires": { + "@types/yargs-parser": "15.0.0" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "4.3.0", + "supports-color": "7.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "pretty-format": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "requires": { + "@jest/types": "25.5.0", + "ansi-regex": "5.0.0", + "ansi-styles": "4.3.0", + "react-is": "16.13.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "4.0.0" + } } } }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "@types/uglify-js": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.11.0.tgz", + "integrity": "sha512-I0Yd8TUELTbgRHq2K65j8rnDPAzAP+DiaF/syLem7yXwYLsHZhPd+AM2iXsWmf9P2F2NlFCgl5erZPQx9IbM9Q==", "requires": { - "pako": "1.0.11" + "source-map": "0.6.1" } }, - "browserslist": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.1.tgz", - "integrity": "sha512-zyBTIHydW37pnb63c7fHFXUG6EcqWOqoMdDx6cdyaDFriZ20EoVxcE95S54N+heRqY8m8IUgB5zYta/gCwSaaA==", + "@types/webpack": { + "version": "4.41.23", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.23.tgz", + "integrity": "sha512-ojA4CupZg8RCzVJLugWlvqrHpT59GWhqFxbinlsnvk10MjQCWB+ot7XDACctbWhnhtdhYK7+HOH1JxkVLiZhMg==", "requires": { - "caniuse-lite": "1.0.30001124", - "electron-to-chromium": "1.3.564", - "escalade": "3.0.2", - "node-releases": "1.1.60" + "@types/anymatch": "1.3.1", + "@types/node": "14.14.3", + "@types/tapable": "1.0.6", + "@types/uglify-js": "3.11.0", + "@types/webpack-sources": "2.0.0", + "source-map": "0.6.1" } }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "@types/webpack-sources": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.0.0.tgz", + "integrity": "sha512-a5kPx98CNFRKQ+wqawroFunvFqv7GHm/3KOI52NY9xWADgc8smu4R6prt4EU/M4QfVjvgBkMqU4fBhw3QfMVkg==", "requires": { - "node-int64": "0.4.0" + "@types/node": "14.14.3", + "@types/source-list-map": "0.1.2", + "source-map": "0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } } }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "@types/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", "requires": { - "base64-js": "1.3.1", - "ieee754": "1.1.13", - "isarray": "1.0.0" + "@types/yargs-parser": "15.0.0" } }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + "@types/yargs-parser": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==" }, - "cacache": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz", - "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==", + "@typescript-eslint/eslint-plugin": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.6.0.tgz", + "integrity": "sha512-1+419X+Ynijytr1iWI+/IcX/kJryc78YNpdaXR1aRO1sU3bC0vZrIAF1tIX7rudVI84W7o7M4zo5p1aVt70fAg==", "requires": { - "chownr": "1.1.4", - "figgy-pudding": "3.5.2", - "fs-minipass": "2.1.0", - "glob": "7.1.6", - "graceful-fs": "4.2.4", - "infer-owner": "1.0.4", - "lru-cache": "5.1.1", - "minipass": "3.1.3", - "minipass-collect": "1.0.2", - "minipass-flush": "1.0.5", - "minipass-pipeline": "1.2.4", - "mkdirp": "0.5.5", - "move-concurrently": "1.0.1", - "p-map": "3.0.0", - "promise-inflight": "1.0.1", - "rimraf": "2.7.1", - "ssri": "7.1.0", - "unique-filename": "1.1.1" + "@typescript-eslint/experimental-utils": "4.6.0", + "@typescript-eslint/scope-manager": "4.6.0", + "debug": "4.2.0", + "functional-red-black-tree": "1.0.1", + "regexpp": "3.1.0", + "semver": "7.3.2", + "tsutils": "3.17.1" }, "dependencies": { - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "requires": { - "yallist": "3.1.1" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" } } }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "@typescript-eslint/experimental-utils": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.6.0.tgz", + "integrity": "sha512-pnh6Beh2/4xjJVNL+keP49DFHk3orDHHFylSp3WEjtgW3y1U+6l+jNnJrGlbs6qhAz5z96aFmmbUyKhunXKvKw==", "requires": { - "collection-visit": "1.0.0", - "component-emitter": "1.3.0", - "get-value": "2.0.6", - "has-value": "1.0.0", - "isobject": "3.0.1", - "set-value": "2.0.1", - "to-object-path": "0.3.0", - "union-value": "1.0.1", - "unset-value": "1.0.0" + "@types/json-schema": "7.0.6", + "@typescript-eslint/scope-manager": "4.6.0", + "@typescript-eslint/types": "4.6.0", + "@typescript-eslint/typescript-estree": "4.6.0", + "eslint-scope": "5.1.1", + "eslint-utils": "2.1.0" } }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "@typescript-eslint/parser": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.6.0.tgz", + "integrity": "sha512-Dj6NJxBhbdbPSZ5DYsQqpR32MwujF772F2H3VojWU6iT4AqL4BKuoNWOPFCoSZvCcADDvQjDpa6OLDAaiZPz2Q==", "requires": { - "callsites": "2.0.0" + "@typescript-eslint/scope-manager": "4.6.0", + "@typescript-eslint/types": "4.6.0", + "@typescript-eslint/typescript-estree": "4.6.0", + "debug": "4.2.0" } }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "@typescript-eslint/scope-manager": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.6.0.tgz", + "integrity": "sha512-uZx5KvStXP/lwrMrfQQwDNvh2ppiXzz5TmyTVHb+5TfZ3sUP7U1onlz3pjoWrK9konRyFe1czyxObWTly27Ang==", "requires": { - "caller-callsite": "2.0.0" + "@typescript-eslint/types": "4.6.0", + "@typescript-eslint/visitor-keys": "4.6.0" } }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" + "@typescript-eslint/types": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.6.0.tgz", + "integrity": "sha512-5FAgjqH68SfFG4UTtIFv+rqYJg0nLjfkjD0iv+5O27a0xEeNZ5rZNDvFGZDizlCD1Ifj7MAbSW2DPMrf0E9zjA==" }, - "camel-case": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz", - "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==", + "@typescript-eslint/typescript-estree": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.6.0.tgz", + "integrity": "sha512-s4Z9qubMrAo/tw0CbN0IN4AtfwuehGXVZM0CHNMdfYMGBDhPdwTEpBrecwhP7dRJu6d9tT9ECYNaWDHvlFSngA==", "requires": { - "pascal-case": "3.1.1", - "tslib": "1.13.0" + "@typescript-eslint/types": "4.6.0", + "@typescript-eslint/visitor-keys": "4.6.0", + "debug": "4.2.0", + "globby": "11.0.1", + "is-glob": "4.0.1", + "lodash": "4.17.20", + "semver": "7.3.2", + "tsutils": "3.17.1" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" + } } }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + "@typescript-eslint/visitor-keys": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.6.0.tgz", + "integrity": "sha512-38Aa9Ztl0XyFPVzmutHXqDMCu15Xx8yKvUo38Gu3GhsuckCh3StPI5t2WIO9LHEsOH7MLmlGfKUisU8eW1Sjhg==", + "requires": { + "@typescript-eslint/types": "4.6.0", + "eslint-visitor-keys": "2.0.0" + } }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "requires": { - "camelcase": "2.1.1", - "map-obj": "1.0.1" - } - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", "requires": { - "browserslist": "4.14.1", - "caniuse-lite": "1.0.30001124", - "lodash.memoize": "4.1.2", - "lodash.uniq": "4.5.0" + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" } }, - "caniuse-lite": { - "version": "1.0.30001124", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001124.tgz", - "integrity": "sha512-zQW8V3CdND7GHRH6rxm6s59Ww4g/qGWTheoboW9nfeMg7sUoopIfKCcNZUjwYRCOrvereh3kwDpZj4VLQ7zGtA==" - }, - "capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "requires": { - "rsvp": "4.8.5" - } + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" }, - "case-sensitive-paths-webpack-plugin": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz", - "integrity": "sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ==" + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" + "@webassemblyjs/wast-printer": "1.9.0" } }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" }, - "chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", - "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", "requires": { - "anymatch": "3.1.1", - "braces": "3.0.2", - "fsevents": "2.1.2", - "glob-parent": "5.1.1", - "is-binary-path": "2.1.0", - "is-glob": "4.0.1", - "normalize-path": "3.0.0", - "readdirp": "3.4.0" - }, - "dependencies": { - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "requires": { - "normalize-path": "3.0.0", - "picomatch": "2.2.2" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "5.0.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "7.0.0" - } - } + "@webassemblyjs/ast": "1.9.0" } }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" }, - "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", "requires": { - "tslib": "1.13.0" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" } }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", "requires": { - "inherits": "2.0.4", - "safe-buffer": "5.1.2" + "@xtuc/ieee754": "1.2.0" } }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", "requires": { - "arr-union": "3.1.0", - "define-property": "0.2.5", - "isobject": "3.0.1", - "static-extend": "0.1.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "0.1.6" - } - } + "@xtuc/long": "4.2.2" } }, - "classnames": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", - "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" }, - "clean-css": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", - "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", "requires": { - "source-map": "0.6.1" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" } }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", "requires": { - "restore-cursor": "3.1.0" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" } }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==" - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", "requires": { - "string-width": "3.1.0", - "strip-ansi": "5.2.0", - "wrap-ansi": "5.1.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "7.0.3", - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "5.2.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "4.1.0" - } - } + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" } }, - "clone-deep": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", - "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=", + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", "requires": { - "for-own": "0.1.5", - "is-plain-object": "2.0.4", - "kind-of": "3.2.2", - "lazy-cache": "1.0.4", - "shallow-clone": "0.1.2" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" } }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } }, - "coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", "requires": { - "@types/q": "1.5.4", - "chalk": "2.4.2", - "q": "1.5.1" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" } }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", "requires": { - "map-visit": "1.0.0", - "object-visit": "1.0.1" + "mime-types": "2.1.27", + "negotiator": "0.6.2" } }, - "color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", - "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", "requires": { - "color-convert": "1.9.3", - "color-string": "1.5.3" + "acorn": "7.4.1", + "acorn-walk": "7.2.0" } }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } + "acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==" }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" }, - "color-string": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" + }, + "adjust-sourcemap-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz", + "integrity": "sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw==", "requires": { - "color-name": "1.1.3", - "simple-swizzle": "0.2.2" + "loader-utils": "2.0.0", + "regex-parser": "2.2.11" } }, - "colorette": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", - "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "requires": { - "delayed-stream": "1.0.0" + "clean-stack": "2.2.0", + "indent-string": "4.0.0" } }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "common-tags": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", - "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==" + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "3.1.3", + "fast-json-stable-stringify": "2.1.0", + "json-schema-traverse": "0.4.1", + "uri-js": "4.4.0" + } }, - "commondir": { + "ajv-errors": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" }, - "compose-function": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", - "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", - "requires": { - "arity-n": "1.0.4" - } + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "requires": { - "mime-db": "1.44.0" - } + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" + }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", "requires": { - "accepts": "1.3.7", - "bytes": "3.0.0", - "compressible": "2.0.18", - "debug": "2.6.9", - "on-headers": "1.0.2", - "safe-buffer": "5.1.2", - "vary": "1.1.2" + "type-fest": "0.11.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" } } }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { - "buffer-from": "1.1.1", - "inherits": "2.0.4", - "readable-stream": "2.3.7", - "typedarray": "0.0.6" + "color-convert": "1.9.3" } }, - "confusing-browser-globals": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", - "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==" - }, - "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==" + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "requires": { + "normalize-path": "3.0.0", + "picomatch": "2.2.2" + } }, - "console-browserify": { + "aproba": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=" + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "requires": { - "safe-buffer": "5.1.2" + "delegates": "1.0.0", + "readable-stream": "2.3.7" } }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "1.0.3" + } }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", "requires": { - "safe-buffer": "5.1.2" + "@babel/runtime": "7.12.1", + "@babel/runtime-corejs3": "7.12.1" } }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + "arity-n": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", + "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=" }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "requires": { - "aproba": "1.2.0", - "fs-write-stream-atomic": "1.0.10", - "iferr": "0.1.5", - "mkdirp": "0.5.5", - "rimraf": "2.7.1", - "run-queue": "1.0.3" - } + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" }, - "copy-webpack-plugin": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.2.tgz", - "integrity": "sha512-Uh7crJAco3AjBvgAy9Z75CjK8IG+gxaErro71THQ+vv/bl4HaQcpkexAY8KVW/T6D2W2IRr+couF/knIRkZMIQ==", - "dev": true, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + }, + "array-includes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", "requires": { - "cacache": "12.0.4", - "find-cache-dir": "2.1.0", - "glob-parent": "3.1.0", - "globby": "7.1.1", - "is-glob": "4.0.1", - "loader-utils": "1.4.0", - "minimatch": "3.0.4", - "normalize-path": "3.0.0", - "p-limit": "2.3.0", - "schema-utils": "1.0.0", - "serialize-javascript": "4.0.0", - "webpack-log": "2.0.0" + "define-properties": "1.1.3", + "es-abstract": "1.17.7", + "is-string": "1.0.5" }, "dependencies": { - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "requires": { - "bluebird": "3.7.2", - "chownr": "1.1.4", - "figgy-pudding": "3.5.2", - "glob": "7.1.6", - "graceful-fs": "4.2.4", - "infer-owner": "1.0.4", - "lru-cache": "5.1.1", - "mississippi": "3.0.0", - "mkdirp": "0.5.5", - "move-concurrently": "1.0.1", - "promise-inflight": "1.0.1", - "rimraf": "2.7.1", - "ssri": "6.0.1", - "unique-filename": "1.1.1", - "y18n": "4.0.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "2.1.1" - } - } - } - }, - "globby": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", - "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "dir-glob": "2.0.0", - "glob": "7.1.6", - "ignore": "3.3.10", - "pify": "3.0.0", - "slash": "1.0.0" - } - }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "3.1.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "6.12.4", - "ajv-errors": "1.0.1", - "ajv-keywords": "3.5.2" - } - }, - "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "requires": { - "randombytes": "2.1.0" - } - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "dev": true, + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", "requires": { - "figgy-pudding": "3.5.2" + "es-to-primitive": "1.2.1", + "function-bind": "1.1.1", + "has": "1.0.3", + "has-symbols": "1.0.1", + "is-callable": "1.2.2", + "is-regex": "1.1.1", + "object-inspect": "1.8.0", + "object-keys": "1.1.1", + "object.assign": "4.1.1", + "string.prototype.trimend": "1.0.2", + "string.prototype.trimstart": "1.0.2" } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true } } }, - "core-js": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", - "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==" + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" }, - "core-js-compat": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", - "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "array.prototype.flat": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", + "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", "requires": { - "browserslist": "4.14.1", - "semver": "7.0.0" + "define-properties": "1.1.3", + "es-abstract": "1.17.7" }, "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "requires": { + "es-to-primitive": "1.2.1", + "function-bind": "1.1.1", + "has": "1.0.3", + "has-symbols": "1.0.1", + "is-callable": "1.2.2", + "is-regex": "1.1.1", + "object-inspect": "1.8.0", + "object-keys": "1.1.1", + "object.assign": "4.1.1", + "string.prototype.trimend": "1.0.2", + "string.prototype.trimstart": "1.0.2" + } } } }, - "core-js-pure": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.5.tgz", - "integrity": "sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA==" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "array.prototype.flatmap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz", + "integrity": "sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg==", "requires": { - "import-fresh": "2.0.0", - "is-directory": "0.3.1", - "js-yaml": "3.14.0", - "parse-json": "4.0.0" + "define-properties": "1.1.3", + "es-abstract": "1.17.7", + "function-bind": "1.1.1" }, "dependencies": { - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", "requires": { - "error-ex": "1.3.2", - "json-parse-better-errors": "1.0.2" + "es-to-primitive": "1.2.1", + "function-bind": "1.1.1", + "has": "1.0.3", + "has-symbols": "1.0.1", + "is-callable": "1.2.2", + "is-regex": "1.1.1", + "object-inspect": "1.8.0", + "object-keys": "1.1.1", + "object.assign": "4.1.1", + "string.prototype.trimend": "1.0.2", + "string.prototype.trimstart": "1.0.2" } } } }, - "create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "2.1.2" + } + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", "requires": { "bn.js": "4.11.9", - "elliptic": "6.5.3" + "inherits": "2.0.4", + "minimalistic-assert": "1.0.1", + "safer-buffer": "2.1.2" }, "dependencies": { "bn.js": { @@ -4092,1765 +3537,2110 @@ } } }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.4", - "md5.js": "1.3.5", - "ripemd160": "2.0.2", - "sha.js": "2.4.11" + "object-assign": "4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + } + } } }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "requires": { - "cipher-base": "1.0.4", - "create-hash": "1.2.0", - "inherits": "2.0.4", - "ripemd160": "2.0.2", - "safe-buffer": "5.1.2", - "sha.js": "2.4.11" - } + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, - "create-react-context": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.3.0.tgz", - "integrity": "sha512-dNldIoSuNSvlTJ7slIKC/ZFGKexBMBrrcc+TTe1NdmROnaASuLPvqpwj9v4XS4uXZ8+YPu0sNmShX2rXI5LNsw==", - "requires": { - "gud": "1.0.0", - "warning": "4.0.3" - } + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" }, - "cross-spawn": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", - "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", - "requires": { - "lru-cache": "4.1.5", - "which": "1.3.1" - } + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "requires": { - "browserify-cipher": "1.0.1", - "browserify-sign": "4.2.1", - "create-ecdh": "4.0.4", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "diffie-hellman": "5.0.3", - "inherits": "2.0.4", - "pbkdf2": "3.1.1", - "public-encrypt": "4.0.3", - "randombytes": "2.1.0", - "randomfill": "1.0.4" - } + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" }, - "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", "requires": { - "inherits": "2.0.4", - "source-map": "0.6.1", - "source-map-resolve": "0.5.3", - "urix": "0.1.0" + "lodash": "4.17.20" } }, - "css-blank-pseudo": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", - "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" + }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=" + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "autoprefixer": { + "version": "9.8.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", + "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", "requires": { - "postcss": "7.0.32" + "browserslist": "4.14.5", + "caniuse-lite": "1.0.30001151", + "colorette": "1.2.1", + "normalize-range": "0.1.2", + "num2fraction": "1.2.2", + "postcss": "7.0.35", + "postcss-value-parser": "4.1.0" } }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, - "css-declaration-sorter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", - "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "aws4": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", + "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==" + }, + "axe-core": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.0.2.tgz", + "integrity": "sha512-arU1h31OGFu+LPrOLGZ7nB45v940NMDMEJeNmbutu57P+UFDVnkZg3e+J1I2HJRZ9hT7gO8J91dn/PMrAiKakA==" + }, + "axobject-query": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" + }, + "babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", "requires": { - "postcss": "7.0.32", - "timsort": "0.3.0" + "@babel/code-frame": "7.10.4", + "@babel/parser": "7.12.3", + "@babel/traverse": "7.12.1", + "@babel/types": "7.12.1", + "eslint-visitor-keys": "1.3.0", + "resolve": "1.18.1" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + } } }, - "css-has-pseudo": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", - "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", + "babel-extract-comments": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz", + "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==", "requires": { - "postcss": "7.0.32", - "postcss-selector-parser": "5.0.0" + "babylon": "6.18.0" + } + }, + "babel-jest": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.1.tgz", + "integrity": "sha512-duMWEOKrSBYRVTTNpL2SipNIWnZOjP77auOBMPQ3zXAdnDbyZQWU8r/RxNWpUf9N6cgPFecQYelYLytTVXVDtA==", + "requires": { + "@jest/transform": "26.6.1", + "@jest/types": "26.6.1", + "@types/babel__core": "7.1.10", + "babel-plugin-istanbul": "6.0.0", + "babel-preset-jest": "26.5.0", + "chalk": "4.1.0", + "graceful-fs": "4.2.4", + "slash": "3.0.0" }, "dependencies": { - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + "@jest/types": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.1.tgz", + "integrity": "sha512-ywHavIKNpAVrStiRY5wiyehvcktpijpItvGiK72RAn5ctqmzvPk8OvKnvHeBqa1XdQr959CTWAJMqxI8BTibyg==", + "requires": { + "@types/istanbul-lib-coverage": "2.0.3", + "@types/istanbul-reports": "3.0.0", + "@types/node": "14.14.3", + "@types/yargs": "15.0.9", + "chalk": "4.1.0" + } }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", "requires": { - "cssesc": "2.0.0", - "indexes-of": "1.0.1", - "uniq": "1.0.1" + "@types/istanbul-lib-report": "3.0.0" + } + }, + "@types/yargs": { + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", + "requires": { + "@types/yargs-parser": "15.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "4.3.0", + "supports-color": "7.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "4.0.0" } } } }, - "css-loader": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.4.2.tgz", - "integrity": "sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==", + "babel-loader": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", + "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", "requires": { - "camelcase": "5.3.1", - "cssesc": "3.0.0", - "icss-utils": "4.1.1", + "find-cache-dir": "2.1.0", "loader-utils": "1.4.0", - "normalize-path": "3.0.0", - "postcss": "7.0.32", - "postcss-modules-extract-imports": "2.0.0", - "postcss-modules-local-by-default": "3.0.3", - "postcss-modules-scope": "2.2.0", - "postcss-modules-values": "3.0.0", - "postcss-value-parser": "4.1.0", + "mkdirp": "0.5.5", + "pify": "4.0.1", "schema-utils": "2.7.1" }, "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "1.2.5" + } }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "5.2.2", + "emojis-list": "3.0.0", + "json5": "1.0.1" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" } } }, - "css-prefers-color-scheme": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", - "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", "requires": { - "postcss": "7.0.32" + "object.assign": "4.1.1" } }, - "css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", "requires": { - "boolbase": "1.0.0", - "css-what": "3.3.0", - "domutils": "1.7.0", - "nth-check": "1.0.2" + "@babel/helper-plugin-utils": "7.10.4", + "@istanbuljs/load-nyc-config": "1.1.0", + "@istanbuljs/schema": "0.1.2", + "istanbul-lib-instrument": "4.0.3", + "test-exclude": "6.0.0" } }, - "css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" + "babel-plugin-jest-hoist": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.5.0.tgz", + "integrity": "sha512-ck17uZFD3CDfuwCLATWZxkkuGGFhMij8quP8CNhwj8ek1mqFgbFzRJ30xwC04LLscj/aKsVFfRST+b5PT7rSuw==", + "requires": { + "@babel/template": "7.10.4", + "@babel/types": "7.12.1", + "@types/babel__core": "7.1.10", + "@types/babel__traverse": "7.0.15" + } }, - "css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "babel-plugin-macros": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", + "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", "requires": { - "mdn-data": "2.0.4", - "source-map": "0.6.1" + "@babel/runtime": "7.12.1", + "cosmiconfig": "6.0.0", + "resolve": "1.18.1" } }, - "css-what": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.3.0.tgz", - "integrity": "sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg==" + "babel-plugin-named-asset-import": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.7.tgz", + "integrity": "sha512-squySRkf+6JGnvjoUtDEjSREJEBirnXi9NqP6rjSYsylxQxqBTz+pkmf395i9E2zsvmYUaI40BHo6SqZUdydlw==" }, - "css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=" + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" }, - "cssdb": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", - "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==" + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "requires": { + "babel-plugin-syntax-object-rest-spread": "6.13.0", + "babel-runtime": "6.26.0" + } }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + "babel-plugin-transform-react-remove-prop-types": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", + "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" }, - "cssnano": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", - "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", + "babel-preset-current-node-syntax": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.4.tgz", + "integrity": "sha512-5/INNCYhUGqw7VbVjT/hb3ucjgkVHKXY7lX3ZjlN4gm565VyFmJUrJ/h+h16ECVB38R/9SF6aACydpKMLZ/c9w==", "requires": { - "cosmiconfig": "5.2.1", - "cssnano-preset-default": "4.0.7", - "is-resolvable": "1.1.0", - "postcss": "7.0.32" + "@babel/plugin-syntax-async-generators": "7.8.4", + "@babel/plugin-syntax-bigint": "7.8.3", + "@babel/plugin-syntax-class-properties": "7.12.1", + "@babel/plugin-syntax-import-meta": "7.10.4", + "@babel/plugin-syntax-json-strings": "7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "7.8.3", + "@babel/plugin-syntax-numeric-separator": "7.10.4", + "@babel/plugin-syntax-object-rest-spread": "7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "7.8.3", + "@babel/plugin-syntax-optional-chaining": "7.8.3" } }, - "cssnano-preset-default": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", - "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", + "babel-preset-jest": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.5.0.tgz", + "integrity": "sha512-F2vTluljhqkiGSJGBg/jOruA8vIIIL11YrxRcO7nviNTMbbofPSHwnm8mgP7d/wS7wRSexRoI6X1A6T74d4LQA==", "requires": { - "css-declaration-sorter": "4.0.1", - "cssnano-util-raw-cache": "4.0.1", - "postcss": "7.0.32", - "postcss-calc": "7.0.4", - "postcss-colormin": "4.0.3", - "postcss-convert-values": "4.0.1", - "postcss-discard-comments": "4.0.2", - "postcss-discard-duplicates": "4.0.2", - "postcss-discard-empty": "4.0.1", - "postcss-discard-overridden": "4.0.1", - "postcss-merge-longhand": "4.0.11", - "postcss-merge-rules": "4.0.3", - "postcss-minify-font-values": "4.0.2", - "postcss-minify-gradients": "4.0.2", - "postcss-minify-params": "4.0.2", - "postcss-minify-selectors": "4.0.2", - "postcss-normalize-charset": "4.0.1", - "postcss-normalize-display-values": "4.0.2", - "postcss-normalize-positions": "4.0.2", - "postcss-normalize-repeat-style": "4.0.2", - "postcss-normalize-string": "4.0.2", - "postcss-normalize-timing-functions": "4.0.2", - "postcss-normalize-unicode": "4.0.1", - "postcss-normalize-url": "4.0.1", - "postcss-normalize-whitespace": "4.0.2", - "postcss-ordered-values": "4.1.2", - "postcss-reduce-initial": "4.0.3", - "postcss-reduce-transforms": "4.0.2", - "postcss-svgo": "4.0.2", - "postcss-unique-selectors": "4.0.1" + "babel-plugin-jest-hoist": "26.5.0", + "babel-preset-current-node-syntax": "0.1.4" } }, - "cssnano-util-get-arguments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", - "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=" - }, - "cssnano-util-get-match": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", - "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=" + "babel-preset-react-app": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.0.tgz", + "integrity": "sha512-itL2z8v16khpuKutx5IH8UdCdSTuzrOhRFTEdIhveZ2i1iBKDrVE0ATa4sFVy+02GLucZNVBWtoarXBy0Msdpg==", + "requires": { + "@babel/core": "7.12.3", + "@babel/plugin-proposal-class-properties": "7.12.1", + "@babel/plugin-proposal-decorators": "7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "7.12.1", + "@babel/plugin-proposal-numeric-separator": "7.12.1", + "@babel/plugin-proposal-optional-chaining": "7.12.1", + "@babel/plugin-transform-flow-strip-types": "7.12.1", + "@babel/plugin-transform-react-display-name": "7.12.1", + "@babel/plugin-transform-runtime": "7.12.1", + "@babel/preset-env": "7.12.1", + "@babel/preset-react": "7.12.1", + "@babel/preset-typescript": "7.12.1", + "@babel/runtime": "7.12.1", + "babel-plugin-macros": "2.8.0", + "babel-plugin-transform-react-remove-prop-types": "0.4.24" + } }, - "cssnano-util-raw-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", - "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "requires": { - "postcss": "7.0.32" + "core-js": "2.6.11", + "regenerator-runtime": "0.11.1" + }, + "dependencies": { + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + } } }, - "cssnano-util-same-parent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", - "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==" + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" }, - "csso": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz", - "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==", + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "requires": { - "css-tree": "1.0.0-alpha.39" + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.3.0", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.2", + "pascalcase": "0.1.1" }, "dependencies": { - "css-tree": { - "version": "1.0.0-alpha.39", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz", - "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { - "mdn-data": "2.0.6", - "source-map": "0.6.1" + "is-descriptor": "1.0.2" } }, - "mdn-data": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz", - "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==" + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "6.0.3" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "6.0.3" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.3" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" } } }, - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" }, - "cssstyle": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", - "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "requires": { - "cssom": "0.3.8" + "tweetnacl": "0.14.5" } }, - "csstype": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.3.tgz", - "integrity": "sha512-jPl+wbWPOWJ7SXsWyqGRk3lGecbar0Cb0OvZF/r/ZU011R4YqiRehgkQ9p4eQfo9DSDLqLL3wHwfxeJiuIsNag==" - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "bfj": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz", + "integrity": "sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw==", "requires": { - "array-find-index": "1.0.2" + "bluebird": "3.7.2", + "check-types": "11.1.2", + "hoopy": "0.1.4", + "tryer": "1.0.1" } }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "optional": true + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", "requires": { - "es5-ext": "0.10.53", - "type": "1.2.0" + "inherits": "2.0.4" } }, - "damerau-levenshtein": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", - "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==" + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "1.0.0" - } + "bn.js": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", + "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==" }, - "data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", "requires": { - "abab": "2.0.4", - "whatwg-mimetype": "2.3.0", - "whatwg-url": "7.1.0" + "bytes": "3.1.0", + "content-type": "1.0.4", + "debug": "2.6.9", + "depd": "1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "1.6.18" }, "dependencies": { - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { - "lodash.sortby": "4.7.0", - "tr46": "1.0.1", - "webidl-conversions": "4.0.2" + "ms": "2.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" } } }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", "requires": { - "ms": "2.1.2" + "array-flatten": "2.1.2", + "deep-equal": "1.1.1", + "dns-equal": "1.0.0", + "dns-txt": "2.0.2", + "multicast-dns": "6.2.3", + "multicast-dns-service-types": "1.1.0" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + "bootstrap": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.5.3.tgz", + "integrity": "sha512-o9ppKQioXGqhw8Z7mah6KdTYpNQY//tipnkxppWhPbiSWdD+1raYsnhwEZjkTHYbGee4cVQ0Rx65EhOY/HNLcQ==" }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { - "is-arguments": "1.0.4", - "is-date-object": "1.0.2", - "is-regex": "1.1.1", - "object-is": "1.1.2", - "object-keys": "1.1.1", - "regexp.prototype.flags": "1.3.0" + "balanced-match": "1.0.0", + "concat-map": "0.0.1" } }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "7.0.1" + } }, - "default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "requires": { - "execa": "1.0.0", - "ip-regex": "2.1.0" + "buffer-xor": "1.0.3", + "cipher-base": "1.0.4", + "create-hash": "1.2.0", + "evp_bytestokey": "1.0.3", + "inherits": "2.0.4", + "safe-buffer": "5.1.2" } }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "requires": { - "object-keys": "1.1.1" + "browserify-aes": "1.2.0", + "browserify-des": "1.0.2", + "evp_bytestokey": "1.0.3" } }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "requires": { - "is-descriptor": "1.0.2", - "isobject": "3.0.1" + "cipher-base": "1.0.4", + "des.js": "1.0.1", + "inherits": "2.0.4", + "safe-buffer": "5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "requires": { + "bn.js": "4.11.9", + "randombytes": "2.1.0" }, "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "6.0.3" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "6.0.3" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.3" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" } } }, - "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "requires": { - "@types/glob": "7.1.3", - "globby": "6.1.0", - "is-path-cwd": "2.2.0", - "is-path-in-cwd": "2.1.0", - "p-map": "2.1.0", - "pify": "4.0.1", - "rimraf": "2.7.1" + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "requires": { + "bn.js": "5.1.3", + "browserify-rsa": "4.0.1", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "elliptic": "6.5.3", + "inherits": "2.0.4", + "parse-asn1": "5.1.6", + "readable-stream": "3.6.0", + "safe-buffer": "5.2.1" }, "dependencies": { - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { - "array-union": "1.0.2", - "glob": "7.1.6", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - } + "inherits": "2.0.4", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" } }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" } } }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "requires": { + "pako": "1.0.11" + } }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + "browserslist": { + "version": "4.14.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.5.tgz", + "integrity": "sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA==", + "requires": { + "caniuse-lite": "1.0.30001151", + "electron-to-chromium": "1.3.583", + "escalade": "3.1.1", + "node-releases": "1.1.64" + } }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "requires": { + "node-int64": "0.4.0" + } }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", "requires": { - "inherits": "2.0.4", - "minimalistic-assert": "1.0.1" + "base64-js": "1.3.1", + "ieee754": "1.1.13", + "isarray": "1.0.0" } }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" }, - "detect-newline": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=" + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" }, - "detect-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==" + "builtin-modules": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", + "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==" }, - "detect-port-alt": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "cacache": { + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", + "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", "requires": { - "address": "1.1.2", - "debug": "2.6.9" + "@npmcli/move-file": "1.0.1", + "chownr": "2.0.0", + "fs-minipass": "2.1.0", + "glob": "7.1.6", + "infer-owner": "1.0.4", + "lru-cache": "6.0.0", + "minipass": "3.1.3", + "minipass-collect": "1.0.2", + "minipass-flush": "1.0.5", + "minipass-pipeline": "1.2.4", + "mkdirp": "1.0.4", + "p-map": "4.0.0", + "promise-inflight": "1.0.1", + "rimraf": "3.0.2", + "ssri": "8.0.0", + "tar": "6.0.5", + "unique-filename": "1.1.1" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { - "ms": "2.0.0" + "yallist": "4.0.0" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "7.1.6" + } + }, + "tar": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.5.tgz", + "integrity": "sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg==", + "requires": { + "chownr": "2.0.0", + "fs-minipass": "2.1.0", + "minipass": "3.1.3", + "minizlib": "2.1.2", + "mkdirp": "1.0.4", + "yallist": "4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, - "diff-sequences": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", - "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==" + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "1.0.0", + "component-emitter": "1.3.0", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.1", + "to-object-path": "0.3.0", + "union-value": "1.0.1", + "unset-value": "1.0.0" + } }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", "requires": { - "bn.js": "4.11.9", - "miller-rabin": "4.0.1", - "randombytes": "2.1.0" + "callsites": "2.0.0" }, "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" } } }, - "dir-glob": { + "caller-path": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", "requires": { - "arrify": "1.0.1", - "path-type": "3.0.0" - }, - "dependencies": { - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "requires": { - "pify": "3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } + "caller-callsite": "2.0.0" } }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" }, - "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "camel-case": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz", + "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==", "requires": { - "ip": "1.1.5", - "safe-buffer": "5.1.2" + "pascal-case": "3.1.1", + "tslib": "1.14.1" } }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "requires": { - "buffer-indexof": "1.1.1" + "camelcase": "2.1.1", + "map-obj": "1.0.1" } }, - "doctrine": { + "caniuse-api": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", "requires": { - "esutils": "2.0.3" + "browserslist": "4.14.5", + "caniuse-lite": "1.0.30001151", + "lodash.memoize": "4.1.2", + "lodash.uniq": "4.5.0" } }, - "dom-accessibility-api": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.3.0.tgz", - "integrity": "sha512-PzwHEmsRP3IGY4gv/Ug+rMeaTIyTJvadCb+ujYXYeIylbHJezIyNToe8KfEgHTCEYyC+/bUghYOGg8yMGlZ6vA==" + "caniuse-lite": { + "version": "1.0.30001151", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001151.tgz", + "integrity": "sha512-Zh3sHqskX6mHNrqUerh+fkf0N72cMxrmflzje/JyVImfpknscMnkeJrlFGJcqTmaa0iszdYptGpWMJCRQDkBVw==" }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", "requires": { - "utila": "0.4.0" + "rsvp": "4.8.5" } }, - "dom-helpers": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", - "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", - "requires": { - "@babel/runtime": "7.11.2" - } + "case-sensitive-paths-webpack-plugin": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz", + "integrity": "sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ==" }, - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { - "domelementtype": "2.0.1", - "entities": "2.0.3" - }, - "dependencies": { - "domelementtype": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", - "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==" - } + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" } }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==" }, - "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", - "requires": { - "webidl-conversions": "4.0.2" - } + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "requires": { - "domelementtype": "1.3.1" - } + "check-types": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.1.2.tgz", + "integrity": "sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ==" }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "chokidar": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", + "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", + "optional": true, "requires": { - "dom-serializer": "0.2.2", - "domelementtype": "1.3.1" + "anymatch": "3.1.1", + "braces": "3.0.2", + "fsevents": "2.1.3", + "glob-parent": "5.1.1", + "is-binary-path": "2.1.0", + "is-glob": "4.0.1", + "normalize-path": "3.0.0", + "readdirp": "3.5.0" } }, - "dot-case": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.3.tgz", - "integrity": "sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA==", - "requires": { - "no-case": "3.0.3", - "tslib": "1.13.0" - } + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", "requires": { - "is-obj": "2.0.0" + "tslib": "1.14.1" } }, - "dotenv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" - }, - "dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" - }, - "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "requires": { - "end-of-stream": "1.4.4", "inherits": "2.0.4", - "readable-stream": "2.3.7", - "stream-shift": "1.0.1" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "0.1.1", - "safer-buffer": "2.1.2" + "safe-buffer": "5.1.2" } }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "electron-to-chromium": { - "version": "1.3.564", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.564.tgz", - "integrity": "sha512-fNaYN3EtKQWLQsrKXui8mzcryJXuA0LbCLoizeX6oayG2emBaS5MauKjCPAvc29NEY4FpLHIUWiP+Y0Bfrs5dg==" + "cjs-module-lexer": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.4.3.tgz", + "integrity": "sha512-5RLK0Qfs0PNDpEyBXIr3bIT1Muw3ojSlvpw6dAmkUcO0+uTrsBn7GuEIgx40u+OzbCBLDta7nvmud85P4EmTsQ==" }, - "elliptic": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", - "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "requires": { - "bn.js": "4.11.9", - "brorand": "1.1.0", - "hash.js": "1.1.7", - "hmac-drbg": "1.0.1", - "inherits": "2.0.4", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" }, "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "0.1.6" + } } } }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + "classnames": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", + "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + "clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "requires": { + "source-map": "0.6.1" + } }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "requires": { - "once": "1.4.0" + "restore-cursor": "3.1.0" } }, - "enhanced-resolve": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", - "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==" + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "requires": { - "graceful-fs": "4.2.4", - "memory-fs": "0.5.0", - "tapable": "1.1.3" + "string-width": "3.1.0", + "strip-ansi": "5.2.0", + "wrap-ansi": "5.1.0" }, "dependencies": { - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "requires": { - "errno": "0.1.7", - "readable-stream": "2.3.7" + "emoji-regex": "7.0.3", + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "5.2.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "4.1.0" } } } }, - "entities": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", - "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==" - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "clone-deep": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", + "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=", "requires": { - "prr": "1.0.1" + "for-own": "0.1.5", + "is-plain-object": "2.0.4", + "kind-of": "3.2.2", + "lazy-cache": "1.0.4", + "shallow-clone": "0.1.2" } }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", "requires": { - "is-arrayish": "0.2.1" + "@types/q": "1.5.4", + "chalk": "2.4.2", + "q": "1.5.1" } }, - "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "requires": { - "es-to-primitive": "1.2.1", - "function-bind": "1.1.1", - "has": "1.0.3", - "has-symbols": "1.0.1", - "is-callable": "1.2.0", - "is-regex": "1.1.1", - "object-inspect": "1.8.0", - "object-keys": "1.1.1", - "object.assign": "4.1.0", - "string.prototype.trimend": "1.0.1", - "string.prototype.trimstart": "1.0.1" + "map-visit": "1.0.0", + "object-visit": "1.0.1" } }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", + "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", "requires": { - "is-callable": "1.2.0", - "is-date-object": "1.0.2", - "is-symbol": "1.0.3" + "color-convert": "1.9.3", + "color-string": "1.5.4" } }, - "es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.3", - "next-tick": "1.0.0" + "color-name": "1.1.3" } }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "color-string": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz", + "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==", "requires": { - "d": "1.0.1", - "es5-ext": "0.10.53", - "es6-symbol": "3.1.3" + "color-name": "1.1.3", + "simple-swizzle": "0.2.2" } }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "colorette": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", + "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "requires": { - "d": "1.0.1", - "ext": "1.4.0" + "delayed-stream": "1.0.0" } }, - "escalade": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.2.tgz", - "integrity": "sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ==" + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + "common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==" }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" }, - "escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "compose-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", + "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", "requires": { - "esprima": "4.0.1", - "estraverse": "4.3.0", - "esutils": "2.0.3", - "optionator": "0.8.3", - "source-map": "0.6.1" + "arity-n": "1.0.4" } }, - "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "requires": { - "@babel/code-frame": "7.10.4", - "ajv": "6.12.4", - "chalk": "2.4.2", - "cross-spawn": "6.0.5", - "debug": "4.1.1", - "doctrine": "3.0.0", - "eslint-scope": "5.1.0", - "eslint-utils": "1.4.3", - "eslint-visitor-keys": "1.3.0", - "espree": "6.2.1", - "esquery": "1.3.1", - "esutils": "2.0.3", - "file-entry-cache": "5.0.1", - "functional-red-black-tree": "1.0.1", - "glob-parent": "5.1.1", - "globals": "12.4.0", - "ignore": "4.0.6", - "import-fresh": "3.2.1", - "imurmurhash": "0.1.4", - "inquirer": "7.3.3", - "is-glob": "4.0.1", - "js-yaml": "3.14.0", - "json-stable-stringify-without-jsonify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.20", - "minimatch": "3.0.4", - "mkdirp": "0.5.5", - "natural-compare": "1.4.0", - "optionator": "0.8.3", - "progress": "2.0.3", - "regexpp": "2.0.1", - "semver": "6.3.0", - "strip-ansi": "5.2.0", - "strip-json-comments": "3.1.1", - "table": "5.4.6", - "text-table": "0.2.0", - "v8-compile-cache": "2.1.1" + "mime-db": "1.44.0" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "requires": { + "accepts": "1.3.7", + "bytes": "3.0.0", + "compressible": "2.0.18", + "debug": "2.6.9", + "on-headers": "1.0.2", + "safe-buffer": "5.1.2", + "vary": "1.1.2" }, "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { - "nice-try": "1.0.5", - "path-key": "2.0.1", - "semver": "5.7.1", - "shebang-command": "1.2.0", - "which": "1.3.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "requires": { - "eslint-visitor-keys": "1.3.0" - } - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "requires": { - "type-fest": "0.8.1" - } - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { - "parent-module": "1.0.1", - "resolve-from": "4.0.0" + "ms": "2.0.0" } }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==" - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "4.1.0" - } + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, - "eslint-config-react-app": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-5.2.1.tgz", - "integrity": "sha512-pGIZ8t0mFLcV+6ZirRgYK6RVqUIKRIi9MmgzUEmrIknsn3AdO0I32asO86dJgloHq+9ZPl8UIg8mYrvgP5u2wQ==", + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "requires": { - "confusing-browser-globals": "1.0.9" + "buffer-from": "1.1.1", + "inherits": "2.0.4", + "readable-stream": "2.3.7", + "typedarray": "0.0.6" } }, - "eslint-import-resolver-node": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", - "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "confusing-browser-globals": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", + "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==" + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==" + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", "requires": { - "debug": "2.6.9", - "resolve": "1.17.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } + "safe-buffer": "5.1.2" } }, - "eslint-loader": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-3.0.3.tgz", - "integrity": "sha512-+YRqB95PnNvxNp1HEjQmvf9KNvCin5HXYYseOXVC2U0KEcw4IkQ2IQEBG46j7+gW39bMzeu0GsUhVbBY3Votpw==", + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", "requires": { - "fs-extra": "8.1.0", - "loader-fs-cache": "1.0.3", - "loader-utils": "1.4.0", - "object-hash": "2.0.3", - "schema-utils": "2.7.1" + "safe-buffer": "5.1.2" } }, - "eslint-module-utils": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", - "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", "requires": { - "debug": "2.6.9", - "pkg-dir": "2.0.0" + "aproba": "1.2.0", + "fs-write-stream-atomic": "1.0.10", + "iferr": "0.1.5", + "mkdirp": "0.5.5", + "rimraf": "2.7.1", + "run-queue": "1.0.3" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "copy-webpack-plugin": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.2.tgz", + "integrity": "sha512-Uh7crJAco3AjBvgAy9Z75CjK8IG+gxaErro71THQ+vv/bl4HaQcpkexAY8KVW/T6D2W2IRr+couF/knIRkZMIQ==", + "dev": true, + "requires": { + "cacache": "12.0.4", + "find-cache-dir": "2.1.0", + "glob-parent": "3.1.0", + "globby": "7.1.1", + "is-glob": "4.0.1", + "loader-utils": "1.4.0", + "minimatch": "3.0.4", + "normalize-path": "3.0.0", + "p-limit": "2.3.0", + "schema-utils": "1.0.0", + "serialize-javascript": "4.0.0", + "webpack-log": "2.0.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, "requires": { - "ms": "2.0.0" + "array-uniq": "1.0.3" } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, "requires": { - "locate-path": "2.0.0" + "bluebird": "3.7.2", + "chownr": "1.1.4", + "figgy-pudding": "3.5.2", + "glob": "7.1.6", + "graceful-fs": "4.2.4", + "infer-owner": "1.0.4", + "lru-cache": "5.1.1", + "mississippi": "3.0.0", + "mkdirp": "0.5.5", + "move-concurrently": "1.0.1", + "promise-inflight": "1.0.1", + "rimraf": "2.7.1", + "ssri": "6.0.1", + "unique-filename": "1.1.1", + "y18n": "4.0.0" } }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" + "path-type": "3.0.0" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, "requires": { - "p-try": "1.0.0" + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + } } }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, "requires": { - "p-limit": "1.3.0" + "array-union": "1.0.2", + "dir-glob": "2.2.2", + "glob": "7.1.6", + "ignore": "3.3.10", + "pify": "3.0.0", + "slash": "1.0.0" } }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "requires": { - "find-up": "2.1.0" - } - } - } - }, - "eslint-plugin-flowtype": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-4.6.0.tgz", - "integrity": "sha512-W5hLjpFfZyZsXfo5anlu7HM970JBDqbEshAJUkeczP6BFCIfJXuiIBQXyberLRtOStT0OGPF8efeTbxlHk4LpQ==", - "requires": { - "lodash": "4.17.20" - } - }, - "eslint-plugin-import": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.1.tgz", - "integrity": "sha512-qQHgFOTjguR+LnYRoToeZWT62XM55MBVXObHM6SKFd1VzDcX/vqT1kAz8ssqigh5eMj8qXcRoXXGZpPP6RfdCw==", - "requires": { - "array-includes": "3.1.1", - "array.prototype.flat": "1.2.3", - "contains-path": "0.1.0", - "debug": "2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "0.3.4", - "eslint-module-utils": "2.6.0", - "has": "1.0.3", - "minimatch": "3.0.4", - "object.values": "1.1.1", - "read-pkg-up": "2.0.0", - "resolve": "1.17.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, "requires": { - "esutils": "2.0.3", - "isarray": "1.0.0" + "minimist": "1.2.5" } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, "requires": { - "locate-path": "2.0.0" + "big.js": "5.2.2", + "emojis-list": "3.0.0", + "json5": "1.0.1" } }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, "requires": { - "graceful-fs": "4.2.4", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" + "yallist": "3.1.1" } }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" + "pify": "3.0.0" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, "requires": { - "p-try": "1.0.0" + "ajv": "6.12.6", + "ajv-errors": "1.0.1", + "ajv-keywords": "3.5.2" } }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, "requires": { - "p-limit": "1.3.0" + "randombytes": "2.1.0" } }, - "p-try": { + "slash": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "requires": { - "pify": "2.3.0" - } - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.5.0", - "path-type": "2.0.0" - } + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" + "figgy-pudding": "3.5.2" } }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true } } }, - "eslint-plugin-jsx-a11y": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz", - "integrity": "sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==", + "core-js": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", + "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==" + }, + "core-js-compat": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", + "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", "requires": { - "@babel/runtime": "7.11.2", - "aria-query": "3.0.0", - "array-includes": "3.1.1", - "ast-types-flow": "0.0.7", - "axobject-query": "2.2.0", - "damerau-levenshtein": "1.0.6", - "emoji-regex": "7.0.3", - "has": "1.0.3", - "jsx-ast-utils": "2.4.1" + "browserslist": "4.14.5", + "semver": "7.0.0" }, "dependencies": { - "aria-query": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", - "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", - "requires": { - "ast-types-flow": "0.0.7", - "commander": "2.20.3" - } + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" } } }, - "eslint-plugin-react": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.19.0.tgz", - "integrity": "sha512-SPT8j72CGuAP+JFbT0sJHOB80TX/pu44gQ4vXH/cq+hQTiY2PuZ6IHkqXJV6x1b28GDdo1lbInjKUrrdUf0LOQ==", + "core-js-pure": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.5.tgz", + "integrity": "sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA==" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", "requires": { - "array-includes": "3.1.1", - "doctrine": "2.1.0", - "has": "1.0.3", - "jsx-ast-utils": "2.4.1", - "object.entries": "1.1.2", - "object.fromentries": "2.0.2", - "object.values": "1.1.1", - "prop-types": "15.7.2", - "resolve": "1.17.0", - "semver": "6.3.0", - "string.prototype.matchall": "4.0.2", - "xregexp": "4.3.0" + "@types/parse-json": "4.0.0", + "import-fresh": "3.2.1", + "parse-json": "5.1.0", + "path-type": "4.0.0", + "yaml": "1.10.0" }, "dependencies": { - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", "requires": { - "esutils": "2.0.3" + "@babel/code-frame": "7.10.4", + "error-ex": "1.3.2", + "json-parse-even-better-errors": "2.3.1", + "lines-and-columns": "1.1.6" } }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" } } }, - "eslint-plugin-react-hooks": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz", - "integrity": "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA==" - }, - "eslint-scope": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", - "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", "requires": { - "esrecurse": "4.3.0", - "estraverse": "4.3.0" + "bn.js": "4.11.9", + "elliptic": "6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } } }, - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "requires": { - "eslint-visitor-keys": "1.3.0" + "cipher-base": "1.0.4", + "inherits": "2.0.4", + "md5.js": "1.3.5", + "ripemd160": "2.0.2", + "sha.js": "2.4.11" } }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" - }, - "espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "requires": { - "acorn": "7.4.0", - "acorn-jsx": "5.3.1", - "eslint-visitor-keys": "1.3.0" + "cipher-base": "1.0.4", + "create-hash": "1.2.0", + "inherits": "2.0.4", + "ripemd160": "2.0.2", + "safe-buffer": "5.1.2", + "sha.js": "2.4.11" } }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "esquery": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", - "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "create-react-context": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.3.0.tgz", + "integrity": "sha512-dNldIoSuNSvlTJ7slIKC/ZFGKexBMBrrcc+TTe1NdmROnaASuLPvqpwj9v4XS4uXZ8+YPu0sNmShX2rXI5LNsw==", "requires": { - "estraverse": "5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" - } + "gud": "1.0.0", + "warning": "4.0.3" } }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", "requires": { - "estraverse": "5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" - } + "lru-cache": "4.1.5", + "which": "1.3.1" } }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "requires": { + "browserify-cipher": "1.0.1", + "browserify-sign": "4.2.1", + "create-ecdh": "4.0.4", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "diffie-hellman": "5.0.3", + "inherits": "2.0.4", + "pbkdf2": "3.1.1", + "public-encrypt": "4.0.3", + "randombytes": "2.1.0", + "randomfill": "1.0.4" + } }, - "events": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", - "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==" + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" }, - "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", "requires": { - "original": "1.0.2" + "inherits": "2.0.4", + "source-map": "0.6.1", + "source-map-resolve": "0.5.3", + "urix": "0.1.0" } }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "css-blank-pseudo": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", + "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", "requires": { - "md5.js": "1.3.5", - "safe-buffer": "5.1.2" + "postcss": "7.0.35" } }, - "exec-sh": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", - "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==" + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", "requires": { - "cross-spawn": "6.0.5", - "get-stream": "4.1.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.3", - "strip-eof": "1.0.0" + "postcss": "7.0.35", + "timsort": "0.3.0" + } + }, + "css-has-pseudo": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", + "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", + "requires": { + "postcss": "7.0.35", + "postcss-selector-parser": "5.0.0" }, "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", "requires": { - "nice-try": "1.0.5", - "path-key": "2.0.1", - "semver": "5.7.1", - "shebang-command": "1.2.0", - "which": "1.3.1" + "cssesc": "2.0.0", + "indexes-of": "1.0.1", + "uniq": "1.0.1" } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "css-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-4.3.0.tgz", + "integrity": "sha512-rdezjCjScIrsL8BSYszgT4s476IcNKt6yX69t0pHjJVnPUTDpn4WfIpDQTN3wCJvUvfsz/mFjuGOekf3PY3NUg==", "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "camelcase": "6.1.0", + "cssesc": "3.0.0", + "icss-utils": "4.1.1", + "loader-utils": "2.0.0", + "postcss": "7.0.35", + "postcss-modules-extract-imports": "2.0.0", + "postcss-modules-local-by-default": "3.0.3", + "postcss-modules-scope": "2.2.0", + "postcss-modules-values": "3.0.0", + "postcss-value-parser": "4.1.0", + "schema-utils": "2.7.1", + "semver": "7.3.2" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "0.1.6" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "0.1.1" - } + "camelcase": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.1.0.tgz", + "integrity": "sha512-WCMml9ivU60+8rEJgELlFp1gxFcEGxwYleE3bziHEDeqsqAWGHdimB7beBFGjLzVNgPGyDsfgXLQEYMpmIFnVQ==" }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" } } }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, + "css-prefers-color-scheme": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", + "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", "requires": { - "homedir-polyfill": "1.0.3" + "postcss": "7.0.35" } }, - "expect": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", - "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", - "requires": { - "@jest/types": "24.9.0", - "ansi-styles": "3.2.1", - "jest-get-type": "24.9.0", - "jest-matcher-utils": "24.9.0", - "jest-message-util": "24.9.0", - "jest-regex-util": "24.9.0" + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "requires": { + "boolbase": "1.0.0", + "css-what": "3.4.2", + "domutils": "1.7.0", + "nth-check": "1.0.2" } }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", "requires": { - "accepts": "1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "1.1.2", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", - "finalhandler": "1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "1.1.2", - "on-finished": "2.3.0", - "parseurl": "1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "2.0.6", - "qs": "6.7.0", - "range-parser": "1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "1.5.0", - "type-is": "1.6.18", - "utils-merge": "1.0.1", - "vary": "1.1.2" + "mdn-data": "2.0.4", + "source-map": "0.6.1" + } + }, + "css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==" + }, + "css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=" + }, + "cssdb": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", + "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==" + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + }, + "cssnano": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", + "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", + "requires": { + "cosmiconfig": "5.2.1", + "cssnano-preset-default": "4.0.7", + "is-resolvable": "1.1.0", + "postcss": "7.0.35" }, "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "requires": { - "ms": "2.0.0" + "import-fresh": "2.0.0", + "is-directory": "0.3.1", + "js-yaml": "3.14.0", + "parse-json": "4.0.0" } }, - "ms": { + "import-fresh": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "requires": { + "caller-path": "2.0.0", + "resolve-from": "3.0.0" + } }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "1.3.2", + "json-parse-better-errors": "1.0.2" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" } } }, - "ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "cssnano-preset-default": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", + "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", "requires": { - "type": "2.1.0" + "css-declaration-sorter": "4.0.1", + "cssnano-util-raw-cache": "4.0.1", + "postcss": "7.0.35", + "postcss-calc": "7.0.5", + "postcss-colormin": "4.0.3", + "postcss-convert-values": "4.0.1", + "postcss-discard-comments": "4.0.2", + "postcss-discard-duplicates": "4.0.2", + "postcss-discard-empty": "4.0.1", + "postcss-discard-overridden": "4.0.1", + "postcss-merge-longhand": "4.0.11", + "postcss-merge-rules": "4.0.3", + "postcss-minify-font-values": "4.0.2", + "postcss-minify-gradients": "4.0.2", + "postcss-minify-params": "4.0.2", + "postcss-minify-selectors": "4.0.2", + "postcss-normalize-charset": "4.0.1", + "postcss-normalize-display-values": "4.0.2", + "postcss-normalize-positions": "4.0.2", + "postcss-normalize-repeat-style": "4.0.2", + "postcss-normalize-string": "4.0.2", + "postcss-normalize-timing-functions": "4.0.2", + "postcss-normalize-unicode": "4.0.1", + "postcss-normalize-url": "4.0.1", + "postcss-normalize-whitespace": "4.0.2", + "postcss-ordered-values": "4.1.2", + "postcss-reduce-initial": "4.0.3", + "postcss-reduce-transforms": "4.0.2", + "postcss-svgo": "4.0.2", + "postcss-unique-selectors": "4.0.1" + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=" + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=" + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "requires": { + "postcss": "7.0.35" + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==" + }, + "csso": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz", + "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==", + "requires": { + "css-tree": "1.0.0-alpha.39" }, "dependencies": { - "type": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", - "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==" + "css-tree": { + "version": "1.0.0-alpha.39", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz", + "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", + "requires": { + "mdn-data": "2.0.6", + "source-map": "0.6.1" + } + }, + "mdn-data": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz", + "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==" } } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" + "cssom": "0.3.8" }, "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "2.0.4" - } + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" } } }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "csstype": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.4.tgz", + "integrity": "sha512-xc8DUsCLmjvCfoD7LTGE0ou2MIWLx0K9RCZwSHMOdynqRsP4MtUcLeqh1HcQ2dInwDTqn+3CE0/FZh1et+p4jA==" + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", "requires": { - "chardet": "0.7.0", - "iconv-lite": "0.4.24", - "tmp": "0.0.33" + "array-find-index": "1.0.2" } }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "es5-ext": "0.10.53", + "type": "1.2.0" + } + }, + "damerau-levenshtein": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", + "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "1.0.0" + } + }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "requires": { + "abab": "2.0.5", + "whatwg-mimetype": "2.3.0", + "whatwg-url": "8.4.0" + } + }, + "debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decimal.js": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", + "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=" + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "requires": { + "is-arguments": "1.0.4", + "is-date-object": "1.0.2", + "is-regex": "1.1.1", + "object-is": "1.1.3", + "object-keys": "1.1.1", + "regexp.prototype.flags": "1.3.0" + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "requires": { + "execa": "1.0.0", + "ip-regex": "2.1.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "1.1.1" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "1.0.2", + "isobject": "3.0.1" }, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "1.0.2" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "0.1.1" - } - }, "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", @@ -5884,144 +5674,111 @@ } } }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-glob": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", - "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", "requires": { - "@mrmlnc/readdir-enhanced": "2.2.1", - "@nodelib/fs.stat": "1.1.3", - "glob-parent": "3.1.0", - "is-glob": "4.0.1", - "merge2": "1.4.1", - "micromatch": "3.1.10" + "@types/glob": "7.1.3", + "globby": "6.1.0", + "is-path-cwd": "2.2.0", + "is-path-in-cwd": "2.1.0", + "p-map": "2.1.0", + "pify": "4.0.1", + "rimraf": "2.7.1" }, "dependencies": { - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" + "array-uniq": "1.0.3" + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "requires": { + "array-union": "1.0.2", + "glob": "7.1.6", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" }, "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "requires": { - "is-extglob": "2.1.1" - } + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" } } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" } } }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" }, - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "requires": { - "websocket-driver": "0.7.4" - } + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, - "fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", "requires": { - "bser": "2.1.1" + "inherits": "2.0.4", + "minimalistic-assert": "1.0.1" } }, - "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "requires": { - "escape-string-regexp": "1.0.5" - } + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "requires": { - "flat-cache": "2.0.1" - } + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true }, - "file-loader": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.3.0.tgz", - "integrity": "sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==", - "requires": { - "loader-utils": "1.4.0", - "schema-utils": "2.7.1" - } + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==" }, - "filesize": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.0.1.tgz", - "integrity": "sha512-u4AYWPgbI5GBhs6id1KdImZWn5yfyFrrQ8OWZdN7ZMfA8Bf4HcO0BGo9bmUIEV8yrp8I1xVfJ/dn90GtFNNJcg==" + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==" }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "requires": { - "debug": "2.6.9", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.3", - "statuses": "1.5.0", - "unpipe": "1.0.0" + "address": "1.1.2", + "debug": "2.6.9" }, "dependencies": { "debug": { @@ -6039,915 +5796,1259 @@ } } }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "requires": { - "commondir": "1.0.1", - "make-dir": "2.1.0", - "pkg-dir": "3.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } + "diff-sequences": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", + "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==" }, - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "dev": true, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "requires": { - "detect-file": "1.0.0", - "is-glob": "4.0.1", - "micromatch": "3.1.10", - "resolve-dir": "1.0.1" + "bn.js": "4.11.9", + "miller-rabin": "4.0.1", + "randombytes": "2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } } }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "requires": { - "flatted": "2.0.2", - "rimraf": "2.6.3", - "write": "1.0.3" + "path-type": "4.0.0" }, "dependencies": { - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "requires": { - "glob": "7.1.6" - } + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" } } }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==" + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" }, - "flatten": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", - "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==" + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "requires": { + "ip": "1.1.5", + "safe-buffer": "5.1.2" + } }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", "requires": { - "inherits": "2.0.4", - "readable-stream": "2.3.7" + "buffer-indexof": "1.1.1" } }, - "follow-redirects": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", - "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==" + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "requires": { + "esutils": "2.0.3" + } }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + "dom-accessibility-api": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.3.0.tgz", + "integrity": "sha512-PzwHEmsRP3IGY4gv/Ug+rMeaTIyTJvadCb+ujYXYeIylbHJezIyNToe8KfEgHTCEYyC+/bUghYOGg8yMGlZ6vA==" }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", "requires": { - "for-in": "1.0.2" + "utila": "0.4.0" } }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + "dom-helpers": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", + "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", + "requires": { + "@babel/runtime": "7.12.1" + } }, - "fork-ts-checker-webpack-plugin": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-3.1.1.tgz", - "integrity": "sha512-DuVkPNrM12jR41KM2e+N+styka0EgLkTnXmNcXdgOM37vtGeY+oCBK/Jx0hzSeEU6memFCtWb4htrHPMDfwwUQ==", + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", "requires": { - "babel-code-frame": "6.26.0", - "chalk": "2.4.2", - "chokidar": "3.4.2", - "micromatch": "3.1.10", - "minimatch": "3.0.4", - "semver": "5.7.1", - "tapable": "1.1.3", - "worker-rpc": "0.1.1" + "domelementtype": "2.0.2", + "entities": "2.1.0" }, "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "domelementtype": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.2.tgz", + "integrity": "sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA==" } } }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.8", - "mime-types": "2.1.27" - } + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", "requires": { - "map-cache": "0.2.2" + "webidl-conversions": "5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==" + } } }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", "requires": { - "inherits": "2.0.4", - "readable-stream": "2.3.7" + "domelementtype": "1.3.1" } }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", "requires": { - "graceful-fs": "4.2.4", - "jsonfile": "4.0.0", - "universalify": "0.1.2" + "dom-serializer": "0.2.2", + "domelementtype": "1.3.1" } }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dot-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.3.tgz", + "integrity": "sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA==", "requires": { - "minipass": "3.1.3" + "no-case": "3.0.3", + "tslib": "1.14.1" } }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "requires": { - "graceful-fs": "4.2.4", - "iferr": "0.1.5", - "imurmurhash": "0.1.4", - "readable-stream": "2.3.7" + "is-obj": "2.0.0" } }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "optional": true + "dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" }, - "fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "requires": { - "graceful-fs": "4.2.4", + "end-of-stream": "1.4.4", "inherits": "2.0.4", - "mkdirp": "0.5.5", - "rimraf": "2.7.1" + "readable-stream": "2.3.7", + "stream-shift": "1.0.1" } }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "0.1.1", + "safer-buffer": "2.1.2" + } }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, - "gauge": { + "ejs": { "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.3", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.3" - } + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==" }, - "gaze": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "electron-to-chromium": { + "version": "1.3.583", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.583.tgz", + "integrity": "sha512-L9BwLwJohjZW9mQESI79HRzhicPk1DFgM+8hOCfGgGCFEcA3Otpv7QK6SGtYoZvfQfE3wKLh0Hd5ptqUFv3gvQ==" + }, + "elliptic": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", "requires": { - "globule": "1.3.2" + "bn.js": "4.11.9", + "brorand": "1.1.0", + "hash.js": "1.1.7", + "hmac-drbg": "1.0.1", + "inherits": "2.0.4", + "minimalistic-assert": "1.0.1", + "minimalistic-crypto-utils": "1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } } }, - "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==" + "emittery": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", + "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==" }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" }, - "get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "requires": { - "pump": "3.0.0" + "once": "1.4.0" } }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "enhanced-resolve": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", + "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", "requires": { - "assert-plus": "1.0.0" + "graceful-fs": "4.2.4", + "memory-fs": "0.5.0", + "tapable": "1.1.3" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "requires": { + "errno": "0.1.7", + "readable-stream": "2.3.7" + } + } } }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.4", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "ansi-colors": "4.1.1" } }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==" + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "requires": { - "is-glob": "4.0.1" + "prr": "1.0.1" } }, - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=" - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "requires": { - "global-prefix": "3.0.0" + "is-arrayish": "0.2.1" } }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "error-stack-parser": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", + "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", "requires": { - "ini": "1.3.5", - "kind-of": "6.0.3", - "which": "1.3.1" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - } + "stackframe": "1.2.0" } }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, - "globby": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", - "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", "requires": { - "array-union": "1.0.2", - "dir-glob": "2.0.0", - "fast-glob": "2.2.7", - "glob": "7.1.6", - "ignore": "3.3.10", - "pify": "3.0.0", - "slash": "1.0.0" - }, - "dependencies": { - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" - } + "es-to-primitive": "1.2.1", + "function-bind": "1.1.1", + "has": "1.0.3", + "has-symbols": "1.0.1", + "is-callable": "1.2.2", + "is-negative-zero": "2.0.0", + "is-regex": "1.1.1", + "object-inspect": "1.8.0", + "object-keys": "1.1.1", + "object.assign": "4.1.1", + "string.prototype.trimend": "1.0.2", + "string.prototype.trimstart": "1.0.2" } }, - "globule": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.2.tgz", - "integrity": "sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==", + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "requires": { - "glob": "7.1.6", - "lodash": "4.17.20", - "minimatch": "3.0.4" + "is-callable": "1.2.2", + "is-date-object": "1.0.2", + "is-symbol": "1.0.3" } }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" - }, - "gud": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", - "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" - }, - "gzip-size": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", - "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", - "requires": { - "duplexer": "0.1.2", - "pify": "4.0.1" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - } - } - }, - "handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", "requires": { - "ajv": "6.12.4", - "har-schema": "2.0.0" + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.3", + "next-tick": "1.0.0" } }, - "harmony-reflect": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.1.tgz", - "integrity": "sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA==" - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "requires": { - "function-bind": "1.1.1" + "d": "1.0.1", + "es5-ext": "0.10.53", + "es6-symbol": "3.1.3" } }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", "requires": { - "ansi-regex": "2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - } + "d": "1.0.1", + "ext": "1.4.0" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "requires": { - "get-value": "2.0.6", - "has-values": "1.0.0", - "isobject": "3.0.1" - } + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "esprima": "4.0.1", + "estraverse": "4.3.0", + "esutils": "2.0.3", + "optionator": "0.8.3", + "source-map": "0.6.1" }, "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "requires": { - "is-buffer": "1.1.6" + "prelude-ls": "1.1.2", + "type-check": "0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "word-wrap": "1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "1.1.2" } } } }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "eslint": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.12.0.tgz", + "integrity": "sha512-n5pEU27DRxCSlOhJ2rO57GDLcNsxO0LPpAbpFdh7xmcDmjmlGUfoyrsB3I7yYdQXO5N3gkSTiDrPSPNFiiirXA==", "requires": { - "inherits": "2.0.4", - "readable-stream": "3.6.0", - "safe-buffer": "5.2.1" + "@babel/code-frame": "7.10.4", + "@eslint/eslintrc": "0.2.0", + "ajv": "6.12.6", + "chalk": "4.1.0", + "cross-spawn": "7.0.3", + "debug": "4.2.0", + "doctrine": "3.0.0", + "enquirer": "2.3.6", + "eslint-scope": "5.1.1", + "eslint-utils": "2.1.0", + "eslint-visitor-keys": "2.0.0", + "espree": "7.3.0", + "esquery": "1.3.1", + "esutils": "2.0.3", + "file-entry-cache": "5.0.1", + "functional-red-black-tree": "1.0.1", + "glob-parent": "5.1.1", + "globals": "12.4.0", + "ignore": "4.0.6", + "import-fresh": "3.2.1", + "imurmurhash": "0.1.4", + "is-glob": "4.0.1", + "js-yaml": "3.14.0", + "json-stable-stringify-without-jsonify": "1.0.1", + "levn": "0.4.1", + "lodash": "4.17.20", + "minimatch": "3.0.4", + "natural-compare": "1.4.0", + "optionator": "0.9.1", + "progress": "2.0.3", + "regexpp": "3.1.0", + "semver": "7.3.2", + "strip-ansi": "6.0.0", + "strip-json-comments": "3.1.1", + "table": "5.4.6", + "text-table": "0.2.0", + "v8-compile-cache": "2.1.1" }, "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "inherits": "2.0.4", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "color-convert": "2.0.1" } }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "requires": { - "inherits": "2.0.4", - "minimalistic-assert": "1.0.1" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" - }, - "hello-wasm-pack": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/hello-wasm-pack/-/hello-wasm-pack-0.1.0.tgz", - "integrity": "sha512-3hx0GDkDLf/a9ThCMV2qG4mwza8N/MCtm8aeFFc/cdBCL2zMJ1kW1wjNl7xPqD1lz8Yl5+uhnc/cpui4dLwz/w==", - "dev": true - }, - "hex-color-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", - "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "requires": { - "hash.js": "1.1.7", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "1.0.0" - } - }, - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "requires": { - "inherits": "2.0.4", - "obuf": "1.1.2", - "readable-stream": "2.3.7", - "wbuf": "1.7.3" + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "4.3.0", + "supports-color": "7.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "3.1.1", + "shebang-command": "2.0.0", + "which": "2.0.2" + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "requires": { + "type-fest": "0.8.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "5.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "4.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "2.0.0" + } + } } }, - "hsl-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=" - }, - "hsla-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" - }, - "html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==" - }, - "html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "eslint-config-react-app": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-6.0.0.tgz", + "integrity": "sha512-bpoAAC+YRfzq0dsTk+6v9aHm/uqnDwayNAXleMypGl6CpxI9oXXscVHo4fk3eJPIn+rsbtNetB4r/ZIidFIE8A==", "requires": { - "whatwg-encoding": "1.0.5" + "confusing-browser-globals": "1.0.10" } }, - "html-entities": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", - "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==" - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" - }, - "html-minifier-terser": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", - "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", + "eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", "requires": { - "camel-case": "4.1.1", - "clean-css": "4.2.3", - "commander": "4.1.1", - "he": "1.2.0", - "param-case": "3.0.3", - "relateurl": "0.2.7", - "terser": "4.8.0" + "debug": "2.6.9", + "resolve": "1.18.1" }, "dependencies": { - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, - "html-webpack-plugin": { - "version": "4.0.0-beta.11", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.11.tgz", - "integrity": "sha512-4Xzepf0qWxf8CGg7/WQM5qBB2Lc/NFI7MhU59eUDTkuQp3skZczH4UA1d6oQyDEIoMDgERVhRyTdtUPZ5s5HBg==", + "eslint-module-utils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", "requires": { - "html-minifier-terser": "5.1.1", - "loader-utils": "1.4.0", - "lodash": "4.17.20", - "pretty-error": "2.1.1", - "tapable": "1.1.3", - "util.promisify": "1.0.0" + "debug": "2.6.9", + "pkg-dir": "2.0.0" }, "dependencies": { - "util.promisify": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "1.3.0" + } + }, + "p-try": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "requires": { - "define-properties": "1.1.3", - "object.getownpropertydescriptors": "2.1.0" + "find-up": "2.1.0" } } } }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "eslint-plugin-flowtype": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.2.0.tgz", + "integrity": "sha512-z7ULdTxuhlRJcEe1MVljePXricuPOrsWfScRXFhNzVD5dmTHWjIF57AxD0e7AbEoLSbjSsaA5S+hCg43WvpXJQ==", "requires": { - "domelementtype": "1.3.1", - "domhandler": "2.4.2", - "domutils": "1.7.0", - "entities": "1.1.2", - "inherits": "2.0.4", - "readable-stream": "3.6.0" - }, - "dependencies": { - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "2.0.4", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - } + "lodash": "4.17.20", + "string-natural-compare": "3.0.1" } }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "eslint-plugin-import": { + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", + "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", "requires": { - "depd": "1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": "1.5.0", - "toidentifier": "1.0.0" + "array-includes": "3.1.1", + "array.prototype.flat": "1.2.3", + "contains-path": "0.1.0", + "debug": "2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "0.3.4", + "eslint-module-utils": "2.6.0", + "has": "1.0.3", + "minimatch": "3.0.4", + "object.values": "1.1.1", + "read-pkg-up": "2.0.0", + "resolve": "1.18.1", + "tsconfig-paths": "3.9.0" }, "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "requires": { + "esutils": "2.0.3", + "isarray": "1.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "2.0.0" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "requires": { + "graceful-fs": "4.2.4", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "1.3.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "requires": { + "pify": "2.3.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.5.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" } } }, - "http-parser-js": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.2.tgz", - "integrity": "sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ==" - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "eslint-plugin-jest": { + "version": "24.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.1.0.tgz", + "integrity": "sha512-827YJ+E8B9PvXu/0eiVSNFfxxndbKv+qE/3GSMhdorCaeaOehtqHGX2YDW9B85TEOre9n/zscledkFW/KbnyGg==", "requires": { - "eventemitter3": "4.0.7", - "follow-redirects": "1.13.0", - "requires-port": "1.0.0" + "@typescript-eslint/experimental-utils": "4.6.0" } }, - "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "eslint-plugin-jsx-a11y": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz", + "integrity": "sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg==", "requires": { - "http-proxy": "1.18.1", - "is-glob": "4.0.1", - "lodash": "4.17.20", - "micromatch": "3.1.10" + "@babel/runtime": "7.12.1", + "aria-query": "4.2.2", + "array-includes": "3.1.1", + "ast-types-flow": "0.0.7", + "axe-core": "4.0.2", + "axobject-query": "2.2.0", + "damerau-levenshtein": "1.0.6", + "emoji-regex": "9.2.0", + "has": "1.0.3", + "jsx-ast-utils": "3.1.0", + "language-tags": "1.0.5" + }, + "dependencies": { + "emoji-regex": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.0.tgz", + "integrity": "sha512-DNc3KFPK18bPdElMJnf/Pkv5TXhxFU3YFDEuGLDRtPmV4rkmCjBkCSEp22u6rBHdSN9Vlp/GK7k98prmE1Jgug==" + } } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "eslint-plugin-react": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.21.5.tgz", + "integrity": "sha512-8MaEggC2et0wSF6bUeywF7qQ46ER81irOdWS4QWxnnlAEsnzeBevk1sWh7fhpCghPpXb+8Ks7hvaft6L/xsR6g==", "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.16.1" + "array-includes": "3.1.1", + "array.prototype.flatmap": "1.2.3", + "doctrine": "2.1.0", + "has": "1.0.3", + "jsx-ast-utils": "3.1.0", + "object.entries": "1.1.2", + "object.fromentries": "2.0.2", + "object.values": "1.1.1", + "prop-types": "15.7.2", + "resolve": "1.18.1", + "string.prototype.matchall": "4.0.2" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "requires": { + "esutils": "2.0.3" + } + } } }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + "eslint-plugin-react-hooks": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz", + "integrity": "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==" }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "eslint-plugin-testing-library": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-3.9.2.tgz", + "integrity": "sha512-79oWT8dIPerbm4fdZj/QkeKB43P3XgSNbBWLnBi+Li0n+CFEvW078Q962VWeXXqHHofuXJeVOXg7grjiw849BQ==", "requires": { - "safer-buffer": "2.1.2" + "@typescript-eslint/experimental-utils": "3.10.1" + }, + "dependencies": { + "@typescript-eslint/experimental-utils": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz", + "integrity": "sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==", + "requires": { + "@types/json-schema": "7.0.6", + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/typescript-estree": "3.10.1", + "eslint-scope": "5.1.1", + "eslint-utils": "2.1.0" + } + }, + "@typescript-eslint/types": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz", + "integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==" + }, + "@typescript-eslint/typescript-estree": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz", + "integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==", + "requires": { + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/visitor-keys": "3.10.1", + "debug": "4.2.0", + "glob": "7.1.6", + "is-glob": "4.0.1", + "lodash": "4.17.20", + "semver": "7.3.2", + "tsutils": "3.17.1" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz", + "integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==", + "requires": { + "eslint-visitor-keys": "1.3.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" + } } }, - "icss-utils": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", - "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "requires": { - "postcss": "7.0.32" + "esrecurse": "4.3.0", + "estraverse": "4.3.0" } }, - "identity-obj-proxy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", - "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=", + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "requires": { - "harmony-reflect": "1.6.1" + "eslint-visitor-keys": "1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + } } }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + "eslint-visitor-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==" }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + "eslint-webpack-plugin": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-2.1.0.tgz", + "integrity": "sha512-WZT1uoJXSwtEJTkS+81XBERFJzNh0xoZn8fUtQNQWri7++UiYaLJjxJTmwEEyI58NJ536upq9tjN9i3jMwkWQg==", + "requires": { + "@types/eslint": "7.2.4", + "arrify": "2.0.1", + "fs-extra": "9.0.1", + "micromatch": "4.0.2", + "schema-utils": "2.7.1" + } }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" - }, - "immer": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/immer/-/immer-1.10.0.tgz", - "integrity": "sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg==" - }, - "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "espree": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz", + "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==", "requires": { - "import-from": "2.1.0" + "acorn": "7.4.1", + "acorn-jsx": "5.3.1", + "eslint-visitor-keys": "1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + } } }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "requires": { - "caller-path": "2.0.0", - "resolve-from": "3.0.0" - } + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", "requires": { - "resolve-from": "3.0.0" + "estraverse": "5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + } } }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "requires": { - "pkg-dir": "3.0.0", - "resolve-cwd": "2.0.0" + "estraverse": "5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + } } }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" }, - "in-publish": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz", - "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==" + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "events": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==" + }, + "eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "original": "1.0.2" } }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "1.3.5", + "safe-buffer": "5.1.2" + } }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + "exec-sh": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", + "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==" }, - "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "requires": { - "ansi-escapes": "4.3.1", - "chalk": "4.1.0", - "cli-cursor": "3.1.0", - "cli-width": "3.0.0", - "external-editor": "3.1.0", - "figures": "3.2.0", - "lodash": "4.17.20", - "mute-stream": "0.0.8", - "run-async": "2.4.1", - "rxjs": "6.6.3", - "string-width": "4.2.0", - "strip-ansi": "6.0.0", - "through": "2.3.8" + "cross-spawn": "6.0.5", + "get-stream": "4.1.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.3", + "strip-eof": "1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "1.0.5", + "path-key": "2.0.1", + "semver": "5.7.1", + "shebang-command": "1.2.0", + "which": "1.3.1" + } + } + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "0.1.1" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "1.0.3" + } + }, + "expect": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.1.tgz", + "integrity": "sha512-BRfxIBHagghMmr1D2MRY0Qv5d3Nc8HCqgbDwNXw/9izmM5eBb42a2YjLKSbsqle76ozGkAEPELQX4IdNHAKRNA==", + "requires": { + "@jest/types": "26.6.1", + "ansi-styles": "4.3.0", + "jest-get-type": "26.3.0", + "jest-matcher-utils": "26.6.1", + "jest-message-util": "26.6.1", + "jest-regex-util": "26.0.0" }, "dependencies": { + "@jest/types": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.1.tgz", + "integrity": "sha512-ywHavIKNpAVrStiRY5wiyehvcktpijpItvGiK72RAn5ctqmzvPk8OvKnvHeBqa1XdQr959CTWAJMqxI8BTibyg==", + "requires": { + "@types/istanbul-lib-coverage": "2.0.3", + "@types/istanbul-reports": "3.0.0", + "@types/node": "14.14.3", + "@types/yargs": "15.0.9", + "chalk": "4.1.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "requires": { + "@types/istanbul-lib-report": "3.0.0" + } + }, + "@types/yargs": { + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", + "requires": { + "@types/yargs-parser": "15.0.0" + } + }, "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "@types/color-name": "1.1.1", "color-convert": "2.0.1" } }, @@ -6956,7 +7057,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "requires": { - "ansi-styles": "4.2.1", + "ansi-styles": "4.3.0", "supports-color": "7.2.0" } }, @@ -6973,39 +7074,59 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "diff-sequences": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.5.0.tgz", + "integrity": "sha512-ZXx86srb/iYy6jG71k++wBN9P9J05UNQ5hQHQd9MtMPvcqXPx/vKU69jfHV637D00Q2gSgPk2D+jSx3l1lDW/Q==" }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "jest-diff": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.1.tgz", + "integrity": "sha512-BBNy/zin2m4kG5In126O8chOBxLLS/XMTuuM2+YhgyHk87ewPzKTuTJcqj3lOWOi03NNgrl+DkMeV/exdvG9gg==", "requires": { - "emoji-regex": "8.0.0", - "is-fullwidth-code-point": "3.0.0", - "strip-ansi": "6.0.0" + "chalk": "4.1.0", + "diff-sequences": "26.5.0", + "jest-get-type": "26.3.0", + "pretty-format": "26.6.1" } }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==" + }, + "jest-matcher-utils": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.1.tgz", + "integrity": "sha512-9iu3zrsYlUnl8pByhREF9rr5eYoiEb1F7ymNKg6lJr/0qD37LWS5FSW/JcoDl8UdMX2+zAzabDs7sTO+QFKjCg==", "requires": { - "ansi-regex": "5.0.0" + "chalk": "4.1.0", + "jest-diff": "26.6.1", + "jest-get-type": "26.3.0", + "pretty-format": "26.6.1" + } + }, + "pretty-format": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.1.tgz", + "integrity": "sha512-MeqqsP5PYcRBbGMvwzsyBdmAJ4EFX7pWFyl7x4+dMVg5pE0ZDdBIvEH2ergvIO+Gvwv1wh64YuOY9y5LuyY/GA==", + "requires": { + "@jest/types": "26.6.1", + "ansi-regex": "5.0.0", + "ansi-styles": "4.3.0", + "react-is": "17.0.1" } }, + "react-is": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", + "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==" + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -7016,949 +7137,5034 @@ } } }, - "internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", "requires": { - "default-gateway": "4.2.0", - "ipaddr.js": "1.9.1" + "accepts": "1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "1.1.2", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", + "finalhandler": "1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "2.0.6", + "qs": "6.7.0", + "range-parser": "1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "1.5.0", + "type-is": "1.6.18", + "utils-merge": "1.0.1", + "vary": "1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + } } }, - "internal-slot": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.2.tgz", - "integrity": "sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g==", + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", "requires": { - "es-abstract": "1.17.6", - "has": "1.0.3", - "side-channel": "1.0.3" + "type": "2.1.0" + }, + "dependencies": { + "type": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", + "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==" + } } }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "requires": { - "loose-envify": "1.4.0" + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "2.0.4" + } + } } }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=" + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "requires": { + "chardet": "0.7.0", + "iconv-lite": "0.4.24", + "tmp": "0.0.33" + } }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "requires": { - "kind-of": "3.2.2" + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "6.0.3" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "6.0.3" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.3" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + } } }, - "is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", - "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==" + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "fast-glob": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", + "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", "requires": { - "binary-extensions": "2.1.0" + "@nodelib/fs.stat": "2.0.3", + "@nodelib/fs.walk": "1.2.4", + "glob-parent": "5.1.1", + "merge2": "1.4.1", + "micromatch": "4.0.2", + "picomatch": "2.2.2" } }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==" + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "requires": { - "ci-info": "2.0.0" - } + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, - "is-color-stop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "fastq": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", + "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", "requires": { - "css-color-names": "0.0.4", - "hex-color-regex": "1.1.0", - "hsl-regex": "1.0.0", - "hsla-regex": "1.0.0", - "rgb-regex": "1.0.1", - "rgba-regex": "1.0.0" + "reusify": "1.0.4" } }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", "requires": { - "kind-of": "3.2.2" + "websocket-driver": "0.6.5" } }, - "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } + "bser": "2.1.1" } }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" - }, - "is-docker": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", - "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==" - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==" + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "requires": { - "number-is-nan": "1.0.1" + "escape-string-regexp": "1.0.5" } }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", "requires": { - "is-extglob": "2.1.1" + "flat-cache": "2.0.1" } }, - "is-negative-zero": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", - "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=" - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "file-loader": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.1.1.tgz", + "integrity": "sha512-Klt8C4BjWSXYQAfhpYYkG4qHNTna4toMHEbWrI5IuVoxbU6uiDKeKAP99R8mmbJi3lvewn/jQBOgU4+NS3tDQw==", "requires": { - "kind-of": "3.2.2" + "loader-utils": "2.0.0", + "schema-utils": "3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "requires": { + "@types/json-schema": "7.0.6", + "ajv": "6.12.6", + "ajv-keywords": "3.5.2" + } + } } }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==" + "filesize": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.1.0.tgz", + "integrity": "sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg==" }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "requires": { - "is-path-inside": "2.1.0" + "to-regex-range": "5.0.1" } }, - "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "requires": { - "path-is-inside": "1.0.2" + "debug": "2.6.9", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.3", + "statuses": "1.5.0", + "unpipe": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } } }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", "requires": { - "isobject": "3.0.1" + "commondir": "1.0.1", + "make-dir": "2.1.0", + "pkg-dir": "3.0.0" } }, - "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "requires": { - "has-symbols": "1.0.1" + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" } }, - "is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=" - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" - }, - "is-root": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==" - }, - "is-svg": { + "findup-sync": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", - "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, "requires": { - "html-comment-regex": "1.1.2" + "detect-file": "1.0.0", + "is-glob": "4.0.1", + "micromatch": "3.1.10", + "resolve-dir": "1.0.1" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.3", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.3", + "nanomatch": "1.2.13", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "repeat-string": "1.6.1" + } + } + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "requires": { + "flatted": "2.0.2", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "requires": { + "glob": "7.1.6" + } + } + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==" + }, + "flatten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", + "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==" + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "requires": { + "inherits": "2.0.4", + "readable-stream": "2.3.7" + } + }, + "follow-redirects": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", + "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "requires": { + "for-in": "1.0.2" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "fork-ts-checker-webpack-plugin": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz", + "integrity": "sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==", + "requires": { + "@babel/code-frame": "7.10.4", + "chalk": "2.4.2", + "micromatch": "3.1.10", + "minimatch": "3.0.4", + "semver": "5.7.1", + "tapable": "1.1.3", + "worker-rpc": "0.1.1" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.3", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.3", + "nanomatch": "1.2.13", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "3.0.0", + "repeat-string": "1.6.1" + } + } + } + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.8", + "mime-types": "2.1.27" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "requires": { + "inherits": "2.0.4", + "readable-stream": "2.3.7" + } + }, + "fs-extra": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", + "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", + "requires": { + "at-least-node": "1.0.0", + "graceful-fs": "4.2.4", + "jsonfile": "6.0.1", + "universalify": "1.0.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "3.1.3" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "requires": { + "graceful-fs": "4.2.4", + "iferr": "0.1.5", + "imurmurhash": "0.1.4", + "readable-stream": "2.3.7" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "optional": true + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "requires": { + "graceful-fs": "4.2.4", + "inherits": "2.0.4", + "mkdirp": "0.5.5", + "rimraf": "2.7.1" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.3", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.3" + } + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "requires": { + "globule": "1.3.2" + } + }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==" + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==" + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "1.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.4", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "requires": { + "is-glob": "4.0.1" + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "requires": { + "global-prefix": "3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "requires": { + "ini": "1.3.5", + "kind-of": "6.0.3", + "which": "1.3.1" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + } + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "globby": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "requires": { + "array-union": "2.1.0", + "dir-glob": "3.0.1", + "fast-glob": "3.2.4", + "ignore": "5.1.8", + "merge2": "1.4.1", + "slash": "3.0.0" + } + }, + "globule": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.2.tgz", + "integrity": "sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==", + "requires": { + "glob": "7.1.6", + "lodash": "4.17.20", + "minimatch": "3.0.4" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "optional": true + }, + "gud": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", + "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" + }, + "gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "requires": { + "duplexer": "0.1.2", + "pify": "4.0.1" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + } + } + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "requires": { + "ajv": "6.12.6", + "har-schema": "2.0.0" + } + }, + "harmony-reflect": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.1.tgz", + "integrity": "sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "requires": { + "inherits": "2.0.4", + "readable-stream": "3.6.0", + "safe-buffer": "5.2.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "2.0.4", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "2.0.4", + "minimalistic-assert": "1.0.1" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "hello-wasm-pack": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/hello-wasm-pack/-/hello-wasm-pack-0.1.0.tgz", + "integrity": "sha512-3hx0GDkDLf/a9ThCMV2qG4mwza8N/MCtm8aeFFc/cdBCL2zMJ1kW1wjNl7xPqD1lz8Yl5+uhnc/cpui4dLwz/w==", + "dev": true + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "1.1.7", + "minimalistic-assert": "1.0.1", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "1.0.0" + } + }, + "hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==" + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "requires": { + "inherits": "2.0.4", + "obuf": "1.1.2", + "readable-stream": "2.3.7", + "wbuf": "1.7.3" + } + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=" + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" + }, + "html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==" + }, + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "requires": { + "whatwg-encoding": "1.0.5" + } + }, + "html-entities": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", + "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==" + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + }, + "html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", + "requires": { + "camel-case": "4.1.1", + "clean-css": "4.2.3", + "commander": "4.1.1", + "he": "1.2.0", + "param-case": "3.0.3", + "relateurl": "0.2.7", + "terser": "4.8.0" + } + }, + "html-webpack-plugin": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz", + "integrity": "sha512-MouoXEYSjTzCrjIxWwg8gxL5fE2X2WZJLmBYXlaJhQUH5K/b5OrqmV7T4dB7iu0xkmJ6JlUuV6fFVtnqbPopZw==", + "requires": { + "@types/html-minifier-terser": "5.1.1", + "@types/tapable": "1.0.6", + "@types/webpack": "4.41.23", + "html-minifier-terser": "5.1.1", + "loader-utils": "1.4.0", + "lodash": "4.17.20", + "pretty-error": "2.1.2", + "tapable": "1.1.3", + "util.promisify": "1.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "1.2.5" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "5.2.2", + "emojis-list": "3.0.0", + "json5": "1.0.1" + } + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "requires": { + "define-properties": "1.1.3", + "object.getownpropertydescriptors": "2.1.0" + } + } + } + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "requires": { + "domelementtype": "1.3.1", + "domhandler": "2.4.2", + "domutils": "1.7.0", + "entities": "1.1.2", + "inherits": "2.0.4", + "readable-stream": "3.6.0" + }, + "dependencies": { + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "2.0.4", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + } + } + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": "1.5.0", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "requires": { + "eventemitter3": "4.0.7", + "follow-redirects": "1.13.0", + "requires-port": "1.0.0" + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "requires": { + "http-proxy": "1.18.1", + "is-glob": "4.0.1", + "lodash": "4.17.20", + "micromatch": "3.1.10" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.3", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.3", + "nanomatch": "1.2.13", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "3.0.0", + "repeat-string": "1.6.1" + } + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.16.1" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": "2.1.2" + } + }, + "icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "requires": { + "postcss": "7.0.35" + } + }, + "identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=", + "requires": { + "harmony-reflect": "1.6.1" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" + }, + "immer": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/immer/-/immer-7.0.9.tgz", + "integrity": "sha512-Vs/gxoM4DqNAYR7pugIxi0Xc8XAun/uy7AQu4fLLqaTBHxjOP9pJ266Q9MWA/ly4z6rAFZbvViOtihxUZ7O28A==" + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "requires": { + "import-from": "2.1.0" + } + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "requires": { + "parent-module": "1.0.1", + "resolve-from": "4.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "requires": { + "resolve-from": "3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + } + } + }, + "import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "requires": { + "pkg-dir": "4.2.0", + "resolve-cwd": "3.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "5.0.0", + "path-exists": "4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "2.3.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "requires": { + "find-up": "4.1.0" + } + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "in-publish": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz", + "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==" + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "requires": { + "ansi-escapes": "4.3.1", + "chalk": "4.1.0", + "cli-cursor": "3.1.0", + "cli-width": "3.0.0", + "external-editor": "3.1.0", + "figures": "3.2.0", + "lodash": "4.17.20", + "mute-stream": "0.0.8", + "run-async": "2.4.1", + "rxjs": "6.6.3", + "string-width": "4.2.0", + "strip-ansi": "6.0.0", + "through": "2.3.8" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "4.3.0", + "supports-color": "7.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "requires": { + "emoji-regex": "8.0.0", + "is-fullwidth-code-point": "3.0.0", + "strip-ansi": "6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "5.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "4.0.0" + } + } + } + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "requires": { + "default-gateway": "4.2.0", + "ipaddr.js": "1.9.1" + } + }, + "internal-slot": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.2.tgz", + "integrity": "sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g==", + "requires": { + "es-abstract": "1.17.7", + "has": "1.0.3", + "side-channel": "1.0.3" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "requires": { + "es-to-primitive": "1.2.1", + "function-bind": "1.1.1", + "has": "1.0.3", + "has-symbols": "1.0.1", + "is-callable": "1.2.2", + "is-regex": "1.1.1", + "object-inspect": "1.8.0", + "object-keys": "1.1.1", + "object.assign": "4.1.1", + "string.prototype.trimend": "1.0.2", + "string.prototype.trimstart": "1.0.2" + } + } + } + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=" + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "3.2.2" + } + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==" + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "optional": true, + "requires": { + "binary-extensions": "2.1.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-callable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==" + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "requires": { + "ci-info": "2.0.0" + } + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "requires": { + "css-color-names": "0.0.4", + "hex-color-regex": "1.1.0", + "hsl-regex": "1.0.0", + "hsla-regex": "1.0.0", + "rgb-regex": "1.0.1", + "rgba-regex": "1.0.0" + } + }, + "is-core-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.0.0.tgz", + "integrity": "sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw==", + "requires": { + "has": "1.0.3" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "3.2.2" + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" + }, + "is-docker": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", + "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==" + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "2.1.1" + } + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=" + }, + "is-negative-zero": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", + "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=" + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==" + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "requires": { + "is-path-inside": "2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "3.0.1" + } + }, + "is-potential-custom-element-name": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", + "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=" + }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "requires": { + "has-symbols": "1.0.1" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=" + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" + }, + "is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==" + }, + "is-svg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", + "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", + "requires": { + "html-comment-regex": "1.1.2" + } + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "requires": { + "has-symbols": "1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "requires": { + "is-docker": "2.1.1" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "requires": { + "@babel/core": "7.12.3", + "@istanbuljs/schema": "0.1.2", + "istanbul-lib-coverage": "3.0.0", + "semver": "6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "requires": { + "istanbul-lib-coverage": "3.0.0", + "make-dir": "3.1.0", + "supports-color": "7.2.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "6.3.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "requires": { + "debug": "4.2.0", + "istanbul-lib-coverage": "3.0.0", + "source-map": "0.6.1" + } + }, + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "requires": { + "html-escaper": "2.0.2", + "istanbul-lib-report": "3.0.0" + } + }, + "jest": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.0.tgz", + "integrity": "sha512-jxTmrvuecVISvKFFhOkjsWRZV7sFqdSUAd1ajOKY+/QE/aLBVstsJ/dX8GczLzwiT6ZEwwmZqtCUHLHHQVzcfA==", + "requires": { + "@jest/core": "26.6.1", + "import-local": "3.0.2", + "jest-cli": "26.6.1" + }, + "dependencies": { + "@jest/types": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.1.tgz", + "integrity": "sha512-ywHavIKNpAVrStiRY5wiyehvcktpijpItvGiK72RAn5ctqmzvPk8OvKnvHeBqa1XdQr959CTWAJMqxI8BTibyg==", + "requires": { + "@types/istanbul-lib-coverage": "2.0.3", + "@types/istanbul-reports": "3.0.0", + "@types/node": "14.14.3", + "@types/yargs": "15.0.9", + "chalk": "4.1.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "requires": { + "@types/istanbul-lib-report": "3.0.0" + } + }, + "@types/yargs": { + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", + "requires": { + "@types/yargs-parser": "15.0.0" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "2.0.1" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "4.3.0", + "supports-color": "7.2.0" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "requires": { + "string-width": "4.2.0", + "strip-ansi": "6.0.0", + "wrap-ansi": "6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "5.0.0", + "path-exists": "4.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "jest-cli": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.1.tgz", + "integrity": "sha512-aPLoEjlwFrCWhiPpW5NUxQA1X1kWsAnQcQ0SO/fHsCvczL3W75iVAcH9kP6NN+BNqZcHNEvkhxT5cDmBfEAh+w==", + "requires": { + "@jest/core": "26.6.1", + "@jest/test-result": "26.6.1", + "@jest/types": "26.6.1", + "chalk": "4.1.0", + "exit": "0.1.2", + "graceful-fs": "4.2.4", + "import-local": "3.0.2", + "is-ci": "2.0.0", + "jest-config": "26.6.1", + "jest-util": "26.6.1", + "jest-validate": "26.6.1", + "prompts": "2.4.0", + "yargs": "15.4.1" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "2.3.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "requires": { + "emoji-regex": "8.0.0", + "is-fullwidth-code-point": "3.0.0", + "strip-ansi": "6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "5.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "4.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "requires": { + "ansi-styles": "4.3.0", + "string-width": "4.2.0", + "strip-ansi": "6.0.0" + } + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "requires": { + "cliui": "6.0.0", + "decamelize": "1.2.0", + "find-up": "4.1.0", + "get-caller-file": "2.0.5", + "require-directory": "2.1.1", + "require-main-filename": "2.0.0", + "set-blocking": "2.0.0", + "string-width": "4.2.0", + "which-module": "2.0.0", + "y18n": "4.0.0", + "yargs-parser": "18.1.3" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "requires": { + "camelcase": "5.3.1", + "decamelize": "1.2.0" + } + } + } + }, + "jest-changed-files": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.1.tgz", + "integrity": "sha512-NhSdZ5F6b/rIN5V46x1l31vrmukD/bJUXgYAY8VtP1SknYdJwjYDRxuLt7Z8QryIdqCjMIn2C0Cd98EZ4umo8Q==", + "requires": { + "@jest/types": "26.6.1", + "execa": "4.0.3", + "throat": "5.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.1.tgz", + "integrity": "sha512-ywHavIKNpAVrStiRY5wiyehvcktpijpItvGiK72RAn5ctqmzvPk8OvKnvHeBqa1XdQr959CTWAJMqxI8BTibyg==", + "requires": { + "@types/istanbul-lib-coverage": "2.0.3", + "@types/istanbul-reports": "3.0.0", + "@types/node": "14.14.3", + "@types/yargs": "15.0.9", + "chalk": "4.1.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "requires": { + "@types/istanbul-lib-report": "3.0.0" + } + }, + "@types/yargs": { + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", + "requires": { + "@types/yargs-parser": "15.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "4.3.0", + "supports-color": "7.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "3.1.1", + "shebang-command": "2.0.0", + "which": "2.0.2" + } + }, + "execa": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", + "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", + "requires": { + "cross-spawn": "7.0.3", + "get-stream": "5.2.0", + "human-signals": "1.1.1", + "is-stream": "2.0.0", + "merge-stream": "2.0.0", + "npm-run-path": "4.0.1", + "onetime": "5.1.2", + "signal-exit": "3.0.3", + "strip-final-newline": "2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "requires": { + "pump": "3.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "requires": { + "path-key": "3.1.1" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "4.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "2.0.0" + } + } + } + }, + "jest-circus": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-26.6.0.tgz", + "integrity": "sha512-L2/Y9szN6FJPWFK8kzWXwfp+FOR7xq0cUL4lIsdbIdwz3Vh6P1nrpcqOleSzr28zOtSHQNV9Z7Tl+KkuK7t5Ng==", + "requires": { + "@babel/traverse": "7.12.1", + "@jest/environment": "26.6.1", + "@jest/test-result": "26.6.1", + "@jest/types": "26.6.1", + "@types/babel__traverse": "7.0.15", + "@types/node": "14.14.3", + "chalk": "4.1.0", + "co": "4.6.0", + "dedent": "0.7.0", + "expect": "26.6.1", + "is-generator-fn": "2.1.0", + "jest-each": "26.6.1", + "jest-matcher-utils": "26.6.1", + "jest-message-util": "26.6.1", + "jest-runner": "26.6.1", + "jest-runtime": "26.6.1", + "jest-snapshot": "26.6.1", + "jest-util": "26.6.1", + "pretty-format": "26.6.1", + "stack-utils": "2.0.2", + "throat": "5.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.1.tgz", + "integrity": "sha512-ywHavIKNpAVrStiRY5wiyehvcktpijpItvGiK72RAn5ctqmzvPk8OvKnvHeBqa1XdQr959CTWAJMqxI8BTibyg==", + "requires": { + "@types/istanbul-lib-coverage": "2.0.3", + "@types/istanbul-reports": "3.0.0", + "@types/node": "14.14.3", + "@types/yargs": "15.0.9", + "chalk": "4.1.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "requires": { + "@types/istanbul-lib-report": "3.0.0" + } + }, + "@types/yargs": { + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", + "requires": { + "@types/yargs-parser": "15.0.0" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "4.3.0", + "supports-color": "7.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "diff-sequences": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.5.0.tgz", + "integrity": "sha512-ZXx86srb/iYy6jG71k++wBN9P9J05UNQ5hQHQd9MtMPvcqXPx/vKU69jfHV637D00Q2gSgPk2D+jSx3l1lDW/Q==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-diff": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.1.tgz", + "integrity": "sha512-BBNy/zin2m4kG5In126O8chOBxLLS/XMTuuM2+YhgyHk87ewPzKTuTJcqj3lOWOi03NNgrl+DkMeV/exdvG9gg==", + "requires": { + "chalk": "4.1.0", + "diff-sequences": "26.5.0", + "jest-get-type": "26.3.0", + "pretty-format": "26.6.1" + } + }, + "jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==" + }, + "jest-matcher-utils": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.1.tgz", + "integrity": "sha512-9iu3zrsYlUnl8pByhREF9rr5eYoiEb1F7ymNKg6lJr/0qD37LWS5FSW/JcoDl8UdMX2+zAzabDs7sTO+QFKjCg==", + "requires": { + "chalk": "4.1.0", + "jest-diff": "26.6.1", + "jest-get-type": "26.3.0", + "pretty-format": "26.6.1" + } + }, + "pretty-format": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.1.tgz", + "integrity": "sha512-MeqqsP5PYcRBbGMvwzsyBdmAJ4EFX7pWFyl7x4+dMVg5pE0ZDdBIvEH2ergvIO+Gvwv1wh64YuOY9y5LuyY/GA==", + "requires": { + "@jest/types": "26.6.1", + "ansi-regex": "5.0.0", + "ansi-styles": "4.3.0", + "react-is": "17.0.1" + } + }, + "react-is": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", + "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "4.0.0" + } + } + } + }, + "jest-config": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.1.tgz", + "integrity": "sha512-mtJzIynIwW1d1nMlKCNCQiSgWaqFn8cH/fOSNY97xG7Y9tBCZbCSuW2GTX0RPmceSJGO7l27JgwC18LEg0Vg+g==", + "requires": { + "@babel/core": "7.12.3", + "@jest/test-sequencer": "26.6.1", + "@jest/types": "26.6.1", + "babel-jest": "26.6.1", + "chalk": "4.1.0", + "deepmerge": "4.2.2", + "glob": "7.1.6", + "graceful-fs": "4.2.4", + "jest-environment-jsdom": "26.6.1", + "jest-environment-node": "26.6.1", + "jest-get-type": "26.3.0", + "jest-jasmine2": "26.6.1", + "jest-regex-util": "26.0.0", + "jest-resolve": "26.6.1", + "jest-util": "26.6.1", + "jest-validate": "26.6.1", + "micromatch": "4.0.2", + "pretty-format": "26.6.1" + }, + "dependencies": { + "@jest/types": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.1.tgz", + "integrity": "sha512-ywHavIKNpAVrStiRY5wiyehvcktpijpItvGiK72RAn5ctqmzvPk8OvKnvHeBqa1XdQr959CTWAJMqxI8BTibyg==", + "requires": { + "@types/istanbul-lib-coverage": "2.0.3", + "@types/istanbul-reports": "3.0.0", + "@types/node": "14.14.3", + "@types/yargs": "15.0.9", + "chalk": "4.1.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "requires": { + "@types/istanbul-lib-report": "3.0.0" + } + }, + "@types/yargs": { + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", + "requires": { + "@types/yargs-parser": "15.0.0" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "4.3.0", + "supports-color": "7.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "5.0.0", + "path-exists": "4.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==" + }, + "jest-resolve": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.1.tgz", + "integrity": "sha512-hiHfQH6rrcpAmw9xCQ0vD66SDuU+7ZulOuKwc4jpbmFFsz0bQG/Ib92K+9/489u5rVw0btr/ZhiHqBpmkbCvuQ==", + "requires": { + "@jest/types": "26.6.1", + "chalk": "4.1.0", + "graceful-fs": "4.2.4", + "jest-pnp-resolver": "1.2.2", + "jest-util": "26.6.1", + "read-pkg-up": "7.0.1", + "resolve": "1.18.1", + "slash": "3.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "2.3.0" + } + }, + "parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "requires": { + "@babel/code-frame": "7.10.4", + "error-ex": "1.3.2", + "json-parse-even-better-errors": "2.3.1", + "lines-and-columns": "1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "pretty-format": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.1.tgz", + "integrity": "sha512-MeqqsP5PYcRBbGMvwzsyBdmAJ4EFX7pWFyl7x4+dMVg5pE0ZDdBIvEH2ergvIO+Gvwv1wh64YuOY9y5LuyY/GA==", + "requires": { + "@jest/types": "26.6.1", + "ansi-regex": "5.0.0", + "ansi-styles": "4.3.0", + "react-is": "17.0.1" + } + }, + "react-is": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", + "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==" + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "requires": { + "@types/normalize-package-data": "2.4.0", + "normalize-package-data": "2.5.0", + "parse-json": "5.1.0", + "type-fest": "0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "requires": { + "find-up": "4.1.0", + "read-pkg": "5.2.0", + "type-fest": "0.8.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "4.0.0" + } + } + } + }, + "jest-diff": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", + "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", + "requires": { + "chalk": "2.4.2", + "diff-sequences": "24.9.0", + "jest-get-type": "24.9.0", + "pretty-format": "24.9.0" + } + }, + "jest-docblock": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", + "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", + "requires": { + "detect-newline": "3.1.0" + } + }, + "jest-each": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.1.tgz", + "integrity": "sha512-gSn8eB3buchuq45SU7pLB7qmCGax1ZSxfaWuEFblCyNMtyokYaKFh9dRhYPujK6xYL57dLIPhLKatjmB5XWzGA==", + "requires": { + "@jest/types": "26.6.1", + "chalk": "4.1.0", + "jest-get-type": "26.3.0", + "jest-util": "26.6.1", + "pretty-format": "26.6.1" + }, + "dependencies": { + "@jest/types": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.1.tgz", + "integrity": "sha512-ywHavIKNpAVrStiRY5wiyehvcktpijpItvGiK72RAn5ctqmzvPk8OvKnvHeBqa1XdQr959CTWAJMqxI8BTibyg==", + "requires": { + "@types/istanbul-lib-coverage": "2.0.3", + "@types/istanbul-reports": "3.0.0", + "@types/node": "14.14.3", + "@types/yargs": "15.0.9", + "chalk": "4.1.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "requires": { + "@types/istanbul-lib-report": "3.0.0" + } + }, + "@types/yargs": { + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", + "requires": { + "@types/yargs-parser": "15.0.0" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "4.3.0", + "supports-color": "7.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==" + }, + "pretty-format": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.1.tgz", + "integrity": "sha512-MeqqsP5PYcRBbGMvwzsyBdmAJ4EFX7pWFyl7x4+dMVg5pE0ZDdBIvEH2ergvIO+Gvwv1wh64YuOY9y5LuyY/GA==", + "requires": { + "@jest/types": "26.6.1", + "ansi-regex": "5.0.0", + "ansi-styles": "4.3.0", + "react-is": "17.0.1" + } + }, + "react-is": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", + "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "4.0.0" + } + } + } + }, + "jest-environment-jsdom": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.1.tgz", + "integrity": "sha512-A17RiXuHYNVlkM+3QNcQ6n5EZyAc6eld8ra9TW26luounGWpku4tj03uqRgHJCI1d4uHr5rJiuCH5JFRtdmrcA==", + "requires": { + "@jest/environment": "26.6.1", + "@jest/fake-timers": "26.6.1", + "@jest/types": "26.6.1", + "@types/node": "14.14.3", + "jest-mock": "26.6.1", + "jest-util": "26.6.1", + "jsdom": "16.4.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.1.tgz", + "integrity": "sha512-ywHavIKNpAVrStiRY5wiyehvcktpijpItvGiK72RAn5ctqmzvPk8OvKnvHeBqa1XdQr959CTWAJMqxI8BTibyg==", + "requires": { + "@types/istanbul-lib-coverage": "2.0.3", + "@types/istanbul-reports": "3.0.0", + "@types/node": "14.14.3", + "@types/yargs": "15.0.9", + "chalk": "4.1.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "requires": { + "@types/istanbul-lib-report": "3.0.0" + } + }, + "@types/yargs": { + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", + "requires": { + "@types/yargs-parser": "15.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "4.3.0", + "supports-color": "7.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "4.0.0" + } + } + } + }, + "jest-environment-node": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.1.tgz", + "integrity": "sha512-YffaCp6h0j1kbcf1NVZ7umC6CPgD67YS+G1BeornfuSkx5s3xdhuwG0DCxSiHPXyT81FfJzA1L7nXvhq50OWIg==", + "requires": { + "@jest/environment": "26.6.1", + "@jest/fake-timers": "26.6.1", + "@jest/types": "26.6.1", + "@types/node": "14.14.3", + "jest-mock": "26.6.1", + "jest-util": "26.6.1" + }, + "dependencies": { + "@jest/types": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.1.tgz", + "integrity": "sha512-ywHavIKNpAVrStiRY5wiyehvcktpijpItvGiK72RAn5ctqmzvPk8OvKnvHeBqa1XdQr959CTWAJMqxI8BTibyg==", + "requires": { + "@types/istanbul-lib-coverage": "2.0.3", + "@types/istanbul-reports": "3.0.0", + "@types/node": "14.14.3", + "@types/yargs": "15.0.9", + "chalk": "4.1.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "requires": { + "@types/istanbul-lib-report": "3.0.0" + } + }, + "@types/yargs": { + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", + "requires": { + "@types/yargs-parser": "15.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "4.3.0", + "supports-color": "7.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "4.0.0" + } + } + } + }, + "jest-get-type": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==" + }, + "jest-haste-map": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.1.tgz", + "integrity": "sha512-9kPafkv0nX6ta1PrshnkiyhhoQoFWncrU/uUBt3/AP1r78WSCU5iLceYRTwDvJl67H3RrXqSlSVDDa/AsUB7OQ==", + "requires": { + "@jest/types": "26.6.1", + "@types/graceful-fs": "4.1.4", + "@types/node": "14.14.3", + "anymatch": "3.1.1", + "fb-watchman": "2.0.1", + "fsevents": "2.1.3", + "graceful-fs": "4.2.4", + "jest-regex-util": "26.0.0", + "jest-serializer": "26.5.0", + "jest-util": "26.6.1", + "jest-worker": "26.6.1", + "micromatch": "4.0.2", + "sane": "4.1.0", + "walker": "1.0.7" + }, + "dependencies": { + "@jest/types": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.1.tgz", + "integrity": "sha512-ywHavIKNpAVrStiRY5wiyehvcktpijpItvGiK72RAn5ctqmzvPk8OvKnvHeBqa1XdQr959CTWAJMqxI8BTibyg==", + "requires": { + "@types/istanbul-lib-coverage": "2.0.3", + "@types/istanbul-reports": "3.0.0", + "@types/node": "14.14.3", + "@types/yargs": "15.0.9", + "chalk": "4.1.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "requires": { + "@types/istanbul-lib-report": "3.0.0" + } + }, + "@types/yargs": { + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", + "requires": { + "@types/yargs-parser": "15.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "4.3.0", + "supports-color": "7.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "4.0.0" + } + } + } + }, + "jest-jasmine2": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.1.tgz", + "integrity": "sha512-2uYdT32o/ZzSxYAPduAgokO8OlAL1YdG/9oxcEY138EDNpIK5XRRJDaGzTZdIBWSxk0aR8XxN44FvfXtHB+Fiw==", + "requires": { + "@babel/traverse": "7.12.1", + "@jest/environment": "26.6.1", + "@jest/source-map": "26.5.0", + "@jest/test-result": "26.6.1", + "@jest/types": "26.6.1", + "@types/node": "14.14.3", + "chalk": "4.1.0", + "co": "4.6.0", + "expect": "26.6.1", + "is-generator-fn": "2.1.0", + "jest-each": "26.6.1", + "jest-matcher-utils": "26.6.1", + "jest-message-util": "26.6.1", + "jest-runtime": "26.6.1", + "jest-snapshot": "26.6.1", + "jest-util": "26.6.1", + "pretty-format": "26.6.1", + "throat": "5.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.1.tgz", + "integrity": "sha512-ywHavIKNpAVrStiRY5wiyehvcktpijpItvGiK72RAn5ctqmzvPk8OvKnvHeBqa1XdQr959CTWAJMqxI8BTibyg==", + "requires": { + "@types/istanbul-lib-coverage": "2.0.3", + "@types/istanbul-reports": "3.0.0", + "@types/node": "14.14.3", + "@types/yargs": "15.0.9", + "chalk": "4.1.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "requires": { + "@types/istanbul-lib-report": "3.0.0" + } + }, + "@types/yargs": { + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", + "requires": { + "@types/yargs-parser": "15.0.0" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "4.3.0", + "supports-color": "7.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "diff-sequences": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.5.0.tgz", + "integrity": "sha512-ZXx86srb/iYy6jG71k++wBN9P9J05UNQ5hQHQd9MtMPvcqXPx/vKU69jfHV637D00Q2gSgPk2D+jSx3l1lDW/Q==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-diff": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.1.tgz", + "integrity": "sha512-BBNy/zin2m4kG5In126O8chOBxLLS/XMTuuM2+YhgyHk87ewPzKTuTJcqj3lOWOi03NNgrl+DkMeV/exdvG9gg==", + "requires": { + "chalk": "4.1.0", + "diff-sequences": "26.5.0", + "jest-get-type": "26.3.0", + "pretty-format": "26.6.1" + } + }, + "jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==" + }, + "jest-matcher-utils": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.1.tgz", + "integrity": "sha512-9iu3zrsYlUnl8pByhREF9rr5eYoiEb1F7ymNKg6lJr/0qD37LWS5FSW/JcoDl8UdMX2+zAzabDs7sTO+QFKjCg==", + "requires": { + "chalk": "4.1.0", + "jest-diff": "26.6.1", + "jest-get-type": "26.3.0", + "pretty-format": "26.6.1" + } + }, + "pretty-format": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.1.tgz", + "integrity": "sha512-MeqqsP5PYcRBbGMvwzsyBdmAJ4EFX7pWFyl7x4+dMVg5pE0ZDdBIvEH2ergvIO+Gvwv1wh64YuOY9y5LuyY/GA==", + "requires": { + "@jest/types": "26.6.1", + "ansi-regex": "5.0.0", + "ansi-styles": "4.3.0", + "react-is": "17.0.1" + } + }, + "react-is": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", + "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "4.0.0" + } + } + } + }, + "jest-leak-detector": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.1.tgz", + "integrity": "sha512-j9ZOtJSJKlHjrs4aIxWjiQUjyrffPdiAQn2Iw0916w7qZE5Lk0T2KhIH6E9vfhzP6sw0Q0jtnLLb4vQ71o1HlA==", + "requires": { + "jest-get-type": "26.3.0", + "pretty-format": "26.6.1" + }, + "dependencies": { + "@jest/types": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.1.tgz", + "integrity": "sha512-ywHavIKNpAVrStiRY5wiyehvcktpijpItvGiK72RAn5ctqmzvPk8OvKnvHeBqa1XdQr959CTWAJMqxI8BTibyg==", + "requires": { + "@types/istanbul-lib-coverage": "2.0.3", + "@types/istanbul-reports": "3.0.0", + "@types/node": "14.14.3", + "@types/yargs": "15.0.9", + "chalk": "4.1.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "requires": { + "@types/istanbul-lib-report": "3.0.0" + } + }, + "@types/yargs": { + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", + "requires": { + "@types/yargs-parser": "15.0.0" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "4.3.0", + "supports-color": "7.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==" + }, + "pretty-format": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.1.tgz", + "integrity": "sha512-MeqqsP5PYcRBbGMvwzsyBdmAJ4EFX7pWFyl7x4+dMVg5pE0ZDdBIvEH2ergvIO+Gvwv1wh64YuOY9y5LuyY/GA==", + "requires": { + "@jest/types": "26.6.1", + "ansi-regex": "5.0.0", + "ansi-styles": "4.3.0", + "react-is": "17.0.1" + } + }, + "react-is": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", + "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "4.0.0" + } + } + } + }, + "jest-matcher-utils": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", + "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", + "requires": { + "chalk": "2.4.2", + "jest-diff": "24.9.0", + "jest-get-type": "24.9.0", + "pretty-format": "24.9.0" } }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "jest-message-util": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.1.tgz", + "integrity": "sha512-cqM4HnqncIebBNdTKrBoWR/4ufHTll0pK/FWwX0YasK+TlBQEMqw3IEdynuuOTjDPFO3ONlFn37280X48beByw==", "requires": { - "has-symbols": "1.0.1" + "@babel/code-frame": "7.10.4", + "@jest/types": "26.6.1", + "@types/stack-utils": "2.0.0", + "chalk": "4.1.0", + "graceful-fs": "4.2.4", + "micromatch": "4.0.2", + "slash": "3.0.0", + "stack-utils": "2.0.2" + }, + "dependencies": { + "@jest/types": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.1.tgz", + "integrity": "sha512-ywHavIKNpAVrStiRY5wiyehvcktpijpItvGiK72RAn5ctqmzvPk8OvKnvHeBqa1XdQr959CTWAJMqxI8BTibyg==", + "requires": { + "@types/istanbul-lib-coverage": "2.0.3", + "@types/istanbul-reports": "3.0.0", + "@types/node": "14.14.3", + "@types/yargs": "15.0.9", + "chalk": "4.1.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "requires": { + "@types/istanbul-lib-report": "3.0.0" + } + }, + "@types/yargs": { + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", + "requires": { + "@types/yargs-parser": "15.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "4.3.0", + "supports-color": "7.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "4.0.0" + } + } } }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==" - }, - "istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "jest-mock": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.1.tgz", + "integrity": "sha512-my0lPTBu1awY8iVG62sB2sx9qf8zxNDVX+5aFgoB8Vbqjb6LqIOsfyFA8P1z6H2IsqMbvOX9oCJnK67Y3yUIMA==", "requires": { - "@babel/generator": "7.11.6", - "@babel/parser": "7.11.5", - "@babel/template": "7.10.4", - "@babel/traverse": "7.11.5", - "@babel/types": "7.11.5", - "istanbul-lib-coverage": "2.0.5", - "semver": "6.3.0" + "@jest/types": "26.6.1", + "@types/node": "14.14.3" }, "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "@jest/types": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.1.tgz", + "integrity": "sha512-ywHavIKNpAVrStiRY5wiyehvcktpijpItvGiK72RAn5ctqmzvPk8OvKnvHeBqa1XdQr959CTWAJMqxI8BTibyg==", + "requires": { + "@types/istanbul-lib-coverage": "2.0.3", + "@types/istanbul-reports": "3.0.0", + "@types/node": "14.14.3", + "@types/yargs": "15.0.9", + "chalk": "4.1.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "requires": { + "@types/istanbul-lib-report": "3.0.0" + } + }, + "@types/yargs": { + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", + "requires": { + "@types/yargs-parser": "15.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "4.3.0", + "supports-color": "7.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "4.0.0" + } } } }, - "istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==" + }, + "jest-regex-util": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==" + }, + "jest-resolve": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.0.tgz", + "integrity": "sha512-tRAz2bwraHufNp+CCmAD8ciyCpXCs1NQxB5EJAmtCFy6BN81loFEGWKzYu26Y62lAJJe4X4jg36Kf+NsQyiStQ==", "requires": { - "istanbul-lib-coverage": "2.0.5", - "make-dir": "2.1.0", - "supports-color": "6.1.0" + "@jest/types": "26.6.1", + "chalk": "4.1.0", + "graceful-fs": "4.2.4", + "jest-pnp-resolver": "1.2.2", + "jest-util": "26.6.1", + "read-pkg-up": "7.0.1", + "resolve": "1.18.1", + "slash": "3.0.0" }, "dependencies": { + "@jest/types": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.1.tgz", + "integrity": "sha512-ywHavIKNpAVrStiRY5wiyehvcktpijpItvGiK72RAn5ctqmzvPk8OvKnvHeBqa1XdQr959CTWAJMqxI8BTibyg==", + "requires": { + "@types/istanbul-lib-coverage": "2.0.3", + "@types/istanbul-reports": "3.0.0", + "@types/node": "14.14.3", + "@types/yargs": "15.0.9", + "chalk": "4.1.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "requires": { + "@types/istanbul-lib-report": "3.0.0" + } + }, + "@types/yargs": { + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", + "requires": { + "@types/yargs-parser": "15.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "4.3.0", + "supports-color": "7.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "5.0.0", + "path-exists": "4.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "2.3.0" + } + }, + "parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "requires": { + "@babel/code-frame": "7.10.4", + "error-ex": "1.3.2", + "json-parse-even-better-errors": "2.3.1", + "lines-and-columns": "1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "requires": { + "@types/normalize-package-data": "2.4.0", + "normalize-package-data": "2.5.0", + "parse-json": "5.1.0", + "type-fest": "0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "requires": { + "find-up": "4.1.0", + "read-pkg": "5.2.0", + "type-fest": "0.8.1" + } + }, "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { - "has-flag": "3.0.0" + "has-flag": "4.0.0" } } } }, - "istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", - "requires": { - "debug": "4.1.1", - "istanbul-lib-coverage": "2.0.5", - "make-dir": "2.1.0", - "rimraf": "2.7.1", - "source-map": "0.6.1" - } - }, - "istanbul-reports": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", - "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", - "requires": { - "html-escaper": "2.0.2" - } - }, - "jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", - "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", + "jest-resolve-dependencies": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.1.tgz", + "integrity": "sha512-MN6lufbZJ3RBfTnJesZtHu3hUCBqPdHRe2+FhIt0yiqJ3fMgzWRqMRQyN/d/QwOE7KXwAG2ekZutbPhuD7s51A==", "requires": { - "import-local": "2.0.0", - "jest-cli": "24.9.0" + "@jest/types": "26.6.1", + "jest-regex-util": "26.0.0", + "jest-snapshot": "26.6.1" }, "dependencies": { - "jest-cli": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", - "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", + "@jest/types": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.1.tgz", + "integrity": "sha512-ywHavIKNpAVrStiRY5wiyehvcktpijpItvGiK72RAn5ctqmzvPk8OvKnvHeBqa1XdQr959CTWAJMqxI8BTibyg==", "requires": { - "@jest/core": "24.9.0", - "@jest/test-result": "24.9.0", - "@jest/types": "24.9.0", - "chalk": "2.4.2", - "exit": "0.1.2", - "import-local": "2.0.0", - "is-ci": "2.0.0", - "jest-config": "24.9.0", - "jest-util": "24.9.0", - "jest-validate": "24.9.0", - "prompts": "2.3.2", - "realpath-native": "1.1.0", - "yargs": "13.3.2" + "@types/istanbul-lib-coverage": "2.0.3", + "@types/istanbul-reports": "3.0.0", + "@types/node": "14.14.3", + "@types/yargs": "15.0.9", + "chalk": "4.1.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "requires": { + "@types/istanbul-lib-report": "3.0.0" + } + }, + "@types/yargs": { + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", + "requires": { + "@types/yargs-parser": "15.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "4.3.0", + "supports-color": "7.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "4.0.0" } } } }, - "jest-changed-files": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", - "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", - "requires": { - "@jest/types": "24.9.0", - "execa": "1.0.0", - "throat": "4.1.0" - } - }, - "jest-config": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", - "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", - "requires": { - "@babel/core": "7.9.0", - "@jest/test-sequencer": "24.9.0", - "@jest/types": "24.9.0", - "babel-jest": "24.9.0", - "chalk": "2.4.2", - "glob": "7.1.6", - "jest-environment-jsdom": "24.9.0", - "jest-environment-node": "24.9.0", - "jest-get-type": "24.9.0", - "jest-jasmine2": "24.9.0", - "jest-regex-util": "24.9.0", - "jest-resolve": "24.9.0", - "jest-util": "24.9.0", - "jest-validate": "24.9.0", - "micromatch": "3.1.10", - "pretty-format": "24.9.0", - "realpath-native": "1.1.0" - } - }, - "jest-diff": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", - "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", - "requires": { - "chalk": "2.4.2", - "diff-sequences": "24.9.0", - "jest-get-type": "24.9.0", - "pretty-format": "24.9.0" - } - }, - "jest-docblock": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", - "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", - "requires": { - "detect-newline": "2.1.0" - } - }, - "jest-each": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", - "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", - "requires": { - "@jest/types": "24.9.0", - "chalk": "2.4.2", - "jest-get-type": "24.9.0", - "jest-util": "24.9.0", - "pretty-format": "24.9.0" - } - }, - "jest-environment-jsdom": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", - "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", - "requires": { - "@jest/environment": "24.9.0", - "@jest/fake-timers": "24.9.0", - "@jest/types": "24.9.0", - "jest-mock": "24.9.0", - "jest-util": "24.9.0", - "jsdom": "11.12.0" - } - }, - "jest-environment-jsdom-fourteen": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom-fourteen/-/jest-environment-jsdom-fourteen-1.0.1.tgz", - "integrity": "sha512-DojMX1sY+at5Ep+O9yME34CdidZnO3/zfPh8UW+918C5fIZET5vCjfkegixmsi7AtdYfkr4bPlIzmWnlvQkP7Q==", - "requires": { - "@jest/environment": "24.9.0", - "@jest/fake-timers": "24.9.0", - "@jest/types": "24.9.0", - "jest-mock": "24.9.0", - "jest-util": "24.9.0", - "jsdom": "14.1.0" + "jest-runner": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.1.tgz", + "integrity": "sha512-DmpNGdgsbl5s0FGkmsInmqnmqCtliCSnjWA2TFAJS1m1mL5atwfPsf+uoZ8uYQ2X0uDj4NM+nPcDnUpbNTRMBA==", + "requires": { + "@jest/console": "26.6.1", + "@jest/environment": "26.6.1", + "@jest/test-result": "26.6.1", + "@jest/types": "26.6.1", + "@types/node": "14.14.3", + "chalk": "4.1.0", + "emittery": "0.7.2", + "exit": "0.1.2", + "graceful-fs": "4.2.4", + "jest-config": "26.6.1", + "jest-docblock": "26.0.0", + "jest-haste-map": "26.6.1", + "jest-leak-detector": "26.6.1", + "jest-message-util": "26.6.1", + "jest-resolve": "26.6.1", + "jest-runtime": "26.6.1", + "jest-util": "26.6.1", + "jest-worker": "26.6.1", + "source-map-support": "0.5.19", + "throat": "5.0.0" }, "dependencies": { - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" - }, - "jsdom": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-14.1.0.tgz", - "integrity": "sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng==", - "requires": { - "abab": "2.0.4", - "acorn": "6.4.1", - "acorn-globals": "4.3.4", - "array-equal": "1.0.0", - "cssom": "0.3.8", - "cssstyle": "1.4.0", - "data-urls": "1.1.0", - "domexception": "1.0.1", - "escodegen": "1.14.3", - "html-encoding-sniffer": "1.0.2", - "nwsapi": "2.2.0", - "parse5": "5.1.0", - "pn": "1.1.0", - "request": "2.88.2", - "request-promise-native": "1.0.9", - "saxes": "3.1.11", - "symbol-tree": "3.2.4", - "tough-cookie": "2.5.0", - "w3c-hr-time": "1.0.2", - "w3c-xmlserializer": "1.1.2", - "webidl-conversions": "4.0.2", - "whatwg-encoding": "1.0.5", - "whatwg-mimetype": "2.3.0", - "whatwg-url": "7.1.0", - "ws": "6.2.1", - "xml-name-validator": "3.0.0" - } - }, - "parse5": { + "@jest/types": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.1.tgz", + "integrity": "sha512-ywHavIKNpAVrStiRY5wiyehvcktpijpItvGiK72RAn5ctqmzvPk8OvKnvHeBqa1XdQr959CTWAJMqxI8BTibyg==", + "requires": { + "@types/istanbul-lib-coverage": "2.0.3", + "@types/istanbul-reports": "3.0.0", + "@types/node": "14.14.3", + "@types/yargs": "15.0.9", + "chalk": "4.1.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "requires": { + "@types/istanbul-lib-report": "3.0.0" + } + }, + "@types/yargs": { + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", + "requires": { + "@types/yargs-parser": "15.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "4.3.0", + "supports-color": "7.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "5.0.0", + "path-exists": "4.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-resolve": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.1.tgz", + "integrity": "sha512-hiHfQH6rrcpAmw9xCQ0vD66SDuU+7ZulOuKwc4jpbmFFsz0bQG/Ib92K+9/489u5rVw0btr/ZhiHqBpmkbCvuQ==", + "requires": { + "@jest/types": "26.6.1", + "chalk": "4.1.0", + "graceful-fs": "4.2.4", + "jest-pnp-resolver": "1.2.2", + "jest-util": "26.6.1", + "read-pkg-up": "7.0.1", + "resolve": "1.18.1", + "slash": "3.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "2.3.0" + } + }, + "parse-json": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "requires": { + "@babel/code-frame": "7.10.4", + "error-ex": "1.3.2", + "json-parse-even-better-errors": "2.3.1", + "lines-and-columns": "1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" }, - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "requires": { - "lodash.sortby": "4.7.0", - "tr46": "1.0.1", - "webidl-conversions": "4.0.2" + "@types/normalize-package-data": "2.4.0", + "normalize-package-data": "2.5.0", + "parse-json": "5.1.0", + "type-fest": "0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + } } }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "requires": { - "async-limiter": "1.0.1" + "find-up": "4.1.0", + "read-pkg": "5.2.0", + "type-fest": "0.8.1" } - } - } - }, - "jest-environment-node": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", - "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", - "requires": { - "@jest/environment": "24.9.0", - "@jest/fake-timers": "24.9.0", - "@jest/types": "24.9.0", - "jest-mock": "24.9.0", - "jest-util": "24.9.0" - } - }, - "jest-get-type": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", - "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==" - }, - "jest-haste-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", - "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", - "requires": { - "@jest/types": "24.9.0", - "anymatch": "2.0.0", - "fb-watchman": "2.0.1", - "fsevents": "1.2.13", - "graceful-fs": "4.2.4", - "invariant": "2.2.4", - "jest-serializer": "24.9.0", - "jest-util": "24.9.0", - "jest-worker": "24.9.0", - "micromatch": "3.1.10", - "sane": "4.1.0", - "walker": "1.0.7" - }, - "dependencies": { - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "optional": true, + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { - "nan": "2.14.1" + "has-flag": "4.0.0" } } } }, - "jest-jasmine2": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", - "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", - "requires": { - "@babel/traverse": "7.11.5", - "@jest/environment": "24.9.0", - "@jest/test-result": "24.9.0", - "@jest/types": "24.9.0", - "chalk": "2.4.2", - "co": "4.6.0", - "expect": "24.9.0", - "is-generator-fn": "2.1.0", - "jest-each": "24.9.0", - "jest-matcher-utils": "24.9.0", - "jest-message-util": "24.9.0", - "jest-runtime": "24.9.0", - "jest-snapshot": "24.9.0", - "jest-util": "24.9.0", - "pretty-format": "24.9.0", - "throat": "4.1.0" - } - }, - "jest-leak-detector": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", - "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", - "requires": { - "jest-get-type": "24.9.0", - "pretty-format": "24.9.0" - } - }, - "jest-matcher-utils": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", - "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", - "requires": { - "chalk": "2.4.2", - "jest-diff": "24.9.0", - "jest-get-type": "24.9.0", - "pretty-format": "24.9.0" - } - }, - "jest-message-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", - "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", - "requires": { - "@babel/code-frame": "7.10.4", - "@jest/test-result": "24.9.0", - "@jest/types": "24.9.0", - "@types/stack-utils": "1.0.1", - "chalk": "2.4.2", - "micromatch": "3.1.10", - "slash": "2.0.0", - "stack-utils": "1.0.2" - } - }, - "jest-mock": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", - "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", - "requires": { - "@jest/types": "24.9.0" - } - }, - "jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==" - }, - "jest-regex-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", - "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==" - }, - "jest-resolve": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", - "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", - "requires": { - "@jest/types": "24.9.0", - "browser-resolve": "1.11.3", - "chalk": "2.4.2", - "jest-pnp-resolver": "1.2.2", - "realpath-native": "1.1.0" - } - }, - "jest-resolve-dependencies": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", - "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", - "requires": { - "@jest/types": "24.9.0", - "jest-regex-util": "24.9.0", - "jest-snapshot": "24.9.0" - } - }, - "jest-runner": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", - "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", - "requires": { - "@jest/console": "24.9.0", - "@jest/environment": "24.9.0", - "@jest/test-result": "24.9.0", - "@jest/types": "24.9.0", - "chalk": "2.4.2", - "exit": "0.1.2", - "graceful-fs": "4.2.4", - "jest-config": "24.9.0", - "jest-docblock": "24.9.0", - "jest-haste-map": "24.9.0", - "jest-jasmine2": "24.9.0", - "jest-leak-detector": "24.9.0", - "jest-message-util": "24.9.0", - "jest-resolve": "24.9.0", - "jest-runtime": "24.9.0", - "jest-util": "24.9.0", - "jest-worker": "24.9.0", - "source-map-support": "0.5.19", - "throat": "4.1.0" - } - }, "jest-runtime": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", - "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", - "requires": { - "@jest/console": "24.9.0", - "@jest/environment": "24.9.0", - "@jest/source-map": "24.9.0", - "@jest/transform": "24.9.0", - "@jest/types": "24.9.0", - "@types/yargs": "13.0.10", - "chalk": "2.4.2", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.1.tgz", + "integrity": "sha512-7uOCNeezXDWgjEyzYbRN2ViY7xNZzusNVGAMmU0UHRUNXuY4j4GBHKGMqPo/cBPZA9bSYp+lwK2DRRBU5Dv6YQ==", + "requires": { + "@jest/console": "26.6.1", + "@jest/environment": "26.6.1", + "@jest/fake-timers": "26.6.1", + "@jest/globals": "26.6.1", + "@jest/source-map": "26.5.0", + "@jest/test-result": "26.6.1", + "@jest/transform": "26.6.1", + "@jest/types": "26.6.1", + "@types/yargs": "15.0.9", + "chalk": "4.1.0", + "cjs-module-lexer": "0.4.3", + "collect-v8-coverage": "1.0.1", "exit": "0.1.2", "glob": "7.1.6", "graceful-fs": "4.2.4", - "jest-config": "24.9.0", - "jest-haste-map": "24.9.0", - "jest-message-util": "24.9.0", - "jest-mock": "24.9.0", - "jest-regex-util": "24.9.0", - "jest-resolve": "24.9.0", - "jest-snapshot": "24.9.0", - "jest-util": "24.9.0", - "jest-validate": "24.9.0", - "realpath-native": "1.1.0", - "slash": "2.0.0", - "strip-bom": "3.0.0", - "yargs": "13.3.2" + "jest-config": "26.6.1", + "jest-haste-map": "26.6.1", + "jest-message-util": "26.6.1", + "jest-mock": "26.6.1", + "jest-regex-util": "26.0.0", + "jest-resolve": "26.6.1", + "jest-snapshot": "26.6.1", + "jest-util": "26.6.1", + "jest-validate": "26.6.1", + "slash": "3.0.0", + "strip-bom": "4.0.0", + "yargs": "15.4.1" }, "dependencies": { + "@jest/types": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.1.tgz", + "integrity": "sha512-ywHavIKNpAVrStiRY5wiyehvcktpijpItvGiK72RAn5ctqmzvPk8OvKnvHeBqa1XdQr959CTWAJMqxI8BTibyg==", + "requires": { + "@types/istanbul-lib-coverage": "2.0.3", + "@types/istanbul-reports": "3.0.0", + "@types/node": "14.14.3", + "@types/yargs": "15.0.9", + "chalk": "4.1.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "requires": { + "@types/istanbul-lib-report": "3.0.0" + } + }, + "@types/yargs": { + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", + "requires": { + "@types/yargs-parser": "15.0.0" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "2.0.1" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "4.3.0", + "supports-color": "7.2.0" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "requires": { + "string-width": "4.2.0", + "strip-ansi": "6.0.0", + "wrap-ansi": "6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "5.0.0", + "path-exists": "4.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "jest-resolve": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.1.tgz", + "integrity": "sha512-hiHfQH6rrcpAmw9xCQ0vD66SDuU+7ZulOuKwc4jpbmFFsz0bQG/Ib92K+9/489u5rVw0btr/ZhiHqBpmkbCvuQ==", + "requires": { + "@jest/types": "26.6.1", + "chalk": "4.1.0", + "graceful-fs": "4.2.4", + "jest-pnp-resolver": "1.2.2", + "jest-util": "26.6.1", + "read-pkg-up": "7.0.1", + "resolve": "1.18.1", + "slash": "3.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "2.3.0" + } + }, + "parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "requires": { + "@babel/code-frame": "7.10.4", + "error-ex": "1.3.2", + "json-parse-even-better-errors": "2.3.1", + "lines-and-columns": "1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "requires": { + "@types/normalize-package-data": "2.4.0", + "normalize-package-data": "2.5.0", + "parse-json": "5.1.0", + "type-fest": "0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "requires": { + "find-up": "4.1.0", + "read-pkg": "5.2.0", + "type-fest": "0.8.1" + } + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "requires": { + "emoji-regex": "8.0.0", + "is-fullwidth-code-point": "3.0.0", + "strip-ansi": "6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "5.0.0" + } + }, "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "4.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "requires": { + "ansi-styles": "4.3.0", + "string-width": "4.2.0", + "strip-ansi": "6.0.0" + } + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "requires": { + "cliui": "6.0.0", + "decamelize": "1.2.0", + "find-up": "4.1.0", + "get-caller-file": "2.0.5", + "require-directory": "2.1.1", + "require-main-filename": "2.0.0", + "set-blocking": "2.0.0", + "string-width": "4.2.0", + "which-module": "2.0.0", + "y18n": "4.0.0", + "yargs-parser": "18.1.3" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "requires": { + "camelcase": "5.3.1", + "decamelize": "1.2.0" + } } } }, "jest-serializer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", - "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==" + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.5.0.tgz", + "integrity": "sha512-+h3Gf5CDRlSLdgTv7y0vPIAoLgX/SI7T4v6hy+TEXMgYbv+ztzbg5PSN6mUXAT/hXYHvZRWm+MaObVfqkhCGxA==", + "requires": { + "@types/node": "14.14.3", + "graceful-fs": "4.2.4" + } }, "jest-snapshot": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", - "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", - "requires": { - "@babel/types": "7.11.5", - "@jest/types": "24.9.0", - "chalk": "2.4.2", - "expect": "24.9.0", - "jest-diff": "24.9.0", - "jest-get-type": "24.9.0", - "jest-matcher-utils": "24.9.0", - "jest-message-util": "24.9.0", - "jest-resolve": "24.9.0", - "mkdirp": "0.5.5", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.1.tgz", + "integrity": "sha512-JA7bZp7HRTIJYAi85pJ/OZ2eur2dqmwIToA5/6d7Mn90isGEfeF9FvuhDLLEczgKP1ihreBzrJ6Vr7zteP5JNA==", + "requires": { + "@babel/types": "7.12.1", + "@jest/types": "26.6.1", + "@types/babel__traverse": "7.0.15", + "@types/prettier": "2.1.5", + "chalk": "4.1.0", + "expect": "26.6.1", + "graceful-fs": "4.2.4", + "jest-diff": "26.6.1", + "jest-get-type": "26.3.0", + "jest-haste-map": "26.6.1", + "jest-matcher-utils": "26.6.1", + "jest-message-util": "26.6.1", + "jest-resolve": "26.6.1", "natural-compare": "1.4.0", - "pretty-format": "24.9.0", - "semver": "6.3.0" + "pretty-format": "26.6.1", + "semver": "7.3.2" }, "dependencies": { + "@jest/types": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.1.tgz", + "integrity": "sha512-ywHavIKNpAVrStiRY5wiyehvcktpijpItvGiK72RAn5ctqmzvPk8OvKnvHeBqa1XdQr959CTWAJMqxI8BTibyg==", + "requires": { + "@types/istanbul-lib-coverage": "2.0.3", + "@types/istanbul-reports": "3.0.0", + "@types/node": "14.14.3", + "@types/yargs": "15.0.9", + "chalk": "4.1.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "requires": { + "@types/istanbul-lib-report": "3.0.0" + } + }, + "@types/yargs": { + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", + "requires": { + "@types/yargs-parser": "15.0.0" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "4.3.0", + "supports-color": "7.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "diff-sequences": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.5.0.tgz", + "integrity": "sha512-ZXx86srb/iYy6jG71k++wBN9P9J05UNQ5hQHQd9MtMPvcqXPx/vKU69jfHV637D00Q2gSgPk2D+jSx3l1lDW/Q==" + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "5.0.0", + "path-exists": "4.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-diff": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.1.tgz", + "integrity": "sha512-BBNy/zin2m4kG5In126O8chOBxLLS/XMTuuM2+YhgyHk87ewPzKTuTJcqj3lOWOi03NNgrl+DkMeV/exdvG9gg==", + "requires": { + "chalk": "4.1.0", + "diff-sequences": "26.5.0", + "jest-get-type": "26.3.0", + "pretty-format": "26.6.1" + } + }, + "jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==" + }, + "jest-matcher-utils": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.1.tgz", + "integrity": "sha512-9iu3zrsYlUnl8pByhREF9rr5eYoiEb1F7ymNKg6lJr/0qD37LWS5FSW/JcoDl8UdMX2+zAzabDs7sTO+QFKjCg==", + "requires": { + "chalk": "4.1.0", + "jest-diff": "26.6.1", + "jest-get-type": "26.3.0", + "pretty-format": "26.6.1" + } + }, + "jest-resolve": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.1.tgz", + "integrity": "sha512-hiHfQH6rrcpAmw9xCQ0vD66SDuU+7ZulOuKwc4jpbmFFsz0bQG/Ib92K+9/489u5rVw0btr/ZhiHqBpmkbCvuQ==", + "requires": { + "@jest/types": "26.6.1", + "chalk": "4.1.0", + "graceful-fs": "4.2.4", + "jest-pnp-resolver": "1.2.2", + "jest-util": "26.6.1", + "read-pkg-up": "7.0.1", + "resolve": "1.18.1", + "slash": "3.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "2.3.0" + } + }, + "parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "requires": { + "@babel/code-frame": "7.10.4", + "error-ex": "1.3.2", + "json-parse-even-better-errors": "2.3.1", + "lines-and-columns": "1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "pretty-format": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.1.tgz", + "integrity": "sha512-MeqqsP5PYcRBbGMvwzsyBdmAJ4EFX7pWFyl7x4+dMVg5pE0ZDdBIvEH2ergvIO+Gvwv1wh64YuOY9y5LuyY/GA==", + "requires": { + "@jest/types": "26.6.1", + "ansi-regex": "5.0.0", + "ansi-styles": "4.3.0", + "react-is": "17.0.1" + } + }, + "react-is": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", + "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==" + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "requires": { + "@types/normalize-package-data": "2.4.0", + "normalize-package-data": "2.5.0", + "parse-json": "5.1.0", + "type-fest": "0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "requires": { + "find-up": "4.1.0", + "read-pkg": "5.2.0", + "type-fest": "0.8.1" + } + }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "4.0.0" + } } } }, "jest-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", - "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.1.tgz", + "integrity": "sha512-xCLZUqVoqhquyPLuDXmH7ogceGctbW8SMyQVjD9o+1+NPWI7t0vO08udcFLVPLgKWcvc+zotaUv/RuaR6l8HIA==", "requires": { - "@jest/console": "24.9.0", - "@jest/fake-timers": "24.9.0", - "@jest/source-map": "24.9.0", - "@jest/test-result": "24.9.0", - "@jest/types": "24.9.0", - "callsites": "3.1.0", - "chalk": "2.4.2", + "@jest/types": "26.6.1", + "@types/node": "14.14.3", + "chalk": "4.1.0", "graceful-fs": "4.2.4", "is-ci": "2.0.0", - "mkdirp": "0.5.5", - "slash": "2.0.0", - "source-map": "0.6.1" + "micromatch": "4.0.2" }, "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + "@jest/types": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.1.tgz", + "integrity": "sha512-ywHavIKNpAVrStiRY5wiyehvcktpijpItvGiK72RAn5ctqmzvPk8OvKnvHeBqa1XdQr959CTWAJMqxI8BTibyg==", + "requires": { + "@types/istanbul-lib-coverage": "2.0.3", + "@types/istanbul-reports": "3.0.0", + "@types/node": "14.14.3", + "@types/yargs": "15.0.9", + "chalk": "4.1.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "requires": { + "@types/istanbul-lib-report": "3.0.0" + } + }, + "@types/yargs": { + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", + "requires": { + "@types/yargs-parser": "15.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "4.3.0", + "supports-color": "7.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "4.0.0" + } } } }, "jest-validate": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", - "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.1.tgz", + "integrity": "sha512-BEFpGbylKocnNPZULcnk+TGaz1oFZQH/wcaXlaXABbu0zBwkOGczuWgdLucUouuQqn7VadHZZeTvo8VSFDLMOA==", "requires": { - "@jest/types": "24.9.0", - "camelcase": "5.3.1", - "chalk": "2.4.2", - "jest-get-type": "24.9.0", + "@jest/types": "26.6.1", + "camelcase": "6.1.0", + "chalk": "4.1.0", + "jest-get-type": "26.3.0", "leven": "3.1.0", - "pretty-format": "24.9.0" + "pretty-format": "26.6.1" }, "dependencies": { + "@jest/types": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.1.tgz", + "integrity": "sha512-ywHavIKNpAVrStiRY5wiyehvcktpijpItvGiK72RAn5ctqmzvPk8OvKnvHeBqa1XdQr959CTWAJMqxI8BTibyg==", + "requires": { + "@types/istanbul-lib-coverage": "2.0.3", + "@types/istanbul-reports": "3.0.0", + "@types/node": "14.14.3", + "@types/yargs": "15.0.9", + "chalk": "4.1.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "requires": { + "@types/istanbul-lib-report": "3.0.0" + } + }, + "@types/yargs": { + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", + "requires": { + "@types/yargs-parser": "15.0.0" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "2.0.1" + } + }, "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.1.0.tgz", + "integrity": "sha512-WCMml9ivU60+8rEJgELlFp1gxFcEGxwYleE3bziHEDeqsqAWGHdimB7beBFGjLzVNgPGyDsfgXLQEYMpmIFnVQ==" + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "4.3.0", + "supports-color": "7.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==" + }, + "pretty-format": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.1.tgz", + "integrity": "sha512-MeqqsP5PYcRBbGMvwzsyBdmAJ4EFX7pWFyl7x4+dMVg5pE0ZDdBIvEH2ergvIO+Gvwv1wh64YuOY9y5LuyY/GA==", + "requires": { + "@jest/types": "26.6.1", + "ansi-regex": "5.0.0", + "ansi-styles": "4.3.0", + "react-is": "17.0.1" + } + }, + "react-is": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", + "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "4.0.0" + } } } }, "jest-watch-typeahead": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.4.2.tgz", - "integrity": "sha512-f7VpLebTdaXs81rg/oj4Vg/ObZy2QtGzAmGLNsqUS5G5KtSN68tFcIsbvNODfNyQxU78g7D8x77o3bgfBTR+2Q==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.6.1.tgz", + "integrity": "sha512-ITVnHhj3Jd/QkqQcTqZfRgjfyRhDFM/auzgVo2RKvSwi18YMvh0WvXDJFoFED6c7jd/5jxtu4kSOb9PTu2cPVg==", "requires": { "ansi-escapes": "4.3.1", - "chalk": "2.4.2", - "jest-regex-util": "24.9.0", - "jest-watcher": "24.9.0", + "chalk": "4.1.0", + "jest-regex-util": "26.0.0", + "jest-watcher": "26.6.1", "slash": "3.0.0", - "string-length": "3.1.0", - "strip-ansi": "5.2.0" + "string-length": "4.0.1", + "strip-ansi": "6.0.0" }, "dependencies": { - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, - "string-length": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", - "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "astral-regex": "1.0.0", - "strip-ansi": "5.2.0" + "color-convert": "2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "4.3.0", + "supports-color": "7.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "1.1.4" } }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "requires": { - "ansi-regex": "4.1.0" + "ansi-regex": "5.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "4.0.0" } } } }, "jest-watcher": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", - "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.1.tgz", + "integrity": "sha512-0LBIPPncNi9CaLKK15bnxyd2E8OMl4kJg0PTiNOI+MXztXw1zVdtX/x9Pr6pXaQYps+eS/ts43O4+HByZ7yJSw==", "requires": { - "@jest/test-result": "24.9.0", - "@jest/types": "24.9.0", - "@types/yargs": "13.0.10", - "ansi-escapes": "3.2.0", - "chalk": "2.4.2", - "jest-util": "24.9.0", - "string-length": "2.0.0" + "@jest/test-result": "26.6.1", + "@jest/types": "26.6.1", + "@types/node": "14.14.3", + "ansi-escapes": "4.3.1", + "chalk": "4.1.0", + "jest-util": "26.6.1", + "string-length": "4.0.1" }, "dependencies": { - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" + "@jest/types": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.1.tgz", + "integrity": "sha512-ywHavIKNpAVrStiRY5wiyehvcktpijpItvGiK72RAn5ctqmzvPk8OvKnvHeBqa1XdQr959CTWAJMqxI8BTibyg==", + "requires": { + "@types/istanbul-lib-coverage": "2.0.3", + "@types/istanbul-reports": "3.0.0", + "@types/node": "14.14.3", + "@types/yargs": "15.0.9", + "chalk": "4.1.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "requires": { + "@types/istanbul-lib-report": "3.0.0" + } + }, + "@types/yargs": { + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", + "requires": { + "@types/yargs-parser": "15.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "4.3.0", + "supports-color": "7.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "4.0.0" + } } } }, "jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.1.tgz", + "integrity": "sha512-R5IE3qSGz+QynJx8y+ICEkdI2OJ3RJjRQVEyCcFAd3yVhQSEtquziPO29Mlzgn07LOVE8u8jhJ1FqcwegiXWOw==", "requires": { + "@types/node": "14.14.3", "merge-stream": "2.0.0", - "supports-color": "6.1.0" + "supports-color": "7.2.0" }, "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { - "has-flag": "3.0.0" + "has-flag": "4.0.0" } } } @@ -7988,42 +12194,47 @@ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, "jsdom": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", - "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", - "requires": { - "abab": "2.0.4", - "acorn": "5.7.4", - "acorn-globals": "4.3.4", - "array-equal": "1.0.0", - "cssom": "0.3.8", - "cssstyle": "1.4.0", - "data-urls": "1.1.0", - "domexception": "1.0.1", + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz", + "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==", + "requires": { + "abab": "2.0.5", + "acorn": "7.4.1", + "acorn-globals": "6.0.0", + "cssom": "0.4.4", + "cssstyle": "2.3.0", + "data-urls": "2.0.0", + "decimal.js": "10.2.1", + "domexception": "2.0.1", "escodegen": "1.14.3", - "html-encoding-sniffer": "1.0.2", - "left-pad": "1.3.0", + "html-encoding-sniffer": "2.0.1", + "is-potential-custom-element-name": "1.0.0", "nwsapi": "2.2.0", - "parse5": "4.0.0", - "pn": "1.1.0", + "parse5": "5.1.1", "request": "2.88.2", "request-promise-native": "1.0.9", - "sax": "1.2.4", + "saxes": "5.0.1", "symbol-tree": "3.2.4", - "tough-cookie": "2.5.0", + "tough-cookie": "3.0.1", "w3c-hr-time": "1.0.2", - "webidl-conversions": "4.0.2", + "w3c-xmlserializer": "2.0.0", + "webidl-conversions": "6.1.0", "whatwg-encoding": "1.0.5", "whatwg-mimetype": "2.3.0", - "whatwg-url": "6.5.0", - "ws": "5.2.2", + "whatwg-url": "8.4.0", + "ws": "7.3.1", "xml-name-validator": "3.0.0" }, "dependencies": { - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==" + "tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "requires": { + "ip-regex": "2.1.0", + "psl": "1.8.0", + "punycode": "2.1.1" + } } } }, @@ -8052,14 +12263,6 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "requires": { - "jsonify": "0.0.0" - } - }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", @@ -8084,18 +12287,14 @@ } }, "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", + "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", "requires": { - "graceful-fs": "4.2.4" + "graceful-fs": "4.2.4", + "universalify": "1.0.0" } }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" - }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -8108,12 +12307,12 @@ } }, "jsx-ast-utils": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz", - "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.1.0.tgz", + "integrity": "sha512-d4/UOjg+mxAWxCiF0c5UTSwyqbchkbqCvK87aBovhnh8GtysTjWmgC63tY0cJx/HzGgm9qnA147jVBdpOiQ2RA==", "requires": { "array-includes": "3.1.1", - "object.assign": "4.1.0" + "object.assign": "4.1.1" } }, "killable": { @@ -8134,6 +12333,19 @@ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" }, + "language-subtag-registry": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.20.tgz", + "integrity": "sha512-KPMwROklF4tEx283Xw0pNKtfTj1gZ4UByp4EsIFWLgBavJltF4TiYPc39k06zSTsLzxTVXXDSpbwaQXaFB4Qeg==" + }, + "language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", + "requires": { + "language-subtag-registry": "0.3.20" + } + }, "last-call-webpack-plugin": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", @@ -8145,42 +12357,40 @@ }, "lazy-cache": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "requires": { - "invert-kv": "2.0.0" - } - }, - "left-pad": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", - "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==" + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" }, "leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" }, - "levenary": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", - "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "requires": { - "leven": "3.1.0" + "prelude-ls": "1.2.1", + "type-check": "0.4.0" } }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "line-column": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/line-column/-/line-column-1.0.2.tgz", + "integrity": "sha1-0lryk2tvSEkXKzEuR5LR2Ye8NKI=", "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" + "isarray": "1.0.0", + "isobject": "2.1.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } } }, "lines-and-columns": { @@ -8200,58 +12410,19 @@ "strip-bom": "2.0.0" } }, - "loader-fs-cache": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz", - "integrity": "sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA==", - "requires": { - "find-cache-dir": "0.1.1", - "mkdirp": "0.5.5" - }, - "dependencies": { - "find-cache-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", - "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", - "requires": { - "commondir": "1.0.1", - "mkdirp": "0.5.5", - "pkg-dir": "1.0.0" - } - }, - "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "requires": { - "find-up": "1.1.2" - } - } - } - }, "loader-runner": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" }, "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", "requires": { "big.js": "5.2.2", "emojis-list": "3.0.0", - "json5": "1.0.1" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "1.2.5" - } - } + "json5": "2.1.3" } }, "locate-path": { @@ -8345,7 +12516,7 @@ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==", "requires": { - "tslib": "1.13.0" + "tslib": "1.14.1" } }, "lru-cache": { @@ -8357,6 +12528,14 @@ "yallist": "2.1.2" } }, + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "requires": { + "sourcemap-codec": "1.4.8" + } + }, "make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", @@ -8370,11 +12549,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -8386,19 +12560,6 @@ "tmpl": "1.0.4" } }, - "mamacro": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", - "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==" - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "requires": { - "p-defer": "1.0.0" - } - }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -8437,16 +12598,6 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "requires": { - "map-age-cleaner": "0.1.3", - "mimic-fn": "2.1.0", - "p-is-promise": "2.1.0" - } - }, "memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", @@ -8536,30 +12687,12 @@ "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==" }, "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.3", - "nanomatch": "1.2.13", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - } + "braces": "3.0.2", + "picomatch": "2.2.2" } }, "miller-rabin": { @@ -8579,9 +12712,9 @@ } }, "mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "mime-db": { "version": "1.44.0", @@ -8607,9 +12740,9 @@ "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==" }, "mini-css-extract-plugin": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", - "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.11.3.tgz", + "integrity": "sha512-n9BA8LonkOkW1/zn+IbLPQmovsL0wMb9yx75fMJQZf2X1Zoec9yTZtyMePcyu19wPkmFbzZZA6fLTotpFhQsOA==", "requires": { "loader-utils": "1.4.0", "normalize-url": "1.9.1", @@ -8617,12 +12750,30 @@ "webpack-sources": "1.4.3" }, "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "1.2.5" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "5.2.2", + "emojis-list": "3.0.0", + "json5": "1.0.1" + } + }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "requires": { - "ajv": "6.12.4", + "ajv": "6.12.6", "ajv-errors": "1.0.1", "ajv-keywords": "3.5.2" } @@ -8691,6 +12842,22 @@ "minipass": "3.1.3" } }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "3.1.3", + "yallist": "4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, "mississippi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", @@ -8789,9 +12956,14 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" }, "nan": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", - "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==" + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==" + }, + "nanoid": { + "version": "3.1.16", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.16.tgz", + "integrity": "sha512-+AK8MN0WHji40lj8AEuwLOvLSbWYApQpre/aFJZD71r43wVRLrOYS4FmJOPQYon1TqB462RzrrxlfA74XRES8w==" }, "nanomatch": { "version": "1.2.13", @@ -8818,6 +12990,14 @@ } } }, + "native-url": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/native-url/-/native-url-0.2.6.tgz", + "integrity": "sha512-k4bDC87WtgrdD362gZz6zoiXQrl40kYlBmpfmSjwRO1VU0V5ccwJTlxuE72F6m3V0vc1xOf6n3UCP9QyerRqmA==", + "requires": { + "querystring": "0.2.0" + } + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -8849,13 +13029,13 @@ "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==", "requires": { "lower-case": "2.0.1", - "tslib": "1.13.0" + "tslib": "1.14.1" } }, "node-forge": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", - "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==" + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" }, "node-gyp": { "version": "3.8.0", @@ -8893,7 +13073,7 @@ "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", "requires": { - "assert": "1.4.1", + "assert": "1.5.0", "browserify-zlib": "0.2.0", "buffer": "4.9.2", "console-browserify": "1.2.0", @@ -8918,23 +13098,10 @@ "vm-browserify": "1.1.2" }, "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "requires": { - "inherits": "2.0.3" - } } } }, @@ -8944,28 +13111,46 @@ "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=" }, "node-notifier": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", - "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.0.tgz", + "integrity": "sha512-46z7DUmcjoYdaWyXouuFNNfUo6eFa94t23c53c+lG/9Cvauk4a98rAUp9672X5dxGdQmLpPzTxzu8f/OeEPaFA==", + "optional": true, "requires": { "growly": "1.3.0", - "is-wsl": "1.1.0", - "semver": "5.7.1", + "is-wsl": "2.2.0", + "semver": "7.3.2", "shellwords": "0.1.1", - "which": "1.3.1" + "uuid": "8.3.1", + "which": "2.0.2" }, "dependencies": { "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "optional": true + }, + "uuid": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz", + "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==", + "optional": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "optional": true, + "requires": { + "isexe": "2.0.0" + } } } }, "node-releases": { - "version": "1.1.60", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.60.tgz", - "integrity": "sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==" + "version": "1.1.64", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.64.tgz", + "integrity": "sha512-Iec8O9166/x2HRMJyLLLWkd0sFFLrFNy+Xf+JQfSQsdBJzPcHpNl3JQ9gD4j+aJxmCa25jNsIbM4bmACtSbkSg==" }, "node-sass": { "version": "4.14.1", @@ -8982,7 +13167,7 @@ "lodash": "4.17.20", "meow": "3.7.0", "mkdirp": "0.5.5", - "nan": "2.14.1", + "nan": "2.14.2", "node-gyp": "3.8.0", "npmlog": "4.1.2", "request": "2.88.2", @@ -9029,25 +13214,15 @@ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "requires": { "hosted-git-info": "2.8.8", - "resolve": "1.17.0", + "resolve": "1.18.1", "semver": "5.7.1", "validate-npm-package-license": "3.0.4" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } } }, "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "1.1.0" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "normalize-range": { "version": "0.1.2", @@ -9137,23 +13312,18 @@ } } }, - "object-hash": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.3.tgz", - "integrity": "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==" - }, "object-inspect": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==" }, "object-is": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", - "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.3.tgz", + "integrity": "sha512-teyqLvFWzLkq5B9ki8FVWA902UER2qkxmdA4nLf+wjOLAWgxzCWZNCxpDq9MvE8MmhWNr+I8w3BN49Vx36Y6Xg==", "requires": { "define-properties": "1.1.3", - "es-abstract": "1.17.6" + "es-abstract": "1.18.0-next.1" } }, "object-keys": { @@ -9161,11 +13331,6 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, - "object-path": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz", - "integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk=" - }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -9175,12 +13340,12 @@ } }, "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", + "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", "requires": { "define-properties": "1.1.3", - "function-bind": "1.1.1", + "es-abstract": "1.18.0-next.1", "has-symbols": "1.0.1", "object-keys": "1.1.1" } @@ -9191,8 +13356,28 @@ "integrity": "sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==", "requires": { "define-properties": "1.1.3", - "es-abstract": "1.17.6", + "es-abstract": "1.17.7", "has": "1.0.3" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "requires": { + "es-to-primitive": "1.2.1", + "function-bind": "1.1.1", + "has": "1.0.3", + "has-symbols": "1.0.1", + "is-callable": "1.2.2", + "is-regex": "1.1.1", + "object-inspect": "1.8.0", + "object-keys": "1.1.1", + "object.assign": "4.1.1", + "string.prototype.trimend": "1.0.2", + "string.prototype.trimstart": "1.0.2" + } + } } }, "object.fromentries": { @@ -9201,9 +13386,29 @@ "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==", "requires": { "define-properties": "1.1.3", - "es-abstract": "1.17.6", + "es-abstract": "1.17.7", "function-bind": "1.1.1", "has": "1.0.3" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "requires": { + "es-to-primitive": "1.2.1", + "function-bind": "1.1.1", + "has": "1.0.3", + "has-symbols": "1.0.1", + "is-callable": "1.2.2", + "is-regex": "1.1.1", + "object-inspect": "1.8.0", + "object-keys": "1.1.1", + "object.assign": "4.1.1", + "string.prototype.trimend": "1.0.2", + "string.prototype.trimstart": "1.0.2" + } + } } }, "object.getownpropertydescriptors": { @@ -9212,7 +13417,27 @@ "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", "requires": { "define-properties": "1.1.3", - "es-abstract": "1.17.6" + "es-abstract": "1.17.7" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "requires": { + "es-to-primitive": "1.2.1", + "function-bind": "1.1.1", + "has": "1.0.3", + "has-symbols": "1.0.1", + "is-callable": "1.2.2", + "is-regex": "1.1.1", + "object-inspect": "1.8.0", + "object-keys": "1.1.1", + "object.assign": "4.1.1", + "string.prototype.trimend": "1.0.2", + "string.prototype.trimstart": "1.0.2" + } + } } }, "object.pick": { @@ -9229,9 +13454,29 @@ "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", "requires": { "define-properties": "1.1.3", - "es-abstract": "1.17.6", + "es-abstract": "1.17.7", "function-bind": "1.1.1", "has": "1.0.3" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "requires": { + "es-to-primitive": "1.2.1", + "function-bind": "1.1.1", + "has": "1.0.3", + "has-symbols": "1.0.1", + "is-callable": "1.2.2", + "is-regex": "1.1.1", + "object-inspect": "1.8.0", + "object-keys": "1.1.1", + "object.assign": "4.1.1", + "string.prototype.trimend": "1.0.2", + "string.prototype.trimstart": "1.0.2" + } + } } }, "obuf": { @@ -9269,22 +13514,12 @@ } }, "open": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/open/-/open-7.2.1.tgz", - "integrity": "sha512-xbYCJib4spUdmcs0g/2mK1nKo/jO2T7INClWd/beL7PFkXRWgr8B23ssDHX/USPn2M2IjDR5UdpYs6I67SnTSA==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/open/-/open-7.3.0.tgz", + "integrity": "sha512-mgLwQIx2F/ye9SmbrUkurZCnkoXyXyu9EbHtJZrICjVAJfyMArdHp3KkixGdZx1ZHFPNIwl0DDM1dFFqXbTLZw==", "requires": { "is-docker": "2.1.1", "is-wsl": "2.2.0" - }, - "dependencies": { - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "requires": { - "is-docker": "2.1.1" - } - } } }, "opn": { @@ -9293,27 +13528,34 @@ "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", "requires": { "is-wsl": "1.1.0" + }, + "dependencies": { + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + } } }, "optimize-css-assets-webpack-plugin": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz", - "integrity": "sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz", + "integrity": "sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A==", "requires": { "cssnano": "4.1.10", "last-call-webpack-plugin": "3.0.0" } }, "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "requires": { "deep-is": "0.1.3", "fast-levenshtein": "2.0.6", - "levn": "0.3.0", - "prelude-ls": "1.1.2", - "type-check": "0.3.2", + "levn": "0.4.1", + "prelude-ls": "1.2.1", + "type-check": "0.4.0", "word-wrap": "1.2.3" } }, @@ -9335,16 +13577,6 @@ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "requires": { - "execa": "1.0.0", - "lcid": "2.0.0", - "mem": "4.3.0" - } - }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -9359,29 +13591,16 @@ "os-tmpdir": "1.0.2" } }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" - }, "p-each-series": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", - "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", - "requires": { - "p-reduce": "1.0.0" - } + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", + "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==" }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" - }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -9399,18 +13618,13 @@ } }, "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "requires": { "aggregate-error": "3.1.0" } }, - "p-reduce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", - "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=" - }, "p-retry": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", @@ -9445,7 +13659,7 @@ "integrity": "sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA==", "requires": { "dot-case": "3.0.3", - "tslib": "1.13.0" + "tslib": "1.14.1" } }, "parent-module": { @@ -9454,13 +13668,6 @@ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "requires": { "callsites": "3.1.0" - }, - "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - } } }, "parse-asn1": { @@ -9490,9 +13697,9 @@ "dev": true }, "parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==" + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" }, "parseurl": { "version": "1.3.3", @@ -9505,7 +13712,7 @@ "integrity": "sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==", "requires": { "no-case": "3.0.3", - "tslib": "1.13.0" + "tslib": "1.14.1" } }, "pascalcase": { @@ -9650,17 +13857,12 @@ } } }, - "pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" - }, "pnp-webpack-plugin": { "version": "1.6.4", "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==", "requires": { - "ts-pnp": "1.1.6" + "ts-pnp": "1.2.0" } }, "popper.js": { @@ -9694,9 +13896,9 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" }, "postcss": { - "version": "7.0.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", - "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "requires": { "chalk": "2.4.2", "source-map": "0.6.1", @@ -9718,8 +13920,8 @@ "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", "requires": { - "postcss": "7.0.32", - "postcss-selector-parser": "6.0.2" + "postcss": "7.0.35", + "postcss-selector-parser": "6.0.4" } }, "postcss-browser-comments": { @@ -9727,16 +13929,16 @@ "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz", "integrity": "sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig==", "requires": { - "postcss": "7.0.32" + "postcss": "7.0.35" } }, "postcss-calc": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.4.tgz", - "integrity": "sha512-0I79VRAd1UTkaHzY9w83P39YGO/M3bG7/tNLrHGEunBolfoGM0hSjrGvjoeaj0JE/zIw5GsI2KZ0UwDJqv5hjw==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", "requires": { - "postcss": "7.0.32", - "postcss-selector-parser": "6.0.2", + "postcss": "7.0.35", + "postcss-selector-parser": "6.0.4", "postcss-value-parser": "4.1.0" } }, @@ -9745,7 +13947,7 @@ "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", "requires": { - "postcss": "7.0.32", + "postcss": "7.0.35", "postcss-values-parser": "2.0.1" } }, @@ -9755,7 +13957,7 @@ "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", "requires": { "@csstools/convert-colors": "1.4.0", - "postcss": "7.0.32", + "postcss": "7.0.35", "postcss-values-parser": "2.0.1" } }, @@ -9764,7 +13966,7 @@ "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", "requires": { - "postcss": "7.0.32", + "postcss": "7.0.35", "postcss-values-parser": "2.0.1" } }, @@ -9774,7 +13976,7 @@ "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", "requires": { "@csstools/convert-colors": "1.4.0", - "postcss": "7.0.32", + "postcss": "7.0.35", "postcss-values-parser": "2.0.1" } }, @@ -9783,7 +13985,7 @@ "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", "requires": { - "postcss": "7.0.32", + "postcss": "7.0.35", "postcss-values-parser": "2.0.1" } }, @@ -9792,10 +13994,10 @@ "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", "requires": { - "browserslist": "4.14.1", - "color": "3.1.2", + "browserslist": "4.14.5", + "color": "3.1.3", "has": "1.0.3", - "postcss": "7.0.32", + "postcss": "7.0.35", "postcss-value-parser": "3.3.1" }, "dependencies": { @@ -9811,7 +14013,7 @@ "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", "requires": { - "postcss": "7.0.32", + "postcss": "7.0.35", "postcss-value-parser": "3.3.1" }, "dependencies": { @@ -9827,7 +14029,7 @@ "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", "requires": { - "postcss": "7.0.32" + "postcss": "7.0.35" } }, "postcss-custom-properties": { @@ -9835,7 +14037,7 @@ "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", "requires": { - "postcss": "7.0.32", + "postcss": "7.0.35", "postcss-values-parser": "2.0.1" } }, @@ -9844,7 +14046,7 @@ "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", "requires": { - "postcss": "7.0.32", + "postcss": "7.0.35", "postcss-selector-parser": "5.0.0" }, "dependencies": { @@ -9870,7 +14072,7 @@ "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", "requires": { - "postcss": "7.0.32", + "postcss": "7.0.35", "postcss-selector-parser": "5.0.0" }, "dependencies": { @@ -9896,7 +14098,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", "requires": { - "postcss": "7.0.32" + "postcss": "7.0.35" } }, "postcss-discard-duplicates": { @@ -9904,7 +14106,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", "requires": { - "postcss": "7.0.32" + "postcss": "7.0.35" } }, "postcss-discard-empty": { @@ -9912,7 +14114,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", "requires": { - "postcss": "7.0.32" + "postcss": "7.0.35" } }, "postcss-discard-overridden": { @@ -9920,7 +14122,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", "requires": { - "postcss": "7.0.32" + "postcss": "7.0.35" } }, "postcss-double-position-gradients": { @@ -9928,7 +14130,7 @@ "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", "requires": { - "postcss": "7.0.32", + "postcss": "7.0.35", "postcss-values-parser": "2.0.1" } }, @@ -9937,16 +14139,16 @@ "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", "requires": { - "postcss": "7.0.32", + "postcss": "7.0.35", "postcss-values-parser": "2.0.1" } }, "postcss-flexbugs-fixes": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.1.0.tgz", - "integrity": "sha512-jr1LHxQvStNNAHlgco6PzY308zvLklh7SJVYuWUwyUQncofaAlD2l+P/gxKHOdqWKe7xJSkVLFF/2Tp+JqMSZA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz", + "integrity": "sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ==", "requires": { - "postcss": "7.0.32" + "postcss": "7.0.35" } }, "postcss-focus-visible": { @@ -9954,7 +14156,7 @@ "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", "requires": { - "postcss": "7.0.32" + "postcss": "7.0.35" } }, "postcss-focus-within": { @@ -9962,7 +14164,7 @@ "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", "requires": { - "postcss": "7.0.32" + "postcss": "7.0.35" } }, "postcss-font-variant": { @@ -9970,7 +14172,7 @@ "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz", "integrity": "sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg==", "requires": { - "postcss": "7.0.32" + "postcss": "7.0.35" } }, "postcss-gap-properties": { @@ -9978,7 +14180,7 @@ "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", "requires": { - "postcss": "7.0.32" + "postcss": "7.0.35" } }, "postcss-image-set-function": { @@ -9986,7 +14188,7 @@ "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", "requires": { - "postcss": "7.0.32", + "postcss": "7.0.35", "postcss-values-parser": "2.0.1" } }, @@ -9996,7 +14198,7 @@ "integrity": "sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA==", "requires": { "lodash.template": "4.5.0", - "postcss": "7.0.32" + "postcss": "7.0.35" } }, "postcss-lab-function": { @@ -10005,17 +14207,53 @@ "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", "requires": { "@csstools/convert-colors": "1.4.0", - "postcss": "7.0.32", + "postcss": "7.0.35", "postcss-values-parser": "2.0.1" } }, "postcss-load-config": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", - "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", "requires": { "cosmiconfig": "5.2.1", "import-cwd": "2.1.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "requires": { + "import-fresh": "2.0.0", + "is-directory": "0.3.1", + "js-yaml": "3.14.0", + "parse-json": "4.0.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "requires": { + "caller-path": "2.0.0", + "resolve-from": "3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "1.3.2", + "json-parse-better-errors": "1.0.2" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + } } }, "postcss-loader": { @@ -10024,17 +14262,35 @@ "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", "requires": { "loader-utils": "1.4.0", - "postcss": "7.0.32", - "postcss-load-config": "2.1.0", + "postcss": "7.0.35", + "postcss-load-config": "2.1.2", "schema-utils": "1.0.0" }, "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "1.2.5" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "5.2.2", + "emojis-list": "3.0.0", + "json5": "1.0.1" + } + }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "requires": { - "ajv": "6.12.4", + "ajv": "6.12.6", "ajv-errors": "1.0.1", "ajv-keywords": "3.5.2" } @@ -10046,7 +14302,7 @@ "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", "requires": { - "postcss": "7.0.32" + "postcss": "7.0.35" } }, "postcss-media-minmax": { @@ -10054,7 +14310,7 @@ "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", "requires": { - "postcss": "7.0.32" + "postcss": "7.0.35" } }, "postcss-merge-longhand": { @@ -10063,7 +14319,7 @@ "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", "requires": { "css-color-names": "0.0.4", - "postcss": "7.0.32", + "postcss": "7.0.35", "postcss-value-parser": "3.3.1", "stylehacks": "4.0.3" }, @@ -10080,10 +14336,10 @@ "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", "requires": { - "browserslist": "4.14.1", + "browserslist": "4.14.5", "caniuse-api": "3.0.0", "cssnano-util-same-parent": "4.0.1", - "postcss": "7.0.32", + "postcss": "7.0.35", "postcss-selector-parser": "3.1.2", "vendors": "1.0.4" }, @@ -10105,7 +14361,7 @@ "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", "requires": { - "postcss": "7.0.32", + "postcss": "7.0.35", "postcss-value-parser": "3.3.1" }, "dependencies": { @@ -10123,7 +14379,7 @@ "requires": { "cssnano-util-get-arguments": "4.0.0", "is-color-stop": "1.1.0", - "postcss": "7.0.32", + "postcss": "7.0.35", "postcss-value-parser": "3.3.1" }, "dependencies": { @@ -10140,9 +14396,9 @@ "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", "requires": { "alphanum-sort": "1.0.2", - "browserslist": "4.14.1", + "browserslist": "4.14.5", "cssnano-util-get-arguments": "4.0.0", - "postcss": "7.0.32", + "postcss": "7.0.35", "postcss-value-parser": "3.3.1", "uniqs": "2.0.0" }, @@ -10161,7 +14417,7 @@ "requires": { "alphanum-sort": "1.0.2", "has": "1.0.3", - "postcss": "7.0.32", + "postcss": "7.0.35", "postcss-selector-parser": "3.1.2" }, "dependencies": { @@ -10182,7 +14438,7 @@ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", "requires": { - "postcss": "7.0.32" + "postcss": "7.0.35" } }, "postcss-modules-local-by-default": { @@ -10191,8 +14447,8 @@ "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", "requires": { "icss-utils": "4.1.1", - "postcss": "7.0.32", - "postcss-selector-parser": "6.0.2", + "postcss": "7.0.35", + "postcss-selector-parser": "6.0.4", "postcss-value-parser": "4.1.0" } }, @@ -10201,8 +14457,8 @@ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", "requires": { - "postcss": "7.0.32", - "postcss-selector-parser": "6.0.2" + "postcss": "7.0.35", + "postcss-selector-parser": "6.0.4" } }, "postcss-modules-values": { @@ -10211,7 +14467,7 @@ "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", "requires": { "icss-utils": "4.1.1", - "postcss": "7.0.32" + "postcss": "7.0.35" } }, "postcss-nesting": { @@ -10219,7 +14475,7 @@ "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", "requires": { - "postcss": "7.0.32" + "postcss": "7.0.35" } }, "postcss-normalize": { @@ -10228,8 +14484,8 @@ "integrity": "sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ==", "requires": { "@csstools/normalize.css": "10.1.0", - "browserslist": "4.14.1", - "postcss": "7.0.32", + "browserslist": "4.14.5", + "postcss": "7.0.35", "postcss-browser-comments": "3.0.0", "sanitize.css": "10.0.0" } @@ -10239,7 +14495,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", "requires": { - "postcss": "7.0.32" + "postcss": "7.0.35" } }, "postcss-normalize-display-values": { @@ -10248,7 +14504,7 @@ "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", "requires": { "cssnano-util-get-match": "4.0.0", - "postcss": "7.0.32", + "postcss": "7.0.35", "postcss-value-parser": "3.3.1" }, "dependencies": { @@ -10266,7 +14522,7 @@ "requires": { "cssnano-util-get-arguments": "4.0.0", "has": "1.0.3", - "postcss": "7.0.32", + "postcss": "7.0.35", "postcss-value-parser": "3.3.1" }, "dependencies": { @@ -10284,7 +14540,7 @@ "requires": { "cssnano-util-get-arguments": "4.0.0", "cssnano-util-get-match": "4.0.0", - "postcss": "7.0.32", + "postcss": "7.0.35", "postcss-value-parser": "3.3.1" }, "dependencies": { @@ -10301,7 +14557,7 @@ "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", "requires": { "has": "1.0.3", - "postcss": "7.0.32", + "postcss": "7.0.35", "postcss-value-parser": "3.3.1" }, "dependencies": { @@ -10318,7 +14574,7 @@ "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", "requires": { "cssnano-util-get-match": "4.0.0", - "postcss": "7.0.32", + "postcss": "7.0.35", "postcss-value-parser": "3.3.1" }, "dependencies": { @@ -10334,8 +14590,8 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", "requires": { - "browserslist": "4.14.1", - "postcss": "7.0.32", + "browserslist": "4.14.5", + "postcss": "7.0.35", "postcss-value-parser": "3.3.1" }, "dependencies": { @@ -10353,7 +14609,7 @@ "requires": { "is-absolute-url": "2.1.0", "normalize-url": "3.3.0", - "postcss": "7.0.32", + "postcss": "7.0.35", "postcss-value-parser": "3.3.1" }, "dependencies": { @@ -10374,7 +14630,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", "requires": { - "postcss": "7.0.32", + "postcss": "7.0.35", "postcss-value-parser": "3.3.1" }, "dependencies": { @@ -10391,7 +14647,7 @@ "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", "requires": { "cssnano-util-get-arguments": "4.0.0", - "postcss": "7.0.32", + "postcss": "7.0.35", "postcss-value-parser": "3.3.1" }, "dependencies": { @@ -10407,7 +14663,7 @@ "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", "requires": { - "postcss": "7.0.32" + "postcss": "7.0.35" } }, "postcss-page-break": { @@ -10415,7 +14671,7 @@ "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", "requires": { - "postcss": "7.0.32" + "postcss": "7.0.35" } }, "postcss-place": { @@ -10423,7 +14679,7 @@ "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", "requires": { - "postcss": "7.0.32", + "postcss": "7.0.35", "postcss-values-parser": "2.0.1" } }, @@ -10433,13 +14689,13 @@ "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", "requires": { "autoprefixer": "9.8.6", - "browserslist": "4.14.1", - "caniuse-lite": "1.0.30001124", + "browserslist": "4.14.5", + "caniuse-lite": "1.0.30001151", "css-blank-pseudo": "0.1.4", "css-has-pseudo": "0.10.0", "css-prefers-color-scheme": "3.1.1", "cssdb": "4.4.0", - "postcss": "7.0.32", + "postcss": "7.0.35", "postcss-attribute-case-insensitive": "4.0.2", "postcss-color-functional-notation": "2.0.1", "postcss-color-gray": "5.0.0", @@ -10476,7 +14732,7 @@ "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", "requires": { - "postcss": "7.0.32", + "postcss": "7.0.35", "postcss-selector-parser": "5.0.0" }, "dependencies": { @@ -10502,10 +14758,10 @@ "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", "requires": { - "browserslist": "4.14.1", + "browserslist": "4.14.5", "caniuse-api": "3.0.0", "has": "1.0.3", - "postcss": "7.0.32" + "postcss": "7.0.35" } }, "postcss-reduce-transforms": { @@ -10515,7 +14771,7 @@ "requires": { "cssnano-util-get-match": "4.0.0", "has": "1.0.3", - "postcss": "7.0.32", + "postcss": "7.0.35", "postcss-value-parser": "3.3.1" }, "dependencies": { @@ -10531,15 +14787,28 @@ "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", "requires": { - "postcss": "7.0.32" + "postcss": "7.0.35" } }, "postcss-safe-parser": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz", - "integrity": "sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-5.0.2.tgz", + "integrity": "sha512-jDUfCPJbKOABhwpUKcqCVbbXiloe/QXMcbJ6Iipf3sDIihEzTqRCeMBfRaOHxhBuTYqtASrI1KJWxzztZU4qUQ==", "requires": { - "postcss": "7.0.32" + "postcss": "8.1.4" + }, + "dependencies": { + "postcss": { + "version": "8.1.4", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.1.4.tgz", + "integrity": "sha512-LfqcwgMq9LOd8pX7K2+r2HPitlIGC5p6PoZhVELlqhh2YGDVcXKpkCseqan73Hrdik6nBd2OvoDPUaP/oMj9hQ==", + "requires": { + "colorette": "1.2.1", + "line-column": "1.0.2", + "nanoid": "3.1.16", + "source-map": "0.6.1" + } + } } }, "postcss-selector-matches": { @@ -10548,7 +14817,7 @@ "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", "requires": { "balanced-match": "1.0.0", - "postcss": "7.0.32" + "postcss": "7.0.35" } }, "postcss-selector-not": { @@ -10557,17 +14826,18 @@ "integrity": "sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ==", "requires": { "balanced-match": "1.0.0", - "postcss": "7.0.32" + "postcss": "7.0.35" } }, "postcss-selector-parser": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", - "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", + "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", "requires": { "cssesc": "3.0.0", "indexes-of": "1.0.1", - "uniq": "1.0.1" + "uniq": "1.0.1", + "util-deprecate": "1.0.2" } }, "postcss-svgo": { @@ -10576,7 +14846,7 @@ "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", "requires": { "is-svg": "3.0.0", - "postcss": "7.0.32", + "postcss": "7.0.35", "postcss-value-parser": "3.3.1", "svgo": "1.3.2" }, @@ -10594,7 +14864,7 @@ "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", "requires": { "alphanum-sort": "1.0.2", - "postcss": "7.0.32", + "postcss": "7.0.35", "uniqs": "2.0.0" } }, @@ -10614,9 +14884,9 @@ } }, "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" }, "prepend-http": { "version": "1.0.4", @@ -10629,12 +14899,12 @@ "integrity": "sha512-s1Iam6Gwz3JI5Hweaz4GoCD1WUNUIyzePFy5+Js2hjwGVt2Z79wNN+ZKOZ2vB6C+Xs6njyB84Z1IthQg8d9LxA==" }, "pretty-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", - "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", "requires": { - "renderkid": "2.0.3", - "utila": "0.4.0" + "lodash": "4.17.20", + "renderkid": "2.0.4" } }, "pretty-format": { @@ -10677,9 +14947,9 @@ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" }, "prompts": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", - "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", + "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", "requires": { "kleur": "3.0.3", "sisteransi": "1.0.5" @@ -10857,9 +15127,9 @@ } }, "react": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz", - "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==", + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", + "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", "requires": { "loose-envify": "1.4.0", "object-assign": "4.1.1", @@ -10867,9 +15137,9 @@ } }, "react-app-polyfill": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-1.0.6.tgz", - "integrity": "sha512-OfBnObtnGgLGfweORmdZbyEz+3dgVePQBb3zipiaDsMHV1NpWm0rDFYIVXFV/AK+x4VIIfWHhrdMIeoTLyRr2g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-2.0.0.tgz", + "integrity": "sha512-0sF4ny9v/B7s6aoehwze9vJNWcmCemAUYBVasscVr92+UYiEqDXOxfKjXN685mDaMRNF3WdhHQs76oTODMocFA==", "requires": { "core-js": "3.6.5", "object-assign": "4.1.1", @@ -10886,96 +15156,65 @@ "dev": true, "requires": { "semver": "5.7.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } } }, "react-dev-utils": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-10.2.1.tgz", - "integrity": "sha512-XxTbgJnYZmxuPtY3y/UV0D8/65NKkmaia4rXzViknVnZeVlklSh8u6TnaEYPfAi/Gh1TP4mEOXHI6jQOPbeakQ==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-11.0.0.tgz", + "integrity": "sha512-uIZTUZXB5tbiM/0auUkLVjWhZGM7DSI304iGunyhA9m985iIDVXd9I4z6MkNa9jeLzeUJbU9A7TUNrcbXAahxw==", "requires": { - "@babel/code-frame": "7.8.3", + "@babel/code-frame": "7.10.4", "address": "1.1.2", - "browserslist": "4.10.0", + "browserslist": "4.14.2", "chalk": "2.4.2", - "cross-spawn": "7.0.1", + "cross-spawn": "7.0.3", "detect-port-alt": "1.1.6", "escape-string-regexp": "2.0.0", - "filesize": "6.0.1", + "filesize": "6.1.0", "find-up": "4.1.0", - "fork-ts-checker-webpack-plugin": "3.1.1", + "fork-ts-checker-webpack-plugin": "4.1.6", "global-modules": "2.0.0", - "globby": "8.0.2", + "globby": "11.0.1", "gzip-size": "5.1.1", - "immer": "1.10.0", - "inquirer": "7.0.4", + "immer": "7.0.9", + "inquirer": "7.3.3", "is-root": "2.1.0", - "loader-utils": "1.2.3", - "open": "7.2.1", + "loader-utils": "2.0.0", + "open": "7.3.0", "pkg-up": "3.1.0", - "react-error-overlay": "6.0.7", + "react-error-overlay": "6.0.8", "recursive-readdir": "2.2.2", "shell-quote": "1.7.2", "strip-ansi": "6.0.0", "text-table": "0.2.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "7.10.4" - } - }, "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, "browserslist": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.10.0.tgz", - "integrity": "sha512-TpfK0TDgv71dzuTsEAlQiHeWQ/tiPqgNZVdv046fvNtBZrjbv2O3TsWCDU0AWGJJKCF/KsjNdLzR9hXOsh/CfA==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.2.tgz", + "integrity": "sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==", "requires": { - "caniuse-lite": "1.0.30001124", - "electron-to-chromium": "1.3.564", - "node-releases": "1.1.60", - "pkg-up": "3.1.0" + "caniuse-lite": "1.0.30001151", + "electron-to-chromium": "1.3.583", + "escalade": "3.1.1", + "node-releases": "1.1.64" } }, - "cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" - }, "cross-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "requires": { "path-key": "3.1.1", "shebang-command": "2.0.0", "which": "2.0.2" } }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" - }, "escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", @@ -10990,64 +15229,6 @@ "path-exists": "4.0.0" } }, - "inquirer": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz", - "integrity": "sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==", - "requires": { - "ansi-escapes": "4.3.1", - "chalk": "2.4.2", - "cli-cursor": "3.1.0", - "cli-width": "2.2.1", - "external-editor": "3.1.0", - "figures": "3.2.0", - "lodash": "4.17.20", - "mute-stream": "0.0.8", - "run-async": "2.4.1", - "rxjs": "6.6.3", - "string-width": "4.2.0", - "strip-ansi": "5.2.0", - "through": "2.3.8" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "4.1.0" - } - } - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "1.2.5" - } - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "requires": { - "big.js": "5.2.2", - "emojis-list": "2.1.0", - "json5": "1.0.1" - } - }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -11087,16 +15268,6 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "requires": { - "emoji-regex": "8.0.0", - "is-fullwidth-code-point": "3.0.0", - "strip-ansi": "6.0.0" - } - }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", @@ -11116,9 +15287,9 @@ } }, "react-dom": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz", - "integrity": "sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==", + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", + "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", "requires": { "loose-envify": "1.4.0", "object-assign": "4.1.1", @@ -11127,9 +15298,9 @@ } }, "react-error-overlay": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.7.tgz", - "integrity": "sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA==" + "version": "6.0.8", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.8.tgz", + "integrity": "sha512-HvPuUQnLp5H7TouGq3kzBeioJmXms1wHy9EGjz2OURWBp4qZO6AfGEcnxts1D/CbwPLRAgTMPCEgYhA3sEM4vw==" }, "react-is": { "version": "16.13.1", @@ -11146,7 +15317,7 @@ "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-1.3.7.tgz", "integrity": "sha512-nmqYTx7QVjCm3WUZLeuOomna138R1luC4EqkW3hxJUrAe+3eNz3oFCLYdnPwILfn0mX1Ew2c3wctrjlUMYYUww==", "requires": { - "@babel/runtime": "7.11.2", + "@babel/runtime": "7.12.1", "create-react-context": "0.3.0", "deep-equal": "1.1.1", "popper.js": "1.16.1", @@ -11155,83 +15326,85 @@ "warning": "4.0.3" } }, + "react-refresh": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz", + "integrity": "sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg==" + }, "react-scripts": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.4.1.tgz", - "integrity": "sha512-JpTdi/0Sfd31mZA6Ukx+lq5j1JoKItX7qqEK4OiACjVQletM1P38g49d9/D0yTxp9FrSF+xpJFStkGgKEIRjlQ==", - "requires": { - "@babel/core": "7.9.0", - "@svgr/webpack": "4.3.3", - "@typescript-eslint/eslint-plugin": "2.34.0", - "@typescript-eslint/parser": "2.34.0", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-4.0.0.tgz", + "integrity": "sha512-icJ/ctwV5XwITUOupBP9TUVGdWOqqZ0H08tbJ1kVC5VpNWYzEZ3e/x8axhV15ZXRsixLo27snwQE7B6Zd9J2Tg==", + "requires": { + "@babel/core": "7.12.3", + "@pmmmwh/react-refresh-webpack-plugin": "0.4.2", + "@svgr/webpack": "5.4.0", + "@typescript-eslint/eslint-plugin": "4.6.0", + "@typescript-eslint/parser": "4.6.0", "babel-eslint": "10.1.0", - "babel-jest": "24.9.0", + "babel-jest": "26.6.1", "babel-loader": "8.1.0", - "babel-plugin-named-asset-import": "0.3.6", - "babel-preset-react-app": "9.1.2", - "camelcase": "5.3.1", + "babel-plugin-named-asset-import": "0.3.7", + "babel-preset-react-app": "10.0.0", + "bfj": "7.0.2", + "camelcase": "6.1.0", "case-sensitive-paths-webpack-plugin": "2.3.0", - "css-loader": "3.4.2", + "css-loader": "4.3.0", "dotenv": "8.2.0", "dotenv-expand": "5.1.0", - "eslint": "6.8.0", - "eslint-config-react-app": "5.2.1", - "eslint-loader": "3.0.3", - "eslint-plugin-flowtype": "4.6.0", - "eslint-plugin-import": "2.20.1", - "eslint-plugin-jsx-a11y": "6.2.3", - "eslint-plugin-react": "7.19.0", - "eslint-plugin-react-hooks": "1.7.0", - "file-loader": "4.3.0", - "fs-extra": "8.1.0", - "fsevents": "2.1.2", - "html-webpack-plugin": "4.0.0-beta.11", + "eslint": "7.12.0", + "eslint-config-react-app": "6.0.0", + "eslint-plugin-flowtype": "5.2.0", + "eslint-plugin-import": "2.22.1", + "eslint-plugin-jest": "24.1.0", + "eslint-plugin-jsx-a11y": "6.4.1", + "eslint-plugin-react": "7.21.5", + "eslint-plugin-react-hooks": "4.2.0", + "eslint-plugin-testing-library": "3.9.2", + "eslint-webpack-plugin": "2.1.0", + "file-loader": "6.1.1", + "fs-extra": "9.0.1", + "fsevents": "2.1.3", + "html-webpack-plugin": "4.5.0", "identity-obj-proxy": "3.0.0", - "jest": "24.9.0", - "jest-environment-jsdom-fourteen": "1.0.1", - "jest-resolve": "24.9.0", - "jest-watch-typeahead": "0.4.2", - "mini-css-extract-plugin": "0.9.0", - "optimize-css-assets-webpack-plugin": "5.0.3", + "jest": "26.6.0", + "jest-circus": "26.6.0", + "jest-resolve": "26.6.0", + "jest-watch-typeahead": "0.6.1", + "mini-css-extract-plugin": "0.11.3", + "optimize-css-assets-webpack-plugin": "5.0.4", "pnp-webpack-plugin": "1.6.4", - "postcss-flexbugs-fixes": "4.1.0", + "postcss-flexbugs-fixes": "4.2.1", "postcss-loader": "3.0.0", "postcss-normalize": "8.0.1", "postcss-preset-env": "6.7.0", - "postcss-safe-parser": "4.0.1", - "react-app-polyfill": "1.0.6", - "react-dev-utils": "10.2.1", - "resolve": "1.15.0", - "resolve-url-loader": "3.1.1", + "postcss-safe-parser": "5.0.2", + "react-app-polyfill": "2.0.0", + "react-dev-utils": "11.0.0", + "react-refresh": "0.8.3", + "resolve": "1.18.1", + "resolve-url-loader": "3.1.2", "sass-loader": "8.0.2", - "semver": "6.3.0", - "style-loader": "0.23.1", - "terser-webpack-plugin": "2.3.5", - "ts-pnp": "1.1.6", - "url-loader": "2.3.0", - "webpack": "4.42.0", - "webpack-dev-server": "3.10.3", + "semver": "7.3.2", + "style-loader": "1.3.0", + "terser-webpack-plugin": "4.2.3", + "ts-pnp": "1.2.0", + "url-loader": "4.1.1", + "webpack": "4.44.2", + "webpack-dev-server": "3.11.0", "webpack-manifest-plugin": "2.2.0", - "workbox-webpack-plugin": "4.3.1" + "workbox-webpack-plugin": "5.1.4" }, "dependencies": { "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "resolve": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", - "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", - "requires": { - "path-parse": "1.0.6" - } + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.1.0.tgz", + "integrity": "sha512-WCMml9ivU60+8rEJgELlFp1gxFcEGxwYleE3bziHEDeqsqAWGHdimB7beBFGjLzVNgPGyDsfgXLQEYMpmIFnVQ==" }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" } } }, @@ -11247,11 +15420,11 @@ } }, "reactstrap": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/reactstrap/-/reactstrap-8.5.1.tgz", - "integrity": "sha512-igpdw8DiW48ZtwGOo2unwlsILFlF7deiqFUAqc3wrsX/0H0OkvmezJdkjJx2X9jaHfjGdPpm0vu5VN/kk7tv+A==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/reactstrap/-/reactstrap-8.6.0.tgz", + "integrity": "sha512-03/UMbLPR6MhVStVUfCLuKh8xh4JOtNVkRxDB9/uHixN+cEQPOpSYa0K69YyK1/2YdZBs2qS6y0cQkK8NQKBHA==", "requires": { - "@babel/runtime": "7.11.2", + "@babel/runtime": "7.12.1", "classnames": "2.2.6", "prop-types": "15.7.2", "react-popper": "1.3.7", @@ -11292,21 +15465,14 @@ } }, "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "optional": true, "requires": { "picomatch": "2.2.2" } }, - "realpath-native": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", - "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", - "requires": { - "util.promisify": "1.0.1" - } - }, "recursive-readdir": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", @@ -11347,7 +15513,7 @@ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", "requires": { - "@babel/runtime": "7.11.2" + "@babel/runtime": "7.12.1" } }, "regex-not": { @@ -11360,9 +15526,9 @@ } }, "regex-parser": { - "version": "2.2.10", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.10.tgz", - "integrity": "sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA==" + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", + "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==" }, "regexp.prototype.flags": { "version": "1.3.0", @@ -11370,7 +15536,27 @@ "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", "requires": { "define-properties": "1.1.3", - "es-abstract": "1.17.6" + "es-abstract": "1.17.7" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "requires": { + "es-to-primitive": "1.2.1", + "function-bind": "1.1.1", + "has": "1.0.3", + "has-symbols": "1.0.1", + "is-callable": "1.2.2", + "is-regex": "1.1.1", + "object-inspect": "1.8.0", + "object-keys": "1.1.1", + "object.assign": "4.1.1", + "string.prototype.trimend": "1.0.2", + "string.prototype.trimstart": "1.0.2" + } + } } }, "regexpp": { @@ -11379,9 +15565,9 @@ "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==" }, "regexpu-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", - "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", "requires": { "regenerate": "1.4.1", "regenerate-unicode-properties": "8.2.0", @@ -11422,15 +15608,15 @@ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" }, "renderkid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", - "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.4.tgz", + "integrity": "sha512-K2eXrSOJdq+HuKzlcjOlGoOarUu5SDguDEhE7+Ah4zuOWL40j8A/oHvLlLob9PSTNvVnBd+/q0Er1QfpEuem5g==", "requires": { "css-select": "1.2.0", "dom-converter": "0.2.0", "htmlparser2": "3.10.1", - "strip-ansi": "3.0.1", - "utila": "0.4.0" + "lodash": "4.17.20", + "strip-ansi": "3.0.1" }, "dependencies": { "css-select": { @@ -11539,19 +15725,27 @@ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", + "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", "requires": { + "is-core-module": "2.0.0", "path-parse": "1.0.6" } }, "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "requires": { - "resolve-from": "3.0.0" + "resolve-from": "5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + } } }, "resolve-dir": { @@ -11591,9 +15785,9 @@ } }, "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" }, "resolve-url": { "version": "0.2.1", @@ -11601,11 +15795,11 @@ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" }, "resolve-url-loader": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz", - "integrity": "sha512-K1N5xUjj7v0l2j/3Sgs5b8CjrrgtC70SmdCuZiJ8tSyb5J+uk3FoeZ4b7yTnH6j7ngI+Bc5bldHJIa8hYdu2gQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.2.tgz", + "integrity": "sha512-QEb4A76c8Mi7I3xNKXlRKQSlLBwjUV/ULFMP+G7n3/7tJZ8MG5wsZ3ucxP1Jz8Vevn6fnJsxDx9cIls+utGzPQ==", "requires": { - "adjust-sourcemap-loader": "2.0.0", + "adjust-sourcemap-loader": "3.0.0", "camelcase": "5.3.1", "compose-function": "3.0.3", "convert-source-map": "1.7.0", @@ -11684,6 +15878,11 @@ "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, "rework": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", @@ -11700,36 +15899,109 @@ } } }, - "rework-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", - "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=" - }, - "rgb-regex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=" - }, - "rgba-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=" - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "7.1.6" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "rework-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", + "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=" + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=" + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=" + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "7.1.6" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "3.1.0", + "inherits": "2.0.4" + } + }, + "rollup": { + "version": "1.32.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.32.1.tgz", + "integrity": "sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==", + "requires": { + "@types/estree": "0.0.45", + "@types/node": "14.14.3", + "acorn": "7.4.1" + } + }, + "rollup-plugin-babel": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz", + "integrity": "sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw==", + "requires": { + "@babel/helper-module-imports": "7.12.1", + "rollup-pluginutils": "2.8.2" + } + }, + "rollup-plugin-terser": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz", + "integrity": "sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w==", + "requires": { + "@babel/code-frame": "7.10.4", + "jest-worker": "24.9.0", + "rollup-pluginutils": "2.8.2", + "serialize-javascript": "4.0.0", + "terser": "4.8.0" + }, + "dependencies": { + "jest-worker": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "requires": { + "merge-stream": "2.0.0", + "supports-color": "6.1.0" + } + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "requires": { + "randombytes": "2.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", "requires": { - "hash-base": "3.1.0", - "inherits": "2.0.4" + "estree-walker": "0.6.1" + }, + "dependencies": { + "estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==" + } } }, "rsvp": { @@ -11742,6 +16014,11 @@ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" }, + "run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==" + }, "run-queue": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", @@ -11755,7 +16032,7 @@ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", "requires": { - "tslib": "1.13.0" + "tslib": "1.14.1" } }, "safe-buffer": { @@ -11790,6 +16067,125 @@ "micromatch": "3.1.10", "minimist": "1.2.5", "walker": "1.0.7" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "requires": { + "micromatch": "3.1.10", + "normalize-path": "2.1.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.3", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.3", + "nanomatch": "1.2.13", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "3.0.0", + "repeat-string": "1.6.1" + } + } } }, "sanitize.css": { @@ -11830,11 +16226,29 @@ "shallow-clone": "3.0.1" } }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "1.2.5" + } + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "5.2.2", + "emojis-list": "3.0.0", + "json5": "1.0.1" + } + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -11856,9 +16270,9 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "saxes": { - "version": "3.1.11", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", - "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", "requires": { "xmlchars": "2.2.0" } @@ -11878,7 +16292,7 @@ "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", "requires": { "@types/json-schema": "7.0.6", - "ajv": "6.12.4", + "ajv": "6.12.6", "ajv-keywords": "3.5.2" } }, @@ -11907,17 +16321,17 @@ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" }, "selfsigned": { - "version": "1.10.7", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", - "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", + "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", "requires": { - "node-forge": "0.9.0" + "node-forge": "0.10.0" } }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" }, "send": { "version": "0.17.1", @@ -11954,11 +16368,6 @@ } } }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", @@ -11967,9 +16376,12 @@ } }, "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "requires": { + "randombytes": "2.1.0" + } }, "serve-index": { "version": "1.9.1", @@ -12124,36 +16536,16 @@ "shellwords": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "optional": true }, "side-channel": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.3.tgz", "integrity": "sha512-A6+ByhlLkksFoUepsGxfj5x1gTSrs+OydsRptUxeNCabQpCFUvcwIczgOigI8vhY/OJCnPnyE9rGiwgvr9cS1g==", "requires": { - "es-abstract": "1.18.0-next.0", + "es-abstract": "1.18.0-next.1", "object-inspect": "1.8.0" - }, - "dependencies": { - "es-abstract": { - "version": "1.18.0-next.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.0.tgz", - "integrity": "sha512-elZXTZXKn51hUBdJjSZGYRujuzilgXo8vSPQzjGYXLvSlGiCo8VO8ZGV3kjo9a0WNJJ57hENagwbtlRuHuzkcQ==", - "requires": { - "es-to-primitive": "1.2.1", - "function-bind": "1.1.1", - "has": "1.0.3", - "has-symbols": "1.0.1", - "is-callable": "1.2.0", - "is-negative-zero": "2.0.0", - "is-regex": "1.1.1", - "object-inspect": "1.8.0", - "object-keys": "1.1.1", - "object.assign": "4.1.0", - "string.prototype.trimend": "1.0.1", - "string.prototype.trimstart": "1.0.1" - } - } } }, "signal-exit": { @@ -12182,9 +16574,9 @@ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" }, "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" }, "slice-ansi": { "version": "2.1.0", @@ -12314,12 +16706,13 @@ } }, "sockjs": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", - "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", + "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", "requires": { "faye-websocket": "0.10.0", - "uuid": "3.4.0" + "uuid": "3.4.0", + "websocket-driver": "0.6.5" } }, "sockjs-client": { @@ -12348,7 +16741,7 @@ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", "requires": { - "websocket-driver": "0.7.4" + "websocket-driver": "0.6.5" } } } @@ -12397,13 +16790,18 @@ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + }, "spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "requires": { "spdx-expression-parse": "3.0.1", - "spdx-license-ids": "3.0.5" + "spdx-license-ids": "3.0.6" } }, "spdx-exceptions": { @@ -12417,20 +16815,20 @@ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "requires": { "spdx-exceptions": "2.3.0", - "spdx-license-ids": "3.0.5" + "spdx-license-ids": "3.0.6" } }, "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz", + "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==" }, "spdy": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "requires": { - "debug": "4.1.1", + "debug": "4.2.0", "handle-thing": "2.0.1", "http-deceiver": "1.2.7", "select-hose": "2.0.0", @@ -12442,7 +16840,7 @@ "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "requires": { - "debug": "4.1.1", + "debug": "4.2.0", "detect-node": "2.0.4", "hpack.js": "2.1.6", "obuf": "1.1.2", @@ -12492,11 +16890,10 @@ } }, "ssri": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz", - "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", + "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", "requires": { - "figgy-pudding": "3.5.2", "minipass": "3.1.3" } }, @@ -12506,9 +16903,24 @@ "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" }, "stack-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", - "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", + "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "requires": { + "escape-string-regexp": "2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + } + } + }, + "stackframe": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", + "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==" }, "static-extend": { "version": "0.1.2", @@ -12588,29 +17000,34 @@ "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" }, "string-length": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", - "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", + "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==", "requires": { - "astral-regex": "1.0.0", - "strip-ansi": "4.0.0" + "char-regex": "1.0.2", + "strip-ansi": "6.0.0" }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "5.0.0" } } } }, + "string-natural-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", + "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" + }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -12627,29 +17044,49 @@ "integrity": "sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg==", "requires": { "define-properties": "1.1.3", - "es-abstract": "1.17.6", + "es-abstract": "1.17.7", "has-symbols": "1.0.1", "internal-slot": "1.0.2", "regexp.prototype.flags": "1.3.0", "side-channel": "1.0.3" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "requires": { + "es-to-primitive": "1.2.1", + "function-bind": "1.1.1", + "has": "1.0.3", + "has-symbols": "1.0.1", + "is-callable": "1.2.2", + "is-regex": "1.1.1", + "object-inspect": "1.8.0", + "object-keys": "1.1.1", + "object.assign": "4.1.1", + "string.prototype.trimend": "1.0.2", + "string.prototype.trimstart": "1.0.2" + } + } } }, "string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz", + "integrity": "sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw==", "requires": { "define-properties": "1.1.3", - "es-abstract": "1.17.6" + "es-abstract": "1.18.0-next.1" } }, "string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz", + "integrity": "sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg==", "requires": { "define-properties": "1.1.3", - "es-abstract": "1.17.6" + "es-abstract": "1.18.0-next.1" } }, "string_decoder": { @@ -12714,6 +17151,11 @@ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + }, "strip-indent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", @@ -12728,24 +17170,12 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" }, "style-loader": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", - "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.3.0.tgz", + "integrity": "sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==", "requires": { - "loader-utils": "1.4.0", - "schema-utils": "1.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "requires": { - "ajv": "6.12.4", - "ajv-errors": "1.0.1", - "ajv-keywords": "3.5.2" - } - } + "loader-utils": "2.0.0", + "schema-utils": "2.7.1" } }, "stylehacks": { @@ -12753,8 +17183,8 @@ "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", "requires": { - "browserslist": "4.14.1", - "postcss": "7.0.32", + "browserslist": "4.14.5", + "postcss": "7.0.35", "postcss-selector-parser": "3.1.2" }, "dependencies": { @@ -12778,6 +17208,30 @@ "has-flag": "3.0.0" } }, + "supports-hyperlinks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", + "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", + "requires": { + "has-flag": "4.0.0", + "supports-color": "7.2.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "4.0.0" + } + } + } + }, "svg-parser": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", @@ -12813,7 +17267,7 @@ "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", "requires": { - "ajv": "6.12.4", + "ajv": "6.12.6", "lodash": "4.17.20", "slice-ansi": "2.1.0", "string-width": "3.1.0" @@ -12859,6 +17313,37 @@ "inherits": "2.0.4" } }, + "temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=" + }, + "tempy": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz", + "integrity": "sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ==", + "requires": { + "temp-dir": "1.0.0", + "type-fest": "0.3.1", + "unique-string": "1.0.0" + }, + "dependencies": { + "type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==" + } + } + }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "requires": { + "ansi-escapes": "4.3.1", + "supports-hyperlinks": "2.1.0" + } + }, "terser": { "version": "4.8.0", "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", @@ -12867,24 +17352,36 @@ "commander": "2.20.3", "source-map": "0.6.1", "source-map-support": "0.5.19" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + } } }, "terser-webpack-plugin": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.5.tgz", - "integrity": "sha512-WlWksUoq+E4+JlJ+h+U+QUzXpcsMSSNXkDy9lBVkSqDn1w23Gg29L/ary9GeJVYCGiNJJX7LnVc4bwL1N3/g1w==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz", + "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==", "requires": { - "cacache": "13.0.1", + "cacache": "15.0.5", "find-cache-dir": "3.3.1", - "jest-worker": "25.5.0", - "p-limit": "2.3.0", - "schema-utils": "2.7.1", - "serialize-javascript": "2.1.2", + "jest-worker": "26.6.1", + "p-limit": "3.0.2", + "schema-utils": "3.0.0", + "serialize-javascript": "5.0.1", "source-map": "0.6.1", - "terser": "4.8.0", + "terser": "5.3.8", "webpack-sources": "1.4.3" }, "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, "find-cache-dir": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", @@ -12896,26 +17393,12 @@ } }, "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "5.0.0", - "path-exists": "4.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "jest-worker": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.5.0.tgz", - "integrity": "sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "requires": { - "merge-stream": "2.0.0", - "supports-color": "7.2.0" + "locate-path": "5.0.0", + "path-exists": "4.0.0" } }, "locate-path": { @@ -12934,12 +17417,30 @@ "semver": "6.3.0" } }, + "p-limit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", + "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", + "requires": { + "p-try": "2.2.0" + } + }, "p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "requires": { "p-limit": "2.3.0" + }, + "dependencies": { + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "2.2.0" + } + } } }, "path-exists": { @@ -12955,97 +17456,48 @@ "find-up": "4.1.0" } }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "requires": { + "@types/json-schema": "7.0.6", + "ajv": "6.12.6", + "ajv-keywords": "3.5.2" + } + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "terser": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.3.8.tgz", + "integrity": "sha512-zVotuHoIfnYjtlurOouTazciEfL7V38QMAOhGqpXDEg6yT13cF4+fEP9b0rrCEQTn+tT46uxgFsTZzhygk+CzQ==", "requires": { - "has-flag": "4.0.0" + "commander": "2.20.3", + "source-map": "0.7.3", + "source-map-support": "0.5.19" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } } } } }, "test-exclude": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", - "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "requires": { + "@istanbuljs/schema": "0.1.2", "glob": "7.1.6", - "minimatch": "3.0.4", - "read-pkg-up": "4.0.0", - "require-main-filename": "2.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "3.0.0" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "requires": { - "graceful-fs": "4.2.4", - "parse-json": "4.0.0", - "pify": "3.0.0", - "strip-bom": "3.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "requires": { - "error-ex": "1.3.2", - "json-parse-better-errors": "1.0.2" - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "requires": { - "pify": "3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "requires": { - "load-json-file": "4.0.0", - "normalize-package-data": "2.5.0", - "path-type": "3.0.0" - } - }, - "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", - "requires": { - "find-up": "3.0.0", - "read-pkg": "3.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" - } + "minimatch": "3.0.4" } }, "text-table": { @@ -13054,9 +17506,9 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" }, "throat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", - "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==" }, "through": { "version": "2.3.8", @@ -13133,12 +17585,11 @@ } }, "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "requires": { - "is-number": "3.0.0", - "repeat-string": "1.6.1" + "is-number": "7.0.0" } }, "toidentifier": { @@ -13156,9 +17607,9 @@ } }, "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", + "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", "requires": { "punycode": "2.1.1" } @@ -13176,22 +17627,53 @@ "glob": "7.1.6" } }, + "tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" + }, "ts-pnp": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.1.6.tgz", - "integrity": "sha512-CrG5GqAAzMT7144Cl+UIFP7mz/iIhiy+xQ6GGcnjTezhALT02uPMRw7tgDSESgB5MsfKt55+GPWw4ir1kVtMIQ==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", + "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==" + }, + "tsconfig-paths": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "requires": { + "@types/json5": "0.0.29", + "json5": "1.0.1", + "minimist": "1.2.5", + "strip-bom": "3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "1.2.5" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + } + } }, "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "tsutils": { "version": "3.17.1", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", "requires": { - "tslib": "1.13.0" + "tslib": "1.14.1" } }, "tty-browserify": { @@ -13218,13 +17700,18 @@ "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" }, "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "requires": { - "prelude-ls": "1.1.2" + "prelude-ls": "1.2.1" } }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" + }, "type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", @@ -13249,6 +17736,14 @@ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "1.0.0" + } + }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", @@ -13310,10 +17805,18 @@ "imurmurhash": "0.1.4" } }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "requires": { + "crypto-random-string": "1.0.0" + } + }, "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==" }, "unpipe": { "version": "1.0.0", @@ -13396,13 +17899,25 @@ } }, "url-loader": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-2.3.0.tgz", - "integrity": "sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", "requires": { - "loader-utils": "1.4.0", - "mime": "2.4.6", - "schema-utils": "2.7.1" + "loader-utils": "2.0.0", + "mime-types": "2.1.27", + "schema-utils": "3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "requires": { + "@types/json-schema": "7.0.6", + "ajv": "6.12.6", + "ajv-keywords": "3.5.2" + } + } } }, "url-parse": { @@ -13420,17 +17935,17 @@ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" }, "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", "requires": { - "inherits": "2.0.1" + "inherits": "2.0.3" }, "dependencies": { "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" } } }, @@ -13445,9 +17960,29 @@ "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", "requires": { "define-properties": "1.1.3", - "es-abstract": "1.17.6", + "es-abstract": "1.17.7", "has-symbols": "1.0.1", "object.getownpropertydescriptors": "2.1.0" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "requires": { + "es-to-primitive": "1.2.1", + "function-bind": "1.1.1", + "has": "1.0.3", + "has-symbols": "1.0.1", + "is-callable": "1.2.2", + "is-regex": "1.1.1", + "object-inspect": "1.8.0", + "object-keys": "1.1.1", + "object.assign": "4.1.1", + "string.prototype.trimend": "1.0.2", + "string.prototype.trimstart": "1.0.2" + } + } } }, "utila": { @@ -13470,6 +18005,23 @@ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==" }, + "v8-to-istanbul": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-6.0.1.tgz", + "integrity": "sha512-PzM1WlqquhBvsV+Gco6WSFeg1AGdD53ccMRkFeyHRE/KRZaVacPOmQYP3EeVgDBtKD2BJ8kgynBQ5OtKiHCH+w==", + "requires": { + "@types/istanbul-lib-coverage": "2.0.3", + "convert-source-map": "1.7.0", + "source-map": "0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } + } + }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -13513,12 +18065,10 @@ } }, "w3c-xmlserializer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", - "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", "requires": { - "domexception": "1.0.1", - "webidl-conversions": "4.0.2", "xml-name-validator": "3.0.0" } }, @@ -13549,9 +18099,9 @@ "integrity": "sha512-Fq1+nu43ybsjSnBquLrW/cULmKs61qbv9k8ep13QUe0nABBezMoNAA+j6QY66MW0/eoDVDp1rjXDqQ2VKyS/Xg==", "dev": true, "requires": { - "@babel/core": "7.9.0", - "@babel/traverse": "7.11.5", - "@babel/types": "7.11.5", + "@babel/core": "7.12.3", + "@babel/traverse": "7.12.1", + "@babel/types": "7.12.1", "babylon": "7.0.0-beta.47", "webassembly-interpreter": "0.0.30" }, @@ -13572,6 +18122,28 @@ "requires": { "loader-utils": "1.4.0", "wasm-dce": "1.0.2" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "1.2.5" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "5.2.2", + "emojis-list": "3.0.0", + "json5": "1.0.1" + } + } } }, "watchpack": { @@ -13579,7 +18151,7 @@ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz", "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==", "requires": { - "chokidar": "3.4.2", + "chokidar": "3.4.3", "graceful-fs": "4.2.4", "neo-async": "2.6.2", "watchpack-chokidar2": "2.0.0" @@ -13594,12 +18166,60 @@ "chokidar": "2.1.8" }, "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "optional": true, + "requires": { + "micromatch": "3.1.10", + "normalize-path": "2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "optional": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + } + } + }, "binary-extensions": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "optional": true }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.3", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, "chokidar": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", @@ -13620,13 +18240,34 @@ "upath": "1.2.0" } }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, "fsevents": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "optional": true, "requires": { - "nan": "2.14.1" + "nan": "2.14.2" } }, "glob-parent": { @@ -13659,11 +18300,48 @@ "binary-extensions": "1.13.1" } }, - "normalize-path": { + "is-number": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "optional": true + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.3", + "nanomatch": "1.2.13", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } }, "readdirp": { "version": "2.2.1", @@ -13675,6 +18353,15 @@ "micromatch": "3.1.10", "readable-stream": "2.3.7" } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "3.0.0", + "repeat-string": "1.6.1" + } } } }, @@ -13704,21 +18391,21 @@ } }, "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" }, "webpack": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.42.0.tgz", - "integrity": "sha512-EzJRHvwQyBiYrYqhyjW9AqM90dE4+s1/XtCfn7uWg6cS72zH+2VPFAlsnW0+W0cDi0XRjNKUMoJtpSi50+Ph6w==", - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/wasm-edit": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "acorn": "6.4.1", - "ajv": "6.12.4", + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", + "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "6.4.2", + "ajv": "6.12.6", "ajv-keywords": "3.5.2", "chrome-trace-event": "1.0.2", "enhanced-resolve": "4.3.0", @@ -13739,9 +18426,36 @@ }, "dependencies": { "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.3", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "0.1.1" + } + } + } }, "cacache": { "version": "12.0.4", @@ -13765,6 +18479,11 @@ "y18n": "4.0.0" } }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, "eslint-scope": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", @@ -13774,6 +18493,73 @@ "estraverse": "4.3.0" } }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "1.2.5" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "5.2.2", + "emojis-list": "3.0.0", + "json5": "1.0.1" + } + }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -13782,12 +18568,32 @@ "yallist": "3.1.1" } }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.3", + "nanomatch": "1.2.13", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "requires": { - "ajv": "6.12.4", + "ajv": "6.12.6", "ajv-errors": "1.0.1", "ajv-keywords": "3.5.2" } @@ -13824,6 +18630,15 @@ "worker-farm": "1.7.0" } }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "3.0.0", + "repeat-string": "1.6.1" + } + }, "yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -13863,10 +18678,49 @@ "which": "1.3.1" } }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "3.0.0", + "resolve-cwd": "2.0.0" + } + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "1.2.5" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "5.2.2", + "emojis-list": "3.0.0", + "json5": "1.0.1" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "dev": true }, "supports-color": { @@ -13890,19 +18744,26 @@ "mkdirp": "0.5.5", "range-parser": "1.2.1", "webpack-log": "2.0.0" + }, + "dependencies": { + "mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" + } } }, "webpack-dev-server": { - "version": "3.10.3", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.3.tgz", - "integrity": "sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", + "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", "requires": { "ansi-html": "0.0.7", "bonjour": "3.5.0", "chokidar": "2.1.8", "compression": "1.7.4", "connect-history-api-fallback": "1.6.0", - "debug": "4.1.1", + "debug": "4.2.0", "del": "4.1.1", "express": "4.17.1", "html-entities": "1.3.1", @@ -13917,10 +18778,10 @@ "p-retry": "3.0.1", "portfinder": "1.0.28", "schema-utils": "1.0.0", - "selfsigned": "1.10.7", + "selfsigned": "1.10.8", "semver": "6.3.0", "serve-index": "1.9.1", - "sockjs": "0.3.19", + "sockjs": "0.3.20", "sockjs-client": "1.4.0", "spdy": "4.0.2", "strip-ansi": "3.0.1", @@ -13929,23 +18790,59 @@ "webpack-dev-middleware": "3.7.2", "webpack-log": "2.0.0", "ws": "6.2.1", - "yargs": "12.0.5" + "yargs": "13.3.2" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "requires": { + "micromatch": "3.1.10", + "normalize-path": "2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "1.1.0" + } + } + } }, "binary-extensions": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.3", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "0.1.1" + } + } + } }, "chokidar": { "version": "2.1.8", @@ -13966,48 +18863,36 @@ "upath": "1.2.0" } }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "requires": { - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "wrap-ansi": "2.1.0" + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" }, "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "ansi-regex": "3.0.0" + "is-extendable": "0.1.1" } } } }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "3.0.0" - } - }, "fsevents": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "optional": true, "requires": { - "nan": "2.14.1" + "nan": "2.14.2" } }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" - }, "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", @@ -14027,6 +18912,15 @@ } } }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "requires": { + "pkg-dir": "3.0.0", + "resolve-cwd": "2.0.0" + } + }, "is-absolute-url": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", @@ -14040,15 +18934,48 @@ "binary-extensions": "1.13.1" } }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "normalize-path": { + "is-number": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.3", + "nanomatch": "1.2.13", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } }, "readdirp": { "version": "2.2.1", @@ -14060,17 +18987,25 @@ "readable-stream": "2.3.7" } }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "requires": { + "resolve-from": "3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "requires": { - "ajv": "6.12.4", + "ajv": "6.12.6", "ajv-errors": "1.0.1", "ajv-keywords": "3.5.2" } @@ -14080,25 +19015,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", @@ -14107,33 +19023,13 @@ "has-flag": "3.0.0" } }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "1.0.1" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } + "is-number": "3.0.0", + "repeat-string": "1.6.1" } }, "ws": { @@ -14143,34 +19039,6 @@ "requires": { "async-limiter": "1.0.1" } - }, - "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "requires": { - "cliui": "4.1.0", - "decamelize": "1.2.0", - "find-up": "3.0.0", - "get-caller-file": "1.0.3", - "os-locale": "3.1.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "4.0.0", - "yargs-parser": "11.1.1" - } - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "requires": { - "camelcase": "5.3.1", - "decamelize": "1.2.0" - } } } }, @@ -14181,6 +19049,13 @@ "requires": { "ansi-colors": "3.2.4", "uuid": "3.4.0" + }, + "dependencies": { + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" + } } }, "webpack-manifest-plugin": { @@ -14203,6 +19078,19 @@ "jsonfile": "4.0.0", "universalify": "0.1.2" } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "4.2.4" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" } } }, @@ -14216,12 +19104,10 @@ } }, "websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", + "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", "requires": { - "http-parser-js": "0.5.2", - "safe-buffer": "5.1.2", "websocket-extensions": "0.1.4" } }, @@ -14249,13 +19135,13 @@ "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" }, "whatwg-url": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", - "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", + "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", "requires": { "lodash.sortby": "4.7.0", - "tr46": "1.0.1", - "webidl-conversions": "4.0.2" + "tr46": "2.0.2", + "webidl-conversions": "6.1.0" } }, "which": { @@ -14285,164 +19171,200 @@ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" }, "workbox-background-sync": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz", - "integrity": "sha512-1uFkvU8JXi7L7fCHVBEEnc3asPpiAL33kO495UMcD5+arew9IbKW2rV5lpzhoWcm/qhGB89YfO4PmB/0hQwPRg==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-5.1.4.tgz", + "integrity": "sha512-AH6x5pYq4vwQvfRDWH+vfOePfPIYQ00nCEB7dJRU1e0n9+9HMRyvI63FlDvtFT2AvXVRsXvUt7DNMEToyJLpSA==", "requires": { - "workbox-core": "4.3.1" + "workbox-core": "5.1.4" } }, "workbox-broadcast-update": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-4.3.1.tgz", - "integrity": "sha512-MTSfgzIljpKLTBPROo4IpKjESD86pPFlZwlvVG32Kb70hW+aob4Jxpblud8EhNb1/L5m43DUM4q7C+W6eQMMbA==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-5.1.4.tgz", + "integrity": "sha512-HTyTWkqXvHRuqY73XrwvXPud/FN6x3ROzkfFPsRjtw/kGZuZkPzfeH531qdUGfhtwjmtO/ZzXcWErqVzJNdXaA==", "requires": { - "workbox-core": "4.3.1" + "workbox-core": "5.1.4" } }, "workbox-build": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-4.3.1.tgz", - "integrity": "sha512-UHdwrN3FrDvicM3AqJS/J07X0KXj67R8Cg0waq1MKEOqzo89ap6zh6LmaLnRAjpB+bDIz+7OlPye9iii9KBnxw==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-5.1.4.tgz", + "integrity": "sha512-xUcZn6SYU8usjOlfLb9Y2/f86Gdo+fy1fXgH8tJHjxgpo53VVsqRX0lUDw8/JuyzNmXuo8vXX14pXX2oIm9Bow==", "requires": { - "@babel/runtime": "7.11.2", + "@babel/core": "7.12.3", + "@babel/preset-env": "7.12.1", + "@babel/runtime": "7.12.1", "@hapi/joi": "15.1.1", + "@rollup/plugin-node-resolve": "7.1.3", + "@rollup/plugin-replace": "2.3.3", + "@surma/rollup-plugin-off-main-thread": "1.4.1", "common-tags": "1.8.0", - "fs-extra": "4.0.3", + "fast-json-stable-stringify": "2.1.0", + "fs-extra": "8.1.0", "glob": "7.1.6", "lodash.template": "4.5.0", "pretty-bytes": "5.4.1", + "rollup": "1.32.1", + "rollup-plugin-babel": "4.4.0", + "rollup-plugin-terser": "5.3.1", + "source-map": "0.7.3", + "source-map-url": "0.4.0", "stringify-object": "3.3.0", "strip-comments": "1.0.2", - "workbox-background-sync": "4.3.1", - "workbox-broadcast-update": "4.3.1", - "workbox-cacheable-response": "4.3.1", - "workbox-core": "4.3.1", - "workbox-expiration": "4.3.1", - "workbox-google-analytics": "4.3.1", - "workbox-navigation-preload": "4.3.1", - "workbox-precaching": "4.3.1", - "workbox-range-requests": "4.3.1", - "workbox-routing": "4.3.1", - "workbox-strategies": "4.3.1", - "workbox-streams": "4.3.1", - "workbox-sw": "4.3.1", - "workbox-window": "4.3.1" + "tempy": "0.3.0", + "upath": "1.2.0", + "workbox-background-sync": "5.1.4", + "workbox-broadcast-update": "5.1.4", + "workbox-cacheable-response": "5.1.4", + "workbox-core": "5.1.4", + "workbox-expiration": "5.1.4", + "workbox-google-analytics": "5.1.4", + "workbox-navigation-preload": "5.1.4", + "workbox-precaching": "5.1.4", + "workbox-range-requests": "5.1.4", + "workbox-routing": "5.1.4", + "workbox-strategies": "5.1.4", + "workbox-streams": "5.1.4", + "workbox-sw": "5.1.4", + "workbox-window": "5.1.4" }, "dependencies": { "fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "requires": { "graceful-fs": "4.2.4", "jsonfile": "4.0.0", "universalify": "0.1.2" } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "4.2.4" + } + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" } } }, "workbox-cacheable-response": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-4.3.1.tgz", - "integrity": "sha512-Rp5qlzm6z8IOvnQNkCdO9qrDgDpoPNguovs0H8C+wswLuPgSzSp9p2afb5maUt9R1uTIwOXrVQMmPfPypv+npw==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-5.1.4.tgz", + "integrity": "sha512-0bfvMZs0Of1S5cdswfQK0BXt6ulU5kVD4lwer2CeI+03czHprXR3V4Y8lPTooamn7eHP8Iywi5QjyAMjw0qauA==", "requires": { - "workbox-core": "4.3.1" + "workbox-core": "5.1.4" } }, "workbox-core": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-4.3.1.tgz", - "integrity": "sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg==" + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-5.1.4.tgz", + "integrity": "sha512-+4iRQan/1D8I81nR2L5vcbaaFskZC2CL17TLbvWVzQ4qiF/ytOGF6XeV54pVxAvKUtkLANhk8TyIUMtiMw2oDg==" }, "workbox-expiration": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-4.3.1.tgz", - "integrity": "sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-5.1.4.tgz", + "integrity": "sha512-oDO/5iC65h2Eq7jctAv858W2+CeRW5e0jZBMNRXpzp0ZPvuT6GblUiHnAsC5W5lANs1QS9atVOm4ifrBiYY7AQ==", "requires": { - "workbox-core": "4.3.1" + "workbox-core": "5.1.4" } }, "workbox-google-analytics": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-4.3.1.tgz", - "integrity": "sha512-xzCjAoKuOb55CBSwQrbyWBKqp35yg1vw9ohIlU2wTy06ZrYfJ8rKochb1MSGlnoBfXGWss3UPzxR5QL5guIFdg==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-5.1.4.tgz", + "integrity": "sha512-0IFhKoEVrreHpKgcOoddV+oIaVXBFKXUzJVBI+nb0bxmcwYuZMdteBTp8AEDJacENtc9xbR0wa9RDCnYsCDLjA==", "requires": { - "workbox-background-sync": "4.3.1", - "workbox-core": "4.3.1", - "workbox-routing": "4.3.1", - "workbox-strategies": "4.3.1" + "workbox-background-sync": "5.1.4", + "workbox-core": "5.1.4", + "workbox-routing": "5.1.4", + "workbox-strategies": "5.1.4" } }, "workbox-navigation-preload": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-4.3.1.tgz", - "integrity": "sha512-K076n3oFHYp16/C+F8CwrRqD25GitA6Rkd6+qAmLmMv1QHPI2jfDwYqrytOfKfYq42bYtW8Pr21ejZX7GvALOw==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-5.1.4.tgz", + "integrity": "sha512-Wf03osvK0wTflAfKXba//QmWC5BIaIZARU03JIhAEO2wSB2BDROWI8Q/zmianf54kdV7e1eLaIEZhth4K4MyfQ==", "requires": { - "workbox-core": "4.3.1" + "workbox-core": "5.1.4" } }, "workbox-precaching": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-4.3.1.tgz", - "integrity": "sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-5.1.4.tgz", + "integrity": "sha512-gCIFrBXmVQLFwvAzuGLCmkUYGVhBb7D1k/IL7pUJUO5xacjLcFUaLnnsoVepBGAiKw34HU1y/YuqvTKim9qAZA==", "requires": { - "workbox-core": "4.3.1" + "workbox-core": "5.1.4" } }, "workbox-range-requests": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-4.3.1.tgz", - "integrity": "sha512-S+HhL9+iTFypJZ/yQSl/x2Bf5pWnbXdd3j57xnb0V60FW1LVn9LRZkPtneODklzYuFZv7qK6riZ5BNyc0R0jZA==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-5.1.4.tgz", + "integrity": "sha512-1HSujLjgTeoxHrMR2muDW2dKdxqCGMc1KbeyGcmjZZAizJTFwu7CWLDmLv6O1ceWYrhfuLFJO+umYMddk2XMhw==", "requires": { - "workbox-core": "4.3.1" + "workbox-core": "5.1.4" } }, "workbox-routing": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-4.3.1.tgz", - "integrity": "sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-5.1.4.tgz", + "integrity": "sha512-8ljknRfqE1vEQtnMtzfksL+UXO822jJlHTIR7+BtJuxQ17+WPZfsHqvk1ynR/v0EHik4x2+826Hkwpgh4GKDCw==", "requires": { - "workbox-core": "4.3.1" + "workbox-core": "5.1.4" } }, "workbox-strategies": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-4.3.1.tgz", - "integrity": "sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-5.1.4.tgz", + "integrity": "sha512-VVS57LpaJTdjW3RgZvPwX0NlhNmscR7OQ9bP+N/34cYMDzXLyA6kqWffP6QKXSkca1OFo/v6v7hW7zrrguo6EA==", "requires": { - "workbox-core": "4.3.1" + "workbox-core": "5.1.4", + "workbox-routing": "5.1.4" } }, "workbox-streams": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-4.3.1.tgz", - "integrity": "sha512-4Kisis1f/y0ihf4l3u/+ndMkJkIT4/6UOacU3A4BwZSAC9pQ9vSvJpIi/WFGQRH/uPXvuVjF5c2RfIPQFSS2uA==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-5.1.4.tgz", + "integrity": "sha512-xU8yuF1hI/XcVhJUAfbQLa1guQUhdLMPQJkdT0kn6HP5CwiPOGiXnSFq80rAG4b1kJUChQQIGPrq439FQUNVrw==", "requires": { - "workbox-core": "4.3.1" + "workbox-core": "5.1.4", + "workbox-routing": "5.1.4" } }, "workbox-sw": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-4.3.1.tgz", - "integrity": "sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w==" + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-5.1.4.tgz", + "integrity": "sha512-9xKnKw95aXwSNc8kk8gki4HU0g0W6KXu+xks7wFuC7h0sembFnTrKtckqZxbSod41TDaGh+gWUA5IRXrL0ECRA==" }, "workbox-webpack-plugin": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-4.3.1.tgz", - "integrity": "sha512-gJ9jd8Mb8wHLbRz9ZvGN57IAmknOipD3W4XNE/Lk/4lqs5Htw4WOQgakQy/o/4CoXQlMCYldaqUg+EJ35l9MEQ==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-5.1.4.tgz", + "integrity": "sha512-PZafF4HpugZndqISi3rZ4ZK4A4DxO8rAqt2FwRptgsDx7NF8TVKP86/huHquUsRjMGQllsNdn4FNl8CD/UvKmQ==", "requires": { - "@babel/runtime": "7.11.2", - "json-stable-stringify": "1.0.1", - "workbox-build": "4.3.1" + "@babel/runtime": "7.12.1", + "fast-json-stable-stringify": "2.1.0", + "source-map-url": "0.4.0", + "upath": "1.2.0", + "webpack-sources": "1.4.3", + "workbox-build": "5.1.4" } }, "workbox-window": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-4.3.1.tgz", - "integrity": "sha512-C5gWKh6I58w3GeSc0wp2Ne+rqVw8qwcmZnQGpjiek8A2wpbxSJb1FdCoQVO+jDJs35bFgo/WETgl1fqgsxN0Hg==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-5.1.4.tgz", + "integrity": "sha512-vXQtgTeMCUq/4pBWMfQX8Ee7N2wVC4Q7XYFqLnfbXJ2hqew/cU1uMTD2KqGEgEpE4/30luxIxgE+LkIa8glBYw==", "requires": { - "workbox-core": "4.3.1" + "workbox-core": "5.1.4" } }, "worker-farm": { @@ -14510,22 +19432,20 @@ } }, "write-file-atomic": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", - "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "requires": { - "graceful-fs": "4.2.4", "imurmurhash": "0.1.4", - "signal-exit": "3.0.3" + "is-typedarray": "1.0.0", + "signal-exit": "3.0.3", + "typedarray-to-buffer": "3.1.5" } }, "ws": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", - "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", - "requires": { - "async-limiter": "1.0.1" - } + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", + "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==" }, "xml-name-validator": { "version": "3.0.0", @@ -14537,14 +19457,6 @@ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" }, - "xregexp": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.3.0.tgz", - "integrity": "sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g==", - "requires": { - "@babel/runtime-corejs3": "7.11.2" - } - }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/clients/webassembly/react-example/package.json b/clients/webassembly/react-example/package.json index 4d7adf7c59a..ea30f94e5cb 100644 --- a/clients/webassembly/react-example/package.json +++ b/clients/webassembly/react-example/package.json @@ -3,7 +3,7 @@ "version": "0.1.0", "private": true, "dependencies": { - "@nymproject/nym-client-wasm": "^0.8.0", + "@nymproject/nym-client-wasm": "file:../pkg", "@testing-library/jest-dom": "^4.2.4", "@testing-library/react": "^9.5.0", "@testing-library/user-event": "^7.2.1", @@ -11,7 +11,7 @@ "node-sass": "^4.14.1", "react": "^16.13.1", "react-dom": "^16.13.1", - "react-scripts": "3.4.1", + "react-scripts": "^4.0.0", "reactstrap": "^8.5.1", "request": "^2.79.0" }, @@ -41,7 +41,6 @@ "hello-wasm-pack": "^0.1.0", "react-app-rewired": "^2.1.6", "wasm-loader": "^1.3.0", - "webpack": "^4.29.3", "webpack-cli": "^3.1.0" } } diff --git a/clients/webassembly/react-example/src/App.js b/clients/webassembly/react-example/src/App.js index dbe401acae7..ed4fc0c5969 100644 --- a/clients/webassembly/react-example/src/App.js +++ b/clients/webassembly/react-example/src/App.js @@ -42,8 +42,8 @@ class App extends React.Component { const wasm = await import('@nymproject/nym-client-wasm'); this.setState({ wasm }); // Set up identity and client - let directory = "https://qa-directory.nymtech.net"; - let _nymClient = new wasm.NymClient(directory); + let validator = "http://testnet-validator1.nymtech.net:8081"; + let _nymClient = new wasm.NymClient(validator); _nymClient.set_on_message(this.receivedMessage); // Start the Nym client. Connects to a Nym gateway via websocket. _nymClient = await _nymClient.initial_setup(); diff --git a/clients/webassembly/src/built_info.rs b/clients/webassembly/src/built_info.rs deleted file mode 100644 index 6a73d39ca87..00000000000 --- a/clients/webassembly/src/built_info.rs +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -// The file has been placed there by the build script. - -#![allow(dead_code)] -include!(concat!(env!("OUT_DIR"), "/built.rs")); diff --git a/clients/webassembly/src/client/mod.rs b/clients/webassembly/src/client/mod.rs index acaf085514f..0a44aebe157 100644 --- a/clients/webassembly/src/client/mod.rs +++ b/clients/webassembly/src/client/mod.rs @@ -12,18 +12,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::built_info; use crypto::asymmetric::{encryption, identity}; -use directory_client::DirectoryClient; use futures::channel::mpsc; use gateway_client::GatewayClient; use js_sys::Promise; use nymsphinx::acknowledgements::AckKey; use nymsphinx::addressing::clients::Recipient; +use nymsphinx::params::PacketMode; use nymsphinx::preparer::MessagePreparer; use rand::rngs::OsRng; use received_processor::ReceivedMessagesProcessor; -use std::convert::TryInto; use std::sync::Arc; use std::time::Duration; use topology::{gateway, NymTopology}; @@ -38,10 +36,12 @@ const DEFAULT_RNG: OsRng = OsRng; const DEFAULT_AVERAGE_PACKET_DELAY: Duration = Duration::from_millis(200); const DEFAULT_AVERAGE_ACK_DELAY: Duration = Duration::from_millis(200); const DEFAULT_GATEWAY_RESPONSE_TIMEOUT: Duration = Duration::from_millis(1_500); +const DEFAULT_PACKET_MODE: PacketMode = PacketMode::VPN; +const DEFAULT_VPN_KEY_REUSE_LIMIT: usize = 1000; #[wasm_bindgen] pub struct NymClient { - directory_server: String, + validator_server: String, // TODO: technically this doesn't need to be an Arc since wasm is run on a single thread // however, once we eventually combine this code with the native-client's, it will make things @@ -66,7 +66,7 @@ pub struct NymClient { #[wasm_bindgen] impl NymClient { #[wasm_bindgen(constructor)] - pub fn new(directory_server: String) -> Self { + pub fn new(validator_server: String) -> Self { // for time being generate new keys each time... let identity = identity::KeyPair::new_with_rng(&mut DEFAULT_RNG); let encryption_keys = encryption::KeyPair::new_with_rng(&mut DEFAULT_RNG); @@ -76,7 +76,7 @@ impl NymClient { identity: Arc::new(identity), encryption_keys: Arc::new(encryption_keys), ack_key: Arc::new(ack_key), - directory_server, + validator_server, message_preparer: None, // received_keys: Default::default(), topology: None, @@ -149,6 +149,8 @@ impl NymClient { client.self_recipient(), DEFAULT_AVERAGE_PACKET_DELAY, DEFAULT_AVERAGE_ACK_DELAY, + DEFAULT_PACKET_MODE, + Some(DEFAULT_VPN_KEY_REUSE_LIMIT), ); let received_processor = ReceivedMessagesProcessor::new( @@ -186,23 +188,21 @@ impl NymClient { .prepare_and_split_message(message_bytes, false, topology) .expect("failed to split the message"); - let mut socket_messages = Vec::with_capacity(split_message.len()); + let mut mix_packets = Vec::with_capacity(split_message.len()); for message_chunk in split_message { // don't bother with acks etc. for time being let prepared_fragment = message_preparer .prepare_chunk_for_sending(message_chunk, topology, &self.ack_key, &recipient) + .await .unwrap(); console_warn!("packet is going to have round trip time of {:?}, but we're not going to do anything for acks anyway ", prepared_fragment.total_delay); - socket_messages.push(( - prepared_fragment.first_hop_address, - prepared_fragment.sphinx_packet, - )); + mix_packets.push(prepared_fragment.mix_packet); } self.gateway_client .as_mut() .unwrap() - .batch_send_sphinx_packets(socket_messages) + .batch_send_mix_packets(mix_packets) .await .unwrap(); self @@ -233,27 +233,24 @@ impl NymClient { } pub fn get_full_topology_json(&self) -> Promise { - let directory_client_config = directory_client::Config::new(self.directory_server.clone()); - let directory_client = directory_client::Client::new(directory_client_config); + let validator_client_config = validator_client::Config::new(self.validator_server.clone()); + let validator_client = validator_client::Client::new(validator_client_config); future_to_promise(async move { - let topology = &directory_client.get_topology().await.unwrap(); + let topology = &validator_client.get_active_topology().await.unwrap(); Ok(JsValue::from_serde(&topology).unwrap()) }) } pub(crate) async fn get_nym_topology(&self) -> NymTopology { - let directory_client_config = directory_client::Config::new(self.directory_server.clone()); - let directory_client = directory_client::Client::new(directory_client_config); + let validator_client_config = validator_client::Config::new(self.validator_server.clone()); + let validator_client = validator_client::Client::new(validator_client_config); - match directory_client.get_topology().await { + match validator_client.get_active_topology().await { Err(err) => panic!(err), Ok(topology) => { - let nym_topology: NymTopology = topology - .try_into() - .ok() - .expect("this is not a NYM topology!"); - let version = built_info::PKG_VERSION; - nym_topology.filter_system_version(&version) + let nym_topology: NymTopology = topology.into(); + let version = env!("CARGO_PKG_VERSION"); + nym_topology.filter_system_version(version) } } } diff --git a/clients/webassembly/src/lib.rs b/clients/webassembly/src/lib.rs index da772b60c9d..3c9a70fcd93 100644 --- a/clients/webassembly/src/lib.rs +++ b/clients/webassembly/src/lib.rs @@ -14,7 +14,6 @@ use wasm_bindgen::prelude::*; -pub(crate) mod built_info; #[cfg(target_arch = "wasm32")] mod client; diff --git a/common/client-libs/directory-client/models/src/presence/coconodes.rs b/common/client-libs/directory-client/models/src/presence/coconodes.rs deleted file mode 100644 index 7d1d74a4c61..00000000000 --- a/common/client-libs/directory-client/models/src/presence/coconodes.rs +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -use crypto::asymmetric::identity; -use serde::{Deserialize, Serialize}; -use std::convert::TryInto; - -#[derive(Debug)] -pub enum ConversionError { - InvalidKeyError, -} - -impl From<identity::SignatureError> for ConversionError { - fn from(_: identity::SignatureError) -> Self { - ConversionError::InvalidKeyError - } -} - -#[derive(Clone, Debug, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct CocoPresence { - pub location: String, - pub host: String, - pub pub_key: String, - pub last_seen: u64, - pub version: String, -} - -impl TryInto<topology::coco::Node> for CocoPresence { - type Error = ConversionError; - - fn try_into(self) -> Result<topology::coco::Node, Self::Error> { - Ok(topology::coco::Node { - location: self.location, - host: self.host, - pub_key: identity::PublicKey::from_base58_string(self.pub_key)?, - last_seen: self.last_seen, - version: self.version, - }) - } -} diff --git a/common/client-libs/directory-client/models/src/presence/gateways.rs b/common/client-libs/directory-client/models/src/presence/gateways.rs deleted file mode 100644 index dfa7b4d9485..00000000000 --- a/common/client-libs/directory-client/models/src/presence/gateways.rs +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -use crypto::asymmetric::{encryption, identity}; -use serde::{Deserialize, Serialize}; -use std::convert::TryInto; -use std::io; -use std::net::ToSocketAddrs; - -#[derive(Debug)] -pub enum ConversionError { - InvalidKeyError, - InvalidAddress(io::Error), -} - -impl From<identity::SignatureError> for ConversionError { - fn from(_: identity::SignatureError) -> Self { - ConversionError::InvalidKeyError - } -} - -impl From<encryption::EncryptionKeyError> for ConversionError { - fn from(_: encryption::EncryptionKeyError) -> Self { - ConversionError::InvalidKeyError - } -} - -impl From<io::Error> for ConversionError { - fn from(err: io::Error) -> Self { - ConversionError::InvalidAddress(err) - } -} - -#[derive(Clone, Debug, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct GatewayPresence { - pub location: String, - pub client_listener: String, - pub mixnet_listener: String, - pub identity_key: String, - pub sphinx_key: String, - pub last_seen: u64, - pub version: String, -} - -impl TryInto<topology::gateway::Node> for GatewayPresence { - type Error = ConversionError; - - fn try_into(self) -> Result<topology::gateway::Node, Self::Error> { - let resolved_mix_hostname = self.mixnet_listener.to_socket_addrs()?.next(); - if resolved_mix_hostname.is_none() { - return Err(ConversionError::InvalidAddress(io::Error::new( - io::ErrorKind::Other, - "no valid socket address", - ))); - } - - Ok(topology::gateway::Node { - location: self.location, - client_listener: self.client_listener, - mixnet_listener: resolved_mix_hostname.unwrap(), - identity_key: identity::PublicKey::from_base58_string(self.identity_key)?, - sphinx_key: encryption::PublicKey::from_base58_string(self.sphinx_key)?, - last_seen: self.last_seen, - version: self.version, - }) - } -} diff --git a/common/client-libs/directory-client/models/src/presence/mixnodes.rs b/common/client-libs/directory-client/models/src/presence/mixnodes.rs deleted file mode 100644 index 9d44ae07c56..00000000000 --- a/common/client-libs/directory-client/models/src/presence/mixnodes.rs +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -use crypto::asymmetric::encryption; -use serde::{Deserialize, Serialize}; -use std::convert::TryInto; -use std::io; -use std::net::ToSocketAddrs; - -#[derive(Debug)] -pub enum ConversionError { - InvalidKeyError, - InvalidAddress(io::Error), -} - -impl From<encryption::EncryptionKeyError> for ConversionError { - fn from(_: encryption::EncryptionKeyError) -> Self { - ConversionError::InvalidKeyError - } -} - -impl From<io::Error> for ConversionError { - fn from(err: io::Error) -> Self { - ConversionError::InvalidAddress(err) - } -} - -#[derive(Clone, Debug, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct MixNodePresence { - pub location: String, - pub host: String, - pub pub_key: String, - pub layer: u64, - pub last_seen: u64, - pub version: String, -} - -impl TryInto<topology::mix::Node> for MixNodePresence { - type Error = ConversionError; - - fn try_into(self) -> Result<topology::mix::Node, Self::Error> { - let resolved_hostname = self.host.to_socket_addrs()?.next(); - if resolved_hostname.is_none() { - return Err(ConversionError::InvalidAddress(io::Error::new( - io::ErrorKind::Other, - "no valid socket address", - ))); - } - - Ok(topology::mix::Node { - location: self.location, - host: resolved_hostname.unwrap(), - pub_key: encryption::PublicKey::from_base58_string(self.pub_key)?, - layer: self.layer, - last_seen: self.last_seen, - version: self.version, - }) - } -} diff --git a/common/client-libs/directory-client/models/src/presence/mod.rs b/common/client-libs/directory-client/models/src/presence/mod.rs deleted file mode 100644 index 1787da37a84..00000000000 --- a/common/client-libs/directory-client/models/src/presence/mod.rs +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -pub mod coconodes; -pub mod gateways; -pub mod mixnodes; -pub mod providers; -pub mod topology; - -pub use self::topology::{Topology, TopologyConversionError}; diff --git a/common/client-libs/directory-client/models/src/presence/topology.rs b/common/client-libs/directory-client/models/src/presence/topology.rs deleted file mode 100644 index 98d8219d187..00000000000 --- a/common/client-libs/directory-client/models/src/presence/topology.rs +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -use super::{coconodes, gateways, mixnodes, providers}; -use serde::{Deserialize, Serialize}; -use std::convert::TryInto; -use topology::{MixLayer, NymTopology}; - -#[derive(Debug)] -pub enum TopologyConversionError { - CocoError(self::coconodes::ConversionError), - GatewayError(self::gateways::ConversionError), - MixError(self::mixnodes::ConversionError), -} - -impl From<self::coconodes::ConversionError> for TopologyConversionError { - fn from(err: self::coconodes::ConversionError) -> Self { - TopologyConversionError::CocoError(err) - } -} - -impl From<self::gateways::ConversionError> for TopologyConversionError { - fn from(err: self::gateways::ConversionError) -> Self { - TopologyConversionError::GatewayError(err) - } -} - -impl From<self::mixnodes::ConversionError> for TopologyConversionError { - fn from(err: self::mixnodes::ConversionError) -> Self { - TopologyConversionError::MixError(err) - } -} - -// Topology shows us the current state of the overall Nym network -#[derive(Clone, Debug, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct Topology { - pub coco_nodes: Vec<coconodes::CocoPresence>, - pub mix_nodes: Vec<mixnodes::MixNodePresence>, - pub mix_provider_nodes: Vec<providers::MixProviderPresence>, - pub gateway_nodes: Vec<gateways::GatewayPresence>, -} - -impl TryInto<NymTopology> for Topology { - type Error = TopologyConversionError; - - fn try_into(self) -> Result<NymTopology, TopologyConversionError> { - use std::collections::HashMap; - - let mut coco_nodes = Vec::with_capacity(self.coco_nodes.len()); - for coco in self.coco_nodes.into_iter() { - coco_nodes.push(coco.try_into()?) - } - - let mut mixes = HashMap::new(); - for mix in self.mix_nodes.into_iter() { - let layer = mix.layer as MixLayer; - let layer_entry = mixes.entry(layer).or_insert(Vec::new()); - layer_entry.push(mix.try_into()?) - } - - let mut gateways = Vec::with_capacity(self.gateway_nodes.len()); - for gate in self.gateway_nodes.into_iter() { - gateways.push(gate.try_into()?) - } - - Ok(NymTopology::new(coco_nodes, mixes, gateways)) - } -} - -#[cfg(test)] -mod converting_mixnode_presence_into_topology_mixnode { - use super::*; - - #[test] - fn it_returns_error_on_unresolvable_hostname() { - use topology::mix; - - let unresolvable_hostname = "foomp.foomp.foomp:1234"; - - let mix_presence = mixnodes::MixNodePresence { - location: "".to_string(), - host: unresolvable_hostname.to_string(), - pub_key: "BnLYqQjb8K6TmW5oFdNZrUTocGxa3rgzBvapQrf8XUbF".to_string(), - layer: 0, - last_seen: 0, - version: "".to_string(), - }; - - let result: Result<mix::Node, self::mixnodes::ConversionError> = mix_presence.try_into(); - assert!(result.is_err()); - } - - #[test] - #[cfg_attr(feature = "offline-test", ignore)] - fn it_returns_resolved_ip_on_resolvable_hostname() { - let resolvable_hostname = "nymtech.net:1234"; - - let mix_presence = mixnodes::MixNodePresence { - location: "".to_string(), - host: resolvable_hostname.to_string(), - pub_key: "BnLYqQjb8K6TmW5oFdNZrUTocGxa3rgzBvapQrf8XUbF".to_string(), - layer: 0, - last_seen: 0, - version: "".to_string(), - }; - - let result: Result<topology::mix::Node, self::mixnodes::ConversionError> = - mix_presence.try_into(); - result.unwrap(); - // assert!(result.is_ok()) - } -} diff --git a/common/client-libs/directory-client/src/lib.rs b/common/client-libs/directory-client/src/lib.rs deleted file mode 100644 index 2540157870a..00000000000 --- a/common/client-libs/directory-client/src/lib.rs +++ /dev/null @@ -1,148 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -use crate::requests::health_check_get::Request as HealthCheckRequest; -use crate::requests::metrics_mixes_get::Request as MetricsMixRequest; -use crate::requests::metrics_mixes_post::Request as MetricsMixPost; -use crate::requests::presence_coconodes_post::Request as PresenceCocoNodesPost; -use crate::requests::presence_gateways_post::Request as PresenceGatewayPost; -use crate::requests::presence_mixnodes_post::Request as PresenceMixNodesPost; -use crate::requests::presence_providers_post::Request as PresenceProvidersPost; -use crate::requests::presence_topology_get::Request as PresenceTopologyRequest; -use directory_client_models::metrics::{MixMetric, PersistedMixMetric}; -use directory_client_models::presence::{ - coconodes::CocoPresence, gateways::GatewayPresence, mixnodes::MixNodePresence, - providers::MixProviderPresence, -}; -use requests::{health_check_get::HealthCheckResponse, DirectoryGetRequest, DirectoryPostRequest}; - -pub use directory_client_models::{ - metrics, - presence::{self, Topology}, -}; - -pub mod requests; - -pub struct Config { - pub base_url: String, -} - -impl Config { - pub fn new(base_url: String) -> Self { - Config { base_url } - } -} - -pub trait DirectoryClient { - fn new(config: Config) -> Self; -} - -pub struct Client { - base_url: String, - reqwest_client: reqwest::Client, -} - -impl DirectoryClient for Client { - fn new(config: Config) -> Client { - let reqwest_client = reqwest::Client::new(); - Client { - base_url: config.base_url, - reqwest_client, - } - } -} - -impl Client { - async fn post<R: DirectoryPostRequest>( - &self, - request: R, - ) -> reqwest::Result<reqwest::Response> { - self.reqwest_client - .post(&request.url()) - .json(request.json_payload()) - .send() - .await - } - - async fn get<R: DirectoryGetRequest>(&self, request: R) -> reqwest::Result<R::JSONResponse> { - self.reqwest_client - .get(&request.url()) - .send() - .await? - .json() - .await - } - - pub async fn get_healthcheck(&self) -> reqwest::Result<HealthCheckResponse> { - let req = HealthCheckRequest::new(&self.base_url); - self.get(req).await - } - - pub async fn post_mix_metrics(&self, metrics: MixMetric) -> reqwest::Result<reqwest::Response> { - let req = MetricsMixPost::new(&self.base_url, metrics); - self.post(req).await - } - - pub async fn get_mix_metrics(&self) -> reqwest::Result<Vec<PersistedMixMetric>> { - let req = MetricsMixRequest::new(&self.base_url); - self.get(req).await - } - - pub async fn post_coconode_presence( - &self, - presence: CocoPresence, - ) -> reqwest::Result<reqwest::Response> { - let req = PresenceCocoNodesPost::new(&self.base_url, presence); - self.post(req).await - } - - pub async fn post_gateway_presence( - &self, - presence: GatewayPresence, - ) -> reqwest::Result<reqwest::Response> { - let req = PresenceGatewayPost::new(&self.base_url, presence); - self.post(req).await - } - - pub async fn post_mixnode_presence( - &self, - presence: MixNodePresence, - ) -> reqwest::Result<reqwest::Response> { - let req = PresenceMixNodesPost::new(&self.base_url, presence); - self.post(req).await - } - - // this should be soft-deprecated as the whole concept of provider will - // be removed in the next topology rework - pub async fn post_provider_presence( - &self, - presence: MixProviderPresence, - ) -> reqwest::Result<reqwest::Response> { - let req = PresenceProvidersPost::new(&self.base_url, presence); - self.post(req).await - } - - pub async fn get_topology(&self) -> reqwest::Result<Topology> { - let req = PresenceTopologyRequest::new(&self.base_url); - self.get(req).await - } -} - -#[cfg(test)] -pub(crate) fn client_test_fixture(base_url: &str) -> Client { - Client { - base_url: base_url.to_string(), - reqwest_client: reqwest::Client::new(), - } -} diff --git a/common/client-libs/directory-client/src/requests/health_check_get.rs b/common/client-libs/directory-client/src/requests/health_check_get.rs deleted file mode 100644 index 93fbe91336e..00000000000 --- a/common/client-libs/directory-client/src/requests/health_check_get.rs +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -use super::{DirectoryGetRequest, DirectoryRequest}; -use serde::{Deserialize, Serialize}; - -const PATH: &str = "/api/healthcheck"; - -#[derive(Deserialize, Serialize)] -pub struct HealthCheckResponse { - pub ok: bool, -} - -pub struct Request { - base_url: String, - path: String, -} - -impl DirectoryRequest for Request { - fn url(&self) -> String { - format!("{}{}", self.base_url, self.path) - } -} - -impl DirectoryGetRequest for Request { - type JSONResponse = HealthCheckResponse; - - fn new(base_url: &str) -> Self { - Request { - base_url: base_url.to_string(), - path: PATH.to_string(), - } - } -} - -#[cfg(test)] -mod healthcheck_requests { - use crate::client_test_fixture; - use mockito::mock; - - #[cfg(test)] - mod on_a_400_status { - use super::*; - - #[tokio::test] - async fn it_returns_an_error() { - let _m = mock("GET", "/api/healthcheck").with_status(400).create(); - let client = client_test_fixture(&mockito::server_url()); - let res = client.get_healthcheck().await; - assert!(res.is_err()); - _m.assert(); - } - } - - #[cfg(test)] - mod on_a_200 { - use super::*; - - #[tokio::test] - async fn it_returns_a_response_with_200_status() { - let json = r#"{ - "ok": true - }"#; - let _m = mock("GET", "/api/healthcheck") - .with_status(200) - .with_body(json) - .create(); - let client = client_test_fixture(&mockito::server_url()); - let res = client.get_healthcheck().await; - assert!(res.unwrap().ok); - _m.assert(); - } - } -} diff --git a/common/client-libs/directory-client/src/requests/mod.rs b/common/client-libs/directory-client/src/requests/mod.rs deleted file mode 100644 index 39b712dff97..00000000000 --- a/common/client-libs/directory-client/src/requests/mod.rs +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -pub mod health_check_get; -pub mod metrics_mixes_get; -pub mod metrics_mixes_post; -pub mod presence_coconodes_post; -pub mod presence_gateways_post; -pub mod presence_mixnodes_post; -pub mod presence_providers_post; -pub mod presence_topology_get; - -use serde::{de::DeserializeOwned, Serialize}; - -pub(crate) trait DirectoryRequest { - fn url(&self) -> String; -} - -pub(crate) trait DirectoryGetRequest: DirectoryRequest { - // perhaps the name of this is not the best because it's technically not a JSON, - // but something that can be deserialised from JSON. - // I'm open to all suggestions on how to rename it - type JSONResponse: DeserializeOwned; - - fn new(base_url: &str) -> Self; -} - -pub(crate) trait DirectoryPostRequest: DirectoryRequest { - // Similarly this, it's something that can be serialized into a JSON - type Payload: Serialize + ?Sized; - - fn new(base_url: &str, payload: Self::Payload) -> Self; - fn json_payload(&self) -> &Self::Payload; -} diff --git a/common/client-libs/directory-client/src/requests/presence_coconodes_post.rs b/common/client-libs/directory-client/src/requests/presence_coconodes_post.rs deleted file mode 100644 index 71832cbed59..00000000000 --- a/common/client-libs/directory-client/src/requests/presence_coconodes_post.rs +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -use super::{DirectoryPostRequest, DirectoryRequest}; -use crate::presence::coconodes::CocoPresence; - -const PATH: &str = "/api/presence/coconodes"; - -pub struct Request { - base_url: String, - path: String, - payload: CocoPresence, -} - -impl DirectoryRequest for Request { - fn url(&self) -> String { - format!("{}{}", self.base_url, self.path) - } -} - -impl DirectoryPostRequest for Request { - type Payload = CocoPresence; - fn json_payload(&self) -> &CocoPresence { - &self.payload - } - - fn new(base_url: &str, payload: Self::Payload) -> Self { - Request { - base_url: base_url.to_string(), - path: PATH.to_string(), - payload, - } - } -} - -#[cfg(test)] -mod presence_coconodes_post_request { - use super::*; - use crate::client_test_fixture; - use mockito::mock; - - #[cfg(test)] - mod on_a_400_status { - use super::*; - - #[tokio::test] - async fn it_returns_an_error() { - let _m = mock("POST", PATH).with_status(400).create(); - let client = client_test_fixture(&mockito::server_url()); - let presence = fixtures::new_presence(); - let result = client.post_coconode_presence(presence).await; - assert_eq!(400, result.unwrap().status()); - _m.assert(); - } - } - - #[cfg(test)] - mod on_a_200 { - use super::*; - #[tokio::test] - async fn it_returns_a_response_with_201() { - let json = r#"{ - "ok": true - }"#; - let _m = mock("POST", PATH).with_status(201).with_body(json).create(); - let client = client_test_fixture(&mockito::server_url()); - let presence = fixtures::new_presence(); - let result = client.post_coconode_presence(presence).await; - assert!(result.is_ok()); - _m.assert(); - } - } - - #[cfg(test)] - mod fixtures { - use crate::presence::coconodes::CocoPresence; - - pub fn new_presence() -> CocoPresence { - CocoPresence { - location: "foomp".to_string(), - host: "foo.com".to_string(), - pub_key: "abc".to_string(), - last_seen: 666, - version: "0.2.0".to_string(), - } - } - } -} diff --git a/common/client-libs/directory-client/src/requests/presence_gateways_post.rs b/common/client-libs/directory-client/src/requests/presence_gateways_post.rs deleted file mode 100644 index bd12a83f6d1..00000000000 --- a/common/client-libs/directory-client/src/requests/presence_gateways_post.rs +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -use super::{DirectoryPostRequest, DirectoryRequest}; -use crate::presence::gateways::GatewayPresence; - -const PATH: &str = "/api/presence/gateways"; - -pub struct Request { - base_url: String, - path: String, - payload: GatewayPresence, -} - -impl DirectoryRequest for Request { - fn url(&self) -> String { - format!("{}{}", self.base_url, self.path) - } -} - -impl DirectoryPostRequest for Request { - type Payload = GatewayPresence; - fn json_payload(&self) -> &GatewayPresence { - &self.payload - } - - fn new(base_url: &str, payload: Self::Payload) -> Self { - Request { - base_url: base_url.to_string(), - path: PATH.to_string(), - payload, - } - } -} - -#[cfg(test)] -mod presence_gateways_post_request { - use super::*; - use crate::client_test_fixture; - use mockito::mock; - - #[cfg(test)] - mod on_a_400_status { - use super::*; - - #[tokio::test] - async fn it_returns_an_error() { - let _m = mock("POST", PATH).with_status(400).create(); - let client = client_test_fixture(&mockito::server_url()); - let presence = fixtures::new_presence(); - let result = client.post_gateway_presence(presence).await; - assert_eq!(400, result.unwrap().status()); - _m.assert(); - } - } - - #[cfg(test)] - mod on_a_200 { - use super::*; - #[tokio::test] - async fn it_returns_a_response_with_201() { - let json = r#"{ - "ok": true - }"#; - let _m = mock("POST", PATH).with_status(201).with_body(json).create(); - let client = client_test_fixture(&mockito::server_url()); - let presence = fixtures::new_presence(); - let result = client.post_gateway_presence(presence).await; - assert!(result.is_ok()); - _m.assert(); - } - } - #[cfg(test)] - mod fixtures { - use crate::presence::gateways::GatewayPresence; - - pub fn new_presence() -> GatewayPresence { - GatewayPresence { - location: "foomp".to_string(), - client_listener: "foo.com".to_string(), - mixnet_listener: "foo.com".to_string(), - identity_key: "def".to_string(), - sphinx_key: "abc".to_string(), - last_seen: 0, - version: "0.1.0".to_string(), - } - } - } -} diff --git a/common/client-libs/directory-client/src/requests/presence_mixnodes_post.rs b/common/client-libs/directory-client/src/requests/presence_mixnodes_post.rs deleted file mode 100644 index 6a3af4eb009..00000000000 --- a/common/client-libs/directory-client/src/requests/presence_mixnodes_post.rs +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -use super::{DirectoryPostRequest, DirectoryRequest}; -use crate::presence::mixnodes::MixNodePresence; - -const PATH: &str = "/api/presence/mixnodes"; - -pub struct Request { - base_url: String, - path: String, - payload: MixNodePresence, -} - -impl DirectoryRequest for Request { - fn url(&self) -> String { - format!("{}{}", self.base_url, self.path) - } -} - -impl DirectoryPostRequest for Request { - type Payload = MixNodePresence; - fn json_payload(&self) -> &MixNodePresence { - &self.payload - } - - fn new(base_url: &str, payload: Self::Payload) -> Self { - Request { - base_url: base_url.to_string(), - path: PATH.to_string(), - payload, - } - } -} - -#[cfg(test)] -mod presence_mixnodes_post_request { - use super::*; - use crate::client_test_fixture; - use mockito::mock; - - #[cfg(test)] - mod on_a_400_status { - use super::*; - - #[tokio::test] - async fn it_returns_an_error() { - let _m = mock("POST", PATH).with_status(400).create(); - let client = client_test_fixture(&mockito::server_url()); - let presence = fixtures::new_presence(); - let result = client.post_mixnode_presence(presence).await; - assert_eq!(400, result.unwrap().status()); - _m.assert(); - } - } - - #[cfg(test)] - mod on_a_200 { - use super::*; - #[tokio::test] - async fn it_returns_a_response_with_201() { - let json = r#"{ - "ok": true - }"#; - let _m = mock("POST", PATH).with_status(201).with_body(json).create(); - let client = client_test_fixture(&mockito::server_url()); - let presence = fixtures::new_presence(); - let result = client.post_mixnode_presence(presence).await; - assert!(result.is_ok()); - _m.assert(); - } - } - - #[cfg(test)] - mod fixtures { - use crate::presence::mixnodes::MixNodePresence; - - pub fn new_presence() -> MixNodePresence { - MixNodePresence { - location: "foomp".to_string(), - host: "foo.com".to_string(), - pub_key: "abc".to_string(), - layer: 1, - last_seen: 0, - version: "0.1.0".to_string(), - } - } - } -} diff --git a/common/client-libs/directory-client/src/requests/presence_providers_post.rs b/common/client-libs/directory-client/src/requests/presence_providers_post.rs deleted file mode 100644 index c8583596dba..00000000000 --- a/common/client-libs/directory-client/src/requests/presence_providers_post.rs +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -use super::{DirectoryPostRequest, DirectoryRequest}; -use crate::presence::providers::MixProviderPresence; - -const PATH: &str = "/api/presence/mixproviders"; - -pub struct Request { - base_url: String, - path: String, - payload: MixProviderPresence, -} - -impl DirectoryRequest for Request { - fn url(&self) -> String { - format!("{}{}", self.base_url, self.path) - } -} - -impl DirectoryPostRequest for Request { - type Payload = MixProviderPresence; - fn json_payload(&self) -> &MixProviderPresence { - &self.payload - } - - fn new(base_url: &str, payload: Self::Payload) -> Self { - Request { - base_url: base_url.to_string(), - path: PATH.to_string(), - payload, - } - } -} - -#[cfg(test)] -mod presence_providers_post_request { - use super::*; - use crate::client_test_fixture; - use mockito::mock; - - #[cfg(test)] - mod on_a_400_status { - use super::*; - - #[tokio::test] - async fn it_returns_an_error() { - let _m = mock("POST", PATH).with_status(400).create(); - let client = client_test_fixture(&mockito::server_url()); - let presence = fixtures::new_presence(); - let result = client.post_provider_presence(presence).await; - assert_eq!(400, result.unwrap().status()); - _m.assert(); - } - } - - #[cfg(test)] - mod on_a_200 { - use super::*; - #[tokio::test] - async fn it_returns_a_response_with_201() { - let json = r#"{ - "ok": true - }"#; - let _m = mock("POST", PATH).with_status(201).with_body(json).create(); - let client = client_test_fixture(&mockito::server_url()); - let presence = fixtures::new_presence(); - let result = client.post_provider_presence(presence).await; - assert!(result.is_ok()); - _m.assert(); - } - } - #[cfg(test)] - mod fixtures { - use crate::presence::providers::MixProviderPresence; - - pub fn new_presence() -> MixProviderPresence { - MixProviderPresence { - location: "foomp".to_string(), - client_listener: "foo.com".to_string(), - mixnet_listener: "foo.com".to_string(), - pub_key: "abc".to_string(), - registered_clients: vec![], - last_seen: 0, - version: "0.1.0".to_string(), - } - } - } -} diff --git a/common/client-libs/directory-client/src/requests/presence_topology_get.rs b/common/client-libs/directory-client/src/requests/presence_topology_get.rs deleted file mode 100644 index ff44fb9bfb4..00000000000 --- a/common/client-libs/directory-client/src/requests/presence_topology_get.rs +++ /dev/null @@ -1,248 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -use super::{DirectoryGetRequest, DirectoryRequest}; -use crate::presence::Topology; - -const PATH: &str = "/api/presence/topology"; - -pub struct Request { - base_url: String, - path: String, -} - -impl DirectoryRequest for Request { - fn url(&self) -> String { - format!("{}{}", self.base_url, self.path) - } -} - -impl DirectoryGetRequest for Request { - type JSONResponse = Topology; - - fn new(base_url: &str) -> Self { - Request { - base_url: base_url.to_string(), - path: PATH.to_string(), - } - } -} - -#[cfg(test)] -mod topology_requests { - use super::*; - use crate::client_test_fixture; - use mockito::mock; - - #[cfg(test)] - mod on_a_400_status { - use super::*; - - #[tokio::test] - async fn it_returns_an_error() { - let _m = mock("GET", PATH) - .with_status(400) - .with_body("bad body") - .create(); - let client = client_test_fixture(&mockito::server_url()); - let result = client.get_topology().await; - assert!(result.is_err()); - _m.assert(); - } - } - - #[cfg(test)] - mod on_a_200 { - use super::*; - - #[tokio::test] - async fn it_returns_a_response_with_200_status_and_a_correct_topology() { - let json = fixtures::topology_response_json(); - let _m = mock("GET", PATH).with_status(200).with_body(json).create(); - let client = client_test_fixture(&mockito::server_url()); - let result = client.get_topology().await; - assert_eq!( - 1_575_915_097_085_539_300, - result.unwrap().coco_nodes.first().unwrap().last_seen - ); - _m.assert(); - } - } - - #[cfg(test)] - pub mod fixtures { - #[cfg(test)] - pub fn topology_response_json() -> String { - r#"{ - "cocoNodes": [ - { - "location": "unknown", - "host": "3.8.244.109:4000", - "pubKey": "AAAAAAAAAAEKwAECSqKy8I8KkSYIBSctxRBRxuR61PpAOwK0UQtkeuPRdwusAyaoBbvv1IBWyMEhvbgT4CtgUnGfYH2s06CIJ09lWWvQ0Jkgthq12mG73H9QSTNM8RITlF1X5ax9BV0EK34M5dUncn1uEYzJzcbaLjUarf2bqoy906dtQpppUWDRLJI6ycw7rKKJ4ZNUhgi4KAEGBsSgLqc0zDKs0rArwouZyz4ofoWnY68mdJKrVy6Zqz83DSdc7B2hqqkHX_Bfeb4SwAEFuhRpy4HfcuxwcRI9sIWMo_LVmbk19g1gfMRlBrmZqoEQL6rDApVLZ9eMp-5IQK8WLlZpWf4Zjy7kZolARAyp_rHUQkH4PrDjgoPrKbm6qK_iejYpL7qx28Q3VeInMpwMIMaSbbW9y36sEVtGc2I0Iu5vS0sp8ESiVlQ5NaBz72deZ8oKJJ4IEPPHP99-b0UQX80fVIrNM88mMzKy0bHri9NFlmIG-e0G1cqmw_ry3XWGQkcr1M5RuNa6oX50w5QawAEVxd5FP5bE8bS4x54Csof11sQWUTwMp6Q7_3H7ZCTSlKSqujlOhmfqSHfGPO2sDIYPHDhDzjakZpKAZWWhn_hiR6DfPpomQ01ZYUhVKKSMxz7_VPjsQplP0bZXA2gfnkADUN8UQ0N9g_usIw73r4aZsOviMsRM8oByvsjVfUWc4_HTLSdnQyImFkHz9CiCmrIYL2dYQRePRatWggvBAyeRzntxI4jDqLKiBdi54ZlAKgV6MCRaJ7Bu7BtmLXrtK4sawAED3QYxuvOSZrbZdUr4yG-U9yVvJ9Klkf-5Mo4EYp3qTL2KBB6_LrZepjAQqp486YkZ03mTIezcsZ48EboXVTWKBZ3QnTI5tX-j4gGxQb7klOJc97qJkDxsvpz4F0ChgCUIZhpIItWHia7_R3Gi-b5siLIdQdUho9isn3kiDGm6t0NED2Bgy3ZxxQwzqsBZm4kPr2_fPX4YyvIoP9895YcGjZyE5iiRC_TE41RJmB1GZYdxegTMq3lNDllKgiqaiPgawAEJASDkmZHTwlg9YOev5OWpQD-FnhPkqVNo_QcDyRu9eoGcWSGFp2sYqjG2SpmiXq0VNnAO7AcKxRzDFu7TjfhlU3Kt0uTKIcrWVU1zFNbJNMjYEq90pp50nowwx8INz20IXET2ZNX6kIXYFCsEvPLZFlG2OoL6xg3uQS1qMl3lIS_VxdO_JfVe0rT65WsJ_P4Nkc1jYiuNPHY6d_iFO0BVYqX0sOCX73GC_TT13BR0jnPwDAVw0rGtYHsXBb8TKOsawAEZIClauuT1V3qOZnb7uRZhFXO-PKTxgc1LCzJt2ChOrMZaBpjlkf3IPpJ2UF4JH4kGaDeBf2k_S-FLAs3drK21efbi5P6_a4QTxAiiRimXGoQIyvOg462s6kP_ZRFufo8YYQHS4olaOeqU4564dNskg_uBPsFMz_2GNOhmn_15cJqP1jfkyD49Z16GTS5YLHgVl9bJKqyvLuypsToLbt1BJzipEP0L2OohuRm-_MvqvwwWKyjNQsubgee1K728d9AawAEBkGggcNVCtXyhoSqi3_w0tVxtkAYeud8sBeAtZHGs06me_QL8co0MFLlO-zdkUb4ZBq08rFEbgLOma8_3whleM8NIPaHNISp1q3IsIhB5zdXcZoGsqLixODBFHtID3YEHAlr4f9T_yh11yJ95xGCl_6Y37hpwLQVGyrfSfccM24mVFqnV3TT5Wdq3ile-jesUx1Q2G1yK_xVqc6itmk-kDuBjyZgzYi1-jsIXAjnhM9G7t8J_Bv5yGGZhLK2dCzM=", - "type": "validator", - "lastSeen": 1575915097085539300, - "version": "0.1.0" - }, - { - "location": "unknown", - "host": "3.9.129.61:4000", - "pubKey": "AAAAAAAAAAMKwAECSqKy8I8KkSYIBSctxRBRxuR61PpAOwK0UQtkeuPRdwusAyaoBbvv1IBWyMEhvbgT4CtgUnGfYH2s06CIJ09lWWvQ0Jkgthq12mG73H9QSTNM8RITlF1X5ax9BV0EK34M5dUncn1uEYzJzcbaLjUarf2bqoy906dtQpppUWDRLJI6ycw7rKKJ4ZNUhgi4KAEGBsSgLqc0zDKs0rArwouZyz4ofoWnY68mdJKrVy6Zqz83DSdc7B2hqqkHX_Bfeb4SwAEEv6RMevAQmLGkeK0uJKnMPPAtm8GgXjWSQijYdnxlPh5SJSNeJUbPZKWFFWdk8yIFXKa8jnzETtdGFKgUUt5AVUDpTBmEdwaHCzlFhXrttshy0V5OhPUlV8cGABmxbagMYm0bFPg0r-snSkrB9YG6wqJYQVeIMOCGYCPbHmDA8R_0-h8VkRKWs1d9KvQOK4kShqgZtYN71KJW8uDE4q2jsGDVvxFt1AgmU9b93xsXF17KrpZy5WxlLZ73HtnTD_oawAED4vd_rK-Kx_n8x_OdDiiEOPUlYDlDCQUqenU9XHKH3B6ijfkJ368wd3LDDVStjDwNORrAyUSw_VlSNUpd1XLC8d17gTaIq5ZI2fWuwwZaoN1JCsYU8fQ6USgtIehQX7IPP8EkFuNmuCBCmpr4schtYniGe9J8Q4dsV-TYPr2uLJkdx1r7luzF--I22k7NfQQM14QDci_0kgrgmZ54CJGkjXyOhCppBXg3fqLC6aFvT3ZocfiiXBJt0huGgPMDtYsawAECLh8KUdNsDolERwJ8v04bS5jI_KKf7uUnCHWuCELwbJSUI3OK1ufS1qSpauvSzVQSbrhEzrEfwQn4VtxQxJlX4UdDU-R-hafiZvVC6DLLAbuORBAC3FScn9W58CnezH4DvCp_w7nftDfdxeuungbZT9XaxS3iNC6PnFsWF6WM3DxMwrzOrFe6wEEoTSPe1mcUDrtwM5UksIvJr6MBRAXrdl0IdBTQr7cLwKe_KYi4siwdjfJEJtOh7oxQBxBg2UkawAEJAPZK2Gg2MQwpxdDT24lNQHF7FVfkO_LuhJwn0RbwNDSVeA4P6-tWL5TkCpqr8xYHfwQ6Z3ILfpGCZr8PspwIoRzqZHQ16f8Pq9xnr0hLEI9BOQU0FS2EtuyPgju5iwsAJAfehUzu6kNLphuLGsXoIZdXDG5mbylwh9JzAVXTwgaR0hNqyXVJxgbt7jcYaSEBFcMGV-hjXyVVNzBleE-G9o_noI_KWU4Ce7K-qOMcewMKfy_VEw-gVaD6dHz6AMoawAEE9XuOLwRttvKybAssZ9gsK-_YRUwuFOeRDIr3NX___9bx6pCc18adCIlH_8EJWFwXZ05ZpNNE88mYx7ZQ3aqaArZJRoWeZeKhqH_s05V10xbzkYX71G5cqz--8vr9ZlQRb2BeETF_Tdq_PLk7qbT8WTGIoq7ZwyDRQTgzvkCgyzj_hBLh2o7sSVNgUo38SFUTMn7YtvVFYlSrTDE3WKE-T-nh5SWdDBxgDTc3Bw8JpzNH-WkoJ4Lim7sB4Op1gEUawAEW4-kenlffwsNr_3b3aV0YuusLpxB03sxPzQ5B0CWNiVtbja1Z4tWhKGUUrdq_eUgMV0y5Of-BqNi5FspAQnhJBFSSxtOzRGV1h3qyUTksfZyed9z8zPI-ZPP9XXm7hYgJgDz_kxte-NfS9UG9q5AZetHUN4kGxXutjjzfUQZ9yTvhBKgKgTI2Dp_R_jZrWQ8F1BoWzIJzjddT1K2MvCQEkARYw08isbOeFmCwgVUcjxYZO45WyOmLQA7QJRL9WvA=", - "type": "validator", - "lastSeen": 1575915097388409000, - "version": "0.1.0" - }, - { - "location": "unknown", - "host": "3.9.222.1:4000", - "pubKey": "AAAAAAAAAAQKwAECSqKy8I8KkSYIBSctxRBRxuR61PpAOwK0UQtkeuPRdwusAyaoBbvv1IBWyMEhvbgT4CtgUnGfYH2s06CIJ09lWWvQ0Jkgthq12mG73H9QSTNM8RITlF1X5ax9BV0EK34M5dUncn1uEYzJzcbaLjUarf2bqoy906dtQpppUWDRLJI6ycw7rKKJ4ZNUhgi4KAEGBsSgLqc0zDKs0rArwouZyz4ofoWnY68mdJKrVy6Zqz83DSdc7B2hqqkHX_Bfeb4SwAECh9xcxpjOp1r7kiNIgrI9GgAlvXwgHkTchOxUiyOzTq6FDWdGN64KiC3NDeyGTg8FmzvGzS3jREeJqOdr4G9ZGtWkauAITgLFiH62t-YntRslhr8_1shxlmzKiNKJN_QFflEq79pZIlWtp3N8LIHMvXRtl-zt2DMze4s02XDmEkviyVE4CkQUDtCc-2MfPT4JcmEFqtFIxjrXn18SbYg3c6XUQHsGIkuDrKuCTRlpC8kvmM0uVoIeWdmwDlZk4jUawAEJhRwK5ozjqIWRP1bFzBPS9VhaJnfKU9PeFYtN5beiAHrYr2ylIB3yDfmAQUdKDowDUm5nfJATejEjEnrTGxh70QtfoNV391rSns3F71tBwY62KLaNr8qnVfeSFHV3FcQTMHHF_8mDb5_11Rj6aiMvW0y6eetHo7CDPMdEyDPmok_U2ZM5BzOUnwjT21HtnvcKxKKwHJ_QGfnAHPyDIhNOMgxJCrVazOidLCHeYGpyCLw1ipeTyKOQX0_ByB8dH6AawAEGV1GuF5SSlT67B1ityPJK2ZwXjeeKB4gGdCG3qRtWxLTZfGhVm7YAYm2f5tw_wrsJAZ9FubVhateGg0ZN67NxZtsvOOejXz6743f7ijnQopPgd_8pH-iVf6BEcSO8ZdcHxNRUTayzjVLs99bwMo2zaPevW4X4G_bN4mh---aPkdGYHwaiklzUhqJ-eqycrYAFyjyEXaPBXLQm1rpczqluNvnKbd8Q9LZWukgm7_uWv_HxufIvdWgoq8bAt78UU3oawAEP9VDehhqrQG5-WHMB66XVxo1TgMM8aVV0SwAq3lCRkpiFBz_9kw8T1F9Hx2AiNrEGT1QLbdMkpms1cG_5gBBahQofdt_NmUs1jfTFXY9iyMy1Q7A6ZYaLP8Z6q-orc1cKqySY-BJZQ_CpGFfXS0OVniFDQ6v78ytPK7K-yRgT1PxFgm3rZqrG0Tjbrpsg2PUL5S5fuXfMhUosP0uoLj0D1guWAR9Y7kfFBIXaTSFMoa8fghVBUTRNhK9f72a8SxQawAEOiv71taLjKqaaWQ_QjcDhWbvjG1EnsCyI0toNjGkcF19x4Vk-5NC96_4ioUGz404IC0XN03roRnibRT_78D9vZFVCWCqve9EjdF5TcApx03zIP4JT2g2q0MKIGgGrwt4Pz6LO6yOfMm7B8Yraps8IV-nP1w7K1m9XKP_FvH8egl5GHJe-_omlC2YyL_b28jMLENbxDFD-3KPjZFBhSLrRukX2PlayYTwEiTtokA2R9_11vQvJgP8KFEjGHg6zsAMawAEBn2H_hz2knb8ltnpEA5YSKVcV3nUtojkCNi_WUz7xUKd7efw1oI_lbnKrS7HkyC0JkQUZ1pCWUlSXNmgjMEhsn823a1LFzpV7rOv4vayYvvFX61hB9R78VjpyxJiYpDwRZLiUY3AK4WY8NqFDbjXR7rT4CkFHEf-VhSQQ8ZNvlpod1nmeVQVizHH9e7Tq7wsWz-LWEk3Hx6LmcrgDsL79LZYG9JXU5IdvG8RvLNx9cSwEI8yxcchpISAaot7UoYQ=", - "type": "validator", - "lastSeen": 1575915094734973000, - "version": "0.1.0" - }, - { - "location": "unknown", - "host": "3.9.102.214:4000", - "pubKey": "AAAAAAAAAAIKwAECSqKy8I8KkSYIBSctxRBRxuR61PpAOwK0UQtkeuPRdwusAyaoBbvv1IBWyMEhvbgT4CtgUnGfYH2s06CIJ09lWWvQ0Jkgthq12mG73H9QSTNM8RITlF1X5ax9BV0EK34M5dUncn1uEYzJzcbaLjUarf2bqoy906dtQpppUWDRLJI6ycw7rKKJ4ZNUhgi4KAEGBsSgLqc0zDKs0rArwouZyz4ofoWnY68mdJKrVy6Zqz83DSdc7B2hqqkHX_Bfeb4SwAEOVCUN3EwiVroS5-TOq2o7hYSxphK9X0G23N-IBZ0Tr1Rl8XEiJ-OEy0rqnAKwmhAZJWnx3u8oXqbZtOWIZmzQSpcoxhgwfhdmTZJCqT2RVzZyeFItX4sVeilEP3z2xdsJs8-a1kg6UZnx1s1BNLBo7eZrreZygWojPCIDBn03fSAflXoVc5PpY2CGy5MA_IgWgSYBHDdoZEtigp_amjqK7Us44Db20XpLxMXfbahiqa7WKNnMgi6Ca2H67VtaaD8awAEF3zbE1nZRAa7a8vbU25c80YBYJBaW8P6FwXQI-K0Xk5MakwYeMMnIrm6w6IS_0XAO5YlD453GLqnxY8H1BEnRpfOnT7PE4el9mJ8MuYQMo6R2up0lGCmYM0YA9FORjroM3ng69SEPfJPCReG7LfJkERl_m2U403ertDRBYrlqCDagDfyI500srBcMrjSvV3oNouyyx3yZUrjLQfbHhDteQFsYdmakJs8Y-Q9-5MXCcrz6Qa4xwv522Euv0CCxkHcawAEYjfsU_zDhUZA1ey1aquWXlFOnx-iEALqxW1slDYHwQ1M2SILc-v_E6i1doa5e_bAZHVezBHFAlaNAVedNyHFFJxYAqAK3hbzbvl2glw3Q6h_rTXElymloqtaqVFIJ-oUWWOHsZBmu8EDA-HzvGCiBa_GbRaVfh2lE4ObeMXoJrEm_5dbxxeEic2l3IYeIz40N9ooQQOkQcOZdY4AXWYCavIAwWEJBjLtptJgCLu9a_zM1S5GsiyJHpdDs46WbP0EawAEWZ-95Sf0YAHujxRNLdXgpqe0ZF8loVwzZfvyMvqaxF1Ug274BqHuY_c5NdPAzuqoTwjfEn8NKEoaNqlumM75FUYbaTd7mXvk4WVYWjVnkO40dfQjRB7DYhvj0LBlbndAJ4wJIA2ilPYgjZsXVbNNh3e2j3u9eABd0VaFMbSb8Sz5_31r8HzoWmPJs3HiyuyANGFUA6CvAnMN6K3b-D8BhFZU_nPUTgu80o8_n6LQt-XWbaC_mTHzsnOjzBiPJxlYawAEW3bmOEtStH2T8q7vMkhchImp2-hg9MFYGBmEe9sSByTn3NUf8eksqXOC1dUjHkXoZm298FgUYLkNdnlxWpf993j5mEDoFxjcTB7scBD7k6nu6Nrs_wK0-seS8gsHrx9UK7GwAsi10q82Cm4PFyAtrWjmy_d9WLHuZt6VIOKunTs8cf0FwNUiMcvZsruqIFJcP7iWxdiFdUkh65P_iCz1ZEjJcj2GEZoq4v3a3by1aizGPaaiKc1jd_T-XJg_YpncawAEWnstu5b9WiZv0x8xfsiMk6YRlU0Cnj5svxLLXz_8drvwAa--GBY5yH0ke2EM6udMEi2EPeFcGTe6Sjs0YEhSbY7Uad_8suD2J4tIWJSWBbiyvh7rSqzv57m7BlsVcHfQJn_wNH-UlC9xkx8vg-LwfN8_FlxvHNPTc7XZG3lKYbwpUWlZxAziOYT1VQ-2K2bQQBBMdix-ht_SjccL1Dc2dP5kDazQ8yZV_8xnyeheazEedWe63uutfkHlZRg9YwP8=", - "type": "validator", - "lastSeen": 1575915094967382800, - "version": "0.1.0" - } - ], - "mixNodes": [ - { - "location": "unknown", - "host": "35.176.155.107:1789", - "pubKey": "zSob16499jT7C3S3ky4GihNOjlU6aLfSRkf1xAxOwV0=", - "layer": 3, - "lastSeen": 1575915096805374500, - "version": "0.1.0" - }, - { - "location": "unknown", - "host": "18.130.86.190:1789", - "pubKey": "vCdpFc0NvW0NSqsuTxtjFtiSY35aXesgT3JNA8sSIXk=", - "layer": 1, - "lastSeen": 1575915097370376000, - "version": "0.1.0" - }, - { - "location": "unknown", - "host": "3.10.22.152:1789", - "pubKey": "OwOqwWjh_IlnaWS2PxO6odnhNahOYpRCkju50beQCTA=", - "layer": 1, - "lastSeen": 1575915097639423500, - "version": "0.1.0" - }, - { - "location": "unknown", - "host": "35.178.213.77:1789", - "pubKey": "nkkrUjgL8UJk05QydvWvFSvtRB6nmeV8RMvH5540J3s=", - "layer": 2, - "lastSeen": 1575915097895166500, - "version": "0.1.0" - }, - { - "location": "unknown", - "host": "52.56.99.196:1789", - "pubKey": "whHuBuEc6zyOZOquKbuATaH4Crml61V_3Y-MztpWhF4=", - "layer": 2, - "lastSeen": 1575915096255174700, - "version": "0.1.0" - }, - { - "location": "unknown", - "host": "3.9.12.238:1789", - "pubKey": "vk5Sr-Xyi0cTbugACv8U42ZJ6hs6cGDox0rpmXY94Fc=", - "layer": 3, - "lastSeen": 1575915096497827600, - "version": "0.1.0" - } - ], - "mixProviderNodes": [ - { - "location": "unknown", - "clientListener": "3.8.176.11:8888", - "mixnetListener": "3.8.176.11:9999", - "pubKey": "54U6krAr-j9nQXFlsHk3io04_p0tctuqH71t7w_usgI=", - "registeredClients": [ - { - "pubKey": "zOqdJFH49HcgGSCRnmbXGzovnwRLEPN0YGN1SCafTyo=" - }, - { - "pubKey": "fy9xo69hZ2UJ9uxhIS1YzKHZsH8saV-02AiyCNXPNUc=" - }, - { - "pubKey": "COGdpfhmzNGR6YX820GqJIkjOihL8mr6-h-d3JlTDFA=" - } - ], - "lastSeen": 1575915097358694100, - "version": "0.1.0" - }, - { - "location": "unknown", - "clientListener": "3.8.176.12:8888", - "mixnetListener": "3.8.176.12:9999", - "pubKey": "sA-sxi038pEbGy4lgZWG-RdHHDkA6kZzu44G0LUxFSc=", - "registeredClients": [ - { - "pubKey": "7fbk4oGQNlTW-tnWjVz8rWtKrtAicTsiNWgO98sqMyk=" - }, - { - "pubKey": "w1bfLpnd3rWu5JczB0nQfnE2S6nUCbx2AA7HDE48DQo=" - } - ], - "lastSeen": 1575915097869025000, - "version": "0.1.0" - } - ], - "gatewayNodes": [ - { - "location": "unknown", - "clientListener": "3.8.176.11:8888", - "mixnetListener": "3.8.176.11:9999", - "identityKey": "B9xz9V6jpp1fEbDkeyR5f8miorw9bzXGKoMbKnaxkD41", - "sphinxKey": "3KCpz1HCD8DqnQjemT1uuBZipmHFXM4V5btxLXwvM1gG", - "registeredClients": [ - { - "pubKey": "zOqdJFH49HcgGSCRnmbXGzovnwRLEPN0YGN1SCafTyo=" - }, - { - "pubKey": "fy9xo69hZ2UJ9uxhIS1YzKHZsH8saV-02AiyCNXPNUc=" - } - ], - "lastSeen": 1575915097358694100, - "version": "0.1.0" - }, - { - "location": "unknown", - "clientListener": "3.8.176.12:8888", - "mixnetListener": "3.8.176.12:9999", - "identityKey": "CdqJCedY5d1geJNDjUqnEx8zF7mKjb6PCZ6k3T6xhxD", - "sphinxKey": "BnLYqQjb8K6TmW5oFdNZrUTocGxa3rgzBvapQrf8XUbF", - "registeredClients": [ - { - "pubKey": "UE-7r6-bpw0b4T3GxOBVxlg02psx23DF2p5Tuf-OBSE=" - }, - { - "pubKey": "UnZuLpzq64_EPtIcr1Fd-5AESBCBLFnDMDsjUaOqrUA=" - } - ], - "lastSeen": 1575915097869025000, - "version": "0.1.0" - } - ] - }"#.to_string() - } - } -} diff --git a/common/client-libs/gateway-client/src/client.rs b/common/client-libs/gateway-client/src/client.rs index 36e75d5dc9c..0af2c1efac2 100644 --- a/common/client-libs/gateway-client/src/client.rs +++ b/common/client-libs/gateway-client/src/client.rs @@ -25,7 +25,7 @@ use gateway_requests::authentication::encrypted_address::EncryptedAddressBytes; use gateway_requests::authentication::iv::AuthenticationIV; use gateway_requests::registration::handshake::{client_handshake, SharedKeys, DEFAULT_RNG}; use gateway_requests::{BinaryRequest, ClientControlRequest, ServerResponse}; -use nymsphinx::{addressing::nodes::NymNodeRoutingAddress, SphinxPacket}; +use nymsphinx::forwarding::packet::MixPacket; use std::convert::TryFrom; use std::sync::Arc; use std::time::Duration; @@ -320,9 +320,9 @@ impl GatewayClient { } } - pub async fn batch_send_sphinx_packets( + pub async fn batch_send_mix_packets( &mut self, - packets: Vec<(NymNodeRoutingAddress, SphinxPacket)>, + packets: Vec<MixPacket>, ) -> Result<(), GatewayClientError> { if !self.authenticated { return Err(GatewayClientError::NotAuthenticated); @@ -333,8 +333,8 @@ impl GatewayClient { let messages: Vec<_> = packets .into_iter() - .map(|(address, packet)| { - BinaryRequest::new_forward_request(address, packet).into_ws_message( + .map(|mix_packet| { + BinaryRequest::new_forward_request(mix_packet).into_ws_message( self.shared_key .as_ref() .expect("no shared key present even though we're authenticated!"), @@ -347,10 +347,9 @@ impl GatewayClient { } // TODO: possibly make responses optional - pub async fn send_sphinx_packet( + pub async fn send_mix_packet( &mut self, - address: NymNodeRoutingAddress, - packet: SphinxPacket, + mix_packet: MixPacket, ) -> Result<(), GatewayClientError> { if !self.authenticated { return Err(GatewayClientError::NotAuthenticated); @@ -360,7 +359,7 @@ impl GatewayClient { } // note: into_ws_message encrypts the requests and adds a MAC on it. Perhaps it should // be more explicit in the naming? - let msg = BinaryRequest::new_forward_request(address, packet).into_ws_message( + let msg = BinaryRequest::new_forward_request(mix_packet).into_ws_message( self.shared_key .as_ref() .expect("no shared key present even though we're authenticated!"), diff --git a/common/client-libs/gateway-client/src/socket_state.rs b/common/client-libs/gateway-client/src/socket_state.rs index 1d2dcf9ba6f..77ad5b21600 100644 --- a/common/client-libs/gateway-client/src/socket_state.rs +++ b/common/client-libs/gateway-client/src/socket_state.rs @@ -183,23 +183,14 @@ pub(crate) enum SocketState { impl SocketState { pub(crate) fn is_available(&self) -> bool { - match self { - SocketState::Available(_) => true, - _ => false, - } + matches!(self, SocketState::Available(_)) } pub(crate) fn is_partially_delegated(&self) -> bool { - match self { - SocketState::PartiallyDelegated(_) => true, - _ => false, - } + matches!(self, SocketState::PartiallyDelegated(_)) } pub(crate) fn is_established(&self) -> bool { - match self { - SocketState::Available(_) | SocketState::PartiallyDelegated(_) => true, - _ => false, - } + matches!(self, SocketState::Available(_) | SocketState::PartiallyDelegated(_)) } } diff --git a/common/client-libs/directory-client/Cargo.toml b/common/client-libs/metrics-client/Cargo.toml similarity index 56% rename from common/client-libs/directory-client/Cargo.toml rename to common/client-libs/metrics-client/Cargo.toml index 090d8fd59be..5bff198dc07 100644 --- a/common/client-libs/directory-client/Cargo.toml +++ b/common/client-libs/metrics-client/Cargo.toml @@ -1,23 +1,15 @@ [package] -name = "directory-client" +name = "metrics-client" version = "0.1.0" -authors = ["Dave Hrycyszyn <futurechimp@users.noreply.github.com>", "JÄ™drzej StuczyÅ„ski <andrew@nymtech.net>"] +authors = ["Jedrzej Stuczynski <andrew@nymtech.net>"] edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html -[features] -offline-test = [] - [dependencies] -log = "0.4" -pretty_env_logger = "0.3" serde = { version = "1.0", features = ["derive"] } reqwest = { version = "0.10", features = ["json"] } -## internal -directory-client-models = { path = "models" } - [dev-dependencies] mockito = "0.23.0" tokio = { version = "0.2", features = ["macros"] } \ No newline at end of file diff --git a/common/client-libs/metrics-client/src/lib.rs b/common/client-libs/metrics-client/src/lib.rs new file mode 100644 index 00000000000..a38caeb4fb2 --- /dev/null +++ b/common/client-libs/metrics-client/src/lib.rs @@ -0,0 +1,74 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +pub mod models; +pub mod requests; + +use crate::models::metrics::{MixMetric, MixMetricInterval, PersistedMixMetric}; +use crate::requests::metrics_mixes_get::Request as MetricsMixRequest; +use crate::requests::metrics_mixes_post::Request as MetricsMixPost; + +pub struct Config { + pub base_url: String, +} + +impl Config { + pub fn new(base_url: String) -> Self { + Config { base_url } + } +} + +pub struct Client { + base_url: String, + reqwest_client: reqwest::Client, +} + +impl Client { + pub fn new(config: Config) -> Client { + let reqwest_client = reqwest::Client::new(); + Client { + base_url: config.base_url, + reqwest_client, + } + } + + pub async fn post_mix_metrics(&self, metrics: MixMetric) -> reqwest::Result<MixMetricInterval> { + let req = MetricsMixPost::new(&self.base_url, metrics); + self.reqwest_client + .post(&req.url()) + .json(req.json_payload()) + .send() + .await? + .json() + .await + } + + pub async fn get_mix_metrics(&self) -> reqwest::Result<Vec<PersistedMixMetric>> { + let req = MetricsMixRequest::new(&self.base_url); + self.reqwest_client + .get(&req.url()) + .send() + .await? + .json() + .await + } +} + +#[cfg(test)] +pub(crate) fn client_test_fixture(base_url: &str) -> Client { + Client { + base_url: base_url.to_string(), + reqwest_client: reqwest::Client::new(), + } +} diff --git a/common/client-libs/directory-client/models/src/metrics.rs b/common/client-libs/metrics-client/src/models/metrics.rs similarity index 88% rename from common/client-libs/directory-client/models/src/metrics.rs rename to common/client-libs/metrics-client/src/models/metrics.rs index 265ae165754..23a4bcd5371 100644 --- a/common/client-libs/directory-client/models/src/metrics.rs +++ b/common/client-libs/metrics-client/src/models/metrics.rs @@ -31,3 +31,9 @@ pub struct MixMetric { pub received: u64, pub sent: HashMap<String, u64>, } + +#[derive(Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct MixMetricInterval { + pub next_report_in: u64, +} diff --git a/common/client-libs/directory-client/models/src/lib.rs b/common/client-libs/metrics-client/src/models/mod.rs similarity index 97% rename from common/client-libs/directory-client/models/src/lib.rs rename to common/client-libs/metrics-client/src/models/mod.rs index c577e00beab..a5e5de4800e 100644 --- a/common/client-libs/directory-client/models/src/lib.rs +++ b/common/client-libs/metrics-client/src/models/mod.rs @@ -13,4 +13,3 @@ // limitations under the License. pub mod metrics; -pub mod presence; diff --git a/common/client-libs/directory-client/src/requests/metrics_mixes_get.rs b/common/client-libs/metrics-client/src/requests/metrics_mixes_get.rs similarity index 96% rename from common/client-libs/directory-client/src/requests/metrics_mixes_get.rs rename to common/client-libs/metrics-client/src/requests/metrics_mixes_get.rs index 09b8ade2cee..fdc01c4ccd3 100644 --- a/common/client-libs/directory-client/src/requests/metrics_mixes_get.rs +++ b/common/client-libs/metrics-client/src/requests/metrics_mixes_get.rs @@ -12,9 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -use super::{DirectoryGetRequest, DirectoryRequest}; -use crate::metrics::PersistedMixMetric; - const PATH: &str = "/api/metrics/mixes"; pub struct Request { @@ -22,21 +19,17 @@ pub struct Request { path: String, } -impl DirectoryRequest for Request { - fn url(&self) -> String { - format!("{}{}", self.base_url, self.path) - } -} - -impl DirectoryGetRequest for Request { - type JSONResponse = Vec<PersistedMixMetric>; - - fn new(base_url: &str) -> Self { +impl Request { + pub(crate) fn new(base_url: &str) -> Self { Request { base_url: base_url.to_string(), path: PATH.to_string(), } } + + pub(crate) fn url(&self) -> String { + format!("{}{}", self.base_url, self.path) + } } #[cfg(test)] diff --git a/common/client-libs/directory-client/src/requests/metrics_mixes_post.rs b/common/client-libs/metrics-client/src/requests/metrics_mixes_post.rs similarity index 73% rename from common/client-libs/directory-client/src/requests/metrics_mixes_post.rs rename to common/client-libs/metrics-client/src/requests/metrics_mixes_post.rs index c6d4600a97f..1e38f2d46ad 100644 --- a/common/client-libs/directory-client/src/requests/metrics_mixes_post.rs +++ b/common/client-libs/metrics-client/src/requests/metrics_mixes_post.rs @@ -12,8 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use super::{DirectoryPostRequest, DirectoryRequest}; -use crate::metrics::MixMetric; +use crate::models::metrics::MixMetric; const PATH: &str = "/api/metrics/mixes"; @@ -23,25 +22,22 @@ pub struct Request { payload: MixMetric, } -impl DirectoryRequest for Request { - fn url(&self) -> String { +impl Request { + pub(crate) fn url(&self) -> String { format!("{}{}", self.base_url, self.path) } -} - -impl DirectoryPostRequest for Request { - type Payload = MixMetric; - fn json_payload(&self) -> &MixMetric { - &self.payload - } - fn new(base_url: &str, payload: Self::Payload) -> Self { + pub(crate) fn new(base_url: &str, payload: MixMetric) -> Self { Request { base_url: base_url.to_string(), path: PATH.to_string(), payload, } } + + pub(crate) fn json_payload(&self) -> &MixMetric { + &self.payload + } } #[cfg(test)] @@ -59,7 +55,7 @@ mod metrics_post_request { let _m = mock("POST", PATH).with_status(400).create(); let client = client_test_fixture(&mockito::server_url()); let result = client.post_mix_metrics(fixtures::new_metric()).await; - assert_eq!(400, result.unwrap().status()); + assert!(result.is_err()); _m.assert(); } } @@ -69,7 +65,7 @@ mod metrics_post_request { use super::*; #[tokio::test] async fn it_returns_a_response_with_200() { - let json = fixtures::mix_metrics_response_json(); + let json = fixtures::metrics_interval_json(); let _m = mock("POST", "/api/metrics/mixes") .with_status(201) .with_body(json) @@ -83,7 +79,7 @@ mod metrics_post_request { #[cfg(test)] mod fixtures { - use crate::metrics::MixMetric; + use crate::models::metrics::MixMetric; pub fn new_metric() -> MixMetric { MixMetric { @@ -94,17 +90,11 @@ mod metrics_post_request { } #[cfg(test)] - pub fn mix_metrics_response_json() -> String { + pub fn metrics_interval_json() -> String { r#" - { - "pubKey": "OwOqwWjh_IlnaWS2PxO6odnhNahOYpRCkju50beQCTA=", - "sent": { - "35.178.213.77:1789": 1, - "52.56.99.196:1789": 2 - }, - "received": 10, - "timestamp": 1576061080635800000 - } + { + "nextReportIn": 5 + } "# .to_string() } diff --git a/validator/src/network/ethereum/ethereum.rs b/common/client-libs/metrics-client/src/requests/mod.rs similarity index 91% rename from validator/src/network/ethereum/ethereum.rs rename to common/client-libs/metrics-client/src/requests/mod.rs index 69f4679332c..4fe8f6c3d32 100644 --- a/validator/src/network/ethereum/ethereum.rs +++ b/common/client-libs/metrics-client/src/requests/mod.rs @@ -12,4 +12,5 @@ // See the License for the specific language governing permissions and // limitations under the License. -// placeholder for Ethereum / ERC20 bridge integration +pub mod metrics_mixes_get; +pub mod metrics_mixes_post; diff --git a/common/client-libs/mixnet-client/src/client.rs b/common/client-libs/mixnet-client/src/client.rs new file mode 100644 index 00000000000..4944f0c8a15 --- /dev/null +++ b/common/client-libs/mixnet-client/src/client.rs @@ -0,0 +1,156 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +use crate::connection_manager::{ConnectionManager, ConnectionManagerSender}; +use futures::channel::oneshot; +use futures::future::AbortHandle; +use log::*; +use nymsphinx::framing::packet::FramedSphinxPacket; +use nymsphinx::params::PacketMode; +use nymsphinx::{addressing::nodes::NymNodeRoutingAddress, SphinxPacket}; +use std::collections::HashMap; +use std::io; +use std::net::SocketAddr; +use std::time::Duration; + +pub struct Config { + initial_reconnection_backoff: Duration, + maximum_reconnection_backoff: Duration, + initial_connection_timeout: Duration, + maximum_reconnection_attempts: u32, +} + +impl Config { + pub fn new( + initial_reconnection_backoff: Duration, + maximum_reconnection_backoff: Duration, + initial_connection_timeout: Duration, + maximum_reconnection_attempts: u32, + ) -> Self { + Config { + initial_reconnection_backoff, + maximum_reconnection_backoff, + initial_connection_timeout, + maximum_reconnection_attempts, + } + } +} + +pub struct Client { + connections_managers: HashMap<SocketAddr, (ConnectionManagerSender, AbortHandle)>, + maximum_reconnection_backoff: Duration, + initial_reconnection_backoff: Duration, + initial_connection_timeout: Duration, + maximum_reconnection_attempts: u32, +} + +impl Client { + pub fn new(config: Config) -> Client { + Client { + connections_managers: HashMap::new(), + initial_reconnection_backoff: config.initial_reconnection_backoff, + maximum_reconnection_backoff: config.maximum_reconnection_backoff, + initial_connection_timeout: config.initial_connection_timeout, + maximum_reconnection_attempts: config.maximum_reconnection_attempts, + } + } + + async fn start_new_connection_manager( + &mut self, + address: SocketAddr, + ) -> Result<(ConnectionManagerSender, AbortHandle), io::Error> { + let conn_manager = ConnectionManager::new( + address, + self.initial_reconnection_backoff, + self.maximum_reconnection_backoff, + self.initial_connection_timeout, + self.maximum_reconnection_attempts, + ) + .await?; + + let (sender, abort_handle) = conn_manager.spawn_abortable(); + + Ok((sender, abort_handle)) + } + + // if wait_for_response is set to true, we will get information about any possible IO errors + // as well as (once implemented) received replies, however, this will also cause way longer + // waiting periods + pub async fn send( + &mut self, + address: NymNodeRoutingAddress, + packet: SphinxPacket, + packet_mode: PacketMode, + wait_for_response: bool, + ) -> io::Result<()> { + trace!("Sending packet to {:?}", address); + let socket_address = address.into(); + + if !self.connections_managers.contains_key(&socket_address) { + debug!( + "There is no existing connection to {:?} - it will be established now", + address + ); + + let (new_manager_sender, abort_handle) = + match self.start_new_connection_manager(socket_address).await { + Ok(res) => res, + Err(err) => { + debug!( + "failed to establish initial connection to {} - {}", + socket_address, err + ); + return Err(err); + } + }; + + self.connections_managers + .insert(socket_address, (new_manager_sender, abort_handle)); + } + + let manager = self.connections_managers.get_mut(&socket_address).unwrap(); + + let framed_packet = FramedSphinxPacket::new(packet, packet_mode); + + let (res_tx, res_rx) = if wait_for_response { + let (res_tx, res_rx) = oneshot::channel(); + (Some(res_tx), Some(res_rx)) + } else { + (None, None) + }; + + if let Err(err) = manager.0.unbounded_send((framed_packet, res_tx)) { + warn!( + "Connection manager to {} has failed - {}", + socket_address, err + ); + self.connections_managers.remove(&socket_address); + return Err(io::Error::new(io::ErrorKind::BrokenPipe, err)); + } + + if let Some(res_rx) = res_rx { + res_rx.await.unwrap() + } else { + Ok(()) + } + } +} + +impl Drop for Client { + fn drop(&mut self) { + for (_, abort_handle) in self.connections_managers.values() { + abort_handle.abort() + } + } +} diff --git a/common/client-libs/mixnet-client/src/connection_manager/mod.rs b/common/client-libs/mixnet-client/src/connection_manager/mod.rs index 107e01de809..f5b87765d5f 100644 --- a/common/client-libs/mixnet-client/src/connection_manager/mod.rs +++ b/common/client-libs/mixnet-client/src/connection_manager/mod.rs @@ -19,19 +19,19 @@ use futures::future::{abortable, AbortHandle}; use futures::task::Poll; use futures::{SinkExt, StreamExt}; use log::*; -use nymsphinx::SphinxPacket; +use nymsphinx::framing::packet::FramedSphinxPacket; use std::io; use std::net::SocketAddr; use std::time::Duration; -use tokio::runtime::Handle; mod reconnector; mod writer; pub(crate) type ResponseSender = Option<oneshot::Sender<io::Result<()>>>; -pub(crate) type ConnectionManagerSender = mpsc::UnboundedSender<(SphinxPacket, ResponseSender)>; -type ConnectionManagerReceiver = mpsc::UnboundedReceiver<(SphinxPacket, ResponseSender)>; +pub(crate) type ConnectionManagerSender = + mpsc::UnboundedSender<(FramedSphinxPacket, ResponseSender)>; +type ConnectionManagerReceiver = mpsc::UnboundedReceiver<(FramedSphinxPacket, ResponseSender)>; enum ConnectionState<'a> { Writing(ConnectionWriter), @@ -46,6 +46,7 @@ pub(crate) struct ConnectionManager<'a> { maximum_reconnection_backoff: Duration, reconnection_backoff: Duration, + maximum_reconnection_attempts: u32, state: ConnectionState<'a>, } @@ -62,59 +63,68 @@ impl<'a> ConnectionManager<'static> { reconnection_backoff: Duration, maximum_reconnection_backoff: Duration, connection_timeout: Duration, - ) -> ConnectionManager<'a> { + maximum_reconnection_attempts: u32, + ) -> Result<ConnectionManager<'a>, io::Error> { let (conn_tx, conn_rx) = mpsc::unbounded(); // the blocking call here is fine as initially we want to wait the timeout interval (at most) anyway: let tcp_stream_res = std::net::TcpStream::connect_timeout(&address, connection_timeout); + // we MUST succeed in making initial connection. We don't want to end up in reconnection + // loop to something we have never managed to connect (and possibly never will) + let initial_state = match tcp_stream_res { Ok(stream) => { let tokio_stream = tokio::net::TcpStream::from_std(stream).unwrap(); debug!("managed to establish initial connection to {}", address); ConnectionState::Writing(ConnectionWriter::new(tokio_stream)) } - Err(e) => { - warn!("failed to establish initial connection to {} within {:?} ({}). Going into reconnection mode", address, connection_timeout, e); - ConnectionState::Reconnecting(ConnectionReconnector::new( - address, - reconnection_backoff, - maximum_reconnection_backoff, - )) - } + Err(err) => return Err(err), }; - ConnectionManager { + Ok(ConnectionManager { conn_tx, conn_rx, address, maximum_reconnection_backoff, reconnection_backoff, + maximum_reconnection_attempts, state: initial_state, - } + }) } async fn run(mut self) { while let Some(msg) = self.conn_rx.next().await { - let (msg_content, res_ch) = msg; - let res = self.handle_new_packet(msg_content).await; - if let Some(res_ch) = res_ch { - if let Err(e) = res_ch.send(res) { - error!( - "failed to send response on the channel to the caller! - {:?}", - e + let (framed_packet, res_ch) = msg; + + match self.handle_new_packet(framed_packet).await { + None => { + warn!( + "We reached maximum number of attempts trying to reconnect to {}", + self.address ); + return; + } + Some(res) => { + if let Some(res_ch) = res_ch { + if let Err(e) = res_ch.send(res) { + error!( + "failed to send response on the channel to the caller! - {:?}", + e + ); + } + } } } } } /// consumes Self and returns channel for communication as well as an `AbortHandle` - pub(crate) fn start_abortable(self, handle: &Handle) -> (ConnectionManagerSender, AbortHandle) { + pub(crate) fn spawn_abortable(self) -> (ConnectionManagerSender, AbortHandle) { let sender_clone = self.conn_tx.clone(); let (abort_fut, abort_handle) = abortable(self.run()); - handle.spawn(async move { abort_fut.await }); + tokio::spawn(async move { abort_fut.await }); (sender_clone, abort_handle) } @@ -122,7 +132,7 @@ impl<'a> ConnectionManager<'static> { // Possible future TODO: `Framed<...>` is both a Sink and a Stream, // so it is possible to read any responses we might receive (it is also duplex, so that could be // done while writing packets themselves). But it'd require slight additions to `SphinxCodec` - async fn handle_new_packet(&mut self, packet: SphinxPacket) -> io::Result<()> { + async fn handle_new_packet(&mut self, packet: FramedSphinxPacket) -> Option<io::Result<()>> { // we don't do a match here as it's possible to transition from ConnectionState::Reconnecting to ConnectionState::Writing // in this function call. And if that happens, we want to send the packet we have received. if let ConnectionState::Reconnecting(conn_reconnector) = &mut self.state { @@ -130,22 +140,27 @@ impl<'a> ConnectionManager<'static> { let new_connection = match futures::poll(conn_reconnector).await { Poll::Pending => { debug!("The packet is getting dropped - there's nowhere to send it"); - return Err(io::Error::new( + return Some(Err(io::Error::new( io::ErrorKind::BrokenPipe, "connection is broken - reconnection is in progress", - )); + ))); } Poll::Ready(conn) => conn, }; - debug!("Managed to reconnect to {}!", self.address); - self.state = ConnectionState::Writing(ConnectionWriter::new(new_connection)); + match new_connection { + Ok(new_conn) => { + debug!("Managed to reconnect to {}!", self.address); + self.state = ConnectionState::Writing(ConnectionWriter::new(new_conn)); + } + Err(_) => return None, + } } // we must be in writing state if we are here, either by being here from beginning or just // transitioning from reconnecting if let ConnectionState::Writing(conn_writer) = &mut self.state { - if let Err(e) = conn_writer.send(packet).await { + return if let Err(e) = conn_writer.send(packet).await { warn!( "Failed to forward message - {:?}. Starting reconnection procedure...", e @@ -154,14 +169,15 @@ impl<'a> ConnectionManager<'static> { self.address, self.reconnection_backoff, self.maximum_reconnection_backoff, + self.maximum_reconnection_attempts, )); - return Err(io::Error::new( + Some(Err(io::Error::new( io::ErrorKind::BrokenPipe, "connection is broken - reconnection is in progress", - )); + ))) } else { - return Ok(()); - } + Some(Ok(())) + }; } unreachable!(); diff --git a/common/client-libs/mixnet-client/src/connection_manager/reconnector.rs b/common/client-libs/mixnet-client/src/connection_manager/reconnector.rs index 035a5828ac7..b57b09f03a6 100644 --- a/common/client-libs/mixnet-client/src/connection_manager/reconnector.rs +++ b/common/client-libs/mixnet-client/src/connection_manager/reconnector.rs @@ -22,11 +22,14 @@ use std::pin::Pin; use std::task::{Context, Poll}; use std::time::Duration; +pub(crate) struct MaximumReconnectionCountReached; + pub(crate) struct ConnectionReconnector<'a> { address: SocketAddr, connection: BoxFuture<'a, io::Result<tokio::net::TcpStream>>, current_retry_attempt: u32, + maximum_reconnection_attempts: u32, current_backoff_delay: tokio::time::Delay, maximum_reconnection_backoff: Duration, @@ -39,12 +42,14 @@ impl<'a> ConnectionReconnector<'a> { address: SocketAddr, initial_reconnection_backoff: Duration, maximum_reconnection_backoff: Duration, + maximum_reconnection_attempts: u32, ) -> ConnectionReconnector<'a> { ConnectionReconnector { address, connection: tokio::net::TcpStream::connect(address).boxed(), current_backoff_delay: tokio::time::delay_for(Duration::new(0, 0)), // if we can re-establish connection on first try without any backoff that's perfect current_retry_attempt: 0, + maximum_reconnection_attempts, maximum_reconnection_backoff, initial_reconnection_backoff, } @@ -52,7 +57,7 @@ impl<'a> ConnectionReconnector<'a> { } impl<'a> Future for ConnectionReconnector<'a> { - type Output = tokio::net::TcpStream; + type Output = Result<tokio::net::TcpStream, MaximumReconnectionCountReached>; fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> { // see if we are still in exponential backoff @@ -72,6 +77,11 @@ impl<'a> Future for ConnectionReconnector<'a> { self.address, e, self.current_retry_attempt ); + // checked if we reached the maximum attempt count + if self.current_retry_attempt == self.maximum_reconnection_attempts { + return Poll::Ready(Err(MaximumReconnectionCountReached)); + } + // we failed to re-establish connection - continue exponential backoff // according to https://github.com/tokio-rs/tokio/issues/1953 there's an undocumented @@ -102,7 +112,7 @@ impl<'a> Future for ConnectionReconnector<'a> { Poll::Pending } - Poll::Ready(Ok(conn)) => Poll::Ready(conn), + Poll::Ready(Ok(conn)) => Poll::Ready(Ok(conn)), } } } diff --git a/common/client-libs/mixnet-client/src/connection_manager/writer.rs b/common/client-libs/mixnet-client/src/connection_manager/writer.rs index 1208049b017..b23caec8124 100644 --- a/common/client-libs/mixnet-client/src/connection_manager/writer.rs +++ b/common/client-libs/mixnet-client/src/connection_manager/writer.rs @@ -14,8 +14,8 @@ use futures::task::{Context, Poll}; use futures::Sink; -use nymsphinx::framing::{SphinxCodec, SphinxCodecError}; -use nymsphinx::SphinxPacket; +use nymsphinx::framing::codec::{SphinxCodec, SphinxCodecError}; +use nymsphinx::framing::packet::FramedSphinxPacket; use std::pin::Pin; use tokio_util::codec::Framed; @@ -31,14 +31,14 @@ impl ConnectionWriter { } } -impl Sink<SphinxPacket> for ConnectionWriter { +impl Sink<FramedSphinxPacket> for ConnectionWriter { type Error = SphinxCodecError; fn poll_ready(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> { Pin::new(&mut self.framed_connection).poll_ready(cx) } - fn start_send(mut self: Pin<&mut Self>, item: SphinxPacket) -> Result<(), Self::Error> { + fn start_send(mut self: Pin<&mut Self>, item: FramedSphinxPacket) -> Result<(), Self::Error> { Pin::new(&mut self.framed_connection).start_send(item) } diff --git a/common/client-libs/mixnet-client/src/forwarder.rs b/common/client-libs/mixnet-client/src/forwarder.rs new file mode 100644 index 00000000000..0dbb3b24f0f --- /dev/null +++ b/common/client-libs/mixnet-client/src/forwarder.rs @@ -0,0 +1,76 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +use crate::client::{Client, Config}; +use futures::channel::mpsc; +use futures::StreamExt; +use log::*; +use nymsphinx::forwarding::packet::MixPacket; +use std::time::Duration; + +pub type MixForwardingSender = mpsc::UnboundedSender<MixPacket>; +type MixForwardingReceiver = mpsc::UnboundedReceiver<MixPacket>; + +/// A specialisation of client such that it forwards any received packets on the channel into the +/// mix network immediately, i.e. will not try to listen for any responses. +pub struct PacketForwarder { + mixnet_client: Client, + packet_receiver: MixForwardingReceiver, +} + +impl PacketForwarder { + pub fn new( + initial_reconnection_backoff: Duration, + maximum_reconnection_backoff: Duration, + initial_connection_timeout: Duration, + maximum_reconnection_attempts: u32, + ) -> (PacketForwarder, MixForwardingSender) { + let client_config = Config::new( + initial_reconnection_backoff, + maximum_reconnection_backoff, + initial_connection_timeout, + maximum_reconnection_attempts, + ); + + let (packet_sender, packet_receiver) = mpsc::unbounded(); + + ( + PacketForwarder { + mixnet_client: Client::new(client_config), + packet_receiver, + }, + packet_sender, + ) + } + + pub async fn run(&mut self) { + while let Some(mix_packet) = self.packet_receiver.next().await { + trace!("Going to forward packet to {:?}", mix_packet.next_hop()); + + let next_hop = mix_packet.next_hop(); + let packet_mode = mix_packet.packet_mode(); + let sphinx_packet = mix_packet.into_sphinx_packet(); + // we don't care about responses, we just want to fire packets + // as quickly as possible + + if let Err(err) = self + .mixnet_client + .send(next_hop, sphinx_packet, packet_mode, false) + .await + { + debug!("failed to forward the packet - {}", err) + } + } + } +} diff --git a/common/client-libs/mixnet-client/src/lib.rs b/common/client-libs/mixnet-client/src/lib.rs index d4c72240b06..cb66dadb90a 100644 --- a/common/client-libs/mixnet-client/src/lib.rs +++ b/common/client-libs/mixnet-client/src/lib.rs @@ -12,272 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::connection_manager::{ConnectionManager, ConnectionManagerSender}; -use futures::channel::oneshot; -use futures::future::AbortHandle; -use log::*; -use nymsphinx::{addressing::nodes::NymNodeRoutingAddress, SphinxPacket}; -use std::collections::HashMap; -use std::io; -use std::net::SocketAddr; -use std::time::Duration; -use tokio::runtime::Handle; - -mod connection_manager; - -pub struct Config { - initial_reconnection_backoff: Duration, - maximum_reconnection_backoff: Duration, - initial_connection_timeout: Duration, -} - -impl Config { - pub fn new( - initial_reconnection_backoff: Duration, - maximum_reconnection_backoff: Duration, - initial_connection_timeout: Duration, - ) -> Self { - Config { - initial_reconnection_backoff, - maximum_reconnection_backoff, - initial_connection_timeout, - } - } -} - -pub struct Client { - runtime_handle: Handle, - connections_managers: HashMap<SocketAddr, (ConnectionManagerSender, AbortHandle)>, - maximum_reconnection_backoff: Duration, - initial_reconnection_backoff: Duration, - initial_connection_timeout: Duration, -} - -impl Client { - pub fn new(config: Config) -> Client { - Client { - // if the function is not called within tokio runtime context, this will panic - // but perhaps the code should be better structured to completely avoid this call - runtime_handle: Handle::try_current() - .expect("The client MUST BE used within tokio runtime context"), - connections_managers: HashMap::new(), - initial_reconnection_backoff: config.initial_reconnection_backoff, - maximum_reconnection_backoff: config.maximum_reconnection_backoff, - initial_connection_timeout: config.initial_connection_timeout, - } - } - - async fn start_new_connection_manager( - &mut self, - address: SocketAddr, - ) -> (ConnectionManagerSender, AbortHandle) { - let (sender, abort_handle) = ConnectionManager::new( - address, - self.initial_reconnection_backoff, - self.maximum_reconnection_backoff, - self.initial_connection_timeout, - ) - .await - .start_abortable(&self.runtime_handle); - - (sender, abort_handle) - } - - // if wait_for_response is set to true, we will get information about any possible IO errors - // as well as (once implemented) received replies, however, this will also cause way longer - // waiting periods - pub async fn send( - &mut self, - address: NymNodeRoutingAddress, - packet: SphinxPacket, - wait_for_response: bool, - ) -> io::Result<()> { - trace!("Sending packet to {:?}", address); - let socket_address = address.into(); - - if !self.connections_managers.contains_key(&socket_address) { - debug!( - "There is no existing connection to {:?} - it will be established now", - address - ); - - let (new_manager_sender, abort_handle) = - self.start_new_connection_manager(socket_address).await; - self.connections_managers - .insert(socket_address, (new_manager_sender, abort_handle)); - } - - let manager = self.connections_managers.get_mut(&socket_address).unwrap(); - - if wait_for_response { - let (res_tx, res_rx) = oneshot::channel(); - manager.0.unbounded_send((packet, Some(res_tx))).unwrap(); - res_rx.await.unwrap() - } else { - manager.0.unbounded_send((packet, None)).unwrap(); - Ok(()) - } - } -} - -impl Drop for Client { - fn drop(&mut self) { - for (_, abort_handle) in self.connections_managers.values() { - abort_handle.abort() - } - } -} - -/* - The below tests weren't extremely reliable to begin with, however, - to restore them as they were before, we'd need to expose some kind of 'SphinxPacket::test_fixture()` - function. -*/ -// -// #[cfg(test)] -// mod tests { -// use super::*; -// use std::str; -// use std::time; -// use tokio::prelude::*; -// -// const SERVER_MSG_LEN: usize = 16; -// const CLOSE_MESSAGE: [u8; SERVER_MSG_LEN] = [0; SERVER_MSG_LEN]; -// -// struct DummyServer { -// received_buf: Vec<Vec<u8>>, -// listener: tokio::net::TcpListener, -// } -// -// impl DummyServer { -// async fn new(address: SocketAddr) -> Self { -// DummyServer { -// received_buf: Vec::new(), -// listener: tokio::net::TcpListener::bind(address).await.unwrap(), -// } -// } -// -// fn get_received(&self) -> Vec<Vec<u8>> { -// self.received_buf.clone() -// } -// -// // this is only used in tests so slightly higher logging levels are fine -// async fn listen_until(mut self, close_message: &[u8]) -> Self { -// let (mut socket, _) = self.listener.accept().await.unwrap(); -// loop { -// let mut buf = [0u8; SERVER_MSG_LEN]; -// match socket.read(&mut buf).await { -// Ok(n) if n == 0 => { -// info!("Remote connection closed"); -// return self; -// } -// Ok(n) => { -// info!("received ({}) - {:?}", n, str::from_utf8(buf[..n].as_ref())); -// -// if buf[..n].as_ref() == close_message { -// info!("closing..."); -// socket.shutdown(std::net::Shutdown::Both).unwrap(); -// return self; -// } else { -// self.received_buf.push(buf[..n].to_vec()); -// } -// } -// Err(e) => { -// panic!("failed to read from socket; err = {:?}", e); -// } -// }; -// } -// } -// } -// -// #[test] -// fn client_reconnects_to_server_after_it_went_down() { -// let mut rt = tokio::runtime::Runtime::new().unwrap(); -// let addr = "127.0.0.1:6000".parse().unwrap(); -// let reconnection_backoff = Duration::from_secs(1); -// let timeout = Duration::from_secs(1); -// let client_config = Config::new(reconnection_backoff, 10 * reconnection_backoff, timeout); -// -// let messages_to_send = vec![[1u8; SERVER_MSG_LEN].to_vec(), [2; SERVER_MSG_LEN].to_vec()]; -// -// let dummy_server = rt.block_on(DummyServer::new(addr)); -// let finished_dummy_server_future = rt.spawn(dummy_server.listen_until(&CLOSE_MESSAGE)); -// -// let mut c = rt.enter(|| Client::new(client_config)); -// -// for msg in &messages_to_send { -// rt.block_on(c.send(addr, msg.clone(), true)).unwrap(); -// } -// -// // kill server -// rt.block_on(c.send(addr, CLOSE_MESSAGE.to_vec(), true)) -// .unwrap(); -// let received_messages = rt -// .block_on(finished_dummy_server_future) -// .unwrap() -// .get_received(); -// -// assert_eq!(received_messages, messages_to_send); -// -// // try to send - go into reconnection -// let post_kill_message = [3u8; SERVER_MSG_LEN].to_vec(); -// -// // we are trying to send to killed server -// assert!(rt -// .block_on(c.send(addr, post_kill_message.clone(), true)) -// .is_err()); -// -// let new_dummy_server = rt.block_on(DummyServer::new(addr)); -// let new_server_future = rt.spawn(new_dummy_server.listen_until(&CLOSE_MESSAGE)); -// -// // keep sending after we leave reconnection backoff and reconnect -// loop { -// if rt -// .block_on(c.send(addr, post_kill_message.clone(), true)) -// .is_ok() -// { -// break; -// } -// rt.block_on( -// async move { tokio::time::delay_for(time::Duration::from_millis(50)).await }, -// ); -// } -// -// // kill the server to ensure it actually got the message -// rt.block_on(c.send(addr, CLOSE_MESSAGE.to_vec(), true)) -// .unwrap(); -// let new_received_messages = rt.block_on(new_server_future).unwrap().get_received(); -// assert_eq!(post_kill_message.to_vec(), new_received_messages[0]); -// } -// -// #[test] -// fn server_receives_all_sent_messages_when_up() { -// let mut rt = tokio::runtime::Runtime::new().unwrap(); -// let addr = "127.0.0.1:6001".parse().unwrap(); -// let reconnection_backoff = Duration::from_secs(2); -// let timeout = Duration::from_secs(1); -// let client_config = Config::new(reconnection_backoff, 10 * reconnection_backoff, timeout); -// -// let messages_to_send = vec![[1u8; SERVER_MSG_LEN].to_vec(), [2; SERVER_MSG_LEN].to_vec()]; -// -// let dummy_server = rt.block_on(DummyServer::new(addr)); -// let finished_dummy_server_future = rt.spawn(dummy_server.listen_until(&CLOSE_MESSAGE)); -// -// let mut c = rt.enter(|| Client::new(client_config)); -// -// for msg in &messages_to_send { -// rt.block_on(c.send(addr, msg.clone(), true)).unwrap(); -// } -// -// rt.block_on(c.send(addr, CLOSE_MESSAGE.to_vec(), true)) -// .unwrap(); -// -// // the server future should have already been resolved -// let received_messages = rt -// .block_on(finished_dummy_server_future) -// .unwrap() -// .get_received(); -// -// assert_eq!(received_messages, messages_to_send); -// } -// } +pub mod client; +pub(crate) mod connection_manager; +pub mod forwarder; diff --git a/common/client-libs/validator-client/Cargo.toml b/common/client-libs/validator-client/Cargo.toml index d9e12aefc76..de75f18f282 100644 --- a/common/client-libs/validator-client/Cargo.toml +++ b/common/client-libs/validator-client/Cargo.toml @@ -8,4 +8,12 @@ edition = "2018" [dependencies] log = "0.4" -pretty_env_logger = "0.3" \ No newline at end of file +serde = { version = "1.0", features = ["derive"] } +reqwest = { version = "0.10", features = ["json"] } + +crypto = { path = "../../crypto" } +topology = { path = "../../topology" } + +[dev-dependencies] +mockito = "0.23.0" +tokio = { version = "0.2", features = ["macros"] } \ No newline at end of file diff --git a/common/client-libs/validator-client/src/lib.rs b/common/client-libs/validator-client/src/lib.rs index 36f90bbc648..fc2c8b8a8b8 100644 --- a/common/client-libs/validator-client/src/lib.rs +++ b/common/client-libs/validator-client/src/lib.rs @@ -12,10 +12,242 @@ // See the License for the specific language governing permissions and // limitations under the License. +use crate::models::gateway::GatewayRegistrationInfo; +use crate::models::mixmining::{BatchMixStatus, MixStatus}; +use crate::models::mixnode::MixRegistrationInfo; +use crate::models::topology::Topology; +use crate::rest_requests::{ + ActiveTopologyGet, ActiveTopologyGetResponse, BatchMixStatusPost, GatewayRegisterPost, + MixRegisterPost, MixStatusPost, NodeUnregisterDelete, RESTRequest, RESTRequestError, + ReputationPatch, TopologyGet, TopologyGetResponse, +}; +use serde::Deserialize; + +pub mod models; +pub mod rest_requests; + +// for ease of use +type Result<T> = std::result::Result<T, ValidatorClientError>; + +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct ErrorResponse { + error: String, +} + +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +struct OkResponse { + ok: bool, +} + +#[derive(Deserialize)] +#[serde(rename_all = "camelCase", untagged)] +pub(crate) enum DefaultRESTResponse { + Ok(OkResponse), + Error(ErrorResponse), +} + +#[derive(Debug)] +pub enum ValidatorClientError { + RESTRequestError(RESTRequestError), + ReqwestClientError(reqwest::Error), + ValidatorError(String), +} + +impl From<RESTRequestError> for ValidatorClientError { + fn from(err: RESTRequestError) -> Self { + ValidatorClientError::RESTRequestError(err) + } +} + +impl From<reqwest::Error> for ValidatorClientError { + fn from(err: reqwest::Error) -> Self { + ValidatorClientError::ReqwestClientError(err) + } +} + +pub struct Config { + base_url: String, +} + +impl Config { + pub fn new<S: Into<String>>(base_url: S) -> Self { + Config { + base_url: base_url.into(), + } + } +} + +pub struct Client { + config: Config, + reqwest_client: reqwest::Client, +} + +impl Client { + pub fn new(config: Config) -> Self { + let reqwest_client = reqwest::Client::new(); + Client { + config, + reqwest_client, + } + } + + async fn make_rest_request<R: RESTRequest>( + &self, + request: R, + ) -> Result<R::ExpectedJsonResponse> { + let mut req_builder = self + .reqwest_client + .request(R::METHOD, request.url().clone()); + + if let Some(json_payload) = request.json_payload() { + // if applicable, attach payload + req_builder = req_builder.json(json_payload) + } + Ok(req_builder.send().await?.json().await?) + } + + pub async fn register_mix(&self, mix_registration_info: MixRegistrationInfo) -> Result<()> { + let req = MixRegisterPost::new( + &self.config.base_url, + None, + None, + Some(mix_registration_info), + )?; + match self.make_rest_request(req).await? { + DefaultRESTResponse::Ok(_) => Ok(()), + DefaultRESTResponse::Error(err) => Err(ValidatorClientError::ValidatorError(err.error)), + } + } + + pub async fn register_gateway( + &self, + gateway_registration_info: GatewayRegistrationInfo, + ) -> Result<()> { + let req = GatewayRegisterPost::new( + &self.config.base_url, + None, + None, + Some(gateway_registration_info), + )?; + match self.make_rest_request(req).await? { + DefaultRESTResponse::Ok(ok_res) => { + if ok_res.ok { + Ok(()) + } else { + Err(ValidatorClientError::ValidatorError( + "received ok response with false".into(), + )) + } + } + DefaultRESTResponse::Error(err) => Err(ValidatorClientError::ValidatorError(err.error)), + } + } + + pub async fn unregister_node(&self, node_id: &str) -> Result<()> { + let req = + NodeUnregisterDelete::new(&self.config.base_url, Some(vec![node_id]), None, None)?; + + match self.make_rest_request(req).await? { + DefaultRESTResponse::Ok(ok_res) => { + if ok_res.ok { + Ok(()) + } else { + Err(ValidatorClientError::ValidatorError( + "received ok response with false".into(), + )) + } + } + DefaultRESTResponse::Error(err) => Err(ValidatorClientError::ValidatorError(err.error)), + } + } + + pub async fn set_reputation(&self, node_id: &str, new_reputation: i64) -> Result<()> { + let new_rep_string = new_reputation.to_string(); + let query_param_values = vec![&*new_rep_string]; + let query_param_keys = ReputationPatch::query_param_keys(); + + let query_params = query_param_keys + .into_iter() + .zip(query_param_values.into_iter()) + .collect(); + + let req = ReputationPatch::new( + &self.config.base_url, + Some(vec![node_id]), + Some(query_params), + None, + )?; + match self.make_rest_request(req).await? { + DefaultRESTResponse::Ok(ok_res) => { + if ok_res.ok { + Ok(()) + } else { + Err(ValidatorClientError::ValidatorError( + "received ok response with false".into(), + )) + } + } + DefaultRESTResponse::Error(err) => Err(ValidatorClientError::ValidatorError(err.error)), + } + } + + pub async fn get_topology(&self) -> Result<Topology> { + let req = TopologyGet::new(&self.config.base_url, None, None, None)?; + match self.make_rest_request(req).await? { + TopologyGetResponse::Ok(topology) => Ok(topology), + TopologyGetResponse::Error(err) => Err(ValidatorClientError::ValidatorError(err.error)), + } + } + + pub async fn get_active_topology(&self) -> Result<Topology> { + let req = ActiveTopologyGet::new(&self.config.base_url, None, None, None)?; + match self.make_rest_request(req).await? { + ActiveTopologyGetResponse::Ok(topology) => Ok(topology), + ActiveTopologyGetResponse::Error(err) => { + Err(ValidatorClientError::ValidatorError(err.error)) + } + } + } + + pub async fn post_mixmining_status(&self, status: MixStatus) -> Result<()> { + let req = MixStatusPost::new(&self.config.base_url, None, None, Some(status))?; + match self.make_rest_request(req).await? { + DefaultRESTResponse::Ok(ok_res) => { + if ok_res.ok { + Ok(()) + } else { + Err(ValidatorClientError::ValidatorError( + "received ok response with false".into(), + )) + } + } + DefaultRESTResponse::Error(err) => Err(ValidatorClientError::ValidatorError(err.error)), + } + } + + pub async fn post_batch_mixmining_status(&self, batch_status: BatchMixStatus) -> Result<()> { + let req = BatchMixStatusPost::new(&self.config.base_url, None, None, Some(batch_status))?; + match self.make_rest_request(req).await? { + DefaultRESTResponse::Ok(ok_res) => { + if ok_res.ok { + Ok(()) + } else { + Err(ValidatorClientError::ValidatorError( + "received ok response with false".into(), + )) + } + } + DefaultRESTResponse::Error(err) => Err(ValidatorClientError::ValidatorError(err.error)), + } + } +} + #[cfg(test)] -mod tests { - #[test] - fn it_works() { - assert_eq!(2 + 2, 4); +pub(crate) fn client_test_fixture(base_url: &str) -> Client { + Client { + config: Config::new(base_url), + reqwest_client: reqwest::Client::new(), } } diff --git a/common/client-libs/validator-client/src/models/gateway.rs b/common/client-libs/validator-client/src/models/gateway.rs new file mode 100644 index 00000000000..c408cb4deb4 --- /dev/null +++ b/common/client-libs/validator-client/src/models/gateway.rs @@ -0,0 +1,131 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +use crate::models::node::NodeInfo; +use crypto::asymmetric::{encryption, identity}; +use serde::{Deserialize, Serialize}; +use std::convert::TryInto; +use std::io; +use std::net::ToSocketAddrs; + +#[derive(Debug)] +pub enum ConversionError { + InvalidIdentityKeyError(identity::KeyRecoveryError), + InvalidSphinxKeyError(encryption::KeyRecoveryError), + InvalidAddress(io::Error), +} + +impl From<encryption::KeyRecoveryError> for ConversionError { + fn from(err: encryption::KeyRecoveryError) -> Self { + ConversionError::InvalidSphinxKeyError(err) + } +} + +impl From<identity::KeyRecoveryError> for ConversionError { + fn from(err: identity::KeyRecoveryError) -> Self { + ConversionError::InvalidIdentityKeyError(err) + } +} + +// used for gateways to register themselves +#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct GatewayRegistrationInfo { + #[serde(flatten)] + pub(crate) node_info: NodeInfo, + pub(crate) clients_host: String, +} + +impl GatewayRegistrationInfo { + pub fn new( + mix_host: String, + clients_host: String, + identity_key: String, + sphinx_key: String, + version: String, + location: String, + incentives_address: Option<String>, + ) -> Self { + GatewayRegistrationInfo { + node_info: NodeInfo { + mix_host, + identity_key, + sphinx_key, + version, + location, + incentives_address: incentives_address.unwrap_or_else(|| "".to_string()), + }, + clients_host, + } + } +} + +// actual entry in topology +#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct RegisteredGateway { + #[serde(flatten)] + pub(crate) gateway_info: GatewayRegistrationInfo, + pub(crate) registration_time: i64, + pub(crate) reputation: i64, +} + +impl RegisteredGateway { + pub fn identity(&self) -> String { + self.gateway_info.node_info.identity_key.clone() + } + + pub fn mixnet_listener(&self) -> String { + self.gateway_info.node_info.mix_host.clone() + } + + pub fn clients_listener(&self) -> String { + self.gateway_info.clients_host.clone() + } +} + +impl TryInto<topology::gateway::Node> for RegisteredGateway { + type Error = ConversionError; + + fn try_into(self) -> Result<topology::gateway::Node, Self::Error> { + let resolved_mix_hostname = self + .gateway_info + .node_info + .mix_host + .to_socket_addrs() + .map_err(ConversionError::InvalidAddress)? + .next() + .ok_or_else(|| { + ConversionError::InvalidAddress(io::Error::new( + io::ErrorKind::Other, + "no valid socket address", + )) + })?; + + Ok(topology::gateway::Node { + location: self.gateway_info.node_info.location, + mixnet_listener: resolved_mix_hostname, + client_listener: self.gateway_info.clients_host, + identity_key: identity::PublicKey::from_base58_string( + self.gateway_info.node_info.identity_key, + )?, + sphinx_key: encryption::PublicKey::from_base58_string( + self.gateway_info.node_info.sphinx_key, + )?, + registration_time: self.registration_time, + reputation: self.reputation, + version: self.gateway_info.node_info.version, + }) + } +} diff --git a/common/client-libs/validator-client/src/models/mixmining.rs b/common/client-libs/validator-client/src/models/mixmining.rs new file mode 100644 index 00000000000..270d1bb7fda --- /dev/null +++ b/common/client-libs/validator-client/src/models/mixmining.rs @@ -0,0 +1,19 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +/// A notification sent to the validators to let them know whether a given mix is +/// currently up or down (based on whether it's mixing packets) +pub struct MixStatus { + pub pub_key: String, + pub ip_version: String, + pub up: bool, +} + +#[derive(Debug, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +/// A notification sent to the validators to let them know whether a given set of mixes is +/// currently up or down (based on whether it's mixing packets) +pub struct BatchMixStatus { + pub status: Vec<MixStatus>, +} diff --git a/common/client-libs/validator-client/src/models/mixnode.rs b/common/client-libs/validator-client/src/models/mixnode.rs new file mode 100644 index 00000000000..b72eabafe20 --- /dev/null +++ b/common/client-libs/validator-client/src/models/mixnode.rs @@ -0,0 +1,127 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +use crate::models::node::NodeInfo; +use crypto::asymmetric::{encryption, identity}; +use serde::{Deserialize, Serialize}; +use std::convert::TryInto; +use std::io; +use std::net::ToSocketAddrs; + +#[derive(Debug)] +pub enum ConversionError { + InvalidIdentityKeyError(identity::KeyRecoveryError), + InvalidSphinxKeyError(encryption::KeyRecoveryError), + InvalidAddress(io::Error), +} + +impl From<encryption::KeyRecoveryError> for ConversionError { + fn from(err: encryption::KeyRecoveryError) -> Self { + ConversionError::InvalidSphinxKeyError(err) + } +} + +impl From<identity::KeyRecoveryError> for ConversionError { + fn from(err: identity::KeyRecoveryError) -> Self { + ConversionError::InvalidIdentityKeyError(err) + } +} + +// used for mixnode to register themselves +#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct MixRegistrationInfo { + #[serde(flatten)] + pub(crate) node_info: NodeInfo, + pub(crate) layer: u64, +} + +impl MixRegistrationInfo { + pub fn new( + mix_host: String, + identity_key: String, + sphinx_key: String, + version: String, + location: String, + layer: u64, + incentives_address: Option<String>, + ) -> Self { + MixRegistrationInfo { + node_info: NodeInfo { + mix_host, + identity_key, + sphinx_key, + version, + location, + incentives_address: incentives_address.unwrap_or_else(|| "".to_string()), + }, + layer, + } + } +} + +// actual entry in topology +#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct RegisteredMix { + #[serde(flatten)] + pub(crate) mix_info: MixRegistrationInfo, + pub(crate) registration_time: i64, + pub(crate) reputation: i64, +} + +impl RegisteredMix { + pub fn identity(&self) -> String { + self.mix_info.node_info.identity_key.clone() + } + + pub fn mix_host(&self) -> String { + self.mix_info.node_info.mix_host.clone() + } +} + +impl TryInto<topology::mix::Node> for RegisteredMix { + type Error = ConversionError; + + fn try_into(self) -> Result<topology::mix::Node, Self::Error> { + let resolved_hostname = self + .mix_info + .node_info + .mix_host + .to_socket_addrs() + .map_err(ConversionError::InvalidAddress)? + .next() + .ok_or_else(|| { + ConversionError::InvalidAddress(io::Error::new( + io::ErrorKind::Other, + "no valid socket address", + )) + })?; + + Ok(topology::mix::Node { + location: self.mix_info.node_info.location, + host: resolved_hostname, + identity_key: identity::PublicKey::from_base58_string( + self.mix_info.node_info.identity_key, + )?, + sphinx_key: encryption::PublicKey::from_base58_string( + self.mix_info.node_info.sphinx_key, + )?, + layer: self.mix_info.layer, + registration_time: self.registration_time, + reputation: self.reputation, + version: self.mix_info.node_info.version, + }) + } +} diff --git a/validator/src/network/rest/routes/mod.rs b/common/client-libs/validator-client/src/models/mod.rs similarity index 88% rename from validator/src/network/rest/routes/mod.rs rename to common/client-libs/validator-client/src/models/mod.rs index fcd639a99fa..f6076854b1e 100644 --- a/validator/src/network/rest/routes/mod.rs +++ b/common/client-libs/validator-client/src/models/mod.rs @@ -12,7 +12,9 @@ // See the License for the specific language governing permissions and // limitations under the License. -use iron::prelude::*; -use iron::status; - +pub mod gateway; +pub mod mixmining; +pub mod mixnode; +mod node; pub mod topology; +pub mod validators; diff --git a/clients/client-core/build.rs b/common/client-libs/validator-client/src/models/node.rs similarity index 61% rename from clients/client-core/build.rs rename to common/client-libs/validator-client/src/models/node.rs index 56d753472cf..cfbdd82546e 100644 --- a/clients/client-core/build.rs +++ b/common/client-libs/validator-client/src/models/node.rs @@ -12,8 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. -use built; +use serde::{Deserialize, Serialize}; -fn main() { - built::write_built_file().expect("Failed to acquire build-time information"); +#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct NodeInfo { + pub(crate) mix_host: String, + pub(crate) identity_key: String, + pub(crate) sphinx_key: String, + pub(crate) version: String, + pub(crate) location: String, + pub(crate) incentives_address: String, } diff --git a/common/client-libs/validator-client/src/models/topology.rs b/common/client-libs/validator-client/src/models/topology.rs new file mode 100644 index 00000000000..5b9eff2a768 --- /dev/null +++ b/common/client-libs/validator-client/src/models/topology.rs @@ -0,0 +1,74 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +use crate::models::gateway::RegisteredGateway; +use crate::models::mixnode::RegisteredMix; +use crate::models::validators::ValidatorsOutput; +use log::*; +use serde::{Deserialize, Serialize}; +use std::convert::TryInto; +use topology::{MixLayer, NymTopology}; + +// Topology shows us the current state of the overall Nym network +#[derive(Clone, Debug, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct Topology { + pub mix_nodes: Vec<RegisteredMix>, + pub gateways: Vec<RegisteredGateway>, + pub validators: ValidatorsOutput, +} + +// changed from `TryInto`. reason being is that we should not fail entire topology +// conversion if there's one invalid node on the network screwing around +impl Into<NymTopology> for Topology { + fn into(self) -> NymTopology { + use std::collections::HashMap; + + let mut mixes = HashMap::new(); + for mix in self.mix_nodes.into_iter() { + let layer = mix.mix_info.layer as MixLayer; + if layer == 0 || layer > 3 { + warn!( + "{} says it's on invalid layer {}!", + mix.mix_info.node_info.identity_key, layer + ); + continue; + } + let mix_id = mix.mix_info.node_info.identity_key.clone(); + + let layer_entry = mixes.entry(layer).or_insert_with(Vec::new); + match mix.try_into() { + Ok(mix) => layer_entry.push(mix), + Err(err) => { + warn!("Mix {} is malformed - {:?}", mix_id, err); + continue; + } + } + } + + let mut gateways = Vec::with_capacity(self.gateways.len()); + for gate in self.gateways.into_iter() { + let gate_id = gate.gateway_info.node_info.identity_key.clone(); + match gate.try_into() { + Ok(gate) => gateways.push(gate), + Err(err) => { + warn!("Gateway {} is malformed - {:?}", gate_id, err); + continue; + } + } + } + + NymTopology::new(mixes, gateways) + } +} diff --git a/common/client-libs/directory-client/models/src/presence/providers.rs b/common/client-libs/validator-client/src/models/validators.rs similarity index 66% rename from common/client-libs/directory-client/models/src/presence/providers.rs rename to common/client-libs/validator-client/src/models/validators.rs index a4875a048a5..511ace0d19b 100644 --- a/common/client-libs/directory-client/models/src/presence/providers.rs +++ b/common/client-libs/validator-client/src/models/validators.rs @@ -15,19 +15,15 @@ use serde::{Deserialize, Serialize}; #[derive(Clone, Debug, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct MixProviderPresence { - pub location: String, - pub client_listener: String, - pub mixnet_listener: String, - pub pub_key: String, - pub registered_clients: Vec<MixProviderClient>, - pub last_seen: u64, - pub version: String, +pub struct ValidatorsOutput { + pub(crate) block_height: i64, + pub(crate) validators: Vec<ValidatorOutput>, } #[derive(Clone, Debug, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct MixProviderClient { - pub pub_key: String, +pub(crate) struct ValidatorOutput { + pub(crate) address: String, + pub(crate) pub_key: String, + pub(crate) proposer_priority: i64, + pub(crate) voting_power: i64, } diff --git a/common/client-libs/validator-client/src/rest_requests/active_topology_get.rs b/common/client-libs/validator-client/src/rest_requests/active_topology_get.rs new file mode 100644 index 00000000000..1973cea1d85 --- /dev/null +++ b/common/client-libs/validator-client/src/rest_requests/active_topology_get.rs @@ -0,0 +1,54 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +use crate::models::topology::Topology; +use crate::rest_requests::{PathParam, QueryParam, RESTRequest, RESTRequestError}; +use crate::ErrorResponse; +use reqwest::{Method, Url}; +use serde::Deserialize; + +pub struct Request { + url: Url, +} + +#[derive(Deserialize)] +#[serde(rename_all = "camelCase", untagged)] +pub(crate) enum Response { + Ok(Topology), + Error(ErrorResponse), +} + +impl RESTRequest for Request { + const METHOD: Method = Method::GET; + const RELATIVE_PATH: &'static str = "/api/mixmining/topology/active"; + + type JsonPayload = (); + type ExpectedJsonResponse = Response; + + fn new( + base_url: &str, + _: Option<Vec<PathParam>>, + _: Option<Vec<QueryParam>>, + _: Option<Self::JsonPayload>, + ) -> Result<Self, RESTRequestError> { + let url = Url::parse(&format!("{}{}", base_url, Self::RELATIVE_PATH)) + .map_err(|err| RESTRequestError::MalformedUrl(err.to_string()))?; + + Ok(Request { url }) + } + + fn url(&self) -> &Url { + &self.url + } +} diff --git a/common/client-libs/validator-client/src/rest_requests/gateway_register_post.rs b/common/client-libs/validator-client/src/rest_requests/gateway_register_post.rs new file mode 100644 index 00000000000..a2ba865bee9 --- /dev/null +++ b/common/client-libs/validator-client/src/rest_requests/gateway_register_post.rs @@ -0,0 +1,52 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +use crate::models::gateway::GatewayRegistrationInfo; +use crate::rest_requests::{PathParam, QueryParam, RESTRequest, RESTRequestError}; +use crate::DefaultRESTResponse; +use reqwest::{Method, Url}; + +pub struct Request { + url: Url, + payload: GatewayRegistrationInfo, +} + +impl RESTRequest for Request { + const METHOD: Method = Method::POST; + const RELATIVE_PATH: &'static str = "/api/mixmining/register/gateway"; + + type JsonPayload = GatewayRegistrationInfo; + type ExpectedJsonResponse = DefaultRESTResponse; + + fn new( + base_url: &str, + _: Option<Vec<PathParam>>, + _: Option<Vec<QueryParam>>, + body_payload: Option<Self::JsonPayload>, + ) -> Result<Self, RESTRequestError> { + let payload = body_payload.ok_or_else(|| RESTRequestError::NoPayloadProvided)?; + let url = Url::parse(&format!("{}{}", base_url, Self::RELATIVE_PATH)) + .map_err(|err| RESTRequestError::MalformedUrl(err.to_string()))?; + + Ok(Request { url, payload }) + } + + fn url(&self) -> &Url { + &self.url + } + + fn json_payload(&self) -> Option<&Self::JsonPayload> { + Some(&self.payload) + } +} diff --git a/common/client-libs/validator-client/src/rest_requests/mix_mining_batch_status_post.rs b/common/client-libs/validator-client/src/rest_requests/mix_mining_batch_status_post.rs new file mode 100644 index 00000000000..df109f9bf1b --- /dev/null +++ b/common/client-libs/validator-client/src/rest_requests/mix_mining_batch_status_post.rs @@ -0,0 +1,98 @@ +use crate::models::mixmining::BatchMixStatus; +use crate::rest_requests::{PathParam, QueryParam, RESTRequest, RESTRequestError}; +use crate::DefaultRESTResponse; +use reqwest::{Method, Url}; + +pub struct Request { + url: Url, + payload: BatchMixStatus, +} + +impl RESTRequest for Request { + const METHOD: Method = Method::POST; + const RELATIVE_PATH: &'static str = "/api/mixmining/batch"; + type JsonPayload = BatchMixStatus; + type ExpectedJsonResponse = DefaultRESTResponse; + + fn new( + base_url: &str, + _: Option<Vec<PathParam>>, + _: Option<Vec<QueryParam>>, + body_payload: Option<Self::JsonPayload>, + ) -> Result<Self, RESTRequestError> { + let payload = body_payload.ok_or_else(|| RESTRequestError::NoPayloadProvided)?; + let url = Url::parse(&format!("{}{}", base_url, Self::RELATIVE_PATH)) + .map_err(|err| RESTRequestError::MalformedUrl(err.to_string()))?; + Ok(Request { url, payload }) + } + + fn url(&self) -> &Url { + &self.url + } + + fn json_payload(&self) -> Option<&Self::JsonPayload> { + Some(&self.payload) + } +} + +#[cfg(test)] +mod batch_mix_status_post_request { + use super::*; + use crate::client_test_fixture; + use mockito::mock; + + #[cfg(test)] + mod on_a_400_status { + use super::*; + + #[tokio::test] + async fn it_returns_an_error() { + let _m = mock("POST", Request::RELATIVE_PATH) + .with_status(400) + .create(); + let client = client_test_fixture(&mockito::server_url()); + let result = client + .post_batch_mixmining_status(fixtures::new_status()) + .await; + assert!(result.is_err()); + _m.assert(); + } + } + + #[cfg(test)] + mod on_a_201 { + use super::*; + + #[tokio::test] + async fn it_returns_a_response_with_201() { + let json = r#"{ + "ok": true + }"#; + let _m = mock("POST", "/api/mixmining/batch") + .with_status(201) + .with_body(json) + .create(); + let client = client_test_fixture(&mockito::server_url()); + let result = client + .post_batch_mixmining_status(fixtures::new_status()) + .await; + assert!(result.is_ok()); + _m.assert(); + } + } + + #[cfg(test)] + mod fixtures { + use crate::models::mixmining::{BatchMixStatus, MixStatus}; + + pub fn new_status() -> BatchMixStatus { + BatchMixStatus { + status: vec![MixStatus { + pub_key: "abc".to_string(), + ip_version: "4".to_string(), + up: true, + }], + } + } + } +} diff --git a/common/client-libs/validator-client/src/rest_requests/mix_mining_status_post.rs b/common/client-libs/validator-client/src/rest_requests/mix_mining_status_post.rs new file mode 100644 index 00000000000..2f82642d299 --- /dev/null +++ b/common/client-libs/validator-client/src/rest_requests/mix_mining_status_post.rs @@ -0,0 +1,91 @@ +use crate::models::mixmining::MixStatus; +use crate::rest_requests::{PathParam, QueryParam, RESTRequest, RESTRequestError}; +use crate::DefaultRESTResponse; +use reqwest::{Method, Url}; + +pub struct Request { + url: Url, + payload: MixStatus, +} + +impl RESTRequest for Request { + const METHOD: Method = Method::POST; + const RELATIVE_PATH: &'static str = "/api/mixmining"; + type JsonPayload = MixStatus; + type ExpectedJsonResponse = DefaultRESTResponse; + + fn new( + base_url: &str, + _: Option<Vec<PathParam>>, + _: Option<Vec<QueryParam>>, + body_payload: Option<Self::JsonPayload>, + ) -> Result<Self, RESTRequestError> { + let payload = body_payload.ok_or_else(|| RESTRequestError::NoPayloadProvided)?; + let url = Url::parse(&format!("{}{}", base_url, Self::RELATIVE_PATH)) + .map_err(|err| RESTRequestError::MalformedUrl(err.to_string()))?; + Ok(Request { url, payload }) + } + + fn url(&self) -> &Url { + &self.url + } + + fn json_payload(&self) -> Option<&Self::JsonPayload> { + Some(&self.payload) + } +} + +#[cfg(test)] +mod mix_status_post_request { + use super::*; + use crate::client_test_fixture; + use mockito::mock; + + #[cfg(test)] + mod on_a_400_status { + use super::*; + + #[tokio::test] + async fn it_returns_an_error() { + let _m = mock("POST", Request::RELATIVE_PATH) + .with_status(400) + .create(); + let client = client_test_fixture(&mockito::server_url()); + let result = client.post_mixmining_status(fixtures::new_status()).await; + assert!(result.is_err()); + _m.assert(); + } + } + + #[cfg(test)] + mod on_a_201 { + use super::*; + #[tokio::test] + async fn it_returns_a_response_with_201() { + let json = r#"{ + "ok": true + }"#; + let _m = mock("POST", Request::RELATIVE_PATH) + .with_status(201) + .with_body(json) + .create(); + let client = client_test_fixture(&mockito::server_url()); + let result = client.post_mixmining_status(fixtures::new_status()).await; + assert!(result.is_ok()); + _m.assert(); + } + } + + #[cfg(test)] + mod fixtures { + use crate::models::mixmining::MixStatus; + + pub fn new_status() -> MixStatus { + MixStatus { + pub_key: "abc".to_string(), + ip_version: "4".to_string(), + up: true, + } + } + } +} diff --git a/common/client-libs/validator-client/src/rest_requests/mix_register_post.rs b/common/client-libs/validator-client/src/rest_requests/mix_register_post.rs new file mode 100644 index 00000000000..4a0c477a1a3 --- /dev/null +++ b/common/client-libs/validator-client/src/rest_requests/mix_register_post.rs @@ -0,0 +1,52 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +use crate::models::mixnode::MixRegistrationInfo; +use crate::rest_requests::{PathParam, QueryParam, RESTRequest, RESTRequestError}; +use crate::DefaultRESTResponse; +use reqwest::{Method, Url}; + +pub struct Request { + url: Url, + payload: MixRegistrationInfo, +} + +impl RESTRequest for Request { + const METHOD: Method = Method::POST; + const RELATIVE_PATH: &'static str = "/api/mixmining/register/mix"; + + type JsonPayload = MixRegistrationInfo; + type ExpectedJsonResponse = DefaultRESTResponse; + + fn new( + base_url: &str, + _: Option<Vec<PathParam>>, + _: Option<Vec<QueryParam>>, + body_payload: Option<Self::JsonPayload>, + ) -> Result<Self, RESTRequestError> { + let payload = body_payload.ok_or_else(|| RESTRequestError::NoPayloadProvided)?; + let url = Url::parse(&format!("{}{}", base_url, Self::RELATIVE_PATH)) + .map_err(|err| RESTRequestError::MalformedUrl(err.to_string()))?; + + Ok(Request { url, payload }) + } + + fn url(&self) -> &Url { + &self.url + } + + fn json_payload(&self) -> Option<&Self::JsonPayload> { + Some(&self.payload) + } +} diff --git a/common/client-libs/validator-client/src/rest_requests/mod.rs b/common/client-libs/validator-client/src/rest_requests/mod.rs new file mode 100644 index 00000000000..49b5f543900 --- /dev/null +++ b/common/client-libs/validator-client/src/rest_requests/mod.rs @@ -0,0 +1,74 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +use reqwest::{Method, Url}; +use serde::{de::DeserializeOwned, Serialize}; + +pub(crate) use active_topology_get::{ + Request as ActiveTopologyGet, Response as ActiveTopologyGetResponse, +}; +pub(crate) use gateway_register_post::Request as GatewayRegisterPost; +pub(crate) use mix_mining_batch_status_post::Request as BatchMixStatusPost; +pub(crate) use mix_mining_status_post::Request as MixStatusPost; +pub(crate) use mix_register_post::Request as MixRegisterPost; +pub(crate) use node_unregister_delete::Request as NodeUnregisterDelete; +pub(crate) use set_reputation_patch::Request as ReputationPatch; +pub(crate) use topology_get::{Request as TopologyGet, Response as TopologyGetResponse}; + +pub mod active_topology_get; +pub mod gateway_register_post; +pub mod mix_mining_batch_status_post; +pub mod mix_mining_status_post; +pub mod mix_register_post; +pub mod node_unregister_delete; +pub mod set_reputation_patch; +pub mod topology_get; + +type PathParam<'a> = &'a str; +type QueryParam<'a> = (&'a str, &'a str); + +#[derive(Debug)] +pub enum RESTRequestError { + InvalidPathParams, + InvalidQueryParams, + NoPayloadProvided, + MalformedUrl(String), +} + +pub(crate) trait RESTRequest { + const METHOD: Method; // 'GET', 'POST', 'DELETE', etc. + const RELATIVE_PATH: &'static str; + + type JsonPayload: Serialize + Sized; + type ExpectedJsonResponse: DeserializeOwned + Sized; + + fn new( + base_url: &str, + path_params: Option<Vec<PathParam>>, + query_params: Option<Vec<QueryParam>>, + body_payload: Option<Self::JsonPayload>, + ) -> Result<Self, RESTRequestError> + where + Self: Sized; + + fn url(&self) -> &Url; + + fn json_payload(&self) -> Option<&Self::JsonPayload> { + None + } + + fn query_param_keys() -> Vec<&'static str> { + Vec::new() + } +} diff --git a/common/client-libs/validator-client/src/rest_requests/node_unregister_delete.rs b/common/client-libs/validator-client/src/rest_requests/node_unregister_delete.rs new file mode 100644 index 00000000000..a899724b0e1 --- /dev/null +++ b/common/client-libs/validator-client/src/rest_requests/node_unregister_delete.rs @@ -0,0 +1,52 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +use crate::rest_requests::{PathParam, QueryParam, RESTRequest, RESTRequestError}; +use crate::DefaultRESTResponse; +use reqwest::{Method, Url}; + +pub struct Request { + url: Url, +} + +impl RESTRequest for Request { + const METHOD: Method = Method::DELETE; + const RELATIVE_PATH: &'static str = "/api/mixmining/register"; + type JsonPayload = (); + type ExpectedJsonResponse = DefaultRESTResponse; + + fn new( + base_url: &str, + path_params: Option<Vec<PathParam>>, + _: Option<Vec<QueryParam>>, + _: Option<Self::JsonPayload>, + ) -> Result<Self, RESTRequestError> { + // node unregister requires single path param - the node id + let path_params = path_params.ok_or_else(|| RESTRequestError::InvalidPathParams)?; + if path_params.len() != 1 { + return Err(RESTRequestError::InvalidPathParams); + } + // <base_url>/api/mixmining/register/{id} + let base = format!("{}{}/{}", base_url, Self::RELATIVE_PATH, path_params[0]); + + let url = + Url::parse(&base).map_err(|err| RESTRequestError::MalformedUrl(err.to_string()))?; + + Ok(Request { url }) + } + + fn url(&self) -> &Url { + &self.url + } +} diff --git a/common/client-libs/validator-client/src/rest_requests/set_reputation_patch.rs b/common/client-libs/validator-client/src/rest_requests/set_reputation_patch.rs new file mode 100644 index 00000000000..3307fcccba7 --- /dev/null +++ b/common/client-libs/validator-client/src/rest_requests/set_reputation_patch.rs @@ -0,0 +1,63 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +use crate::rest_requests::{PathParam, QueryParam, RESTRequest, RESTRequestError}; +use crate::DefaultRESTResponse; +use reqwest::{Method, Url}; + +pub struct Request { + url: Url, +} + +impl RESTRequest for Request { + const METHOD: Method = Method::PATCH; + const RELATIVE_PATH: &'static str = "/api/mixmining/reputation"; + type JsonPayload = (); + type ExpectedJsonResponse = DefaultRESTResponse; + + fn new( + base_url: &str, + path_params: Option<Vec<PathParam>>, + query_params: Option<Vec<QueryParam>>, + _: Option<Self::JsonPayload>, + ) -> Result<Self, RESTRequestError> { + // set reputation requires single path param - the node id + // and single query param - what reputation should it be set to + let path_params = path_params.ok_or_else(|| RESTRequestError::InvalidPathParams)?; + if path_params.len() != 1 { + return Err(RESTRequestError::InvalidPathParams); + } + + let query_params = query_params.ok_or_else(|| RESTRequestError::InvalidQueryParams)?; + if query_params.len() != 1 { + return Err(RESTRequestError::InvalidQueryParams); + } + + // <base_url>/api/mixmining/reputation/{id} + let base = format!("{}{}/{}", base_url, Self::RELATIVE_PATH, path_params[0]); + + let url = Url::parse_with_params(&base, query_params) + .map_err(|err| RESTRequestError::MalformedUrl(err.to_string()))?; + + Ok(Request { url }) + } + + fn url(&self) -> &Url { + &self.url + } + + fn query_param_keys() -> Vec<&'static str> { + vec!["reputation"] + } +} diff --git a/common/client-libs/validator-client/src/rest_requests/topology_get.rs b/common/client-libs/validator-client/src/rest_requests/topology_get.rs new file mode 100644 index 00000000000..71f5ed8b1bb --- /dev/null +++ b/common/client-libs/validator-client/src/rest_requests/topology_get.rs @@ -0,0 +1,54 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +use crate::models::topology::Topology; +use crate::rest_requests::{PathParam, QueryParam, RESTRequest, RESTRequestError}; +use crate::ErrorResponse; +use reqwest::{Method, Url}; +use serde::Deserialize; + +pub struct Request { + url: Url, +} + +#[derive(Deserialize)] +#[serde(rename_all = "camelCase", untagged)] +pub(crate) enum Response { + Ok(Topology), + Error(ErrorResponse), +} + +impl RESTRequest for Request { + const METHOD: Method = Method::GET; + const RELATIVE_PATH: &'static str = "/api/mixmining/topology"; + + type JsonPayload = (); + type ExpectedJsonResponse = Response; + + fn new( + base_url: &str, + _: Option<Vec<PathParam>>, + _: Option<Vec<QueryParam>>, + _: Option<Self::JsonPayload>, + ) -> Result<Self, RESTRequestError> { + let url = Url::parse(&format!("{}{}", base_url, Self::RELATIVE_PATH)) + .map_err(|err| RESTRequestError::MalformedUrl(err.to_string()))?; + + Ok(Request { url }) + } + + fn url(&self) -> &Url { + &self.url + } +} diff --git a/common/config/src/lib.rs b/common/config/src/lib.rs index cde93027882..7a5f1405b37 100644 --- a/common/config/src/lib.rs +++ b/common/config/src/lib.rs @@ -21,21 +21,23 @@ use std::{fs, io}; pub trait NymConfig: Default + Serialize + DeserializeOwned { fn template() -> &'static str; - fn config_file_name() -> String; + fn config_file_name() -> String { + "config.toml".to_string() + } fn default_root_directory() -> PathBuf; // default, most probable, implementations; can be easily overridden where required - fn default_config_directory(id: Option<&str>) -> PathBuf { - Self::default_root_directory() - .join(id.unwrap_or("")) - .join("config") + fn default_config_directory(id: &str) -> PathBuf { + Self::default_root_directory().join(id).join("config") + } + + fn default_data_directory(id: &str) -> PathBuf { + Self::default_root_directory().join(id).join("data") } - fn default_data_directory(id: Option<&str>) -> PathBuf { - Self::default_root_directory() - .join(id.unwrap_or("")) - .join("data") + fn default_config_file_path(id: &str) -> PathBuf { + Self::default_config_directory(id).join(Self::config_file_name()) } fn root_directory(&self) -> PathBuf; @@ -66,11 +68,8 @@ pub trait NymConfig: Default + Serialize + DeserializeOwned { ) } - fn load_from_file(custom_location: Option<PathBuf>, id: Option<&str>) -> io::Result<Self> { - let config_contents = fs::read_to_string( - custom_location - .unwrap_or_else(|| Self::default_config_directory(id).join("config.toml")), - )?; + fn load_from_file(id: &str) -> io::Result<Self> { + let config_contents = fs::read_to_string(Self::default_config_file_path(id))?; toml::from_str(&config_contents) .map_err(|toml_err| io::Error::new(io::ErrorKind::Other, toml_err)) diff --git a/common/crypto/Cargo.toml b/common/crypto/Cargo.toml index f190c743c74..a6c3980e11e 100644 --- a/common/crypto/Cargo.toml +++ b/common/crypto/Cargo.toml @@ -15,11 +15,11 @@ generic-array = "0.14" hkdf = "0.9" hmac = "0.8" stream-cipher = "0.4" -x25519-dalek = "0.6" -ed25519-dalek = "1.0.0-pre.4" +x25519-dalek = "1.1" +ed25519-dalek = "1.0" log = "0.4" pretty_env_logger = "0.3" -rand = {version = "0.7.3", features = ["wasm-bindgen"]} +rand = { version = "0.7.3", features = ["wasm-bindgen"] } # internal nymsphinx-types = { path = "../nymsphinx/types" } diff --git a/common/crypto/src/asymmetric/encryption/mod.rs b/common/crypto/src/asymmetric/encryption/mod.rs index b8433efcd5f..f080717d9ff 100644 --- a/common/crypto/src/asymmetric/encryption/mod.rs +++ b/common/crypto/src/asymmetric/encryption/mod.rs @@ -25,23 +25,31 @@ pub const PUBLIC_KEY_SIZE: usize = 32; /// Size of a X25519 shared secret pub const SHARED_SECRET_SIZE: usize = 32; -#[derive(Clone, Copy, Eq, PartialEq, Hash, Debug)] -pub enum EncryptionKeyError { - InvalidPublicKey, - InvalidPrivateKey, +#[derive(Clone, Copy, Eq, PartialEq, Debug)] +pub enum KeyRecoveryError { + InvalidPublicKeyBytes, + InvalidPrivateKeyBytes, + MalformedString(bs58::decode::Error), +} + +impl From<bs58::decode::Error> for KeyRecoveryError { + fn from(err: bs58::decode::Error) -> Self { + KeyRecoveryError::MalformedString(err) + } } // required for std::error::Error -impl Display for EncryptionKeyError { +impl Display for KeyRecoveryError { fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { match self { - EncryptionKeyError::InvalidPrivateKey => write!(f, "Invalid private key"), - EncryptionKeyError::InvalidPublicKey => write!(f, "Invalid public key"), + KeyRecoveryError::InvalidPrivateKeyBytes => write!(f, "Invalid private key bytes"), + KeyRecoveryError::InvalidPublicKeyBytes => write!(f, "Invalid public key bytes"), + KeyRecoveryError::MalformedString(err) => write!(f, "malformed string - {}", err), } } } -impl std::error::Error for EncryptionKeyError {} +impl std::error::Error for KeyRecoveryError {} pub struct KeyPair { pub(crate) private_key: PrivateKey, @@ -72,7 +80,7 @@ impl KeyPair { &self.public_key } - pub fn from_bytes(priv_bytes: &[u8], pub_bytes: &[u8]) -> Result<Self, EncryptionKeyError> { + pub fn from_bytes(priv_bytes: &[u8], pub_bytes: &[u8]) -> Result<Self, KeyRecoveryError> { Ok(KeyPair { private_key: PrivateKey::from_bytes(priv_bytes)?, public_key: PublicKey::from_bytes(pub_bytes)?, @@ -100,7 +108,7 @@ impl PemStorableKeyPair for KeyPair { } } -#[derive(Debug, Copy, Clone)] +#[derive(PartialEq, Eq, Hash, Copy, Clone, Debug)] pub struct PublicKey(x25519_dalek::PublicKey); impl PublicKey { @@ -108,9 +116,9 @@ impl PublicKey { *self.0.as_bytes() } - pub fn from_bytes(b: &[u8]) -> Result<Self, EncryptionKeyError> { + pub fn from_bytes(b: &[u8]) -> Result<Self, KeyRecoveryError> { if b.len() != PUBLIC_KEY_SIZE { - return Err(EncryptionKeyError::InvalidPublicKey); + return Err(KeyRecoveryError::InvalidPublicKeyBytes); } let mut bytes = [0; PUBLIC_KEY_SIZE]; bytes.copy_from_slice(&b[..PUBLIC_KEY_SIZE]); @@ -121,16 +129,14 @@ impl PublicKey { bs58::encode(&self.to_bytes()).into_string() } - pub fn from_base58_string<S: Into<String>>(val: S) -> Result<Self, EncryptionKeyError> { - let bytes = bs58::decode(val.into()) - .into_vec() - .expect("TODO: deal with this failure case"); + pub fn from_base58_string<S: Into<String>>(val: S) -> Result<Self, KeyRecoveryError> { + let bytes = bs58::decode(val.into()).into_vec()?; Self::from_bytes(&bytes) } } impl PemStorableKey for PublicKey { - type Error = EncryptionKeyError; + type Error = KeyRecoveryError; fn pem_type() -> &'static str { "X25519 PUBLIC KEY" @@ -159,9 +165,9 @@ impl PrivateKey { self.0.to_bytes() } - pub fn from_bytes(b: &[u8]) -> Result<Self, EncryptionKeyError> { + pub fn from_bytes(b: &[u8]) -> Result<Self, KeyRecoveryError> { if b.len() != PRIVATE_KEY_SIZE { - return Err(EncryptionKeyError::InvalidPrivateKey); + return Err(KeyRecoveryError::InvalidPrivateKeyBytes); } let mut bytes = [0; 32]; bytes.copy_from_slice(&b[..PRIVATE_KEY_SIZE]); @@ -172,10 +178,8 @@ impl PrivateKey { bs58::encode(&self.to_bytes()).into_string() } - pub fn from_base58_string<S: Into<String>>(val: S) -> Result<Self, EncryptionKeyError> { - let bytes = bs58::decode(val.into()) - .into_vec() - .expect("TODO: deal with this failure case"); + pub fn from_base58_string<S: Into<String>>(val: S) -> Result<Self, KeyRecoveryError> { + let bytes = bs58::decode(val.into()).into_vec()?; Self::from_bytes(&bytes) } @@ -186,7 +190,7 @@ impl PrivateKey { } impl PemStorableKey for PrivateKey { - type Error = EncryptionKeyError; + type Error = KeyRecoveryError; fn pem_type() -> &'static str { "X25519 PRIVATE KEY" diff --git a/common/crypto/src/asymmetric/identity/mod.rs b/common/crypto/src/asymmetric/identity/mod.rs index 6e00d34ea3f..3bec2a786e7 100644 --- a/common/crypto/src/asymmetric/identity/mod.rs +++ b/common/crypto/src/asymmetric/identity/mod.rs @@ -12,13 +12,42 @@ // See the License for the specific language governing permissions and // limitations under the License. -use bs58; use ed25519_dalek::ed25519::signature::Signature as SignatureTrait; pub use ed25519_dalek::SignatureError; pub use ed25519_dalek::{Verifier, PUBLIC_KEY_LENGTH, SECRET_KEY_LENGTH, SIGNATURE_LENGTH}; use nymsphinx_types::{DestinationAddressBytes, DESTINATION_ADDRESS_LENGTH}; use pemstore::traits::{PemStorableKey, PemStorableKeyPair}; use rand::{rngs::OsRng, CryptoRng, RngCore}; +use std::fmt::{self, Formatter}; + +#[derive(Debug)] +pub enum KeyRecoveryError { + MalformedBytes(SignatureError), + MalformedString(bs58::decode::Error), +} + +impl From<SignatureError> for KeyRecoveryError { + fn from(err: SignatureError) -> Self { + KeyRecoveryError::MalformedBytes(err) + } +} + +impl From<bs58::decode::Error> for KeyRecoveryError { + fn from(err: bs58::decode::Error) -> Self { + KeyRecoveryError::MalformedString(err) + } +} + +impl fmt::Display for KeyRecoveryError { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + match self { + KeyRecoveryError::MalformedBytes(err) => write!(f, "malformed bytes - {}", err), + KeyRecoveryError::MalformedString(err) => write!(f, "malformed string - {}", err), + } + } +} + +impl std::error::Error for KeyRecoveryError {} /// Keypair for usage in ed25519 EdDSA. pub struct KeyPair { @@ -49,7 +78,7 @@ impl KeyPair { &self.public_key } - pub fn from_bytes(priv_bytes: &[u8], pub_bytes: &[u8]) -> Result<Self, SignatureError> { + pub fn from_bytes(priv_bytes: &[u8], pub_bytes: &[u8]) -> Result<Self, KeyRecoveryError> { Ok(KeyPair { private_key: PrivateKey::from_bytes(priv_bytes)?, public_key: PublicKey::from_bytes(pub_bytes)?, @@ -96,7 +125,7 @@ impl PublicKey { self.0.to_bytes() } - pub fn from_bytes(b: &[u8]) -> Result<Self, SignatureError> { + pub fn from_bytes(b: &[u8]) -> Result<Self, KeyRecoveryError> { Ok(PublicKey(ed25519_dalek::PublicKey::from_bytes(b)?)) } @@ -104,10 +133,8 @@ impl PublicKey { bs58::encode(&self.to_bytes()).into_string() } - pub fn from_base58_string<S: Into<String>>(val: S) -> Result<Self, SignatureError> { - let bytes = bs58::decode(val.into()) - .into_vec() - .expect("TODO: deal with this failure case"); + pub fn from_base58_string<S: Into<String>>(val: S) -> Result<Self, KeyRecoveryError> { + let bytes = bs58::decode(val.into()).into_vec()?; Self::from_bytes(&bytes) } @@ -117,7 +144,7 @@ impl PublicKey { } impl PemStorableKey for PublicKey { - type Error = SignatureError; + type Error = KeyRecoveryError; fn pem_type() -> &'static str { "ED25519 PUBLIC KEY" @@ -147,7 +174,7 @@ impl PrivateKey { self.0.to_bytes() } - pub fn from_bytes(b: &[u8]) -> Result<Self, SignatureError> { + pub fn from_bytes(b: &[u8]) -> Result<Self, KeyRecoveryError> { Ok(PrivateKey(ed25519_dalek::SecretKey::from_bytes(b)?)) } @@ -155,10 +182,8 @@ impl PrivateKey { bs58::encode(&self.to_bytes()).into_string() } - pub fn from_base58_string<S: Into<String>>(val: S) -> Result<Self, SignatureError> { - let bytes = bs58::decode(val.into()) - .into_vec() - .expect("TODO: deal with this failure case"); + pub fn from_base58_string<S: Into<String>>(val: S) -> Result<Self, KeyRecoveryError> { + let bytes = bs58::decode(val.into()).into_vec()?; Self::from_bytes(&bytes) } @@ -171,7 +196,7 @@ impl PrivateKey { } impl PemStorableKey for PrivateKey { - type Error = SignatureError; + type Error = KeyRecoveryError; fn pem_type() -> &'static str { "ED25519 PRIVATE KEY" diff --git a/common/mixnode-common/Cargo.toml b/common/mixnode-common/Cargo.toml new file mode 100644 index 00000000000..c1fe96df6ec --- /dev/null +++ b/common/mixnode-common/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "mixnode-common" +version = "0.1.0" +authors = ["JÄ™drzej StuczyÅ„ski <andrew@nymtech.net>"] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +# using 4.0.0 release candidate as it's faster than 3.X and more importantly it resolves edge cases deadlocks +dashmap = "4.0.0-rc6" +futures = "0.3" +log = "0.4" +nonexhaustive-delayqueue = { path = "../nonexhaustive-delayqueue" } +nymsphinx-acknowledgements = { path = "../nymsphinx/acknowledgements" } +nymsphinx-addressing = { path = "../nymsphinx/addressing" } +nymsphinx-forwarding = { path = "../nymsphinx/forwarding" } +nymsphinx-framing = { path = "../nymsphinx/framing" } +nymsphinx-params = { path = "../nymsphinx/params" } +nymsphinx-types = { path = "../nymsphinx/types" } +tokio = { version = "0.2", features = ["time", "macros", "rt-core"] } \ No newline at end of file diff --git a/common/mixnode-common/src/cached_packet_processor/cache.rs b/common/mixnode-common/src/cached_packet_processor/cache.rs new file mode 100644 index 00000000000..3fa9f82d81d --- /dev/null +++ b/common/mixnode-common/src/cached_packet_processor/cache.rs @@ -0,0 +1,176 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +use dashmap::{DashMap, ElementGuard}; +use futures::channel::mpsc; +use log::*; +use nonexhaustive_delayqueue::{Expired, NonExhaustiveDelayQueue}; +use nymsphinx_types::header::keys::RoutingKeys; +use nymsphinx_types::SharedSecret; +use std::sync::Arc; +use tokio::stream::StreamExt; +use tokio::time::{Duration, Error as TimeError}; + +type CachedKeys = (Option<SharedSecret>, RoutingKeys); + +pub(super) struct KeyCache { + vpn_key_cache: Arc<DashMap<SharedSecret, CachedKeys>>, + invalidator_sender: InvalidatorActionSender, + cache_entry_ttl: Duration, +} + +impl Drop for KeyCache { + fn drop(&mut self) { + debug!("dropping key cache"); + if self + .invalidator_sender + .unbounded_send(InvalidatorAction::Stop) + .is_err() + { + debug!("invalidator has already been dropped") + } + } +} + +impl KeyCache { + pub(super) fn new(cache_entry_ttl: Duration) -> Self { + let cache = Arc::new(DashMap::new()); + let (sender, receiver) = mpsc::unbounded(); + + let mut invalidator = CacheInvalidator { + entry_ttl: cache_entry_ttl, + vpn_key_cache: Arc::clone(&cache), + expirations: NonExhaustiveDelayQueue::new(), + action_receiver: receiver, + }; + + // TODO: is it possible to avoid tokio::spawn here and make it semi-runtime agnostic? + tokio::spawn(async move { invalidator.run().await }); + + KeyCache { + vpn_key_cache: cache, + invalidator_sender: sender, + cache_entry_ttl, + } + } + + pub(super) fn insert(&self, key: SharedSecret, cached_keys: CachedKeys) -> bool { + trace!("inserting {:?} into the cache", key); + let insertion_result = self.vpn_key_cache.insert(key, cached_keys); + if !insertion_result { + debug!("{:?} was put into the cache", key); + // this shouldn't really happen, but don't insert entry to invalidator if it was already + // in the cache + self.invalidator_sender + .unbounded_send(InvalidatorAction::Insert(key)) + .expect("Cache invalidator has crashed!"); + } + insertion_result + } + + // ElementGuard has Deref for CachedKeys so that's fine + pub(super) fn get(&self, key: &SharedSecret) -> Option<ElementGuard<SharedSecret, CachedKeys>> { + self.vpn_key_cache.get(key) + } + + pub(super) fn cache_entry_ttl(&self) -> Duration { + self.cache_entry_ttl + } + + #[cfg(test)] + pub(super) fn is_empty(&self) -> bool { + self.vpn_key_cache.is_empty() + } + + #[cfg(test)] + pub(super) fn len(&self) -> usize { + self.vpn_key_cache.len() + } +} + +enum InvalidatorAction { + Insert(SharedSecret), + Stop, +} + +type InvalidatorActionSender = mpsc::UnboundedSender<InvalidatorAction>; +type InvalidatorActionReceiver = mpsc::UnboundedReceiver<InvalidatorAction>; + +struct CacheInvalidator { + entry_ttl: Duration, + vpn_key_cache: Arc<DashMap<SharedSecret, CachedKeys>>, + expirations: NonExhaustiveDelayQueue<SharedSecret>, + action_receiver: InvalidatorActionReceiver, +} + +// we do not have a strong requirement of invalidating things EXACTLY after their TTL expires. +// we want them to be eventually gone in a relatively timely manner. +impl CacheInvalidator { + // two obvious ways I've seen of running this were as follows: + // + // 1) every X second, purge all expired entries + // pros: simpler to implement + // cons: will require to obtain write lock multiple times in quick succession + // + // 2) purge entry as soon as it expires + // pros: the lock situation will be spread more in time + // cons: possibly less efficient? + + fn handle_expired(&mut self, expired: Option<Result<Expired<SharedSecret>, TimeError>>) { + let expired = expired.expect("the queue has unexpectedly terminated!"); + let expired_entry = expired.expect("Encountered timer issue within the runtime!"); + + debug!( + "{:?} has expired and will be removed", + expired_entry.get_ref() + ); + + if !self.vpn_key_cache.remove(&expired_entry.into_inner()) { + error!("Tried to remove vpn cache entry for non-existent key!") + } + } + + /// Handles received action. Return `bool` indicates whether the invalidator + /// should terminate. + fn handle_action(&mut self, action: Option<InvalidatorAction>) -> bool { + if action.is_none() { + return true; + } + + match action.unwrap() { + InvalidatorAction::Stop => true, + InvalidatorAction::Insert(shared_secret) => { + self.expirations.insert(shared_secret, self.entry_ttl); + false + } + } + } + + async fn run(&mut self) { + loop { + tokio::select! { + expired = self.expirations.next() => { + self.handle_expired(expired); + } + action = self.action_receiver.next() => { + if self.handle_action(action) { + info!("Stopping cache invalidator"); + return + } + } + + } + } + } +} diff --git a/common/mixnode-common/src/cached_packet_processor/error.rs b/common/mixnode-common/src/cached_packet_processor/error.rs new file mode 100644 index 00000000000..ed87dac37e7 --- /dev/null +++ b/common/mixnode-common/src/cached_packet_processor/error.rs @@ -0,0 +1,72 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +use nymsphinx_acknowledgements::surb_ack::SURBAckRecoveryError; +use nymsphinx_addressing::nodes::NymNodeRoutingAddressError; +use nymsphinx_types::Error as SphinxError; +use std::fmt::{self, Display, Formatter}; + +#[derive(Debug)] +pub enum MixProcessingError { + SphinxProcessingError(SphinxError), + InvalidHopAddress(NymNodeRoutingAddressError), + NoSURBAckInFinalHop, + MalformedSURBAck(SURBAckRecoveryError), +} + +impl From<SphinxError> for MixProcessingError { + // for time being just have a single error instance for all possible results of SphinxError + fn from(err: SphinxError) -> Self { + use MixProcessingError::*; + + SphinxProcessingError(err) + } +} + +impl From<NymNodeRoutingAddressError> for MixProcessingError { + fn from(err: NymNodeRoutingAddressError) -> Self { + use MixProcessingError::*; + + InvalidHopAddress(err) + } +} + +impl From<SURBAckRecoveryError> for MixProcessingError { + fn from(err: SURBAckRecoveryError) -> Self { + use MixProcessingError::*; + + MalformedSURBAck(err) + } +} + +impl Display for MixProcessingError { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + match self { + MixProcessingError::SphinxProcessingError(sphinx_err) => { + write!(f, "Sphinx Processing Error - {}", sphinx_err) + } + MixProcessingError::InvalidHopAddress(address_err) => { + write!(f, "Invalid Hop Address - {:?}", address_err) + } + MixProcessingError::NoSURBAckInFinalHop => { + write!(f, "No SURBAck present in the final hop data") + } + MixProcessingError::MalformedSURBAck(surb_ack_err) => { + write!(f, "Malformed SURBAck - {:?}", surb_ack_err) + } + } + } +} + +impl std::error::Error for MixProcessingError {} diff --git a/common/mixnode-common/src/cached_packet_processor/mod.rs b/common/mixnode-common/src/cached_packet_processor/mod.rs new file mode 100644 index 00000000000..3bca3d76117 --- /dev/null +++ b/common/mixnode-common/src/cached_packet_processor/mod.rs @@ -0,0 +1,17 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +mod cache; +pub mod error; +pub mod processor; diff --git a/common/mixnode-common/src/cached_packet_processor/processor.rs b/common/mixnode-common/src/cached_packet_processor/processor.rs new file mode 100644 index 00000000000..74343241a5a --- /dev/null +++ b/common/mixnode-common/src/cached_packet_processor/processor.rs @@ -0,0 +1,483 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +use crate::cached_packet_processor::cache::KeyCache; +use crate::cached_packet_processor::error::MixProcessingError; +use log::*; +use nymsphinx_acknowledgements::surb_ack::SURBAck; +use nymsphinx_addressing::nodes::NymNodeRoutingAddress; +use nymsphinx_forwarding::packet::MixPacket; +use nymsphinx_framing::packet::FramedSphinxPacket; +use nymsphinx_params::{PacketMode, PacketSize}; +use nymsphinx_types::header::keys::RoutingKeys; +use nymsphinx_types::{ + Delay as SphinxDelay, DestinationAddressBytes, NodeAddressBytes, Payload, PrivateKey, + ProcessedPacket, SharedSecret, SphinxHeader, SphinxPacket, +}; +use std::convert::TryFrom; +use std::sync::Arc; +use tokio::time::Duration; + +type ForwardAck = MixPacket; +type CachedKeys = (Option<SharedSecret>, RoutingKeys); + +pub struct ProcessedFinalHop { + pub destination: DestinationAddressBytes, + pub forward_ack: Option<ForwardAck>, + pub message: Vec<u8>, +} + +pub enum MixProcessingResult { + ForwardHop(MixPacket), + FinalHop(ProcessedFinalHop), +} + +pub struct CachedPacketProcessor { + sphinx_key: Arc<PrivateKey>, + vpn_key_cache: KeyCache, +} + +impl CachedPacketProcessor { + /// Creates new instance of `CachedPacketProcessor` + pub fn new(sphinx_key: PrivateKey, cache_entry_ttl: Duration) -> Self { + CachedPacketProcessor { + sphinx_key: Arc::new(sphinx_key), + vpn_key_cache: KeyCache::new(cache_entry_ttl), + } + } + + /// Clones `self` without the `vpn_key_cache`. + pub fn clone_without_cache(&self) -> Self { + CachedPacketProcessor { + sphinx_key: self.sphinx_key.clone(), + vpn_key_cache: KeyCache::new(self.vpn_key_cache.cache_entry_ttl()), + } + } + + /// A naive way of delaying packet. + async fn delay_packet(&self, delay: SphinxDelay) { + // TODO: this should perhaps be replaced with a `DelayQueue` + tokio::time::delay_for(delay.to_duration()).await; + } + + /// Recomputes routing keys for the given initial secret. + fn recompute_routing_keys(&self, initial_secret: &SharedSecret) -> RoutingKeys { + SphinxHeader::compute_routing_keys(initial_secret, &self.sphinx_key) + } + + /// Performs a fresh sphinx unwrapping using no cache. + fn perform_initial_sphinx_packet_processing( + &self, + packet: SphinxPacket, + ) -> Result<ProcessedPacket, MixProcessingError> { + packet.process(&self.sphinx_key).map_err(|err| { + warn!("Failed to unwrap Sphinx packet: {:?}", err); + MixProcessingError::SphinxProcessingError(err) + }) + } + + /// Unwraps sphinx packet using already cached keys. + fn perform_initial_sphinx_packet_processing_with_cached_keys( + &self, + packet: SphinxPacket, + keys: &CachedKeys, + ) -> Result<ProcessedPacket, MixProcessingError> { + packet + .process_with_derived_keys(&keys.0, &keys.1) + .map_err(|err| { + warn!("Failed to unwrap Sphinx packet: {:?}", err); + MixProcessingError::SphinxProcessingError(err) + }) + } + + /// Stores the keys corresponding to the packet that was just processed. + fn cache_keys(&self, initial_secret: SharedSecret, processed_packet: &ProcessedPacket) { + let new_shared_secret = processed_packet.shared_secret(); + let routing_keys = self.recompute_routing_keys(&initial_secret); + if self + .vpn_key_cache + .insert(initial_secret, (new_shared_secret, routing_keys)) + { + debug!("Other thread has already cached keys for this secret!") + } + } + + /// Takes the received framed packet and tries to unwrap it from the sphinx encryption. + /// For any vpn packets it will try to re-use cached keys and if none are available, + /// after first processing, the keys are going to get cached. + fn perform_initial_unwrapping( + &self, + received: FramedSphinxPacket, + ) -> Result<ProcessedPacket, MixProcessingError> { + let packet_mode = received.packet_mode(); + let sphinx_packet = received.into_inner(); + let initial_secret = sphinx_packet.shared_secret(); + + // try to use pre-computed keys only for the vpn-packets + if packet_mode.is_vpn() { + if let Some(cached_keys) = self.vpn_key_cache.get(&initial_secret) { + return self.perform_initial_sphinx_packet_processing_with_cached_keys( + sphinx_packet, + cached_keys.value(), + ); + } + } + + let processing_result = self.perform_initial_sphinx_packet_processing(sphinx_packet); + // quicker exit because this will be the most common case + if !packet_mode.is_vpn() { + return processing_result; + } + + if let Ok(processed_packet) = processing_result.as_ref() { + // if we managed to process packet we saw for the first time AND it's a vpn packet + // cache the keys + self.cache_keys(initial_secret, processed_packet); + } + processing_result + } + + /// Processed received forward hop packet - tries to extract next hop address, delays it + /// if it was not a vpn packet and packs all the data in a way that can be easily sent + /// to the next hop. + async fn process_forward_hop( + &self, + packet: SphinxPacket, + forward_address: NodeAddressBytes, + delay: SphinxDelay, + packet_mode: PacketMode, + ) -> Result<MixProcessingResult, MixProcessingError> { + let next_hop_address = NymNodeRoutingAddress::try_from(forward_address)?; + + if !packet_mode.is_vpn() { + self.delay_packet(delay).await; + } + + let mix_packet = MixPacket::new(next_hop_address, packet, packet_mode); + Ok(MixProcessingResult::ForwardHop(mix_packet)) + } + + /// Split data extracted from the final hop sphinx packet into a SURBAck and message + /// that should get delivered to a client. + fn split_hop_data_into_ack_and_message( + &self, + mut extracted_data: Vec<u8>, + ) -> Result<(Vec<u8>, Vec<u8>), MixProcessingError> { + // in theory it's impossible for this to fail since it managed to go into correct `match` + // branch at the caller + if extracted_data.len() < SURBAck::len() { + return Err(MixProcessingError::NoSURBAckInFinalHop); + } + + let message = extracted_data.split_off(SURBAck::len()); + let ack_data = extracted_data; + Ok((ack_data, message)) + } + + /// Tries to extract a SURBAck that could be sent back into the mix network and message + /// that should get delivered to a client from received Sphinx packet. + fn split_into_ack_and_message( + &self, + data: Vec<u8>, + packet_size: PacketSize, + packet_mode: PacketMode, + ) -> Result<(Option<MixPacket>, Vec<u8>), MixProcessingError> { + match packet_size { + PacketSize::ACKPacket => { + trace!("received an ack packet!"); + Ok((None, data)) + } + PacketSize::RegularPacket | PacketSize::ExtendedPacket => { + trace!("received a normal packet!"); + let (ack_data, message) = self.split_hop_data_into_ack_and_message(data)?; + let (ack_first_hop, ack_packet) = SURBAck::try_recover_first_hop_packet(&ack_data)?; + let forward_ack = MixPacket::new(ack_first_hop, ack_packet, packet_mode); + Ok((Some(forward_ack), message)) + } + } + } + + /// Processed received final hop packet - tries to extract SURBAck out of it (assuming the + /// packet itself is not an ACK) and splits it from the message that should get delivered + /// to the destination. + fn process_final_hop( + &self, + destination: DestinationAddressBytes, + payload: Payload, + packet_size: PacketSize, + packet_mode: PacketMode, + ) -> Result<MixProcessingResult, MixProcessingError> { + let packet_message = payload.recover_plaintext()?; + + let (forward_ack, message) = + self.split_into_ack_and_message(packet_message, packet_size, packet_mode)?; + + Ok(MixProcessingResult::FinalHop(ProcessedFinalHop { + destination, + forward_ack, + message, + })) + } + + /// Performs final processing for the unwrapped packet based on whether it was a forward hop + /// or a final hop. + async fn perform_final_processing( + &self, + packet: ProcessedPacket, + packet_size: PacketSize, + packet_mode: PacketMode, + ) -> Result<MixProcessingResult, MixProcessingError> { + match packet { + ProcessedPacket::ForwardHop(packet, address, delay) => { + self.process_forward_hop(packet, address, delay, packet_mode) + .await + } + // right now there's no use for the surb_id included in the header - probably it should get removed from the + // sphinx all together? + ProcessedPacket::FinalHop(destination, _, payload) => { + self.process_final_hop(destination, payload, packet_size, packet_mode) + } + } + } + + pub async fn process_received( + &self, + received: FramedSphinxPacket, + ) -> Result<MixProcessingResult, MixProcessingError> { + // explicit packet size will help to correctly parse final hop + let packet_size = received.packet_size(); + let packet_mode = received.packet_mode(); + + // unwrap the sphinx packet and if possible and appropriate, cache keys + let processed_packet = self.perform_initial_unwrapping(received)?; + + // for forward, non-vpn packets delay for specified amount, + // for final packets, extract SURBAck + self.perform_final_processing(processed_packet, packet_size, packet_mode) + .await + } +} + +// TODO: what more could we realistically test here? +#[cfg(test)] +mod tests { + use super::*; + use nymsphinx_types::builder::SphinxPacketBuilder; + use nymsphinx_types::crypto::keygen; + use nymsphinx_types::{ + Destination, Node, PublicKey, DESTINATION_ADDRESS_LENGTH, IDENTIFIER_LENGTH, + }; + use std::convert::TryInto; + use std::net::SocketAddr; + + fn fixture() -> CachedPacketProcessor { + let local_keys = keygen(); + CachedPacketProcessor::new(local_keys.0, Duration::from_secs(30)) + } + + fn make_valid_final_sphinx_packet(size: PacketSize, public_key: PublicKey) -> SphinxPacket { + let routing_address: NymNodeRoutingAddress = + NymNodeRoutingAddress::from("127.0.0.1:1789".parse::<SocketAddr>().unwrap()); + + let node = Node::new(routing_address.try_into().unwrap(), public_key); + + let destination = Destination::new( + DestinationAddressBytes::from_bytes([3u8; DESTINATION_ADDRESS_LENGTH]), + [4u8; IDENTIFIER_LENGTH], + ); + + // required until https://github.com/nymtech/sphinx/issues/71 is fixed + let dummy_delay = SphinxDelay::new_from_nanos(42); + + SphinxPacketBuilder::new() + .with_payload_size(size.payload_size()) + .build_packet(b"foomp".to_vec(), &[node], &destination, &[dummy_delay]) + .unwrap() + } + + fn make_valid_forward_sphinx_packet(size: PacketSize, public_key: PublicKey) -> SphinxPacket { + let routing_address: NymNodeRoutingAddress = + NymNodeRoutingAddress::from("127.0.0.1:1789".parse::<SocketAddr>().unwrap()); + + let some_node_key = keygen(); + let route = [ + Node::new(routing_address.try_into().unwrap(), public_key), + Node::new(routing_address.try_into().unwrap(), some_node_key.1), + ]; + + let destination = Destination::new( + DestinationAddressBytes::from_bytes([3u8; DESTINATION_ADDRESS_LENGTH]), + [4u8; IDENTIFIER_LENGTH], + ); + + let delays = [ + SphinxDelay::new_from_nanos(42), + SphinxDelay::new_from_nanos(42), + ]; + + SphinxPacketBuilder::new() + .with_payload_size(size.payload_size()) + .build_packet(b"foomp".to_vec(), &route, &destination, &delays) + .unwrap() + } + + #[tokio::test] + async fn recomputing_routing_keys_derives_correct_set_of_keys() { + let processor = fixture(); + let (_, initial_secret) = keygen(); + assert_eq!( + processor.recompute_routing_keys(&initial_secret), + SphinxHeader::compute_routing_keys(&initial_secret, &processor.sphinx_key) + ) + } + + #[tokio::test] + async fn caching_keys_updates_local_state_for_final_hop() { + let local_keys = keygen(); + let processor = CachedPacketProcessor::new(local_keys.0, Duration::from_secs(30)); + assert!(processor.vpn_key_cache.is_empty()); + + let final_hop = make_valid_final_sphinx_packet(Default::default(), local_keys.1); + let initial_secret = final_hop.shared_secret(); + let processed = final_hop.process(&processor.sphinx_key).unwrap(); + + processor.cache_keys(initial_secret, &processed); + let cache_entry = processor.vpn_key_cache.get(&initial_secret).unwrap(); + + let (cached_secret, cached_routing_keys) = cache_entry.value(); + + assert!(cached_secret.is_none()); + let recomputed_keys = processor.recompute_routing_keys(&initial_secret); + // if one key matches then all keys must match (or there is a serious bug inside sphinx) + assert_eq!( + cached_routing_keys.stream_cipher_key, + recomputed_keys.stream_cipher_key + ); + } + + #[tokio::test] + async fn caching_keys_updates_local_state_for_forward_hop() { + let local_keys = keygen(); + let processor = CachedPacketProcessor::new(local_keys.0, Duration::from_secs(30)); + assert!(processor.vpn_key_cache.is_empty()); + + let forward_hop = make_valid_forward_sphinx_packet(Default::default(), local_keys.1); + let initial_secret = forward_hop.shared_secret(); + let processed = forward_hop.process(&processor.sphinx_key).unwrap(); + + processor.cache_keys(initial_secret, &processed); + let cache_entry = processor.vpn_key_cache.get(&initial_secret).unwrap(); + + let (cached_secret, cached_routing_keys) = cache_entry.value(); + + assert_eq!( + cached_secret.as_ref().unwrap(), + processed.shared_secret().as_ref().unwrap() + ); + let recomputed_keys = processor.recompute_routing_keys(&initial_secret); + // if one key matches then all keys must match (or there is a serious bug inside sphinx) + assert_eq!( + cached_routing_keys.stream_cipher_key, + recomputed_keys.stream_cipher_key + ); + } + + #[tokio::test] + async fn performing_initial_unwrapping_caches_keys_if_vpnmode_used_for_final_hop() { + let local_keys = keygen(); + let processor = CachedPacketProcessor::new(local_keys.0, Duration::from_secs(30)); + assert!(processor.vpn_key_cache.is_empty()); + + let final_hop = make_valid_final_sphinx_packet(Default::default(), local_keys.1); + let framed = FramedSphinxPacket::new(final_hop, PacketMode::VPN); + + processor.perform_initial_unwrapping(framed).unwrap(); + assert_eq!(processor.vpn_key_cache.len(), 1); + } + + #[tokio::test] + async fn performing_initial_unwrapping_caches_keys_if_vpnmode_used_for_forward_hop() { + let local_keys = keygen(); + let processor = CachedPacketProcessor::new(local_keys.0, Duration::from_secs(30)); + assert!(processor.vpn_key_cache.is_empty()); + + let forward_hop = make_valid_forward_sphinx_packet(Default::default(), local_keys.1); + let framed = FramedSphinxPacket::new(forward_hop, PacketMode::VPN); + + processor.perform_initial_unwrapping(framed).unwrap(); + assert_eq!(processor.vpn_key_cache.len(), 1); + } + + #[tokio::test] + async fn performing_initial_unwrapping_does_no_caching_for_mix_mode_for_final_hop() { + let local_keys = keygen(); + let processor = CachedPacketProcessor::new(local_keys.0, Duration::from_secs(30)); + assert!(processor.vpn_key_cache.is_empty()); + + let final_hop = make_valid_final_sphinx_packet(Default::default(), local_keys.1); + let framed = FramedSphinxPacket::new(final_hop, PacketMode::Mix); + + processor.perform_initial_unwrapping(framed).unwrap(); + assert!(processor.vpn_key_cache.is_empty()); + } + + #[tokio::test] + async fn performing_initial_unwrapping_does_no_caching_for_mix_mode_for_forward_hop() { + let local_keys = keygen(); + let processor = CachedPacketProcessor::new(local_keys.0, Duration::from_secs(30)); + assert!(processor.vpn_key_cache.is_empty()); + + let forward_hop = make_valid_forward_sphinx_packet(Default::default(), local_keys.1); + let framed = FramedSphinxPacket::new(forward_hop, PacketMode::Mix); + + processor.perform_initial_unwrapping(framed).unwrap(); + assert!(processor.vpn_key_cache.is_empty()); + } + + #[tokio::test] + async fn splitting_hop_data_works_for_sufficiently_long_payload() { + let processor = fixture(); + + let short_data = vec![42u8]; + assert!(processor + .split_hop_data_into_ack_and_message(short_data) + .is_err()); + + let sufficient_data = vec![42u8; SURBAck::len()]; + let (ack, data) = processor + .split_hop_data_into_ack_and_message(sufficient_data.clone()) + .unwrap(); + assert_eq!(sufficient_data, ack); + assert!(data.is_empty()); + + let long_data = vec![42u8; SURBAck::len() * 5]; + let (ack, data) = processor + .split_hop_data_into_ack_and_message(long_data) + .unwrap(); + assert_eq!(ack.len(), SURBAck::len()); + assert_eq!(data.len(), SURBAck::len() * 4) + } + + #[tokio::test] + async fn splitting_into_ack_and_message_returns_whole_data_for_ack() { + let processor = fixture(); + + let data = vec![42u8; SURBAck::len() + 10]; + let (ack, message) = processor + .split_into_ack_and_message(data.clone(), PacketSize::ACKPacket, Default::default()) + .unwrap(); + assert!(ack.is_none()); + assert_eq!(data, message) + } +} diff --git a/validator/src/services/mod.rs b/common/mixnode-common/src/lib.rs similarity index 94% rename from validator/src/services/mod.rs rename to common/mixnode-common/src/lib.rs index 90af524fc8a..2b65a961b77 100644 --- a/validator/src/services/mod.rs +++ b/common/mixnode-common/src/lib.rs @@ -12,4 +12,4 @@ // See the License for the specific language governing permissions and // limitations under the License. -pub mod mixmining; +pub mod cached_packet_processor; diff --git a/common/client-libs/directory-client/models/Cargo.toml b/common/nonexhaustive-delayqueue/Cargo.toml similarity index 56% rename from common/client-libs/directory-client/models/Cargo.toml rename to common/nonexhaustive-delayqueue/Cargo.toml index 3f2c9c352c7..65dea23278c 100644 --- a/common/client-libs/directory-client/models/Cargo.toml +++ b/common/nonexhaustive-delayqueue/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "directory-client-models" +name = "nonexhaustive-delayqueue" version = "0.1.0" authors = ["JÄ™drzej StuczyÅ„ski <andrew@nymtech.net>"] edition = "2018" @@ -7,7 +7,4 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -serde = { version = "1.0", features = ["derive"] } - -crypto = { path = "../../../crypto" } -topology = { path = "../../../topology" } +tokio = { version = "0.2", features = ["stream", "time"] } \ No newline at end of file diff --git a/clients/client-core/src/client/real_messages_control/acknowledgement_control/ack_delay_queue.rs b/common/nonexhaustive-delayqueue/src/lib.rs similarity index 69% rename from clients/client-core/src/client/real_messages_control/acknowledgement_control/ack_delay_queue.rs rename to common/nonexhaustive-delayqueue/src/lib.rs index a27dc9c6a2c..b2903546e9e 100644 --- a/clients/client-core/src/client/real_messages_control/acknowledgement_control/ack_delay_queue.rs +++ b/common/nonexhaustive-delayqueue/src/lib.rs @@ -12,32 +12,31 @@ // See the License for the specific language governing permissions and // limitations under the License. -use futures::Stream; use std::pin::Pin; use std::task::{Context, Poll, Waker}; use std::time::Duration; -use tokio::time::{ - delay_queue::{self, Expired}, - DelayQueue, -}; +use tokio::stream::Stream; +pub use tokio::time::delay_queue::Expired; +use tokio::time::{delay_queue, DelayQueue}; -// works under assumption that it will be used inside a loop, where we never want a `None` -// TODO: perhaps this should/could be renamed and moved to common/utils (and expose all inner methods?) -pub struct AckDelayQueue<T> { +pub type QueueKey = delay_queue::Key; + +/// A variant of tokio's `DelayQueue`, such that its `Stream` implementation will never return a 'None'. +pub struct NonExhaustiveDelayQueue<T> { inner: DelayQueue<T>, waker: Option<Waker>, } // more methods of underlying DelayQueue will get exposed as we need them -impl<T> AckDelayQueue<T> { +impl<T> NonExhaustiveDelayQueue<T> { pub fn new() -> Self { - AckDelayQueue { + NonExhaustiveDelayQueue { inner: DelayQueue::new(), waker: None, } } - pub fn insert(&mut self, value: T, timeout: Duration) -> delay_queue::Key { + pub fn insert(&mut self, value: T, timeout: Duration) -> QueueKey { let key = self.inner.insert(value, timeout); if let Some(waker) = self.waker.take() { // we were waiting for an item - wake the executor! @@ -46,12 +45,14 @@ impl<T> AckDelayQueue<T> { key } - pub fn remove(&mut self, key: &delay_queue::Key) -> Expired<T> { + // TODO: it seems like this one can cause panic in very rare edge cases, however, + // I can't seem to be able to reproduce it at all. + pub fn remove(&mut self, key: &QueueKey) -> Expired<T> { self.inner.remove(key) } } -impl<T> Stream for AckDelayQueue<T> { +impl<T> Stream for NonExhaustiveDelayQueue<T> { type Item = <DelayQueue<T> as Stream>::Item; fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> { @@ -66,3 +67,10 @@ impl<T> Stream for AckDelayQueue<T> { } } } + +// #[cfg(test)] +// mod tests { +// use super::*; +// +// +// } diff --git a/common/nymsphinx/Cargo.toml b/common/nymsphinx/Cargo.toml index be7b5b58315..083a4d8833c 100644 --- a/common/nymsphinx/Cargo.toml +++ b/common/nymsphinx/Cargo.toml @@ -15,6 +15,7 @@ nymsphinx-addressing = { path = "addressing" } nymsphinx-anonymous-replies = { path = "anonymous-replies" } nymsphinx-chunking = { path = "chunking" } nymsphinx-cover = { path = "cover" } +nymsphinx-forwarding = { path = "forwarding" } nymsphinx-params = { path = "params" } nymsphinx-types = { path = "types" } @@ -26,4 +27,8 @@ topology = { path = "../topology" } # do not include this when compiling into wasm as it somehow when combined together with reqwest, it will require # net2 via tokio-util -> tokio -> mio -> net2 [target."cfg(not(target_arch = \"wasm32\"))".dependencies.nymsphinx-framing] -path = "framing" \ No newline at end of file +path = "framing" + +[target."cfg(not(target_arch = \"wasm32\"))".dependencies.tokio] +version = "0.2" +features = ["sync"] diff --git a/common/nymsphinx/acknowledgements/src/surb_ack.rs b/common/nymsphinx/acknowledgements/src/surb_ack.rs index 8722aa0ac60..e1edd16e637 100644 --- a/common/nymsphinx/acknowledgements/src/surb_ack.rs +++ b/common/nymsphinx/acknowledgements/src/surb_ack.rs @@ -21,7 +21,7 @@ use nymsphinx_params::DEFAULT_NUM_MIX_HOPS; use nymsphinx_types::builder::SphinxPacketBuilder; use nymsphinx_types::{ delays::{self, Delay}, - SphinxPacket, + EphemeralSecret, SphinxPacket, }; use rand::{CryptoRng, RngCore}; use std::convert::TryFrom; @@ -50,6 +50,7 @@ impl SURBAck { marshaled_fragment_id: [u8; 5], average_delay: time::Duration, topology: &NymTopology, + initial_sphinx_secret: Option<&EphemeralSecret>, ) -> Result<Self, NymTopologyError> where R: RngCore + CryptoRng, @@ -61,15 +62,19 @@ impl SURBAck { let surb_ack_payload = prepare_identifier(rng, ack_key, marshaled_fragment_id); - // once merged, that's an easy rng injection point for sphinx packets : ) - let surb_ack_packet = SphinxPacketBuilder::new() - .with_payload_size(PacketSize::ACKPacket.payload_size()) + let mut surb_builder = + SphinxPacketBuilder::new().with_payload_size(PacketSize::ACKPacket.payload_size()); + if let Some(initial_secret) = initial_sphinx_secret { + surb_builder = surb_builder.with_initial_secret(initial_secret); + } + + let surb_ack_packet = surb_builder .build_packet(surb_ack_payload, &route, &destination, &delays) .unwrap(); let expected_total_delay = delays.iter().sum(); let first_hop_address = - NymNodeRoutingAddress::try_from(route.first().unwrap().address.clone()).unwrap(); + NymNodeRoutingAddress::try_from(route.first().unwrap().address).unwrap(); Ok(SURBAck { surb_ack_packet, diff --git a/common/nymsphinx/addressing/src/clients.rs b/common/nymsphinx/addressing/src/clients.rs index 8295df64ef2..1376df59d80 100644 --- a/common/nymsphinx/addressing/src/clients.rs +++ b/common/nymsphinx/addressing/src/clients.rs @@ -22,9 +22,9 @@ const CLIENT_IDENTITY_SIZE: usize = identity::PUBLIC_KEY_LENGTH; #[derive(Debug)] pub enum RecipientFormattingError { MalformedRecipientError, - MalformedIdentityError(identity::SignatureError), - MalformedEncryptionKeyError(encryption::EncryptionKeyError), - MalformedGatewayError(identity::SignatureError), + MalformedIdentityError(identity::KeyRecoveryError), + MalformedEncryptionKeyError(encryption::KeyRecoveryError), + MalformedGatewayError(identity::KeyRecoveryError), } impl fmt::Display for RecipientFormattingError { @@ -51,8 +51,8 @@ impl fmt::Display for RecipientFormattingError { // since we have Debug and Display might as well slap Error on top of it too impl std::error::Error for RecipientFormattingError {} -impl From<encryption::EncryptionKeyError> for RecipientFormattingError { - fn from(err: encryption::EncryptionKeyError) -> Self { +impl From<encryption::KeyRecoveryError> for RecipientFormattingError { + fn from(err: encryption::KeyRecoveryError) -> Self { RecipientFormattingError::MalformedEncryptionKeyError(err) } } @@ -102,11 +102,11 @@ impl<'de> Deserialize<'de> for Recipient { // this shouldn't panic as we just checked for length recipient_bytes.copy_from_slice(&bytes); - Recipient::try_from_bytes(recipient_bytes).or_else(|_| { - Err(SerdeError::invalid_value( + Recipient::try_from_bytes(recipient_bytes).map_err(|_| { + SerdeError::invalid_value( Unexpected::Other("At least one of the curve points was malformed"), &self, - )) + ) }) } } @@ -251,7 +251,7 @@ mod tests { let recipient = Recipient::new( *client_id_pair.public_key(), - client_enc_pair.public_key().clone(), + *client_enc_pair.public_key(), *gateway_id_pair.public_key(), ); @@ -281,7 +281,7 @@ mod tests { let recipient = Recipient::new( *client_id_pair.public_key(), - client_enc_pair.public_key().clone(), + *client_enc_pair.public_key(), *gateway_id_pair.public_key(), ); diff --git a/common/nymsphinx/anonymous-replies/src/reply_surb.rs b/common/nymsphinx/anonymous-replies/src/reply_surb.rs index 1663e213ec6..7c0e15541c0 100644 --- a/common/nymsphinx/anonymous-replies/src/reply_surb.rs +++ b/common/nymsphinx/anonymous-replies/src/reply_surb.rs @@ -103,7 +103,7 @@ impl<'de> Deserialize<'de> for ReplySURB { E: SerdeError, { ReplySURB::from_bytes(bytes) - .or_else(|_| Err(SerdeError::invalid_length(bytes.len(), &self))) + .map_err(|_| SerdeError::invalid_length(bytes.len(), &self)) } } diff --git a/common/nymsphinx/cover/Cargo.toml b/common/nymsphinx/cover/Cargo.toml index d9f5846dfda..49d58431c65 100644 --- a/common/nymsphinx/cover/Cargo.toml +++ b/common/nymsphinx/cover/Cargo.toml @@ -14,5 +14,6 @@ nymsphinx-acknowledgements = { path = "../acknowledgements" } nymsphinx-addressing = { path = "../addressing" } nymsphinx-chunking = { path = "../chunking" } nymsphinx-params = { path = "../params" } +nymsphinx-forwarding = { path = "../forwarding" } nymsphinx-types = { path = "../types" } topology = { path = "../../topology" } \ No newline at end of file diff --git a/common/nymsphinx/cover/src/lib.rs b/common/nymsphinx/cover/src/lib.rs index 1996f444757..18b13b4aad7 100644 --- a/common/nymsphinx/cover/src/lib.rs +++ b/common/nymsphinx/cover/src/lib.rs @@ -19,10 +19,13 @@ use nymsphinx_acknowledgements::AckKey; use nymsphinx_addressing::clients::Recipient; use nymsphinx_addressing::nodes::{NymNodeRoutingAddress, NymNodeRoutingAddressError}; use nymsphinx_chunking::fragment::COVER_FRAG_ID; +use nymsphinx_forwarding::packet::MixPacket; use nymsphinx_params::packet_sizes::PacketSize; -use nymsphinx_params::{PacketEncryptionAlgorithm, PacketHkdfAlgorithm, DEFAULT_NUM_MIX_HOPS}; +use nymsphinx_params::{ + PacketEncryptionAlgorithm, PacketHkdfAlgorithm, PacketMode, DEFAULT_NUM_MIX_HOPS, +}; use nymsphinx_types::builder::SphinxPacketBuilder; -use nymsphinx_types::{delays, Error as SphinxError, SphinxPacket}; +use nymsphinx_types::{delays, Error as SphinxError}; use rand::{CryptoRng, RngCore}; use std::convert::TryFrom; use std::time; @@ -74,6 +77,7 @@ where COVER_FRAG_ID.to_bytes(), average_ack_delay, topology, + None, )?) } @@ -84,7 +88,7 @@ pub fn generate_loop_cover_packet<R>( full_address: &Recipient, average_ack_delay: time::Duration, average_packet_delay: time::Duration, -) -> Result<(NymNodeRoutingAddress, SphinxPacket), CoverMessageError> +) -> Result<MixPacket, CoverMessageError> where R: RngCore + CryptoRng, { @@ -142,9 +146,10 @@ where .unwrap(); let first_hop_address = - NymNodeRoutingAddress::try_from(route.first().unwrap().address.clone()).unwrap(); + NymNodeRoutingAddress::try_from(route.first().unwrap().address).unwrap(); - Ok((first_hop_address, packet)) + // if client is running in vpn mode, he won't even be sending cover traffic + Ok(MixPacket::new(first_hop_address, packet, PacketMode::Mix)) } /// Helper function used to determine if given message represents a loop cover message. diff --git a/common/nymsphinx/forwarding/Cargo.toml b/common/nymsphinx/forwarding/Cargo.toml new file mode 100644 index 00000000000..80ab0536651 --- /dev/null +++ b/common/nymsphinx/forwarding/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "nymsphinx-forwarding" +version = "0.1.0" +authors = ["Jedrzej Stuczynski <andrew@nymtech.net>"] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +nymsphinx-addressing = { path = "../addressing" } +nymsphinx-params = { path = "../params" } +nymsphinx-types = { path = "../types" } diff --git a/validator/src/network/rest/models/mod.rs b/common/nymsphinx/forwarding/src/lib.rs similarity index 97% rename from validator/src/network/rest/models/mod.rs rename to common/nymsphinx/forwarding/src/lib.rs index 82b6b328e25..f85c8e93622 100644 --- a/validator/src/network/rest/models/mod.rs +++ b/common/nymsphinx/forwarding/src/lib.rs @@ -12,4 +12,4 @@ // See the License for the specific language governing permissions and // limitations under the License. -pub mod presence; +pub mod packet; diff --git a/common/nymsphinx/forwarding/src/packet.rs b/common/nymsphinx/forwarding/src/packet.rs new file mode 100644 index 00000000000..fbfec653ad2 --- /dev/null +++ b/common/nymsphinx/forwarding/src/packet.rs @@ -0,0 +1,128 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +use nymsphinx_addressing::nodes::{NymNodeRoutingAddress, NymNodeRoutingAddressError}; +use nymsphinx_params::{PacketMode, PacketSize}; +use nymsphinx_types::SphinxPacket; +use std::convert::TryFrom; +use std::fmt::{self, Display, Formatter}; + +#[derive(Debug)] +pub enum MixPacketFormattingError { + TooFewBytesProvided, + InvalidPacketMode, + InvalidPacketSize(usize), + InvalidAddress, + MalformedSphinxPacket, +} + +impl Display for MixPacketFormattingError { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + use MixPacketFormattingError::*; + match self { + TooFewBytesProvided => write!(f, "Too few bytes provided to recover from bytes"), + InvalidAddress => write!(f, "address field was incorrectly encoded"), + InvalidPacketSize(actual) => + write!( + f, + "received request had invalid size. (actual: {}, but expected one of: {} (ACK), {} (REGULAR), {} (EXTENDED))", + actual, PacketSize::ACKPacket.size(), PacketSize::RegularPacket.size(), PacketSize::ExtendedPacket.size() + ), + MalformedSphinxPacket => write!(f, "received sphinx packet was malformed"), + InvalidPacketMode => write!(f, "provided packet mode is invalid") + } + } +} + +impl std::error::Error for MixPacketFormattingError {} + +impl From<NymNodeRoutingAddressError> for MixPacketFormattingError { + fn from(_: NymNodeRoutingAddressError) -> Self { + MixPacketFormattingError::InvalidAddress + } +} + +pub struct MixPacket { + next_hop: NymNodeRoutingAddress, + sphinx_packet: SphinxPacket, + packet_mode: PacketMode, +} + +impl MixPacket { + pub fn new( + next_hop: NymNodeRoutingAddress, + sphinx_packet: SphinxPacket, + packet_mode: PacketMode, + ) -> Self { + MixPacket { + next_hop, + sphinx_packet, + packet_mode, + } + } + + pub fn next_hop(&self) -> NymNodeRoutingAddress { + self.next_hop + } + + pub fn sphinx_packet(&self) -> &SphinxPacket { + &self.sphinx_packet + } + + pub fn into_sphinx_packet(self) -> SphinxPacket { + self.sphinx_packet + } + + pub fn packet_mode(&self) -> PacketMode { + self.packet_mode + } + + // the message is formatted as follows: + // PACKET_MODE || FIRST_HOP || SPHINX_PACKET + pub fn try_from_bytes(b: &[u8]) -> Result<Self, MixPacketFormattingError> { + let packet_mode = match PacketMode::try_from(b[0]) { + Ok(mode) => mode, + Err(_) => return Err(MixPacketFormattingError::InvalidPacketMode), + }; + + let next_hop = NymNodeRoutingAddress::try_from_bytes(&b[1..])?; + let addr_offset = next_hop.bytes_min_len(); + + let sphinx_packet_data = &b[addr_offset + 1..]; + let packet_size = sphinx_packet_data.len(); + if PacketSize::get_type(packet_size).is_err() { + Err(MixPacketFormattingError::InvalidPacketSize(packet_size)) + } else { + let sphinx_packet = match SphinxPacket::from_bytes(sphinx_packet_data) { + Ok(packet) => packet, + Err(_) => return Err(MixPacketFormattingError::MalformedSphinxPacket), + }; + + Ok(MixPacket { + next_hop, + sphinx_packet, + packet_mode, + }) + } + } + + pub fn into_bytes(self) -> Vec<u8> { + std::iter::once(self.packet_mode as u8) + .chain(self.next_hop.as_bytes().into_iter()) + .chain(self.sphinx_packet.to_bytes().into_iter()) + .collect() + } +} + +// TODO: test for serialization and errors! diff --git a/common/nymsphinx/framing/src/codec.rs b/common/nymsphinx/framing/src/codec.rs new file mode 100644 index 00000000000..a9f21a9f80c --- /dev/null +++ b/common/nymsphinx/framing/src/codec.rs @@ -0,0 +1,339 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +use crate::packet::{FramedSphinxPacket, Header}; +use bytes::{Buf, BufMut, BytesMut}; +use nymsphinx_params::packet_modes::InvalidPacketMode; +use nymsphinx_params::packet_sizes::{InvalidPacketSize, PacketSize}; +use nymsphinx_types::SphinxPacket; +use std::convert::TryFrom; +use std::io; +use tokio_util::codec::{Decoder, Encoder}; + +#[derive(Debug)] +pub enum SphinxCodecError { + InvalidPacketSize, + InvalidPacketMode, + MalformedSphinxPacket, + IoError(io::Error), +} + +impl From<io::Error> for SphinxCodecError { + fn from(err: io::Error) -> Self { + SphinxCodecError::IoError(err) + } +} + +impl Into<io::Error> for SphinxCodecError { + fn into(self) -> io::Error { + match self { + SphinxCodecError::InvalidPacketSize => { + io::Error::new(io::ErrorKind::InvalidInput, "invalid packet size") + } + SphinxCodecError::InvalidPacketMode => { + io::Error::new(io::ErrorKind::InvalidInput, "invalid packet mode") + } + SphinxCodecError::MalformedSphinxPacket => { + io::Error::new(io::ErrorKind::InvalidData, "malformed packet") + } + SphinxCodecError::IoError(err) => err, + } + } +} + +impl From<InvalidPacketSize> for SphinxCodecError { + fn from(_: InvalidPacketSize) -> Self { + SphinxCodecError::InvalidPacketSize + } +} + +impl From<InvalidPacketMode> for SphinxCodecError { + fn from(_: InvalidPacketMode) -> Self { + SphinxCodecError::InvalidPacketMode + } +} + +// TODO: in the future it could be extended to have state containing symmetric encryption key +// so that all data could be encrypted easily (alternatively we could just slap TLS) +pub struct SphinxCodec; + +impl Encoder<FramedSphinxPacket> for SphinxCodec { + type Error = SphinxCodecError; + + fn encode(&mut self, item: FramedSphinxPacket, dst: &mut BytesMut) -> Result<(), Self::Error> { + item.header.encode(dst)?; + dst.put(item.packet.to_bytes().as_ref()); + Ok(()) + } +} + +impl Decoder for SphinxCodec { + type Item = FramedSphinxPacket; + type Error = SphinxCodecError; + + fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> { + if src.is_empty() { + // can't do anything if we have no bytes, but let's reserve enough for the most + // conservative case, i.e. receiving an ack packet + src.reserve(Header::SIZE + PacketSize::ACKPacket.size()); + return Ok(None); + } + + // because header is so small and simple it makes no point in trying to cache + // this result. It will be just simpler to re-decode it + let header = match Header::decode(src)? { + Some(header) => header, + None => return Ok(None), // we have some data but not enough to get header back + }; + + let sphinx_packet_size = header.packet_size.size(); + let frame_len = Header::SIZE + sphinx_packet_size; + + if src.len() < frame_len { + // we don't have enough bytes to read the rest of frame + src.reserve(sphinx_packet_size); + return Ok(None); + } + + // advance buffer past the header - at this point we have enough bytes + src.advance(Header::SIZE); + let sphinx_packet_bytes = src.split_to(sphinx_packet_size); + let sphinx_packet = match SphinxPacket::from_bytes(&sphinx_packet_bytes) { + Ok(sphinx_packet) => sphinx_packet, + // here it could be debatable whether stream is corrupt or not, + // but let's go with the safer approach and assume it is. + Err(_) => return Err(SphinxCodecError::MalformedSphinxPacket), + }; + + let nymsphinx_packet = FramedSphinxPacket { + header, + packet: sphinx_packet, + }; + + // As per docs: + // Before returning from the function, implementations should ensure that the buffer + // has appropriate capacity in anticipation of future calls to decode. + // Failing to do so leads to inefficiency. + + // if we have at least one more byte available, we can reserve enough bytes for + // the entire next frame, if not, we assume the next frame is an ack packet and + // reserve for that. + if !src.is_empty() { + let next_packet_len = match PacketSize::try_from(src[0]) { + Ok(next_packet_len) => next_packet_len, + // the next frame will be malformed but let's leave handling the error to the next + // call to 'decode', as presumably, the current sphinx packet is still valid + Err(_) => return Ok(Some(nymsphinx_packet)), + }; + let next_frame_len = next_packet_len.size() + Header::SIZE; + src.reserve(next_frame_len - 1); + } else { + src.reserve(Header::SIZE + PacketSize::ACKPacket.size()); + } + + Ok(Some(nymsphinx_packet)) + } +} + +#[cfg(test)] +mod packet_encoding { + use super::*; + use nymsphinx_types::builder::SphinxPacketBuilder; + use nymsphinx_types::{ + crypto, Delay as SphinxDelay, Destination, DestinationAddressBytes, Node, NodeAddressBytes, + DESTINATION_ADDRESS_LENGTH, IDENTIFIER_LENGTH, NODE_ADDRESS_LENGTH, + }; + + fn make_valid_sphinx_packet(size: PacketSize) -> SphinxPacket { + let (_, node1_pk) = crypto::keygen(); + let node1 = Node::new( + NodeAddressBytes::from_bytes([5u8; NODE_ADDRESS_LENGTH]), + node1_pk, + ); + let (_, node2_pk) = crypto::keygen(); + let node2 = Node::new( + NodeAddressBytes::from_bytes([4u8; NODE_ADDRESS_LENGTH]), + node2_pk, + ); + let (_, node3_pk) = crypto::keygen(); + let node3 = Node::new( + NodeAddressBytes::from_bytes([2u8; NODE_ADDRESS_LENGTH]), + node3_pk, + ); + + let route = [node1, node2, node3]; + let destination = Destination::new( + DestinationAddressBytes::from_bytes([3u8; DESTINATION_ADDRESS_LENGTH]), + [4u8; IDENTIFIER_LENGTH], + ); + let delays = vec![ + SphinxDelay::new_from_nanos(42), + SphinxDelay::new_from_nanos(42), + SphinxDelay::new_from_nanos(42), + ]; + SphinxPacketBuilder::new() + .with_payload_size(size.payload_size()) + .build_packet(b"foomp".to_vec(), &route, &destination, &delays) + .unwrap() + } + + #[test] + fn whole_packet_can_be_decoded_from_a_valid_encoded_instance() { + let header = Default::default(); + let sphinx_packet = make_valid_sphinx_packet(Default::default()); + let sphinx_bytes = sphinx_packet.to_bytes(); + + let packet = FramedSphinxPacket { + header, + packet: sphinx_packet, + }; + + let mut bytes = BytesMut::new(); + SphinxCodec.encode(packet, &mut bytes).unwrap(); + let decoded = SphinxCodec.decode(&mut bytes).unwrap().unwrap(); + + assert_eq!(decoded.header, header); + assert_eq!(decoded.packet.to_bytes(), sphinx_bytes) + } + + #[cfg(test)] + mod decode_will_allocate_enough_bytes_for_next_call { + use super::*; + + #[test] + fn for_empty_bytes() { + // empty bytes should allocate for header + ack packet + let mut empty_bytes = BytesMut::new(); + assert!(SphinxCodec.decode(&mut empty_bytes).unwrap().is_none()); + assert_eq!( + empty_bytes.capacity(), + Header::SIZE + PacketSize::ACKPacket.size() + ); + } + + #[test] + fn for_bytes_with_header() { + // if header gets decoded there should be enough bytes for the entire frame + let packet_sizes = vec![ + PacketSize::ACKPacket, + PacketSize::RegularPacket, + PacketSize::ExtendedPacket, + ]; + for packet_size in packet_sizes { + let header = Header { + packet_size, + packet_mode: Default::default(), + }; + let mut bytes = BytesMut::new(); + header.encode(&mut bytes).unwrap(); + assert!(SphinxCodec.decode(&mut bytes).unwrap().is_none()); + + assert_eq!(bytes.capacity(), Header::SIZE + packet_size.size()) + } + } + + #[test] + fn for_full_frame() { + // if full frame is used exactly, there should be enough space for header + ack packet + let packet = FramedSphinxPacket { + header: Header::default(), + packet: make_valid_sphinx_packet(Default::default()), + }; + + let mut bytes = BytesMut::new(); + SphinxCodec.encode(packet, &mut bytes).unwrap(); + assert!(SphinxCodec.decode(&mut bytes).unwrap().is_some()); + assert_eq!( + bytes.capacity(), + Header::SIZE + PacketSize::ACKPacket.size() + ); + } + + #[test] + fn for_full_frame_with_extra_byte() { + // if there was at least 1 byte left, there should be enough space for entire next frame + let packet_sizes = vec![ + PacketSize::ACKPacket, + PacketSize::RegularPacket, + PacketSize::ExtendedPacket, + ]; + + for packet_size in packet_sizes { + let first_packet = FramedSphinxPacket { + header: Header::default(), + packet: make_valid_sphinx_packet(Default::default()), + }; + + let mut bytes = BytesMut::new(); + SphinxCodec.encode(first_packet, &mut bytes).unwrap(); + bytes.put_u8(packet_size as u8); + assert!(SphinxCodec.decode(&mut bytes).unwrap().is_some()); + + assert!(bytes.capacity() >= Header::SIZE + packet_size.size()) + } + } + } + + #[test] + fn can_decode_two_packets_immediately() { + let packet1 = FramedSphinxPacket { + header: Header::default(), + packet: make_valid_sphinx_packet(Default::default()), + }; + + let packet2 = FramedSphinxPacket { + header: Header::default(), + packet: make_valid_sphinx_packet(Default::default()), + }; + + let mut bytes = BytesMut::new(); + + SphinxCodec.encode(packet1, &mut bytes).unwrap(); + SphinxCodec.encode(packet2, &mut bytes).unwrap(); + + assert!(SphinxCodec.decode(&mut bytes).unwrap().is_some()); + assert!(SphinxCodec.decode(&mut bytes).unwrap().is_some()); + assert!(SphinxCodec.decode(&mut bytes).unwrap().is_none()); + } + + #[test] + fn can_decode_two_packets_in_separate_calls() { + let packet1 = FramedSphinxPacket { + header: Header::default(), + packet: make_valid_sphinx_packet(Default::default()), + }; + + let packet2 = FramedSphinxPacket { + header: Header::default(), + packet: make_valid_sphinx_packet(Default::default()), + }; + + let mut bytes = BytesMut::new(); + let mut bytes_tmp = BytesMut::new(); + + SphinxCodec.encode(packet1, &mut bytes).unwrap(); + SphinxCodec.encode(packet2, &mut bytes_tmp).unwrap(); + + let tmp = bytes_tmp.split_off(100); + bytes.put(bytes_tmp); + + assert!(SphinxCodec.decode(&mut bytes).unwrap().is_some()); + assert!(SphinxCodec.decode(&mut bytes).unwrap().is_none()); + + bytes.put(tmp); + + assert!(SphinxCodec.decode(&mut bytes).unwrap().is_some()); + assert!(SphinxCodec.decode(&mut bytes).unwrap().is_none()); + } +} diff --git a/common/nymsphinx/framing/src/lib.rs b/common/nymsphinx/framing/src/lib.rs index 065c087f11a..4215f888015 100644 --- a/common/nymsphinx/framing/src/lib.rs +++ b/common/nymsphinx/framing/src/lib.rs @@ -12,136 +12,5 @@ // See the License for the specific language governing permissions and // limitations under the License. -use bytes::{Buf, BufMut, BytesMut}; -use nymsphinx_params::packet_sizes::{InvalidPacketSize, PacketSize}; -use nymsphinx_types::SphinxPacket; -use std::convert::TryFrom; -use std::io; -use tokio_util::codec::{Decoder, Encoder}; - -#[derive(Debug)] -pub enum SphinxCodecError { - InvalidPacketSize, - MalformedSphinxPacket, - IoError(io::Error), -} - -impl From<io::Error> for SphinxCodecError { - fn from(err: io::Error) -> Self { - SphinxCodecError::IoError(err) - } -} - -impl Into<io::Error> for SphinxCodecError { - fn into(self) -> io::Error { - match self { - SphinxCodecError::InvalidPacketSize => { - io::Error::new(io::ErrorKind::InvalidInput, "invalid packet size") - } - SphinxCodecError::MalformedSphinxPacket => { - io::Error::new(io::ErrorKind::InvalidData, "malformed packet") - } - SphinxCodecError::IoError(err) => err, - } - } -} - -impl From<InvalidPacketSize> for SphinxCodecError { - fn from(_: InvalidPacketSize) -> Self { - SphinxCodecError::InvalidPacketSize - } -} - -// The SphinxCodec is an extremely simple one, u8 representing one of valid packet -// lengths followed by the actual framed packet -pub struct SphinxCodec; - -impl Encoder<SphinxPacket> for SphinxCodec { - type Error = SphinxCodecError; - - fn encode(&mut self, item: SphinxPacket, dst: &mut BytesMut) -> Result<(), Self::Error> { - let packet_bytes = item.to_bytes(); - let packet_length = packet_bytes.len(); - let packet_size = PacketSize::get_type(packet_length)?; - dst.reserve(1 + packet_size.size()); - dst.put_u8(packet_size as u8); - dst.put(packet_bytes.as_ref()); - Ok(()) - } -} - -impl Decoder for SphinxCodec { - type Item = SphinxPacket; - type Error = SphinxCodecError; - - //https://docs.rs/tokio-util/0.3.1/tokio_util/codec/trait.Decoder.html - fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> { - if src.is_empty() { - // can't do anything if we have no bytes - return Ok(None); - } - // we at least have a single byte in the buffer, so we can read the expected - // length of the sphinx packet - let packet_len_flag = src[0]; - let packet_len = PacketSize::try_from(packet_len_flag)?; - - let frame_len = packet_len.size() + 1; // one is due to the flag taking the space - if src.len() < frame_len { - // we don't have enough bytes to read the entire frame - src.reserve(frame_len); - return Ok(None); - } - // we advance the buffer beyond the flag - src.advance(1); - let sphinx_packet_bytes = src.split_to(packet_len.size()); - let sphinx_packet = match SphinxPacket::from_bytes(&sphinx_packet_bytes) { - Ok(sphinx_packet) => sphinx_packet, - // here it could be debatable whether stream is corrupt or not, - // but let's go with the safer approach and assume it is. - Err(_) => return Err(SphinxCodecError::MalformedSphinxPacket), - }; - - // As per docs: - // Before returning from the function, implementations should ensure that the buffer - // has appropriate capacity in anticipation of future calls to decode. - // Failing to do so leads to inefficiency. - - // if we have at least one more byte available, we can reserve enough bytes for - // the entire next frame - if !src.is_empty() { - let next_packet_len = match PacketSize::try_from(src[0]) { - Ok(next_packet_len) => next_packet_len, - // the next frame will be malformed but let's leave handling the error to the next - // call to 'decode', as presumably, the current sphinx packet is still valid - Err(_) => return Ok(Some(sphinx_packet)), - }; - let next_frame_len = next_packet_len.size() + 1; - src.reserve(next_frame_len); - } - - Ok(Some(sphinx_packet)) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[cfg(test)] - #[allow(dead_code)] - fn consume( - codec: &mut SphinxCodec, - bytes: &mut BytesMut, - ) -> Vec<Result<Option<SphinxPacket>, SphinxCodecError>> { - let mut result = Vec::new(); - loop { - match codec.decode(bytes) { - Ok(None) => { - break; - } - output => result.push(output), - } - } - result - } -} +pub mod codec; +pub mod packet; diff --git a/common/nymsphinx/framing/src/packet.rs b/common/nymsphinx/framing/src/packet.rs new file mode 100644 index 00000000000..1296f5e75ba --- /dev/null +++ b/common/nymsphinx/framing/src/packet.rs @@ -0,0 +1,165 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +use crate::codec::SphinxCodecError; +use bytes::{BufMut, BytesMut}; +use nymsphinx_params::packet_sizes::PacketSize; +use nymsphinx_params::PacketMode; +use nymsphinx_types::SphinxPacket; +use std::convert::TryFrom; + +pub struct FramedSphinxPacket { + /// Contains any metadata helping receiver to handle the underlying packet. + pub(crate) header: Header, + + /// The actual SphinxPacket being sent. + pub(crate) packet: SphinxPacket, +} + +impl FramedSphinxPacket { + pub fn new(packet: SphinxPacket, packet_mode: PacketMode) -> Self { + // If this fails somebody is using the library in a super incorrect way, because they + // already managed to somehow create a sphinx packet + let packet_size = PacketSize::get_type(packet.len()).unwrap(); + FramedSphinxPacket { + header: Header { + packet_size, + packet_mode, + }, + packet, + } + } + + pub fn packet_size(&self) -> PacketSize { + self.header.packet_size + } + + pub fn packet_mode(&self) -> PacketMode { + self.header.packet_mode + } + + pub fn into_inner(self) -> SphinxPacket { + self.packet + } +} + +// Contains any metadata that might be useful for sending between mix nodes. +// TODO: in theory all those data could be put in a single `u8` by setting appropriate bits, +// but would that really be worth it? +#[derive(Debug, Default, PartialEq, Copy, Clone)] +pub struct Header { + /// Represents type and consequently size of the included SphinxPacket. + pub(crate) packet_size: PacketSize, + + /// Represents whether this packet is sent in a `vpn_mode` meaning it should not get delayed + /// and shared keys might get reused. Mixnodes are capable of inferring this mode from the + /// delay values inside the packet header (i.e. being set to 0), however, gateway, being final + /// hop, would be unable to do so. + /// + /// TODO: ask @AP whether this can be sent like this - could it introduce some anonymity issues? + /// (note: this will be behind some encryption, either something implemented by us or some SSL action) + pub(crate) packet_mode: PacketMode, +} + +impl Header { + pub(crate) const SIZE: usize = 2; + + pub(crate) fn encode(&self, dst: &mut BytesMut) -> Result<(), SphinxCodecError> { + // we reserve one byte for `packet_size` and the other for `mode` + dst.reserve(Self::SIZE); + dst.put_u8(self.packet_size as u8); + dst.put_u8(self.packet_mode as u8); + // reserve bytes for the actual packet + dst.reserve(self.packet_size.size()); + Ok(()) + } + + pub(crate) fn decode(src: &mut BytesMut) -> Result<Option<Self>, SphinxCodecError> { + if src.len() < Self::SIZE { + // can't do anything if we don't have enough bytes - but reserve enough for the next call + src.reserve(Self::SIZE); + return Ok(None); + } + + Ok(Some(Header { + packet_size: PacketSize::try_from(src[0])?, + packet_mode: PacketMode::try_from(src[1])?, + })) + } +} + +#[cfg(test)] +mod header_encoding { + use super::*; + + #[test] + fn header_can_be_decoded_from_a_valid_encoded_instance() { + let header = Header::default(); + let mut bytes = BytesMut::new(); + header.encode(&mut bytes).unwrap(); + let decoded = Header::decode(&mut bytes).unwrap().unwrap(); + assert_eq!(decoded, header); + } + + #[test] + fn decoding_will_fail_for_unknown_packet_size() { + let unknown_packet_size: u8 = 255; + // make sure this is still 'unknown' for if we make changes in the future + assert!(PacketSize::try_from(unknown_packet_size).is_err()); + + let mut bytes = BytesMut::from([unknown_packet_size, PacketMode::default() as u8].as_ref()); + assert!(Header::decode(&mut bytes).is_err()) + } + + #[test] + fn decoding_will_fail_for_unknown_packet_mode() { + let unknown_packet_mode: u8 = 255; + // make sure this is still 'unknown' for if we make changes in the future + assert!(PacketMode::try_from(unknown_packet_mode).is_err()); + + let mut bytes = BytesMut::from([PacketSize::default() as u8, unknown_packet_mode].as_ref()); + assert!(Header::decode(&mut bytes).is_err()) + } + + #[test] + fn decode_will_allocate_enough_bytes_for_next_call() { + let mut empty_bytes = BytesMut::new(); + let decode_attempt_1 = Header::decode(&mut empty_bytes).unwrap(); + assert!(decode_attempt_1.is_none()); + assert!(empty_bytes.capacity() > Header::SIZE); + + let mut empty_bytes = BytesMut::with_capacity(1); + let decode_attempt_2 = Header::decode(&mut empty_bytes).unwrap(); + assert!(decode_attempt_2.is_none()); + assert!(empty_bytes.capacity() > Header::SIZE); + } + + #[test] + fn header_encoding_reserves_enough_bytes_for_full_sphinx_packet() { + let packet_sizes = vec![ + PacketSize::ACKPacket, + PacketSize::RegularPacket, + PacketSize::ExtendedPacket, + ]; + for packet_size in packet_sizes { + let header = Header { + packet_size, + packet_mode: Default::default(), + }; + let mut bytes = BytesMut::new(); + header.encode(&mut bytes).unwrap(); + assert_eq!(bytes.capacity(), bytes.len() + packet_size.size()) + } + } +} diff --git a/common/nymsphinx/params/src/lib.rs b/common/nymsphinx/params/src/lib.rs index afcdcda36d9..9c014581100 100644 --- a/common/nymsphinx/params/src/lib.rs +++ b/common/nymsphinx/params/src/lib.rs @@ -11,12 +11,16 @@ // 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. +use crypto::aes_ctr::Aes128Ctr; use crypto::blake3; -pub mod packet_sizes; -use crypto::aes_ctr::Aes128Ctr; +// Re-export for ease of use +pub use packet_modes::PacketMode; pub use packet_sizes::PacketSize; +pub mod packet_modes; +pub mod packet_sizes; + // If somebody can provide an argument why it might be reasonable to have more than 255 mix hops, // I will change this to [`usize`] pub const DEFAULT_NUM_MIX_HOPS: u8 = 3; diff --git a/common/nymsphinx/params/src/packet_modes.rs b/common/nymsphinx/params/src/packet_modes.rs new file mode 100644 index 00000000000..1f54d9e8519 --- /dev/null +++ b/common/nymsphinx/params/src/packet_modes.rs @@ -0,0 +1,58 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +use std::convert::TryFrom; + +#[derive(Debug)] +pub struct InvalidPacketMode; + +#[repr(u8)] +#[derive(Clone, Copy, Debug, PartialEq)] +pub enum PacketMode { + /// Represents 'normal' packet sent through the network that should be delayed by an appropriate + /// value at each hop. + Mix = 0, + + /// Represents a VPN packet that should not be delayed and ideally cached pre-computed keys + /// should be used for unwrapping data. Note that it does not offer the same level of anonymity. + VPN = 1, +} + +impl PacketMode { + pub fn is_mix(self) -> bool { + self == PacketMode::Mix + } + + pub fn is_vpn(self) -> bool { + self == PacketMode::VPN + } +} + +impl TryFrom<u8> for PacketMode { + type Error = InvalidPacketMode; + + fn try_from(value: u8) -> std::result::Result<Self, Self::Error> { + match value { + _ if value == (PacketMode::Mix as u8) => Ok(Self::Mix), + _ if value == (PacketMode::VPN as u8) => Ok(Self::VPN), + _ => Err(InvalidPacketMode), + } + } +} + +impl Default for PacketMode { + fn default() -> Self { + PacketMode::Mix + } +} diff --git a/common/nymsphinx/params/src/packet_sizes.rs b/common/nymsphinx/params/src/packet_sizes.rs index 89ecb46e639..9302662f4ee 100644 --- a/common/nymsphinx/params/src/packet_sizes.rs +++ b/common/nymsphinx/params/src/packet_sizes.rs @@ -28,16 +28,20 @@ const ACK_IV_SIZE: usize = 16; const ACK_PACKET_SIZE: usize = HEADER_SIZE + PAYLOAD_OVERHEAD_SIZE + ACK_IV_SIZE + FRAG_ID_LEN; const EXTENDED_PACKET_SIZE: usize = HEADER_SIZE + PAYLOAD_OVERHEAD_SIZE + 32 * 1024; +#[derive(Debug)] pub struct InvalidPacketSize; #[repr(u8)] -#[derive(Clone, Copy, Debug)] +#[derive(Clone, Copy, Debug, PartialEq)] pub enum PacketSize { - RegularPacket = 1, // for example instant messaging use case - ACKPacket = 2, + RegularPacket = 1, + // for sending SURB-ACKs - ExtendedPacket = 3, // for example for streaming fast and furious in uncompressed 10bit 4K HDR quality + ACKPacket = 2, + + // for example for streaming fast and furious in uncompressed 10bit 4K HDR quality + ExtendedPacket = 3, } impl TryFrom<u8> for PacketSize { diff --git a/common/nymsphinx/src/lib.rs b/common/nymsphinx/src/lib.rs index 3d135581039..89300a7ca1c 100644 --- a/common/nymsphinx/src/lib.rs +++ b/common/nymsphinx/src/lib.rs @@ -22,6 +22,7 @@ pub use nymsphinx_addressing as addressing; pub use nymsphinx_anonymous_replies as anonymous_replies; pub use nymsphinx_chunking as chunking; pub use nymsphinx_cover as cover; +pub use nymsphinx_forwarding as forwarding; #[cfg(not(target_arch = "wasm32"))] pub use nymsphinx_framing as framing; pub use nymsphinx_params as params; diff --git a/common/nymsphinx/src/preparer.rs b/common/nymsphinx/src/preparer/mod.rs similarity index 82% rename from common/nymsphinx/src/preparer.rs rename to common/nymsphinx/src/preparer/mod.rs index 7851a7e0b48..257e2c37b6c 100644 --- a/common/nymsphinx/src/preparer.rs +++ b/common/nymsphinx/src/preparer/mod.rs @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +use self::vpn_manager::VPNManager; use crate::chunking; use crypto::asymmetric::encryption; use crypto::shared_key::new_ephemeral_shared_key; @@ -24,29 +25,31 @@ use nymsphinx_addressing::nodes::{NymNodeRoutingAddress, MAX_NODE_ADDRESS_UNPADD use nymsphinx_anonymous_replies::encryption_key::SURBEncryptionKey; use nymsphinx_anonymous_replies::reply_surb::ReplySURB; use nymsphinx_chunking::fragment::{Fragment, FragmentIdentifier}; +use nymsphinx_forwarding::packet::MixPacket; use nymsphinx_params::packet_sizes::PacketSize; use nymsphinx_params::{ - PacketEncryptionAlgorithm, PacketHkdfAlgorithm, ReplySURBEncryptionAlgorithm, + PacketEncryptionAlgorithm, PacketHkdfAlgorithm, PacketMode, ReplySURBEncryptionAlgorithm, ReplySURBKeyDigestAlgorithm, DEFAULT_NUM_MIX_HOPS, }; use nymsphinx_types::builder::SphinxPacketBuilder; -use nymsphinx_types::{delays, Delay, SphinxPacket}; +use nymsphinx_types::{delays, Delay}; use rand::{CryptoRng, Rng}; use std::convert::TryFrom; use std::time::Duration; use topology::{NymTopology, NymTopologyError}; +mod vpn_manager; + /// Represents fully packed and prepared [`Fragment`] that can be sent through the mix network. pub struct PreparedFragment { /// Indicates the total expected round-trip time, i.e. delay from the sending of this message /// until receiving the acknowledgement included inside of it. pub total_delay: Delay, - /// Indicates address of the node to which the message should be sent. - pub first_hop_address: NymNodeRoutingAddress, - - /// The actual 'chunk' of the message that is going to go through the mix network. - pub sphinx_packet: SphinxPacket, + /// Indicates all data required to serialize and forward the data. It contains the actual + /// address of the node to which the message should be sent, the actual 'chunk' of the message + /// going through the mix network and also the 'mode' of the packet, i.e. VPN or Mix. + pub mix_packet: MixPacket, } #[derive(Debug)] @@ -64,7 +67,7 @@ impl From<NymTopologyError> for PreparationError { /// Prepares the message that is to be sent through the mix network by attaching /// an optional reply-SURB, padding it to appropriate length, encrypting its content, /// and chunking into appropriate size [`Fragment`]s. -#[derive(Debug, Clone)] +#[cfg_attr(not(target_arch = "wasm32"), derive(Clone))] pub struct MessagePreparer<R: CryptoRng + Rng> { /// Instance of a cryptographically secure random number generator. rng: R, @@ -85,6 +88,14 @@ pub struct MessagePreparer<R: CryptoRng + Rng> { /// Number of mix hops each packet ('real' message, ack, reply) is expected to take. /// Note that it does not include gateway hops. num_mix_hops: u8, + + /// Mode of all mix packets created - VPN or Mix. They indicate whether packets should get delayed + /// and keys reused. + mode: PacketMode, + + /// If the VPN mode is activated, this underlying secret will be used for multiple sphinx + /// packets created. + vpn_manager: Option<VPNManager>, } impl<R> MessagePreparer<R> @@ -92,11 +103,22 @@ where R: CryptoRng + Rng, { pub fn new( - rng: R, + mut rng: R, sender_address: Recipient, average_packet_delay: Duration, average_ack_delay: Duration, + mode: PacketMode, + vpn_key_reuse_limit: Option<usize>, ) -> Self { + let vpn_manager = if mode.is_vpn() { + Some(VPNManager::new( + &mut rng, + vpn_key_reuse_limit.expect("No key reuse limit provided in vpn mode!"), + )) + } else { + None + }; + MessagePreparer { rng, packet_size: Default::default(), @@ -104,6 +126,8 @@ where average_packet_delay, average_ack_delay, num_mix_hops: DEFAULT_NUM_MIX_HOPS, + mode, + vpn_manager, } } @@ -218,7 +242,7 @@ where /// - compute vk_b = g^x || v_b /// - compute sphinx_plaintext = SURB_ACK || g^x || v_b /// - compute sphinx_packet = Sphinx(recipient, sphinx_plaintext) - pub fn prepare_chunk_for_sending( + pub async fn prepare_chunk_for_sending( &mut self, fragment: Fragment, topology: &NymTopology, @@ -227,9 +251,20 @@ where ) -> Result<PreparedFragment, NymTopologyError> { // create an ack let (ack_delay, surb_ack_bytes) = self - .generate_surb_ack(fragment.fragment_identifier(), topology, ack_key)? + .generate_surb_ack(fragment.fragment_identifier(), topology, ack_key) + .await? .prepare_for_sending(); + // TODO: + // TODO: + // TODO: + // TODO: + // TODO: ASK @AP AND @DH WHETHER THOSE KEYS CAN/SHOULD ALSO BE REUSED IN VPN MODE!! + // TODO: + // TODO: + // TODO: + // TODO: + // create keys for 'payload' encryption let (ephemeral_keypair, shared_key) = new_ephemeral_shared_key::<PacketEncryptionAlgorithm, PacketHkdfAlgorithm, _>( @@ -269,40 +304,62 @@ where // create the actual sphinx packet here. With valid route and correct payload size, // there's absolutely no reason for this call to fail. - // note: once merged, that's an easy rng injection point for sphinx packets : ) - let sphinx_packet = SphinxPacketBuilder::new() - .with_payload_size(self.packet_size.payload_size()) - .build_packet(packet_payload, &route, &destination, &delays) - .unwrap(); + let sphinx_packet = if let Some(vpn_manager) = self.vpn_manager.as_mut() { + let initial_secret = vpn_manager.use_secret(&mut self.rng).await; + + SphinxPacketBuilder::new() + .with_payload_size(self.packet_size.payload_size()) + .with_initial_secret(&initial_secret) + .build_packet(packet_payload, &route, &destination, &delays) + .unwrap() + } else { + SphinxPacketBuilder::new() + .with_payload_size(self.packet_size.payload_size()) + .build_packet(packet_payload, &route, &destination, &delays) + .unwrap() + }; // from the previously constructed route extract the first hop let first_hop_address = - NymNodeRoutingAddress::try_from(route.first().unwrap().address.clone()).unwrap(); + NymNodeRoutingAddress::try_from(route.first().unwrap().address).unwrap(); Ok(PreparedFragment { // the round-trip delay is the sum of delays of all hops on the forward route as // well as the total delay of the ack packet. total_delay: delays.iter().sum::<Delay>() + ack_delay, - first_hop_address, - sphinx_packet, + mix_packet: MixPacket::new(first_hop_address, sphinx_packet, self.mode), }) } /// Construct an acknowledgement SURB for the given [`FragmentIdentifier`] - fn generate_surb_ack( + async fn generate_surb_ack( &mut self, fragment_id: FragmentIdentifier, topology: &NymTopology, ack_key: &AckKey, ) -> Result<SURBAck, NymTopologyError> { - SURBAck::construct( - &mut self.rng, - &self.sender_address, - ack_key, - fragment_id.to_bytes(), - self.average_ack_delay, - topology, - ) + if let Some(vpn_manager) = self.vpn_manager.as_mut() { + let initial_secret = vpn_manager.use_secret(&mut self.rng).await; + SURBAck::construct( + &mut self.rng, + &self.sender_address, + ack_key, + fragment_id.to_bytes(), + self.average_ack_delay, + topology, + Some(&initial_secret), + ) + } else { + SURBAck::construct( + &mut self.rng, + &self.sender_address, + ack_key, + fragment_id.to_bytes(), + self.average_ack_delay, + topology, + None, + ) + } } /// Attaches an optional reply-surb and correct padding to the underlying message @@ -323,13 +380,13 @@ where } // TODO: perhaps the return type could somehow be combined with [`PreparedFragment`] ? - pub fn prepare_reply_for_use( + pub async fn prepare_reply_for_use( &mut self, message: Vec<u8>, reply_surb: ReplySURB, topology: &NymTopology, ack_key: &AckKey, - ) -> Result<(FragmentIdentifier, SphinxPacket, NymNodeRoutingAddress), PreparationError> { + ) -> Result<(MixPacket, FragmentIdentifier), PreparationError> { // there's no chunking in reply-surbs so there's a hard limit on message, // we also need to put the key digest into the message (same size as ephemeral key) // and need 1 byte to indicate padding length (this is not the case for 'normal' messages @@ -352,7 +409,8 @@ where // gateways could not distinguish reply packets from normal messages due to lack of said acks // note: the ack delay is irrelevant since we do not know the delay of actual surb let (_, surb_ack_bytes) = self - .generate_surb_ack(reply_id, topology, ack_key)? + .generate_surb_ack(reply_id, topology, ack_key) + .await? .prepare_for_sending(); let zero_pad_len = self.packet_size.plaintext_size() @@ -398,7 +456,7 @@ where .apply_surb(&packet_payload, Some(self.packet_size)) .unwrap(); - Ok((reply_id, packet, first_hop)) + Ok((MixPacket::new(first_hop, packet, self.mode), reply_id)) } #[allow(dead_code)] @@ -414,6 +472,8 @@ where average_packet_delay: Default::default(), average_ack_delay: Default::default(), num_mix_hops: DEFAULT_NUM_MIX_HOPS, + mode: Default::default(), + vpn_manager: None, } } } diff --git a/common/nymsphinx/src/preparer/vpn_manager.rs b/common/nymsphinx/src/preparer/vpn_manager.rs new file mode 100644 index 00000000000..dd589d38e42 --- /dev/null +++ b/common/nymsphinx/src/preparer/vpn_manager.rs @@ -0,0 +1,154 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +use nymsphinx_types::EphemeralSecret; +use rand::{CryptoRng, Rng}; +use std::sync::atomic::{AtomicUsize, Ordering}; +#[cfg(not(target_arch = "wasm32"))] +use std::sync::Arc; +#[cfg(not(target_arch = "wasm32"))] +use tokio::sync::{RwLock, RwLockReadGuard}; + +#[cfg(not(target_arch = "wasm32"))] +pub(super) type SpinhxKeyRef<'a> = RwLockReadGuard<'a, EphemeralSecret>; + +#[cfg(target_arch = "wasm32")] +pub(super) type SpinhxKeyRef<'a> = &'a EphemeralSecret; + +#[cfg_attr(not(target_arch = "wasm32"), derive(Clone))] +pub(super) struct VPNManager { + #[cfg(not(target_arch = "wasm32"))] + inner: Arc<Inner>, + + #[cfg(target_arch = "wasm32")] + inner: Inner, +} + +struct Inner { + /// Maximum number of times particular sphinx-secret can be re-used before being rotated. + secret_reuse_limit: usize, + + /// Currently used initial sphinx-secret for the packets sent. + #[cfg(not(target_arch = "wasm32"))] + current_initial_secret: RwLock<EphemeralSecret>, + + #[cfg(target_arch = "wasm32")] + // this is a temporary work-around for wasm (which currently does not have retransmission + // and hence will not require multi-thread access) and also we can't import tokio's RWLock + // in wasm. + current_initial_secret: EphemeralSecret, + + /// If the client is running as VPN it's expected to keep re-using the same initial secret + /// for a while so that the mixnodes could cache some secret derivation results. However, + /// we should reset it every once in a while. + packets_with_current_secret: AtomicUsize, +} + +impl VPNManager { + #[cfg(not(target_arch = "wasm32"))] + pub(super) fn new<R>(mut rng: R, secret_reuse_limit: usize) -> Self + where + R: CryptoRng + Rng, + { + let initial_secret = EphemeralSecret::new_with_rng(&mut rng); + VPNManager { + inner: Arc::new(Inner { + secret_reuse_limit, + current_initial_secret: RwLock::new(initial_secret), + packets_with_current_secret: AtomicUsize::new(0), + }), + } + } + + #[cfg(target_arch = "wasm32")] + pub(super) fn new<R>(mut rng: R, secret_reuse_limit: usize) -> Self + where + R: CryptoRng + Rng, + { + let initial_secret = EphemeralSecret::new_with_rng(&mut rng); + VPNManager { + inner: Inner { + secret_reuse_limit, + current_initial_secret: initial_secret, + packets_with_current_secret: AtomicUsize::new(0), + }, + } + } + + #[cfg(not(target_arch = "wasm32"))] + pub(super) async fn rotate_secret<R>(&mut self, mut rng: R) + where + R: CryptoRng + Rng, + { + let new_secret = EphemeralSecret::new_with_rng(&mut rng); + let mut write_guard = self.inner.current_initial_secret.write().await; + + *write_guard = new_secret; + // in here we have an exclusive lock so we don't have to have restrictive ordering as no + // other thread will be able to get here + self.inner + .packets_with_current_secret + .store(0, Ordering::Relaxed) + } + + // this method is async for consistency with non-wasm version + #[cfg(target_arch = "wasm32")] + pub(super) async fn rotate_secret<R>(&mut self, mut rng: R) + where + R: CryptoRng + Rng, + { + let new_secret = EphemeralSecret::new_with_rng(&mut rng); + self.inner.current_initial_secret = new_secret; + + // wasm is single-threaded so relaxed ordering is also fine here + self.inner + .packets_with_current_secret + .store(0, Ordering::Relaxed); + } + + #[cfg(not(target_arch = "wasm32"))] + pub(super) async fn current_secret(&self) -> SpinhxKeyRef<'_> { + self.inner.current_initial_secret.read().await + } + + #[cfg(target_arch = "wasm32")] + pub(super) async fn current_secret(&self) -> SpinhxKeyRef<'_> { + &self.inner.current_initial_secret + } + + fn increment_key_usage(&mut self) { + // TODO: is this the appropriate ordering? + self.inner + .packets_with_current_secret + .fetch_add(1, Ordering::SeqCst); + } + + fn current_key_usage(&self) -> usize { + // TODO: is this the appropriate ordering? + self.inner + .packets_with_current_secret + .load(Ordering::SeqCst) + } + + pub(super) async fn use_secret<'a, R>(&'a mut self, rng: R) -> SpinhxKeyRef<'a> + where + R: CryptoRng + Rng, + { + if self.current_key_usage() > self.inner.secret_reuse_limit { + self.rotate_secret(rng).await; + } + self.increment_key_usage(); + self.current_secret().await + } +} diff --git a/common/nymsphinx/src/receiver.rs b/common/nymsphinx/src/receiver.rs index 8481af18375..48c167ce257 100644 --- a/common/nymsphinx/src/receiver.rs +++ b/common/nymsphinx/src/receiver.rs @@ -34,7 +34,7 @@ pub struct ReconstructedMessage { pub enum MessageRecoveryError { InvalidSurbPrefixError, MalformedSURBError(ReplySURBError), - InvalidRemoteEphemeralKey(encryption::EncryptionKeyError), + InvalidRemoteEphemeralKey(encryption::KeyRecoveryError), MalformedFragmentError, InvalidMessagePaddingError, MalformedReconstructedMessage(Vec<i32>), @@ -47,8 +47,8 @@ impl From<ReplySURBError> for MessageRecoveryError { } } -impl From<encryption::EncryptionKeyError> for MessageRecoveryError { - fn from(err: encryption::EncryptionKeyError) -> Self { +impl From<encryption::KeyRecoveryError> for MessageRecoveryError { + fn from(err: encryption::KeyRecoveryError) -> Self { MessageRecoveryError::InvalidRemoteEphemeralKey(err) } } @@ -216,13 +216,18 @@ mod message_receiver { vec![mix::Node { location: "unknown".to_string(), host: "10.20.30.40:1789".parse().unwrap(), - pub_key: encryption::PublicKey::from_base58_string( + identity_key: identity::PublicKey::from_base58_string( + "3ebjp1Fb9hdcS1AR6AZihgeJiMHkB5jjJUsvqNnfQwU7", + ) + .unwrap(), + sphinx_key: encryption::PublicKey::from_base58_string( "B3GzG62aXAZNg14RoMCp3BhELNBrySLr2JqrwyfYFzRc", ) .unwrap(), layer: 1, - last_seen: 1594812897745695000, + registration_time: 1594812897745695000, version: "0.8.0-dev".to_string(), + reputation: 100, }], ); @@ -231,13 +236,18 @@ mod message_receiver { vec![mix::Node { location: "unknown".to_string(), host: "11.21.31.41:1789".parse().unwrap(), - pub_key: encryption::PublicKey::from_base58_string( + identity_key: identity::PublicKey::from_base58_string( + "D6YaMzLSY7mANtSQRKXsmMZpqgqiVkeiagKM4V4oFPFr", + ) + .unwrap(), + sphinx_key: encryption::PublicKey::from_base58_string( "5Z1VqYwM2xeKxd8H7fJpGWasNiDFijYBAee7MErkZ5QT", ) .unwrap(), layer: 2, - last_seen: 1594812897745695000, + registration_time: 1594812897745695000, version: "0.8.0-dev".to_string(), + reputation: 100, }], ); @@ -246,19 +256,23 @@ mod message_receiver { vec![mix::Node { location: "unknown".to_string(), host: "12.22.32.42:1789".parse().unwrap(), - pub_key: encryption::PublicKey::from_base58_string( + identity_key: identity::PublicKey::from_base58_string( + "GkWDysw4AjESv1KiAiVn7JzzCMJeksxNSXVfr1PpX8wD", + ) + .unwrap(), + sphinx_key: encryption::PublicKey::from_base58_string( "9EyjhCggr2QEA2nakR88YHmXgpy92DWxoe2draDRkYof", ) .unwrap(), layer: 3, - last_seen: 1594812897745695000, + registration_time: 1594812897745695000, version: "0.8.0-dev".to_string(), + reputation: 100, }], ); NymTopology::new( // currently coco_nodes don't really exist so this is still to be determined - vec![], mixes, vec![gateway::Node { location: "unknown".to_string(), @@ -272,7 +286,8 @@ mod message_receiver { "EB42xvMFMD5rUCstE2CDazgQQJ22zLv8SPm1Luxni44c", ) .unwrap(), - last_seen: 1594812897745695000, + registration_time: 1594812897745695000, + reputation: 100, version: "0.8.0-dev".to_string(), }], ) diff --git a/common/nymsphinx/types/Cargo.toml b/common/nymsphinx/types/Cargo.toml index 5fe2e758a89..ac00a39fa5b 100644 --- a/common/nymsphinx/types/Cargo.toml +++ b/common/nymsphinx/types/Cargo.toml @@ -7,5 +7,5 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -sphinx = { git = "https://github.com/nymtech/sphinx", rev="18aa34e1a39a5f3f14ba493ded9209658ff2cbfa" } +sphinx = { git = "https://github.com/nymtech/sphinx", rev="283dcc77dec8ee9ed3bed58c2b878e9c18320723" } #sphinx = { path = "../../../../sphinx"} \ No newline at end of file diff --git a/common/socks5/ordered-buffer/src/buffer.rs b/common/socks5/ordered-buffer/src/buffer.rs index ca26e35ccfd..4034b2ca720 100644 --- a/common/socks5/ordered-buffer/src/buffer.rs +++ b/common/socks5/ordered-buffer/src/buffer.rs @@ -50,13 +50,10 @@ impl OrderedMessageBuffer { let mut contiguous_messages = Vec::new(); let mut index = self.next_index; - loop { - if let Some(ordered_message) = self.messages.remove(&index) { - contiguous_messages.push(ordered_message); - index += 1; - } else { - break; - } + + while let Some(ordered_message) = self.messages.remove(&index) { + contiguous_messages.push(ordered_message); + index += 1; } let high_water = index; diff --git a/common/socks5/ordered-buffer/src/message.rs b/common/socks5/ordered-buffer/src/message.rs index 6bb47847e61..27b64f45c94 100644 --- a/common/socks5/ordered-buffer/src/message.rs +++ b/common/socks5/ordered-buffer/src/message.rs @@ -27,7 +27,7 @@ impl OrderedMessage { /// Attempts to deserialize an `OrderedMessage` from bytes. pub fn try_from_bytes(data: Vec<u8>) -> Result<OrderedMessage, MessageError> { - if data.len() == 0 { + if data.is_empty() { return Err(MessageError::NoData); } diff --git a/common/socks5/ordered-buffer/src/sender.rs b/common/socks5/ordered-buffer/src/sender.rs index fde13d9a17e..c4c16e03a50 100644 --- a/common/socks5/ordered-buffer/src/sender.rs +++ b/common/socks5/ordered-buffer/src/sender.rs @@ -19,7 +19,7 @@ impl OrderedMessageSender { data: input.to_vec(), index: self.next_index, }; - self.next_index = self.next_index + 1; + self.next_index += 1; message } } diff --git a/common/socks5/proxy-helpers/src/available_reader.rs b/common/socks5/proxy-helpers/src/available_reader.rs index a08ca01e1d4..2fed57602e1 100644 --- a/common/socks5/proxy-helpers/src/available_reader.rs +++ b/common/socks5/proxy-helpers/src/available_reader.rs @@ -20,13 +20,18 @@ use std::ops::DerefMut; use std::pin::Pin; use std::task::{Context, Poll}; use tokio::io::AsyncRead; +use tokio::stream::Stream; +use tokio::time::{delay_for, Delay, Duration, Instant}; + +const MAX_READ_AMOUNT: usize = 500 * 1000; // 0.5MB +const GRACE_DURATION: Duration = Duration::from_millis(1); pub struct AvailableReader<'a, R: AsyncRead + Unpin> { - // TODO: come up with a way to avoid using RefCell (not sure if possible though) + // TODO: come up with a way to avoid using RefCell (not sure if possible though due to having to + // mutably borrow both inner reader and buffer at the same time) buf: RefCell<BytesMut>, inner: RefCell<&'a mut R>, - // idea for the future: tiny delay that allows to prevent unnecessary extra fragmentation - // grace_period: Option<Delay>, + grace_period: Option<Delay>, } impl<'a, R> AvailableReader<'a, R> @@ -39,20 +44,15 @@ where AvailableReader { buf: RefCell::new(BytesMut::with_capacity(Self::BUF_INCREMENT)), inner: RefCell::new(reader), - // grace_period: None, + grace_period: Some(delay_for(GRACE_DURATION)), } } } -// TODO: change this guy to a stream? Seems waaay more appropriate considering -// we're getting new Bytes items regularly rather than calling it once. - -impl<'a, R: AsyncRead + Unpin> Future for AvailableReader<'a, R> { - type Output = io::Result<(Bytes, bool)>; +impl<'a, R: AsyncRead + Unpin> Stream for AvailableReader<'a, R> { + type Item = io::Result<Bytes>; - // this SHOULD stay mutable, because we rely on runtime checks inside the method - #[allow(unused_mut)] - fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> { + fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> { // if we have no space in buffer left - expand it if !self.buf.borrow().has_remaining_mut() { self.buf.borrow_mut().reserve(Self::BUF_INCREMENT); @@ -68,19 +68,43 @@ impl<'a, R: AsyncRead + Unpin> Future for AvailableReader<'a, R> { if self.buf.borrow().is_empty() { Poll::Pending } else { + // if exists - check grace period + if let Some(grace_period) = self.grace_period.as_mut() { + if Pin::new(grace_period).poll(cx).is_pending() { + return Poll::Pending; + } + } + let buf = self.buf.replace(BytesMut::new()); - Poll::Ready(Ok((buf.freeze(), false))) + Poll::Ready(Some(Ok(buf.freeze()))) } } - Poll::Ready(Err(err)) => Poll::Ready(Err(err)), + Poll::Ready(Err(err)) => Poll::Ready(Some(Err(err))), Poll::Ready(Ok(n)) => { + // if exists - reset grace period + if let Some(grace_period) = self.grace_period.as_mut() { + let now = Instant::now(); + grace_period.reset(now + GRACE_DURATION); + } + // if we read a non-0 amount, we're not done yet! if n == 0 { let buf = self.buf.replace(BytesMut::new()); - Poll::Ready(Ok((buf.freeze(), true))) + if buf.len() > 0 { + Poll::Ready(Some(Ok(buf.freeze()))) + } else { + Poll::Ready(None) + } } else { // tell the waker we should be polled again! cx.waker().wake_by_ref(); + + // if we reached our maximum amount - return it + let read_bytes_len = self.buf.borrow().len(); + if read_bytes_len >= MAX_READ_AMOUNT { + let buf = self.buf.replace(BytesMut::new()); + return Poll::Ready(Some(Ok(buf.freeze()))); + } Poll::Pending } } @@ -91,19 +115,22 @@ impl<'a, R: AsyncRead + Unpin> Future for AvailableReader<'a, R> { #[cfg(test)] mod tests { use super::*; + use futures::poll; use std::io::Cursor; use std::time::Duration; + use tokio::stream::StreamExt; + use tokio_test::assert_pending; #[tokio::test] async fn available_reader_reads_all_available_data_smaller_than_its_buf() { let data = vec![42u8; 100]; let mut reader = Cursor::new(data.clone()); - let available_reader = AvailableReader::new(&mut reader); - let (read_data, is_finished) = available_reader.await.unwrap(); + let mut available_reader = AvailableReader::new(&mut reader); + let read_data = available_reader.next().await.unwrap().unwrap(); assert_eq!(read_data, data); - assert!(is_finished) + assert!(available_reader.next().await.is_none()) } #[tokio::test] @@ -111,11 +138,11 @@ mod tests { let data = vec![42u8; AvailableReader::<Cursor<Vec<u8>>>::BUF_INCREMENT + 100]; let mut reader = Cursor::new(data.clone()); - let available_reader = AvailableReader::new(&mut reader); - let (read_data, is_finished) = available_reader.await.unwrap(); + let mut available_reader = AvailableReader::new(&mut reader); + let read_data = available_reader.next().await.unwrap().unwrap(); assert_eq!(read_data, data); - assert!(is_finished) + assert!(available_reader.next().await.is_none()) } #[tokio::test] @@ -129,11 +156,11 @@ mod tests { .read(&second_data_chunk) .build(); - let available_reader = AvailableReader::new(&mut reader_mock); - let (read_data, is_finished) = available_reader.await.unwrap(); + let mut available_reader = AvailableReader::new(&mut reader_mock); + let read_data = available_reader.next().await.unwrap().unwrap(); assert_eq!(read_data, first_data_chunk); - assert!(!is_finished) + assert_pending!(poll!(available_reader.next())); } #[tokio::test] @@ -145,10 +172,40 @@ mod tests { .read(&data) .build(); - let available_reader = AvailableReader::new(&mut reader_mock); - let (read_data, is_finished) = available_reader.await.unwrap(); + let mut available_reader = AvailableReader::new(&mut reader_mock); + let read_data = available_reader.next().await.unwrap().unwrap(); assert_eq!(read_data, data); - assert!(is_finished) + assert!(available_reader.next().await.is_none()) } + + // perhaps the issue of tokio io builder will be resolved in tokio 0.3? + // #[tokio::test] + // async fn available_reader_will_wait_for_more_data_if_its_within_grace_period() { + // let first_data_chunk = vec![42u8; 100]; + // let second_data_chunk = vec![123u8; 100]; + // + // let combined_chunks: Vec<_> = first_data_chunk + // .iter() + // .cloned() + // .chain(second_data_chunk.iter().cloned()) + // .collect(); + // + // let mut reader_mock = tokio_test::io::Builder::new() + // .read(&first_data_chunk) + // .wait(Duration::from_millis(2)) + // .read(&second_data_chunk) + // .build(); + // + // let mut available_reader = AvailableReader { + // buf: RefCell::new(BytesMut::with_capacity(4096)), + // inner: RefCell::new(&mut reader_mock), + // grace_period: Some(delay_for(Duration::from_millis(5))), + // }; + // + // let read_data = available_reader.next().await.unwrap().unwrap(); + // + // assert_eq!(read_data, combined_chunks); + // assert!(available_reader.next().await.is_none()) + // } } diff --git a/common/socks5/proxy-helpers/src/connection_controller.rs b/common/socks5/proxy-helpers/src/connection_controller.rs index 558197158e2..eaf2cada759 100644 --- a/common/socks5/proxy-helpers/src/connection_controller.rs +++ b/common/socks5/proxy-helpers/src/connection_controller.rs @@ -41,7 +41,7 @@ pub type ControllerSender = mpsc::UnboundedSender<ControllerCommand>; pub type ControllerReceiver = mpsc::UnboundedReceiver<ControllerCommand>; pub enum ControllerCommand { - Insert(ConnectionId, ConnectionSender, OrderedMessageBuffer), + Insert(ConnectionId, ConnectionSender), Remove(ConnectionId), Send(ConnectionId, Vec<u8>, bool), } @@ -75,7 +75,16 @@ pub struct Controller { active_connections: HashMap<ConnectionId, ActiveConnection>, receiver: ControllerReceiver, + // TODO: this will need to be either completely removed (from code) or periodically cleaned + // to avoid memory issues recently_closed: HashSet<ConnectionId>, + + // TODO: this can potentially be abused to ddos and kill provider. Not sure at this point + // how to handle it more gracefully + + // buffer for messages received before connection was established due to mixnet being able to + // un-order messages. Note we don't ever expect to have more than 1-2 messages per connection here + pending_messages: HashMap<ConnectionId, Vec<(Vec<u8>, bool)>>, } impl Controller { @@ -86,27 +95,28 @@ impl Controller { active_connections: HashMap::new(), receiver, recently_closed: HashSet::new(), + pending_messages: HashMap::new(), }, sender, ) } - fn insert_connection( - &mut self, - conn_id: ConnectionId, - connection_sender: ConnectionSender, - ordered_buffer: OrderedMessageBuffer, - ) { + fn insert_connection(&mut self, conn_id: ConnectionId, connection_sender: ConnectionSender) { let active_connection = ActiveConnection { is_closed: false, connection_sender: Some(connection_sender), - ordered_buffer, + ordered_buffer: OrderedMessageBuffer::new(), }; if let Some(_active_conn) = self.active_connections.insert(conn_id, active_connection) { - // we received 'Send' before 'connect' - drain what we currently accumulated into the fresh - // buffer as this new one is going to be used for the connection - // TODO: let's only do this if it's actually EVER fired - error!("Presumably received 'Send' before 'Connect'!") + error!("Received a duplicate 'Connect'!") + } else { + // check if there were any pending messages + if let Some(pending) = self.pending_messages.remove(&conn_id) { + debug!("There were some pending messages for {}", conn_id); + for (payload, is_closed) in pending { + self.send_to_connection(conn_id, payload, is_closed) + } + } } } @@ -129,7 +139,7 @@ impl Controller { active_connection.is_closed |= is_closed; if let Some(payload) = active_connection.read_from_buf() { - active_connection + if let Err(err) = active_connection .connection_sender .as_mut() .unwrap() @@ -137,14 +147,28 @@ impl Controller { payload, socket_closed: active_connection.is_closed, }) - .unwrap() + { + error!("WTF IS THIS: {:?}", err); + } + + // TODO: ABOVE UNWRAP CAUSED A CRASH IN A NORMAL USE!!!! + // TODO: + // TODO: surprisingly it only happened on socks client, never on nSP + // TODO: + // TODO: + // TODO: + // TODO: } } else { - error!("no connection exists with id: {:?}", conn_id); - warn!("'lost' bytes: {}", payload.len()); if !self.recently_closed.contains(&conn_id) { - // TODO: let's only do this if it's actually EVER fired - error!("Presumably received 'Send' before 'Connect'! - First") + warn!("Received a 'Send' before 'Connect' - going to buffer the data"); + let pending = self.pending_messages.entry(conn_id).or_insert(Vec::new()); + pending.push((payload, is_closed)); + } else { + error!( + "Tried to write to closed connection ({} bytes were 'lost)", + payload.len() + ) } } } @@ -155,8 +179,8 @@ impl Controller { ControllerCommand::Send(conn_id, data, is_closed) => { self.send_to_connection(conn_id, data, is_closed) } - ControllerCommand::Insert(conn_id, sender, ordered_buffer) => { - self.insert_connection(conn_id, sender, ordered_buffer) + ControllerCommand::Insert(conn_id, sender) => { + self.insert_connection(conn_id, sender) } ControllerCommand::Remove(conn_id) => self.remove_connection(conn_id), } diff --git a/common/socks5/proxy-helpers/src/lib.rs b/common/socks5/proxy-helpers/src/lib.rs index 2ab74886113..01413220473 100644 --- a/common/socks5/proxy-helpers/src/lib.rs +++ b/common/socks5/proxy-helpers/src/lib.rs @@ -15,4 +15,3 @@ pub mod available_reader; pub mod connection_controller; pub mod proxy_runner; -// pub mod read_delay_loop; diff --git a/common/socks5/proxy-helpers/src/proxy_runner.rs b/common/socks5/proxy-helpers/src/proxy_runner.rs index f4a583cb910..c951eaf2999 100644 --- a/common/socks5/proxy-helpers/src/proxy_runner.rs +++ b/common/socks5/proxy-helpers/src/proxy_runner.rs @@ -18,12 +18,10 @@ use futures::channel::mpsc; use log::*; use ordered_buffer::OrderedMessageSender; use socks5_requests::ConnectionId; -use std::sync::Arc; use tokio::net::tcp::{OwnedReadHalf, OwnedWriteHalf}; use tokio::net::TcpStream; use tokio::prelude::*; use tokio::stream::StreamExt; -use tokio::sync::Notify; #[derive(Debug)] pub struct ProxyMessage { @@ -51,10 +49,9 @@ pub struct ProxyRunner<S> { mix_sender: MixProxySender<S>, socket: Option<TcpStream>, + local_destination_address: String, + remote_source_address: String, connection_id: ConnectionId, - - // required for in-order delivery - message_sender: Option<OrderedMessageSender>, } impl<S> ProxyRunner<S> @@ -63,118 +60,107 @@ where { pub fn new( socket: TcpStream, + local_destination_address: String, // addresses are provided for better logging + remote_source_address: String, mix_receiver: ConnectionReceiver, mix_sender: MixProxySender<S>, connection_id: ConnectionId, - message_sender: OrderedMessageSender, ) -> Self { ProxyRunner { mix_receiver: Some(mix_receiver), mix_sender, socket: Some(socket), + local_destination_address, + remote_source_address, connection_id, - message_sender: Some(message_sender), } } async fn run_inbound<F>( mut reader: OwnedReadHalf, - notify_closed: Arc<Notify>, + local_destination_address: String, // addresses are provided for better logging + remote_source_address: String, connection_id: ConnectionId, mix_sender: MixProxySender<S>, adapter_fn: F, - mut message_sender: OrderedMessageSender, - ) -> (OwnedReadHalf, OrderedMessageSender) + ) -> OwnedReadHalf where F: Fn(ConnectionId, Vec<u8>, bool) -> S + Send + 'static, { let mut available_reader = AvailableReader::new(&mut reader); + let mut message_sender = OrderedMessageSender::new(); loop { - tokio::select! { - _ = notify_closed.notified() => { - // the remote socket is closed, so there's no point - // in reading anything more because we won't be able to write to remote anyway! - break - } - // try to read from local socket and push everything to mixnet to the remote - reading_result = &mut available_reader => { - let (read_data, is_finished) = match reading_result { - Ok(data) => data, - Err(err) => { - error!("failed to read request from the socket - {}", err); - break; - } - }; - - info!( - "Going to send {} bytes via mixnet to remote {}. Is local closed: {}", - read_data.len(), - connection_id, - is_finished - ); - - // if we're sending through the mixnet increase the sequence number... - let ordered_msg = message_sender.wrap_message(read_data.to_vec()).into_bytes(); - mix_sender.unbounded_send(adapter_fn(connection_id, ordered_msg, is_finished)).unwrap(); - - if is_finished { - // technically we already informed it when we sent the message to mixnet above - info!("The local socket is closed - won't receive any more data. Informing remote about that..."); - // no point in reading from mixnet if connection is closed! - notify_closed.notify(); + // try to read from local socket and push everything to mixnet to the remote + let (read_data, is_finished) = match available_reader.next().await { + Some(data) => match data { + Ok(data) => (data, false), + Err(err) => { + error!(target: &*format!("({}) socks5 inbound", connection_id),"failed to read request from the socket - {}", err); break; - } else { - // delay_for(Duration::from_millis(2)).await; } - } + }, + None => (Default::default(), true), + }; + + debug!( + target: &*format!("({}) socks5 inbound", connection_id), + "[{} bytes]\t{} → local → mixnet → remote → {}. Local closed: {}", + read_data.len(), + local_destination_address, + remote_source_address, + is_finished + ); + + // if we're sending through the mixnet increase the sequence number... + let ordered_msg = message_sender.wrap_message(read_data.to_vec()).into_bytes(); + mix_sender + .unbounded_send(adapter_fn(connection_id, ordered_msg, is_finished)) + .unwrap(); + + if is_finished { + // technically we already informed it when we sent the message to mixnet above + debug!(target: &*format!("({}) socks5 inbound", connection_id), "The local socket is closed - won't receive any more data. Informing remote about that..."); + break; } } - (reader, message_sender) + reader } async fn run_outbound( mut writer: OwnedWriteHalf, - notify_closed: Arc<Notify>, + local_destination_address: String, // addresses are provided for better logging + remote_source_address: String, mut mix_receiver: ConnectionReceiver, connection_id: ConnectionId, ) -> (OwnedWriteHalf, ConnectionReceiver) { loop { - tokio::select! { - _ = notify_closed.notified() => { - // no need to read from mixnet as we won't be able to send to socket - // anyway - break - } - mix_data = mix_receiver.next() => { - if mix_data.is_none() { - warn!("mix receiver is none so we already got removed somewhere. This isn't really a warning, but shouldn't happen to begin with, so please say if you see this message"); - // we already got closed - // not sure if we HAVE TO notify the other task, but might as well - notify_closed.notify(); - break - } - let connection_message = mix_data.unwrap(); - - info!( - "Going to write {} bytes received from mixnet to connection {}. Is remote closed: {}", - connection_message.payload.len(), - connection_id, - connection_message.socket_closed - ); - - if let Err(err) = writer.write_all(&connection_message.payload).await { - // the other half is probably going to blow up too (if not, this task also needs to notify the other one!!) - error!("failed to write response back to the socket - {}", err); - break; - } - if connection_message.socket_closed { - info!("Remote socket got closed - closing the local socket too"); - notify_closed.notify(); - break - } - } + let mix_data = mix_receiver.next().await; + if mix_data.is_none() { + warn!("mix receiver is none so we already got removed somewhere. This isn't really a warning, but shouldn't happen to begin with, so please say if you see this message"); + break; + } + let connection_message = mix_data.unwrap(); + + debug!( + target: &*format!("({}) socks5 outbound", connection_id), + "[{} bytes]\t{} → remote → mixnet → local → {} Remote closed: {}", + connection_message.payload.len(), + remote_source_address, + local_destination_address, + connection_message.socket_closed + ); + + if let Err(err) = writer.write_all(&connection_message.payload).await { + // the other half is probably going to blow up too (if not, this task also needs to notify the other one!!) + error!(target: &*format!("({}) socks5 outbound", connection_id), "failed to write response back to the socket - {}", err); + break; + } + if connection_message.socket_closed { + debug!(target: &*format!("({}) socks5 outbound", connection_id), + "Remote socket got closed - closing the local socket too"); + break; } } @@ -187,24 +173,22 @@ where where F: Fn(ConnectionId, Vec<u8>, bool) -> S + Send + 'static, { - let notify_closed = Arc::new(Notify::new()); - let notify_clone = Arc::clone(¬ify_closed); - let (read_half, write_half) = self.socket.take().unwrap().into_split(); // should run until either inbound closes or is notified from outbound let inbound_future = Self::run_inbound( read_half, - notify_closed, + self.local_destination_address.clone(), + self.remote_source_address.clone(), self.connection_id, self.mix_sender.clone(), adapter_fn, - self.message_sender.take().unwrap(), ); let outbound_future = Self::run_outbound( write_half, - notify_clone, + self.local_destination_address.clone(), + self.remote_source_address.clone(), self.mix_receiver.take().unwrap(), self.connection_id, ); @@ -222,12 +206,11 @@ where panic!("TODO: some future error?") } - let (read_half, message_sender) = inbound_result.unwrap(); + let read_half = inbound_result.unwrap(); let (write_half, mix_receiver) = outbound_result.unwrap(); self.socket = Some(write_half.reunite(read_half).unwrap()); self.mix_receiver = Some(mix_receiver); - self.message_sender = Some(message_sender); self } diff --git a/common/socks5/proxy-helpers/src/read_delay_loop.rs b/common/socks5/proxy-helpers/src/read_delay_loop.rs deleted file mode 100644 index 647cf2a2a83..00000000000 --- a/common/socks5/proxy-helpers/src/read_delay_loop.rs +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -// The only reason this exists is to remove duplicate code from -// nym\service-providers\simple-socks5\src\connection.rs::try_read_response_data -// and -// nym\clients\socks5\src\socks\request.rs::try_read_request_data - -// once those use sequence numbers, this code should be removed!! - -use crate::available_reader::AvailableReader; -use std::io; -use tokio::io::AsyncRead; -use tokio::time::Duration; - -// It returns data alognside information whether it timed out while reading from the socket -pub async fn try_read_data<R>( - timeout: Duration, - mut reader: R, - address: &str, -) -> io::Result<(Vec<u8>, bool)> -where - R: AsyncRead + Unpin, -{ - let mut data = Vec::new(); - let mut delay = tokio::time::delay_for(timeout); - - let mut available_reader = AvailableReader::new(&mut reader); - - loop { - tokio::select! { - _ = &mut delay => { - if data.len() > 0 { - println!("Timed out. returning {} bytes received from {}", data.len(), address); - } - return Ok((data, true)) // we return all response data on timeout - } - read_data = &mut available_reader => { - match read_data { - Err(err) => { - return Err(err); - } - Ok(bytes) => { - if bytes.len() == 0 { - println!("Connection is closed! Returning {} bytes received from {}", data.len(), address); - // we return all we managed to read because - // we know no more stuff is coming - return Ok((data, false)) - } - let now = tokio::time::Instant::now(); - let next = now + timeout; - delay.reset(next); - println!("Received {} bytes from {}. Waiting for more...", bytes.len(), address); - - // temporarily this is fine... (this loop will go away anyway) - data.extend_from_slice(&bytes) - } - } - } - } - } -} diff --git a/common/socks5/requests/src/request.rs b/common/socks5/requests/src/request.rs index c4fe1979cc5..d865d8c2a8f 100644 --- a/common/socks5/requests/src/request.rs +++ b/common/socks5/requests/src/request.rs @@ -1,5 +1,4 @@ use nymsphinx_addressing::clients::{Recipient, RecipientFormattingError}; -use ordered_buffer::OrderedMessage; use std::convert::TryFrom; use std::fmt::{self}; @@ -28,7 +27,7 @@ impl fmt::Display for RequestError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> fmt::Result { match self { RequestError::AddressLengthTooShort => { - write!(f, "not enough bytes to recover the lenght of the address") + write!(f, "not enough bytes to recover the length of the address") } RequestError::AddressTooShort => write!(f, "not enough bytes to recover the address"), RequestError::ConnectionIdTooShort => { @@ -48,10 +47,7 @@ impl std::error::Error for RequestError {} impl RequestError { pub fn is_malformed_return(&self) -> bool { - match self { - RequestError::MalformedReturnAddress(_) => true, - _ => false, - } + matches!(self, RequestError::MalformedReturnAddress(_)) } } @@ -77,7 +73,6 @@ pub enum Request { Connect { conn_id: ConnectionId, remote_addr: RemoteAddress, - message: OrderedMessage, return_address: Recipient, }, @@ -90,13 +85,11 @@ impl Request { pub fn new_connect( conn_id: ConnectionId, remote_addr: RemoteAddress, - message: OrderedMessage, return_address: Recipient, ) -> Request { Request::Connect { conn_id, remote_addr, - message, return_address, } } @@ -153,23 +146,19 @@ impl Request { // just a temporary reference to mid-slice for ease of use let recipient_data_bytes = &connect_request_bytes[address_end..]; - if recipient_data_bytes.len() < Recipient::LEN { + + if recipient_data_bytes.len() != Recipient::LEN { return Err(RequestError::ReturnAddressTooShort); } let mut return_bytes = [0u8; Recipient::LEN]; return_bytes.copy_from_slice(&recipient_data_bytes[..Recipient::LEN]); let return_address = Recipient::try_from_bytes(return_bytes) - .map_err(|err| RequestError::MalformedReturnAddress(err))?; - - let message = - OrderedMessage::try_from_bytes(recipient_data_bytes[Recipient::LEN..].to_vec()) - .unwrap(); + .map_err(RequestError::MalformedReturnAddress)?; Ok(Request::Connect { conn_id: connection_id, remote_addr: remote_address, - message, return_address, }) } @@ -187,11 +176,10 @@ impl Request { /// service provider which will make the request. pub fn into_bytes(self) -> Vec<u8> { match self { - // connect is: CONN_FLAG || CONN_ID || REMOTE_LEN || REMOTE || RETURN || DATA + // connect is: CONN_FLAG || CONN_ID || REMOTE_LEN || REMOTE || RETURN Request::Connect { conn_id, remote_addr, - message, return_address, } => { let remote_address_bytes = remote_addr.into_bytes(); @@ -202,7 +190,6 @@ impl Request { .chain(remote_address_bytes_len.to_be_bytes().iter().cloned()) .chain(remote_address_bytes.into_iter()) .chain(return_address.to_bytes().iter().cloned()) - .chain(message.into_bytes()) .collect() } Request::Send(conn_id, data, local_closed) => std::iter::once(RequestFlag::Send as u8) @@ -382,7 +369,6 @@ mod request_deserialization_tests { let request_bytes: Vec<_> = request_bytes .into_iter() .chain(recipient_bytes.iter().cloned()) - .chain(vec![0, 0, 0, 0, 0, 0, 0, 1]) // message index 1 .collect(); let request = Request::try_from_bytes(&request_bytes).unwrap(); @@ -390,7 +376,6 @@ mod request_deserialization_tests { Request::Connect { conn_id, remote_addr, - message, return_address, } => { assert_eq!("foo.com".to_string(), remote_addr); @@ -399,7 +384,6 @@ mod request_deserialization_tests { return_address.to_bytes().to_vec(), recipient.to_bytes().to_vec() ); - assert_eq!(Vec::<u8>::new(), message.data); } _ => unreachable!(), } @@ -436,8 +420,6 @@ mod request_deserialization_tests { let request_bytes: Vec<_> = request_bytes .into_iter() .chain(recipient_bytes.iter().cloned()) - .chain(vec![0, 0, 0, 0, 0, 0, 0, 1]) // ordered message sequence number 1 - .chain(vec![255, 255, 255].into_iter()) .collect(); let request = Request::try_from_bytes(&request_bytes).unwrap(); @@ -445,7 +427,6 @@ mod request_deserialization_tests { Request::Connect { conn_id, remote_addr, - message, return_address, } => { assert_eq!("foo.com".to_string(), remote_addr); @@ -454,8 +435,6 @@ mod request_deserialization_tests { return_address.to_bytes().to_vec(), recipient.to_bytes().to_vec() ); - assert_eq!(1, message.index); - assert_eq!(vec![255, 255, 255], message.data); } _ => unreachable!(), } diff --git a/common/topology/src/gateway.rs b/common/topology/src/gateway.rs index 31a86d768e3..39300ddef63 100644 --- a/common/topology/src/gateway.rs +++ b/common/topology/src/gateway.rs @@ -19,11 +19,6 @@ use nymsphinx_types::Node as SphinxNode; use std::convert::TryInto; use std::net::SocketAddr; -#[derive(Debug, Clone)] -pub struct Client { - pub pub_key: String, -} - #[derive(Debug, Clone)] pub struct Node { pub location: String, @@ -31,7 +26,8 @@ pub struct Node { pub mixnet_listener: SocketAddr, pub identity_key: identity::PublicKey, pub sphinx_key: encryption::PublicKey, // TODO: or nymsphinx::PublicKey? both are x25519 - pub last_seen: u64, + pub registration_time: i64, + pub reputation: i64, pub version: String, } diff --git a/common/topology/src/lib.rs b/common/topology/src/lib.rs index def926f96f1..386fef0fc07 100644 --- a/common/topology/src/lib.rs +++ b/common/topology/src/lib.rs @@ -18,7 +18,6 @@ use nymsphinx_types::Node as SphinxNode; use rand::Rng; use std::collections::HashMap; -pub mod coco; mod filter; pub mod gateway; pub mod mix; @@ -35,34 +34,35 @@ pub enum NymTopologyError { pub type MixLayer = u8; -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct NymTopology { - coco_nodes: Vec<coco::Node>, mixes: HashMap<MixLayer, Vec<mix::Node>>, gateways: Vec<gateway::Node>, } impl NymTopology { - pub fn new( - coco_nodes: Vec<coco::Node>, - mixes: HashMap<MixLayer, Vec<mix::Node>>, - gateways: Vec<gateway::Node>, - ) -> Self { - NymTopology { - coco_nodes, - mixes, - gateways, - } - } - - pub fn coco_nodes(&self) -> &Vec<coco::Node> { - &self.coco_nodes + pub fn new(mixes: HashMap<MixLayer, Vec<mix::Node>>, gateways: Vec<gateway::Node>) -> Self { + NymTopology { mixes, gateways } } pub fn mixes(&self) -> &HashMap<MixLayer, Vec<mix::Node>> { &self.mixes } + pub fn mixes_as_vec(&self) -> Vec<mix::Node> { + let mut mixes: Vec<mix::Node> = vec![]; + + for layer in self.mixes().values() { + mixes.extend(layer.to_owned()) + } + mixes + } + + pub fn mixes_in_layer(&self, layer: u8) -> Vec<mix::Node> { + assert!(vec![1, 2, 3].contains(&layer)); + self.mixes.get(&layer).unwrap().to_owned() + } + pub fn gateways(&self) -> &Vec<gateway::Node> { &self.gateways } @@ -134,6 +134,10 @@ impl NymTopology { .collect()) } + pub fn set_mixes_in_layer(&mut self, layer: u8, mixes: Vec<mix::Node>) { + self.mixes.insert(layer, mixes); + } + pub fn can_construct_path_through(&self, num_mix_hops: u8) -> bool { // if there are no gateways present, we can't do anything if self.gateways.is_empty() { @@ -160,19 +164,83 @@ impl NymTopology { } pub fn filter_system_version(&self, expected_version: &str) -> Self { - self.filter_node_versions(expected_version, expected_version, expected_version) + self.filter_node_versions(expected_version, expected_version) } pub fn filter_node_versions( &self, expected_mix_version: &str, expected_gateway_version: &str, - expected_coco_version: &str, ) -> Self { NymTopology { mixes: self.mixes.filter_by_version(expected_mix_version), gateways: self.gateways.filter_by_version(expected_gateway_version), - coco_nodes: self.coco_nodes.filter_by_version(expected_coco_version), + } + } +} + +#[cfg(test)] +mod converting_mixes_to_vec { + use super::*; + + #[cfg(test)] + mod when_nodes_exist { + use crypto::asymmetric::{encryption, identity}; + + use super::*; + + #[test] + fn returns_a_vec_with_hashmap_values() { + let node1 = mix::Node { + location: "London".to_string(), + host: "3.3.3.3:1789".parse().unwrap(), + identity_key: identity::PublicKey::from_base58_string( + "3ebjp1Fb9hdcS1AR6AZihgeJiMHkB5jjJUsvqNnfQwU7", + ) + .unwrap(), + sphinx_key: encryption::PublicKey::from_base58_string( + "C7cown6dYCLZpLiMFC1PaBmhvLvmJmLDJGeRTbPD45bX", + ) + .unwrap(), + layer: 1, + registration_time: 123, + reputation: 0, + version: "0.x.0".to_string(), + }; + + let node2 = mix::Node { + location: "Thunder Bay".to_string(), + ..node1.clone() + }; + + let node3 = mix::Node { + location: "Warsaw".to_string(), + ..node1.clone() + }; + + let mut mixes: HashMap<MixLayer, Vec<mix::Node>> = HashMap::new(); + mixes.insert(1, vec![node1, node2]); + mixes.insert(2, vec![node3]); + + let topology = NymTopology::new(mixes, vec![]); + let mixvec = topology.mixes_as_vec(); + assert!(mixvec + .iter() + .map(|node| node.location.clone()) + .collect::<Vec<String>>() + .contains(&"London".to_string())); + } + } + + #[cfg(test)] + mod when_no_nodes_exist { + use super::*; + + #[test] + fn returns_an_empty_vec() { + let topology = NymTopology::new(HashMap::new(), vec![]); + let mixvec = topology.mixes_as_vec(); + assert!(mixvec.is_empty()); } } } diff --git a/common/topology/src/mix.rs b/common/topology/src/mix.rs index b25d8e995fa..3ee90e4d538 100644 --- a/common/topology/src/mix.rs +++ b/common/topology/src/mix.rs @@ -13,7 +13,7 @@ // limitations under the License. use crate::filter; -use crypto::asymmetric::encryption; +use crypto::asymmetric::{encryption, identity}; use nymsphinx_addressing::nodes::NymNodeRoutingAddress; use nymsphinx_types::Node as SphinxNode; use std::convert::TryInto; @@ -23,9 +23,11 @@ use std::net::SocketAddr; pub struct Node { pub location: String, pub host: SocketAddr, - pub pub_key: encryption::PublicKey, // TODO: or nymsphinx::PublicKey? both are x25519 + pub identity_key: identity::PublicKey, + pub sphinx_key: encryption::PublicKey, // TODO: or nymsphinx::PublicKey? both are x25519 pub layer: u64, - pub last_seen: u64, + pub registration_time: i64, + pub reputation: i64, pub version: String, } @@ -39,6 +41,6 @@ impl<'a> Into<SphinxNode> for &'a Node { fn into(self) -> SphinxNode { let node_address_bytes = NymNodeRoutingAddress::from(self.host).try_into().unwrap(); - SphinxNode::new(node_address_bytes, (&self.pub_key).into()) + SphinxNode::new(node_address_bytes, (&self.sphinx_key).into()) } } diff --git a/common/version-checker/src/lib.rs b/common/version-checker/src/lib.rs index 3503c89a7b1..46aafc2c80b 100644 --- a/common/version-checker/src/lib.rs +++ b/common/version-checker/src/lib.rs @@ -12,7 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -use semver::Version; +use semver::SemVerError; +pub use semver::Version; /// Checks whether given `version` is compatible with a given semantic version requirement `req` /// according to major-minor semver rules. The semantic version requirement can be passed as a full, @@ -32,6 +33,10 @@ pub fn is_minor_version_compatible(version: &str, req: &str) -> bool { expected_version.major == req_version.major && expected_version.minor == req_version.minor } +pub fn parse_version(raw_version: &str) -> Result<Version, SemVerError> { + Version::parse(raw_version) +} + #[cfg(test)] mod tests { use super::*; diff --git a/common/wasm-utils/src/websocket/mod.rs b/common/wasm-utils/src/websocket/mod.rs index 7d11080903b..2450186fa7e 100644 --- a/common/wasm-utils/src/websocket/mod.rs +++ b/common/wasm-utils/src/websocket/mod.rs @@ -214,7 +214,7 @@ impl Drop for JSWebsocket { impl Stream for JSWebsocket { type Item = Result<WsMessage, WsError>; - fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> { + fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> { // if there's anything in the internal queue, keep returning that let ws_message = self.message_queue.borrow_mut().pop_front(); match ws_message { @@ -238,7 +238,7 @@ impl Stream for JSWebsocket { impl Sink<WsMessage> for JSWebsocket { type Error = WsError; - fn poll_ready(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> { + fn poll_ready(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> { match self.state() { State::Connecting => { // clone the waker to be able to notify the executor once we get connected @@ -280,7 +280,7 @@ impl Sink<WsMessage> for JSWebsocket { Poll::Ready(Ok(())) } - fn poll_close(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> { + fn poll_close(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> { match self.state() { State::Open | State::Connecting => { // TODO: do we need to wait for closing event here? diff --git a/explorer/Cargo.lock b/explorer/Cargo.lock new file mode 100644 index 00000000000..738e0c91270 --- /dev/null +++ b/explorer/Cargo.lock @@ -0,0 +1,2040 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "aead" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cf01b9b56e767bb57b94ebf91a58b338002963785cdd7013e21c0d4679471e4" +dependencies = [ + "generic-array 0.12.3", +] + +[[package]] +name = "aes" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54eb1d8fe354e5fc611daf4f2ea97dd45a765f4f1e4512306ec183ae2e8f20c9" +dependencies = [ + "aes-soft", + "aesni", + "block-cipher-trait", +] + +[[package]] +name = "aes-gcm" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "834a6bda386024dbb7c8fc51322856c10ffe69559f972261c868485f5759c638" +dependencies = [ + "aead", + "aes", + "block-cipher-trait", + "ghash", + "subtle 2.3.0", + "zeroize", +] + +[[package]] +name = "aes-soft" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfd7e7ae3f9a1fb5c03b389fc6bb9a51400d0c13053f0dca698c832bfd893a0d" +dependencies = [ + "block-cipher-trait", + "byteorder", + "opaque-debug 0.2.3", +] + +[[package]] +name = "aesni" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f70a6b5f971e473091ab7cfb5ffac6cde81666c4556751d8d5620ead8abf100" +dependencies = [ + "block-cipher-trait", + "opaque-debug 0.2.3", +] + +[[package]] +name = "ansi_term" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" +dependencies = [ + "winapi 0.3.9", +] + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi 0.3.9", +] + +[[package]] +name = "autocfg" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" + +[[package]] +name = "base64" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "489d6c0ed21b11d038c31b6ceccca973e65d73ba3bd8ecb9a2babf5546164643" +dependencies = [ + "byteorder", + "safemem", +] + +[[package]] +name = "base64" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" + +[[package]] +name = "bitflags" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" + +[[package]] +name = "block-buffer" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" +dependencies = [ + "block-padding", + "byte-tools", + "byteorder", + "generic-array 0.12.3", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array 0.14.4", +] + +[[package]] +name = "block-cipher-trait" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c924d49bd09e7c06003acda26cd9742e796e34282ec6c1189404dee0c1f4774" +dependencies = [ + "generic-array 0.12.3", +] + +[[package]] +name = "block-padding" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" +dependencies = [ + "byte-tools", +] + +[[package]] +name = "bumpalo" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e8c087f005730276d1096a652e92a8bacee2e2472bcc9715a74d2bec38b5820" + +[[package]] +name = "byte-tools" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" + +[[package]] +name = "byteorder" +version = "1.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" + +[[package]] +name = "bytes" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" + +[[package]] +name = "cc" +version = "1.0.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed67cbde08356238e75fc4656be4749481eeffb09e19f320a25237d5221c985d" + +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "clap" +version = "2.33.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002" +dependencies = [ + "ansi_term", + "atty", + "bitflags", + "strsim", + "textwrap", + "unicode-width", + "vec_map", +] + +[[package]] +name = "cookie" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5795cda0897252e34380a27baf884c53aa7ad9990329cdad96d4c5d027015d44" +dependencies = [ + "aes-gcm", + "base64 0.12.3", + "hkdf", + "hmac", + "percent-encoding 2.1.0", + "rand", + "sha2", + "time", +] + +[[package]] +name = "core-foundation" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a89e2ae426ea83155dccf10c0fa6b1463ef6d5fcb44cee0b224a408fa640a62" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea221b5284a47e40033bf9b66f35f984ec0ea2931eb03505246cd27a963f981b" + +[[package]] +name = "cpuid-bool" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8aebca1129a03dc6dc2b127edd729435bbc4a37e1d5f4d7513165089ceb02634" + +[[package]] +name = "crypto-mac" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5" +dependencies = [ + "generic-array 0.12.3", + "subtle 1.0.0", +] + +[[package]] +name = "devise" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74e04ba2d03c5fa0d954c061fc8c9c288badadffc272ebb87679a89846de3ed3" +dependencies = [ + "devise_codegen", + "devise_core", +] + +[[package]] +name = "devise_codegen" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "066ceb7928ca93a9bedc6d0e612a8a0424048b0ab1f75971b203d01420c055d7" +dependencies = [ + "devise_core", + "quote 0.6.13", +] + +[[package]] +name = "devise_core" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf41c59b22b5e3ec0ea55c7847e5f358d340f3a8d6d53a5cf4f1564967f96487" +dependencies = [ + "bitflags", + "proc-macro2 0.4.30", + "quote 0.6.13", + "syn 0.15.44", +] + +[[package]] +name = "digest" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" +dependencies = [ + "generic-array 0.12.3", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array 0.14.4", +] + +[[package]] +name = "dtoa" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "134951f4028bdadb9b84baf4232681efbf277da25144b9b0ad65df75946c422b" + +[[package]] +name = "encoding_rs" +version = "0.8.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "801bbab217d7f79c0062f4f7205b5d4427c6d1a7bd7aafdd1475f7c59d62b283" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "fake-simd" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" + +[[package]] +name = "filetime" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c122a393ea57648015bf06fbd3d372378992e86b9ff5a7a497b076a28c79efe" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "redox_syscall", + "winapi 0.3.9", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ece68d15c92e84fa4f19d3780f1294e5ca82a78a6d515f1efaabcc144688be00" +dependencies = [ + "matches", + "percent-encoding 2.1.0", +] + +[[package]] +name = "fsevent" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ab7d1bd1bd33cc98b0889831b72da23c0aa4df9cec7e0702f46ecea04b35db6" +dependencies = [ + "bitflags", + "fsevent-sys", +] + +[[package]] +name = "fsevent-sys" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f41b048a94555da0f42f1d632e2e19510084fb8e303b0daa2816e733fb3644a0" +dependencies = [ + "libc", +] + +[[package]] +name = "fuchsia-zircon" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" +dependencies = [ + "bitflags", + "fuchsia-zircon-sys", +] + +[[package]] +name = "fuchsia-zircon-sys" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" + +[[package]] +name = "futures-channel" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0448174b01148032eed37ac4aed28963aaaa8cfa93569a08e5b479bbc6c2c151" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18eaa56102984bed2c88ea39026cff3ce3b4c7f508ca970cedf2450ea10d4e46" + +[[package]] +name = "futures-macro" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e36fccf3fc58563b4a14d265027c627c3b665d7fed489427e88e7cc929559efe" +dependencies = [ + "proc-macro-hack", + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn 1.0.48", +] + +[[package]] +name = "futures-sink" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e3ca3f17d6e8804ae5d3df7a7d35b2b3a6fe89dac84b31872720fc3060a0b11" + +[[package]] +name = "futures-task" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d502af37186c4fef99453df03e374683f8a1eec9dcc1e66b3b82dc8278ce3c" +dependencies = [ + "once_cell", +] + +[[package]] +name = "futures-util" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abcb44342f62e6f3e8ac427b8aa815f724fd705dfad060b18ac7866c15bb8e34" +dependencies = [ + "futures-core", + "futures-macro", + "futures-sink", + "futures-task", + "pin-project 1.0.1", + "pin-utils", + "proc-macro-hack", + "proc-macro-nested", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" +dependencies = [ + "typenum", +] + +[[package]] +name = "generic-array" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" +dependencies = [ + "typenum", + "version_check 0.9.2", +] + +[[package]] +name = "getrandom" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc587bc0ec293155d5bfa6b9891ec18a1e330c234f896ea47fbada4cadbe47e6" +dependencies = [ + "cfg-if 0.1.10", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "ghash" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f0930ed19a7184089ea46d2fedead2f6dc2b674c5db4276b7da336c7cd83252" +dependencies = [ + "polyval", +] + +[[package]] +name = "glob" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" + +[[package]] +name = "h2" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e4728fd124914ad25e99e3d15a9361a879f6620f63cb56bbb08f95abb97a535" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", + "tracing-futures", +] + +[[package]] +name = "hashbrown" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" + +[[package]] +name = "hermit-abi" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aca5565f760fb5b220e499d72710ed156fdb74e631659e99377d9ebfbd13ae8" +dependencies = [ + "libc", +] + +[[package]] +name = "hkdf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fa08a006102488bd9cd5b8013aabe84955cf5ae22e304c2caf655b633aefae3" +dependencies = [ + "digest 0.8.1", + "hmac", +] + +[[package]] +name = "hmac" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dcb5e64cda4c23119ab41ba960d1e170a774c8e4b9d9e6a9bc18aabf5e59695" +dependencies = [ + "crypto-mac", + "digest 0.8.1", +] + +[[package]] +name = "http" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d569972648b2c512421b5f2a405ad6ac9666547189d0c5477a3f200f3e02f9" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13d5ff830006f7646652e057693569bfe0d51760c0085a071769d142a205111b" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "httparse" +version = "1.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9" + +[[package]] +name = "httpdate" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "494b4d60369511e7dea41cf646832512a94e542f68bb9c49e54518e0f468eb47" + +[[package]] +name = "hyper" +version = "0.10.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a0652d9a2609a968c14be1a9ea00bf4b1d64e2e1f53a1b51b6fff3a6e829273" +dependencies = [ + "base64 0.9.3", + "httparse", + "language-tags", + "log 0.3.9", + "mime 0.2.6", + "num_cpus", + "time", + "traitobject", + "typeable", + "unicase 1.4.2", + "url 1.7.2", +] + +[[package]] +name = "hyper" +version = "0.13.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ad767baac13b44d4529fcf58ba2cd0995e36e7b435bc5b039de6f47e880dbf" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project 1.0.1", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-tls" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d979acc56dcb5b8dddba3917601745e877576475aa046df3226eabdecef78eed" +dependencies = [ + "bytes", + "hyper 0.13.9", + "native-tls", + "tokio", + "tokio-tls", +] + +[[package]] +name = "idna" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "idna" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "indexmap" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55e2e4c765aa53a0424761bf9f41aa7a6ac1efa87238f59560640e27fca028f2" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "inotify" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4816c66d2c8ae673df83366c18341538f234a26d65a9ecea5c348b453ac1d02f" +dependencies = [ + "bitflags", + "inotify-sys", + "libc", +] + +[[package]] +name = "inotify-sys" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e74a1aa87c59aeff6ef2cc2fa62d41bc43f54952f55652656b18a02fd5e356c0" +dependencies = [ + "libc", +] + +[[package]] +name = "input_buffer" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19a8a95243d5a0398cae618ec29477c6e3cb631152be5c19481f80bc71559754" +dependencies = [ + "bytes", +] + +[[package]] +name = "iovec" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" +dependencies = [ + "libc", +] + +[[package]] +name = "ipnet" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47be2f14c678be2fdcab04ab1171db51b2762ce6f0a8ee87c8dd4a04ed216135" + +[[package]] +name = "itoa" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc6f3ad7b9d11a0c00842ff8de1b60ee58661048eb8049ed33c73594f359d7e6" + +[[package]] +name = "js-sys" +version = "0.3.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca059e81d9486668f12d455a4ea6daa600bd408134cd17e3d3fb5a32d1f016f8" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "kernel32-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +dependencies = [ + "winapi 0.2.8", + "winapi-build", +] + +[[package]] +name = "language-tags" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + +[[package]] +name = "libc" +version = "0.2.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58d1b70b004888f764dfbf6a26a3b0342a1632d33968e4a179d8011c760614" + +[[package]] +name = "log" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" +dependencies = [ + "log 0.4.11", +] + +[[package]] +name = "log" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b" +dependencies = [ + "cfg-if 0.1.10", +] + +[[package]] +name = "matches" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" + +[[package]] +name = "memchr" +version = "2.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" + +[[package]] +name = "mime" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0" +dependencies = [ + "log 0.3.9", +] + +[[package]] +name = "mime" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" + +[[package]] +name = "mime_guess" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2684d4c2e97d99848d30b324b00c8fcc7e5c897b7cbb5819b09e7c90e8baf212" +dependencies = [ + "mime 0.3.16", + "unicase 2.6.0", +] + +[[package]] +name = "mio" +version = "0.6.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fce347092656428bc8eaf6201042cb551b8d67855af7374542a92a0fbfcac430" +dependencies = [ + "cfg-if 0.1.10", + "fuchsia-zircon", + "fuchsia-zircon-sys", + "iovec", + "kernel32-sys", + "libc", + "log 0.4.11", + "miow 0.2.1", + "net2", + "slab", + "winapi 0.2.8", +] + +[[package]] +name = "mio-extras" +version = "2.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52403fe290012ce777c4626790c8951324a2b9e3316b3143779c72b029742f19" +dependencies = [ + "lazycell", + "log 0.4.11", + "mio", + "slab", +] + +[[package]] +name = "mio-named-pipes" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0840c1c50fd55e521b247f949c241c9997709f23bd7f023b9762cd561e935656" +dependencies = [ + "log 0.4.11", + "mio", + "miow 0.3.5", + "winapi 0.3.9", +] + +[[package]] +name = "mio-uds" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afcb699eb26d4332647cc848492bbc15eafb26f08d0304550d5aa1f612e066f0" +dependencies = [ + "iovec", + "libc", + "mio", +] + +[[package]] +name = "miow" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" +dependencies = [ + "kernel32-sys", + "net2", + "winapi 0.2.8", + "ws2_32-sys", +] + +[[package]] +name = "miow" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07b88fb9795d4d36d62a012dfbf49a8f5cf12751f36d31a9dbe66d528e58979e" +dependencies = [ + "socket2", + "winapi 0.3.9", +] + +[[package]] +name = "native-tls" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a1cda389c26d6b88f3d2dc38aa1b750fe87d298cc5d795ec9e975f402f00372" +dependencies = [ + "lazy_static", + "libc", + "log 0.4.11", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "net2" +version = "0.2.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ebc3ec692ed7c9a255596c67808dee269f64655d8baf7b4f0638e51ba1d6853" +dependencies = [ + "cfg-if 0.1.10", + "libc", + "winapi 0.3.9", +] + +[[package]] +name = "notify" +version = "4.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80ae4a7688d1fab81c5bf19c64fc8db920be8d519ce6336ed4e7efe024724dbd" +dependencies = [ + "bitflags", + "filetime", + "fsevent", + "fsevent-sys", + "inotify", + "libc", + "mio", + "mio-extras", + "walkdir", + "winapi 0.3.9", +] + +[[package]] +name = "num_cpus" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "nym-explorer" +version = "0.9.0" +dependencies = [ + "clap", + "futures-util", + "log 0.4.11", + "reqwest", + "rocket", + "rocket_contrib", + "tokio", + "tokio-native-tls", + "tokio-tungstenite", +] + +[[package]] +name = "once_cell" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "260e51e7efe62b592207e9e13a68e43692a7a279171d6ba57abd208bf23645ad" + +[[package]] +name = "opaque-debug" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "openssl" +version = "0.10.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d575eff3665419f9b83678ff2815858ad9d11567e082f5ac1814baba4e2bcb4" +dependencies = [ + "bitflags", + "cfg-if 0.1.10", + "foreign-types", + "lazy_static", + "libc", + "openssl-sys", +] + +[[package]] +name = "openssl-probe" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" + +[[package]] +name = "openssl-sys" +version = "0.9.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a842db4709b604f0fe5d1170ae3565899be2ad3d9cbc72dedc789ac0511f78de" +dependencies = [ + "autocfg", + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "pear" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5320f212db967792b67cfe12bd469d08afd6318a249bd917d5c19bc92200ab8a" +dependencies = [ + "pear_codegen", +] + +[[package]] +name = "pear_codegen" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfc1c836fdc3d1ef87c348b237b5b5c4dff922156fb2d968f57734f9669768ca" +dependencies = [ + "proc-macro2 0.4.30", + "quote 0.6.13", + "syn 0.15.44", + "version_check 0.9.2", + "yansi", +] + +[[package]] +name = "percent-encoding" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" + +[[package]] +name = "percent-encoding" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" + +[[package]] +name = "pin-project" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ffbc8e94b38ea3d2d8ba92aea2983b503cd75d0888d75b86bb37970b5698e15" +dependencies = [ + "pin-project-internal 0.4.27", +] + +[[package]] +name = "pin-project" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee41d838744f60d959d7074e3afb6b35c7456d0f61cad38a24e35e6553f73841" +dependencies = [ + "pin-project-internal 1.0.1", +] + +[[package]] +name = "pin-project-internal" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65ad2ae56b6abe3a1ee25f15ee605bacadb9a764edaba9c2bf4103800d4a1895" +dependencies = [ + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn 1.0.48", +] + +[[package]] +name = "pin-project-internal" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81a4ffa594b66bff340084d4081df649a7dc049ac8d7fc458d8e628bfbbb2f86" +dependencies = [ + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn 1.0.48", +] + +[[package]] +name = "pin-project-lite" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c917123afa01924fc84bb20c4c03f004d9c38e5127e3c039bbf7f4b9c76a2f6b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c" + +[[package]] +name = "polyval" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ec3341498978de3bfd12d1b22f1af1de22818f5473a11e8a6ef997989e3a212" +dependencies = [ + "cfg-if 0.1.10", + "universal-hash", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" + +[[package]] +name = "proc-macro-hack" +version = "0.5.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" + +[[package]] +name = "proc-macro-nested" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eba180dafb9038b050a4c280019bbedf9f2467b61e5d892dcad585bb57aadc5a" + +[[package]] +name = "proc-macro2" +version = "0.4.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" +dependencies = [ + "unicode-xid 0.1.0", +] + +[[package]] +name = "proc-macro2" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" +dependencies = [ + "unicode-xid 0.2.1", +] + +[[package]] +name = "quote" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" +dependencies = [ + "proc-macro2 0.4.30", +] + +[[package]] +name = "quote" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37" +dependencies = [ + "proc-macro2 1.0.24", +] + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom", + "libc", + "rand_chacha", + "rand_core", + "rand_hc", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core", +] + +[[package]] +name = "redox_syscall" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" + +[[package]] +name = "remove_dir_all" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +dependencies = [ + "winapi 0.3.9", +] + +[[package]] +name = "reqwest" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9eaa17ac5d7b838b7503d118fa16ad88f440498bf9ffe5424e621f93190d61e" +dependencies = [ + "base64 0.12.3", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "http", + "http-body", + "hyper 0.13.9", + "hyper-tls", + "ipnet", + "js-sys", + "lazy_static", + "log 0.4.11", + "mime 0.3.16", + "mime_guess", + "native-tls", + "percent-encoding 2.1.0", + "pin-project-lite", + "serde", + "serde_urlencoded", + "tokio", + "tokio-tls", + "url 2.2.0", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + +[[package]] +name = "rocket" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6130967b369cfb8411b0b73e96fcba1229c32a9cc6f295d144f879bfced13c6e" +dependencies = [ + "atty", + "base64 0.12.3", + "log 0.4.11", + "memchr", + "num_cpus", + "pear", + "rocket_codegen", + "rocket_http", + "state", + "time", + "toml", + "version_check 0.9.2", + "yansi", +] + +[[package]] +name = "rocket_codegen" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb852e6da168fb948a8f2b798ba2e2f0e4fc860eae0efa9cf2bf0f5466bb0425" +dependencies = [ + "devise", + "glob", + "indexmap", + "quote 0.6.13", + "rocket_http", + "version_check 0.9.2", + "yansi", +] + +[[package]] +name = "rocket_contrib" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3946ca815127041d8f64455561031d058c22ae1b135251502c5ea523cf9e14b" +dependencies = [ + "log 0.4.11", + "notify", + "rocket", + "serde", + "serde_json", +] + +[[package]] +name = "rocket_http" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aff5a5480175f2f553a876b251e9350c74196128806d176da3a51c82aab5428" +dependencies = [ + "cookie", + "hyper 0.10.16", + "indexmap", + "pear", + "percent-encoding 1.0.1", + "smallvec", + "state", + "time", + "unicode-xid 0.1.0", +] + +[[package]] +name = "ryu" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" + +[[package]] +name = "safemem" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" +dependencies = [ + "lazy_static", + "winapi 0.3.9", +] + +[[package]] +name = "security-framework" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1759c2e3c8580017a484a7ac56d3abc5a6c1feadf88db2f3633f12ae4268c69" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f99b9d5e26d2a71633cc4f2ebae7cc9f874044e0c351a27e17892d76dce5678b" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "serde" +version = "1.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b88fa983de7720629c9387e9f517353ed404164b1e482c970a90c1a4aaf7dc1a" + +[[package]] +name = "serde_json" +version = "1.0.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcac07dbffa1c65e7f816ab9eba78eb142c6d44410f4eeba1e26e4f5dfa56b95" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ec5d77e2d4c73717816afac02670d5c4f534ea95ed430442cad02e7a6e32c97" +dependencies = [ + "dtoa", + "itoa", + "serde", + "url 2.2.0", +] + +[[package]] +name = "sha-1" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce3cdf1b5e620a498ee6f2a171885ac7e22f0e12089ec4b3d22b84921792507c" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if 1.0.0", + "cpuid-bool", + "digest 0.9.0", + "opaque-debug 0.3.0", +] + +[[package]] +name = "sha2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69" +dependencies = [ + "block-buffer 0.7.3", + "digest 0.8.1", + "fake-simd", + "opaque-debug 0.2.3", +] + +[[package]] +name = "signal-hook-registry" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce32ea0c6c56d5eacaeb814fbed9960547021d3edd010ded1425f180536b20ab" +dependencies = [ + "libc", +] + +[[package]] +name = "slab" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" + +[[package]] +name = "smallvec" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbee7696b84bbf3d89a1c2eccff0850e3047ed46bfcd2e92c29a2d074d57e252" + +[[package]] +name = "socket2" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1fa70dc5c8104ec096f4fe7ede7a221d35ae13dcd19ba1ad9a81d2cab9a1c44" +dependencies = [ + "cfg-if 0.1.10", + "libc", + "redox_syscall", + "winapi 0.3.9", +] + +[[package]] +name = "state" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3015a7d0a5fd5105c91c3710d42f9ccf0abfb287d62206484dcc67f9569a6483" + +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + +[[package]] +name = "subtle" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" + +[[package]] +name = "subtle" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "343f3f510c2915908f155e94f17220b19ccfacf2a64a2a5d8004f2c3e311e7fd" + +[[package]] +name = "syn" +version = "0.15.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" +dependencies = [ + "proc-macro2 0.4.30", + "quote 0.6.13", + "unicode-xid 0.1.0", +] + +[[package]] +name = "syn" +version = "1.0.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc371affeffc477f42a221a1e4297aedcea33d47d19b61455588bd9d8f6b19ac" +dependencies = [ + "proc-macro2 1.0.24", + "quote 1.0.7", + "unicode-xid 0.2.1", +] + +[[package]] +name = "tempfile" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" +dependencies = [ + "cfg-if 0.1.10", + "libc", + "rand", + "redox_syscall", + "remove_dir_all", + "winapi 0.3.9", +] + +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "time" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" +dependencies = [ + "libc", + "wasi 0.10.0+wasi-snapshot-preview1", + "winapi 0.3.9", +] + +[[package]] +name = "tinyvec" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "238ce071d267c5710f9d31451efec16c5ee22de34df17cc05e56cbc92e967117" + +[[package]] +name = "tokio" +version = "0.2.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d34ca54d84bf2b5b4d7d31e901a8464f7b60ac145a284fba25ceb801f2ddccd" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "iovec", + "lazy_static", + "libc", + "memchr", + "mio", + "mio-named-pipes", + "mio-uds", + "num_cpus", + "pin-project-lite", + "signal-hook-registry", + "slab", + "tokio-macros", + "winapi 0.3.9", +] + +[[package]] +name = "tokio-macros" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0c3acc6aa564495a0f2e1d59fab677cd7f81a19994cfc7f3ad0e64301560389" +dependencies = [ + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn 1.0.48", +] + +[[package]] +name = "tokio-native-tls" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd608593a919a8e05a7d1fc6df885e40f6a88d3a70a3a7eff23ff27964eda069" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a70f4fcd7b3b24fb194f837560168208f669ca8cb70d0c4b862944452396343" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d9e878ad426ca286e4dcae09cbd4e1973a7f8987d97570e2469703dd7f5720c" +dependencies = [ + "futures-util", + "log 0.4.11", + "native-tls", + "pin-project 0.4.27", + "tokio", + "tokio-native-tls", + "tungstenite", +] + +[[package]] +name = "tokio-util" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be8242891f2b6cbef26a2d7e8605133c2c554cd35b3e4948ea892d6d68436499" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "log 0.4.11", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" +dependencies = [ + "serde", +] + +[[package]] +name = "tower-service" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e987b6bf443f4b5b3b6f38704195592cca41c5bb7aedd3c3693c7081f8289860" + +[[package]] +name = "tracing" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0987850db3733619253fe60e17cb59b82d37c7e6c0236bb81e4d6b87c879f27" +dependencies = [ + "cfg-if 0.1.10", + "log 0.4.11", + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f50de3927f93d202783f4513cda820ab47ef17f624b03c096e86ef00c67e6b5f" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "tracing-futures" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab7bb6f14721aa00656086e9335d363c5c8747bae02ebe32ea2c7dece5689b4c" +dependencies = [ + "pin-project 0.4.27", + "tracing", +] + +[[package]] +name = "traitobject" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" + +[[package]] +name = "try-lock" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" + +[[package]] +name = "tungstenite" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0308d80d86700c5878b9ef6321f020f29b1bb9d5ff3cab25e75e23f3a492a23" +dependencies = [ + "base64 0.12.3", + "byteorder", + "bytes", + "http", + "httparse", + "input_buffer", + "log 0.4.11", + "native-tls", + "rand", + "sha-1", + "url 2.2.0", + "utf-8", +] + +[[package]] +name = "typeable" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887" + +[[package]] +name = "typenum" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" + +[[package]] +name = "unicase" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" +dependencies = [ + "version_check 0.1.5", +] + +[[package]] +name = "unicase" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" +dependencies = [ + "version_check 0.9.2", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" +dependencies = [ + "matches", +] + +[[package]] +name = "unicode-normalization" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fb19cf769fa8c6a80a162df694621ebeb4dafb606470b2b2fce0be40a98a977" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-width" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" + +[[package]] +name = "unicode-xid" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" + +[[package]] +name = "unicode-xid" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" + +[[package]] +name = "universal-hash" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df0c900f2f9b4116803415878ff48b63da9edb268668e08cf9292d7503114a01" +dependencies = [ + "generic-array 0.12.3", + "subtle 2.3.0", +] + +[[package]] +name = "url" +version = "1.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" +dependencies = [ + "idna 0.1.5", + "matches", + "percent-encoding 1.0.1", +] + +[[package]] +name = "url" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5909f2b0817350449ed73e8bcd81c8c3c8d9a7a5d8acba4b27db277f1868976e" +dependencies = [ + "form_urlencoded", + "idna 0.2.0", + "matches", + "percent-encoding 2.1.0", +] + +[[package]] +name = "utf-8" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05e42f7c18b8f902290b009cde6d651262f956c98bc51bca4cd1d511c9cd85c7" + +[[package]] +name = "vcpkg" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6454029bf181f092ad1b853286f23e2c507d8e8194d01d92da4a55c274a5508c" + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + +[[package]] +name = "version_check" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" + +[[package]] +name = "version_check" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" + +[[package]] +name = "walkdir" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "777182bc735b6424e1a57516d35ed72cb8019d85c8c9bf536dccb3445c1a2f7d" +dependencies = [ + "same-file", + "winapi 0.3.9", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +dependencies = [ + "log 0.4.11", + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + +[[package]] +name = "wasm-bindgen" +version = "0.2.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ac64ead5ea5f05873d7c12b545865ca2b8d28adfc50a49b84770a3a97265d42" +dependencies = [ + "cfg-if 0.1.10", + "serde", + "serde_json", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f22b422e2a757c35a73774860af8e112bff612ce6cb604224e8e47641a9e4f68" +dependencies = [ + "bumpalo", + "lazy_static", + "log 0.4.11", + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn 1.0.48", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7866cab0aa01de1edf8b5d7936938a7e397ee50ce24119aef3e1eaa3b6171da" +dependencies = [ + "cfg-if 0.1.10", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b13312a745c08c469f0b292dd2fcd6411dba5f7160f593da6ef69b64e407038" +dependencies = [ + "quote 1.0.7", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f249f06ef7ee334cc3b8ff031bfc11ec99d00f34d86da7498396dc1e3b1498fe" +dependencies = [ + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn 1.0.48", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d649a3145108d7d3fbcde896a468d1bd636791823c9921135218ad89be08307" + +[[package]] +name = "web-sys" +version = "0.3.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bf6ef87ad7ae8008e15a355ce696bed26012b7caa21605188cfd8214ab51e2d" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-build" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi 0.3.9", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "winreg" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69" +dependencies = [ + "winapi 0.3.9", +] + +[[package]] +name = "ws2_32-sys" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" +dependencies = [ + "winapi 0.2.8", + "winapi-build", +] + +[[package]] +name = "yansi" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fc79f4a1e39857fc00c3f662cbf2651c771f00e9c15fe2abc341806bd46bd71" + +[[package]] +name = "zeroize" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f33972566adbd2d3588b0491eb94b98b43695c4ef897903470ede4f3f5a28a" diff --git a/explorer/Cargo.toml b/explorer/Cargo.toml new file mode 100644 index 00000000000..7622d6a9554 --- /dev/null +++ b/explorer/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "nym-explorer" +version = "0.9.0" +authors = ["dave <futurechimp@users.noreply.github.com>", "Jedrzej Stuczynski <andrew@nymtech.net>"] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +clap = "2.33" +# no point in importing entire futures crate +futures-util = "0.3" +log = "0.4" +reqwest = "0.10.8" +rocket = "0.4.5" +rocket_contrib = "0.4.5" +tokio = { version = "0.2", features = ["full"] } +tokio-native-tls = "0.1.0" +tokio-tungstenite = {version = "0.11", features = ["tls"] } + +# tungstenite = "0.11" diff --git a/explorer/README.md b/explorer/README.md new file mode 100644 index 00000000000..2d0dad80d6c --- /dev/null +++ b/explorer/README.md @@ -0,0 +1,15 @@ +The Nym Explorer +================ + +Displays nodes and metrics for the Nym network. Will eventually include a UI for viewing mixnodes, mixing rates, entropy levels, and a block explorer. + + +Development +----------- + +The code uses [Rocket](https://rocket.rs), which requires Rust nightly for the moment. + +You can override `rustup` on a per-directory basis from the `explorer` directory by doing `rustup override set nightly`. + +Then just `cargo run` like normal, no `+nightly` stuff needed. + diff --git a/explorer/public/assets/css/custom.css b/explorer/public/assets/css/custom.css new file mode 100644 index 00000000000..cf82967ca2c --- /dev/null +++ b/explorer/public/assets/css/custom.css @@ -0,0 +1,62 @@ +th { + cursor: pointer; +} + +:root { + --status-indicator-size: 10px; + --status-indicator-animation-duration: 2s; + + --status-indicator-color: rgb(216, 226, 233); + --status-indicator-color-semi: rgba(216, 226, 233, .5); + --status-indicator-color-transparent: rgba(216, 226, 233, 0); + + --status-indicator-color-active: rgb(0, 149, 255); + --status-indicator-color-active-semi: rgba(0, 149, 255, .5); + --status-indicator-color-active-transparent: rgba(0, 149, 255, 0); + + --status-indicator-color-positive: rgb(75, 210, 143); + --status-indicator-color-positive-semi: rgba(75, 210, 143, .5); + --status-indicator-color-positive-transparent: rgba(75, 210, 143, 0); + + --status-indicator-color-intermediary: rgb(255, 170, 0); + --status-indicator-color-intermediary-semi: rgba(255, 170, 0, .5); + --status-indicator-color-intermediary-transparent: rgba(255, 170, 0, 0); + + --status-indicator-color-negative: rgb(255, 77, 77); + --status-indicator-color-negative-semi: rgba(255, 77, 77, .5); + --status-indicator-color-negative-transparent: rgba(255, 77, 77, 0); + } + + status-indicator { + display: inline-block; + border-radius: 50%; + cursor: pointer; + width: var(--status-indicator-size); + height: var(--status-indicator-size); + background-color: var(--status-indicator-color); + } + + status-indicator[active] { + background-color: var(--status-indicator-color-active); + } + + status-indicator[positive] { + background-color: var(--status-indicator-color-positive); + animation-name: status-indicator-pulse-positive; + } + + status-indicator[intermediary] { + background-color: var(--status-indicator-color-intermediary); + } + + status-indicator[negative] { + background-color: var(--status-indicator-color-negative); + animation-name: status-indicator-pulse-negative; + } + + .metadata { + color: #51cbce; + font-weight: bold; + margin-bottom: 10px; + } + diff --git a/explorer/public/assets/js/main.js b/explorer/public/assets/js/main.js new file mode 100644 index 00000000000..e0dde17a054 --- /dev/null +++ b/explorer/public/assets/js/main.js @@ -0,0 +1,288 @@ +function websocketUrl() { + if ($(location).attr("href").startsWith("http://localhost")) { + return "ws://localhost:1648"; + } else if ($(location).attr("href").startsWith("http://qa-explorer")) { + return "ws://qa-explorer.nymtech.net:1648"; + } else { + return "wss://testnet-explorer.nymtech.net"; + } +} + +function getTopology() { + console.log("Getting topology..."); + var topologyUrl = "/downloads/topology.json"; + $.ajax({ + type: 'GET', + url: topologyUrl, + success: function (data) { + createMixnodeCount(data.mixNodes.length); + createValidatorCount(data.validators.validators.length); + createBlockHeight(data.validators.block_height); + createDisplayTable(data); + updateNodesStatus(); + } + }); +} + +function createDisplayTable(data) { + createMixnodeRows(data.mixNodes); + createValidatorRows(data.validators.validators); + createGatewayRows(data.gateways); +} + +function clearStatus(element) { + element.removeAttribute("active") + element.removeAttribute("positive") + element.removeAttribute("intermediary") + element.removeAttribute("negative") +} + +function setNodeStatus(dotWrapper, reportData) { + let statusIndicator = dotWrapper.children[0]; + clearStatus(statusIndicator) + + if (reportData == undefined || reportData == null) { + dotWrapper.setAttribute("title", "no data available") + return + } + + + if (reportData.mostRecentIPV4 && reportData.mostRecentIPV6 && reportData.lastHourIPV4 > 50 && reportData.lastHourIPV6 > 50) { + statusIndicator.setAttribute("positive", "") + } else if (reportData.mostRecentIPV4 || reportData.mostRecentIPV6) { + statusIndicator.setAttribute("intermediary", "") + } else { + statusIndicator.setAttribute("negative", "") + } + + let newTooltip = `\n + IPv4 routable: ${reportData.mostRecentIPV4}\n + Last hour IPv4: ${reportData.lastHourIPV4}%\n + IPv6 routable: ${reportData.mostRecentIPV6}\n + Last hour IPv6: ${reportData.lastHourIPV6}%\n + ` + dotWrapper.setAttribute("title", newTooltip) +} + +function dealWithStatusReport(report) { + let reportMap = new Map(); + report.forEach(reportData => { + reportMap.set(reportData.pubKey, reportData) + }) + + let allWrappers = document.getElementsByClassName('statusDot'); + for (let statusWrapper of allWrappers) { + let mapEntry = reportMap.get(statusWrapper.getAttribute('pubkey')) + setNodeStatus(statusWrapper, mapEntry) + } +} + +function updateNodesStatus() { + console.log("updating node statuses!") + + const reportUrl = "/downloads/mixmining.json"; + fetch(reportUrl, { + method: 'GET' + }) + .then((response) => response.json()) + .then((data) => dealWithStatusReport(data.report)).catch((err) => { + console.log("getting full mixmining report failed - ", err) + }) +} + +function makeStatusDot(nodePubKey) { + let statusText = "pending..." + + let dotWrapper = document.createElement("div"); + dotWrapper.setAttribute('id', `dotWrapper${nodePubKey}`) + dotWrapper.setAttribute('pubkey', nodePubKey) + dotWrapper.setAttribute('style', 'text-align: center') + dotWrapper.setAttribute('data-toggle', 'tooltip') + dotWrapper.setAttribute('data-placement', 'right') + dotWrapper.setAttribute('title', statusText) + dotWrapper.classList.add('statusDot') + + let dot = document.createElement("status-indicator"); + dotWrapper.appendChild(dot); + + return dotWrapper; +} + +function setGatewayStatusDot(nodePubKey) { + let statusText = "Data not available..." + let dotWrapper = document.getElementById(`dotWrapper${nodePubKey}`); + dotWrapper.classList.remove('statusDot') + let statusIndicator = dotWrapper.children[0]; + clearStatus(statusIndicator); + statusIndicator.setAttribute("active", "") + + dotWrapper.setAttribute("title", statusText) +} + +function createMixnodeCount(mixNodeCount) { + // no need to sanitize numbers (count is obtained via .lengnth attribute of an array) + $('#mixnodes-count').text(mixNodeCount); +} + +function createValidatorCount(validatorCount) { + // no need to sanitize numbers (count is obtained via .lengnth attribute of an array) + $('#validators-count').text(validatorCount); +} + +function createBlockHeight(blockHeight) { + let purifiedHeight = DOMPurify.sanitize(blockHeight) + if (purifiedHeight.length === 0) { + purifiedHeight = 0 + } + + $('#block-height').text(purifiedHeight); +} + +function compareNodes(node1, node2) { + if (node1.reputation < node2.reputation) { + return 1 + } else if (node1.reputation > node2.reputation) { + return -1 + } else { + if (node1.version < node2.version) { + return 1 + } else if (node1.version > node2.version) { + return -1 + } else { + if (node1.layer < node2.layer) { + return 1 + } else { + return -1 + } + } + } +} + +function createMixnodeRows(mixNodes) { + mixNodes.sort(compareNodes) + + const currentUnixTime = new Date().getTime() * 1000000; + + mixNodes.forEach(node => { + // because javascript works in mysterious ways, if you sanitize "0", it will return "" + let purifiedRep = DOMPurify.sanitize(node.reputation) + if (purifiedRep.length === 0) { + purifiedRep = 0 + } + var $tr = $('<tr>').append( + $('<input type="hidden" id="prev-timestamp-' + node.identityKey + '" value="' + currentUnixTime + '"> '), + $('<td>').html(makeStatusDot(node.identityKey)), + $('<td>').text(purifiedRep), + $('<td>').text(DOMPurify.sanitize(node.version)), + $('<td>').text(DOMPurify.sanitize(node.identityKey)), + $('<td>').text(DOMPurify.sanitize(node.sphinxKey)), + $('<td>').text(DOMPurify.sanitize(node.location)), + $('<td>').text(DOMPurify.sanitize(node.mixHost)), + $('<td>').text(DOMPurify.sanitize(node.layer)), + $('<td id="' + "received-" + DOMPurify.sanitize(node.identityKey) + '">').text("0"), + $('<td id="' + "sent-" + DOMPurify.sanitize(node.identityKey) + '">').text("0") + ).appendTo('#mixnodes-list'); + }) +} + +function createGatewayRows(gatewayNodes) { + gatewayNodes.forEach(node => { + // because javascript works in mysterious ways, if you sanitize "0", it will return "" + let purifiedRep = DOMPurify.sanitize(node.reputation) + if (purifiedRep.length === 0) { + purifiedRep = 0 + } + var $tr = $('<tr>').append( + $('<input type="hidden" id="prev-timestamp-' + node.pubKey + '" value="' + node.timestamp + '"> '), + $('<td>').html(makeStatusDot(node.identityKey)), + $('<td>').text(purifiedRep), + $('<td>').text(DOMPurify.sanitize(node.version)), + $('<td>').text(DOMPurify.sanitize(node.identityKey)), + $('<td>').text(DOMPurify.sanitize(node.sphinxKey)), + $('<td>').text(DOMPurify.sanitize(node.location)), + $('<td>').text(DOMPurify.sanitize(node.mixHost)), + $('<td>').text(DOMPurify.sanitize(node.clientsHost)), + ).appendTo('#gatewaynodes-list'); + + setGatewayStatusDot(node.identityKey); + }) +} + +function createValidatorRows(validators) { + validators.forEach(validator => { + var $tr = $('<tr>').append( + $('<td>').text(DOMPurify.sanitize(validator.address)), + $('<td>').text(DOMPurify.sanitize(validator.pub_key)), + $('<td>').text(DOMPurify.sanitize(validator.proposer_priority)), + $('<td>').text(DOMPurify.sanitize(validator.voting_power)) + ).appendTo('#validator-list'); + }) +} + +function connectWebSocket() { + var conn; + var url; + url = websocketUrl() + "/ws"; + console.log("connecting to: " + url); + conn = new WebSocket(url); + conn.onmessage = function (evt) { + processMessage(evt); + }; +} + +function processMessage(evt) { + var messages = evt.data.split('\n'); + for (var i = 0; i < messages.length; i++) { + var msg = jQuery.parseJSON(messages[i]); + prevTimestamp = updateTimeStampStorage(msg); + + timeDiff = (msg.timestamp - prevTimeStamp) / 1000000000; + displayReceivedPackets(msg, timeDiff); + displaySentPackets(msg, timeDiff); + } +} + +function displaySentPackets(msg, timeDiff) { + var sentCell = "#sent-" + DOMPurify.sanitize(msg.pubKey); + var sent = 0; + for (var key in msg.sent) { + s = msg.sent[key]; + sent += s; + } + sentPerSecond = Math.floor(sent / timeDiff); + let sentVal = DOMPurify.sanitize(sentPerSecond).length > 0 ? DOMPurify.sanitize(sentPerSecond) : "0"; + $(sentCell).html(sentVal); +} + +function displayReceivedPackets(msg, timeDiff) { + receivedPerSecond = Math.floor(msg.received / timeDiff); + var recCell = "#received-" + DOMPurify.sanitize(msg.pubKey); + let recVal = DOMPurify.sanitize(receivedPerSecond).length > 0 ? DOMPurify.sanitize(receivedPerSecond) : "0"; + $(recCell).html(recVal); +} + +/* + Hahahaha this has to be the crappiest code I've written since learning to code. + + On the upside, it'll save a few weeks messing with React or Angular to do + basically the same thing. +*/ +function updateTimeStampStorage(msg) { + // get the timestamp stored during the last loop + prevTimeStamp = ($("#prev-timestamp-" + msg.pubKey).val()) + + // store the current timestamp + $('#prev-timestamp-' + msg.pubKey).val(msg.timestamp); + + // return the previous timestamp + return prevTimeStamp; +} + + +document.addEventListener("DOMContentLoaded", function () { + // update every minute + setInterval(updateNodesStatus, 60000); + getTopology(); + connectWebSocket(); +}); + diff --git a/explorer/public/assets/js/purify.js b/explorer/public/assets/js/purify.js new file mode 100644 index 00000000000..cdce3a0bcf4 --- /dev/null +++ b/explorer/public/assets/js/purify.js @@ -0,0 +1,2 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.DOMPurify=t()}(this,function(){"use strict";function e(e,t){y&&y(e,null);for(var n=t.length;n--;){var r=t[n];if("string"==typeof r){var o=r.toLowerCase();o!==r&&(Object.isFrozen(t)||(t[n]=o),r=o)}e[r]=!0}return e}function t(e){var t={},n=void 0;for(n in e)g(h,e,[n])&&(t[n]=e[n]);return t}function n(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}function r(){var o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:O(),u=function(e){return r(e)};if(u.version="2.0.3",u.removed=[],!o||!o.document||9!==o.document.nodeType)return u.isSupported=!1,u;var h=o.document,y=!1,g=!1,v=!1,R=o.document,D=o.DocumentFragment,C=o.HTMLTemplateElement,H=o.Node,F=o.NodeFilter,z=o.NamedNodeMap,I=void 0===z?o.NamedNodeMap||o.MozNamedAttrMap:z,U=o.Text,j=o.Comment,P=o.DOMParser,W=o.TrustedTypes;if("function"==typeof C){var B=R.createElement("template");B.content&&B.content.ownerDocument&&(R=B.content.ownerDocument)}var q=N(W,h),G=q?q.createHTML(""):"",V=R,Y=V.implementation,K=V.createNodeIterator,X=V.getElementsByTagName,$=V.createDocumentFragment,J=h.importNode,Q={};u.isSupported=Y&&void 0!==Y.createHTMLDocument&&9!==R.documentMode;var Z=T,ee=b,te=A,ne=x,re=S,oe=M,ie=L,ae=null,le=e({},[].concat(n(i),n(a),n(l),n(c),n(s))),ce=null,se=e({},[].concat(n(d),n(f),n(p),n(m))),ue=null,de=null,fe=!0,pe=!0,me=!1,he=!1,ye=!1,ge=!1,ve=!1,Te=!1,be=!1,Ae=!1,xe=!1,Le=!1,Se=!0,Me=!0,Ee=!1,we={},ke=e({},["audio","colgroup","head","math","script","style","template","thead","svg","video"]),_e=e({},["audio","video","img","source","image"]),Oe=null,Ne=e({},["alt","class","for","id","label","name","pattern","placeholder","summary","title","value","style","xmlns"]),Re=null,De=R.createElement("form"),Ce=function(r){Re&&Re===r||(r&&"object"===(void 0===r?"undefined":E(r))||(r={}),ae="ALLOWED_TAGS"in r?e({},r.ALLOWED_TAGS):le,ce="ALLOWED_ATTR"in r?e({},r.ALLOWED_ATTR):se,Oe="ADD_URI_SAFE_ATTR"in r?e(t(Ne),r.ADD_URI_SAFE_ATTR):Ne,ue="FORBID_TAGS"in r?e({},r.FORBID_TAGS):{},de="FORBID_ATTR"in r?e({},r.FORBID_ATTR):{},we="USE_PROFILES"in r&&r.USE_PROFILES,fe=!1!==r.ALLOW_ARIA_ATTR,pe=!1!==r.ALLOW_DATA_ATTR,me=r.ALLOW_UNKNOWN_PROTOCOLS||!1,he=r.SAFE_FOR_JQUERY||!1,ye=r.SAFE_FOR_TEMPLATES||!1,ge=r.WHOLE_DOCUMENT||!1,be=r.RETURN_DOM||!1,Ae=r.RETURN_DOM_FRAGMENT||!1,xe=r.RETURN_DOM_IMPORT||!1,Le=r.RETURN_TRUSTED_TYPE||!1,Te=r.FORCE_BODY||!1,Se=!1!==r.SANITIZE_DOM,Me=!1!==r.KEEP_CONTENT,Ee=r.IN_PLACE||!1,ie=r.ALLOWED_URI_REGEXP||ie,ye&&(pe=!1),Ae&&(be=!0),we&&(ae=e({},[].concat(n(s))),ce=[],!0===we.html&&(e(ae,i),e(ce,d)),!0===we.svg&&(e(ae,a),e(ce,f),e(ce,m)),!0===we.svgFilters&&(e(ae,l),e(ce,f),e(ce,m)),!0===we.mathMl&&(e(ae,c),e(ce,p),e(ce,m))),r.ADD_TAGS&&(ae===le&&(ae=t(ae)),e(ae,r.ADD_TAGS)),r.ADD_ATTR&&(ce===se&&(ce=t(ce)),e(ce,r.ADD_ATTR)),r.ADD_URI_SAFE_ATTR&&e(Oe,r.ADD_URI_SAFE_ATTR),Me&&(ae["#text"]=!0),ge&&e(ae,["html","head","body"]),ae.table&&(e(ae,["tbody"]),delete ue.tbody),_&&_(r),Re=r)},He=function(e){u.removed.push({element:e});try{e.parentNode.removeChild(e)}catch(t){e.outerHTML=G}},Fe=function(e,t){try{u.removed.push({attribute:t.getAttributeNode(e),from:t})}catch(e){u.removed.push({attribute:null,from:t})}t.removeAttribute(e)},ze=function(t){var n=void 0,r=void 0;if(Te)t="<remove></remove>"+t;else{var o=t.match(/^[\s]+/);(r=o&&o[0])&&(t=t.slice(r.length))}if(y)try{n=(new P).parseFromString(t,"text/html")}catch(e){}if(v&&e(ue,["title"]),!n||!n.documentElement){var i=(n=Y.createHTMLDocument("")).body;i.parentNode.removeChild(i.parentNode.firstElementChild),i.outerHTML=q?q.createHTML(t):t}return r&&n.body.insertBefore(R.createTextNode(r),n.body.childNodes[0]||null),X.call(n,ge?"html":"body")[0]};u.isSupported&&(function(){try{ze('<svg><p><textarea><img src="</textarea><img src=x abc=1//">').querySelector("svg img")&&(y=!0)}catch(e){}}(),function(){try{ze("<x/><title></title><img>").querySelector("title").innerHTML.match(/<\/title/)&&(v=!0)}catch(e){}}(),function(){try{ze("<svg></p></svg>").querySelector("svg p")&&(g=!0)}catch(e){}}());var Ie=function(e){return K.call(e.ownerDocument||e,e,F.SHOW_ELEMENT|F.SHOW_COMMENT|F.SHOW_TEXT,function(){return F.FILTER_ACCEPT},!1)},Ue=function(e){return!(e instanceof U||e instanceof j)&&!("string"==typeof e.nodeName&&"string"==typeof e.textContent&&"function"==typeof e.removeChild&&e.attributes instanceof I&&"function"==typeof e.removeAttribute&&"function"==typeof e.setAttribute)},je=function(e){return"object"===(void 0===H?"undefined":E(H))?e instanceof H:e&&"object"===(void 0===e?"undefined":E(e))&&"number"==typeof e.nodeType&&"string"==typeof e.nodeName},Pe=function(e,t,n){Q[e]&&Q[e].forEach(function(e){e.call(u,t,n,Re)})},We=function(e){var t=void 0;if(Pe("beforeSanitizeElements",e,null),Ue(e))return He(e),!0;var n=e.nodeName.toLowerCase();if(Pe("uponSanitizeElement",e,{tagName:n,allowedTags:ae}),!ae[n]||ue[n]){if(Me&&!ke[n]&&"function"==typeof e.insertAdjacentHTML)try{var r=e.innerHTML;e.insertAdjacentHTML("AfterEnd",q?q.createHTML(r):r)}catch(e){}return He(e),!0}return"noscript"===n&&e.innerHTML.match(/<\/noscript/i)?(He(e),!0):"noembed"===n&&e.innerHTML.match(/<\/noembed/i)?(He(e),!0):e.namespaceURI&&e.namespaceURI.match(/svg|math/i)&&e.textContent&&e.textContent.match(new RegExp("</"+n,"i"))?(He(e),!0):"svg"!==n&&"math"!==n||!(e.innerHTML&&e.innerHTML.match(/<template/i)||void 0===e.innerHTML&&g)?(!he||e.firstElementChild||e.content&&e.content.firstElementChild||!/</g.test(e.textContent)||(u.removed.push({element:e.cloneNode()}),e.innerHTML?e.innerHTML=e.innerHTML.replace(/</g,"<"):e.innerHTML=e.textContent.replace(/</g,"<")),ye&&3===e.nodeType&&(t=(t=(t=e.textContent).replace(Z," ")).replace(ee," "),e.textContent!==t&&(u.removed.push({element:e.cloneNode()}),e.textContent=t)),Pe("afterSanitizeElements",e,null),!1):(He(e),!0)},Be=function(e,t,n){if(Se&&("id"===t||"name"===t)&&(n in R||n in De))return!1;if(pe&&te.test(t));else if(fe&&ne.test(t));else{if(!ce[t]||de[t])return!1;if(Oe[t]);else if(ie.test(n.replace(oe,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==n.indexOf("data:")||!_e[e]){if(me&&!re.test(n.replace(oe,"")));else if(n)return!1}else;}return!0},qe=function(e){var t=void 0,n=void 0,r=void 0,o=void 0,i=void 0;Pe("beforeSanitizeAttributes",e,null);var a=e.attributes;if(a){var l={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:ce};for(i=a.length;i--;){var c=t=a[i],s=c.name,d=c.namespaceURI;if(n=t.value.trim(),r=s.toLowerCase(),l.attrName=r,l.attrValue=n,l.keepAttr=!0,Pe("uponSanitizeAttribute",e,l),n=l.attrValue,g&&n.match(/<\//)&&He(e),"name"===r&&"IMG"===e.nodeName&&a.id)o=a.id,a=w(k,a,[]),Fe("id",e),Fe(s,e),a.indexOf(o)>i&&e.setAttribute("id",o.value);else{if("INPUT"===e.nodeName&&"type"===r&&"file"===n&&l.keepAttr&&(ce[r]||!de[r]))continue;"id"===s&&e.setAttribute(s,""),Fe(s,e)}if(l.keepAttr){ye&&(n=(n=n.replace(Z," ")).replace(ee," "));var f=e.nodeName.toLowerCase();if(Be(f,r,n))try{d?e.setAttributeNS(d,s,n):e.setAttribute(s,n),u.removed.pop()}catch(e){}}}Pe("afterSanitizeAttributes",e,null)}},Ge=function e(t){var n=void 0,r=Ie(t);for(Pe("beforeSanitizeShadowDOM",t,null);n=r.nextNode();)Pe("uponSanitizeShadowNode",n,null),We(n)||(n.content instanceof D&&e(n.content),qe(n));Pe("afterSanitizeShadowDOM",t,null)};return u.sanitize=function(e,t){var n=void 0,r=void 0,i=void 0,a=void 0,l=void 0;if(e||(e="\x3c!--\x3e"),"string"!=typeof e&&!je(e)){if("function"!=typeof e.toString)throw new TypeError("toString is not a function");if("string"!=typeof(e=e.toString()))throw new TypeError("dirty is not a string, aborting")}if(!u.isSupported){if("object"===E(o.toStaticHTML)||"function"==typeof o.toStaticHTML){if("string"==typeof e)return o.toStaticHTML(e);if(je(e))return o.toStaticHTML(e.outerHTML)}return e}if(ve||Ce(t),u.removed=[],Ee);else if(e instanceof H)1===(r=(n=ze("\x3c!--\x3e")).ownerDocument.importNode(e,!0)).nodeType&&"BODY"===r.nodeName?n=r:"HTML"===r.nodeName?n=r:n.appendChild(r);else{if(!be&&!ye&&!ge&&Le&&-1===e.indexOf("<"))return q?q.createHTML(e):e;if(!(n=ze(e)))return be?null:G}n&&Te&&He(n.firstChild);for(var c=Ie(Ee?e:n);i=c.nextNode();)3===i.nodeType&&i===a||We(i)||(i.content instanceof D&&Ge(i.content),qe(i),a=i);if(a=null,Ee)return e;if(be){if(Ae)for(l=$.call(n.ownerDocument);n.firstChild;)l.appendChild(n.firstChild);else l=n;return xe&&(l=J.call(h,l,!0)),l}var s=ge?n.outerHTML:n.innerHTML;return ye&&(s=(s=s.replace(Z," ")).replace(ee," ")),q&&Le?q.createHTML(s):s},u.setConfig=function(e){Ce(e),ve=!0},u.clearConfig=function(){Re=null,ve=!1},u.isValidAttribute=function(e,t,n){Re||Ce({});var r=e.toLowerCase(),o=t.toLowerCase();return Be(r,o,n)},u.addHook=function(e,t){"function"==typeof t&&(Q[e]=Q[e]||[],Q[e].push(t))},u.removeHook=function(e){Q[e]&&Q[e].pop()},u.removeHooks=function(e){Q[e]&&(Q[e]=[])},u.removeAllHooks=function(){Q={}},u}var o=Object.freeze||function(e){return e},i=o(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","pre","progress","q","rp","rt","ruby","s","samp","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),a=o(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","audio","canvas","circle","clippath","defs","desc","ellipse","filter","font","g","glyph","glyphref","hkern","image","line","lineargradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","video","view","vkern"]),l=o(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),c=o(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover"]),s=o(["#text"]),u=Object.freeze||function(e){return e},d=u(["accept","action","align","alt","autocomplete","background","bgcolor","border","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","coords","crossorigin","datetime","default","dir","disabled","download","enctype","face","for","headers","height","hidden","high","href","hreflang","id","integrity","ismap","label","lang","list","loop","low","max","maxlength","media","method","min","minlength","multiple","name","noshade","novalidate","nowrap","open","optimum","pattern","placeholder","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","span","srclang","start","src","srcset","step","style","summary","tabindex","title","type","usemap","valign","value","width","xmlns"]),f=u(["accent-height","accumulate","additive","alignment-baseline","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","specularconstant","specularexponent","spreadmethod","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","tabindex","targetx","targety","transform","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),p=u(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),m=u(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),h=Object.hasOwnProperty,y=Object.setPrototypeOf,g=("undefined"!=typeof Reflect&&Reflect).apply;g||(g=function(e,t,n){return e.apply(t,n)});var v=Object.seal||function(e){return e},T=v(/\{\{[\s\S]*|[\s\S]*\}\}/gm),b=v(/<%[\s\S]*|[\s\S]*%>/gm),A=v(/^data-[\-\w.\u00B7-\uFFFF]/),x=v(/^aria-[\-\w]+$/),L=v(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),S=v(/^(?:\w+script|data):/i),M=v(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205f\u3000]/g),E="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},w=("undefined"!=typeof Reflect&&Reflect).apply,k=Array.prototype.slice,_=Object.freeze,O=function(){return"undefined"==typeof window?null:window};w||(w=function(e,t,n){return e.apply(t,n)});var N=function(e,t){if("object"!==(void 0===e?"undefined":E(e))||"function"!=typeof e.createPolicy)return null;var n=null;t.currentScript&&t.currentScript.hasAttribute("data-tt-policy-suffix")&&(n=t.currentScript.getAttribute("data-tt-policy-suffix"));var r="dompurify"+(n?"#"+n:"");try{return e.createPolicy(r,{createHTML:function(e){return e}})}catch(e){return console.warn("TrustedTypes policy "+r+" could not be created."),null}};return r()}); +//# sourceMappingURL=purify.min.js.map diff --git a/explorer/public/assets/js/tablesorter.js b/explorer/public/assets/js/tablesorter.js new file mode 100644 index 00000000000..80b5b4f41c8 --- /dev/null +++ b/explorer/public/assets/js/tablesorter.js @@ -0,0 +1,14 @@ +$('th').click(function(){ + var table = $(this).parents('table').eq(0) + var rows = table.find('tr:gt(0)').toArray().sort(comparer($(this).index())) + this.asc = !this.asc + if (!this.asc){rows = rows.reverse()} + for (var i = 0; i < rows.length; i++){table.append(rows[i])} +}) +function comparer(index) { + return function(a, b) { + var valA = getCellValue(a, index), valB = getCellValue(b, index) + return $.isNumeric(valA) && $.isNumeric(valB) ? valA - valB : valA.toString().localeCompare(valB) + } +} +function getCellValue(row, index){ return $(row).children('td').eq(index).text() } diff --git a/validator/migrations/.gitkeep b/explorer/public/downloads/.gitkeep similarity index 100% rename from validator/migrations/.gitkeep rename to explorer/public/downloads/.gitkeep diff --git a/explorer/public/index.html b/explorer/public/index.html new file mode 100644 index 00000000000..bf4e410bdfe --- /dev/null +++ b/explorer/public/index.html @@ -0,0 +1,342 @@ +<!-- +========================================================= + Paper Dashboard 2 - v2.0.0 +========================================================= + + Product Page: https://www.creative-tim.com/product/paper-dashboard-2 + Copyright 2019 Creative Tim (https://www.creative-tim.com) + Licensed under MIT (https://github.com/creativetimofficial/paper-dashboard/blob/master/LICENSE) + + Coded by Creative Tim + +========================================================= + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. --> + +<!DOCTYPE html> +<html lang="en"> + +<head> + <meta charset="utf-8" /> + <link rel="apple-touch-icon" sizes="76x76" href="paper-dashboard/assets/img/apple-icon.png"> + <link rel="icon" type="image/png" href="paper-dashboard/assets/img/favicon.png"> + <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> + <title> + Nym Network Status + </title> + <meta content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0, shrink-to-fit=no' + name='viewport' /> + <!-- Fonts and icons --> + <link href="https://fonts.googleapis.com/css?family=Montserrat:400,700,200" rel="stylesheet" /> + <link href="https://maxcdn.bootstrapcdn.com/font-awesome/latest/css/font-awesome.min.css" rel="stylesheet"> + <!-- CSS Files --> + <link href="paper-dashboard/assets/css/bootstrap.min.css" rel="stylesheet" /> + <link href="paper-dashboard/assets/css/paper-dashboard.css?v=2.0.0" rel="stylesheet" /> + <link href="assets/css/custom.css" rel="stylesheet" /> +</head> + +<body class=""> + <div class="wrapper "> + <div class="sidebar" data-color="white" data-active-color="danger"> + <!-- + Tip 1: You can change the color of the sidebar using: data-color="blue | green | orange | red | yellow" + --> + <div class="logo"> + <!-- <a href="http://www.creative-tim.com" class="simple-text logo-mini"> + <div class="logo-image-small"> + <img alt="logo" src="paper-dashboard/assets/img/logo-small.png"> + </div> + </a> --> + <a href="https://nymtech.net" class="simple-text logo-normal"> + NYM + <!-- <div class="logo-image-big"> + <img src="paper-dashboard/assets/img/logo-big.png"> + </div> --> + </a> + </div> + <div class="sidebar-wrapper"> + <ul class="nav"> + <li> + <a href="/"> + <i class="nc-icon nc-bank"></i> + <p>Dashboard</p> + </a> + </li> + </ul> + </div> + </div> + <div class="main-panel"> + <!-- Navbar --> + <div id="msg"></div> + <div id="log"></div> + <nav class="navbar navbar-expand-lg navbar-absolute fixed-top navbar-transparent"> + <div class="container-fluid"> + <div class="navbar-wrapper"> + <div class="navbar-toggle"> + <button type="button" class="navbar-toggler"> + <span class="navbar-toggler-bar bar1"></span> + <span class="navbar-toggler-bar bar2"></span> + <span class="navbar-toggler-bar bar3"></span> + </button> + </div> + <a class="navbar-brand" href="">Nym Network Status</a> + </div> + <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navigation" + aria-expanded="false" aria-label="Toggle navigation"> + <span class="navbar-toggler-bar navbar-kebab"></span> + <span class="navbar-toggler-bar navbar-kebab"></span> + <span class="navbar-toggler-bar navbar-kebab"></span> + </button> + <div class="collapse navbar-collapse justify-content-end" id="navigation"> + <!-- <form> + <div class="input-group no-border"> + <input type="text" value="" class="form-control" placeholder="Search..."> + <div class="input-group-append"> + <div class="input-group-text"> + <i class="nc-icon nc-zoom-split"></i> + </div> + </div> + </div> + </form> --> + <ul class="navbar-nav"> + <!-- <li class="nav-item"> + <a class="nav-link btn-magnify" href=""> + <i class="nc-icon nc-layout-11"></i> + <p> + <span class="d-lg-none d-md-block">Stats</span> + </p> + </a> + </li> + <li class="nav-item btn-rotate dropdown"> + <a class="nav-link dropdown-toggle" href="http://example.com" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> + <i class="nc-icon nc-bell-55"></i> + <p> + <span class="d-lg-none d-md-block">Some Actions</span> + </p> + </a> + <div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdownMenuLink"> + <a class="dropdown-item" href="#">Action</a> + <a class="dropdown-item" href="#">Another action</a> + <a class="dropdown-item" href="#">Something else here</a> + </div> + </li> --> + <!-- <li class="nav-item"> + <a class="nav-link btn-rotate" href=""> + <i class="nc-icon nc-settings-gear-65"></i> + <p> + <span class="d-lg-none d-md-block">Account</span> + </p> + </a> + </li> --> + </ul> + </div> + </div> + </nav> + <!-- End Navbar --> + <!-- <div class="panel-header panel-header-sm"> + + + </div> --> + <div class="content"> + <div class="row"> + <div class="col-md-12"> + <div class="card"> + <div class="card-header"> + <h4 class="card-title">Mix Node Count</h4> + </div> + <div class="card-body"> + <h2 id="mixnodes-count" class="metadata"></h2> + </div> + </div> + </div> + <div class="col-md-12"> + <div class="card"> + <div class="card-header"> + <h4 class="card-title">Validators Count</h4> + </div> + <div class="card-body"> + <h2 id="validators-count" class="metadata"></h2> + </div> + </div> + </div> + <div class="col-md-12"> + <div class="card"> + <div class="card-header"> + <h4 class="card-title">Current block height</h4> + </div> + <div class="card-body"> + <h2 id="block-height" class="metadata"></h2> + </div> + </div> + </div> + + <div class="col-md-12"> + <div class="card"> + <div class="card-header"> + <h4 class="card-title"> Mix Nodes</h4> + </div> + <div class="card-body"> + <div class="table-responsive"> + <table class="table" id="mixnodes-list"> + <thead class=" text-primary"> + <tr> + <th width=50px> + Status + </th> + <th width=100px> + Reputation + </th> + <th> + Version + </th> + <th> + Identity key + </th> + <th> + Sphinx key + </th> + <th> + Location + </th> + <th> + Host + </th> + <th> + Layer + </th> + <th> + Received + </th> + <th> + Sent + </th> + </tr> + </thead> + <tbody> + </tbody> + </table> + </div> + </div> + </div> + </div> + + <div class="col-md-12"> + <div class="card"> + <div class="card-header"> + <h4 class="card-title"> Gateways</h4> + </div> + <div class="card-body"> + <div class="table-responsive"> + <table class="table" id="gatewaynodes-list"> + <thead class=" text-primary"> + <tr> + <th width=50px> + Status + </th> + <th width=100px> + Reputation + </th> + <th> + Version + </th> + <th> + Identity key + </th> + <th> + Sphinx key + </th> + <th> + Location + </th> + <th> + Mix Host + </th> + <th> + Clients Host + </th> + </tr> + </thead> + <tbody> + </tbody> + </table> + </div> + </div> + </div> + </div> + + <div class="col-md-12"> + <div class="card"> + <div class="card-header"> + <h4 class="card-title"> Validators</h4> + </div> + <div class="card-body"> + <div class="table-responsive"> + <table class="table" id="validator-list"> + <thead class=" text-primary"> + <tr> + <th> + Address + </th> + <th> + Public Key + </th> + <th> + Proposer Priority + </th> + <th> + Voting Power + </th> + </tr> + </thead> + <tbody> + </tbody> + </table> + </div> + </div> + </div> + </div> + </div> + </div> + <footer class="footer footer-black footer-white "> + <div class="container-fluid"> + <div class="row"> + <nav class="footer-nav"> + <ul> + <li> + <a href="https://nymtech.net" target="_blank">Nym</a> + </li> + <li> + <a href="https://github.com/nymtech/nym-web-dashboard/license" target="_blank">Licenses</a> + </li> + </ul> + </nav> + <div class="credits ml-auto"> + <span class="copyright"> + © + <script> + document.write(new Date().getFullYear()) + </script>, made with <i class="fa fa-heart heart"></i> by Nym + </span> + </div> + </div> + </div> + </footer> + </div> + </div> + <!-- Core JS Files --> + <script src="paper-dashboard/assets/js/core/jquery.min.js"></script> + <script src="paper-dashboard/assets/js/core/popper.min.js"></script> + <script src="paper-dashboard/assets/js/core/bootstrap.min.js"></script> + <script src="paper-dashboard/assets/js/plugins/perfect-scrollbar.jquery.min.js"></script> + <!-- Chart JS --> + <script src="paper-dashboard/assets/js/plugins/chartjs.min.js"></script> + <!-- Notifications Plugin --> + <script src="paper-dashboard/assets/js/plugins/bootstrap-notify.js"></script> + <!-- Control Center for Now Ui Dashboard: parallax effects, scripts for the example pages etc --> + <script src="paper-dashboard/assets/js/paper-dashboard.min.js?v=2.0.0" type="text/javascript"></script> + <script src="assets/js/purify.js"></script> + <script src="assets/js/main.js"></script> + <script src="assets/js/tablesorter.js"></script> +</body> + +</html> \ No newline at end of file diff --git a/explorer/public/paper-dashboard/CHANGELOG.md b/explorer/public/paper-dashboard/CHANGELOG.md new file mode 100644 index 00000000000..6a1d69cc7df --- /dev/null +++ b/explorer/public/paper-dashboard/CHANGELOG.md @@ -0,0 +1,21 @@ +# Change Log + +## [2.0.0] 22.05.2018 +### Bootstrap 4.1.1 integration & Bug Fixing +- Small changes for components +- ChartJS plugin integration +- Gulp task integration to open the project in browser +- Added License for Nucleo Icons +- Small changes on design of Cards + +## [1.0.2] 08.03.2017 + - added documentation files + +## [1.0.1] 30.09.2016 +### Bugfixing, Improvements +- New Page [current version] +- added Upgrade to PRO page for those who want to upsell inside the dashboard +- switched to MIT license + +## [1.0.0] 29.03.2016 +### Original Release diff --git a/explorer/public/paper-dashboard/LICENSE b/explorer/public/paper-dashboard/LICENSE new file mode 100644 index 00000000000..038a2d415c4 --- /dev/null +++ b/explorer/public/paper-dashboard/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Creative Tim + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/explorer/public/paper-dashboard/README.md b/explorer/public/paper-dashboard/README.md new file mode 100644 index 00000000000..f21914b8262 --- /dev/null +++ b/explorer/public/paper-dashboard/README.md @@ -0,0 +1,105 @@ +# [Paper Dashboard 2](https://demos.creative-tim.com/paper-dashboard/examples/dashboard.html) [![version][version-badge]][CHANGELOG] [![license][license-badge]][LICENSE] + + + +If you are a developer or a website owner that needs to work within a dashboard and want to have a pretty sight while doing so, **[Paper Dashboard 2](https://demos.creative-tim.com/paper-dashboard/examples/dashboard.html)** is for you. Paper Dashboard is a Bootstrap Admin Panel which combines soft colours with beautiful typography and spacious cards and graphics. It is a powerful tool, but it is light and easy to use. It has enough features to allow you to get the job done, but it is not crowded to the point where you can't find the files for a specific plugin. + +We like consistency and design that blends into its purpose. Paper Dashboard is a perfect example of our most thoughtful work. It combines over a dozen components and plugins, while looking like everything fits together. For an easy start or inspiration for you project, we have also create a set of example pages, like the user settings or usage graphics. + +Paper Dashboard is built using the same design language as **[Paper Kit(https://www.creative-tim.com/product/paper-kit-2)**. You can easily use them together, or pick between them depending on the project you have. + +**Bootstrap 4 Support** +Paper Dashboard 2 is built on top of the much awaited Bootstrap 4. This makes starting a new project very simple. It also provides benefits if you are already working on a Bootstrap 4 project; you can just import the Paper Dashboard style over it. Most of the elements have been redesigned; but if you are using an element we have not touched, it will fall back to the Bootstrap default. + +**Example Pages** +We wanted to fully display the power of this dashboard, so the kit comes packed with examples showing you how to use the components. Inside the product you will find: + +## Links: + ++ [Live Preview](https://demos.creative-tim.com/paper-dashboard/examples/dashboard.html) ++ [Paper Dashboard 2 PRO](https://www.creative-tim.com/product/paper-dashboard-2-pro) (from $39) + +**Tutorial** +In order for you to easily be able to use the Paper Dashboard 2, we have created a tutorial page in our documentation. It shows the structure for the files inside the archive and how to import them. It then features every components with a description and example how to use it. You can see the details [here](https://creativetimofficial.github.io/paper-dashboard-2/docs/1.0/getting-started/introduction.html). + + +### What's included + +Within the download you'll find the following directories and files: + +``` +Paper Dashboard 2 +. +├── CHANGELOG.md +├── README.md +├── assets +│ ├── css/ +│ ├── demo/ +│ ├── fonts/ +│ ├── img/ +│ ├── js +│ │ ├── core/ +│ │ ├── paper-dashboard.js +│ │ ├── paper-dashboard.js.map +│ │ ├── paper-dashboard.min.js +│ │ └── plugins +│ │ ├── bootstrap-notify.js +│ │ ├── chartjs.min.js +│ │ └── perfect-scrollbar.jquery.min.js +│ └── scss/ +│ ├── paper-dashboard/ +│ │ ├── cards/ +│ │ ├── mixins/ +│ │ └── plugins/ +│ └── paper-dashboard.scss +├── docs/ +│ └── documentation.html +├── examples/ +│ ├── dashboard.html +│ ├── icons.html +│ ├── map.html +│ ├── notifications.html +│ ├── tables.html +│ ├── typography.html +│ ├── upgrade.html +│ └── user.html +├── gulpfile.js +├── nucleo-icons.html +└── package.json +``` + +## Getting started +- Download the project’s zip +- Make sure you have node.js (https://nodejs.org/en/) installed +- Type `npm install` in terminal/console in the source folder where `package.json` is located +- You will find all the branding colors inside `assets/scss/core/variables/_brand.scss`. You can change them with a HEX value or with other predefined variables from `assets/scss/core/variables/_colors.scss` +- Run in terminal `gulp compile-scss` for a single compilation or gulp watch for continous compilation of the changes that you make in `*.scss` files. This command should be run in the same folder where `gulpfile.js` and `package.json` are located +- Run in terminal `gulp open-app` for opening the Presentation Page (default) of the product. You can set in `gulpfile.js` from your downloaded archive any page you want to open in browser, `at line 30: gulp.src('./examples/dashboard.html')` + + +## Useful Links + +More products from Creative Tim: <http://www.creative-tim.com/bootstrap-themes> + +Tutorials: <https://www.youtube.com/channel/UCVyTG4sCw-rOvB9oHkzZD1w> + +Freebies: <http://www.creative-tim.com/products> + +Affiliate Program (earn money): <http://www.creative-tim.com/affiliates/new> + +Social Media: + +Twitter: <https://twitter.com/CreativeTim> + +Facebook: <https://www.facebook.com/CreativeTim> + +Dribbble: <https://dribbble.com/creativetim> + +Google+: <https://plus.google.com/+CreativetimPage> + +Instagram: <https://instagram.com/creativetimofficial> + +[CHANGELOG]: ./CHANGELOG.md +[LICENSE]: ./LICENSE +[version-badge]: https://img.shields.io/badge/version-1.0.1-blue.svg +[license-badge]: https://img.shields.io/badge/license-MIT-blue.svg diff --git a/explorer/public/paper-dashboard/assets/css/bootstrap.min.css b/explorer/public/paper-dashboard/assets/css/bootstrap.min.css new file mode 100644 index 00000000000..7649fed412f --- /dev/null +++ b/explorer/public/paper-dashboard/assets/css/bootstrap.min.css @@ -0,0 +1,7 @@ +/*! + * Bootstrap v4.1.1 (https://getbootstrap.com/) + * Copyright 2011-2018 The Bootstrap Authors + * Copyright 2011-2018 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}@-ms-viewport{width:device-width}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.2;color:inherit}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014 \00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table .table{background-color:#fff}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#212529;border-color:#32383e}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#212529}.table-dark td,.table-dark th,.table-dark thead th{border-color:#32383e}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:not([size]):not([multiple]){height:calc(2.25rem + 2px)}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm,.input-group-lg>.form-control-plaintext.form-control,.input-group-lg>.input-group-append>.form-control-plaintext.btn,.input-group-lg>.input-group-append>.form-control-plaintext.input-group-text,.input-group-lg>.input-group-prepend>.form-control-plaintext.btn,.input-group-lg>.input-group-prepend>.form-control-plaintext.input-group-text,.input-group-sm>.form-control-plaintext.form-control,.input-group-sm>.input-group-append>.form-control-plaintext.btn,.input-group-sm>.input-group-append>.form-control-plaintext.input-group-text,.input-group-sm>.input-group-prepend>.form-control-plaintext.btn,.input-group-sm>.input-group-prepend>.form-control-plaintext.input-group-text{padding-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-sm>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-sm>select.form-control:not([size]):not([multiple]),select.form-control-sm:not([size]):not([multiple]){height:calc(1.8125rem + 2px)}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-lg>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-lg>select.form-control:not([size]):not([multiple]),select.form-control-lg:not([size]):not([multiple]){height:calc(2.875rem + 2px)}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(40,167,69,.8);border-radius:.2rem}.custom-select.is-valid,.form-control.is-valid,.was-validated .custom-select:valid,.was-validated .form-control:valid{border-color:#28a745}.custom-select.is-valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{background-color:#71dd8a}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(40,167,69,.25)}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label::before,.was-validated .custom-file-input:valid~.custom-file-label::before{border-color:inherit}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(220,53,69,.8);border-radius:.2rem}.custom-select.is-invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.was-validated .form-control:invalid{border-color:#dc3545}.custom-select.is-invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{background-color:#efa2a9}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(220,53,69,.25)}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label::before,.was-validated .custom-file-input:invalid~.custom-file-label::before{border-color:inherit}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:focus,.btn:hover{text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}.btn:not(:disabled):not(.disabled).active,.btn:not(:disabled):not(.disabled):active{background-image:none}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-primary{color:#007bff;background-color:transparent;background-image:none;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;background-color:transparent;background-image:none;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;background-color:transparent;background-image:none;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;background-color:transparent;background-image:none;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;background-color:transparent;background-image:none;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;background-color:transparent;background-image:none;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;background-color:transparent;background-image:none;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;background-color:transparent;background-image:none;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;background-color:transparent}.btn-link:hover{color:#0056b3;text-decoration:underline;background-color:transparent;border-color:transparent}.btn-link.focus,.btn-link:focus{text-decoration:underline;border-color:transparent;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media screen and (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media screen and (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-right{right:0;left:auto}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;width:0;height:0;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:0 1 auto;flex:0 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file:focus,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control{margin-left:-1px}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:active~.custom-control-label::before{color:#fff;background-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#dee2e6}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-size:8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:inset 0 1px 2px rgba(0,0,0,.075),0 0 5px rgba(128,189,255,.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.8125rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-select-lg{height:calc(2.875rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:125%}.custom-file{position:relative;display:inline-block;width:100%;height:calc(2.25rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(2.25rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:focus~.custom-file-label::after{border-color:#80bdff}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(2.25rem + 2px);padding:.375rem .75rem;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:2.25rem;padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:1px solid #ced4da;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;padding-left:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;-webkit-appearance:none;appearance:none}.custom-range::-webkit-slider-thumb:focus{outline:0;box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;-moz-appearance:none;appearance:none}.custom-range::-moz-range-thumb:focus{outline:0;box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;appearance:none}.custom-range::-ms-thumb:focus{outline:0;box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler:not(:disabled):not(.disabled){cursor:pointer}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-ms-flexbox;display:flex;-ms-flex:1 0 0%;flex:1 0 0%;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:first-child .card-header,.card-group>.card:first-child .card-img-top{border-top-right-radius:0}.card-group>.card:first-child .card-footer,.card-group>.card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:last-child .card-header,.card-group>.card:last-child .card-img-top{border-top-left-radius:0}.card-group>.card:last-child .card-footer,.card-group>.card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group>.card:only-child{border-radius:.25rem}.card-group>.card:only-child .card-header,.card-group>.card:only-child .card-img-top{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-group>.card:only-child .card-footer,.card-group>.card:only-child .card-img-bottom{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-group>.card:not(:first-child):not(:last-child):not(:only-child){border-radius:0}.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion .card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion .card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion .card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion .card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}.badge-primary[href]:focus,.badge-primary[href]:hover{color:#fff;text-decoration:none;background-color:#0062cc}.badge-secondary{color:#fff;background-color:#6c757d}.badge-secondary[href]:focus,.badge-secondary[href]:hover{color:#fff;text-decoration:none;background-color:#545b62}.badge-success{color:#fff;background-color:#28a745}.badge-success[href]:focus,.badge-success[href]:hover{color:#fff;text-decoration:none;background-color:#1e7e34}.badge-info{color:#fff;background-color:#17a2b8}.badge-info[href]:focus,.badge-info[href]:hover{color:#fff;text-decoration:none;background-color:#117a8b}.badge-warning{color:#212529;background-color:#ffc107}.badge-warning[href]:focus,.badge-warning[href]:hover{color:#212529;text-decoration:none;background-color:#d39e00}.badge-danger{color:#fff;background-color:#dc3545}.badge-danger[href]:focus,.badge-danger[href]:hover{color:#fff;text-decoration:none;background-color:#bd2130}.badge-light{color:#212529;background-color:#f8f9fa}.badge-light[href]:focus,.badge-light[href]:hover{color:#212529;text-decoration:none;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#343a40}.badge-dark[href]:focus,.badge-dark[href]:hover{color:#fff;text-decoration:none;background-color:#1d2124}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media screen and (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{z-index:1;text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:focus,.close:hover{color:#000;text-decoration:none;opacity:.75}.close:not(:disabled):not(.disabled){cursor:pointer}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-25%);transform:translate(0,-25%)}@media screen and (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:translate(0,0);transform:translate(0,0)}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - (.5rem * 2))}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;border-bottom:1px solid #e9ecef;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #e9ecef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-centered{min-height:calc(100% - (1.75rem * 2))}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top] .arrow,.bs-popover-top .arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::after,.bs-popover-top .arrow::before{border-width:.5rem .5rem 0}.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::before{bottom:0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-top .arrow::after{bottom:1px;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right] .arrow,.bs-popover-right .arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::after,.bs-popover-right .arrow::before{border-width:.5rem .5rem .5rem 0}.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::before{left:0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-right .arrow::after{left:1px;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom] .arrow,.bs-popover-bottom .arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::after,.bs-popover-bottom .arrow::before{border-width:0 .5rem .5rem .5rem}.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::before{top:0;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-bottom .arrow::after{top:1px;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left] .arrow,.bs-popover-left .arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::after,.bs-popover-left .arrow::before{border-width:.5rem 0 .5rem .5rem}.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::before{right:0;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-left .arrow::after{right:1px;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;-ms-flex-align:center;align-items:center;width:100%;transition:-webkit-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease,-webkit-transform .6s ease;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}@media screen and (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.active.carousel-item-right,.carousel-item-next{-webkit-transform:translateX(100%);transform:translateX(100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-right,.carousel-item-next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translateX(-100%);transform:translateX(-100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.carousel-fade .carousel-item{opacity:0;transition-duration:.6s;transition-property:opacity}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{opacity:0}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev,.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev,.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:rgba(255,255,255,.5)}.carousel-indicators li::before{position:absolute;top:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li::after{position:absolute;bottom:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-circle{border-radius:50%!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0062cc!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#545b62!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#1e7e34!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#117a8b!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#d39e00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#bd2130!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#dae0e5!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#1d2124!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}} +/*# sourceMappingURL=bootstrap.min.css.map */ diff --git a/explorer/public/paper-dashboard/assets/css/bootstrap.min.css.map b/explorer/public/paper-dashboard/assets/css/bootstrap.min.css.map new file mode 100755 index 00000000000..d291039eb7a --- /dev/null +++ b/explorer/public/paper-dashboard/assets/css/bootstrap.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../scss/bootstrap.scss","../../scss/_root.scss","../../scss/_reboot.scss","dist/css/bootstrap.css","bootstrap.css","../../scss/mixins/_hover.scss","../../scss/_type.scss","../../scss/mixins/_lists.scss","../../scss/_images.scss","../../scss/mixins/_image.scss","../../scss/mixins/_border-radius.scss","../../scss/_code.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_breakpoints.scss","../../scss/mixins/_grid-framework.scss","../../scss/_tables.scss","../../scss/mixins/_table-row.scss","../../scss/_forms.scss","../../scss/mixins/_transition.scss","../../scss/mixins/_forms.scss","../../scss/mixins/_gradients.scss","../../scss/_buttons.scss","../../scss/mixins/_buttons.scss","../../scss/_transitions.scss","../../scss/_dropdown.scss","../../scss/mixins/_caret.scss","../../scss/mixins/_nav-divider.scss","../../scss/_button-group.scss","../../scss/_input-group.scss","../../scss/_custom-forms.scss","../../scss/_nav.scss","../../scss/_navbar.scss","../../scss/_card.scss","../../scss/_breadcrumb.scss","../../scss/_pagination.scss","../../scss/mixins/_pagination.scss","../../scss/_badge.scss","../../scss/mixins/_badge.scss","../../scss/_jumbotron.scss","../../scss/_alert.scss","../../scss/mixins/_alert.scss","../../scss/_progress.scss","../../scss/_media.scss","../../scss/_list-group.scss","../../scss/mixins/_list-group.scss","../../scss/_close.scss","../../scss/_modal.scss","../../scss/_tooltip.scss","../../scss/mixins/_reset-text.scss","../../scss/_popover.scss","../../scss/_carousel.scss","../../scss/utilities/_align.scss","../../scss/mixins/_background-variant.scss","../../scss/utilities/_background.scss","../../scss/utilities/_borders.scss","../../scss/mixins/_clearfix.scss","../../scss/utilities/_display.scss","../../scss/utilities/_embed.scss","../../scss/utilities/_flex.scss","../../scss/utilities/_float.scss","../../scss/mixins/_float.scss","../../scss/utilities/_position.scss","../../scss/utilities/_screenreaders.scss","../../scss/mixins/_screen-reader.scss","../../scss/utilities/_shadows.scss","../../scss/utilities/_sizing.scss","../../scss/utilities/_spacing.scss","../../scss/utilities/_text.scss","../../scss/mixins/_text-truncate.scss","../../scss/mixins/_text-emphasis.scss","../../scss/mixins/_text-hide.scss","../../scss/utilities/_visibility.scss","../../scss/mixins/_visibility.scss","../../scss/_print.scss"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Bootstrap v4.1.1 (https://getbootstrap.com/)\n * Copyright 2011-2018 The Bootstrap Authors\n * Copyright 2011-2018 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"root\";\n@import \"reboot\";\n@import \"type\";\n@import \"images\";\n@import \"code\";\n@import \"grid\";\n@import \"tables\";\n@import \"forms\";\n@import \"buttons\";\n@import \"transitions\";\n@import \"dropdown\";\n@import \"button-group\";\n@import \"input-group\";\n@import \"custom-forms\";\n@import \"nav\";\n@import \"navbar\";\n@import \"card\";\n@import \"breadcrumb\";\n@import \"pagination\";\n@import \"badge\";\n@import \"jumbotron\";\n@import \"alert\";\n@import \"progress\";\n@import \"media\";\n@import \"list-group\";\n@import \"close\";\n@import \"modal\";\n@import \"tooltip\";\n@import \"popover\";\n@import \"carousel\";\n@import \"utilities\";\n@import \"print\";\n",":root {\n // Custom variable values only support SassScript inside `#{}`.\n @each $color, $value in $colors {\n --#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$color}: #{$value};\n }\n\n @each $bp, $value in $grid-breakpoints {\n --breakpoint-#{$bp}: #{$value};\n }\n\n // Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --font-family-sans-serif: #{inspect($font-family-sans-serif)};\n --font-family-monospace: #{inspect($font-family-monospace)};\n}\n","// stylelint-disable at-rule-no-vendor-prefix, declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n// 2. Change the default font family in all browsers.\n// 3. Correct the line height in all browsers.\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\n// 5. Setting @viewport causes scrollbars to overlap content in IE11 and Edge, so\n// we force a non-overlapping, non-auto-hiding scrollbar to counteract.\n// 6. Change the default tap highlight to be completely transparent in iOS.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box; // 1\n}\n\nhtml {\n font-family: sans-serif; // 2\n line-height: 1.15; // 3\n -webkit-text-size-adjust: 100%; // 4\n -ms-text-size-adjust: 100%; // 4\n -ms-overflow-style: scrollbar; // 5\n -webkit-tap-highlight-color: rgba($black, 0); // 6\n}\n\n// IE10+ doesn't honor `<meta name=\"viewport\">` in some cases.\n@at-root {\n @-ms-viewport {\n width: device-width;\n }\n}\n\n// stylelint-disable selector-list-comma-newline-after\n// Shim for \"new\" HTML5 structural elements to display correctly (IE10, older browsers)\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n// stylelint-enable selector-list-comma-newline-after\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Set an explicit initial text-align value so that we can later use the\n// the `inherit` value on things like `<th>` elements.\n\nbody {\n margin: 0; // 1\n font-family: $font-family-base;\n font-size: $font-size-base;\n font-weight: $font-weight-base;\n line-height: $line-height-base;\n color: $body-color;\n text-align: left; // 3\n background-color: $body-bg; // 2\n}\n\n// Suppress the focus outline on elements that cannot be accessed via keyboard.\n// This prevents an unwanted focus outline from appearing around elements that\n// might still respond to pointer events.\n//\n// Credit: https://github.com/suitcss/base\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\n\n// Content grouping\n//\n// 1. Add the correct box sizing in Firefox.\n// 2. Show the overflow in Edge and IE.\n\nhr {\n box-sizing: content-box; // 1\n height: 0; // 1\n overflow: visible; // 2\n}\n\n\n//\n// Typography\n//\n\n// Remove top margins from headings\n//\n// By default, `<h1>`-`<h6>` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n// stylelint-disable selector-list-comma-newline-after\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: $headings-margin-bottom;\n}\n// stylelint-enable selector-list-comma-newline-after\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `<p>`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Remove the bottom border in Firefox 39-.\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Duplicate behavior to the data-* attribute for our tooltip plugin\n\nabbr[title],\nabbr[data-original-title] { // 4\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 1\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\ndfn {\n font-style: italic; // Add the correct font style in Android 4.3-\n}\n\n// stylelint-disable font-weight-notation\nb,\nstrong {\n font-weight: bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n// stylelint-enable font-weight-notation\n\nsmall {\n font-size: 80%; // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n -webkit-text-decoration-skip: objects; // Remove gaps in links underline in iOS 8+ and Safari 8+.\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href)\n// which have not been made explicitly keyboard-focusable (without tabindex).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n\n @include hover-focus {\n color: inherit;\n text-decoration: none;\n }\n\n &:focus {\n outline: 0;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-monospace;\n font-size: 1em; // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n // We have @viewport set which causes scrollbars to overlap content in IE11 and Edge, so\n // we force a non-overlapping, non-auto-hiding scrollbar to counteract.\n -ms-overflow-style: scrollbar;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg:not(:root) {\n overflow: hidden; // Hide the overflow in IE\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $table-caption-color;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n // Matches default `<td>` alignment by inheriting from the `<body>`, or the\n // closest parent with a set `text-align`.\n text-align: inherit;\n}\n\n\n//\n// Forms\n//\n\nlabel {\n // Allow labels to use `margin` for spacing.\n display: inline-block;\n margin-bottom: $label-margin-bottom;\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24093\nbutton {\n border-radius: 0;\n}\n\n// Work around a Firefox/IE bug where the transparent `button` background\n// results in a loss of the default `button` focus styles.\n//\n// Credit: https://github.com/suitcss/base/\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // Remove the margin in Firefox and Safari\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible; // Show the overflow in Edge\n}\n\nbutton,\nselect {\n text-transform: none; // Remove the inheritance of text transform in Firefox\n}\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\nbutton,\nhtml [type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box; // 1. Add the correct box sizing in IE 10-\n padding: 0; // 2. Remove the padding in IE 10-\n}\n\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n // Remove the default appearance of temporal inputs to avoid a Mobile Safari\n // bug where setting a custom line-height prevents text from being vertically\n // centered within the input.\n // See https://bugs.webkit.org/show_bug.cgi?id=139848\n // and https://github.com/twbs/bootstrap/issues/11266\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto; // Remove the default vertical scrollbar in IE.\n // Textareas should really only resize vertically so they don't break their (horizontal) containers.\n resize: vertical;\n}\n\nfieldset {\n // Browsers set a default `min-width: min-content;` on fieldsets,\n // unlike e.g. `<div>`s, which have `min-width: 0;` by default.\n // So we reset that to ensure fieldsets behave more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359\n // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\n min-width: 0;\n // Reset the default outline behavior of fieldsets so they don't affect page layout.\n padding: 0;\n margin: 0;\n border: 0;\n}\n\n// 1. Correct the text wrapping in Edge and IE.\n// 2. Correct the color inheritance from `fieldset` elements in IE.\nlegend {\n display: block;\n width: 100%;\n max-width: 100%; // 1\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit; // 2\n white-space: normal; // 1\n}\n\nprogress {\n vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.\n}\n\n// Correct the cursor style of increment and decrement buttons in Chrome.\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n // This overrides the extra rounded corners on search inputs in iOS so that our\n // `.form-control` class can properly style them. Note that this cannot simply\n // be added to `.form-control` as it's not specific enough. For details, see\n // https://github.com/twbs/bootstrap/issues/11586.\n outline-offset: -2px; // 2. Correct the outline style in Safari.\n -webkit-appearance: none;\n}\n\n//\n// Remove the inner padding and cancel buttons in Chrome and Safari on macOS.\n//\n\n[type=\"search\"]::-webkit-search-cancel-button,\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// 1. Correct the inability to style clickable types in iOS and Safari.\n// 2. Change font properties to `inherit` in Safari.\n//\n\n::-webkit-file-upload-button {\n font: inherit; // 2\n -webkit-appearance: button; // 1\n}\n\n//\n// Correct element displays\n//\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item; // Add the correct display in all browsers\n cursor: pointer;\n}\n\ntemplate {\n display: none; // Add the correct display in IE\n}\n\n// Always hide an element with the `hidden` HTML attribute (from PureCSS).\n// Needed for proper display in IE 10-.\n[hidden] {\n display: none !important;\n}\n","/*!\n * Bootstrap v4.1.1 (https://getbootstrap.com/)\n * Copyright 2011-2018 The Bootstrap Authors\n * Copyright 2011-2018 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n:root {\n --blue: #007bff;\n --indigo: #6610f2;\n --purple: #6f42c1;\n --pink: #e83e8c;\n --red: #dc3545;\n --orange: #fd7e14;\n --yellow: #ffc107;\n --green: #28a745;\n --teal: #20c997;\n --cyan: #17a2b8;\n --white: #fff;\n --gray: #6c757d;\n --gray-dark: #343a40;\n --primary: #007bff;\n --secondary: #6c757d;\n --success: #28a745;\n --info: #17a2b8;\n --warning: #ffc107;\n --danger: #dc3545;\n --light: #f8f9fa;\n --dark: #343a40;\n --breakpoint-xs: 0;\n --breakpoint-sm: 576px;\n --breakpoint-md: 768px;\n --breakpoint-lg: 992px;\n --breakpoint-xl: 1200px;\n --font-family-sans-serif: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -ms-text-size-adjust: 100%;\n -ms-overflow-style: scrollbar;\n -webkit-tap-highlight-color: transparent;\n}\n\n@-ms-viewport {\n width: device-width;\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n text-align: left;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: 0.5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\ndfn {\n font-style: italic;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #007bff;\n text-decoration: none;\n background-color: transparent;\n -webkit-text-decoration-skip: objects;\n}\n\na:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n -ms-overflow-style: scrollbar;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #6c757d;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: inherit;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: 0.5rem;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nbutton,\nhtml [type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-cancel-button,\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: 0.5rem;\n font-family: inherit;\n font-weight: 500;\n line-height: 1.2;\n color: inherit;\n}\n\nh1, .h1 {\n font-size: 2.5rem;\n}\n\nh2, .h2 {\n font-size: 2rem;\n}\n\nh3, .h3 {\n font-size: 1.75rem;\n}\n\nh4, .h4 {\n font-size: 1.5rem;\n}\n\nh5, .h5 {\n font-size: 1.25rem;\n}\n\nh6, .h6 {\n font-size: 1rem;\n}\n\n.lead {\n font-size: 1.25rem;\n font-weight: 300;\n}\n\n.display-1 {\n font-size: 6rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\n.display-2 {\n font-size: 5.5rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\n.display-3 {\n font-size: 4.5rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\n.display-4 {\n font-size: 3.5rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\nhr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n border: 0;\n border-top: 1px solid rgba(0, 0, 0, 0.1);\n}\n\nsmall,\n.small {\n font-size: 80%;\n font-weight: 400;\n}\n\nmark,\n.mark {\n padding: 0.2em;\n background-color: #fcf8e3;\n}\n\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline-item {\n display: inline-block;\n}\n\n.list-inline-item:not(:last-child) {\n margin-right: 0.5rem;\n}\n\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n.blockquote {\n margin-bottom: 1rem;\n font-size: 1.25rem;\n}\n\n.blockquote-footer {\n display: block;\n font-size: 80%;\n color: #6c757d;\n}\n\n.blockquote-footer::before {\n content: \"\\2014 \\00A0\";\n}\n\n.img-fluid {\n max-width: 100%;\n height: auto;\n}\n\n.img-thumbnail {\n padding: 0.25rem;\n background-color: #fff;\n border: 1px solid #dee2e6;\n border-radius: 0.25rem;\n max-width: 100%;\n height: auto;\n}\n\n.figure {\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: 0.5rem;\n line-height: 1;\n}\n\n.figure-caption {\n font-size: 90%;\n color: #6c757d;\n}\n\ncode {\n font-size: 87.5%;\n color: #e83e8c;\n word-break: break-word;\n}\n\na > code {\n color: inherit;\n}\n\nkbd {\n padding: 0.2rem 0.4rem;\n font-size: 87.5%;\n color: #fff;\n background-color: #212529;\n border-radius: 0.2rem;\n}\n\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: 700;\n}\n\npre {\n display: block;\n font-size: 87.5%;\n color: #212529;\n}\n\npre code {\n font-size: inherit;\n color: inherit;\n word-break: normal;\n}\n\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n\n.container {\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 576px) {\n .container {\n max-width: 540px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n max-width: 720px;\n }\n}\n\n@media (min-width: 992px) {\n .container {\n max-width: 960px;\n }\n}\n\n@media (min-width: 1200px) {\n .container {\n max-width: 1140px;\n }\n}\n\n.container-fluid {\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n\n.row {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n margin-right: -15px;\n margin-left: -15px;\n}\n\n.no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n position: relative;\n width: 100%;\n min-height: 1px;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n.col {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.col-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: none;\n}\n\n.col-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n}\n\n.col-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.col-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.col-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n}\n\n.col-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.col-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n}\n\n.col-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n}\n\n.col-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n}\n\n.col-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n}\n\n.col-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n}\n\n.col-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.order-first {\n -ms-flex-order: -1;\n order: -1;\n}\n\n.order-last {\n -ms-flex-order: 13;\n order: 13;\n}\n\n.order-0 {\n -ms-flex-order: 0;\n order: 0;\n}\n\n.order-1 {\n -ms-flex-order: 1;\n order: 1;\n}\n\n.order-2 {\n -ms-flex-order: 2;\n order: 2;\n}\n\n.order-3 {\n -ms-flex-order: 3;\n order: 3;\n}\n\n.order-4 {\n -ms-flex-order: 4;\n order: 4;\n}\n\n.order-5 {\n -ms-flex-order: 5;\n order: 5;\n}\n\n.order-6 {\n -ms-flex-order: 6;\n order: 6;\n}\n\n.order-7 {\n -ms-flex-order: 7;\n order: 7;\n}\n\n.order-8 {\n -ms-flex-order: 8;\n order: 8;\n}\n\n.order-9 {\n -ms-flex-order: 9;\n order: 9;\n}\n\n.order-10 {\n -ms-flex-order: 10;\n order: 10;\n}\n\n.order-11 {\n -ms-flex-order: 11;\n order: 11;\n}\n\n.order-12 {\n -ms-flex-order: 12;\n order: 12;\n}\n\n.offset-1 {\n margin-left: 8.333333%;\n}\n\n.offset-2 {\n margin-left: 16.666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.333333%;\n}\n\n.offset-5 {\n margin-left: 41.666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.333333%;\n}\n\n.offset-8 {\n margin-left: 66.666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.333333%;\n}\n\n.offset-11 {\n margin-left: 91.666667%;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-sm-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: none;\n }\n .col-sm-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-sm-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-sm-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-sm-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-sm-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-sm-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-sm-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-sm-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-sm-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-sm-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-sm-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-sm-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-sm-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-sm-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-sm-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-sm-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-sm-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-sm-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-sm-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-sm-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-sm-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-sm-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-sm-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-sm-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-sm-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-sm-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.333333%;\n }\n .offset-sm-2 {\n margin-left: 16.666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.333333%;\n }\n .offset-sm-5 {\n margin-left: 41.666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.333333%;\n }\n .offset-sm-8 {\n margin-left: 66.666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.333333%;\n }\n .offset-sm-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-md-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: none;\n }\n .col-md-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-md-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-md-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-md-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-md-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-md-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-md-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-md-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-md-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-md-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-md-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-md-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-md-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-md-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-md-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-md-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-md-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-md-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-md-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-md-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-md-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-md-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-md-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-md-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-md-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-md-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.333333%;\n }\n .offset-md-2 {\n margin-left: 16.666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.333333%;\n }\n .offset-md-5 {\n margin-left: 41.666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.333333%;\n }\n .offset-md-8 {\n margin-left: 66.666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.333333%;\n }\n .offset-md-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 992px) {\n .col-lg {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-lg-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: none;\n }\n .col-lg-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-lg-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-lg-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-lg-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-lg-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-lg-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-lg-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-lg-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-lg-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-lg-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-lg-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-lg-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-lg-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-lg-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-lg-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-lg-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-lg-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-lg-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-lg-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-lg-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-lg-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-lg-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-lg-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-lg-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-lg-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-lg-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.333333%;\n }\n .offset-lg-2 {\n margin-left: 16.666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.333333%;\n }\n .offset-lg-5 {\n margin-left: 41.666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.333333%;\n }\n .offset-lg-8 {\n margin-left: 66.666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.333333%;\n }\n .offset-lg-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1200px) {\n .col-xl {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xl-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: none;\n }\n .col-xl-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xl-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xl-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xl-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xl-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xl-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xl-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xl-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xl-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xl-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xl-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xl-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-xl-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-xl-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-xl-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-xl-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-xl-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-xl-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-xl-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-xl-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-xl-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-xl-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-xl-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-xl-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-xl-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-xl-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.333333%;\n }\n .offset-xl-2 {\n margin-left: 16.666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.333333%;\n }\n .offset-xl-5 {\n margin-left: 41.666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.333333%;\n }\n .offset-xl-8 {\n margin-left: 66.666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.333333%;\n }\n .offset-xl-11 {\n margin-left: 91.666667%;\n }\n}\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 1rem;\n background-color: transparent;\n}\n\n.table th,\n.table td {\n padding: 0.75rem;\n vertical-align: top;\n border-top: 1px solid #dee2e6;\n}\n\n.table thead th {\n vertical-align: bottom;\n border-bottom: 2px solid #dee2e6;\n}\n\n.table tbody + tbody {\n border-top: 2px solid #dee2e6;\n}\n\n.table .table {\n background-color: #fff;\n}\n\n.table-sm th,\n.table-sm td {\n padding: 0.3rem;\n}\n\n.table-bordered {\n border: 1px solid #dee2e6;\n}\n\n.table-bordered th,\n.table-bordered td {\n border: 1px solid #dee2e6;\n}\n\n.table-bordered thead th,\n.table-bordered thead td {\n border-bottom-width: 2px;\n}\n\n.table-borderless th,\n.table-borderless td,\n.table-borderless thead th,\n.table-borderless tbody + tbody {\n border: 0;\n}\n\n.table-striped tbody tr:nth-of-type(odd) {\n background-color: rgba(0, 0, 0, 0.05);\n}\n\n.table-hover tbody tr:hover {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-primary,\n.table-primary > th,\n.table-primary > td {\n background-color: #b8daff;\n}\n\n.table-hover .table-primary:hover {\n background-color: #9fcdff;\n}\n\n.table-hover .table-primary:hover > td,\n.table-hover .table-primary:hover > th {\n background-color: #9fcdff;\n}\n\n.table-secondary,\n.table-secondary > th,\n.table-secondary > td {\n background-color: #d6d8db;\n}\n\n.table-hover .table-secondary:hover {\n background-color: #c8cbcf;\n}\n\n.table-hover .table-secondary:hover > td,\n.table-hover .table-secondary:hover > th {\n background-color: #c8cbcf;\n}\n\n.table-success,\n.table-success > th,\n.table-success > td {\n background-color: #c3e6cb;\n}\n\n.table-hover .table-success:hover {\n background-color: #b1dfbb;\n}\n\n.table-hover .table-success:hover > td,\n.table-hover .table-success:hover > th {\n background-color: #b1dfbb;\n}\n\n.table-info,\n.table-info > th,\n.table-info > td {\n background-color: #bee5eb;\n}\n\n.table-hover .table-info:hover {\n background-color: #abdde5;\n}\n\n.table-hover .table-info:hover > td,\n.table-hover .table-info:hover > th {\n background-color: #abdde5;\n}\n\n.table-warning,\n.table-warning > th,\n.table-warning > td {\n background-color: #ffeeba;\n}\n\n.table-hover .table-warning:hover {\n background-color: #ffe8a1;\n}\n\n.table-hover .table-warning:hover > td,\n.table-hover .table-warning:hover > th {\n background-color: #ffe8a1;\n}\n\n.table-danger,\n.table-danger > th,\n.table-danger > td {\n background-color: #f5c6cb;\n}\n\n.table-hover .table-danger:hover {\n background-color: #f1b0b7;\n}\n\n.table-hover .table-danger:hover > td,\n.table-hover .table-danger:hover > th {\n background-color: #f1b0b7;\n}\n\n.table-light,\n.table-light > th,\n.table-light > td {\n background-color: #fdfdfe;\n}\n\n.table-hover .table-light:hover {\n background-color: #ececf6;\n}\n\n.table-hover .table-light:hover > td,\n.table-hover .table-light:hover > th {\n background-color: #ececf6;\n}\n\n.table-dark,\n.table-dark > th,\n.table-dark > td {\n background-color: #c6c8ca;\n}\n\n.table-hover .table-dark:hover {\n background-color: #b9bbbe;\n}\n\n.table-hover .table-dark:hover > td,\n.table-hover .table-dark:hover > th {\n background-color: #b9bbbe;\n}\n\n.table-active,\n.table-active > th,\n.table-active > td {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover > td,\n.table-hover .table-active:hover > th {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table .thead-dark th {\n color: #fff;\n background-color: #212529;\n border-color: #32383e;\n}\n\n.table .thead-light th {\n color: #495057;\n background-color: #e9ecef;\n border-color: #dee2e6;\n}\n\n.table-dark {\n color: #fff;\n background-color: #212529;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th {\n border-color: #32383e;\n}\n\n.table-dark.table-bordered {\n border: 0;\n}\n\n.table-dark.table-striped tbody tr:nth-of-type(odd) {\n background-color: rgba(255, 255, 255, 0.05);\n}\n\n.table-dark.table-hover tbody tr:hover {\n background-color: rgba(255, 255, 255, 0.075);\n}\n\n@media (max-width: 575.98px) {\n .table-responsive-sm {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n }\n .table-responsive-sm > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 767.98px) {\n .table-responsive-md {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n }\n .table-responsive-md > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 991.98px) {\n .table-responsive-lg {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n }\n .table-responsive-lg > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 1199.98px) {\n .table-responsive-xl {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n }\n .table-responsive-xl > .table-bordered {\n border: 0;\n }\n}\n\n.table-responsive {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n}\n\n.table-responsive > .table-bordered {\n border: 0;\n}\n\n.form-control {\n display: block;\n width: 100%;\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n line-height: 1.5;\n color: #495057;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media screen and (prefers-reduced-motion: reduce) {\n .form-control {\n transition: none;\n }\n}\n\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n\n.form-control:focus {\n color: #495057;\n background-color: #fff;\n border-color: #80bdff;\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.form-control::-webkit-input-placeholder {\n color: #6c757d;\n opacity: 1;\n}\n\n.form-control::-moz-placeholder {\n color: #6c757d;\n opacity: 1;\n}\n\n.form-control:-ms-input-placeholder {\n color: #6c757d;\n opacity: 1;\n}\n\n.form-control::-ms-input-placeholder {\n color: #6c757d;\n opacity: 1;\n}\n\n.form-control::placeholder {\n color: #6c757d;\n opacity: 1;\n}\n\n.form-control:disabled, .form-control[readonly] {\n background-color: #e9ecef;\n opacity: 1;\n}\n\nselect.form-control:not([size]):not([multiple]) {\n height: calc(2.25rem + 2px);\n}\n\nselect.form-control:focus::-ms-value {\n color: #495057;\n background-color: #fff;\n}\n\n.form-control-file,\n.form-control-range {\n display: block;\n width: 100%;\n}\n\n.col-form-label {\n padding-top: calc(0.375rem + 1px);\n padding-bottom: calc(0.375rem + 1px);\n margin-bottom: 0;\n font-size: inherit;\n line-height: 1.5;\n}\n\n.col-form-label-lg {\n padding-top: calc(0.5rem + 1px);\n padding-bottom: calc(0.5rem + 1px);\n font-size: 1.25rem;\n line-height: 1.5;\n}\n\n.col-form-label-sm {\n padding-top: calc(0.25rem + 1px);\n padding-bottom: calc(0.25rem + 1px);\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.form-control-plaintext {\n display: block;\n width: 100%;\n padding-top: 0.375rem;\n padding-bottom: 0.375rem;\n margin-bottom: 0;\n line-height: 1.5;\n color: #212529;\n background-color: transparent;\n border: solid transparent;\n border-width: 1px 0;\n}\n\n.form-control-plaintext.form-control-sm, .input-group-sm > .form-control-plaintext.form-control,\n.input-group-sm > .input-group-prepend > .form-control-plaintext.input-group-text,\n.input-group-sm > .input-group-append > .form-control-plaintext.input-group-text,\n.input-group-sm > .input-group-prepend > .form-control-plaintext.btn,\n.input-group-sm > .input-group-append > .form-control-plaintext.btn, .form-control-plaintext.form-control-lg, .input-group-lg > .form-control-plaintext.form-control,\n.input-group-lg > .input-group-prepend > .form-control-plaintext.input-group-text,\n.input-group-lg > .input-group-append > .form-control-plaintext.input-group-text,\n.input-group-lg > .input-group-prepend > .form-control-plaintext.btn,\n.input-group-lg > .input-group-append > .form-control-plaintext.btn {\n padding-right: 0;\n padding-left: 0;\n}\n\n.form-control-sm, .input-group-sm > .form-control,\n.input-group-sm > .input-group-prepend > .input-group-text,\n.input-group-sm > .input-group-append > .input-group-text,\n.input-group-sm > .input-group-prepend > .btn,\n.input-group-sm > .input-group-append > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\nselect.form-control-sm:not([size]):not([multiple]), .input-group-sm > select.form-control:not([size]):not([multiple]),\n.input-group-sm > .input-group-prepend > select.input-group-text:not([size]):not([multiple]),\n.input-group-sm > .input-group-append > select.input-group-text:not([size]):not([multiple]),\n.input-group-sm > .input-group-prepend > select.btn:not([size]):not([multiple]),\n.input-group-sm > .input-group-append > select.btn:not([size]):not([multiple]) {\n height: calc(1.8125rem + 2px);\n}\n\n.form-control-lg, .input-group-lg > .form-control,\n.input-group-lg > .input-group-prepend > .input-group-text,\n.input-group-lg > .input-group-append > .input-group-text,\n.input-group-lg > .input-group-prepend > .btn,\n.input-group-lg > .input-group-append > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\nselect.form-control-lg:not([size]):not([multiple]), .input-group-lg > select.form-control:not([size]):not([multiple]),\n.input-group-lg > .input-group-prepend > select.input-group-text:not([size]):not([multiple]),\n.input-group-lg > .input-group-append > select.input-group-text:not([size]):not([multiple]),\n.input-group-lg > .input-group-prepend > select.btn:not([size]):not([multiple]),\n.input-group-lg > .input-group-append > select.btn:not([size]):not([multiple]) {\n height: calc(2.875rem + 2px);\n}\n\n.form-group {\n margin-bottom: 1rem;\n}\n\n.form-text {\n display: block;\n margin-top: 0.25rem;\n}\n\n.form-row {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n margin-right: -5px;\n margin-left: -5px;\n}\n\n.form-row > .col,\n.form-row > [class*=\"col-\"] {\n padding-right: 5px;\n padding-left: 5px;\n}\n\n.form-check {\n position: relative;\n display: block;\n padding-left: 1.25rem;\n}\n\n.form-check-input {\n position: absolute;\n margin-top: 0.3rem;\n margin-left: -1.25rem;\n}\n\n.form-check-input:disabled ~ .form-check-label {\n color: #6c757d;\n}\n\n.form-check-label {\n margin-bottom: 0;\n}\n\n.form-check-inline {\n display: -ms-inline-flexbox;\n display: inline-flex;\n -ms-flex-align: center;\n align-items: center;\n padding-left: 0;\n margin-right: 0.75rem;\n}\n\n.form-check-inline .form-check-input {\n position: static;\n margin-top: 0;\n margin-right: 0.3125rem;\n margin-left: 0;\n}\n\n.valid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 80%;\n color: #28a745;\n}\n\n.valid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: .5rem;\n margin-top: .1rem;\n font-size: .875rem;\n line-height: 1;\n color: #fff;\n background-color: rgba(40, 167, 69, 0.8);\n border-radius: .2rem;\n}\n\n.was-validated .form-control:valid, .form-control.is-valid, .was-validated\n.custom-select:valid,\n.custom-select.is-valid {\n border-color: #28a745;\n}\n\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus, .was-validated\n.custom-select:valid:focus,\n.custom-select.is-valid:focus {\n border-color: #28a745;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .form-control:valid ~ .valid-feedback,\n.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback,\n.form-control.is-valid ~ .valid-tooltip, .was-validated\n.custom-select:valid ~ .valid-feedback,\n.was-validated\n.custom-select:valid ~ .valid-tooltip,\n.custom-select.is-valid ~ .valid-feedback,\n.custom-select.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-control-file:valid ~ .valid-feedback,\n.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback,\n.form-control-file.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n color: #28a745;\n}\n\n.was-validated .form-check-input:valid ~ .valid-feedback,\n.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback,\n.form-check-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {\n color: #28a745;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {\n background-color: #71dd8a;\n}\n\n.was-validated .custom-control-input:valid ~ .valid-feedback,\n.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback,\n.custom-control-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {\n background-color: #34ce57;\n}\n\n.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {\n border-color: #28a745;\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-label::before, .custom-file-input.is-valid ~ .custom-file-label::before {\n border-color: inherit;\n}\n\n.was-validated .custom-file-input:valid ~ .valid-feedback,\n.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback,\n.custom-file-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.invalid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 80%;\n color: #dc3545;\n}\n\n.invalid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: .5rem;\n margin-top: .1rem;\n font-size: .875rem;\n line-height: 1;\n color: #fff;\n background-color: rgba(220, 53, 69, 0.8);\n border-radius: .2rem;\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid, .was-validated\n.custom-select:invalid,\n.custom-select.is-invalid {\n border-color: #dc3545;\n}\n\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus, .was-validated\n.custom-select:invalid:focus,\n.custom-select.is-invalid:focus {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback,\n.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback,\n.form-control.is-invalid ~ .invalid-tooltip, .was-validated\n.custom-select:invalid ~ .invalid-feedback,\n.was-validated\n.custom-select:invalid ~ .invalid-tooltip,\n.custom-select.is-invalid ~ .invalid-feedback,\n.custom-select.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-control-file:invalid ~ .invalid-feedback,\n.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback,\n.form-control-file.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n color: #dc3545;\n}\n\n.was-validated .form-check-input:invalid ~ .invalid-feedback,\n.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback,\n.form-check-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {\n color: #dc3545;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {\n background-color: #efa2a9;\n}\n\n.was-validated .custom-control-input:invalid ~ .invalid-feedback,\n.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback,\n.custom-control-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {\n background-color: #e4606d;\n}\n\n.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {\n border-color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-label::before, .custom-file-input.is-invalid ~ .custom-file-label::before {\n border-color: inherit;\n}\n\n.was-validated .custom-file-input:invalid ~ .invalid-feedback,\n.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback,\n.custom-file-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.form-inline {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-flow: row wrap;\n flex-flow: row wrap;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.form-inline .form-check {\n width: 100%;\n}\n\n@media (min-width: 576px) {\n .form-inline label {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: center;\n justify-content: center;\n margin-bottom: 0;\n }\n .form-inline .form-group {\n display: -ms-flexbox;\n display: flex;\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n -ms-flex-flow: row wrap;\n flex-flow: row wrap;\n -ms-flex-align: center;\n align-items: center;\n margin-bottom: 0;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-plaintext {\n display: inline-block;\n }\n .form-inline .input-group,\n .form-inline .custom-select {\n width: auto;\n }\n .form-inline .form-check {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: center;\n justify-content: center;\n width: auto;\n padding-left: 0;\n }\n .form-inline .form-check-input {\n position: relative;\n margin-top: 0;\n margin-right: 0.25rem;\n margin-left: 0;\n }\n .form-inline .custom-control {\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: center;\n justify-content: center;\n }\n .form-inline .custom-control-label {\n margin-bottom: 0;\n }\n}\n\n.btn {\n display: inline-block;\n font-weight: 400;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n border: 1px solid transparent;\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n line-height: 1.5;\n border-radius: 0.25rem;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media screen and (prefers-reduced-motion: reduce) {\n .btn {\n transition: none;\n }\n}\n\n.btn:hover, .btn:focus {\n text-decoration: none;\n}\n\n.btn:focus, .btn.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.btn.disabled, .btn:disabled {\n opacity: 0.65;\n}\n\n.btn:not(:disabled):not(.disabled) {\n cursor: pointer;\n}\n\n.btn:not(:disabled):not(.disabled):active, .btn:not(:disabled):not(.disabled).active {\n background-image: none;\n}\n\na.btn.disabled,\nfieldset:disabled a.btn {\n pointer-events: none;\n}\n\n.btn-primary {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-primary:hover {\n color: #fff;\n background-color: #0069d9;\n border-color: #0062cc;\n}\n\n.btn-primary:focus, .btn-primary.focus {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-primary.disabled, .btn-primary:disabled {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active,\n.show > .btn-primary.dropdown-toggle {\n color: #fff;\n background-color: #0062cc;\n border-color: #005cbf;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-primary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-secondary {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-secondary:hover {\n color: #fff;\n background-color: #5a6268;\n border-color: #545b62;\n}\n\n.btn-secondary:focus, .btn-secondary.focus {\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-secondary.disabled, .btn-secondary:disabled {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-secondary.dropdown-toggle {\n color: #fff;\n background-color: #545b62;\n border-color: #4e555b;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-secondary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-success {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-success:hover {\n color: #fff;\n background-color: #218838;\n border-color: #1e7e34;\n}\n\n.btn-success:focus, .btn-success.focus {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-success.disabled, .btn-success:disabled {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active,\n.show > .btn-success.dropdown-toggle {\n color: #fff;\n background-color: #1e7e34;\n border-color: #1c7430;\n}\n\n.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-success.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-info {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-info:hover {\n color: #fff;\n background-color: #138496;\n border-color: #117a8b;\n}\n\n.btn-info:focus, .btn-info.focus {\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-info.disabled, .btn-info:disabled {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active,\n.show > .btn-info.dropdown-toggle {\n color: #fff;\n background-color: #117a8b;\n border-color: #10707f;\n}\n\n.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-info.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-warning {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-warning:hover {\n color: #212529;\n background-color: #e0a800;\n border-color: #d39e00;\n}\n\n.btn-warning:focus, .btn-warning.focus {\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-warning.disabled, .btn-warning:disabled {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active,\n.show > .btn-warning.dropdown-toggle {\n color: #212529;\n background-color: #d39e00;\n border-color: #c69500;\n}\n\n.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-warning.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-danger {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-danger:hover {\n color: #fff;\n background-color: #c82333;\n border-color: #bd2130;\n}\n\n.btn-danger:focus, .btn-danger.focus {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-danger.disabled, .btn-danger:disabled {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active,\n.show > .btn-danger.dropdown-toggle {\n color: #fff;\n background-color: #bd2130;\n border-color: #b21f2d;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-danger.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-light {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-light:hover {\n color: #212529;\n background-color: #e2e6ea;\n border-color: #dae0e5;\n}\n\n.btn-light:focus, .btn-light.focus {\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-light.disabled, .btn-light:disabled {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active,\n.show > .btn-light.dropdown-toggle {\n color: #212529;\n background-color: #dae0e5;\n border-color: #d3d9df;\n}\n\n.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-light.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-dark {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-dark:hover {\n color: #fff;\n background-color: #23272b;\n border-color: #1d2124;\n}\n\n.btn-dark:focus, .btn-dark.focus {\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-dark.disabled, .btn-dark:disabled {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active,\n.show > .btn-dark.dropdown-toggle {\n color: #fff;\n background-color: #1d2124;\n border-color: #171a1d;\n}\n\n.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-dark.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-outline-primary {\n color: #007bff;\n background-color: transparent;\n background-image: none;\n border-color: #007bff;\n}\n\n.btn-outline-primary:hover {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-primary:focus, .btn-outline-primary.focus {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-primary.disabled, .btn-outline-primary:disabled {\n color: #007bff;\n background-color: transparent;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-primary.dropdown-toggle {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-primary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-secondary {\n color: #6c757d;\n background-color: transparent;\n background-image: none;\n border-color: #6c757d;\n}\n\n.btn-outline-secondary:hover {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-outline-secondary:focus, .btn-outline-secondary.focus {\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {\n color: #6c757d;\n background-color: transparent;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-secondary.dropdown-toggle {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-secondary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-outline-success {\n color: #28a745;\n background-color: transparent;\n background-image: none;\n border-color: #28a745;\n}\n\n.btn-outline-success:hover {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-success:focus, .btn-outline-success.focus {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-success.disabled, .btn-outline-success:disabled {\n color: #28a745;\n background-color: transparent;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active,\n.show > .btn-outline-success.dropdown-toggle {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-success.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-info {\n color: #17a2b8;\n background-color: transparent;\n background-image: none;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:hover {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:focus, .btn-outline-info.focus {\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-info.disabled, .btn-outline-info:disabled {\n color: #17a2b8;\n background-color: transparent;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active,\n.show > .btn-outline-info.dropdown-toggle {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-info.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-warning {\n color: #ffc107;\n background-color: transparent;\n background-image: none;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:hover {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:focus, .btn-outline-warning.focus {\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-warning.disabled, .btn-outline-warning:disabled {\n color: #ffc107;\n background-color: transparent;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active,\n.show > .btn-outline-warning.dropdown-toggle {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-warning.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-danger {\n color: #dc3545;\n background-color: transparent;\n background-image: none;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:hover {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:focus, .btn-outline-danger.focus {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-danger.disabled, .btn-outline-danger:disabled {\n color: #dc3545;\n background-color: transparent;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active,\n.show > .btn-outline-danger.dropdown-toggle {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-danger.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-light {\n color: #f8f9fa;\n background-color: transparent;\n background-image: none;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:hover {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:focus, .btn-outline-light.focus {\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-light.disabled, .btn-outline-light:disabled {\n color: #f8f9fa;\n background-color: transparent;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active,\n.show > .btn-outline-light.dropdown-toggle {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-light.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-dark {\n color: #343a40;\n background-color: transparent;\n background-image: none;\n border-color: #343a40;\n}\n\n.btn-outline-dark:hover {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-outline-dark:focus, .btn-outline-dark.focus {\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-outline-dark.disabled, .btn-outline-dark:disabled {\n color: #343a40;\n background-color: transparent;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active,\n.show > .btn-outline-dark.dropdown-toggle {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-dark.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-link {\n font-weight: 400;\n color: #007bff;\n background-color: transparent;\n}\n\n.btn-link:hover {\n color: #0056b3;\n text-decoration: underline;\n background-color: transparent;\n border-color: transparent;\n}\n\n.btn-link:focus, .btn-link.focus {\n text-decoration: underline;\n border-color: transparent;\n box-shadow: none;\n}\n\n.btn-link:disabled, .btn-link.disabled {\n color: #6c757d;\n pointer-events: none;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n.btn-block + .btn-block {\n margin-top: 0.5rem;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n\n.fade {\n transition: opacity 0.15s linear;\n}\n\n@media screen and (prefers-reduced-motion: reduce) {\n .fade {\n transition: none;\n }\n}\n\n.fade:not(.show) {\n opacity: 0;\n}\n\n.collapse:not(.show) {\n display: none;\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n transition: height 0.35s ease;\n}\n\n@media screen and (prefers-reduced-motion: reduce) {\n .collapsing {\n transition: none;\n }\n}\n\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n position: relative;\n}\n\n.dropdown-toggle::after {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid;\n border-right: 0.3em solid transparent;\n border-bottom: 0;\n border-left: 0.3em solid transparent;\n}\n\n.dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 10rem;\n padding: 0.5rem 0;\n margin: 0.125rem 0 0;\n font-size: 1rem;\n color: #212529;\n text-align: left;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n}\n\n.dropdown-menu-right {\n right: 0;\n left: auto;\n}\n\n.dropup .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: 0.125rem;\n}\n\n.dropup .dropdown-toggle::after {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0;\n border-right: 0.3em solid transparent;\n border-bottom: 0.3em solid;\n border-left: 0.3em solid transparent;\n}\n\n.dropup .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropright .dropdown-menu {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: 0.125rem;\n}\n\n.dropright .dropdown-toggle::after {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0;\n border-bottom: 0.3em solid transparent;\n border-left: 0.3em solid;\n}\n\n.dropright .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropright .dropdown-toggle::after {\n vertical-align: 0;\n}\n\n.dropleft .dropdown-menu {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: 0.125rem;\n}\n\n.dropleft .dropdown-toggle::after {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n}\n\n.dropleft .dropdown-toggle::after {\n display: none;\n}\n\n.dropleft .dropdown-toggle::before {\n display: inline-block;\n width: 0;\n height: 0;\n margin-right: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0.3em solid;\n border-bottom: 0.3em solid transparent;\n}\n\n.dropleft .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropleft .dropdown-toggle::before {\n vertical-align: 0;\n}\n\n.dropdown-menu[x-placement^=\"top\"], .dropdown-menu[x-placement^=\"right\"], .dropdown-menu[x-placement^=\"bottom\"], .dropdown-menu[x-placement^=\"left\"] {\n right: auto;\n bottom: auto;\n}\n\n.dropdown-divider {\n height: 0;\n margin: 0.5rem 0;\n overflow: hidden;\n border-top: 1px solid #e9ecef;\n}\n\n.dropdown-item {\n display: block;\n width: 100%;\n padding: 0.25rem 1.5rem;\n clear: both;\n font-weight: 400;\n color: #212529;\n text-align: inherit;\n white-space: nowrap;\n background-color: transparent;\n border: 0;\n}\n\n.dropdown-item:hover, .dropdown-item:focus {\n color: #16181b;\n text-decoration: none;\n background-color: #f8f9fa;\n}\n\n.dropdown-item.active, .dropdown-item:active {\n color: #fff;\n text-decoration: none;\n background-color: #007bff;\n}\n\n.dropdown-item.disabled, .dropdown-item:disabled {\n color: #6c757d;\n background-color: transparent;\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n.dropdown-header {\n display: block;\n padding: 0.5rem 1.5rem;\n margin-bottom: 0;\n font-size: 0.875rem;\n color: #6c757d;\n white-space: nowrap;\n}\n\n.dropdown-item-text {\n display: block;\n padding: 0.25rem 1.5rem;\n color: #212529;\n}\n\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: -ms-inline-flexbox;\n display: inline-flex;\n vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n -ms-flex: 0 1 auto;\n flex: 0 1 auto;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover {\n z-index: 1;\n}\n\n.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n z-index: 1;\n}\n\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group,\n.btn-group-vertical .btn + .btn,\n.btn-group-vertical .btn + .btn-group,\n.btn-group-vertical .btn-group + .btn,\n.btn-group-vertical .btn-group + .btn-group {\n margin-left: -1px;\n}\n\n.btn-toolbar {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n}\n\n.btn-toolbar .input-group {\n width: auto;\n}\n\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n\n.btn-group > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.dropdown-toggle-split {\n padding-right: 0.5625rem;\n padding-left: 0.5625rem;\n}\n\n.dropdown-toggle-split::after,\n.dropup .dropdown-toggle-split::after,\n.dropright .dropdown-toggle-split::after {\n margin-left: 0;\n}\n\n.dropleft .dropdown-toggle-split::before {\n margin-right: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n padding-right: 0.375rem;\n padding-left: 0.375rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n padding-right: 0.75rem;\n padding-left: 0.75rem;\n}\n\n.btn-group-vertical {\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-align: start;\n align-items: flex-start;\n -ms-flex-pack: center;\n justify-content: center;\n}\n\n.btn-group-vertical .btn,\n.btn-group-vertical .btn-group {\n width: 100%;\n}\n\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n\n.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group-vertical > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.btn-group-toggle > .btn,\n.btn-group-toggle > .btn-group > .btn {\n margin-bottom: 0;\n}\n\n.btn-group-toggle > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn input[type=\"checkbox\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n\n.input-group {\n position: relative;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n -ms-flex-align: stretch;\n align-items: stretch;\n width: 100%;\n}\n\n.input-group > .form-control,\n.input-group > .custom-select,\n.input-group > .custom-file {\n position: relative;\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n width: 1%;\n margin-bottom: 0;\n}\n\n.input-group > .form-control:focus,\n.input-group > .custom-select:focus,\n.input-group > .custom-file:focus {\n z-index: 3;\n}\n\n.input-group > .form-control + .form-control,\n.input-group > .form-control + .custom-select,\n.input-group > .form-control + .custom-file,\n.input-group > .custom-select + .form-control,\n.input-group > .custom-select + .custom-select,\n.input-group > .custom-select + .custom-file,\n.input-group > .custom-file + .form-control,\n.input-group > .custom-file + .custom-select,\n.input-group > .custom-file + .custom-file {\n margin-left: -1px;\n}\n\n.input-group > .form-control:not(:last-child),\n.input-group > .custom-select:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group > .form-control:not(:first-child),\n.input-group > .custom-select:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.input-group > .custom-file {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.input-group > .custom-file:not(:last-child) .custom-file-label,\n.input-group > .custom-file:not(:last-child) .custom-file-label::after {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group > .custom-file:not(:first-child) .custom-file-label {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.input-group-prepend,\n.input-group-append {\n display: -ms-flexbox;\n display: flex;\n}\n\n.input-group-prepend .btn,\n.input-group-append .btn {\n position: relative;\n z-index: 2;\n}\n\n.input-group-prepend .btn + .btn,\n.input-group-prepend .btn + .input-group-text,\n.input-group-prepend .input-group-text + .input-group-text,\n.input-group-prepend .input-group-text + .btn,\n.input-group-append .btn + .btn,\n.input-group-append .btn + .input-group-text,\n.input-group-append .input-group-text + .input-group-text,\n.input-group-append .input-group-text + .btn {\n margin-left: -1px;\n}\n\n.input-group-prepend {\n margin-right: -1px;\n}\n\n.input-group-append {\n margin-left: -1px;\n}\n\n.input-group-text {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n padding: 0.375rem 0.75rem;\n margin-bottom: 0;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n text-align: center;\n white-space: nowrap;\n background-color: #e9ecef;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n}\n\n.input-group-text input[type=\"radio\"],\n.input-group-text input[type=\"checkbox\"] {\n margin-top: 0;\n}\n\n.input-group > .input-group-prepend > .btn,\n.input-group > .input-group-prepend > .input-group-text,\n.input-group > .input-group-append:not(:last-child) > .btn,\n.input-group > .input-group-append:not(:last-child) > .input-group-text,\n.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group > .input-group-append > .btn,\n.input-group > .input-group-append > .input-group-text,\n.input-group > .input-group-prepend:not(:first-child) > .btn,\n.input-group > .input-group-prepend:not(:first-child) > .input-group-text,\n.input-group > .input-group-prepend:first-child > .btn:not(:first-child),\n.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.custom-control {\n position: relative;\n display: block;\n min-height: 1.5rem;\n padding-left: 1.5rem;\n}\n\n.custom-control-inline {\n display: -ms-inline-flexbox;\n display: inline-flex;\n margin-right: 1rem;\n}\n\n.custom-control-input {\n position: absolute;\n z-index: -1;\n opacity: 0;\n}\n\n.custom-control-input:checked ~ .custom-control-label::before {\n color: #fff;\n background-color: #007bff;\n}\n\n.custom-control-input:focus ~ .custom-control-label::before {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-control-input:active ~ .custom-control-label::before {\n color: #fff;\n background-color: #b3d7ff;\n}\n\n.custom-control-input:disabled ~ .custom-control-label {\n color: #6c757d;\n}\n\n.custom-control-input:disabled ~ .custom-control-label::before {\n background-color: #e9ecef;\n}\n\n.custom-control-label {\n position: relative;\n margin-bottom: 0;\n}\n\n.custom-control-label::before {\n position: absolute;\n top: 0.25rem;\n left: -1.5rem;\n display: block;\n width: 1rem;\n height: 1rem;\n pointer-events: none;\n content: \"\";\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n background-color: #dee2e6;\n}\n\n.custom-control-label::after {\n position: absolute;\n top: 0.25rem;\n left: -1.5rem;\n display: block;\n width: 1rem;\n height: 1rem;\n content: \"\";\n background-repeat: no-repeat;\n background-position: center center;\n background-size: 50% 50%;\n}\n\n.custom-checkbox .custom-control-label::before {\n border-radius: 0.25rem;\n}\n\n.custom-checkbox .custom-control-input:checked ~ .custom-control-label::before {\n background-color: #007bff;\n}\n\n.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E\");\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {\n background-color: #007bff;\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E\");\n}\n\n.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-radio .custom-control-label::before {\n border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::before {\n background-color: #007bff;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-select {\n display: inline-block;\n width: 100%;\n height: calc(2.25rem + 2px);\n padding: 0.375rem 1.75rem 0.375rem 0.75rem;\n line-height: 1.5;\n color: #495057;\n vertical-align: middle;\n background: #fff url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E\") no-repeat right 0.75rem center;\n background-size: 8px 10px;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n\n.custom-select:focus {\n border-color: #80bdff;\n outline: 0;\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075), 0 0 5px rgba(128, 189, 255, 0.5);\n}\n\n.custom-select:focus::-ms-value {\n color: #495057;\n background-color: #fff;\n}\n\n.custom-select[multiple], .custom-select[size]:not([size=\"1\"]) {\n height: auto;\n padding-right: 0.75rem;\n background-image: none;\n}\n\n.custom-select:disabled {\n color: #6c757d;\n background-color: #e9ecef;\n}\n\n.custom-select::-ms-expand {\n opacity: 0;\n}\n\n.custom-select-sm {\n height: calc(1.8125rem + 2px);\n padding-top: 0.375rem;\n padding-bottom: 0.375rem;\n font-size: 75%;\n}\n\n.custom-select-lg {\n height: calc(2.875rem + 2px);\n padding-top: 0.375rem;\n padding-bottom: 0.375rem;\n font-size: 125%;\n}\n\n.custom-file {\n position: relative;\n display: inline-block;\n width: 100%;\n height: calc(2.25rem + 2px);\n margin-bottom: 0;\n}\n\n.custom-file-input {\n position: relative;\n z-index: 2;\n width: 100%;\n height: calc(2.25rem + 2px);\n margin: 0;\n opacity: 0;\n}\n\n.custom-file-input:focus ~ .custom-file-label {\n border-color: #80bdff;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-file-input:focus ~ .custom-file-label::after {\n border-color: #80bdff;\n}\n\n.custom-file-input:lang(en) ~ .custom-file-label::after {\n content: \"Browse\";\n}\n\n.custom-file-label {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1;\n height: calc(2.25rem + 2px);\n padding: 0.375rem 0.75rem;\n line-height: 1.5;\n color: #495057;\n background-color: #fff;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n}\n\n.custom-file-label::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n z-index: 3;\n display: block;\n height: 2.25rem;\n padding: 0.375rem 0.75rem;\n line-height: 1.5;\n color: #495057;\n content: \"Browse\";\n background-color: #e9ecef;\n border-left: 1px solid #ced4da;\n border-radius: 0 0.25rem 0.25rem 0;\n}\n\n.custom-range {\n width: 100%;\n padding-left: 0;\n background-color: transparent;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n\n.custom-range:focus {\n outline: none;\n}\n\n.custom-range::-moz-focus-outer {\n border: 0;\n}\n\n.custom-range::-webkit-slider-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: -0.25rem;\n background-color: #007bff;\n border: 0;\n border-radius: 1rem;\n -webkit-appearance: none;\n appearance: none;\n}\n\n.custom-range::-webkit-slider-thumb:focus {\n outline: none;\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range::-webkit-slider-thumb:active {\n background-color: #b3d7ff;\n}\n\n.custom-range::-webkit-slider-runnable-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #dee2e6;\n border-color: transparent;\n border-radius: 1rem;\n}\n\n.custom-range::-moz-range-thumb {\n width: 1rem;\n height: 1rem;\n background-color: #007bff;\n border: 0;\n border-radius: 1rem;\n -moz-appearance: none;\n appearance: none;\n}\n\n.custom-range::-moz-range-thumb:focus {\n outline: none;\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range::-moz-range-thumb:active {\n background-color: #b3d7ff;\n}\n\n.custom-range::-moz-range-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #dee2e6;\n border-color: transparent;\n border-radius: 1rem;\n}\n\n.custom-range::-ms-thumb {\n width: 1rem;\n height: 1rem;\n background-color: #007bff;\n border: 0;\n border-radius: 1rem;\n appearance: none;\n}\n\n.custom-range::-ms-thumb:focus {\n outline: none;\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range::-ms-thumb:active {\n background-color: #b3d7ff;\n}\n\n.custom-range::-ms-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: transparent;\n border-color: transparent;\n border-width: 0.5rem;\n}\n\n.custom-range::-ms-fill-lower {\n background-color: #dee2e6;\n border-radius: 1rem;\n}\n\n.custom-range::-ms-fill-upper {\n margin-right: 15px;\n background-color: #dee2e6;\n border-radius: 1rem;\n}\n\n.nav {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: 0.5rem 1rem;\n}\n\n.nav-link:hover, .nav-link:focus {\n text-decoration: none;\n}\n\n.nav-link.disabled {\n color: #6c757d;\n}\n\n.nav-tabs {\n border-bottom: 1px solid #dee2e6;\n}\n\n.nav-tabs .nav-item {\n margin-bottom: -1px;\n}\n\n.nav-tabs .nav-link {\n border: 1px solid transparent;\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n border-color: #e9ecef #e9ecef #dee2e6;\n}\n\n.nav-tabs .nav-link.disabled {\n color: #6c757d;\n background-color: transparent;\n border-color: transparent;\n}\n\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n color: #495057;\n background-color: #fff;\n border-color: #dee2e6 #dee2e6 #fff;\n}\n\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.nav-pills .nav-link {\n border-radius: 0.25rem;\n}\n\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n color: #fff;\n background-color: #007bff;\n}\n\n.nav-fill .nav-item {\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n text-align: center;\n}\n\n.nav-justified .nav-item {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n text-align: center;\n}\n\n.tab-content > .tab-pane {\n display: none;\n}\n\n.tab-content > .active {\n display: block;\n}\n\n.navbar {\n position: relative;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: justify;\n justify-content: space-between;\n padding: 0.5rem 1rem;\n}\n\n.navbar > .container,\n.navbar > .container-fluid {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: justify;\n justify-content: space-between;\n}\n\n.navbar-brand {\n display: inline-block;\n padding-top: 0.3125rem;\n padding-bottom: 0.3125rem;\n margin-right: 1rem;\n font-size: 1.25rem;\n line-height: inherit;\n white-space: nowrap;\n}\n\n.navbar-brand:hover, .navbar-brand:focus {\n text-decoration: none;\n}\n\n.navbar-nav {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.navbar-nav .nav-link {\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-nav .dropdown-menu {\n position: static;\n float: none;\n}\n\n.navbar-text {\n display: inline-block;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n\n.navbar-collapse {\n -ms-flex-preferred-size: 100%;\n flex-basis: 100%;\n -ms-flex-positive: 1;\n flex-grow: 1;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.navbar-toggler {\n padding: 0.25rem 0.75rem;\n font-size: 1.25rem;\n line-height: 1;\n background-color: transparent;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.navbar-toggler:hover, .navbar-toggler:focus {\n text-decoration: none;\n}\n\n.navbar-toggler:not(:disabled):not(.disabled) {\n cursor: pointer;\n}\n\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.5em;\n height: 1.5em;\n vertical-align: middle;\n content: \"\";\n background: no-repeat center center;\n background-size: 100% 100%;\n}\n\n@media (max-width: 575.98px) {\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 576px) {\n .navbar-expand-sm {\n -ms-flex-flow: row nowrap;\n flex-flow: row nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n }\n .navbar-expand-sm .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .navbar-expand-sm .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-sm .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n }\n .navbar-expand-sm .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n }\n .navbar-expand-sm .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 767.98px) {\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 768px) {\n .navbar-expand-md {\n -ms-flex-flow: row nowrap;\n flex-flow: row nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n }\n .navbar-expand-md .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .navbar-expand-md .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-md .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n }\n .navbar-expand-md .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n }\n .navbar-expand-md .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 991.98px) {\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 992px) {\n .navbar-expand-lg {\n -ms-flex-flow: row nowrap;\n flex-flow: row nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n }\n .navbar-expand-lg .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .navbar-expand-lg .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-lg .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n }\n .navbar-expand-lg .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n }\n .navbar-expand-lg .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 1199.98px) {\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 1200px) {\n .navbar-expand-xl {\n -ms-flex-flow: row nowrap;\n flex-flow: row nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n }\n .navbar-expand-xl .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .navbar-expand-xl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xl .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n }\n .navbar-expand-xl .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n }\n .navbar-expand-xl .navbar-toggler {\n display: none;\n }\n}\n\n.navbar-expand {\n -ms-flex-flow: row nowrap;\n flex-flow: row nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-expand .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu {\n position: absolute;\n}\n\n.navbar-expand .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n}\n\n.navbar-expand .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n}\n\n.navbar-expand .navbar-toggler {\n display: none;\n}\n\n.navbar-light .navbar-brand {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-nav .nav-link {\n color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {\n color: rgba(0, 0, 0, 0.7);\n}\n\n.navbar-light .navbar-nav .nav-link.disabled {\n color: rgba(0, 0, 0, 0.3);\n}\n\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .active > .nav-link,\n.navbar-light .navbar-nav .nav-link.show,\n.navbar-light .navbar-nav .nav-link.active {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-toggler {\n color: rgba(0, 0, 0, 0.5);\n border-color: rgba(0, 0, 0, 0.1);\n}\n\n.navbar-light .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E\");\n}\n\n.navbar-light .navbar-text {\n color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-text a {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-dark .navbar-brand {\n color: #fff;\n}\n\n.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {\n color: #fff;\n}\n\n.navbar-dark .navbar-nav .nav-link {\n color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {\n color: rgba(255, 255, 255, 0.75);\n}\n\n.navbar-dark .navbar-nav .nav-link.disabled {\n color: rgba(255, 255, 255, 0.25);\n}\n\n.navbar-dark .navbar-nav .show > .nav-link,\n.navbar-dark .navbar-nav .active > .nav-link,\n.navbar-dark .navbar-nav .nav-link.show,\n.navbar-dark .navbar-nav .nav-link.active {\n color: #fff;\n}\n\n.navbar-dark .navbar-toggler {\n color: rgba(255, 255, 255, 0.5);\n border-color: rgba(255, 255, 255, 0.1);\n}\n\n.navbar-dark .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E\");\n}\n\n.navbar-dark .navbar-text {\n color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-dark .navbar-text a {\n color: #fff;\n}\n\n.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus {\n color: #fff;\n}\n\n.card {\n position: relative;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n min-width: 0;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: border-box;\n border: 1px solid rgba(0, 0, 0, 0.125);\n border-radius: 0.25rem;\n}\n\n.card > hr {\n margin-right: 0;\n margin-left: 0;\n}\n\n.card > .list-group:first-child .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.card > .list-group:last-child .list-group-item:last-child {\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.card-body {\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n padding: 1.25rem;\n}\n\n.card-title {\n margin-bottom: 0.75rem;\n}\n\n.card-subtitle {\n margin-top: -0.375rem;\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link:hover {\n text-decoration: none;\n}\n\n.card-link + .card-link {\n margin-left: 1.25rem;\n}\n\n.card-header {\n padding: 0.75rem 1.25rem;\n margin-bottom: 0;\n background-color: rgba(0, 0, 0, 0.03);\n border-bottom: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-header:first-child {\n border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\n}\n\n.card-header + .list-group .list-group-item:first-child {\n border-top: 0;\n}\n\n.card-footer {\n padding: 0.75rem 1.25rem;\n background-color: rgba(0, 0, 0, 0.03);\n border-top: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-footer:last-child {\n border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\n}\n\n.card-header-tabs {\n margin-right: -0.625rem;\n margin-bottom: -0.75rem;\n margin-left: -0.625rem;\n border-bottom: 0;\n}\n\n.card-header-pills {\n margin-right: -0.625rem;\n margin-left: -0.625rem;\n}\n\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: 1.25rem;\n}\n\n.card-img {\n width: 100%;\n border-radius: calc(0.25rem - 1px);\n}\n\n.card-img-top {\n width: 100%;\n border-top-left-radius: calc(0.25rem - 1px);\n border-top-right-radius: calc(0.25rem - 1px);\n}\n\n.card-img-bottom {\n width: 100%;\n border-bottom-right-radius: calc(0.25rem - 1px);\n border-bottom-left-radius: calc(0.25rem - 1px);\n}\n\n.card-deck {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n}\n\n.card-deck .card {\n margin-bottom: 15px;\n}\n\n@media (min-width: 576px) {\n .card-deck {\n -ms-flex-flow: row wrap;\n flex-flow: row wrap;\n margin-right: -15px;\n margin-left: -15px;\n }\n .card-deck .card {\n display: -ms-flexbox;\n display: flex;\n -ms-flex: 1 0 0%;\n flex: 1 0 0%;\n -ms-flex-direction: column;\n flex-direction: column;\n margin-right: 15px;\n margin-bottom: 0;\n margin-left: 15px;\n }\n}\n\n.card-group {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n}\n\n.card-group > .card {\n margin-bottom: 15px;\n}\n\n@media (min-width: 576px) {\n .card-group {\n -ms-flex-flow: row wrap;\n flex-flow: row wrap;\n }\n .card-group > .card {\n -ms-flex: 1 0 0%;\n flex: 1 0 0%;\n margin-bottom: 0;\n }\n .card-group > .card + .card {\n margin-left: 0;\n border-left: 0;\n }\n .card-group > .card:first-child {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n .card-group > .card:first-child .card-img-top,\n .card-group > .card:first-child .card-header {\n border-top-right-radius: 0;\n }\n .card-group > .card:first-child .card-img-bottom,\n .card-group > .card:first-child .card-footer {\n border-bottom-right-radius: 0;\n }\n .card-group > .card:last-child {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n .card-group > .card:last-child .card-img-top,\n .card-group > .card:last-child .card-header {\n border-top-left-radius: 0;\n }\n .card-group > .card:last-child .card-img-bottom,\n .card-group > .card:last-child .card-footer {\n border-bottom-left-radius: 0;\n }\n .card-group > .card:only-child {\n border-radius: 0.25rem;\n }\n .card-group > .card:only-child .card-img-top,\n .card-group > .card:only-child .card-header {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n }\n .card-group > .card:only-child .card-img-bottom,\n .card-group > .card:only-child .card-footer {\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n }\n .card-group > .card:not(:first-child):not(:last-child):not(:only-child) {\n border-radius: 0;\n }\n .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-img-top,\n .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,\n .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-header,\n .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-footer {\n border-radius: 0;\n }\n}\n\n.card-columns .card {\n margin-bottom: 0.75rem;\n}\n\n@media (min-width: 576px) {\n .card-columns {\n -webkit-column-count: 3;\n -moz-column-count: 3;\n column-count: 3;\n -webkit-column-gap: 1.25rem;\n -moz-column-gap: 1.25rem;\n column-gap: 1.25rem;\n orphans: 1;\n widows: 1;\n }\n .card-columns .card {\n display: inline-block;\n width: 100%;\n }\n}\n\n.accordion .card:not(:first-of-type):not(:last-of-type) {\n border-bottom: 0;\n border-radius: 0;\n}\n\n.accordion .card:not(:first-of-type) .card-header:first-child {\n border-radius: 0;\n}\n\n.accordion .card:first-of-type {\n border-bottom: 0;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.accordion .card:last-of-type {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.breadcrumb {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n padding: 0.75rem 1rem;\n margin-bottom: 1rem;\n list-style: none;\n background-color: #e9ecef;\n border-radius: 0.25rem;\n}\n\n.breadcrumb-item + .breadcrumb-item {\n padding-left: 0.5rem;\n}\n\n.breadcrumb-item + .breadcrumb-item::before {\n display: inline-block;\n padding-right: 0.5rem;\n color: #6c757d;\n content: \"/\";\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: underline;\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: none;\n}\n\n.breadcrumb-item.active {\n color: #6c757d;\n}\n\n.pagination {\n display: -ms-flexbox;\n display: flex;\n padding-left: 0;\n list-style: none;\n border-radius: 0.25rem;\n}\n\n.page-link {\n position: relative;\n display: block;\n padding: 0.5rem 0.75rem;\n margin-left: -1px;\n line-height: 1.25;\n color: #007bff;\n background-color: #fff;\n border: 1px solid #dee2e6;\n}\n\n.page-link:hover {\n z-index: 2;\n color: #0056b3;\n text-decoration: none;\n background-color: #e9ecef;\n border-color: #dee2e6;\n}\n\n.page-link:focus {\n z-index: 2;\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.page-link:not(:disabled):not(.disabled) {\n cursor: pointer;\n}\n\n.page-item:first-child .page-link {\n margin-left: 0;\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.page-item:last-child .page-link {\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n}\n\n.page-item.active .page-link {\n z-index: 1;\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.page-item.disabled .page-link {\n color: #6c757d;\n pointer-events: none;\n cursor: auto;\n background-color: #fff;\n border-color: #dee2e6;\n}\n\n.pagination-lg .page-link {\n padding: 0.75rem 1.5rem;\n font-size: 1.25rem;\n line-height: 1.5;\n}\n\n.pagination-lg .page-item:first-child .page-link {\n border-top-left-radius: 0.3rem;\n border-bottom-left-radius: 0.3rem;\n}\n\n.pagination-lg .page-item:last-child .page-link {\n border-top-right-radius: 0.3rem;\n border-bottom-right-radius: 0.3rem;\n}\n\n.pagination-sm .page-link {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.pagination-sm .page-item:first-child .page-link {\n border-top-left-radius: 0.2rem;\n border-bottom-left-radius: 0.2rem;\n}\n\n.pagination-sm .page-item:last-child .page-link {\n border-top-right-radius: 0.2rem;\n border-bottom-right-radius: 0.2rem;\n}\n\n.badge {\n display: inline-block;\n padding: 0.25em 0.4em;\n font-size: 75%;\n font-weight: 700;\n line-height: 1;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: 0.25rem;\n}\n\n.badge:empty {\n display: none;\n}\n\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n.badge-pill {\n padding-right: 0.6em;\n padding-left: 0.6em;\n border-radius: 10rem;\n}\n\n.badge-primary {\n color: #fff;\n background-color: #007bff;\n}\n\n.badge-primary[href]:hover, .badge-primary[href]:focus {\n color: #fff;\n text-decoration: none;\n background-color: #0062cc;\n}\n\n.badge-secondary {\n color: #fff;\n background-color: #6c757d;\n}\n\n.badge-secondary[href]:hover, .badge-secondary[href]:focus {\n color: #fff;\n text-decoration: none;\n background-color: #545b62;\n}\n\n.badge-success {\n color: #fff;\n background-color: #28a745;\n}\n\n.badge-success[href]:hover, .badge-success[href]:focus {\n color: #fff;\n text-decoration: none;\n background-color: #1e7e34;\n}\n\n.badge-info {\n color: #fff;\n background-color: #17a2b8;\n}\n\n.badge-info[href]:hover, .badge-info[href]:focus {\n color: #fff;\n text-decoration: none;\n background-color: #117a8b;\n}\n\n.badge-warning {\n color: #212529;\n background-color: #ffc107;\n}\n\n.badge-warning[href]:hover, .badge-warning[href]:focus {\n color: #212529;\n text-decoration: none;\n background-color: #d39e00;\n}\n\n.badge-danger {\n color: #fff;\n background-color: #dc3545;\n}\n\n.badge-danger[href]:hover, .badge-danger[href]:focus {\n color: #fff;\n text-decoration: none;\n background-color: #bd2130;\n}\n\n.badge-light {\n color: #212529;\n background-color: #f8f9fa;\n}\n\n.badge-light[href]:hover, .badge-light[href]:focus {\n color: #212529;\n text-decoration: none;\n background-color: #dae0e5;\n}\n\n.badge-dark {\n color: #fff;\n background-color: #343a40;\n}\n\n.badge-dark[href]:hover, .badge-dark[href]:focus {\n color: #fff;\n text-decoration: none;\n background-color: #1d2124;\n}\n\n.jumbotron {\n padding: 2rem 1rem;\n margin-bottom: 2rem;\n background-color: #e9ecef;\n border-radius: 0.3rem;\n}\n\n@media (min-width: 576px) {\n .jumbotron {\n padding: 4rem 2rem;\n }\n}\n\n.jumbotron-fluid {\n padding-right: 0;\n padding-left: 0;\n border-radius: 0;\n}\n\n.alert {\n position: relative;\n padding: 0.75rem 1.25rem;\n margin-bottom: 1rem;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.alert-heading {\n color: inherit;\n}\n\n.alert-link {\n font-weight: 700;\n}\n\n.alert-dismissible {\n padding-right: 4rem;\n}\n\n.alert-dismissible .close {\n position: absolute;\n top: 0;\n right: 0;\n padding: 0.75rem 1.25rem;\n color: inherit;\n}\n\n.alert-primary {\n color: #004085;\n background-color: #cce5ff;\n border-color: #b8daff;\n}\n\n.alert-primary hr {\n border-top-color: #9fcdff;\n}\n\n.alert-primary .alert-link {\n color: #002752;\n}\n\n.alert-secondary {\n color: #383d41;\n background-color: #e2e3e5;\n border-color: #d6d8db;\n}\n\n.alert-secondary hr {\n border-top-color: #c8cbcf;\n}\n\n.alert-secondary .alert-link {\n color: #202326;\n}\n\n.alert-success {\n color: #155724;\n background-color: #d4edda;\n border-color: #c3e6cb;\n}\n\n.alert-success hr {\n border-top-color: #b1dfbb;\n}\n\n.alert-success .alert-link {\n color: #0b2e13;\n}\n\n.alert-info {\n color: #0c5460;\n background-color: #d1ecf1;\n border-color: #bee5eb;\n}\n\n.alert-info hr {\n border-top-color: #abdde5;\n}\n\n.alert-info .alert-link {\n color: #062c33;\n}\n\n.alert-warning {\n color: #856404;\n background-color: #fff3cd;\n border-color: #ffeeba;\n}\n\n.alert-warning hr {\n border-top-color: #ffe8a1;\n}\n\n.alert-warning .alert-link {\n color: #533f03;\n}\n\n.alert-danger {\n color: #721c24;\n background-color: #f8d7da;\n border-color: #f5c6cb;\n}\n\n.alert-danger hr {\n border-top-color: #f1b0b7;\n}\n\n.alert-danger .alert-link {\n color: #491217;\n}\n\n.alert-light {\n color: #818182;\n background-color: #fefefe;\n border-color: #fdfdfe;\n}\n\n.alert-light hr {\n border-top-color: #ececf6;\n}\n\n.alert-light .alert-link {\n color: #686868;\n}\n\n.alert-dark {\n color: #1b1e21;\n background-color: #d6d8d9;\n border-color: #c6c8ca;\n}\n\n.alert-dark hr {\n border-top-color: #b9bbbe;\n}\n\n.alert-dark .alert-link {\n color: #040505;\n}\n\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 1rem 0;\n }\n to {\n background-position: 0 0;\n }\n}\n\n@keyframes progress-bar-stripes {\n from {\n background-position: 1rem 0;\n }\n to {\n background-position: 0 0;\n }\n}\n\n.progress {\n display: -ms-flexbox;\n display: flex;\n height: 1rem;\n overflow: hidden;\n font-size: 0.75rem;\n background-color: #e9ecef;\n border-radius: 0.25rem;\n}\n\n.progress-bar {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-pack: center;\n justify-content: center;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n background-color: #007bff;\n transition: width 0.6s ease;\n}\n\n@media screen and (prefers-reduced-motion: reduce) {\n .progress-bar {\n transition: none;\n }\n}\n\n.progress-bar-striped {\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 1rem 1rem;\n}\n\n.progress-bar-animated {\n -webkit-animation: progress-bar-stripes 1s linear infinite;\n animation: progress-bar-stripes 1s linear infinite;\n}\n\n.media {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: start;\n align-items: flex-start;\n}\n\n.media-body {\n -ms-flex: 1;\n flex: 1;\n}\n\n.list-group {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n}\n\n.list-group-item-action {\n width: 100%;\n color: #495057;\n text-align: inherit;\n}\n\n.list-group-item-action:hover, .list-group-item-action:focus {\n color: #495057;\n text-decoration: none;\n background-color: #f8f9fa;\n}\n\n.list-group-item-action:active {\n color: #212529;\n background-color: #e9ecef;\n}\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 0.75rem 1.25rem;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.list-group-item:hover, .list-group-item:focus {\n z-index: 1;\n text-decoration: none;\n}\n\n.list-group-item.disabled, .list-group-item:disabled {\n color: #6c757d;\n background-color: #fff;\n}\n\n.list-group-item.active {\n z-index: 2;\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.list-group-flush .list-group-item {\n border-right: 0;\n border-left: 0;\n border-radius: 0;\n}\n\n.list-group-flush:first-child .list-group-item:first-child {\n border-top: 0;\n}\n\n.list-group-flush:last-child .list-group-item:last-child {\n border-bottom: 0;\n}\n\n.list-group-item-primary {\n color: #004085;\n background-color: #b8daff;\n}\n\n.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {\n color: #004085;\n background-color: #9fcdff;\n}\n\n.list-group-item-primary.list-group-item-action.active {\n color: #fff;\n background-color: #004085;\n border-color: #004085;\n}\n\n.list-group-item-secondary {\n color: #383d41;\n background-color: #d6d8db;\n}\n\n.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {\n color: #383d41;\n background-color: #c8cbcf;\n}\n\n.list-group-item-secondary.list-group-item-action.active {\n color: #fff;\n background-color: #383d41;\n border-color: #383d41;\n}\n\n.list-group-item-success {\n color: #155724;\n background-color: #c3e6cb;\n}\n\n.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {\n color: #155724;\n background-color: #b1dfbb;\n}\n\n.list-group-item-success.list-group-item-action.active {\n color: #fff;\n background-color: #155724;\n border-color: #155724;\n}\n\n.list-group-item-info {\n color: #0c5460;\n background-color: #bee5eb;\n}\n\n.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {\n color: #0c5460;\n background-color: #abdde5;\n}\n\n.list-group-item-info.list-group-item-action.active {\n color: #fff;\n background-color: #0c5460;\n border-color: #0c5460;\n}\n\n.list-group-item-warning {\n color: #856404;\n background-color: #ffeeba;\n}\n\n.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {\n color: #856404;\n background-color: #ffe8a1;\n}\n\n.list-group-item-warning.list-group-item-action.active {\n color: #fff;\n background-color: #856404;\n border-color: #856404;\n}\n\n.list-group-item-danger {\n color: #721c24;\n background-color: #f5c6cb;\n}\n\n.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {\n color: #721c24;\n background-color: #f1b0b7;\n}\n\n.list-group-item-danger.list-group-item-action.active {\n color: #fff;\n background-color: #721c24;\n border-color: #721c24;\n}\n\n.list-group-item-light {\n color: #818182;\n background-color: #fdfdfe;\n}\n\n.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {\n color: #818182;\n background-color: #ececf6;\n}\n\n.list-group-item-light.list-group-item-action.active {\n color: #fff;\n background-color: #818182;\n border-color: #818182;\n}\n\n.list-group-item-dark {\n color: #1b1e21;\n background-color: #c6c8ca;\n}\n\n.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {\n color: #1b1e21;\n background-color: #b9bbbe;\n}\n\n.list-group-item-dark.list-group-item-action.active {\n color: #fff;\n background-color: #1b1e21;\n border-color: #1b1e21;\n}\n\n.close {\n float: right;\n font-size: 1.5rem;\n font-weight: 700;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: .5;\n}\n\n.close:hover, .close:focus {\n color: #000;\n text-decoration: none;\n opacity: .75;\n}\n\n.close:not(:disabled):not(.disabled) {\n cursor: pointer;\n}\n\nbutton.close {\n padding: 0;\n background-color: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n\n.modal-open {\n overflow: hidden;\n}\n\n.modal {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n display: none;\n overflow: hidden;\n outline: 0;\n}\n\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 0.5rem;\n pointer-events: none;\n}\n\n.modal.fade .modal-dialog {\n transition: -webkit-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out;\n -webkit-transform: translate(0, -25%);\n transform: translate(0, -25%);\n}\n\n@media screen and (prefers-reduced-motion: reduce) {\n .modal.fade .modal-dialog {\n transition: none;\n }\n}\n\n.modal.show .modal-dialog {\n -webkit-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n\n.modal-dialog-centered {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n min-height: calc(100% - (0.5rem * 2));\n}\n\n.modal-content {\n position: relative;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n width: 100%;\n pointer-events: auto;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n outline: 0;\n}\n\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n\n.modal-backdrop.fade {\n opacity: 0;\n}\n\n.modal-backdrop.show {\n opacity: 0.5;\n}\n\n.modal-header {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: start;\n align-items: flex-start;\n -ms-flex-pack: justify;\n justify-content: space-between;\n padding: 1rem;\n border-bottom: 1px solid #e9ecef;\n border-top-left-radius: 0.3rem;\n border-top-right-radius: 0.3rem;\n}\n\n.modal-header .close {\n padding: 1rem;\n margin: -1rem -1rem -1rem auto;\n}\n\n.modal-title {\n margin-bottom: 0;\n line-height: 1.5;\n}\n\n.modal-body {\n position: relative;\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n padding: 1rem;\n}\n\n.modal-footer {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: end;\n justify-content: flex-end;\n padding: 1rem;\n border-top: 1px solid #e9ecef;\n}\n\n.modal-footer > :not(:first-child) {\n margin-left: .25rem;\n}\n\n.modal-footer > :not(:last-child) {\n margin-right: .25rem;\n}\n\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n@media (min-width: 576px) {\n .modal-dialog {\n max-width: 500px;\n margin: 1.75rem auto;\n }\n .modal-dialog-centered {\n min-height: calc(100% - (1.75rem * 2));\n }\n .modal-sm {\n max-width: 300px;\n }\n}\n\n@media (min-width: 992px) {\n .modal-lg {\n max-width: 800px;\n }\n}\n\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n opacity: 0;\n}\n\n.tooltip.show {\n opacity: 0.9;\n}\n\n.tooltip .arrow {\n position: absolute;\n display: block;\n width: 0.8rem;\n height: 0.4rem;\n}\n\n.tooltip .arrow::before {\n position: absolute;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-tooltip-top, .bs-tooltip-auto[x-placement^=\"top\"] {\n padding: 0.4rem 0;\n}\n\n.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=\"top\"] .arrow {\n bottom: 0;\n}\n\n.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=\"top\"] .arrow::before {\n top: 0;\n border-width: 0.4rem 0.4rem 0;\n border-top-color: #000;\n}\n\n.bs-tooltip-right, .bs-tooltip-auto[x-placement^=\"right\"] {\n padding: 0 0.4rem;\n}\n\n.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=\"right\"] .arrow {\n left: 0;\n width: 0.4rem;\n height: 0.8rem;\n}\n\n.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=\"right\"] .arrow::before {\n right: 0;\n border-width: 0.4rem 0.4rem 0.4rem 0;\n border-right-color: #000;\n}\n\n.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=\"bottom\"] {\n padding: 0.4rem 0;\n}\n\n.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow {\n top: 0;\n}\n\n.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow::before {\n bottom: 0;\n border-width: 0 0.4rem 0.4rem;\n border-bottom-color: #000;\n}\n\n.bs-tooltip-left, .bs-tooltip-auto[x-placement^=\"left\"] {\n padding: 0 0.4rem;\n}\n\n.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=\"left\"] .arrow {\n right: 0;\n width: 0.4rem;\n height: 0.8rem;\n}\n\n.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=\"left\"] .arrow::before {\n left: 0;\n border-width: 0.4rem 0 0.4rem 0.4rem;\n border-left-color: #000;\n}\n\n.tooltip-inner {\n max-width: 200px;\n padding: 0.25rem 0.5rem;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 0.25rem;\n}\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: block;\n max-width: 276px;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n}\n\n.popover .arrow {\n position: absolute;\n display: block;\n width: 1rem;\n height: 0.5rem;\n margin: 0 0.3rem;\n}\n\n.popover .arrow::before, .popover .arrow::after {\n position: absolute;\n display: block;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-popover-top, .bs-popover-auto[x-placement^=\"top\"] {\n margin-bottom: 0.5rem;\n}\n\n.bs-popover-top .arrow, .bs-popover-auto[x-placement^=\"top\"] .arrow {\n bottom: calc((0.5rem + 1px) * -1);\n}\n\n.bs-popover-top .arrow::before, .bs-popover-auto[x-placement^=\"top\"] .arrow::before,\n.bs-popover-top .arrow::after,\n.bs-popover-auto[x-placement^=\"top\"] .arrow::after {\n border-width: 0.5rem 0.5rem 0;\n}\n\n.bs-popover-top .arrow::before, .bs-popover-auto[x-placement^=\"top\"] .arrow::before {\n bottom: 0;\n border-top-color: rgba(0, 0, 0, 0.25);\n}\n\n\n.bs-popover-top .arrow::after,\n.bs-popover-auto[x-placement^=\"top\"] .arrow::after {\n bottom: 1px;\n border-top-color: #fff;\n}\n\n.bs-popover-right, .bs-popover-auto[x-placement^=\"right\"] {\n margin-left: 0.5rem;\n}\n\n.bs-popover-right .arrow, .bs-popover-auto[x-placement^=\"right\"] .arrow {\n left: calc((0.5rem + 1px) * -1);\n width: 0.5rem;\n height: 1rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-right .arrow::before, .bs-popover-auto[x-placement^=\"right\"] .arrow::before,\n.bs-popover-right .arrow::after,\n.bs-popover-auto[x-placement^=\"right\"] .arrow::after {\n border-width: 0.5rem 0.5rem 0.5rem 0;\n}\n\n.bs-popover-right .arrow::before, .bs-popover-auto[x-placement^=\"right\"] .arrow::before {\n left: 0;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n\n\n.bs-popover-right .arrow::after,\n.bs-popover-auto[x-placement^=\"right\"] .arrow::after {\n left: 1px;\n border-right-color: #fff;\n}\n\n.bs-popover-bottom, .bs-popover-auto[x-placement^=\"bottom\"] {\n margin-top: 0.5rem;\n}\n\n.bs-popover-bottom .arrow, .bs-popover-auto[x-placement^=\"bottom\"] .arrow {\n top: calc((0.5rem + 1px) * -1);\n}\n\n.bs-popover-bottom .arrow::before, .bs-popover-auto[x-placement^=\"bottom\"] .arrow::before,\n.bs-popover-bottom .arrow::after,\n.bs-popover-auto[x-placement^=\"bottom\"] .arrow::after {\n border-width: 0 0.5rem 0.5rem 0.5rem;\n}\n\n.bs-popover-bottom .arrow::before, .bs-popover-auto[x-placement^=\"bottom\"] .arrow::before {\n top: 0;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n\n\n.bs-popover-bottom .arrow::after,\n.bs-popover-auto[x-placement^=\"bottom\"] .arrow::after {\n top: 1px;\n border-bottom-color: #fff;\n}\n\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=\"bottom\"] .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: 1rem;\n margin-left: -0.5rem;\n content: \"\";\n border-bottom: 1px solid #f7f7f7;\n}\n\n.bs-popover-left, .bs-popover-auto[x-placement^=\"left\"] {\n margin-right: 0.5rem;\n}\n\n.bs-popover-left .arrow, .bs-popover-auto[x-placement^=\"left\"] .arrow {\n right: calc((0.5rem + 1px) * -1);\n width: 0.5rem;\n height: 1rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-left .arrow::before, .bs-popover-auto[x-placement^=\"left\"] .arrow::before,\n.bs-popover-left .arrow::after,\n.bs-popover-auto[x-placement^=\"left\"] .arrow::after {\n border-width: 0.5rem 0 0.5rem 0.5rem;\n}\n\n.bs-popover-left .arrow::before, .bs-popover-auto[x-placement^=\"left\"] .arrow::before {\n right: 0;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n\n\n.bs-popover-left .arrow::after,\n.bs-popover-auto[x-placement^=\"left\"] .arrow::after {\n right: 1px;\n border-left-color: #fff;\n}\n\n.popover-header {\n padding: 0.5rem 0.75rem;\n margin-bottom: 0;\n font-size: 1rem;\n color: inherit;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-top-left-radius: calc(0.3rem - 1px);\n border-top-right-radius: calc(0.3rem - 1px);\n}\n\n.popover-header:empty {\n display: none;\n}\n\n.popover-body {\n padding: 0.5rem 0.75rem;\n color: #212529;\n}\n\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n\n.carousel-item {\n position: relative;\n display: none;\n -ms-flex-align: center;\n align-items: center;\n width: 100%;\n transition: -webkit-transform 0.6s ease;\n transition: transform 0.6s ease;\n transition: transform 0.6s ease, -webkit-transform 0.6s ease;\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n perspective: 1000px;\n}\n\n@media screen and (prefers-reduced-motion: reduce) {\n .carousel-item {\n transition: none;\n }\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n.carousel-item-next,\n.carousel-item-prev {\n position: absolute;\n top: 0;\n}\n\n.carousel-item-next.carousel-item-left,\n.carousel-item-prev.carousel-item-right {\n -webkit-transform: translateX(0);\n transform: translateX(0);\n}\n\n@supports ((-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d)) {\n .carousel-item-next.carousel-item-left,\n .carousel-item-prev.carousel-item-right {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n }\n}\n\n.carousel-item-next,\n.active.carousel-item-right {\n -webkit-transform: translateX(100%);\n transform: translateX(100%);\n}\n\n@supports ((-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d)) {\n .carousel-item-next,\n .active.carousel-item-right {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n }\n}\n\n.carousel-item-prev,\n.active.carousel-item-left {\n -webkit-transform: translateX(-100%);\n transform: translateX(-100%);\n}\n\n@supports ((-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d)) {\n .carousel-item-prev,\n .active.carousel-item-left {\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n }\n}\n\n.carousel-fade .carousel-item {\n opacity: 0;\n transition-duration: .6s;\n transition-property: opacity;\n}\n\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-left,\n.carousel-fade .carousel-item-prev.carousel-item-right {\n opacity: 1;\n}\n\n.carousel-fade .active.carousel-item-left,\n.carousel-fade .active.carousel-item-right {\n opacity: 0;\n}\n\n.carousel-fade .carousel-item-next,\n.carousel-fade .carousel-item-prev,\n.carousel-fade .carousel-item.active,\n.carousel-fade .active.carousel-item-left,\n.carousel-fade .active.carousel-item-prev {\n -webkit-transform: translateX(0);\n transform: translateX(0);\n}\n\n@supports ((-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d)) {\n .carousel-fade .carousel-item-next,\n .carousel-fade .carousel-item-prev,\n .carousel-fade .carousel-item.active,\n .carousel-fade .active.carousel-item-left,\n .carousel-fade .active.carousel-item-prev {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: center;\n justify-content: center;\n width: 15%;\n color: #fff;\n text-align: center;\n opacity: 0.5;\n}\n\n.carousel-control-prev:hover, .carousel-control-prev:focus,\n.carousel-control-next:hover,\n.carousel-control-next:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n opacity: .9;\n}\n\n.carousel-control-prev {\n left: 0;\n}\n\n.carousel-control-next {\n right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: 20px;\n height: 20px;\n background: transparent no-repeat center center;\n background-size: 100% 100%;\n}\n\n.carousel-control-prev-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E\");\n}\n\n.carousel-control-next-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E\");\n}\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 10px;\n left: 0;\n z-index: 15;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-pack: center;\n justify-content: center;\n padding-left: 0;\n margin-right: 15%;\n margin-left: 15%;\n list-style: none;\n}\n\n.carousel-indicators li {\n position: relative;\n -ms-flex: 0 1 auto;\n flex: 0 1 auto;\n width: 30px;\n height: 3px;\n margin-right: 3px;\n margin-left: 3px;\n text-indent: -999px;\n cursor: pointer;\n background-color: rgba(255, 255, 255, 0.5);\n}\n\n.carousel-indicators li::before {\n position: absolute;\n top: -10px;\n left: 0;\n display: inline-block;\n width: 100%;\n height: 10px;\n content: \"\";\n}\n\n.carousel-indicators li::after {\n position: absolute;\n bottom: -10px;\n left: 0;\n display: inline-block;\n width: 100%;\n height: 10px;\n content: \"\";\n}\n\n.carousel-indicators .active {\n background-color: #fff;\n}\n\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n}\n\n.align-baseline {\n vertical-align: baseline !important;\n}\n\n.align-top {\n vertical-align: top !important;\n}\n\n.align-middle {\n vertical-align: middle !important;\n}\n\n.align-bottom {\n vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n vertical-align: text-top !important;\n}\n\n.bg-primary {\n background-color: #007bff !important;\n}\n\na.bg-primary:hover, a.bg-primary:focus,\nbutton.bg-primary:hover,\nbutton.bg-primary:focus {\n background-color: #0062cc !important;\n}\n\n.bg-secondary {\n background-color: #6c757d !important;\n}\n\na.bg-secondary:hover, a.bg-secondary:focus,\nbutton.bg-secondary:hover,\nbutton.bg-secondary:focus {\n background-color: #545b62 !important;\n}\n\n.bg-success {\n background-color: #28a745 !important;\n}\n\na.bg-success:hover, a.bg-success:focus,\nbutton.bg-success:hover,\nbutton.bg-success:focus {\n background-color: #1e7e34 !important;\n}\n\n.bg-info {\n background-color: #17a2b8 !important;\n}\n\na.bg-info:hover, a.bg-info:focus,\nbutton.bg-info:hover,\nbutton.bg-info:focus {\n background-color: #117a8b !important;\n}\n\n.bg-warning {\n background-color: #ffc107 !important;\n}\n\na.bg-warning:hover, a.bg-warning:focus,\nbutton.bg-warning:hover,\nbutton.bg-warning:focus {\n background-color: #d39e00 !important;\n}\n\n.bg-danger {\n background-color: #dc3545 !important;\n}\n\na.bg-danger:hover, a.bg-danger:focus,\nbutton.bg-danger:hover,\nbutton.bg-danger:focus {\n background-color: #bd2130 !important;\n}\n\n.bg-light {\n background-color: #f8f9fa !important;\n}\n\na.bg-light:hover, a.bg-light:focus,\nbutton.bg-light:hover,\nbutton.bg-light:focus {\n background-color: #dae0e5 !important;\n}\n\n.bg-dark {\n background-color: #343a40 !important;\n}\n\na.bg-dark:hover, a.bg-dark:focus,\nbutton.bg-dark:hover,\nbutton.bg-dark:focus {\n background-color: #1d2124 !important;\n}\n\n.bg-white {\n background-color: #fff !important;\n}\n\n.bg-transparent {\n background-color: transparent !important;\n}\n\n.border {\n border: 1px solid #dee2e6 !important;\n}\n\n.border-top {\n border-top: 1px solid #dee2e6 !important;\n}\n\n.border-right {\n border-right: 1px solid #dee2e6 !important;\n}\n\n.border-bottom {\n border-bottom: 1px solid #dee2e6 !important;\n}\n\n.border-left {\n border-left: 1px solid #dee2e6 !important;\n}\n\n.border-0 {\n border: 0 !important;\n}\n\n.border-top-0 {\n border-top: 0 !important;\n}\n\n.border-right-0 {\n border-right: 0 !important;\n}\n\n.border-bottom-0 {\n border-bottom: 0 !important;\n}\n\n.border-left-0 {\n border-left: 0 !important;\n}\n\n.border-primary {\n border-color: #007bff !important;\n}\n\n.border-secondary {\n border-color: #6c757d !important;\n}\n\n.border-success {\n border-color: #28a745 !important;\n}\n\n.border-info {\n border-color: #17a2b8 !important;\n}\n\n.border-warning {\n border-color: #ffc107 !important;\n}\n\n.border-danger {\n border-color: #dc3545 !important;\n}\n\n.border-light {\n border-color: #f8f9fa !important;\n}\n\n.border-dark {\n border-color: #343a40 !important;\n}\n\n.border-white {\n border-color: #fff !important;\n}\n\n.rounded {\n border-radius: 0.25rem !important;\n}\n\n.rounded-top {\n border-top-left-radius: 0.25rem !important;\n border-top-right-radius: 0.25rem !important;\n}\n\n.rounded-right {\n border-top-right-radius: 0.25rem !important;\n border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-bottom {\n border-bottom-right-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-left {\n border-top-left-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-circle {\n border-radius: 50% !important;\n}\n\n.rounded-0 {\n border-radius: 0 !important;\n}\n\n.clearfix::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.d-none {\n display: none !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n}\n\n.d-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-none {\n display: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 768px) {\n .d-md-none {\n display: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-md-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 992px) {\n .d-lg-none {\n display: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1200px) {\n .d-xl-none {\n display: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media print {\n .d-print-none {\n display: none !important;\n }\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-print-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n.embed-responsive {\n position: relative;\n display: block;\n width: 100%;\n padding: 0;\n overflow: hidden;\n}\n\n.embed-responsive::before {\n display: block;\n content: \"\";\n}\n\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n\n.embed-responsive-21by9::before {\n padding-top: 42.857143%;\n}\n\n.embed-responsive-16by9::before {\n padding-top: 56.25%;\n}\n\n.embed-responsive-4by3::before {\n padding-top: 75%;\n}\n\n.embed-responsive-1by1::before {\n padding-top: 100%;\n}\n\n.flex-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n}\n\n.flex-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n}\n\n.justify-content-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n}\n\n.align-items-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n}\n\n.align-items-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n}\n\n.align-items-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n}\n\n.align-items-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n}\n\n.align-content-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n}\n\n.align-content-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n}\n\n.align-content-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n}\n\n.align-content-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n}\n\n.align-content-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n}\n\n.align-self-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n}\n\n.align-self-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n}\n\n.align-self-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n}\n\n.align-self-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n}\n\n.align-self-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n .flex-sm-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-sm-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-sm-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-sm-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-sm-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-sm-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-sm-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-sm-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-sm-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-sm-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-sm-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-sm-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .flex-md-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-md-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-md-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-md-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-md-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-md-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-md-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-md-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-md-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-md-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-md-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-md-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-md-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-md-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-md-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-md-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-md-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-md-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-md-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-md-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 992px) {\n .flex-lg-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-lg-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-lg-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-lg-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-lg-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-lg-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-lg-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-lg-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-lg-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-lg-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-lg-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-lg-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1200px) {\n .flex-xl-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-xl-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-xl-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-xl-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-xl-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-xl-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-xl-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-xl-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-xl-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-xl-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-xl-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-xl-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.float-none {\n float: none !important;\n}\n\n@media (min-width: 576px) {\n .float-sm-left {\n float: left !important;\n }\n .float-sm-right {\n float: right !important;\n }\n .float-sm-none {\n float: none !important;\n }\n}\n\n@media (min-width: 768px) {\n .float-md-left {\n float: left !important;\n }\n .float-md-right {\n float: right !important;\n }\n .float-md-none {\n float: none !important;\n }\n}\n\n@media (min-width: 992px) {\n .float-lg-left {\n float: left !important;\n }\n .float-lg-right {\n float: right !important;\n }\n .float-lg-none {\n float: none !important;\n }\n}\n\n@media (min-width: 1200px) {\n .float-xl-left {\n float: left !important;\n }\n .float-xl-right {\n float: right !important;\n }\n .float-xl-none {\n float: none !important;\n }\n}\n\n.position-static {\n position: static !important;\n}\n\n.position-relative {\n position: relative !important;\n}\n\n.position-absolute {\n position: absolute !important;\n}\n\n.position-fixed {\n position: fixed !important;\n}\n\n.position-sticky {\n position: -webkit-sticky !important;\n position: sticky !important;\n}\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1030;\n}\n\n@supports ((position: -webkit-sticky) or (position: sticky)) {\n .sticky-top {\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n}\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n overflow: visible;\n clip: auto;\n white-space: normal;\n}\n\n.shadow-sm {\n box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\n}\n\n.shadow {\n box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\n}\n\n.shadow-lg {\n box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\n}\n\n.shadow-none {\n box-shadow: none !important;\n}\n\n.w-25 {\n width: 25% !important;\n}\n\n.w-50 {\n width: 50% !important;\n}\n\n.w-75 {\n width: 75% !important;\n}\n\n.w-100 {\n width: 100% !important;\n}\n\n.w-auto {\n width: auto !important;\n}\n\n.h-25 {\n height: 25% !important;\n}\n\n.h-50 {\n height: 50% !important;\n}\n\n.h-75 {\n height: 75% !important;\n}\n\n.h-100 {\n height: 100% !important;\n}\n\n.h-auto {\n height: auto !important;\n}\n\n.mw-100 {\n max-width: 100% !important;\n}\n\n.mh-100 {\n max-height: 100% !important;\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n margin-left: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.mt-1,\n.my-1 {\n margin-top: 0.25rem !important;\n}\n\n.mr-1,\n.mx-1 {\n margin-right: 0.25rem !important;\n}\n\n.mb-1,\n.my-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.ml-1,\n.mx-1 {\n margin-left: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.mt-2,\n.my-2 {\n margin-top: 0.5rem !important;\n}\n\n.mr-2,\n.mx-2 {\n margin-right: 0.5rem !important;\n}\n\n.mb-2,\n.my-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.ml-2,\n.mx-2 {\n margin-left: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.mt-3,\n.my-3 {\n margin-top: 1rem !important;\n}\n\n.mr-3,\n.mx-3 {\n margin-right: 1rem !important;\n}\n\n.mb-3,\n.my-3 {\n margin-bottom: 1rem !important;\n}\n\n.ml-3,\n.mx-3 {\n margin-left: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.mt-4,\n.my-4 {\n margin-top: 1.5rem !important;\n}\n\n.mr-4,\n.mx-4 {\n margin-right: 1.5rem !important;\n}\n\n.mb-4,\n.my-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.ml-4,\n.mx-4 {\n margin-left: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.mt-5,\n.my-5 {\n margin-top: 3rem !important;\n}\n\n.mr-5,\n.mx-5 {\n margin-right: 3rem !important;\n}\n\n.mb-5,\n.my-5 {\n margin-bottom: 3rem !important;\n}\n\n.ml-5,\n.mx-5 {\n margin-left: 3rem !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n padding-left: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.pt-1,\n.py-1 {\n padding-top: 0.25rem !important;\n}\n\n.pr-1,\n.px-1 {\n padding-right: 0.25rem !important;\n}\n\n.pb-1,\n.py-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pl-1,\n.px-1 {\n padding-left: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.pt-2,\n.py-2 {\n padding-top: 0.5rem !important;\n}\n\n.pr-2,\n.px-2 {\n padding-right: 0.5rem !important;\n}\n\n.pb-2,\n.py-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pl-2,\n.px-2 {\n padding-left: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.pt-3,\n.py-3 {\n padding-top: 1rem !important;\n}\n\n.pr-3,\n.px-3 {\n padding-right: 1rem !important;\n}\n\n.pb-3,\n.py-3 {\n padding-bottom: 1rem !important;\n}\n\n.pl-3,\n.px-3 {\n padding-left: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.pt-4,\n.py-4 {\n padding-top: 1.5rem !important;\n}\n\n.pr-4,\n.px-4 {\n padding-right: 1.5rem !important;\n}\n\n.pb-4,\n.py-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pl-4,\n.px-4 {\n padding-left: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.pt-5,\n.py-5 {\n padding-top: 3rem !important;\n}\n\n.pr-5,\n.px-5 {\n padding-right: 3rem !important;\n}\n\n.pb-5,\n.py-5 {\n padding-bottom: 3rem !important;\n}\n\n.pl-5,\n.px-5 {\n padding-left: 3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n margin-left: auto !important;\n}\n\n@media (min-width: 576px) {\n .m-sm-0 {\n margin: 0 !important;\n }\n .mt-sm-0,\n .my-sm-0 {\n margin-top: 0 !important;\n }\n .mr-sm-0,\n .mx-sm-0 {\n margin-right: 0 !important;\n }\n .mb-sm-0,\n .my-sm-0 {\n margin-bottom: 0 !important;\n }\n .ml-sm-0,\n .mx-sm-0 {\n margin-left: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .mt-sm-1,\n .my-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mr-sm-1,\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n }\n .mb-sm-1,\n .my-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-sm-1,\n .mx-sm-1 {\n margin-left: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .mt-sm-2,\n .my-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mr-sm-2,\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n }\n .mb-sm-2,\n .my-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-sm-2,\n .mx-sm-2 {\n margin-left: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .mt-sm-3,\n .my-sm-3 {\n margin-top: 1rem !important;\n }\n .mr-sm-3,\n .mx-sm-3 {\n margin-right: 1rem !important;\n }\n .mb-sm-3,\n .my-sm-3 {\n margin-bottom: 1rem !important;\n }\n .ml-sm-3,\n .mx-sm-3 {\n margin-left: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .mt-sm-4,\n .my-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mr-sm-4,\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n }\n .mb-sm-4,\n .my-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-sm-4,\n .mx-sm-4 {\n margin-left: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .mt-sm-5,\n .my-sm-5 {\n margin-top: 3rem !important;\n }\n .mr-sm-5,\n .mx-sm-5 {\n margin-right: 3rem !important;\n }\n .mb-sm-5,\n .my-sm-5 {\n margin-bottom: 3rem !important;\n }\n .ml-sm-5,\n .mx-sm-5 {\n margin-left: 3rem !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .pt-sm-0,\n .py-sm-0 {\n padding-top: 0 !important;\n }\n .pr-sm-0,\n .px-sm-0 {\n padding-right: 0 !important;\n }\n .pb-sm-0,\n .py-sm-0 {\n padding-bottom: 0 !important;\n }\n .pl-sm-0,\n .px-sm-0 {\n padding-left: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .pt-sm-1,\n .py-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pr-sm-1,\n .px-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pb-sm-1,\n .py-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-sm-1,\n .px-sm-1 {\n padding-left: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .pt-sm-2,\n .py-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pr-sm-2,\n .px-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pb-sm-2,\n .py-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-sm-2,\n .px-sm-2 {\n padding-left: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .pt-sm-3,\n .py-sm-3 {\n padding-top: 1rem !important;\n }\n .pr-sm-3,\n .px-sm-3 {\n padding-right: 1rem !important;\n }\n .pb-sm-3,\n .py-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pl-sm-3,\n .px-sm-3 {\n padding-left: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .pt-sm-4,\n .py-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pr-sm-4,\n .px-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pb-sm-4,\n .py-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-sm-4,\n .px-sm-4 {\n padding-left: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .pt-sm-5,\n .py-sm-5 {\n padding-top: 3rem !important;\n }\n .pr-sm-5,\n .px-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-5,\n .py-sm-5 {\n padding-bottom: 3rem !important;\n }\n .pl-sm-5,\n .px-sm-5 {\n padding-left: 3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mt-sm-auto,\n .my-sm-auto {\n margin-top: auto !important;\n }\n .mr-sm-auto,\n .mx-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-auto,\n .my-sm-auto {\n margin-bottom: auto !important;\n }\n .ml-sm-auto,\n .mx-sm-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 768px) {\n .m-md-0 {\n margin: 0 !important;\n }\n .mt-md-0,\n .my-md-0 {\n margin-top: 0 !important;\n }\n .mr-md-0,\n .mx-md-0 {\n margin-right: 0 !important;\n }\n .mb-md-0,\n .my-md-0 {\n margin-bottom: 0 !important;\n }\n .ml-md-0,\n .mx-md-0 {\n margin-left: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .mt-md-1,\n .my-md-1 {\n margin-top: 0.25rem !important;\n }\n .mr-md-1,\n .mx-md-1 {\n margin-right: 0.25rem !important;\n }\n .mb-md-1,\n .my-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-md-1,\n .mx-md-1 {\n margin-left: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .mt-md-2,\n .my-md-2 {\n margin-top: 0.5rem !important;\n }\n .mr-md-2,\n .mx-md-2 {\n margin-right: 0.5rem !important;\n }\n .mb-md-2,\n .my-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-md-2,\n .mx-md-2 {\n margin-left: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .mt-md-3,\n .my-md-3 {\n margin-top: 1rem !important;\n }\n .mr-md-3,\n .mx-md-3 {\n margin-right: 1rem !important;\n }\n .mb-md-3,\n .my-md-3 {\n margin-bottom: 1rem !important;\n }\n .ml-md-3,\n .mx-md-3 {\n margin-left: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .mt-md-4,\n .my-md-4 {\n margin-top: 1.5rem !important;\n }\n .mr-md-4,\n .mx-md-4 {\n margin-right: 1.5rem !important;\n }\n .mb-md-4,\n .my-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-md-4,\n .mx-md-4 {\n margin-left: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .mt-md-5,\n .my-md-5 {\n margin-top: 3rem !important;\n }\n .mr-md-5,\n .mx-md-5 {\n margin-right: 3rem !important;\n }\n .mb-md-5,\n .my-md-5 {\n margin-bottom: 3rem !important;\n }\n .ml-md-5,\n .mx-md-5 {\n margin-left: 3rem !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .pt-md-0,\n .py-md-0 {\n padding-top: 0 !important;\n }\n .pr-md-0,\n .px-md-0 {\n padding-right: 0 !important;\n }\n .pb-md-0,\n .py-md-0 {\n padding-bottom: 0 !important;\n }\n .pl-md-0,\n .px-md-0 {\n padding-left: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .pt-md-1,\n .py-md-1 {\n padding-top: 0.25rem !important;\n }\n .pr-md-1,\n .px-md-1 {\n padding-right: 0.25rem !important;\n }\n .pb-md-1,\n .py-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-md-1,\n .px-md-1 {\n padding-left: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .pt-md-2,\n .py-md-2 {\n padding-top: 0.5rem !important;\n }\n .pr-md-2,\n .px-md-2 {\n padding-right: 0.5rem !important;\n }\n .pb-md-2,\n .py-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-md-2,\n .px-md-2 {\n padding-left: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .pt-md-3,\n .py-md-3 {\n padding-top: 1rem !important;\n }\n .pr-md-3,\n .px-md-3 {\n padding-right: 1rem !important;\n }\n .pb-md-3,\n .py-md-3 {\n padding-bottom: 1rem !important;\n }\n .pl-md-3,\n .px-md-3 {\n padding-left: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .pt-md-4,\n .py-md-4 {\n padding-top: 1.5rem !important;\n }\n .pr-md-4,\n .px-md-4 {\n padding-right: 1.5rem !important;\n }\n .pb-md-4,\n .py-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-md-4,\n .px-md-4 {\n padding-left: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .pt-md-5,\n .py-md-5 {\n padding-top: 3rem !important;\n }\n .pr-md-5,\n .px-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-5,\n .py-md-5 {\n padding-bottom: 3rem !important;\n }\n .pl-md-5,\n .px-md-5 {\n padding-left: 3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mt-md-auto,\n .my-md-auto {\n margin-top: auto !important;\n }\n .mr-md-auto,\n .mx-md-auto {\n margin-right: auto !important;\n }\n .mb-md-auto,\n .my-md-auto {\n margin-bottom: auto !important;\n }\n .ml-md-auto,\n .mx-md-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 992px) {\n .m-lg-0 {\n margin: 0 !important;\n }\n .mt-lg-0,\n .my-lg-0 {\n margin-top: 0 !important;\n }\n .mr-lg-0,\n .mx-lg-0 {\n margin-right: 0 !important;\n }\n .mb-lg-0,\n .my-lg-0 {\n margin-bottom: 0 !important;\n }\n .ml-lg-0,\n .mx-lg-0 {\n margin-left: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .mt-lg-1,\n .my-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mr-lg-1,\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n }\n .mb-lg-1,\n .my-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-lg-1,\n .mx-lg-1 {\n margin-left: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .mt-lg-2,\n .my-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mr-lg-2,\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n }\n .mb-lg-2,\n .my-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-lg-2,\n .mx-lg-2 {\n margin-left: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .mt-lg-3,\n .my-lg-3 {\n margin-top: 1rem !important;\n }\n .mr-lg-3,\n .mx-lg-3 {\n margin-right: 1rem !important;\n }\n .mb-lg-3,\n .my-lg-3 {\n margin-bottom: 1rem !important;\n }\n .ml-lg-3,\n .mx-lg-3 {\n margin-left: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .mt-lg-4,\n .my-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mr-lg-4,\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n }\n .mb-lg-4,\n .my-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-lg-4,\n .mx-lg-4 {\n margin-left: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .mt-lg-5,\n .my-lg-5 {\n margin-top: 3rem !important;\n }\n .mr-lg-5,\n .mx-lg-5 {\n margin-right: 3rem !important;\n }\n .mb-lg-5,\n .my-lg-5 {\n margin-bottom: 3rem !important;\n }\n .ml-lg-5,\n .mx-lg-5 {\n margin-left: 3rem !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .pt-lg-0,\n .py-lg-0 {\n padding-top: 0 !important;\n }\n .pr-lg-0,\n .px-lg-0 {\n padding-right: 0 !important;\n }\n .pb-lg-0,\n .py-lg-0 {\n padding-bottom: 0 !important;\n }\n .pl-lg-0,\n .px-lg-0 {\n padding-left: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .pt-lg-1,\n .py-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pr-lg-1,\n .px-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pb-lg-1,\n .py-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-lg-1,\n .px-lg-1 {\n padding-left: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .pt-lg-2,\n .py-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pr-lg-2,\n .px-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pb-lg-2,\n .py-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-lg-2,\n .px-lg-2 {\n padding-left: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .pt-lg-3,\n .py-lg-3 {\n padding-top: 1rem !important;\n }\n .pr-lg-3,\n .px-lg-3 {\n padding-right: 1rem !important;\n }\n .pb-lg-3,\n .py-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pl-lg-3,\n .px-lg-3 {\n padding-left: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .pt-lg-4,\n .py-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pr-lg-4,\n .px-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pb-lg-4,\n .py-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-lg-4,\n .px-lg-4 {\n padding-left: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .pt-lg-5,\n .py-lg-5 {\n padding-top: 3rem !important;\n }\n .pr-lg-5,\n .px-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-5,\n .py-lg-5 {\n padding-bottom: 3rem !important;\n }\n .pl-lg-5,\n .px-lg-5 {\n padding-left: 3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mt-lg-auto,\n .my-lg-auto {\n margin-top: auto !important;\n }\n .mr-lg-auto,\n .mx-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-auto,\n .my-lg-auto {\n margin-bottom: auto !important;\n }\n .ml-lg-auto,\n .mx-lg-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 1200px) {\n .m-xl-0 {\n margin: 0 !important;\n }\n .mt-xl-0,\n .my-xl-0 {\n margin-top: 0 !important;\n }\n .mr-xl-0,\n .mx-xl-0 {\n margin-right: 0 !important;\n }\n .mb-xl-0,\n .my-xl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xl-0,\n .mx-xl-0 {\n margin-left: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .mt-xl-1,\n .my-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mr-xl-1,\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n }\n .mb-xl-1,\n .my-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-xl-1,\n .mx-xl-1 {\n margin-left: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .mt-xl-2,\n .my-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mr-xl-2,\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n }\n .mb-xl-2,\n .my-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-xl-2,\n .mx-xl-2 {\n margin-left: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .mt-xl-3,\n .my-xl-3 {\n margin-top: 1rem !important;\n }\n .mr-xl-3,\n .mx-xl-3 {\n margin-right: 1rem !important;\n }\n .mb-xl-3,\n .my-xl-3 {\n margin-bottom: 1rem !important;\n }\n .ml-xl-3,\n .mx-xl-3 {\n margin-left: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .mt-xl-4,\n .my-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mr-xl-4,\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n }\n .mb-xl-4,\n .my-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-xl-4,\n .mx-xl-4 {\n margin-left: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .mt-xl-5,\n .my-xl-5 {\n margin-top: 3rem !important;\n }\n .mr-xl-5,\n .mx-xl-5 {\n margin-right: 3rem !important;\n }\n .mb-xl-5,\n .my-xl-5 {\n margin-bottom: 3rem !important;\n }\n .ml-xl-5,\n .mx-xl-5 {\n margin-left: 3rem !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .pt-xl-0,\n .py-xl-0 {\n padding-top: 0 !important;\n }\n .pr-xl-0,\n .px-xl-0 {\n padding-right: 0 !important;\n }\n .pb-xl-0,\n .py-xl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xl-0,\n .px-xl-0 {\n padding-left: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .pt-xl-1,\n .py-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pr-xl-1,\n .px-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pb-xl-1,\n .py-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-xl-1,\n .px-xl-1 {\n padding-left: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .pt-xl-2,\n .py-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pr-xl-2,\n .px-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pb-xl-2,\n .py-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-xl-2,\n .px-xl-2 {\n padding-left: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .pt-xl-3,\n .py-xl-3 {\n padding-top: 1rem !important;\n }\n .pr-xl-3,\n .px-xl-3 {\n padding-right: 1rem !important;\n }\n .pb-xl-3,\n .py-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pl-xl-3,\n .px-xl-3 {\n padding-left: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .pt-xl-4,\n .py-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pr-xl-4,\n .px-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pb-xl-4,\n .py-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-xl-4,\n .px-xl-4 {\n padding-left: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .pt-xl-5,\n .py-xl-5 {\n padding-top: 3rem !important;\n }\n .pr-xl-5,\n .px-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-5,\n .py-xl-5 {\n padding-bottom: 3rem !important;\n }\n .pl-xl-5,\n .px-xl-5 {\n padding-left: 3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mt-xl-auto,\n .my-xl-auto {\n margin-top: auto !important;\n }\n .mr-xl-auto,\n .mx-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-auto,\n .my-xl-auto {\n margin-bottom: auto !important;\n }\n .ml-xl-auto,\n .mx-xl-auto {\n margin-left: auto !important;\n }\n}\n\n.text-monospace {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n.text-justify {\n text-align: justify !important;\n}\n\n.text-nowrap {\n white-space: nowrap !important;\n}\n\n.text-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n@media (min-width: 576px) {\n .text-sm-left {\n text-align: left !important;\n }\n .text-sm-right {\n text-align: right !important;\n }\n .text-sm-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 768px) {\n .text-md-left {\n text-align: left !important;\n }\n .text-md-right {\n text-align: right !important;\n }\n .text-md-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 992px) {\n .text-lg-left {\n text-align: left !important;\n }\n .text-lg-right {\n text-align: right !important;\n }\n .text-lg-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 1200px) {\n .text-xl-left {\n text-align: left !important;\n }\n .text-xl-right {\n text-align: right !important;\n }\n .text-xl-center {\n text-align: center !important;\n }\n}\n\n.text-lowercase {\n text-transform: lowercase !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n\n.text-capitalize {\n text-transform: capitalize !important;\n}\n\n.font-weight-light {\n font-weight: 300 !important;\n}\n\n.font-weight-normal {\n font-weight: 400 !important;\n}\n\n.font-weight-bold {\n font-weight: 700 !important;\n}\n\n.font-italic {\n font-style: italic !important;\n}\n\n.text-white {\n color: #fff !important;\n}\n\n.text-primary {\n color: #007bff !important;\n}\n\na.text-primary:hover, a.text-primary:focus {\n color: #0062cc !important;\n}\n\n.text-secondary {\n color: #6c757d !important;\n}\n\na.text-secondary:hover, a.text-secondary:focus {\n color: #545b62 !important;\n}\n\n.text-success {\n color: #28a745 !important;\n}\n\na.text-success:hover, a.text-success:focus {\n color: #1e7e34 !important;\n}\n\n.text-info {\n color: #17a2b8 !important;\n}\n\na.text-info:hover, a.text-info:focus {\n color: #117a8b !important;\n}\n\n.text-warning {\n color: #ffc107 !important;\n}\n\na.text-warning:hover, a.text-warning:focus {\n color: #d39e00 !important;\n}\n\n.text-danger {\n color: #dc3545 !important;\n}\n\na.text-danger:hover, a.text-danger:focus {\n color: #bd2130 !important;\n}\n\n.text-light {\n color: #f8f9fa !important;\n}\n\na.text-light:hover, a.text-light:focus {\n color: #dae0e5 !important;\n}\n\n.text-dark {\n color: #343a40 !important;\n}\n\na.text-dark:hover, a.text-dark:focus {\n color: #1d2124 !important;\n}\n\n.text-body {\n color: #212529 !important;\n}\n\n.text-muted {\n color: #6c757d !important;\n}\n\n.text-black-50 {\n color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n\n@media print {\n *,\n *::before,\n *::after {\n text-shadow: none !important;\n box-shadow: none !important;\n }\n a:not(.btn) {\n text-decoration: underline;\n }\n abbr[title]::after {\n content: \" (\" attr(title) \")\";\n }\n pre {\n white-space: pre-wrap !important;\n }\n pre,\n blockquote {\n border: 1px solid #adb5bd;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n @page {\n size: a3;\n }\n body {\n min-width: 992px !important;\n }\n .container {\n min-width: 992px !important;\n }\n .navbar {\n display: none;\n }\n .badge {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #dee2e6 !important;\n }\n .table-dark {\n color: inherit;\n }\n .table-dark th,\n .table-dark td,\n .table-dark thead th,\n .table-dark tbody + tbody {\n border-color: #dee2e6;\n }\n .table .thead-dark th {\n color: inherit;\n border-color: #dee2e6;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","/*!\n * Bootstrap v4.1.1 (https://getbootstrap.com/)\n * Copyright 2011-2018 The Bootstrap Authors\n * Copyright 2011-2018 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n:root {\n --blue: #007bff;\n --indigo: #6610f2;\n --purple: #6f42c1;\n --pink: #e83e8c;\n --red: #dc3545;\n --orange: #fd7e14;\n --yellow: #ffc107;\n --green: #28a745;\n --teal: #20c997;\n --cyan: #17a2b8;\n --white: #fff;\n --gray: #6c757d;\n --gray-dark: #343a40;\n --primary: #007bff;\n --secondary: #6c757d;\n --success: #28a745;\n --info: #17a2b8;\n --warning: #ffc107;\n --danger: #dc3545;\n --light: #f8f9fa;\n --dark: #343a40;\n --breakpoint-xs: 0;\n --breakpoint-sm: 576px;\n --breakpoint-md: 768px;\n --breakpoint-lg: 992px;\n --breakpoint-xl: 1200px;\n --font-family-sans-serif: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -ms-text-size-adjust: 100%;\n -ms-overflow-style: scrollbar;\n -webkit-tap-highlight-color: transparent;\n}\n\n@-ms-viewport {\n width: device-width;\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n text-align: left;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: 0.5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\ndfn {\n font-style: italic;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #007bff;\n text-decoration: none;\n background-color: transparent;\n -webkit-text-decoration-skip: objects;\n}\n\na:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n -ms-overflow-style: scrollbar;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #6c757d;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: inherit;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: 0.5rem;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nbutton,\nhtml [type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-cancel-button,\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: 0.5rem;\n font-family: inherit;\n font-weight: 500;\n line-height: 1.2;\n color: inherit;\n}\n\nh1, .h1 {\n font-size: 2.5rem;\n}\n\nh2, .h2 {\n font-size: 2rem;\n}\n\nh3, .h3 {\n font-size: 1.75rem;\n}\n\nh4, .h4 {\n font-size: 1.5rem;\n}\n\nh5, .h5 {\n font-size: 1.25rem;\n}\n\nh6, .h6 {\n font-size: 1rem;\n}\n\n.lead {\n font-size: 1.25rem;\n font-weight: 300;\n}\n\n.display-1 {\n font-size: 6rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\n.display-2 {\n font-size: 5.5rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\n.display-3 {\n font-size: 4.5rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\n.display-4 {\n font-size: 3.5rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\nhr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n border: 0;\n border-top: 1px solid rgba(0, 0, 0, 0.1);\n}\n\nsmall,\n.small {\n font-size: 80%;\n font-weight: 400;\n}\n\nmark,\n.mark {\n padding: 0.2em;\n background-color: #fcf8e3;\n}\n\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline-item {\n display: inline-block;\n}\n\n.list-inline-item:not(:last-child) {\n margin-right: 0.5rem;\n}\n\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n.blockquote {\n margin-bottom: 1rem;\n font-size: 1.25rem;\n}\n\n.blockquote-footer {\n display: block;\n font-size: 80%;\n color: #6c757d;\n}\n\n.blockquote-footer::before {\n content: \"\\2014 \\00A0\";\n}\n\n.img-fluid {\n max-width: 100%;\n height: auto;\n}\n\n.img-thumbnail {\n padding: 0.25rem;\n background-color: #fff;\n border: 1px solid #dee2e6;\n border-radius: 0.25rem;\n max-width: 100%;\n height: auto;\n}\n\n.figure {\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: 0.5rem;\n line-height: 1;\n}\n\n.figure-caption {\n font-size: 90%;\n color: #6c757d;\n}\n\ncode {\n font-size: 87.5%;\n color: #e83e8c;\n word-break: break-word;\n}\n\na > code {\n color: inherit;\n}\n\nkbd {\n padding: 0.2rem 0.4rem;\n font-size: 87.5%;\n color: #fff;\n background-color: #212529;\n border-radius: 0.2rem;\n}\n\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: 700;\n}\n\npre {\n display: block;\n font-size: 87.5%;\n color: #212529;\n}\n\npre code {\n font-size: inherit;\n color: inherit;\n word-break: normal;\n}\n\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n\n.container {\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 576px) {\n .container {\n max-width: 540px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n max-width: 720px;\n }\n}\n\n@media (min-width: 992px) {\n .container {\n max-width: 960px;\n }\n}\n\n@media (min-width: 1200px) {\n .container {\n max-width: 1140px;\n }\n}\n\n.container-fluid {\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n\n.row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -15px;\n margin-left: -15px;\n}\n\n.no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n position: relative;\n width: 100%;\n min-height: 1px;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n.col {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: none;\n}\n\n.col-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n}\n\n.col-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-3 {\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.col-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.col-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n}\n\n.col-6 {\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.col-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n}\n\n.col-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n}\n\n.col-9 {\n flex: 0 0 75%;\n max-width: 75%;\n}\n\n.col-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n}\n\n.col-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n}\n\n.col-12 {\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.order-first {\n order: -1;\n}\n\n.order-last {\n order: 13;\n}\n\n.order-0 {\n order: 0;\n}\n\n.order-1 {\n order: 1;\n}\n\n.order-2 {\n order: 2;\n}\n\n.order-3 {\n order: 3;\n}\n\n.order-4 {\n order: 4;\n}\n\n.order-5 {\n order: 5;\n}\n\n.order-6 {\n order: 6;\n}\n\n.order-7 {\n order: 7;\n}\n\n.order-8 {\n order: 8;\n}\n\n.order-9 {\n order: 9;\n}\n\n.order-10 {\n order: 10;\n}\n\n.order-11 {\n order: 11;\n}\n\n.order-12 {\n order: 12;\n}\n\n.offset-1 {\n margin-left: 8.333333%;\n}\n\n.offset-2 {\n margin-left: 16.666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.333333%;\n}\n\n.offset-5 {\n margin-left: 41.666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.333333%;\n}\n\n.offset-8 {\n margin-left: 66.666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.333333%;\n}\n\n.offset-11 {\n margin-left: 91.666667%;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: none;\n }\n .col-sm-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-sm-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-sm-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-sm-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-sm-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-sm-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-sm-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-sm-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-sm-first {\n order: -1;\n }\n .order-sm-last {\n order: 13;\n }\n .order-sm-0 {\n order: 0;\n }\n .order-sm-1 {\n order: 1;\n }\n .order-sm-2 {\n order: 2;\n }\n .order-sm-3 {\n order: 3;\n }\n .order-sm-4 {\n order: 4;\n }\n .order-sm-5 {\n order: 5;\n }\n .order-sm-6 {\n order: 6;\n }\n .order-sm-7 {\n order: 7;\n }\n .order-sm-8 {\n order: 8;\n }\n .order-sm-9 {\n order: 9;\n }\n .order-sm-10 {\n order: 10;\n }\n .order-sm-11 {\n order: 11;\n }\n .order-sm-12 {\n order: 12;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.333333%;\n }\n .offset-sm-2 {\n margin-left: 16.666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.333333%;\n }\n .offset-sm-5 {\n margin-left: 41.666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.333333%;\n }\n .offset-sm-8 {\n margin-left: 66.666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.333333%;\n }\n .offset-sm-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: none;\n }\n .col-md-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-md-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-md-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-md-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-md-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-md-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-md-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-md-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-md-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-md-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-md-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-md-first {\n order: -1;\n }\n .order-md-last {\n order: 13;\n }\n .order-md-0 {\n order: 0;\n }\n .order-md-1 {\n order: 1;\n }\n .order-md-2 {\n order: 2;\n }\n .order-md-3 {\n order: 3;\n }\n .order-md-4 {\n order: 4;\n }\n .order-md-5 {\n order: 5;\n }\n .order-md-6 {\n order: 6;\n }\n .order-md-7 {\n order: 7;\n }\n .order-md-8 {\n order: 8;\n }\n .order-md-9 {\n order: 9;\n }\n .order-md-10 {\n order: 10;\n }\n .order-md-11 {\n order: 11;\n }\n .order-md-12 {\n order: 12;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.333333%;\n }\n .offset-md-2 {\n margin-left: 16.666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.333333%;\n }\n .offset-md-5 {\n margin-left: 41.666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.333333%;\n }\n .offset-md-8 {\n margin-left: 66.666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.333333%;\n }\n .offset-md-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 992px) {\n .col-lg {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: none;\n }\n .col-lg-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-lg-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-lg-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-lg-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-lg-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-lg-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-lg-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-lg-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-lg-first {\n order: -1;\n }\n .order-lg-last {\n order: 13;\n }\n .order-lg-0 {\n order: 0;\n }\n .order-lg-1 {\n order: 1;\n }\n .order-lg-2 {\n order: 2;\n }\n .order-lg-3 {\n order: 3;\n }\n .order-lg-4 {\n order: 4;\n }\n .order-lg-5 {\n order: 5;\n }\n .order-lg-6 {\n order: 6;\n }\n .order-lg-7 {\n order: 7;\n }\n .order-lg-8 {\n order: 8;\n }\n .order-lg-9 {\n order: 9;\n }\n .order-lg-10 {\n order: 10;\n }\n .order-lg-11 {\n order: 11;\n }\n .order-lg-12 {\n order: 12;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.333333%;\n }\n .offset-lg-2 {\n margin-left: 16.666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.333333%;\n }\n .offset-lg-5 {\n margin-left: 41.666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.333333%;\n }\n .offset-lg-8 {\n margin-left: 66.666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.333333%;\n }\n .offset-lg-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1200px) {\n .col-xl {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: none;\n }\n .col-xl-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xl-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xl-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xl-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xl-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xl-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xl-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xl-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xl-first {\n order: -1;\n }\n .order-xl-last {\n order: 13;\n }\n .order-xl-0 {\n order: 0;\n }\n .order-xl-1 {\n order: 1;\n }\n .order-xl-2 {\n order: 2;\n }\n .order-xl-3 {\n order: 3;\n }\n .order-xl-4 {\n order: 4;\n }\n .order-xl-5 {\n order: 5;\n }\n .order-xl-6 {\n order: 6;\n }\n .order-xl-7 {\n order: 7;\n }\n .order-xl-8 {\n order: 8;\n }\n .order-xl-9 {\n order: 9;\n }\n .order-xl-10 {\n order: 10;\n }\n .order-xl-11 {\n order: 11;\n }\n .order-xl-12 {\n order: 12;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.333333%;\n }\n .offset-xl-2 {\n margin-left: 16.666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.333333%;\n }\n .offset-xl-5 {\n margin-left: 41.666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.333333%;\n }\n .offset-xl-8 {\n margin-left: 66.666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.333333%;\n }\n .offset-xl-11 {\n margin-left: 91.666667%;\n }\n}\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 1rem;\n background-color: transparent;\n}\n\n.table th,\n.table td {\n padding: 0.75rem;\n vertical-align: top;\n border-top: 1px solid #dee2e6;\n}\n\n.table thead th {\n vertical-align: bottom;\n border-bottom: 2px solid #dee2e6;\n}\n\n.table tbody + tbody {\n border-top: 2px solid #dee2e6;\n}\n\n.table .table {\n background-color: #fff;\n}\n\n.table-sm th,\n.table-sm td {\n padding: 0.3rem;\n}\n\n.table-bordered {\n border: 1px solid #dee2e6;\n}\n\n.table-bordered th,\n.table-bordered td {\n border: 1px solid #dee2e6;\n}\n\n.table-bordered thead th,\n.table-bordered thead td {\n border-bottom-width: 2px;\n}\n\n.table-borderless th,\n.table-borderless td,\n.table-borderless thead th,\n.table-borderless tbody + tbody {\n border: 0;\n}\n\n.table-striped tbody tr:nth-of-type(odd) {\n background-color: rgba(0, 0, 0, 0.05);\n}\n\n.table-hover tbody tr:hover {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-primary,\n.table-primary > th,\n.table-primary > td {\n background-color: #b8daff;\n}\n\n.table-hover .table-primary:hover {\n background-color: #9fcdff;\n}\n\n.table-hover .table-primary:hover > td,\n.table-hover .table-primary:hover > th {\n background-color: #9fcdff;\n}\n\n.table-secondary,\n.table-secondary > th,\n.table-secondary > td {\n background-color: #d6d8db;\n}\n\n.table-hover .table-secondary:hover {\n background-color: #c8cbcf;\n}\n\n.table-hover .table-secondary:hover > td,\n.table-hover .table-secondary:hover > th {\n background-color: #c8cbcf;\n}\n\n.table-success,\n.table-success > th,\n.table-success > td {\n background-color: #c3e6cb;\n}\n\n.table-hover .table-success:hover {\n background-color: #b1dfbb;\n}\n\n.table-hover .table-success:hover > td,\n.table-hover .table-success:hover > th {\n background-color: #b1dfbb;\n}\n\n.table-info,\n.table-info > th,\n.table-info > td {\n background-color: #bee5eb;\n}\n\n.table-hover .table-info:hover {\n background-color: #abdde5;\n}\n\n.table-hover .table-info:hover > td,\n.table-hover .table-info:hover > th {\n background-color: #abdde5;\n}\n\n.table-warning,\n.table-warning > th,\n.table-warning > td {\n background-color: #ffeeba;\n}\n\n.table-hover .table-warning:hover {\n background-color: #ffe8a1;\n}\n\n.table-hover .table-warning:hover > td,\n.table-hover .table-warning:hover > th {\n background-color: #ffe8a1;\n}\n\n.table-danger,\n.table-danger > th,\n.table-danger > td {\n background-color: #f5c6cb;\n}\n\n.table-hover .table-danger:hover {\n background-color: #f1b0b7;\n}\n\n.table-hover .table-danger:hover > td,\n.table-hover .table-danger:hover > th {\n background-color: #f1b0b7;\n}\n\n.table-light,\n.table-light > th,\n.table-light > td {\n background-color: #fdfdfe;\n}\n\n.table-hover .table-light:hover {\n background-color: #ececf6;\n}\n\n.table-hover .table-light:hover > td,\n.table-hover .table-light:hover > th {\n background-color: #ececf6;\n}\n\n.table-dark,\n.table-dark > th,\n.table-dark > td {\n background-color: #c6c8ca;\n}\n\n.table-hover .table-dark:hover {\n background-color: #b9bbbe;\n}\n\n.table-hover .table-dark:hover > td,\n.table-hover .table-dark:hover > th {\n background-color: #b9bbbe;\n}\n\n.table-active,\n.table-active > th,\n.table-active > td {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover > td,\n.table-hover .table-active:hover > th {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table .thead-dark th {\n color: #fff;\n background-color: #212529;\n border-color: #32383e;\n}\n\n.table .thead-light th {\n color: #495057;\n background-color: #e9ecef;\n border-color: #dee2e6;\n}\n\n.table-dark {\n color: #fff;\n background-color: #212529;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th {\n border-color: #32383e;\n}\n\n.table-dark.table-bordered {\n border: 0;\n}\n\n.table-dark.table-striped tbody tr:nth-of-type(odd) {\n background-color: rgba(255, 255, 255, 0.05);\n}\n\n.table-dark.table-hover tbody tr:hover {\n background-color: rgba(255, 255, 255, 0.075);\n}\n\n@media (max-width: 575.98px) {\n .table-responsive-sm {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n }\n .table-responsive-sm > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 767.98px) {\n .table-responsive-md {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n }\n .table-responsive-md > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 991.98px) {\n .table-responsive-lg {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n }\n .table-responsive-lg > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 1199.98px) {\n .table-responsive-xl {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n }\n .table-responsive-xl > .table-bordered {\n border: 0;\n }\n}\n\n.table-responsive {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n}\n\n.table-responsive > .table-bordered {\n border: 0;\n}\n\n.form-control {\n display: block;\n width: 100%;\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n line-height: 1.5;\n color: #495057;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media screen and (prefers-reduced-motion: reduce) {\n .form-control {\n transition: none;\n }\n}\n\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n\n.form-control:focus {\n color: #495057;\n background-color: #fff;\n border-color: #80bdff;\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.form-control::placeholder {\n color: #6c757d;\n opacity: 1;\n}\n\n.form-control:disabled, .form-control[readonly] {\n background-color: #e9ecef;\n opacity: 1;\n}\n\nselect.form-control:not([size]):not([multiple]) {\n height: calc(2.25rem + 2px);\n}\n\nselect.form-control:focus::-ms-value {\n color: #495057;\n background-color: #fff;\n}\n\n.form-control-file,\n.form-control-range {\n display: block;\n width: 100%;\n}\n\n.col-form-label {\n padding-top: calc(0.375rem + 1px);\n padding-bottom: calc(0.375rem + 1px);\n margin-bottom: 0;\n font-size: inherit;\n line-height: 1.5;\n}\n\n.col-form-label-lg {\n padding-top: calc(0.5rem + 1px);\n padding-bottom: calc(0.5rem + 1px);\n font-size: 1.25rem;\n line-height: 1.5;\n}\n\n.col-form-label-sm {\n padding-top: calc(0.25rem + 1px);\n padding-bottom: calc(0.25rem + 1px);\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.form-control-plaintext {\n display: block;\n width: 100%;\n padding-top: 0.375rem;\n padding-bottom: 0.375rem;\n margin-bottom: 0;\n line-height: 1.5;\n color: #212529;\n background-color: transparent;\n border: solid transparent;\n border-width: 1px 0;\n}\n\n.form-control-plaintext.form-control-sm, .input-group-sm > .form-control-plaintext.form-control,\n.input-group-sm > .input-group-prepend > .form-control-plaintext.input-group-text,\n.input-group-sm > .input-group-append > .form-control-plaintext.input-group-text,\n.input-group-sm > .input-group-prepend > .form-control-plaintext.btn,\n.input-group-sm > .input-group-append > .form-control-plaintext.btn, .form-control-plaintext.form-control-lg, .input-group-lg > .form-control-plaintext.form-control,\n.input-group-lg > .input-group-prepend > .form-control-plaintext.input-group-text,\n.input-group-lg > .input-group-append > .form-control-plaintext.input-group-text,\n.input-group-lg > .input-group-prepend > .form-control-plaintext.btn,\n.input-group-lg > .input-group-append > .form-control-plaintext.btn {\n padding-right: 0;\n padding-left: 0;\n}\n\n.form-control-sm, .input-group-sm > .form-control,\n.input-group-sm > .input-group-prepend > .input-group-text,\n.input-group-sm > .input-group-append > .input-group-text,\n.input-group-sm > .input-group-prepend > .btn,\n.input-group-sm > .input-group-append > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\nselect.form-control-sm:not([size]):not([multiple]), .input-group-sm > select.form-control:not([size]):not([multiple]),\n.input-group-sm > .input-group-prepend > select.input-group-text:not([size]):not([multiple]),\n.input-group-sm > .input-group-append > select.input-group-text:not([size]):not([multiple]),\n.input-group-sm > .input-group-prepend > select.btn:not([size]):not([multiple]),\n.input-group-sm > .input-group-append > select.btn:not([size]):not([multiple]) {\n height: calc(1.8125rem + 2px);\n}\n\n.form-control-lg, .input-group-lg > .form-control,\n.input-group-lg > .input-group-prepend > .input-group-text,\n.input-group-lg > .input-group-append > .input-group-text,\n.input-group-lg > .input-group-prepend > .btn,\n.input-group-lg > .input-group-append > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\nselect.form-control-lg:not([size]):not([multiple]), .input-group-lg > select.form-control:not([size]):not([multiple]),\n.input-group-lg > .input-group-prepend > select.input-group-text:not([size]):not([multiple]),\n.input-group-lg > .input-group-append > select.input-group-text:not([size]):not([multiple]),\n.input-group-lg > .input-group-prepend > select.btn:not([size]):not([multiple]),\n.input-group-lg > .input-group-append > select.btn:not([size]):not([multiple]) {\n height: calc(2.875rem + 2px);\n}\n\n.form-group {\n margin-bottom: 1rem;\n}\n\n.form-text {\n display: block;\n margin-top: 0.25rem;\n}\n\n.form-row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -5px;\n margin-left: -5px;\n}\n\n.form-row > .col,\n.form-row > [class*=\"col-\"] {\n padding-right: 5px;\n padding-left: 5px;\n}\n\n.form-check {\n position: relative;\n display: block;\n padding-left: 1.25rem;\n}\n\n.form-check-input {\n position: absolute;\n margin-top: 0.3rem;\n margin-left: -1.25rem;\n}\n\n.form-check-input:disabled ~ .form-check-label {\n color: #6c757d;\n}\n\n.form-check-label {\n margin-bottom: 0;\n}\n\n.form-check-inline {\n display: inline-flex;\n align-items: center;\n padding-left: 0;\n margin-right: 0.75rem;\n}\n\n.form-check-inline .form-check-input {\n position: static;\n margin-top: 0;\n margin-right: 0.3125rem;\n margin-left: 0;\n}\n\n.valid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 80%;\n color: #28a745;\n}\n\n.valid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: .5rem;\n margin-top: .1rem;\n font-size: .875rem;\n line-height: 1;\n color: #fff;\n background-color: rgba(40, 167, 69, 0.8);\n border-radius: .2rem;\n}\n\n.was-validated .form-control:valid, .form-control.is-valid, .was-validated\n.custom-select:valid,\n.custom-select.is-valid {\n border-color: #28a745;\n}\n\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus, .was-validated\n.custom-select:valid:focus,\n.custom-select.is-valid:focus {\n border-color: #28a745;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .form-control:valid ~ .valid-feedback,\n.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback,\n.form-control.is-valid ~ .valid-tooltip, .was-validated\n.custom-select:valid ~ .valid-feedback,\n.was-validated\n.custom-select:valid ~ .valid-tooltip,\n.custom-select.is-valid ~ .valid-feedback,\n.custom-select.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-control-file:valid ~ .valid-feedback,\n.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback,\n.form-control-file.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n color: #28a745;\n}\n\n.was-validated .form-check-input:valid ~ .valid-feedback,\n.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback,\n.form-check-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {\n color: #28a745;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {\n background-color: #71dd8a;\n}\n\n.was-validated .custom-control-input:valid ~ .valid-feedback,\n.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback,\n.custom-control-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {\n background-color: #34ce57;\n}\n\n.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {\n border-color: #28a745;\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-label::before, .custom-file-input.is-valid ~ .custom-file-label::before {\n border-color: inherit;\n}\n\n.was-validated .custom-file-input:valid ~ .valid-feedback,\n.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback,\n.custom-file-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.invalid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 80%;\n color: #dc3545;\n}\n\n.invalid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: .5rem;\n margin-top: .1rem;\n font-size: .875rem;\n line-height: 1;\n color: #fff;\n background-color: rgba(220, 53, 69, 0.8);\n border-radius: .2rem;\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid, .was-validated\n.custom-select:invalid,\n.custom-select.is-invalid {\n border-color: #dc3545;\n}\n\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus, .was-validated\n.custom-select:invalid:focus,\n.custom-select.is-invalid:focus {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback,\n.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback,\n.form-control.is-invalid ~ .invalid-tooltip, .was-validated\n.custom-select:invalid ~ .invalid-feedback,\n.was-validated\n.custom-select:invalid ~ .invalid-tooltip,\n.custom-select.is-invalid ~ .invalid-feedback,\n.custom-select.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-control-file:invalid ~ .invalid-feedback,\n.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback,\n.form-control-file.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n color: #dc3545;\n}\n\n.was-validated .form-check-input:invalid ~ .invalid-feedback,\n.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback,\n.form-check-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {\n color: #dc3545;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {\n background-color: #efa2a9;\n}\n\n.was-validated .custom-control-input:invalid ~ .invalid-feedback,\n.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback,\n.custom-control-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {\n background-color: #e4606d;\n}\n\n.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {\n border-color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-label::before, .custom-file-input.is-invalid ~ .custom-file-label::before {\n border-color: inherit;\n}\n\n.was-validated .custom-file-input:invalid ~ .invalid-feedback,\n.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback,\n.custom-file-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.form-inline {\n display: flex;\n flex-flow: row wrap;\n align-items: center;\n}\n\n.form-inline .form-check {\n width: 100%;\n}\n\n@media (min-width: 576px) {\n .form-inline label {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 0;\n }\n .form-inline .form-group {\n display: flex;\n flex: 0 0 auto;\n flex-flow: row wrap;\n align-items: center;\n margin-bottom: 0;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-plaintext {\n display: inline-block;\n }\n .form-inline .input-group,\n .form-inline .custom-select {\n width: auto;\n }\n .form-inline .form-check {\n display: flex;\n align-items: center;\n justify-content: center;\n width: auto;\n padding-left: 0;\n }\n .form-inline .form-check-input {\n position: relative;\n margin-top: 0;\n margin-right: 0.25rem;\n margin-left: 0;\n }\n .form-inline .custom-control {\n align-items: center;\n justify-content: center;\n }\n .form-inline .custom-control-label {\n margin-bottom: 0;\n }\n}\n\n.btn {\n display: inline-block;\n font-weight: 400;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n user-select: none;\n border: 1px solid transparent;\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n line-height: 1.5;\n border-radius: 0.25rem;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media screen and (prefers-reduced-motion: reduce) {\n .btn {\n transition: none;\n }\n}\n\n.btn:hover, .btn:focus {\n text-decoration: none;\n}\n\n.btn:focus, .btn.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.btn.disabled, .btn:disabled {\n opacity: 0.65;\n}\n\n.btn:not(:disabled):not(.disabled) {\n cursor: pointer;\n}\n\n.btn:not(:disabled):not(.disabled):active, .btn:not(:disabled):not(.disabled).active {\n background-image: none;\n}\n\na.btn.disabled,\nfieldset:disabled a.btn {\n pointer-events: none;\n}\n\n.btn-primary {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-primary:hover {\n color: #fff;\n background-color: #0069d9;\n border-color: #0062cc;\n}\n\n.btn-primary:focus, .btn-primary.focus {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-primary.disabled, .btn-primary:disabled {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active,\n.show > .btn-primary.dropdown-toggle {\n color: #fff;\n background-color: #0062cc;\n border-color: #005cbf;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-primary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-secondary {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-secondary:hover {\n color: #fff;\n background-color: #5a6268;\n border-color: #545b62;\n}\n\n.btn-secondary:focus, .btn-secondary.focus {\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-secondary.disabled, .btn-secondary:disabled {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-secondary.dropdown-toggle {\n color: #fff;\n background-color: #545b62;\n border-color: #4e555b;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-secondary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-success {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-success:hover {\n color: #fff;\n background-color: #218838;\n border-color: #1e7e34;\n}\n\n.btn-success:focus, .btn-success.focus {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-success.disabled, .btn-success:disabled {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active,\n.show > .btn-success.dropdown-toggle {\n color: #fff;\n background-color: #1e7e34;\n border-color: #1c7430;\n}\n\n.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-success.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-info {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-info:hover {\n color: #fff;\n background-color: #138496;\n border-color: #117a8b;\n}\n\n.btn-info:focus, .btn-info.focus {\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-info.disabled, .btn-info:disabled {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active,\n.show > .btn-info.dropdown-toggle {\n color: #fff;\n background-color: #117a8b;\n border-color: #10707f;\n}\n\n.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-info.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-warning {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-warning:hover {\n color: #212529;\n background-color: #e0a800;\n border-color: #d39e00;\n}\n\n.btn-warning:focus, .btn-warning.focus {\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-warning.disabled, .btn-warning:disabled {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active,\n.show > .btn-warning.dropdown-toggle {\n color: #212529;\n background-color: #d39e00;\n border-color: #c69500;\n}\n\n.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-warning.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-danger {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-danger:hover {\n color: #fff;\n background-color: #c82333;\n border-color: #bd2130;\n}\n\n.btn-danger:focus, .btn-danger.focus {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-danger.disabled, .btn-danger:disabled {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active,\n.show > .btn-danger.dropdown-toggle {\n color: #fff;\n background-color: #bd2130;\n border-color: #b21f2d;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-danger.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-light {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-light:hover {\n color: #212529;\n background-color: #e2e6ea;\n border-color: #dae0e5;\n}\n\n.btn-light:focus, .btn-light.focus {\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-light.disabled, .btn-light:disabled {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active,\n.show > .btn-light.dropdown-toggle {\n color: #212529;\n background-color: #dae0e5;\n border-color: #d3d9df;\n}\n\n.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-light.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-dark {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-dark:hover {\n color: #fff;\n background-color: #23272b;\n border-color: #1d2124;\n}\n\n.btn-dark:focus, .btn-dark.focus {\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-dark.disabled, .btn-dark:disabled {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active,\n.show > .btn-dark.dropdown-toggle {\n color: #fff;\n background-color: #1d2124;\n border-color: #171a1d;\n}\n\n.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-dark.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-outline-primary {\n color: #007bff;\n background-color: transparent;\n background-image: none;\n border-color: #007bff;\n}\n\n.btn-outline-primary:hover {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-primary:focus, .btn-outline-primary.focus {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-primary.disabled, .btn-outline-primary:disabled {\n color: #007bff;\n background-color: transparent;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-primary.dropdown-toggle {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-primary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-secondary {\n color: #6c757d;\n background-color: transparent;\n background-image: none;\n border-color: #6c757d;\n}\n\n.btn-outline-secondary:hover {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-outline-secondary:focus, .btn-outline-secondary.focus {\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {\n color: #6c757d;\n background-color: transparent;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-secondary.dropdown-toggle {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-secondary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-outline-success {\n color: #28a745;\n background-color: transparent;\n background-image: none;\n border-color: #28a745;\n}\n\n.btn-outline-success:hover {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-success:focus, .btn-outline-success.focus {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-success.disabled, .btn-outline-success:disabled {\n color: #28a745;\n background-color: transparent;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active,\n.show > .btn-outline-success.dropdown-toggle {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-success.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-info {\n color: #17a2b8;\n background-color: transparent;\n background-image: none;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:hover {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:focus, .btn-outline-info.focus {\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-info.disabled, .btn-outline-info:disabled {\n color: #17a2b8;\n background-color: transparent;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active,\n.show > .btn-outline-info.dropdown-toggle {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-info.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-warning {\n color: #ffc107;\n background-color: transparent;\n background-image: none;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:hover {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:focus, .btn-outline-warning.focus {\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-warning.disabled, .btn-outline-warning:disabled {\n color: #ffc107;\n background-color: transparent;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active,\n.show > .btn-outline-warning.dropdown-toggle {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-warning.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-danger {\n color: #dc3545;\n background-color: transparent;\n background-image: none;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:hover {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:focus, .btn-outline-danger.focus {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-danger.disabled, .btn-outline-danger:disabled {\n color: #dc3545;\n background-color: transparent;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active,\n.show > .btn-outline-danger.dropdown-toggle {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-danger.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-light {\n color: #f8f9fa;\n background-color: transparent;\n background-image: none;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:hover {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:focus, .btn-outline-light.focus {\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-light.disabled, .btn-outline-light:disabled {\n color: #f8f9fa;\n background-color: transparent;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active,\n.show > .btn-outline-light.dropdown-toggle {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-light.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-dark {\n color: #343a40;\n background-color: transparent;\n background-image: none;\n border-color: #343a40;\n}\n\n.btn-outline-dark:hover {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-outline-dark:focus, .btn-outline-dark.focus {\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-outline-dark.disabled, .btn-outline-dark:disabled {\n color: #343a40;\n background-color: transparent;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active,\n.show > .btn-outline-dark.dropdown-toggle {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-dark.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-link {\n font-weight: 400;\n color: #007bff;\n background-color: transparent;\n}\n\n.btn-link:hover {\n color: #0056b3;\n text-decoration: underline;\n background-color: transparent;\n border-color: transparent;\n}\n\n.btn-link:focus, .btn-link.focus {\n text-decoration: underline;\n border-color: transparent;\n box-shadow: none;\n}\n\n.btn-link:disabled, .btn-link.disabled {\n color: #6c757d;\n pointer-events: none;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n.btn-block + .btn-block {\n margin-top: 0.5rem;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n\n.fade {\n transition: opacity 0.15s linear;\n}\n\n@media screen and (prefers-reduced-motion: reduce) {\n .fade {\n transition: none;\n }\n}\n\n.fade:not(.show) {\n opacity: 0;\n}\n\n.collapse:not(.show) {\n display: none;\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n transition: height 0.35s ease;\n}\n\n@media screen and (prefers-reduced-motion: reduce) {\n .collapsing {\n transition: none;\n }\n}\n\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n position: relative;\n}\n\n.dropdown-toggle::after {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid;\n border-right: 0.3em solid transparent;\n border-bottom: 0;\n border-left: 0.3em solid transparent;\n}\n\n.dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 10rem;\n padding: 0.5rem 0;\n margin: 0.125rem 0 0;\n font-size: 1rem;\n color: #212529;\n text-align: left;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n}\n\n.dropdown-menu-right {\n right: 0;\n left: auto;\n}\n\n.dropup .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: 0.125rem;\n}\n\n.dropup .dropdown-toggle::after {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0;\n border-right: 0.3em solid transparent;\n border-bottom: 0.3em solid;\n border-left: 0.3em solid transparent;\n}\n\n.dropup .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropright .dropdown-menu {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: 0.125rem;\n}\n\n.dropright .dropdown-toggle::after {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0;\n border-bottom: 0.3em solid transparent;\n border-left: 0.3em solid;\n}\n\n.dropright .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropright .dropdown-toggle::after {\n vertical-align: 0;\n}\n\n.dropleft .dropdown-menu {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: 0.125rem;\n}\n\n.dropleft .dropdown-toggle::after {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n}\n\n.dropleft .dropdown-toggle::after {\n display: none;\n}\n\n.dropleft .dropdown-toggle::before {\n display: inline-block;\n width: 0;\n height: 0;\n margin-right: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0.3em solid;\n border-bottom: 0.3em solid transparent;\n}\n\n.dropleft .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropleft .dropdown-toggle::before {\n vertical-align: 0;\n}\n\n.dropdown-menu[x-placement^=\"top\"], .dropdown-menu[x-placement^=\"right\"], .dropdown-menu[x-placement^=\"bottom\"], .dropdown-menu[x-placement^=\"left\"] {\n right: auto;\n bottom: auto;\n}\n\n.dropdown-divider {\n height: 0;\n margin: 0.5rem 0;\n overflow: hidden;\n border-top: 1px solid #e9ecef;\n}\n\n.dropdown-item {\n display: block;\n width: 100%;\n padding: 0.25rem 1.5rem;\n clear: both;\n font-weight: 400;\n color: #212529;\n text-align: inherit;\n white-space: nowrap;\n background-color: transparent;\n border: 0;\n}\n\n.dropdown-item:hover, .dropdown-item:focus {\n color: #16181b;\n text-decoration: none;\n background-color: #f8f9fa;\n}\n\n.dropdown-item.active, .dropdown-item:active {\n color: #fff;\n text-decoration: none;\n background-color: #007bff;\n}\n\n.dropdown-item.disabled, .dropdown-item:disabled {\n color: #6c757d;\n background-color: transparent;\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n.dropdown-header {\n display: block;\n padding: 0.5rem 1.5rem;\n margin-bottom: 0;\n font-size: 0.875rem;\n color: #6c757d;\n white-space: nowrap;\n}\n\n.dropdown-item-text {\n display: block;\n padding: 0.25rem 1.5rem;\n color: #212529;\n}\n\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-flex;\n vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n flex: 0 1 auto;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover {\n z-index: 1;\n}\n\n.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n z-index: 1;\n}\n\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group,\n.btn-group-vertical .btn + .btn,\n.btn-group-vertical .btn + .btn-group,\n.btn-group-vertical .btn-group + .btn,\n.btn-group-vertical .btn-group + .btn-group {\n margin-left: -1px;\n}\n\n.btn-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n}\n\n.btn-toolbar .input-group {\n width: auto;\n}\n\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n\n.btn-group > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.dropdown-toggle-split {\n padding-right: 0.5625rem;\n padding-left: 0.5625rem;\n}\n\n.dropdown-toggle-split::after,\n.dropup .dropdown-toggle-split::after,\n.dropright .dropdown-toggle-split::after {\n margin-left: 0;\n}\n\n.dropleft .dropdown-toggle-split::before {\n margin-right: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n padding-right: 0.375rem;\n padding-left: 0.375rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n padding-right: 0.75rem;\n padding-left: 0.75rem;\n}\n\n.btn-group-vertical {\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n}\n\n.btn-group-vertical .btn,\n.btn-group-vertical .btn-group {\n width: 100%;\n}\n\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n\n.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group-vertical > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.btn-group-toggle > .btn,\n.btn-group-toggle > .btn-group > .btn {\n margin-bottom: 0;\n}\n\n.btn-group-toggle > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn input[type=\"checkbox\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n\n.input-group {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: stretch;\n width: 100%;\n}\n\n.input-group > .form-control,\n.input-group > .custom-select,\n.input-group > .custom-file {\n position: relative;\n flex: 1 1 auto;\n width: 1%;\n margin-bottom: 0;\n}\n\n.input-group > .form-control:focus,\n.input-group > .custom-select:focus,\n.input-group > .custom-file:focus {\n z-index: 3;\n}\n\n.input-group > .form-control + .form-control,\n.input-group > .form-control + .custom-select,\n.input-group > .form-control + .custom-file,\n.input-group > .custom-select + .form-control,\n.input-group > .custom-select + .custom-select,\n.input-group > .custom-select + .custom-file,\n.input-group > .custom-file + .form-control,\n.input-group > .custom-file + .custom-select,\n.input-group > .custom-file + .custom-file {\n margin-left: -1px;\n}\n\n.input-group > .form-control:not(:last-child),\n.input-group > .custom-select:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group > .form-control:not(:first-child),\n.input-group > .custom-select:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.input-group > .custom-file {\n display: flex;\n align-items: center;\n}\n\n.input-group > .custom-file:not(:last-child) .custom-file-label,\n.input-group > .custom-file:not(:last-child) .custom-file-label::after {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group > .custom-file:not(:first-child) .custom-file-label {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.input-group-prepend,\n.input-group-append {\n display: flex;\n}\n\n.input-group-prepend .btn,\n.input-group-append .btn {\n position: relative;\n z-index: 2;\n}\n\n.input-group-prepend .btn + .btn,\n.input-group-prepend .btn + .input-group-text,\n.input-group-prepend .input-group-text + .input-group-text,\n.input-group-prepend .input-group-text + .btn,\n.input-group-append .btn + .btn,\n.input-group-append .btn + .input-group-text,\n.input-group-append .input-group-text + .input-group-text,\n.input-group-append .input-group-text + .btn {\n margin-left: -1px;\n}\n\n.input-group-prepend {\n margin-right: -1px;\n}\n\n.input-group-append {\n margin-left: -1px;\n}\n\n.input-group-text {\n display: flex;\n align-items: center;\n padding: 0.375rem 0.75rem;\n margin-bottom: 0;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n text-align: center;\n white-space: nowrap;\n background-color: #e9ecef;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n}\n\n.input-group-text input[type=\"radio\"],\n.input-group-text input[type=\"checkbox\"] {\n margin-top: 0;\n}\n\n.input-group > .input-group-prepend > .btn,\n.input-group > .input-group-prepend > .input-group-text,\n.input-group > .input-group-append:not(:last-child) > .btn,\n.input-group > .input-group-append:not(:last-child) > .input-group-text,\n.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group > .input-group-append > .btn,\n.input-group > .input-group-append > .input-group-text,\n.input-group > .input-group-prepend:not(:first-child) > .btn,\n.input-group > .input-group-prepend:not(:first-child) > .input-group-text,\n.input-group > .input-group-prepend:first-child > .btn:not(:first-child),\n.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.custom-control {\n position: relative;\n display: block;\n min-height: 1.5rem;\n padding-left: 1.5rem;\n}\n\n.custom-control-inline {\n display: inline-flex;\n margin-right: 1rem;\n}\n\n.custom-control-input {\n position: absolute;\n z-index: -1;\n opacity: 0;\n}\n\n.custom-control-input:checked ~ .custom-control-label::before {\n color: #fff;\n background-color: #007bff;\n}\n\n.custom-control-input:focus ~ .custom-control-label::before {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-control-input:active ~ .custom-control-label::before {\n color: #fff;\n background-color: #b3d7ff;\n}\n\n.custom-control-input:disabled ~ .custom-control-label {\n color: #6c757d;\n}\n\n.custom-control-input:disabled ~ .custom-control-label::before {\n background-color: #e9ecef;\n}\n\n.custom-control-label {\n position: relative;\n margin-bottom: 0;\n}\n\n.custom-control-label::before {\n position: absolute;\n top: 0.25rem;\n left: -1.5rem;\n display: block;\n width: 1rem;\n height: 1rem;\n pointer-events: none;\n content: \"\";\n user-select: none;\n background-color: #dee2e6;\n}\n\n.custom-control-label::after {\n position: absolute;\n top: 0.25rem;\n left: -1.5rem;\n display: block;\n width: 1rem;\n height: 1rem;\n content: \"\";\n background-repeat: no-repeat;\n background-position: center center;\n background-size: 50% 50%;\n}\n\n.custom-checkbox .custom-control-label::before {\n border-radius: 0.25rem;\n}\n\n.custom-checkbox .custom-control-input:checked ~ .custom-control-label::before {\n background-color: #007bff;\n}\n\n.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E\");\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {\n background-color: #007bff;\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E\");\n}\n\n.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-radio .custom-control-label::before {\n border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::before {\n background-color: #007bff;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::after {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-select {\n display: inline-block;\n width: 100%;\n height: calc(2.25rem + 2px);\n padding: 0.375rem 1.75rem 0.375rem 0.75rem;\n line-height: 1.5;\n color: #495057;\n vertical-align: middle;\n background: #fff url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E\") no-repeat right 0.75rem center;\n background-size: 8px 10px;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n appearance: none;\n}\n\n.custom-select:focus {\n border-color: #80bdff;\n outline: 0;\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075), 0 0 5px rgba(128, 189, 255, 0.5);\n}\n\n.custom-select:focus::-ms-value {\n color: #495057;\n background-color: #fff;\n}\n\n.custom-select[multiple], .custom-select[size]:not([size=\"1\"]) {\n height: auto;\n padding-right: 0.75rem;\n background-image: none;\n}\n\n.custom-select:disabled {\n color: #6c757d;\n background-color: #e9ecef;\n}\n\n.custom-select::-ms-expand {\n opacity: 0;\n}\n\n.custom-select-sm {\n height: calc(1.8125rem + 2px);\n padding-top: 0.375rem;\n padding-bottom: 0.375rem;\n font-size: 75%;\n}\n\n.custom-select-lg {\n height: calc(2.875rem + 2px);\n padding-top: 0.375rem;\n padding-bottom: 0.375rem;\n font-size: 125%;\n}\n\n.custom-file {\n position: relative;\n display: inline-block;\n width: 100%;\n height: calc(2.25rem + 2px);\n margin-bottom: 0;\n}\n\n.custom-file-input {\n position: relative;\n z-index: 2;\n width: 100%;\n height: calc(2.25rem + 2px);\n margin: 0;\n opacity: 0;\n}\n\n.custom-file-input:focus ~ .custom-file-label {\n border-color: #80bdff;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-file-input:focus ~ .custom-file-label::after {\n border-color: #80bdff;\n}\n\n.custom-file-input:lang(en) ~ .custom-file-label::after {\n content: \"Browse\";\n}\n\n.custom-file-label {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1;\n height: calc(2.25rem + 2px);\n padding: 0.375rem 0.75rem;\n line-height: 1.5;\n color: #495057;\n background-color: #fff;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n}\n\n.custom-file-label::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n z-index: 3;\n display: block;\n height: 2.25rem;\n padding: 0.375rem 0.75rem;\n line-height: 1.5;\n color: #495057;\n content: \"Browse\";\n background-color: #e9ecef;\n border-left: 1px solid #ced4da;\n border-radius: 0 0.25rem 0.25rem 0;\n}\n\n.custom-range {\n width: 100%;\n padding-left: 0;\n background-color: transparent;\n appearance: none;\n}\n\n.custom-range:focus {\n outline: none;\n}\n\n.custom-range::-moz-focus-outer {\n border: 0;\n}\n\n.custom-range::-webkit-slider-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: -0.25rem;\n background-color: #007bff;\n border: 0;\n border-radius: 1rem;\n appearance: none;\n}\n\n.custom-range::-webkit-slider-thumb:focus {\n outline: none;\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range::-webkit-slider-thumb:active {\n background-color: #b3d7ff;\n}\n\n.custom-range::-webkit-slider-runnable-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #dee2e6;\n border-color: transparent;\n border-radius: 1rem;\n}\n\n.custom-range::-moz-range-thumb {\n width: 1rem;\n height: 1rem;\n background-color: #007bff;\n border: 0;\n border-radius: 1rem;\n appearance: none;\n}\n\n.custom-range::-moz-range-thumb:focus {\n outline: none;\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range::-moz-range-thumb:active {\n background-color: #b3d7ff;\n}\n\n.custom-range::-moz-range-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #dee2e6;\n border-color: transparent;\n border-radius: 1rem;\n}\n\n.custom-range::-ms-thumb {\n width: 1rem;\n height: 1rem;\n background-color: #007bff;\n border: 0;\n border-radius: 1rem;\n appearance: none;\n}\n\n.custom-range::-ms-thumb:focus {\n outline: none;\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range::-ms-thumb:active {\n background-color: #b3d7ff;\n}\n\n.custom-range::-ms-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: transparent;\n border-color: transparent;\n border-width: 0.5rem;\n}\n\n.custom-range::-ms-fill-lower {\n background-color: #dee2e6;\n border-radius: 1rem;\n}\n\n.custom-range::-ms-fill-upper {\n margin-right: 15px;\n background-color: #dee2e6;\n border-radius: 1rem;\n}\n\n.nav {\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: 0.5rem 1rem;\n}\n\n.nav-link:hover, .nav-link:focus {\n text-decoration: none;\n}\n\n.nav-link.disabled {\n color: #6c757d;\n}\n\n.nav-tabs {\n border-bottom: 1px solid #dee2e6;\n}\n\n.nav-tabs .nav-item {\n margin-bottom: -1px;\n}\n\n.nav-tabs .nav-link {\n border: 1px solid transparent;\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n border-color: #e9ecef #e9ecef #dee2e6;\n}\n\n.nav-tabs .nav-link.disabled {\n color: #6c757d;\n background-color: transparent;\n border-color: transparent;\n}\n\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n color: #495057;\n background-color: #fff;\n border-color: #dee2e6 #dee2e6 #fff;\n}\n\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.nav-pills .nav-link {\n border-radius: 0.25rem;\n}\n\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n color: #fff;\n background-color: #007bff;\n}\n\n.nav-fill .nav-item {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.nav-justified .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center;\n}\n\n.tab-content > .tab-pane {\n display: none;\n}\n\n.tab-content > .active {\n display: block;\n}\n\n.navbar {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n padding: 0.5rem 1rem;\n}\n\n.navbar > .container,\n.navbar > .container-fluid {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n}\n\n.navbar-brand {\n display: inline-block;\n padding-top: 0.3125rem;\n padding-bottom: 0.3125rem;\n margin-right: 1rem;\n font-size: 1.25rem;\n line-height: inherit;\n white-space: nowrap;\n}\n\n.navbar-brand:hover, .navbar-brand:focus {\n text-decoration: none;\n}\n\n.navbar-nav {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.navbar-nav .nav-link {\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-nav .dropdown-menu {\n position: static;\n float: none;\n}\n\n.navbar-text {\n display: inline-block;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n\n.navbar-collapse {\n flex-basis: 100%;\n flex-grow: 1;\n align-items: center;\n}\n\n.navbar-toggler {\n padding: 0.25rem 0.75rem;\n font-size: 1.25rem;\n line-height: 1;\n background-color: transparent;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.navbar-toggler:hover, .navbar-toggler:focus {\n text-decoration: none;\n}\n\n.navbar-toggler:not(:disabled):not(.disabled) {\n cursor: pointer;\n}\n\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.5em;\n height: 1.5em;\n vertical-align: middle;\n content: \"\";\n background: no-repeat center center;\n background-size: 100% 100%;\n}\n\n@media (max-width: 575.98px) {\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 576px) {\n .navbar-expand-sm {\n flex-flow: row nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-sm .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-sm .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-sm .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-sm .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-sm .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 767.98px) {\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 768px) {\n .navbar-expand-md {\n flex-flow: row nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-md .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-md .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-md .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-md .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-md .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 991.98px) {\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 992px) {\n .navbar-expand-lg {\n flex-flow: row nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-lg .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-lg .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-lg .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-lg .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-lg .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 1199.98px) {\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 1200px) {\n .navbar-expand-xl {\n flex-flow: row nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-xl .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-xl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xl .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-xl .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-xl .navbar-toggler {\n display: none;\n }\n}\n\n.navbar-expand {\n flex-flow: row nowrap;\n justify-content: flex-start;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-expand .navbar-nav {\n flex-direction: row;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu {\n position: absolute;\n}\n\n.navbar-expand .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n flex-wrap: nowrap;\n}\n\n.navbar-expand .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n}\n\n.navbar-expand .navbar-toggler {\n display: none;\n}\n\n.navbar-light .navbar-brand {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-nav .nav-link {\n color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {\n color: rgba(0, 0, 0, 0.7);\n}\n\n.navbar-light .navbar-nav .nav-link.disabled {\n color: rgba(0, 0, 0, 0.3);\n}\n\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .active > .nav-link,\n.navbar-light .navbar-nav .nav-link.show,\n.navbar-light .navbar-nav .nav-link.active {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-toggler {\n color: rgba(0, 0, 0, 0.5);\n border-color: rgba(0, 0, 0, 0.1);\n}\n\n.navbar-light .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E\");\n}\n\n.navbar-light .navbar-text {\n color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-text a {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-dark .navbar-brand {\n color: #fff;\n}\n\n.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {\n color: #fff;\n}\n\n.navbar-dark .navbar-nav .nav-link {\n color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {\n color: rgba(255, 255, 255, 0.75);\n}\n\n.navbar-dark .navbar-nav .nav-link.disabled {\n color: rgba(255, 255, 255, 0.25);\n}\n\n.navbar-dark .navbar-nav .show > .nav-link,\n.navbar-dark .navbar-nav .active > .nav-link,\n.navbar-dark .navbar-nav .nav-link.show,\n.navbar-dark .navbar-nav .nav-link.active {\n color: #fff;\n}\n\n.navbar-dark .navbar-toggler {\n color: rgba(255, 255, 255, 0.5);\n border-color: rgba(255, 255, 255, 0.1);\n}\n\n.navbar-dark .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E\");\n}\n\n.navbar-dark .navbar-text {\n color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-dark .navbar-text a {\n color: #fff;\n}\n\n.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus {\n color: #fff;\n}\n\n.card {\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: border-box;\n border: 1px solid rgba(0, 0, 0, 0.125);\n border-radius: 0.25rem;\n}\n\n.card > hr {\n margin-right: 0;\n margin-left: 0;\n}\n\n.card > .list-group:first-child .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.card > .list-group:last-child .list-group-item:last-child {\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.card-body {\n flex: 1 1 auto;\n padding: 1.25rem;\n}\n\n.card-title {\n margin-bottom: 0.75rem;\n}\n\n.card-subtitle {\n margin-top: -0.375rem;\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link:hover {\n text-decoration: none;\n}\n\n.card-link + .card-link {\n margin-left: 1.25rem;\n}\n\n.card-header {\n padding: 0.75rem 1.25rem;\n margin-bottom: 0;\n background-color: rgba(0, 0, 0, 0.03);\n border-bottom: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-header:first-child {\n border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\n}\n\n.card-header + .list-group .list-group-item:first-child {\n border-top: 0;\n}\n\n.card-footer {\n padding: 0.75rem 1.25rem;\n background-color: rgba(0, 0, 0, 0.03);\n border-top: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-footer:last-child {\n border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\n}\n\n.card-header-tabs {\n margin-right: -0.625rem;\n margin-bottom: -0.75rem;\n margin-left: -0.625rem;\n border-bottom: 0;\n}\n\n.card-header-pills {\n margin-right: -0.625rem;\n margin-left: -0.625rem;\n}\n\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: 1.25rem;\n}\n\n.card-img {\n width: 100%;\n border-radius: calc(0.25rem - 1px);\n}\n\n.card-img-top {\n width: 100%;\n border-top-left-radius: calc(0.25rem - 1px);\n border-top-right-radius: calc(0.25rem - 1px);\n}\n\n.card-img-bottom {\n width: 100%;\n border-bottom-right-radius: calc(0.25rem - 1px);\n border-bottom-left-radius: calc(0.25rem - 1px);\n}\n\n.card-deck {\n display: flex;\n flex-direction: column;\n}\n\n.card-deck .card {\n margin-bottom: 15px;\n}\n\n@media (min-width: 576px) {\n .card-deck {\n flex-flow: row wrap;\n margin-right: -15px;\n margin-left: -15px;\n }\n .card-deck .card {\n display: flex;\n flex: 1 0 0%;\n flex-direction: column;\n margin-right: 15px;\n margin-bottom: 0;\n margin-left: 15px;\n }\n}\n\n.card-group {\n display: flex;\n flex-direction: column;\n}\n\n.card-group > .card {\n margin-bottom: 15px;\n}\n\n@media (min-width: 576px) {\n .card-group {\n flex-flow: row wrap;\n }\n .card-group > .card {\n flex: 1 0 0%;\n margin-bottom: 0;\n }\n .card-group > .card + .card {\n margin-left: 0;\n border-left: 0;\n }\n .card-group > .card:first-child {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n .card-group > .card:first-child .card-img-top,\n .card-group > .card:first-child .card-header {\n border-top-right-radius: 0;\n }\n .card-group > .card:first-child .card-img-bottom,\n .card-group > .card:first-child .card-footer {\n border-bottom-right-radius: 0;\n }\n .card-group > .card:last-child {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n .card-group > .card:last-child .card-img-top,\n .card-group > .card:last-child .card-header {\n border-top-left-radius: 0;\n }\n .card-group > .card:last-child .card-img-bottom,\n .card-group > .card:last-child .card-footer {\n border-bottom-left-radius: 0;\n }\n .card-group > .card:only-child {\n border-radius: 0.25rem;\n }\n .card-group > .card:only-child .card-img-top,\n .card-group > .card:only-child .card-header {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n }\n .card-group > .card:only-child .card-img-bottom,\n .card-group > .card:only-child .card-footer {\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n }\n .card-group > .card:not(:first-child):not(:last-child):not(:only-child) {\n border-radius: 0;\n }\n .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-img-top,\n .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,\n .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-header,\n .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-footer {\n border-radius: 0;\n }\n}\n\n.card-columns .card {\n margin-bottom: 0.75rem;\n}\n\n@media (min-width: 576px) {\n .card-columns {\n column-count: 3;\n column-gap: 1.25rem;\n orphans: 1;\n widows: 1;\n }\n .card-columns .card {\n display: inline-block;\n width: 100%;\n }\n}\n\n.accordion .card:not(:first-of-type):not(:last-of-type) {\n border-bottom: 0;\n border-radius: 0;\n}\n\n.accordion .card:not(:first-of-type) .card-header:first-child {\n border-radius: 0;\n}\n\n.accordion .card:first-of-type {\n border-bottom: 0;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.accordion .card:last-of-type {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.breadcrumb {\n display: flex;\n flex-wrap: wrap;\n padding: 0.75rem 1rem;\n margin-bottom: 1rem;\n list-style: none;\n background-color: #e9ecef;\n border-radius: 0.25rem;\n}\n\n.breadcrumb-item + .breadcrumb-item {\n padding-left: 0.5rem;\n}\n\n.breadcrumb-item + .breadcrumb-item::before {\n display: inline-block;\n padding-right: 0.5rem;\n color: #6c757d;\n content: \"/\";\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: underline;\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: none;\n}\n\n.breadcrumb-item.active {\n color: #6c757d;\n}\n\n.pagination {\n display: flex;\n padding-left: 0;\n list-style: none;\n border-radius: 0.25rem;\n}\n\n.page-link {\n position: relative;\n display: block;\n padding: 0.5rem 0.75rem;\n margin-left: -1px;\n line-height: 1.25;\n color: #007bff;\n background-color: #fff;\n border: 1px solid #dee2e6;\n}\n\n.page-link:hover {\n z-index: 2;\n color: #0056b3;\n text-decoration: none;\n background-color: #e9ecef;\n border-color: #dee2e6;\n}\n\n.page-link:focus {\n z-index: 2;\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.page-link:not(:disabled):not(.disabled) {\n cursor: pointer;\n}\n\n.page-item:first-child .page-link {\n margin-left: 0;\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.page-item:last-child .page-link {\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n}\n\n.page-item.active .page-link {\n z-index: 1;\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.page-item.disabled .page-link {\n color: #6c757d;\n pointer-events: none;\n cursor: auto;\n background-color: #fff;\n border-color: #dee2e6;\n}\n\n.pagination-lg .page-link {\n padding: 0.75rem 1.5rem;\n font-size: 1.25rem;\n line-height: 1.5;\n}\n\n.pagination-lg .page-item:first-child .page-link {\n border-top-left-radius: 0.3rem;\n border-bottom-left-radius: 0.3rem;\n}\n\n.pagination-lg .page-item:last-child .page-link {\n border-top-right-radius: 0.3rem;\n border-bottom-right-radius: 0.3rem;\n}\n\n.pagination-sm .page-link {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.pagination-sm .page-item:first-child .page-link {\n border-top-left-radius: 0.2rem;\n border-bottom-left-radius: 0.2rem;\n}\n\n.pagination-sm .page-item:last-child .page-link {\n border-top-right-radius: 0.2rem;\n border-bottom-right-radius: 0.2rem;\n}\n\n.badge {\n display: inline-block;\n padding: 0.25em 0.4em;\n font-size: 75%;\n font-weight: 700;\n line-height: 1;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: 0.25rem;\n}\n\n.badge:empty {\n display: none;\n}\n\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n.badge-pill {\n padding-right: 0.6em;\n padding-left: 0.6em;\n border-radius: 10rem;\n}\n\n.badge-primary {\n color: #fff;\n background-color: #007bff;\n}\n\n.badge-primary[href]:hover, .badge-primary[href]:focus {\n color: #fff;\n text-decoration: none;\n background-color: #0062cc;\n}\n\n.badge-secondary {\n color: #fff;\n background-color: #6c757d;\n}\n\n.badge-secondary[href]:hover, .badge-secondary[href]:focus {\n color: #fff;\n text-decoration: none;\n background-color: #545b62;\n}\n\n.badge-success {\n color: #fff;\n background-color: #28a745;\n}\n\n.badge-success[href]:hover, .badge-success[href]:focus {\n color: #fff;\n text-decoration: none;\n background-color: #1e7e34;\n}\n\n.badge-info {\n color: #fff;\n background-color: #17a2b8;\n}\n\n.badge-info[href]:hover, .badge-info[href]:focus {\n color: #fff;\n text-decoration: none;\n background-color: #117a8b;\n}\n\n.badge-warning {\n color: #212529;\n background-color: #ffc107;\n}\n\n.badge-warning[href]:hover, .badge-warning[href]:focus {\n color: #212529;\n text-decoration: none;\n background-color: #d39e00;\n}\n\n.badge-danger {\n color: #fff;\n background-color: #dc3545;\n}\n\n.badge-danger[href]:hover, .badge-danger[href]:focus {\n color: #fff;\n text-decoration: none;\n background-color: #bd2130;\n}\n\n.badge-light {\n color: #212529;\n background-color: #f8f9fa;\n}\n\n.badge-light[href]:hover, .badge-light[href]:focus {\n color: #212529;\n text-decoration: none;\n background-color: #dae0e5;\n}\n\n.badge-dark {\n color: #fff;\n background-color: #343a40;\n}\n\n.badge-dark[href]:hover, .badge-dark[href]:focus {\n color: #fff;\n text-decoration: none;\n background-color: #1d2124;\n}\n\n.jumbotron {\n padding: 2rem 1rem;\n margin-bottom: 2rem;\n background-color: #e9ecef;\n border-radius: 0.3rem;\n}\n\n@media (min-width: 576px) {\n .jumbotron {\n padding: 4rem 2rem;\n }\n}\n\n.jumbotron-fluid {\n padding-right: 0;\n padding-left: 0;\n border-radius: 0;\n}\n\n.alert {\n position: relative;\n padding: 0.75rem 1.25rem;\n margin-bottom: 1rem;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.alert-heading {\n color: inherit;\n}\n\n.alert-link {\n font-weight: 700;\n}\n\n.alert-dismissible {\n padding-right: 4rem;\n}\n\n.alert-dismissible .close {\n position: absolute;\n top: 0;\n right: 0;\n padding: 0.75rem 1.25rem;\n color: inherit;\n}\n\n.alert-primary {\n color: #004085;\n background-color: #cce5ff;\n border-color: #b8daff;\n}\n\n.alert-primary hr {\n border-top-color: #9fcdff;\n}\n\n.alert-primary .alert-link {\n color: #002752;\n}\n\n.alert-secondary {\n color: #383d41;\n background-color: #e2e3e5;\n border-color: #d6d8db;\n}\n\n.alert-secondary hr {\n border-top-color: #c8cbcf;\n}\n\n.alert-secondary .alert-link {\n color: #202326;\n}\n\n.alert-success {\n color: #155724;\n background-color: #d4edda;\n border-color: #c3e6cb;\n}\n\n.alert-success hr {\n border-top-color: #b1dfbb;\n}\n\n.alert-success .alert-link {\n color: #0b2e13;\n}\n\n.alert-info {\n color: #0c5460;\n background-color: #d1ecf1;\n border-color: #bee5eb;\n}\n\n.alert-info hr {\n border-top-color: #abdde5;\n}\n\n.alert-info .alert-link {\n color: #062c33;\n}\n\n.alert-warning {\n color: #856404;\n background-color: #fff3cd;\n border-color: #ffeeba;\n}\n\n.alert-warning hr {\n border-top-color: #ffe8a1;\n}\n\n.alert-warning .alert-link {\n color: #533f03;\n}\n\n.alert-danger {\n color: #721c24;\n background-color: #f8d7da;\n border-color: #f5c6cb;\n}\n\n.alert-danger hr {\n border-top-color: #f1b0b7;\n}\n\n.alert-danger .alert-link {\n color: #491217;\n}\n\n.alert-light {\n color: #818182;\n background-color: #fefefe;\n border-color: #fdfdfe;\n}\n\n.alert-light hr {\n border-top-color: #ececf6;\n}\n\n.alert-light .alert-link {\n color: #686868;\n}\n\n.alert-dark {\n color: #1b1e21;\n background-color: #d6d8d9;\n border-color: #c6c8ca;\n}\n\n.alert-dark hr {\n border-top-color: #b9bbbe;\n}\n\n.alert-dark .alert-link {\n color: #040505;\n}\n\n@keyframes progress-bar-stripes {\n from {\n background-position: 1rem 0;\n }\n to {\n background-position: 0 0;\n }\n}\n\n.progress {\n display: flex;\n height: 1rem;\n overflow: hidden;\n font-size: 0.75rem;\n background-color: #e9ecef;\n border-radius: 0.25rem;\n}\n\n.progress-bar {\n display: flex;\n flex-direction: column;\n justify-content: center;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n background-color: #007bff;\n transition: width 0.6s ease;\n}\n\n@media screen and (prefers-reduced-motion: reduce) {\n .progress-bar {\n transition: none;\n }\n}\n\n.progress-bar-striped {\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 1rem 1rem;\n}\n\n.progress-bar-animated {\n animation: progress-bar-stripes 1s linear infinite;\n}\n\n.media {\n display: flex;\n align-items: flex-start;\n}\n\n.media-body {\n flex: 1;\n}\n\n.list-group {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n}\n\n.list-group-item-action {\n width: 100%;\n color: #495057;\n text-align: inherit;\n}\n\n.list-group-item-action:hover, .list-group-item-action:focus {\n color: #495057;\n text-decoration: none;\n background-color: #f8f9fa;\n}\n\n.list-group-item-action:active {\n color: #212529;\n background-color: #e9ecef;\n}\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 0.75rem 1.25rem;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.list-group-item:hover, .list-group-item:focus {\n z-index: 1;\n text-decoration: none;\n}\n\n.list-group-item.disabled, .list-group-item:disabled {\n color: #6c757d;\n background-color: #fff;\n}\n\n.list-group-item.active {\n z-index: 2;\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.list-group-flush .list-group-item {\n border-right: 0;\n border-left: 0;\n border-radius: 0;\n}\n\n.list-group-flush:first-child .list-group-item:first-child {\n border-top: 0;\n}\n\n.list-group-flush:last-child .list-group-item:last-child {\n border-bottom: 0;\n}\n\n.list-group-item-primary {\n color: #004085;\n background-color: #b8daff;\n}\n\n.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {\n color: #004085;\n background-color: #9fcdff;\n}\n\n.list-group-item-primary.list-group-item-action.active {\n color: #fff;\n background-color: #004085;\n border-color: #004085;\n}\n\n.list-group-item-secondary {\n color: #383d41;\n background-color: #d6d8db;\n}\n\n.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {\n color: #383d41;\n background-color: #c8cbcf;\n}\n\n.list-group-item-secondary.list-group-item-action.active {\n color: #fff;\n background-color: #383d41;\n border-color: #383d41;\n}\n\n.list-group-item-success {\n color: #155724;\n background-color: #c3e6cb;\n}\n\n.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {\n color: #155724;\n background-color: #b1dfbb;\n}\n\n.list-group-item-success.list-group-item-action.active {\n color: #fff;\n background-color: #155724;\n border-color: #155724;\n}\n\n.list-group-item-info {\n color: #0c5460;\n background-color: #bee5eb;\n}\n\n.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {\n color: #0c5460;\n background-color: #abdde5;\n}\n\n.list-group-item-info.list-group-item-action.active {\n color: #fff;\n background-color: #0c5460;\n border-color: #0c5460;\n}\n\n.list-group-item-warning {\n color: #856404;\n background-color: #ffeeba;\n}\n\n.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {\n color: #856404;\n background-color: #ffe8a1;\n}\n\n.list-group-item-warning.list-group-item-action.active {\n color: #fff;\n background-color: #856404;\n border-color: #856404;\n}\n\n.list-group-item-danger {\n color: #721c24;\n background-color: #f5c6cb;\n}\n\n.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {\n color: #721c24;\n background-color: #f1b0b7;\n}\n\n.list-group-item-danger.list-group-item-action.active {\n color: #fff;\n background-color: #721c24;\n border-color: #721c24;\n}\n\n.list-group-item-light {\n color: #818182;\n background-color: #fdfdfe;\n}\n\n.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {\n color: #818182;\n background-color: #ececf6;\n}\n\n.list-group-item-light.list-group-item-action.active {\n color: #fff;\n background-color: #818182;\n border-color: #818182;\n}\n\n.list-group-item-dark {\n color: #1b1e21;\n background-color: #c6c8ca;\n}\n\n.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {\n color: #1b1e21;\n background-color: #b9bbbe;\n}\n\n.list-group-item-dark.list-group-item-action.active {\n color: #fff;\n background-color: #1b1e21;\n border-color: #1b1e21;\n}\n\n.close {\n float: right;\n font-size: 1.5rem;\n font-weight: 700;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: .5;\n}\n\n.close:hover, .close:focus {\n color: #000;\n text-decoration: none;\n opacity: .75;\n}\n\n.close:not(:disabled):not(.disabled) {\n cursor: pointer;\n}\n\nbutton.close {\n padding: 0;\n background-color: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n\n.modal-open {\n overflow: hidden;\n}\n\n.modal {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n display: none;\n overflow: hidden;\n outline: 0;\n}\n\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 0.5rem;\n pointer-events: none;\n}\n\n.modal.fade .modal-dialog {\n transition: transform 0.3s ease-out;\n transform: translate(0, -25%);\n}\n\n@media screen and (prefers-reduced-motion: reduce) {\n .modal.fade .modal-dialog {\n transition: none;\n }\n}\n\n.modal.show .modal-dialog {\n transform: translate(0, 0);\n}\n\n.modal-dialog-centered {\n display: flex;\n align-items: center;\n min-height: calc(100% - (0.5rem * 2));\n}\n\n.modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n pointer-events: auto;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n outline: 0;\n}\n\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n\n.modal-backdrop.fade {\n opacity: 0;\n}\n\n.modal-backdrop.show {\n opacity: 0.5;\n}\n\n.modal-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n padding: 1rem;\n border-bottom: 1px solid #e9ecef;\n border-top-left-radius: 0.3rem;\n border-top-right-radius: 0.3rem;\n}\n\n.modal-header .close {\n padding: 1rem;\n margin: -1rem -1rem -1rem auto;\n}\n\n.modal-title {\n margin-bottom: 0;\n line-height: 1.5;\n}\n\n.modal-body {\n position: relative;\n flex: 1 1 auto;\n padding: 1rem;\n}\n\n.modal-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n padding: 1rem;\n border-top: 1px solid #e9ecef;\n}\n\n.modal-footer > :not(:first-child) {\n margin-left: .25rem;\n}\n\n.modal-footer > :not(:last-child) {\n margin-right: .25rem;\n}\n\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n@media (min-width: 576px) {\n .modal-dialog {\n max-width: 500px;\n margin: 1.75rem auto;\n }\n .modal-dialog-centered {\n min-height: calc(100% - (1.75rem * 2));\n }\n .modal-sm {\n max-width: 300px;\n }\n}\n\n@media (min-width: 992px) {\n .modal-lg {\n max-width: 800px;\n }\n}\n\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n opacity: 0;\n}\n\n.tooltip.show {\n opacity: 0.9;\n}\n\n.tooltip .arrow {\n position: absolute;\n display: block;\n width: 0.8rem;\n height: 0.4rem;\n}\n\n.tooltip .arrow::before {\n position: absolute;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-tooltip-top, .bs-tooltip-auto[x-placement^=\"top\"] {\n padding: 0.4rem 0;\n}\n\n.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=\"top\"] .arrow {\n bottom: 0;\n}\n\n.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=\"top\"] .arrow::before {\n top: 0;\n border-width: 0.4rem 0.4rem 0;\n border-top-color: #000;\n}\n\n.bs-tooltip-right, .bs-tooltip-auto[x-placement^=\"right\"] {\n padding: 0 0.4rem;\n}\n\n.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=\"right\"] .arrow {\n left: 0;\n width: 0.4rem;\n height: 0.8rem;\n}\n\n.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=\"right\"] .arrow::before {\n right: 0;\n border-width: 0.4rem 0.4rem 0.4rem 0;\n border-right-color: #000;\n}\n\n.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=\"bottom\"] {\n padding: 0.4rem 0;\n}\n\n.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow {\n top: 0;\n}\n\n.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow::before {\n bottom: 0;\n border-width: 0 0.4rem 0.4rem;\n border-bottom-color: #000;\n}\n\n.bs-tooltip-left, .bs-tooltip-auto[x-placement^=\"left\"] {\n padding: 0 0.4rem;\n}\n\n.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=\"left\"] .arrow {\n right: 0;\n width: 0.4rem;\n height: 0.8rem;\n}\n\n.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=\"left\"] .arrow::before {\n left: 0;\n border-width: 0.4rem 0 0.4rem 0.4rem;\n border-left-color: #000;\n}\n\n.tooltip-inner {\n max-width: 200px;\n padding: 0.25rem 0.5rem;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 0.25rem;\n}\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: block;\n max-width: 276px;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n}\n\n.popover .arrow {\n position: absolute;\n display: block;\n width: 1rem;\n height: 0.5rem;\n margin: 0 0.3rem;\n}\n\n.popover .arrow::before, .popover .arrow::after {\n position: absolute;\n display: block;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-popover-top, .bs-popover-auto[x-placement^=\"top\"] {\n margin-bottom: 0.5rem;\n}\n\n.bs-popover-top .arrow, .bs-popover-auto[x-placement^=\"top\"] .arrow {\n bottom: calc((0.5rem + 1px) * -1);\n}\n\n.bs-popover-top .arrow::before, .bs-popover-auto[x-placement^=\"top\"] .arrow::before,\n.bs-popover-top .arrow::after,\n.bs-popover-auto[x-placement^=\"top\"] .arrow::after {\n border-width: 0.5rem 0.5rem 0;\n}\n\n.bs-popover-top .arrow::before, .bs-popover-auto[x-placement^=\"top\"] .arrow::before {\n bottom: 0;\n border-top-color: rgba(0, 0, 0, 0.25);\n}\n\n\n.bs-popover-top .arrow::after,\n.bs-popover-auto[x-placement^=\"top\"] .arrow::after {\n bottom: 1px;\n border-top-color: #fff;\n}\n\n.bs-popover-right, .bs-popover-auto[x-placement^=\"right\"] {\n margin-left: 0.5rem;\n}\n\n.bs-popover-right .arrow, .bs-popover-auto[x-placement^=\"right\"] .arrow {\n left: calc((0.5rem + 1px) * -1);\n width: 0.5rem;\n height: 1rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-right .arrow::before, .bs-popover-auto[x-placement^=\"right\"] .arrow::before,\n.bs-popover-right .arrow::after,\n.bs-popover-auto[x-placement^=\"right\"] .arrow::after {\n border-width: 0.5rem 0.5rem 0.5rem 0;\n}\n\n.bs-popover-right .arrow::before, .bs-popover-auto[x-placement^=\"right\"] .arrow::before {\n left: 0;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n\n\n.bs-popover-right .arrow::after,\n.bs-popover-auto[x-placement^=\"right\"] .arrow::after {\n left: 1px;\n border-right-color: #fff;\n}\n\n.bs-popover-bottom, .bs-popover-auto[x-placement^=\"bottom\"] {\n margin-top: 0.5rem;\n}\n\n.bs-popover-bottom .arrow, .bs-popover-auto[x-placement^=\"bottom\"] .arrow {\n top: calc((0.5rem + 1px) * -1);\n}\n\n.bs-popover-bottom .arrow::before, .bs-popover-auto[x-placement^=\"bottom\"] .arrow::before,\n.bs-popover-bottom .arrow::after,\n.bs-popover-auto[x-placement^=\"bottom\"] .arrow::after {\n border-width: 0 0.5rem 0.5rem 0.5rem;\n}\n\n.bs-popover-bottom .arrow::before, .bs-popover-auto[x-placement^=\"bottom\"] .arrow::before {\n top: 0;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n\n\n.bs-popover-bottom .arrow::after,\n.bs-popover-auto[x-placement^=\"bottom\"] .arrow::after {\n top: 1px;\n border-bottom-color: #fff;\n}\n\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=\"bottom\"] .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: 1rem;\n margin-left: -0.5rem;\n content: \"\";\n border-bottom: 1px solid #f7f7f7;\n}\n\n.bs-popover-left, .bs-popover-auto[x-placement^=\"left\"] {\n margin-right: 0.5rem;\n}\n\n.bs-popover-left .arrow, .bs-popover-auto[x-placement^=\"left\"] .arrow {\n right: calc((0.5rem + 1px) * -1);\n width: 0.5rem;\n height: 1rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-left .arrow::before, .bs-popover-auto[x-placement^=\"left\"] .arrow::before,\n.bs-popover-left .arrow::after,\n.bs-popover-auto[x-placement^=\"left\"] .arrow::after {\n border-width: 0.5rem 0 0.5rem 0.5rem;\n}\n\n.bs-popover-left .arrow::before, .bs-popover-auto[x-placement^=\"left\"] .arrow::before {\n right: 0;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n\n\n.bs-popover-left .arrow::after,\n.bs-popover-auto[x-placement^=\"left\"] .arrow::after {\n right: 1px;\n border-left-color: #fff;\n}\n\n.popover-header {\n padding: 0.5rem 0.75rem;\n margin-bottom: 0;\n font-size: 1rem;\n color: inherit;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-top-left-radius: calc(0.3rem - 1px);\n border-top-right-radius: calc(0.3rem - 1px);\n}\n\n.popover-header:empty {\n display: none;\n}\n\n.popover-body {\n padding: 0.5rem 0.75rem;\n color: #212529;\n}\n\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n\n.carousel-item {\n position: relative;\n display: none;\n align-items: center;\n width: 100%;\n transition: transform 0.6s ease;\n backface-visibility: hidden;\n perspective: 1000px;\n}\n\n@media screen and (prefers-reduced-motion: reduce) {\n .carousel-item {\n transition: none;\n }\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n.carousel-item-next,\n.carousel-item-prev {\n position: absolute;\n top: 0;\n}\n\n.carousel-item-next.carousel-item-left,\n.carousel-item-prev.carousel-item-right {\n transform: translateX(0);\n}\n\n@supports (transform-style: preserve-3d) {\n .carousel-item-next.carousel-item-left,\n .carousel-item-prev.carousel-item-right {\n transform: translate3d(0, 0, 0);\n }\n}\n\n.carousel-item-next,\n.active.carousel-item-right {\n transform: translateX(100%);\n}\n\n@supports (transform-style: preserve-3d) {\n .carousel-item-next,\n .active.carousel-item-right {\n transform: translate3d(100%, 0, 0);\n }\n}\n\n.carousel-item-prev,\n.active.carousel-item-left {\n transform: translateX(-100%);\n}\n\n@supports (transform-style: preserve-3d) {\n .carousel-item-prev,\n .active.carousel-item-left {\n transform: translate3d(-100%, 0, 0);\n }\n}\n\n.carousel-fade .carousel-item {\n opacity: 0;\n transition-duration: .6s;\n transition-property: opacity;\n}\n\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-left,\n.carousel-fade .carousel-item-prev.carousel-item-right {\n opacity: 1;\n}\n\n.carousel-fade .active.carousel-item-left,\n.carousel-fade .active.carousel-item-right {\n opacity: 0;\n}\n\n.carousel-fade .carousel-item-next,\n.carousel-fade .carousel-item-prev,\n.carousel-fade .carousel-item.active,\n.carousel-fade .active.carousel-item-left,\n.carousel-fade .active.carousel-item-prev {\n transform: translateX(0);\n}\n\n@supports (transform-style: preserve-3d) {\n .carousel-fade .carousel-item-next,\n .carousel-fade .carousel-item-prev,\n .carousel-fade .carousel-item.active,\n .carousel-fade .active.carousel-item-left,\n .carousel-fade .active.carousel-item-prev {\n transform: translate3d(0, 0, 0);\n }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 15%;\n color: #fff;\n text-align: center;\n opacity: 0.5;\n}\n\n.carousel-control-prev:hover, .carousel-control-prev:focus,\n.carousel-control-next:hover,\n.carousel-control-next:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n opacity: .9;\n}\n\n.carousel-control-prev {\n left: 0;\n}\n\n.carousel-control-next {\n right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: 20px;\n height: 20px;\n background: transparent no-repeat center center;\n background-size: 100% 100%;\n}\n\n.carousel-control-prev-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E\");\n}\n\n.carousel-control-next-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E\");\n}\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 10px;\n left: 0;\n z-index: 15;\n display: flex;\n justify-content: center;\n padding-left: 0;\n margin-right: 15%;\n margin-left: 15%;\n list-style: none;\n}\n\n.carousel-indicators li {\n position: relative;\n flex: 0 1 auto;\n width: 30px;\n height: 3px;\n margin-right: 3px;\n margin-left: 3px;\n text-indent: -999px;\n cursor: pointer;\n background-color: rgba(255, 255, 255, 0.5);\n}\n\n.carousel-indicators li::before {\n position: absolute;\n top: -10px;\n left: 0;\n display: inline-block;\n width: 100%;\n height: 10px;\n content: \"\";\n}\n\n.carousel-indicators li::after {\n position: absolute;\n bottom: -10px;\n left: 0;\n display: inline-block;\n width: 100%;\n height: 10px;\n content: \"\";\n}\n\n.carousel-indicators .active {\n background-color: #fff;\n}\n\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n}\n\n.align-baseline {\n vertical-align: baseline !important;\n}\n\n.align-top {\n vertical-align: top !important;\n}\n\n.align-middle {\n vertical-align: middle !important;\n}\n\n.align-bottom {\n vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n vertical-align: text-top !important;\n}\n\n.bg-primary {\n background-color: #007bff !important;\n}\n\na.bg-primary:hover, a.bg-primary:focus,\nbutton.bg-primary:hover,\nbutton.bg-primary:focus {\n background-color: #0062cc !important;\n}\n\n.bg-secondary {\n background-color: #6c757d !important;\n}\n\na.bg-secondary:hover, a.bg-secondary:focus,\nbutton.bg-secondary:hover,\nbutton.bg-secondary:focus {\n background-color: #545b62 !important;\n}\n\n.bg-success {\n background-color: #28a745 !important;\n}\n\na.bg-success:hover, a.bg-success:focus,\nbutton.bg-success:hover,\nbutton.bg-success:focus {\n background-color: #1e7e34 !important;\n}\n\n.bg-info {\n background-color: #17a2b8 !important;\n}\n\na.bg-info:hover, a.bg-info:focus,\nbutton.bg-info:hover,\nbutton.bg-info:focus {\n background-color: #117a8b !important;\n}\n\n.bg-warning {\n background-color: #ffc107 !important;\n}\n\na.bg-warning:hover, a.bg-warning:focus,\nbutton.bg-warning:hover,\nbutton.bg-warning:focus {\n background-color: #d39e00 !important;\n}\n\n.bg-danger {\n background-color: #dc3545 !important;\n}\n\na.bg-danger:hover, a.bg-danger:focus,\nbutton.bg-danger:hover,\nbutton.bg-danger:focus {\n background-color: #bd2130 !important;\n}\n\n.bg-light {\n background-color: #f8f9fa !important;\n}\n\na.bg-light:hover, a.bg-light:focus,\nbutton.bg-light:hover,\nbutton.bg-light:focus {\n background-color: #dae0e5 !important;\n}\n\n.bg-dark {\n background-color: #343a40 !important;\n}\n\na.bg-dark:hover, a.bg-dark:focus,\nbutton.bg-dark:hover,\nbutton.bg-dark:focus {\n background-color: #1d2124 !important;\n}\n\n.bg-white {\n background-color: #fff !important;\n}\n\n.bg-transparent {\n background-color: transparent !important;\n}\n\n.border {\n border: 1px solid #dee2e6 !important;\n}\n\n.border-top {\n border-top: 1px solid #dee2e6 !important;\n}\n\n.border-right {\n border-right: 1px solid #dee2e6 !important;\n}\n\n.border-bottom {\n border-bottom: 1px solid #dee2e6 !important;\n}\n\n.border-left {\n border-left: 1px solid #dee2e6 !important;\n}\n\n.border-0 {\n border: 0 !important;\n}\n\n.border-top-0 {\n border-top: 0 !important;\n}\n\n.border-right-0 {\n border-right: 0 !important;\n}\n\n.border-bottom-0 {\n border-bottom: 0 !important;\n}\n\n.border-left-0 {\n border-left: 0 !important;\n}\n\n.border-primary {\n border-color: #007bff !important;\n}\n\n.border-secondary {\n border-color: #6c757d !important;\n}\n\n.border-success {\n border-color: #28a745 !important;\n}\n\n.border-info {\n border-color: #17a2b8 !important;\n}\n\n.border-warning {\n border-color: #ffc107 !important;\n}\n\n.border-danger {\n border-color: #dc3545 !important;\n}\n\n.border-light {\n border-color: #f8f9fa !important;\n}\n\n.border-dark {\n border-color: #343a40 !important;\n}\n\n.border-white {\n border-color: #fff !important;\n}\n\n.rounded {\n border-radius: 0.25rem !important;\n}\n\n.rounded-top {\n border-top-left-radius: 0.25rem !important;\n border-top-right-radius: 0.25rem !important;\n}\n\n.rounded-right {\n border-top-right-radius: 0.25rem !important;\n border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-bottom {\n border-bottom-right-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-left {\n border-top-left-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-circle {\n border-radius: 50% !important;\n}\n\n.rounded-0 {\n border-radius: 0 !important;\n}\n\n.clearfix::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.d-none {\n display: none !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-none {\n display: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 768px) {\n .d-md-none {\n display: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 992px) {\n .d-lg-none {\n display: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1200px) {\n .d-xl-none {\n display: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media print {\n .d-print-none {\n display: none !important;\n }\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: flex !important;\n }\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n}\n\n.embed-responsive {\n position: relative;\n display: block;\n width: 100%;\n padding: 0;\n overflow: hidden;\n}\n\n.embed-responsive::before {\n display: block;\n content: \"\";\n}\n\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n\n.embed-responsive-21by9::before {\n padding-top: 42.857143%;\n}\n\n.embed-responsive-16by9::before {\n padding-top: 56.25%;\n}\n\n.embed-responsive-4by3::before {\n padding-top: 75%;\n}\n\n.embed-responsive-1by1::before {\n padding-top: 100%;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 992px) {\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1200px) {\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n}\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.float-none {\n float: none !important;\n}\n\n@media (min-width: 576px) {\n .float-sm-left {\n float: left !important;\n }\n .float-sm-right {\n float: right !important;\n }\n .float-sm-none {\n float: none !important;\n }\n}\n\n@media (min-width: 768px) {\n .float-md-left {\n float: left !important;\n }\n .float-md-right {\n float: right !important;\n }\n .float-md-none {\n float: none !important;\n }\n}\n\n@media (min-width: 992px) {\n .float-lg-left {\n float: left !important;\n }\n .float-lg-right {\n float: right !important;\n }\n .float-lg-none {\n float: none !important;\n }\n}\n\n@media (min-width: 1200px) {\n .float-xl-left {\n float: left !important;\n }\n .float-xl-right {\n float: right !important;\n }\n .float-xl-none {\n float: none !important;\n }\n}\n\n.position-static {\n position: static !important;\n}\n\n.position-relative {\n position: relative !important;\n}\n\n.position-absolute {\n position: absolute !important;\n}\n\n.position-fixed {\n position: fixed !important;\n}\n\n.position-sticky {\n position: sticky !important;\n}\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1030;\n}\n\n@supports (position: sticky) {\n .sticky-top {\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n}\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n overflow: visible;\n clip: auto;\n white-space: normal;\n}\n\n.shadow-sm {\n box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\n}\n\n.shadow {\n box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\n}\n\n.shadow-lg {\n box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\n}\n\n.shadow-none {\n box-shadow: none !important;\n}\n\n.w-25 {\n width: 25% !important;\n}\n\n.w-50 {\n width: 50% !important;\n}\n\n.w-75 {\n width: 75% !important;\n}\n\n.w-100 {\n width: 100% !important;\n}\n\n.w-auto {\n width: auto !important;\n}\n\n.h-25 {\n height: 25% !important;\n}\n\n.h-50 {\n height: 50% !important;\n}\n\n.h-75 {\n height: 75% !important;\n}\n\n.h-100 {\n height: 100% !important;\n}\n\n.h-auto {\n height: auto !important;\n}\n\n.mw-100 {\n max-width: 100% !important;\n}\n\n.mh-100 {\n max-height: 100% !important;\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n margin-left: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.mt-1,\n.my-1 {\n margin-top: 0.25rem !important;\n}\n\n.mr-1,\n.mx-1 {\n margin-right: 0.25rem !important;\n}\n\n.mb-1,\n.my-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.ml-1,\n.mx-1 {\n margin-left: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.mt-2,\n.my-2 {\n margin-top: 0.5rem !important;\n}\n\n.mr-2,\n.mx-2 {\n margin-right: 0.5rem !important;\n}\n\n.mb-2,\n.my-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.ml-2,\n.mx-2 {\n margin-left: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.mt-3,\n.my-3 {\n margin-top: 1rem !important;\n}\n\n.mr-3,\n.mx-3 {\n margin-right: 1rem !important;\n}\n\n.mb-3,\n.my-3 {\n margin-bottom: 1rem !important;\n}\n\n.ml-3,\n.mx-3 {\n margin-left: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.mt-4,\n.my-4 {\n margin-top: 1.5rem !important;\n}\n\n.mr-4,\n.mx-4 {\n margin-right: 1.5rem !important;\n}\n\n.mb-4,\n.my-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.ml-4,\n.mx-4 {\n margin-left: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.mt-5,\n.my-5 {\n margin-top: 3rem !important;\n}\n\n.mr-5,\n.mx-5 {\n margin-right: 3rem !important;\n}\n\n.mb-5,\n.my-5 {\n margin-bottom: 3rem !important;\n}\n\n.ml-5,\n.mx-5 {\n margin-left: 3rem !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n padding-left: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.pt-1,\n.py-1 {\n padding-top: 0.25rem !important;\n}\n\n.pr-1,\n.px-1 {\n padding-right: 0.25rem !important;\n}\n\n.pb-1,\n.py-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pl-1,\n.px-1 {\n padding-left: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.pt-2,\n.py-2 {\n padding-top: 0.5rem !important;\n}\n\n.pr-2,\n.px-2 {\n padding-right: 0.5rem !important;\n}\n\n.pb-2,\n.py-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pl-2,\n.px-2 {\n padding-left: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.pt-3,\n.py-3 {\n padding-top: 1rem !important;\n}\n\n.pr-3,\n.px-3 {\n padding-right: 1rem !important;\n}\n\n.pb-3,\n.py-3 {\n padding-bottom: 1rem !important;\n}\n\n.pl-3,\n.px-3 {\n padding-left: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.pt-4,\n.py-4 {\n padding-top: 1.5rem !important;\n}\n\n.pr-4,\n.px-4 {\n padding-right: 1.5rem !important;\n}\n\n.pb-4,\n.py-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pl-4,\n.px-4 {\n padding-left: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.pt-5,\n.py-5 {\n padding-top: 3rem !important;\n}\n\n.pr-5,\n.px-5 {\n padding-right: 3rem !important;\n}\n\n.pb-5,\n.py-5 {\n padding-bottom: 3rem !important;\n}\n\n.pl-5,\n.px-5 {\n padding-left: 3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n margin-left: auto !important;\n}\n\n@media (min-width: 576px) {\n .m-sm-0 {\n margin: 0 !important;\n }\n .mt-sm-0,\n .my-sm-0 {\n margin-top: 0 !important;\n }\n .mr-sm-0,\n .mx-sm-0 {\n margin-right: 0 !important;\n }\n .mb-sm-0,\n .my-sm-0 {\n margin-bottom: 0 !important;\n }\n .ml-sm-0,\n .mx-sm-0 {\n margin-left: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .mt-sm-1,\n .my-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mr-sm-1,\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n }\n .mb-sm-1,\n .my-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-sm-1,\n .mx-sm-1 {\n margin-left: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .mt-sm-2,\n .my-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mr-sm-2,\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n }\n .mb-sm-2,\n .my-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-sm-2,\n .mx-sm-2 {\n margin-left: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .mt-sm-3,\n .my-sm-3 {\n margin-top: 1rem !important;\n }\n .mr-sm-3,\n .mx-sm-3 {\n margin-right: 1rem !important;\n }\n .mb-sm-3,\n .my-sm-3 {\n margin-bottom: 1rem !important;\n }\n .ml-sm-3,\n .mx-sm-3 {\n margin-left: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .mt-sm-4,\n .my-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mr-sm-4,\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n }\n .mb-sm-4,\n .my-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-sm-4,\n .mx-sm-4 {\n margin-left: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .mt-sm-5,\n .my-sm-5 {\n margin-top: 3rem !important;\n }\n .mr-sm-5,\n .mx-sm-5 {\n margin-right: 3rem !important;\n }\n .mb-sm-5,\n .my-sm-5 {\n margin-bottom: 3rem !important;\n }\n .ml-sm-5,\n .mx-sm-5 {\n margin-left: 3rem !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .pt-sm-0,\n .py-sm-0 {\n padding-top: 0 !important;\n }\n .pr-sm-0,\n .px-sm-0 {\n padding-right: 0 !important;\n }\n .pb-sm-0,\n .py-sm-0 {\n padding-bottom: 0 !important;\n }\n .pl-sm-0,\n .px-sm-0 {\n padding-left: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .pt-sm-1,\n .py-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pr-sm-1,\n .px-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pb-sm-1,\n .py-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-sm-1,\n .px-sm-1 {\n padding-left: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .pt-sm-2,\n .py-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pr-sm-2,\n .px-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pb-sm-2,\n .py-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-sm-2,\n .px-sm-2 {\n padding-left: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .pt-sm-3,\n .py-sm-3 {\n padding-top: 1rem !important;\n }\n .pr-sm-3,\n .px-sm-3 {\n padding-right: 1rem !important;\n }\n .pb-sm-3,\n .py-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pl-sm-3,\n .px-sm-3 {\n padding-left: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .pt-sm-4,\n .py-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pr-sm-4,\n .px-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pb-sm-4,\n .py-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-sm-4,\n .px-sm-4 {\n padding-left: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .pt-sm-5,\n .py-sm-5 {\n padding-top: 3rem !important;\n }\n .pr-sm-5,\n .px-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-5,\n .py-sm-5 {\n padding-bottom: 3rem !important;\n }\n .pl-sm-5,\n .px-sm-5 {\n padding-left: 3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mt-sm-auto,\n .my-sm-auto {\n margin-top: auto !important;\n }\n .mr-sm-auto,\n .mx-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-auto,\n .my-sm-auto {\n margin-bottom: auto !important;\n }\n .ml-sm-auto,\n .mx-sm-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 768px) {\n .m-md-0 {\n margin: 0 !important;\n }\n .mt-md-0,\n .my-md-0 {\n margin-top: 0 !important;\n }\n .mr-md-0,\n .mx-md-0 {\n margin-right: 0 !important;\n }\n .mb-md-0,\n .my-md-0 {\n margin-bottom: 0 !important;\n }\n .ml-md-0,\n .mx-md-0 {\n margin-left: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .mt-md-1,\n .my-md-1 {\n margin-top: 0.25rem !important;\n }\n .mr-md-1,\n .mx-md-1 {\n margin-right: 0.25rem !important;\n }\n .mb-md-1,\n .my-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-md-1,\n .mx-md-1 {\n margin-left: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .mt-md-2,\n .my-md-2 {\n margin-top: 0.5rem !important;\n }\n .mr-md-2,\n .mx-md-2 {\n margin-right: 0.5rem !important;\n }\n .mb-md-2,\n .my-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-md-2,\n .mx-md-2 {\n margin-left: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .mt-md-3,\n .my-md-3 {\n margin-top: 1rem !important;\n }\n .mr-md-3,\n .mx-md-3 {\n margin-right: 1rem !important;\n }\n .mb-md-3,\n .my-md-3 {\n margin-bottom: 1rem !important;\n }\n .ml-md-3,\n .mx-md-3 {\n margin-left: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .mt-md-4,\n .my-md-4 {\n margin-top: 1.5rem !important;\n }\n .mr-md-4,\n .mx-md-4 {\n margin-right: 1.5rem !important;\n }\n .mb-md-4,\n .my-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-md-4,\n .mx-md-4 {\n margin-left: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .mt-md-5,\n .my-md-5 {\n margin-top: 3rem !important;\n }\n .mr-md-5,\n .mx-md-5 {\n margin-right: 3rem !important;\n }\n .mb-md-5,\n .my-md-5 {\n margin-bottom: 3rem !important;\n }\n .ml-md-5,\n .mx-md-5 {\n margin-left: 3rem !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .pt-md-0,\n .py-md-0 {\n padding-top: 0 !important;\n }\n .pr-md-0,\n .px-md-0 {\n padding-right: 0 !important;\n }\n .pb-md-0,\n .py-md-0 {\n padding-bottom: 0 !important;\n }\n .pl-md-0,\n .px-md-0 {\n padding-left: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .pt-md-1,\n .py-md-1 {\n padding-top: 0.25rem !important;\n }\n .pr-md-1,\n .px-md-1 {\n padding-right: 0.25rem !important;\n }\n .pb-md-1,\n .py-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-md-1,\n .px-md-1 {\n padding-left: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .pt-md-2,\n .py-md-2 {\n padding-top: 0.5rem !important;\n }\n .pr-md-2,\n .px-md-2 {\n padding-right: 0.5rem !important;\n }\n .pb-md-2,\n .py-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-md-2,\n .px-md-2 {\n padding-left: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .pt-md-3,\n .py-md-3 {\n padding-top: 1rem !important;\n }\n .pr-md-3,\n .px-md-3 {\n padding-right: 1rem !important;\n }\n .pb-md-3,\n .py-md-3 {\n padding-bottom: 1rem !important;\n }\n .pl-md-3,\n .px-md-3 {\n padding-left: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .pt-md-4,\n .py-md-4 {\n padding-top: 1.5rem !important;\n }\n .pr-md-4,\n .px-md-4 {\n padding-right: 1.5rem !important;\n }\n .pb-md-4,\n .py-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-md-4,\n .px-md-4 {\n padding-left: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .pt-md-5,\n .py-md-5 {\n padding-top: 3rem !important;\n }\n .pr-md-5,\n .px-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-5,\n .py-md-5 {\n padding-bottom: 3rem !important;\n }\n .pl-md-5,\n .px-md-5 {\n padding-left: 3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mt-md-auto,\n .my-md-auto {\n margin-top: auto !important;\n }\n .mr-md-auto,\n .mx-md-auto {\n margin-right: auto !important;\n }\n .mb-md-auto,\n .my-md-auto {\n margin-bottom: auto !important;\n }\n .ml-md-auto,\n .mx-md-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 992px) {\n .m-lg-0 {\n margin: 0 !important;\n }\n .mt-lg-0,\n .my-lg-0 {\n margin-top: 0 !important;\n }\n .mr-lg-0,\n .mx-lg-0 {\n margin-right: 0 !important;\n }\n .mb-lg-0,\n .my-lg-0 {\n margin-bottom: 0 !important;\n }\n .ml-lg-0,\n .mx-lg-0 {\n margin-left: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .mt-lg-1,\n .my-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mr-lg-1,\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n }\n .mb-lg-1,\n .my-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-lg-1,\n .mx-lg-1 {\n margin-left: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .mt-lg-2,\n .my-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mr-lg-2,\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n }\n .mb-lg-2,\n .my-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-lg-2,\n .mx-lg-2 {\n margin-left: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .mt-lg-3,\n .my-lg-3 {\n margin-top: 1rem !important;\n }\n .mr-lg-3,\n .mx-lg-3 {\n margin-right: 1rem !important;\n }\n .mb-lg-3,\n .my-lg-3 {\n margin-bottom: 1rem !important;\n }\n .ml-lg-3,\n .mx-lg-3 {\n margin-left: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .mt-lg-4,\n .my-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mr-lg-4,\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n }\n .mb-lg-4,\n .my-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-lg-4,\n .mx-lg-4 {\n margin-left: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .mt-lg-5,\n .my-lg-5 {\n margin-top: 3rem !important;\n }\n .mr-lg-5,\n .mx-lg-5 {\n margin-right: 3rem !important;\n }\n .mb-lg-5,\n .my-lg-5 {\n margin-bottom: 3rem !important;\n }\n .ml-lg-5,\n .mx-lg-5 {\n margin-left: 3rem !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .pt-lg-0,\n .py-lg-0 {\n padding-top: 0 !important;\n }\n .pr-lg-0,\n .px-lg-0 {\n padding-right: 0 !important;\n }\n .pb-lg-0,\n .py-lg-0 {\n padding-bottom: 0 !important;\n }\n .pl-lg-0,\n .px-lg-0 {\n padding-left: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .pt-lg-1,\n .py-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pr-lg-1,\n .px-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pb-lg-1,\n .py-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-lg-1,\n .px-lg-1 {\n padding-left: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .pt-lg-2,\n .py-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pr-lg-2,\n .px-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pb-lg-2,\n .py-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-lg-2,\n .px-lg-2 {\n padding-left: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .pt-lg-3,\n .py-lg-3 {\n padding-top: 1rem !important;\n }\n .pr-lg-3,\n .px-lg-3 {\n padding-right: 1rem !important;\n }\n .pb-lg-3,\n .py-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pl-lg-3,\n .px-lg-3 {\n padding-left: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .pt-lg-4,\n .py-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pr-lg-4,\n .px-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pb-lg-4,\n .py-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-lg-4,\n .px-lg-4 {\n padding-left: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .pt-lg-5,\n .py-lg-5 {\n padding-top: 3rem !important;\n }\n .pr-lg-5,\n .px-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-5,\n .py-lg-5 {\n padding-bottom: 3rem !important;\n }\n .pl-lg-5,\n .px-lg-5 {\n padding-left: 3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mt-lg-auto,\n .my-lg-auto {\n margin-top: auto !important;\n }\n .mr-lg-auto,\n .mx-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-auto,\n .my-lg-auto {\n margin-bottom: auto !important;\n }\n .ml-lg-auto,\n .mx-lg-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 1200px) {\n .m-xl-0 {\n margin: 0 !important;\n }\n .mt-xl-0,\n .my-xl-0 {\n margin-top: 0 !important;\n }\n .mr-xl-0,\n .mx-xl-0 {\n margin-right: 0 !important;\n }\n .mb-xl-0,\n .my-xl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xl-0,\n .mx-xl-0 {\n margin-left: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .mt-xl-1,\n .my-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mr-xl-1,\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n }\n .mb-xl-1,\n .my-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-xl-1,\n .mx-xl-1 {\n margin-left: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .mt-xl-2,\n .my-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mr-xl-2,\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n }\n .mb-xl-2,\n .my-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-xl-2,\n .mx-xl-2 {\n margin-left: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .mt-xl-3,\n .my-xl-3 {\n margin-top: 1rem !important;\n }\n .mr-xl-3,\n .mx-xl-3 {\n margin-right: 1rem !important;\n }\n .mb-xl-3,\n .my-xl-3 {\n margin-bottom: 1rem !important;\n }\n .ml-xl-3,\n .mx-xl-3 {\n margin-left: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .mt-xl-4,\n .my-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mr-xl-4,\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n }\n .mb-xl-4,\n .my-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-xl-4,\n .mx-xl-4 {\n margin-left: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .mt-xl-5,\n .my-xl-5 {\n margin-top: 3rem !important;\n }\n .mr-xl-5,\n .mx-xl-5 {\n margin-right: 3rem !important;\n }\n .mb-xl-5,\n .my-xl-5 {\n margin-bottom: 3rem !important;\n }\n .ml-xl-5,\n .mx-xl-5 {\n margin-left: 3rem !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .pt-xl-0,\n .py-xl-0 {\n padding-top: 0 !important;\n }\n .pr-xl-0,\n .px-xl-0 {\n padding-right: 0 !important;\n }\n .pb-xl-0,\n .py-xl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xl-0,\n .px-xl-0 {\n padding-left: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .pt-xl-1,\n .py-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pr-xl-1,\n .px-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pb-xl-1,\n .py-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-xl-1,\n .px-xl-1 {\n padding-left: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .pt-xl-2,\n .py-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pr-xl-2,\n .px-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pb-xl-2,\n .py-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-xl-2,\n .px-xl-2 {\n padding-left: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .pt-xl-3,\n .py-xl-3 {\n padding-top: 1rem !important;\n }\n .pr-xl-3,\n .px-xl-3 {\n padding-right: 1rem !important;\n }\n .pb-xl-3,\n .py-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pl-xl-3,\n .px-xl-3 {\n padding-left: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .pt-xl-4,\n .py-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pr-xl-4,\n .px-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pb-xl-4,\n .py-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-xl-4,\n .px-xl-4 {\n padding-left: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .pt-xl-5,\n .py-xl-5 {\n padding-top: 3rem !important;\n }\n .pr-xl-5,\n .px-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-5,\n .py-xl-5 {\n padding-bottom: 3rem !important;\n }\n .pl-xl-5,\n .px-xl-5 {\n padding-left: 3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mt-xl-auto,\n .my-xl-auto {\n margin-top: auto !important;\n }\n .mr-xl-auto,\n .mx-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-auto,\n .my-xl-auto {\n margin-bottom: auto !important;\n }\n .ml-xl-auto,\n .mx-xl-auto {\n margin-left: auto !important;\n }\n}\n\n.text-monospace {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n.text-justify {\n text-align: justify !important;\n}\n\n.text-nowrap {\n white-space: nowrap !important;\n}\n\n.text-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n@media (min-width: 576px) {\n .text-sm-left {\n text-align: left !important;\n }\n .text-sm-right {\n text-align: right !important;\n }\n .text-sm-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 768px) {\n .text-md-left {\n text-align: left !important;\n }\n .text-md-right {\n text-align: right !important;\n }\n .text-md-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 992px) {\n .text-lg-left {\n text-align: left !important;\n }\n .text-lg-right {\n text-align: right !important;\n }\n .text-lg-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 1200px) {\n .text-xl-left {\n text-align: left !important;\n }\n .text-xl-right {\n text-align: right !important;\n }\n .text-xl-center {\n text-align: center !important;\n }\n}\n\n.text-lowercase {\n text-transform: lowercase !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n\n.text-capitalize {\n text-transform: capitalize !important;\n}\n\n.font-weight-light {\n font-weight: 300 !important;\n}\n\n.font-weight-normal {\n font-weight: 400 !important;\n}\n\n.font-weight-bold {\n font-weight: 700 !important;\n}\n\n.font-italic {\n font-style: italic !important;\n}\n\n.text-white {\n color: #fff !important;\n}\n\n.text-primary {\n color: #007bff !important;\n}\n\na.text-primary:hover, a.text-primary:focus {\n color: #0062cc !important;\n}\n\n.text-secondary {\n color: #6c757d !important;\n}\n\na.text-secondary:hover, a.text-secondary:focus {\n color: #545b62 !important;\n}\n\n.text-success {\n color: #28a745 !important;\n}\n\na.text-success:hover, a.text-success:focus {\n color: #1e7e34 !important;\n}\n\n.text-info {\n color: #17a2b8 !important;\n}\n\na.text-info:hover, a.text-info:focus {\n color: #117a8b !important;\n}\n\n.text-warning {\n color: #ffc107 !important;\n}\n\na.text-warning:hover, a.text-warning:focus {\n color: #d39e00 !important;\n}\n\n.text-danger {\n color: #dc3545 !important;\n}\n\na.text-danger:hover, a.text-danger:focus {\n color: #bd2130 !important;\n}\n\n.text-light {\n color: #f8f9fa !important;\n}\n\na.text-light:hover, a.text-light:focus {\n color: #dae0e5 !important;\n}\n\n.text-dark {\n color: #343a40 !important;\n}\n\na.text-dark:hover, a.text-dark:focus {\n color: #1d2124 !important;\n}\n\n.text-body {\n color: #212529 !important;\n}\n\n.text-muted {\n color: #6c757d !important;\n}\n\n.text-black-50 {\n color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n\n@media print {\n *,\n *::before,\n *::after {\n text-shadow: none !important;\n box-shadow: none !important;\n }\n a:not(.btn) {\n text-decoration: underline;\n }\n abbr[title]::after {\n content: \" (\" attr(title) \")\";\n }\n pre {\n white-space: pre-wrap !important;\n }\n pre,\n blockquote {\n border: 1px solid #adb5bd;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n @page {\n size: a3;\n }\n body {\n min-width: 992px !important;\n }\n .container {\n min-width: 992px !important;\n }\n .navbar {\n display: none;\n }\n .badge {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #dee2e6 !important;\n }\n .table-dark {\n color: inherit;\n }\n .table-dark th,\n .table-dark td,\n .table-dark thead th,\n .table-dark tbody + tbody {\n border-color: #dee2e6;\n }\n .table .thead-dark th {\n color: inherit;\n border-color: #dee2e6;\n }\n}\n\n/*# sourceMappingURL=bootstrap.css.map */","// Hover mixin and `$enable-hover-media-query` are deprecated.\n//\n// Origally added during our alphas and maintained during betas, this mixin was\n// designed to prevent `:hover` stickiness on iOS-an issue where hover styles\n// would persist after initial touch.\n//\n// For backward compatibility, we've kept these mixins and updated them to\n// always return their regular pseudo-classes instead of a shimmed media query.\n//\n// Issue: https://github.com/twbs/bootstrap/issues/25195\n\n@mixin hover {\n &:hover { @content; }\n}\n\n@mixin hover-focus {\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin plain-hover-focus {\n &,\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin hover-focus-active {\n &:hover,\n &:focus,\n &:active {\n @content;\n }\n}\n","// stylelint-disable declaration-no-important, selector-list-comma-newline-after\n\n//\n// Headings\n//\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: $headings-color;\n}\n\nh1, .h1 { font-size: $h1-font-size; }\nh2, .h2 { font-size: $h2-font-size; }\nh3, .h3 { font-size: $h3-font-size; }\nh4, .h4 { font-size: $h4-font-size; }\nh5, .h5 { font-size: $h5-font-size; }\nh6, .h6 { font-size: $h6-font-size; }\n\n.lead {\n font-size: $lead-font-size;\n font-weight: $lead-font-weight;\n}\n\n// Type display classes\n.display-1 {\n font-size: $display1-size;\n font-weight: $display1-weight;\n line-height: $display-line-height;\n}\n.display-2 {\n font-size: $display2-size;\n font-weight: $display2-weight;\n line-height: $display-line-height;\n}\n.display-3 {\n font-size: $display3-size;\n font-weight: $display3-weight;\n line-height: $display-line-height;\n}\n.display-4 {\n font-size: $display4-size;\n font-weight: $display4-weight;\n line-height: $display-line-height;\n}\n\n\n//\n// Horizontal rules\n//\n\nhr {\n margin-top: $hr-margin-y;\n margin-bottom: $hr-margin-y;\n border: 0;\n border-top: $hr-border-width solid $hr-border-color;\n}\n\n\n//\n// Emphasis\n//\n\nsmall,\n.small {\n font-size: $small-font-size;\n font-weight: $font-weight-normal;\n}\n\nmark,\n.mark {\n padding: $mark-padding;\n background-color: $mark-bg;\n}\n\n\n//\n// Lists\n//\n\n.list-unstyled {\n @include list-unstyled;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n @include list-unstyled;\n}\n.list-inline-item {\n display: inline-block;\n\n &:not(:last-child) {\n margin-right: $list-inline-padding;\n }\n}\n\n\n//\n// Misc\n//\n\n// Builds on `abbr`\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n// Blockquotes\n.blockquote {\n margin-bottom: $spacer;\n font-size: $blockquote-font-size;\n}\n\n.blockquote-footer {\n display: block;\n font-size: 80%; // back to default font-size\n color: $blockquote-small-color;\n\n &::before {\n content: \"\\2014 \\00A0\"; // em dash, nbsp\n }\n}\n","// Lists\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n@mixin list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n","// Responsive images (ensure images don't scale beyond their parents)\n//\n// This is purposefully opt-in via an explicit class rather than being the default for all `<img>`s.\n// We previously tried the \"images are responsive by default\" approach in Bootstrap v2,\n// and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps)\n// which weren't expecting the images within themselves to be involuntarily resized.\n// See also https://github.com/twbs/bootstrap/issues/18178\n.img-fluid {\n @include img-fluid;\n}\n\n\n// Image thumbnails\n.img-thumbnail {\n padding: $thumbnail-padding;\n background-color: $thumbnail-bg;\n border: $thumbnail-border-width solid $thumbnail-border-color;\n @include border-radius($thumbnail-border-radius);\n @include box-shadow($thumbnail-box-shadow);\n\n // Keep them at most 100% wide\n @include img-fluid;\n}\n\n//\n// Figures\n//\n\n.figure {\n // Ensures the caption's text aligns with the image.\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: ($spacer / 2);\n line-height: 1;\n}\n\n.figure-caption {\n font-size: $figure-caption-font-size;\n color: $figure-caption-color;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n\n@mixin img-fluid {\n // Part 1: Set a maximum relative to the parent\n max-width: 100%;\n // Part 2: Override the height to auto, otherwise images will be stretched\n // when setting a width and height attribute on the img element.\n height: auto;\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size.\n\n// stylelint-disable indentation, media-query-list-comma-newline-after\n@mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) {\n background-image: url($file-1x);\n\n // Autoprefixer takes care of adding -webkit-min-device-pixel-ratio and -o-min-device-pixel-ratio,\n // but doesn't convert dppx=>dpi.\n // There's no such thing as unprefixed min-device-pixel-ratio since it's nonstandard.\n // Compatibility info: https://caniuse.com/#feat=css-media-resolution\n @media only screen and (min-resolution: 192dpi), // IE9-11 don't support dppx\n only screen and (min-resolution: 2dppx) { // Standardized\n background-image: url($file-2x);\n background-size: $width-1x $height-1x;\n }\n}\n","// Single side border-radius\n\n@mixin border-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-radius: $radius;\n }\n}\n\n@mixin border-top-radius($radius) {\n @if $enable-rounded {\n border-top-left-radius: $radius;\n border-top-right-radius: $radius;\n }\n}\n\n@mixin border-right-radius($radius) {\n @if $enable-rounded {\n border-top-right-radius: $radius;\n border-bottom-right-radius: $radius;\n }\n}\n\n@mixin border-bottom-radius($radius) {\n @if $enable-rounded {\n border-bottom-right-radius: $radius;\n border-bottom-left-radius: $radius;\n }\n}\n\n@mixin border-left-radius($radius) {\n @if $enable-rounded {\n border-top-left-radius: $radius;\n border-bottom-left-radius: $radius;\n }\n}\n","// Inline code\ncode {\n font-size: $code-font-size;\n color: $code-color;\n word-break: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n font-size: $kbd-font-size;\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n @include box-shadow($kbd-box-shadow);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: $nested-kbd-font-weight;\n @include box-shadow(none);\n }\n}\n\n// Blocks of code\npre {\n display: block;\n font-size: $code-font-size;\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n font-size: inherit;\n color: inherit;\n word-break: normal;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: $pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-grid-classes {\n .container {\n @include make-container();\n @include make-container-max-widths();\n }\n}\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but with 100% width for\n// fluid, full width layouts.\n\n@if $enable-grid-classes {\n .container-fluid {\n @include make-container();\n }\n}\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n }\n\n // Remove the negative margin from default .row, then the horizontal padding\n // from all immediate children columns (to prevent runaway style inheritance).\n .no-gutters {\n margin-right: 0;\n margin-left: 0;\n\n > .col,\n > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n }\n }\n}\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","/// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-container() {\n width: 100%;\n padding-right: ($grid-gutter-width / 2);\n padding-left: ($grid-gutter-width / 2);\n margin-right: auto;\n margin-left: auto;\n}\n\n\n// For each breakpoint, define the maximum width of the container in a media query\n@mixin make-container-max-widths($max-widths: $container-max-widths, $breakpoints: $grid-breakpoints) {\n @each $breakpoint, $container-max-width in $max-widths {\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n max-width: $container-max-width;\n }\n }\n}\n\n@mixin make-row() {\n display: flex;\n flex-wrap: wrap;\n margin-right: ($grid-gutter-width / -2);\n margin-left: ($grid-gutter-width / -2);\n}\n\n@mixin make-col-ready() {\n position: relative;\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we use `flex` values\n // later on to override this initial width.\n width: 100%;\n min-height: 1px; // Prevent collapsing\n padding-right: ($grid-gutter-width / 2);\n padding-left: ($grid-gutter-width / 2);\n}\n\n@mixin make-col($size, $columns: $grid-columns) {\n flex: 0 0 percentage($size / $columns);\n // Add a `max-width` to ensure content within each column does not blow out\n // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari\n // do not appear to require this.\n max-width: percentage($size / $columns);\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: $size / $columns;\n margin-left: if($num == 0, 0, percentage($num));\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width. Null for the largest (last) breakpoint.\n// The maximum value is calculated as the minimum of the next one less 0.02px\n// to work around the limitations of `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $next: breakpoint-next($name, $breakpoints);\n @return if($next, breakpoint-min($next, $breakpoints) - .02px, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash infront.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $max: breakpoint-max($name, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($name, $breakpoints) {\n @content;\n }\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n // Common properties for all breakpoints\n %grid-column {\n position: relative;\n width: 100%;\n min-height: 1px; // Prevent columns from collapsing when empty\n padding-right: ($gutter / 2);\n padding-left: ($gutter / 2);\n }\n\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n // Allow columns to stretch full width below their breakpoints\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @extend %grid-column;\n }\n }\n .col#{$infix},\n .col#{$infix}-auto {\n @extend %grid-column;\n }\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col#{$infix}-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: none; // Reset earlier grid tiers\n }\n\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n .order#{$infix}-first { order: -1; }\n\n .order#{$infix}-last { order: $columns + 1; }\n\n @for $i from 0 through $columns {\n .order#{$infix}-#{$i} { order: $i; }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n }\n}\n","//\n// Basic Bootstrap table\n//\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: $spacer;\n background-color: $table-bg; // Reset for nesting within parents with `background-color`.\n\n th,\n td {\n padding: $table-cell-padding;\n vertical-align: top;\n border-top: $table-border-width solid $table-border-color;\n }\n\n thead th {\n vertical-align: bottom;\n border-bottom: (2 * $table-border-width) solid $table-border-color;\n }\n\n tbody + tbody {\n border-top: (2 * $table-border-width) solid $table-border-color;\n }\n\n .table {\n background-color: $body-bg;\n }\n}\n\n\n//\n// Condensed table w/ half padding\n//\n\n.table-sm {\n th,\n td {\n padding: $table-cell-padding-sm;\n }\n}\n\n\n// Border versions\n//\n// Add or remove borders all around the table and between all the columns.\n\n.table-bordered {\n border: $table-border-width solid $table-border-color;\n\n th,\n td {\n border: $table-border-width solid $table-border-color;\n }\n\n thead {\n th,\n td {\n border-bottom-width: (2 * $table-border-width);\n }\n }\n}\n\n.table-borderless {\n th,\n td,\n thead th,\n tbody + tbody {\n border: 0;\n }\n}\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n tbody tr:nth-of-type(#{$table-striped-order}) {\n background-color: $table-accent-bg;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n tbody tr {\n @include hover {\n background-color: $table-hover-bg;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n@each $color, $value in $theme-colors {\n @include table-row-variant($color, theme-color-level($color, -9));\n}\n\n@include table-row-variant(active, $table-active-bg);\n\n\n// Dark styles\n//\n// Same table markup, but inverted color scheme: dark background and light text.\n\n// stylelint-disable-next-line no-duplicate-selectors\n.table {\n .thead-dark {\n th {\n color: $table-dark-color;\n background-color: $table-dark-bg;\n border-color: $table-dark-border-color;\n }\n }\n\n .thead-light {\n th {\n color: $table-head-color;\n background-color: $table-head-bg;\n border-color: $table-border-color;\n }\n }\n}\n\n.table-dark {\n color: $table-dark-color;\n background-color: $table-dark-bg;\n\n th,\n td,\n thead th {\n border-color: $table-dark-border-color;\n }\n\n &.table-bordered {\n border: 0;\n }\n\n &.table-striped {\n tbody tr:nth-of-type(odd) {\n background-color: $table-dark-accent-bg;\n }\n }\n\n &.table-hover {\n tbody tr {\n @include hover {\n background-color: $table-dark-hover-bg;\n }\n }\n }\n}\n\n\n// Responsive tables\n//\n// Generate series of `.table-responsive-*` classes for configuring the screen\n// size of where your table will overflow.\n\n.table-responsive {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $next: breakpoint-next($breakpoint, $grid-breakpoints);\n $infix: breakpoint-infix($next, $grid-breakpoints);\n\n &#{$infix} {\n @include media-breakpoint-down($breakpoint) {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n -ms-overflow-style: -ms-autohiding-scrollbar; // See https://github.com/twbs/bootstrap/pull/10057\n\n // Prevent double border on horizontal scroll due to use of `display: block;`\n > .table-bordered {\n border: 0;\n }\n }\n }\n }\n}\n","// Tables\n\n@mixin table-row-variant($state, $background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table-#{$state} {\n &,\n > th,\n > td {\n background-color: $background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover {\n $hover-background: darken($background, 5%);\n\n .table-#{$state} {\n @include hover {\n background-color: $hover-background;\n\n > td,\n > th {\n background-color: $hover-background;\n }\n }\n }\n }\n}\n","// stylelint-disable selector-no-qualifying-type\n\n//\n// Textual form controls\n//\n\n.form-control {\n display: block;\n width: 100%;\n padding: $input-padding-y $input-padding-x;\n font-size: $font-size-base;\n line-height: $input-line-height;\n color: $input-color;\n background-color: $input-bg;\n background-clip: padding-box;\n border: $input-border-width solid $input-border-color;\n\n // Note: This has no effect on <select>s in some browsers, due to the limited stylability of `<select>`s in CSS.\n @if $enable-rounded {\n // Manually use the if/else instead of the mixin to account for iOS override\n border-radius: $input-border-radius;\n } @else {\n // Otherwise undo the iOS default\n border-radius: 0;\n }\n\n @include box-shadow($input-box-shadow);\n @include transition($input-transition);\n\n // Unstyle the caret on `<select>`s in IE10+.\n &::-ms-expand {\n background-color: transparent;\n border: 0;\n }\n\n // Customize the `:focus` state to imitate native WebKit styles.\n @include form-control-focus();\n\n // Placeholder\n &::placeholder {\n color: $input-placeholder-color;\n // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526.\n opacity: 1;\n }\n\n // Disabled and read-only inputs\n //\n // HTML5 says that controls under a fieldset > legend:first-child won't be\n // disabled if the fieldset is disabled. Due to implementation difficulty, we\n // don't honor that edge case; we style them as disabled anyway.\n &:disabled,\n &[readonly] {\n background-color: $input-disabled-bg;\n // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655.\n opacity: 1;\n }\n}\n\nselect.form-control {\n &:not([size]):not([multiple]) {\n height: $input-height;\n }\n\n &:focus::-ms-value {\n // Suppress the nested default white text on blue background highlight given to\n // the selected option text when the (still closed) <select> receives focus\n // in IE and (under certain conditions) Edge, as it looks bad and cannot be made to\n // match the appearance of the native widget.\n // See https://github.com/twbs/bootstrap/issues/19398.\n color: $input-color;\n background-color: $input-bg;\n }\n}\n\n// Make file inputs better match text inputs by forcing them to new lines.\n.form-control-file,\n.form-control-range {\n display: block;\n width: 100%;\n}\n\n\n//\n// Labels\n//\n\n// For use with horizontal and inline forms, when you need the label (or legend)\n// text to align with the form controls.\n.col-form-label {\n padding-top: calc(#{$input-padding-y} + #{$input-border-width});\n padding-bottom: calc(#{$input-padding-y} + #{$input-border-width});\n margin-bottom: 0; // Override the `<label>/<legend>` default\n font-size: inherit; // Override the `<legend>` default\n line-height: $input-line-height;\n}\n\n.col-form-label-lg {\n padding-top: calc(#{$input-padding-y-lg} + #{$input-border-width});\n padding-bottom: calc(#{$input-padding-y-lg} + #{$input-border-width});\n font-size: $font-size-lg;\n line-height: $input-line-height-lg;\n}\n\n.col-form-label-sm {\n padding-top: calc(#{$input-padding-y-sm} + #{$input-border-width});\n padding-bottom: calc(#{$input-padding-y-sm} + #{$input-border-width});\n font-size: $font-size-sm;\n line-height: $input-line-height-sm;\n}\n\n\n// Readonly controls as plain text\n//\n// Apply class to a readonly input to make it appear like regular plain\n// text (without any border, background color, focus indicator)\n\n.form-control-plaintext {\n display: block;\n width: 100%;\n padding-top: $input-padding-y;\n padding-bottom: $input-padding-y;\n margin-bottom: 0; // match inputs if this class comes on inputs with default margins\n line-height: $input-line-height;\n color: $input-plaintext-color;\n background-color: transparent;\n border: solid transparent;\n border-width: $input-border-width 0;\n\n &.form-control-sm,\n &.form-control-lg {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n//\n// The `.form-group-* form-control` variations are sadly duplicated to avoid the\n// issue documented in https://github.com/twbs/bootstrap/issues/15074.\n\n.form-control-sm {\n padding: $input-padding-y-sm $input-padding-x-sm;\n font-size: $font-size-sm;\n line-height: $input-line-height-sm;\n @include border-radius($input-border-radius-sm);\n}\n\nselect.form-control-sm {\n &:not([size]):not([multiple]) {\n height: $input-height-sm;\n }\n}\n\n.form-control-lg {\n padding: $input-padding-y-lg $input-padding-x-lg;\n font-size: $font-size-lg;\n line-height: $input-line-height-lg;\n @include border-radius($input-border-radius-lg);\n}\n\nselect.form-control-lg {\n &:not([size]):not([multiple]) {\n height: $input-height-lg;\n }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n margin-bottom: $form-group-margin-bottom;\n}\n\n.form-text {\n display: block;\n margin-top: $form-text-margin-top;\n}\n\n\n// Form grid\n//\n// Special replacement for our grid system's `.row` for tighter form layouts.\n\n.form-row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -5px;\n margin-left: -5px;\n\n > .col,\n > [class*=\"col-\"] {\n padding-right: 5px;\n padding-left: 5px;\n }\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.form-check {\n position: relative;\n display: block;\n padding-left: $form-check-input-gutter;\n}\n\n.form-check-input {\n position: absolute;\n margin-top: $form-check-input-margin-y;\n margin-left: -$form-check-input-gutter;\n\n &:disabled ~ .form-check-label {\n color: $text-muted;\n }\n}\n\n.form-check-label {\n margin-bottom: 0; // Override default `<label>` bottom margin\n}\n\n.form-check-inline {\n display: inline-flex;\n align-items: center;\n padding-left: 0; // Override base .form-check\n margin-right: $form-check-inline-margin-x;\n\n // Undo .form-check-input defaults and add some `margin-right`.\n .form-check-input {\n position: static;\n margin-top: 0;\n margin-right: $form-check-inline-input-margin-x;\n margin-left: 0;\n }\n}\n\n\n// Form validation\n//\n// Provide feedback to users when form field values are valid or invalid. Works\n// primarily for client-side validation via scoped `:invalid` and `:valid`\n// pseudo-classes but also includes `.is-invalid` and `.is-valid` classes for\n// server side validation.\n\n@include form-validation-state(\"valid\", $form-feedback-valid-color);\n@include form-validation-state(\"invalid\", $form-feedback-invalid-color);\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n\n.form-inline {\n display: flex;\n flex-flow: row wrap;\n align-items: center; // Prevent shorter elements from growing to same height as others (e.g., small buttons growing to normal sized button height)\n\n // Because we use flex, the initial sizing of checkboxes is collapsed and\n // doesn't occupy the full-width (which is what we want for xs grid tier),\n // so we force that here.\n .form-check {\n width: 100%;\n }\n\n // Kick in the inline\n @include media-breakpoint-up(sm) {\n label {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 0;\n }\n\n // Inline-block all the things for \"inline\"\n .form-group {\n display: flex;\n flex: 0 0 auto;\n flex-flow: row wrap;\n align-items: center;\n margin-bottom: 0;\n }\n\n // Allow folks to *not* use `.form-group`\n .form-control {\n display: inline-block;\n width: auto; // Prevent labels from stacking above inputs in `.form-group`\n vertical-align: middle;\n }\n\n // Make static controls behave like regular ones\n .form-control-plaintext {\n display: inline-block;\n }\n\n .input-group,\n .custom-select {\n width: auto;\n }\n\n // Remove default margin on radios/checkboxes that were used for stacking, and\n // then undo the floating of radios and checkboxes to match.\n .form-check {\n display: flex;\n align-items: center;\n justify-content: center;\n width: auto;\n padding-left: 0;\n }\n .form-check-input {\n position: relative;\n margin-top: 0;\n margin-right: $form-check-input-margin-x;\n margin-left: 0;\n }\n\n .custom-control {\n align-items: center;\n justify-content: center;\n }\n .custom-control-label {\n margin-bottom: 0;\n }\n }\n}\n","@mixin transition($transition...) {\n @if $enable-transitions {\n @if length($transition) == 0 {\n transition: $transition-base;\n } @else {\n transition: $transition;\n }\n }\n\n @media screen and (prefers-reduced-motion: reduce) {\n transition: none;\n }\n}\n","// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `$input-focus-border-color` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n@mixin form-control-focus() {\n &:focus {\n color: $input-focus-color;\n background-color: $input-focus-bg;\n border-color: $input-focus-border-color;\n outline: 0;\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows {\n box-shadow: $input-box-shadow, $input-focus-box-shadow;\n } @else {\n box-shadow: $input-focus-box-shadow;\n }\n }\n}\n\n\n@mixin form-validation-state($state, $color) {\n .#{$state}-feedback {\n display: none;\n width: 100%;\n margin-top: $form-feedback-margin-top;\n font-size: $form-feedback-font-size;\n color: $color;\n }\n\n .#{$state}-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%; // Contain to parent when possible\n padding: .5rem;\n margin-top: .1rem;\n font-size: .875rem;\n line-height: 1;\n color: $white;\n background-color: rgba($color, .8);\n border-radius: .2rem;\n }\n\n .form-control,\n .custom-select {\n .was-validated &:#{$state},\n &.is-#{$state} {\n border-color: $color;\n\n &:focus {\n border-color: $color;\n box-shadow: 0 0 0 $input-focus-width rgba($color, .25);\n }\n\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n }\n }\n\n .form-control-file {\n .was-validated &:#{$state},\n &.is-#{$state} {\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n }\n }\n\n .form-check-input {\n .was-validated &:#{$state},\n &.is-#{$state} {\n ~ .form-check-label {\n color: $color;\n }\n\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n }\n }\n\n .custom-control-input {\n .was-validated &:#{$state},\n &.is-#{$state} {\n ~ .custom-control-label {\n color: $color;\n\n &::before {\n background-color: lighten($color, 25%);\n }\n }\n\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n\n &:checked {\n ~ .custom-control-label::before {\n @include gradient-bg(lighten($color, 10%));\n }\n }\n\n &:focus {\n ~ .custom-control-label::before {\n box-shadow: 0 0 0 1px $body-bg, 0 0 0 $input-focus-width rgba($color, .25);\n }\n }\n }\n }\n\n // custom file\n .custom-file-input {\n .was-validated &:#{$state},\n &.is-#{$state} {\n ~ .custom-file-label {\n border-color: $color;\n\n &::before { border-color: inherit; }\n }\n\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n\n &:focus {\n ~ .custom-file-label {\n box-shadow: 0 0 0 $input-focus-width rgba($color, .25);\n }\n }\n }\n }\n}\n","// Gradients\n\n@mixin gradient-bg($color) {\n @if $enable-gradients {\n background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x;\n } @else {\n background-color: $color;\n }\n}\n\n// Horizontal gradient, from left to right\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-x($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {\n background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent);\n background-repeat: repeat-x;\n}\n\n// Vertical gradient, from top to bottom\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-y($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {\n background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent);\n background-repeat: repeat-x;\n}\n\n@mixin gradient-directional($start-color: $gray-700, $end-color: $gray-800, $deg: 45deg) {\n background-image: linear-gradient($deg, $start-color, $end-color);\n background-repeat: repeat-x;\n}\n@mixin gradient-x-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);\n background-repeat: no-repeat;\n}\n@mixin gradient-y-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);\n background-repeat: no-repeat;\n}\n@mixin gradient-radial($inner-color: $gray-700, $outer-color: $gray-800) {\n background-image: radial-gradient(circle, $inner-color, $outer-color);\n background-repeat: no-repeat;\n}\n@mixin gradient-striped($color: rgba($white, .15), $angle: 45deg) {\n background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n}\n","// stylelint-disable selector-no-qualifying-type\n\n//\n// Base styles\n//\n\n.btn {\n display: inline-block;\n font-weight: $btn-font-weight;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n user-select: none;\n border: $btn-border-width solid transparent;\n @include button-size($btn-padding-y, $btn-padding-x, $font-size-base, $btn-line-height, $btn-border-radius);\n @include transition($btn-transition);\n\n // Share hover and focus styles\n @include hover-focus {\n text-decoration: none;\n }\n\n &:focus,\n &.focus {\n outline: 0;\n box-shadow: $btn-focus-box-shadow;\n }\n\n // Disabled comes first so active can properly restyle\n &.disabled,\n &:disabled {\n opacity: $btn-disabled-opacity;\n @include box-shadow(none);\n }\n\n // Opinionated: add \"hand\" cursor to non-disabled .btn elements\n &:not(:disabled):not(.disabled) {\n cursor: pointer;\n }\n\n &:not(:disabled):not(.disabled):active,\n &:not(:disabled):not(.disabled).active {\n background-image: none;\n @include box-shadow($btn-active-box-shadow);\n\n &:focus {\n @include box-shadow($btn-focus-box-shadow, $btn-active-box-shadow);\n }\n }\n}\n\n// Future-proof disabling of clicks on `<a>` elements\na.btn.disabled,\nfieldset:disabled a.btn {\n pointer-events: none;\n}\n\n\n//\n// Alternate buttons\n//\n\n@each $color, $value in $theme-colors {\n .btn-#{$color} {\n @include button-variant($value, $value);\n }\n}\n\n@each $color, $value in $theme-colors {\n .btn-outline-#{$color} {\n @include button-outline-variant($value);\n }\n}\n\n\n//\n// Link buttons\n//\n\n// Make a button look and behave like a link\n.btn-link {\n font-weight: $font-weight-normal;\n color: $link-color;\n background-color: transparent;\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n background-color: transparent;\n border-color: transparent;\n }\n\n &:focus,\n &.focus {\n text-decoration: $link-hover-decoration;\n border-color: transparent;\n box-shadow: none;\n }\n\n &:disabled,\n &.disabled {\n color: $btn-link-disabled-color;\n pointer-events: none;\n }\n\n // No need for an active state here\n}\n\n\n//\n// Button Sizes\n//\n\n.btn-lg {\n @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $font-size-lg, $btn-line-height-lg, $btn-border-radius-lg);\n}\n\n.btn-sm {\n @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $font-size-sm, $btn-line-height-sm, $btn-border-radius-sm);\n}\n\n\n//\n// Block button\n//\n\n.btn-block {\n display: block;\n width: 100%;\n\n // Vertically space out multiple block buttons\n + .btn-block {\n margin-top: $btn-block-spacing-y;\n }\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n@mixin button-variant($background, $border, $hover-background: darken($background, 7.5%), $hover-border: darken($border, 10%), $active-background: darken($background, 10%), $active-border: darken($border, 12.5%)) {\n color: color-yiq($background);\n @include gradient-bg($background);\n border-color: $border;\n @include box-shadow($btn-box-shadow);\n\n @include hover {\n color: color-yiq($hover-background);\n @include gradient-bg($hover-background);\n border-color: $hover-border;\n }\n\n &:focus,\n &.focus {\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows {\n box-shadow: $btn-box-shadow, 0 0 0 $btn-focus-width rgba($border, .5);\n } @else {\n box-shadow: 0 0 0 $btn-focus-width rgba($border, .5);\n }\n }\n\n // Disabled comes first so active can properly restyle\n &.disabled,\n &:disabled {\n color: color-yiq($background);\n background-color: $background;\n border-color: $border;\n }\n\n &:not(:disabled):not(.disabled):active,\n &:not(:disabled):not(.disabled).active,\n .show > &.dropdown-toggle {\n color: color-yiq($active-background);\n background-color: $active-background;\n @if $enable-gradients {\n background-image: none; // Remove the gradient for the pressed/active state\n }\n border-color: $active-border;\n\n &:focus {\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows {\n box-shadow: $btn-active-box-shadow, 0 0 0 $btn-focus-width rgba($border, .5);\n } @else {\n box-shadow: 0 0 0 $btn-focus-width rgba($border, .5);\n }\n }\n }\n}\n\n@mixin button-outline-variant($color, $color-hover: color-yiq($color), $active-background: $color, $active-border: $color) {\n color: $color;\n background-color: transparent;\n background-image: none;\n border-color: $color;\n\n &:hover {\n color: $color-hover;\n background-color: $active-background;\n border-color: $active-border;\n }\n\n &:focus,\n &.focus {\n box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);\n }\n\n &.disabled,\n &:disabled {\n color: $color;\n background-color: transparent;\n }\n\n &:not(:disabled):not(.disabled):active,\n &:not(:disabled):not(.disabled).active,\n .show > &.dropdown-toggle {\n color: color-yiq($active-background);\n background-color: $active-background;\n border-color: $active-border;\n\n &:focus {\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows and $btn-active-box-shadow != none {\n box-shadow: $btn-active-box-shadow, 0 0 0 $btn-focus-width rgba($color, .5);\n } @else {\n box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);\n }\n }\n }\n}\n\n// Button sizes\n@mixin button-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) {\n padding: $padding-y $padding-x;\n font-size: $font-size;\n line-height: $line-height;\n // Manually declare to provide an override to the browser default\n @if $enable-rounded {\n border-radius: $border-radius;\n } @else {\n border-radius: 0;\n }\n}\n","// stylelint-disable selector-no-qualifying-type\n\n.fade {\n @include transition($transition-fade);\n\n &:not(.show) {\n opacity: 0;\n }\n}\n\n.collapse {\n &:not(.show) {\n display: none;\n }\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n @include transition($transition-collapse);\n}\n","// The dropdown wrapper (`<div>`)\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n position: relative;\n}\n\n.dropdown-toggle {\n // Generate the caret automatically\n @include caret;\n}\n\n// The dropdown menu\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: $zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: $dropdown-min-width;\n padding: $dropdown-padding-y 0;\n margin: $dropdown-spacer 0 0; // override default ul\n font-size: $font-size-base; // Redeclare because nesting can cause inheritance issues\n color: $body-color;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n list-style: none;\n background-color: $dropdown-bg;\n background-clip: padding-box;\n border: $dropdown-border-width solid $dropdown-border-color;\n @include border-radius($dropdown-border-radius);\n @include box-shadow($dropdown-box-shadow);\n}\n\n.dropdown-menu-right {\n right: 0;\n left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n// Just add .dropup after the standard .dropdown class and you're set.\n.dropup {\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: $dropdown-spacer;\n }\n\n .dropdown-toggle {\n @include caret(up);\n }\n}\n\n.dropright {\n .dropdown-menu {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: $dropdown-spacer;\n }\n\n .dropdown-toggle {\n @include caret(right);\n &::after {\n vertical-align: 0;\n }\n }\n}\n\n.dropleft {\n .dropdown-menu {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: $dropdown-spacer;\n }\n\n .dropdown-toggle {\n @include caret(left);\n &::before {\n vertical-align: 0;\n }\n }\n}\n\n// When enabled Popper.js, reset basic dropdown position\n// stylelint-disable no-duplicate-selectors\n.dropdown-menu {\n &[x-placement^=\"top\"],\n &[x-placement^=\"right\"],\n &[x-placement^=\"bottom\"],\n &[x-placement^=\"left\"] {\n right: auto;\n bottom: auto;\n }\n}\n// stylelint-enable no-duplicate-selectors\n\n// Dividers (basically an `<hr>`) within the dropdown\n.dropdown-divider {\n @include nav-divider($dropdown-divider-bg);\n}\n\n// Links, buttons, and more within the dropdown menu\n//\n// `<button>`-specific styles are denoted with `// For <button>s`\n.dropdown-item {\n display: block;\n width: 100%; // For `<button>`s\n padding: $dropdown-item-padding-y $dropdown-item-padding-x;\n clear: both;\n font-weight: $font-weight-normal;\n color: $dropdown-link-color;\n text-align: inherit; // For `<button>`s\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n background-color: transparent; // For `<button>`s\n border: 0; // For `<button>`s\n\n @include hover-focus {\n color: $dropdown-link-hover-color;\n text-decoration: none;\n @include gradient-bg($dropdown-link-hover-bg);\n }\n\n &.active,\n &:active {\n color: $dropdown-link-active-color;\n text-decoration: none;\n @include gradient-bg($dropdown-link-active-bg);\n }\n\n &.disabled,\n &:disabled {\n color: $dropdown-link-disabled-color;\n background-color: transparent;\n // Remove CSS gradients if they're enabled\n @if $enable-gradients {\n background-image: none;\n }\n }\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: $dropdown-padding-y $dropdown-item-padding-x;\n margin-bottom: 0; // for use with heading elements\n font-size: $font-size-sm;\n color: $dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n\n// Dropdown text\n.dropdown-item-text {\n display: block;\n padding: $dropdown-item-padding-y $dropdown-item-padding-x;\n color: $dropdown-link-color;\n}\n","@mixin caret-down {\n border-top: $caret-width solid;\n border-right: $caret-width solid transparent;\n border-bottom: 0;\n border-left: $caret-width solid transparent;\n}\n\n@mixin caret-up {\n border-top: 0;\n border-right: $caret-width solid transparent;\n border-bottom: $caret-width solid;\n border-left: $caret-width solid transparent;\n}\n\n@mixin caret-right {\n border-top: $caret-width solid transparent;\n border-right: 0;\n border-bottom: $caret-width solid transparent;\n border-left: $caret-width solid;\n}\n\n@mixin caret-left {\n border-top: $caret-width solid transparent;\n border-right: $caret-width solid;\n border-bottom: $caret-width solid transparent;\n}\n\n@mixin caret($direction: down) {\n @if $enable-caret {\n &::after {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: $caret-width * .85;\n vertical-align: $caret-width * .85;\n content: \"\";\n @if $direction == down {\n @include caret-down;\n } @else if $direction == up {\n @include caret-up;\n } @else if $direction == right {\n @include caret-right;\n }\n }\n\n @if $direction == left {\n &::after {\n display: none;\n }\n\n &::before {\n display: inline-block;\n width: 0;\n height: 0;\n margin-right: $caret-width * .85;\n vertical-align: $caret-width * .85;\n content: \"\";\n @include caret-left;\n }\n }\n\n &:empty::after {\n margin-left: 0;\n }\n }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n@mixin nav-divider($color: $nav-divider-color, $margin-y: $nav-divider-margin-y) {\n height: 0;\n margin: $margin-y 0;\n overflow: hidden;\n border-top: 1px solid $color;\n}\n","// stylelint-disable selector-no-qualifying-type\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-flex;\n vertical-align: middle; // match .btn alignment given font-size hack above\n\n > .btn {\n position: relative;\n flex: 0 1 auto;\n\n // Bring the hover, focused, and \"active\" buttons to the front to overlay\n // the borders properly\n @include hover {\n z-index: 1;\n }\n &:focus,\n &:active,\n &.active {\n z-index: 1;\n }\n }\n\n // Prevent double borders when buttons are next to each other\n .btn + .btn,\n .btn + .btn-group,\n .btn-group + .btn,\n .btn-group + .btn-group {\n margin-left: -$btn-border-width;\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n\n .input-group {\n width: auto;\n }\n}\n\n.btn-group {\n > .btn:first-child {\n margin-left: 0;\n }\n\n // Reset rounded corners\n > .btn:not(:last-child):not(.dropdown-toggle),\n > .btn-group:not(:last-child) > .btn {\n @include border-right-radius(0);\n }\n\n > .btn:not(:first-child),\n > .btn-group:not(:first-child) > .btn {\n @include border-left-radius(0);\n }\n}\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-sm > .btn { @extend .btn-sm; }\n.btn-group-lg > .btn { @extend .btn-lg; }\n\n\n//\n// Split button dropdowns\n//\n\n.dropdown-toggle-split {\n padding-right: $btn-padding-x * .75;\n padding-left: $btn-padding-x * .75;\n\n &::after,\n .dropup &::after,\n .dropright &::after {\n margin-left: 0;\n }\n\n .dropleft &::before {\n margin-right: 0;\n }\n}\n\n.btn-sm + .dropdown-toggle-split {\n padding-right: $btn-padding-x-sm * .75;\n padding-left: $btn-padding-x-sm * .75;\n}\n\n.btn-lg + .dropdown-toggle-split {\n padding-right: $btn-padding-x-lg * .75;\n padding-left: $btn-padding-x-lg * .75;\n}\n\n\n// The clickable button for toggling the menu\n// Set the same inset shadow as the :active state\n.btn-group.show .dropdown-toggle {\n @include box-shadow($btn-active-box-shadow);\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n @include box-shadow(none);\n }\n}\n\n\n//\n// Vertical button groups\n//\n\n.btn-group-vertical {\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n\n .btn,\n .btn-group {\n width: 100%;\n }\n\n > .btn + .btn,\n > .btn + .btn-group,\n > .btn-group + .btn,\n > .btn-group + .btn-group {\n margin-top: -$btn-border-width;\n margin-left: 0;\n }\n\n // Reset rounded corners\n > .btn:not(:last-child):not(.dropdown-toggle),\n > .btn-group:not(:last-child) > .btn {\n @include border-bottom-radius(0);\n }\n\n > .btn:not(:first-child),\n > .btn-group:not(:first-child) > .btn {\n @include border-top-radius(0);\n }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n.btn-group-toggle {\n > .btn,\n > .btn-group > .btn {\n margin-bottom: 0; // Override default `<label>` value\n\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n }\n }\n}\n","// stylelint-disable selector-no-qualifying-type\n\n//\n// Base styles\n//\n\n.input-group {\n position: relative;\n display: flex;\n flex-wrap: wrap; // For form validation feedback\n align-items: stretch;\n width: 100%;\n\n > .form-control,\n > .custom-select,\n > .custom-file {\n position: relative; // For focus state's z-index\n flex: 1 1 auto;\n // Add width 1% and flex-basis auto to ensure that button will not wrap out\n // the column. Applies to IE Edge+ and Firefox. Chrome does not require this.\n width: 1%;\n margin-bottom: 0;\n\n // Bring the \"active\" form control to the top of surrounding elements\n &:focus {\n z-index: 3;\n }\n\n + .form-control,\n + .custom-select,\n + .custom-file {\n margin-left: -$input-border-width;\n }\n }\n\n > .form-control,\n > .custom-select {\n &:not(:last-child) { @include border-right-radius(0); }\n &:not(:first-child) { @include border-left-radius(0); }\n }\n\n // Custom file inputs have more complex markup, thus requiring different\n // border-radius overrides.\n > .custom-file {\n display: flex;\n align-items: center;\n\n &:not(:last-child) .custom-file-label,\n &:not(:last-child) .custom-file-label::after { @include border-right-radius(0); }\n &:not(:first-child) .custom-file-label { @include border-left-radius(0); }\n }\n}\n\n\n// Prepend and append\n//\n// While it requires one extra layer of HTML for each, dedicated prepend and\n// append elements allow us to 1) be less clever, 2) simplify our selectors, and\n// 3) support HTML5 form validation.\n\n.input-group-prepend,\n.input-group-append {\n display: flex;\n\n // Ensure buttons are always above inputs for more visually pleasing borders.\n // This isn't needed for `.input-group-text` since it shares the same border-color\n // as our inputs.\n .btn {\n position: relative;\n z-index: 2;\n }\n\n .btn + .btn,\n .btn + .input-group-text,\n .input-group-text + .input-group-text,\n .input-group-text + .btn {\n margin-left: -$input-border-width;\n }\n}\n\n.input-group-prepend { margin-right: -$input-border-width; }\n.input-group-append { margin-left: -$input-border-width; }\n\n\n// Textual addons\n//\n// Serves as a catch-all element for any text or radio/checkbox input you wish\n// to prepend or append to an input.\n\n.input-group-text {\n display: flex;\n align-items: center;\n padding: $input-padding-y $input-padding-x;\n margin-bottom: 0; // Allow use of <label> elements by overriding our default margin-bottom\n font-size: $font-size-base; // Match inputs\n font-weight: $font-weight-normal;\n line-height: $input-line-height;\n color: $input-group-addon-color;\n text-align: center;\n white-space: nowrap;\n background-color: $input-group-addon-bg;\n border: $input-border-width solid $input-group-addon-border-color;\n @include border-radius($input-border-radius);\n\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n}\n\n\n// Sizing\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-prepend > .input-group-text,\n.input-group-lg > .input-group-append > .input-group-text,\n.input-group-lg > .input-group-prepend > .btn,\n.input-group-lg > .input-group-append > .btn {\n @extend .form-control-lg;\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-prepend > .input-group-text,\n.input-group-sm > .input-group-append > .input-group-text,\n.input-group-sm > .input-group-prepend > .btn,\n.input-group-sm > .input-group-append > .btn {\n @extend .form-control-sm;\n}\n\n\n// Prepend and append rounded corners\n//\n// These rulesets must come after the sizing ones to properly override sm and lg\n// border-radius values when extending. They're more specific than we'd like\n// with the `.input-group >` part, but without it, we cannot override the sizing.\n\n\n.input-group > .input-group-prepend > .btn,\n.input-group > .input-group-prepend > .input-group-text,\n.input-group > .input-group-append:not(:last-child) > .btn,\n.input-group > .input-group-append:not(:last-child) > .input-group-text,\n.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {\n @include border-right-radius(0);\n}\n\n.input-group > .input-group-append > .btn,\n.input-group > .input-group-append > .input-group-text,\n.input-group > .input-group-prepend:not(:first-child) > .btn,\n.input-group > .input-group-prepend:not(:first-child) > .input-group-text,\n.input-group > .input-group-prepend:first-child > .btn:not(:first-child),\n.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {\n @include border-left-radius(0);\n}\n","// Embedded icons from Open Iconic.\n// Released under MIT and copyright 2014 Waybury.\n// https://useiconic.com/open\n\n\n// Checkboxes and radios\n//\n// Base class takes care of all the key behavioral aspects.\n\n.custom-control {\n position: relative;\n display: block;\n min-height: (1rem * $line-height-base);\n padding-left: $custom-control-gutter;\n}\n\n.custom-control-inline {\n display: inline-flex;\n margin-right: $custom-control-spacer-x;\n}\n\n.custom-control-input {\n position: absolute;\n z-index: -1; // Put the input behind the label so it doesn't overlay text\n opacity: 0;\n\n &:checked ~ .custom-control-label::before {\n color: $custom-control-indicator-checked-color;\n @include gradient-bg($custom-control-indicator-checked-bg);\n @include box-shadow($custom-control-indicator-checked-box-shadow);\n }\n\n &:focus ~ .custom-control-label::before {\n // the mixin is not used here to make sure there is feedback\n box-shadow: $custom-control-indicator-focus-box-shadow;\n }\n\n &:active ~ .custom-control-label::before {\n color: $custom-control-indicator-active-color;\n background-color: $custom-control-indicator-active-bg;\n @include box-shadow($custom-control-indicator-active-box-shadow);\n }\n\n &:disabled {\n ~ .custom-control-label {\n color: $custom-control-label-disabled-color;\n\n &::before {\n background-color: $custom-control-indicator-disabled-bg;\n }\n }\n }\n}\n\n// Custom control indicators\n//\n// Build the custom controls out of pseudo-elements.\n\n.custom-control-label {\n position: relative;\n margin-bottom: 0;\n\n // Background-color and (when enabled) gradient\n &::before {\n position: absolute;\n top: (($line-height-base - $custom-control-indicator-size) / 2);\n left: -$custom-control-gutter;\n display: block;\n width: $custom-control-indicator-size;\n height: $custom-control-indicator-size;\n pointer-events: none;\n content: \"\";\n user-select: none;\n background-color: $custom-control-indicator-bg;\n @include box-shadow($custom-control-indicator-box-shadow);\n }\n\n // Foreground (icon)\n &::after {\n position: absolute;\n top: (($line-height-base - $custom-control-indicator-size) / 2);\n left: -$custom-control-gutter;\n display: block;\n width: $custom-control-indicator-size;\n height: $custom-control-indicator-size;\n content: \"\";\n background-repeat: no-repeat;\n background-position: center center;\n background-size: $custom-control-indicator-bg-size;\n }\n}\n\n\n// Checkboxes\n//\n// Tweak just a few things for checkboxes.\n\n.custom-checkbox {\n .custom-control-label::before {\n @include border-radius($custom-checkbox-indicator-border-radius);\n }\n\n .custom-control-input:checked ~ .custom-control-label {\n &::before {\n @include gradient-bg($custom-control-indicator-checked-bg);\n }\n &::after {\n background-image: $custom-checkbox-indicator-icon-checked;\n }\n }\n\n .custom-control-input:indeterminate ~ .custom-control-label {\n &::before {\n @include gradient-bg($custom-checkbox-indicator-indeterminate-bg);\n @include box-shadow($custom-checkbox-indicator-indeterminate-box-shadow);\n }\n &::after {\n background-image: $custom-checkbox-indicator-icon-indeterminate;\n }\n }\n\n .custom-control-input:disabled {\n &:checked ~ .custom-control-label::before {\n background-color: $custom-control-indicator-checked-disabled-bg;\n }\n &:indeterminate ~ .custom-control-label::before {\n background-color: $custom-control-indicator-checked-disabled-bg;\n }\n }\n}\n\n// Radios\n//\n// Tweak just a few things for radios.\n\n.custom-radio {\n .custom-control-label::before {\n border-radius: $custom-radio-indicator-border-radius;\n }\n\n .custom-control-input:checked ~ .custom-control-label {\n &::before {\n @include gradient-bg($custom-control-indicator-checked-bg);\n }\n &::after {\n background-image: $custom-radio-indicator-icon-checked;\n }\n }\n\n .custom-control-input:disabled {\n &:checked ~ .custom-control-label::before {\n background-color: $custom-control-indicator-checked-disabled-bg;\n }\n }\n}\n\n\n// Select\n//\n// Replaces the browser default select with a custom one, mostly pulled from\n// https://primer.github.io/.\n//\n\n.custom-select {\n display: inline-block;\n width: 100%;\n height: $custom-select-height;\n padding: $custom-select-padding-y ($custom-select-padding-x + $custom-select-indicator-padding) $custom-select-padding-y $custom-select-padding-x;\n line-height: $custom-select-line-height;\n color: $custom-select-color;\n vertical-align: middle;\n background: $custom-select-bg $custom-select-indicator no-repeat right $custom-select-padding-x center;\n background-size: $custom-select-bg-size;\n border: $custom-select-border-width solid $custom-select-border-color;\n @if $enable-rounded {\n border-radius: $custom-select-border-radius;\n } @else {\n border-radius: 0;\n }\n appearance: none;\n\n &:focus {\n border-color: $custom-select-focus-border-color;\n outline: 0;\n box-shadow: $custom-select-focus-box-shadow;\n\n &::-ms-value {\n // For visual consistency with other platforms/browsers,\n // suppress the default white text on blue background highlight given to\n // the selected option text when the (still closed) <select> receives focus\n // in IE and (under certain conditions) Edge.\n // See https://github.com/twbs/bootstrap/issues/19398.\n color: $input-color;\n background-color: $input-bg;\n }\n }\n\n &[multiple],\n &[size]:not([size=\"1\"]) {\n height: auto;\n padding-right: $custom-select-padding-x;\n background-image: none;\n }\n\n &:disabled {\n color: $custom-select-disabled-color;\n background-color: $custom-select-disabled-bg;\n }\n\n // Hides the default caret in IE11\n &::-ms-expand {\n opacity: 0;\n }\n}\n\n.custom-select-sm {\n height: $custom-select-height-sm;\n padding-top: $custom-select-padding-y;\n padding-bottom: $custom-select-padding-y;\n font-size: $custom-select-font-size-sm;\n}\n\n.custom-select-lg {\n height: $custom-select-height-lg;\n padding-top: $custom-select-padding-y;\n padding-bottom: $custom-select-padding-y;\n font-size: $custom-select-font-size-lg;\n}\n\n\n// File\n//\n// Custom file input.\n\n.custom-file {\n position: relative;\n display: inline-block;\n width: 100%;\n height: $custom-file-height;\n margin-bottom: 0;\n}\n\n.custom-file-input {\n position: relative;\n z-index: 2;\n width: 100%;\n height: $custom-file-height;\n margin: 0;\n opacity: 0;\n\n &:focus ~ .custom-file-label {\n border-color: $custom-file-focus-border-color;\n box-shadow: $custom-file-focus-box-shadow;\n\n &::after {\n border-color: $custom-file-focus-border-color;\n }\n }\n\n @each $lang, $value in $custom-file-text {\n &:lang(#{$lang}) ~ .custom-file-label::after {\n content: $value;\n }\n }\n}\n\n.custom-file-label {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1;\n height: $custom-file-height;\n padding: $custom-file-padding-y $custom-file-padding-x;\n line-height: $custom-file-line-height;\n color: $custom-file-color;\n background-color: $custom-file-bg;\n border: $custom-file-border-width solid $custom-file-border-color;\n @include border-radius($custom-file-border-radius);\n @include box-shadow($custom-file-box-shadow);\n\n &::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n z-index: 3;\n display: block;\n height: $custom-file-height-inner;\n padding: $custom-file-padding-y $custom-file-padding-x;\n line-height: $custom-file-line-height;\n color: $custom-file-button-color;\n content: \"Browse\";\n @include gradient-bg($custom-file-button-bg);\n border-left: $custom-file-border-width solid $custom-file-border-color;\n @include border-radius(0 $custom-file-border-radius $custom-file-border-radius 0);\n }\n}\n\n// Range\n//\n// Style range inputs the same across browsers. Vendor-specific rules for pseudo\n// elements cannot be mixed. As such, there are no shared styles for focus or\n// active states on prefixed selectors.\n\n.custom-range {\n width: 100%;\n padding-left: 0; // Firefox specific\n background-color: transparent;\n appearance: none;\n\n &:focus {\n outline: none;\n }\n\n &::-moz-focus-outer {\n border: 0;\n }\n\n &::-webkit-slider-thumb {\n width: $custom-range-thumb-width;\n height: $custom-range-thumb-height;\n margin-top: -($custom-range-thumb-width * .25); // Webkit specific?\n @include gradient-bg($custom-range-thumb-bg);\n border: $custom-range-thumb-border;\n @include border-radius($custom-range-thumb-border-radius);\n @include box-shadow($custom-range-thumb-box-shadow);\n appearance: none;\n\n &:focus {\n outline: none;\n box-shadow: $custom-range-thumb-focus-box-shadow; // No mixin for focus accessibility\n }\n\n &:active {\n @include gradient-bg($custom-range-thumb-active-bg);\n }\n }\n\n &::-webkit-slider-runnable-track {\n width: $custom-range-track-width;\n height: $custom-range-track-height;\n color: transparent; // Why?\n cursor: $custom-range-track-cursor;\n background-color: $custom-range-track-bg;\n border-color: transparent;\n @include border-radius($custom-range-track-border-radius);\n @include box-shadow($custom-range-track-box-shadow);\n }\n\n &::-moz-range-thumb {\n width: $custom-range-thumb-width;\n height: $custom-range-thumb-height;\n @include gradient-bg($custom-range-thumb-bg);\n border: $custom-range-thumb-border;\n @include border-radius($custom-range-thumb-border-radius);\n @include box-shadow($custom-range-thumb-box-shadow);\n appearance: none;\n\n &:focus {\n outline: none;\n box-shadow: $custom-range-thumb-focus-box-shadow; // No mixin for focus accessibility\n }\n\n &:active {\n @include gradient-bg($custom-range-thumb-active-bg);\n }\n }\n\n &::-moz-range-track {\n width: $custom-range-track-width;\n height: $custom-range-track-height;\n color: transparent;\n cursor: $custom-range-track-cursor;\n background-color: $custom-range-track-bg;\n border-color: transparent; // Firefox specific?\n @include border-radius($custom-range-track-border-radius);\n @include box-shadow($custom-range-track-box-shadow);\n }\n\n &::-ms-thumb {\n width: $custom-range-thumb-width;\n height: $custom-range-thumb-height;\n @include gradient-bg($custom-range-thumb-bg);\n border: $custom-range-thumb-border;\n @include border-radius($custom-range-thumb-border-radius);\n @include box-shadow($custom-range-thumb-box-shadow);\n appearance: none;\n\n &:focus {\n outline: none;\n box-shadow: $custom-range-thumb-focus-box-shadow; // No mixin for focus accessibility\n }\n\n &:active {\n @include gradient-bg($custom-range-thumb-active-bg);\n }\n }\n\n &::-ms-track {\n width: $custom-range-track-width;\n height: $custom-range-track-height;\n color: transparent;\n cursor: $custom-range-track-cursor;\n background-color: transparent;\n border-color: transparent;\n border-width: ($custom-range-thumb-height * .5);\n @include box-shadow($custom-range-track-box-shadow);\n }\n\n &::-ms-fill-lower {\n background-color: $custom-range-track-bg;\n @include border-radius($custom-range-track-border-radius);\n }\n\n &::-ms-fill-upper {\n margin-right: 15px; // arbitrary?\n background-color: $custom-range-track-bg;\n @include border-radius($custom-range-track-border-radius);\n }\n}\n","// Base class\n//\n// Kickstart any navigation component with a set of style resets. Works with\n// `<nav>`s or `<ul>`s.\n\n.nav {\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: $nav-link-padding-y $nav-link-padding-x;\n\n @include hover-focus {\n text-decoration: none;\n }\n\n // Disabled state lightens text\n &.disabled {\n color: $nav-link-disabled-color;\n }\n}\n\n//\n// Tabs\n//\n\n.nav-tabs {\n border-bottom: $nav-tabs-border-width solid $nav-tabs-border-color;\n\n .nav-item {\n margin-bottom: -$nav-tabs-border-width;\n }\n\n .nav-link {\n border: $nav-tabs-border-width solid transparent;\n @include border-top-radius($nav-tabs-border-radius);\n\n @include hover-focus {\n border-color: $nav-tabs-link-hover-border-color;\n }\n\n &.disabled {\n color: $nav-link-disabled-color;\n background-color: transparent;\n border-color: transparent;\n }\n }\n\n .nav-link.active,\n .nav-item.show .nav-link {\n color: $nav-tabs-link-active-color;\n background-color: $nav-tabs-link-active-bg;\n border-color: $nav-tabs-link-active-border-color;\n }\n\n .dropdown-menu {\n // Make dropdown border overlap tab border\n margin-top: -$nav-tabs-border-width;\n // Remove the top rounded corners here since there is a hard edge above the menu\n @include border-top-radius(0);\n }\n}\n\n\n//\n// Pills\n//\n\n.nav-pills {\n .nav-link {\n @include border-radius($nav-pills-border-radius);\n }\n\n .nav-link.active,\n .show > .nav-link {\n color: $nav-pills-link-active-color;\n background-color: $nav-pills-link-active-bg;\n }\n}\n\n\n//\n// Justified variants\n//\n\n.nav-fill {\n .nav-item {\n flex: 1 1 auto;\n text-align: center;\n }\n}\n\n.nav-justified {\n .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center;\n }\n}\n\n\n// Tabbable tabs\n//\n// Hide tabbable panes to start, show them when `.active`\n\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n","// Contents\n//\n// Navbar\n// Navbar brand\n// Navbar nav\n// Navbar text\n// Navbar divider\n// Responsive navbar\n// Navbar position\n// Navbar themes\n\n\n// Navbar\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n display: flex;\n flex-wrap: wrap; // allow us to do the line break for collapsing content\n align-items: center;\n justify-content: space-between; // space out brand from logo\n padding: $navbar-padding-y $navbar-padding-x;\n\n // Because flex properties aren't inherited, we need to redeclare these first\n // few properities so that content nested within behave properly.\n > .container,\n > .container-fluid {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n }\n}\n\n\n// Navbar brand\n//\n// Used for brand, project, or site names.\n\n.navbar-brand {\n display: inline-block;\n padding-top: $navbar-brand-padding-y;\n padding-bottom: $navbar-brand-padding-y;\n margin-right: $navbar-padding-x;\n font-size: $navbar-brand-font-size;\n line-height: inherit;\n white-space: nowrap;\n\n @include hover-focus {\n text-decoration: none;\n }\n}\n\n\n// Navbar nav\n//\n// Custom navbar navigation (doesn't require `.nav`, but does make use of `.nav-link`).\n\n.navbar-nav {\n display: flex;\n flex-direction: column; // cannot use `inherit` to get the `.navbar`s value\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n\n .nav-link {\n padding-right: 0;\n padding-left: 0;\n }\n\n .dropdown-menu {\n position: static;\n float: none;\n }\n}\n\n\n// Navbar text\n//\n//\n\n.navbar-text {\n display: inline-block;\n padding-top: $nav-link-padding-y;\n padding-bottom: $nav-link-padding-y;\n}\n\n\n// Responsive navbar\n//\n// Custom styles for responsive collapsing and toggling of navbar contents.\n// Powered by the collapse Bootstrap JavaScript plugin.\n\n// When collapsed, prevent the toggleable navbar contents from appearing in\n// the default flexbox row orienation. Requires the use of `flex-wrap: wrap`\n// on the `.navbar` parent.\n.navbar-collapse {\n flex-basis: 100%;\n flex-grow: 1;\n // For always expanded or extra full navbars, ensure content aligns itself\n // properly vertically. Can be easily overridden with flex utilities.\n align-items: center;\n}\n\n// Button for toggling the navbar when in its collapsed state\n.navbar-toggler {\n padding: $navbar-toggler-padding-y $navbar-toggler-padding-x;\n font-size: $navbar-toggler-font-size;\n line-height: 1;\n background-color: transparent; // remove default button style\n border: $border-width solid transparent; // remove default button style\n @include border-radius($navbar-toggler-border-radius);\n\n @include hover-focus {\n text-decoration: none;\n }\n\n // Opinionated: add \"hand\" cursor to non-disabled .navbar-toggler elements\n &:not(:disabled):not(.disabled) {\n cursor: pointer;\n }\n}\n\n// Keep as a separate element so folks can easily override it with another icon\n// or image file as needed.\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.5em;\n height: 1.5em;\n vertical-align: middle;\n content: \"\";\n background: no-repeat center center;\n background-size: 100% 100%;\n}\n\n// Generate series of `.navbar-expand-*` responsive classes for configuring\n// where your navbar collapses.\n.navbar-expand {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $next: breakpoint-next($breakpoint, $grid-breakpoints);\n $infix: breakpoint-infix($next, $grid-breakpoints);\n\n &#{$infix} {\n @include media-breakpoint-down($breakpoint) {\n > .container,\n > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n }\n\n @include media-breakpoint-up($next) {\n flex-flow: row nowrap;\n justify-content: flex-start;\n\n .navbar-nav {\n flex-direction: row;\n\n .dropdown-menu {\n position: absolute;\n }\n\n .nav-link {\n padding-right: $navbar-nav-link-padding-x;\n padding-left: $navbar-nav-link-padding-x;\n }\n }\n\n // For nesting containers, have to redeclare for alignment purposes\n > .container,\n > .container-fluid {\n flex-wrap: nowrap;\n }\n\n .navbar-collapse {\n display: flex !important; // stylelint-disable-line declaration-no-important\n\n // Changes flex-bases to auto because of an IE10 bug\n flex-basis: auto;\n }\n\n .navbar-toggler {\n display: none;\n }\n }\n }\n }\n}\n\n\n// Navbar themes\n//\n// Styles for switching between navbars with light or dark background.\n\n// Dark links against a light background\n.navbar-light {\n .navbar-brand {\n color: $navbar-light-active-color;\n\n @include hover-focus {\n color: $navbar-light-active-color;\n }\n }\n\n .navbar-nav {\n .nav-link {\n color: $navbar-light-color;\n\n @include hover-focus {\n color: $navbar-light-hover-color;\n }\n\n &.disabled {\n color: $navbar-light-disabled-color;\n }\n }\n\n .show > .nav-link,\n .active > .nav-link,\n .nav-link.show,\n .nav-link.active {\n color: $navbar-light-active-color;\n }\n }\n\n .navbar-toggler {\n color: $navbar-light-color;\n border-color: $navbar-light-toggler-border-color;\n }\n\n .navbar-toggler-icon {\n background-image: $navbar-light-toggler-icon-bg;\n }\n\n .navbar-text {\n color: $navbar-light-color;\n a {\n color: $navbar-light-active-color;\n\n @include hover-focus {\n color: $navbar-light-active-color;\n }\n }\n }\n}\n\n// White links against a dark background\n.navbar-dark {\n .navbar-brand {\n color: $navbar-dark-active-color;\n\n @include hover-focus {\n color: $navbar-dark-active-color;\n }\n }\n\n .navbar-nav {\n .nav-link {\n color: $navbar-dark-color;\n\n @include hover-focus {\n color: $navbar-dark-hover-color;\n }\n\n &.disabled {\n color: $navbar-dark-disabled-color;\n }\n }\n\n .show > .nav-link,\n .active > .nav-link,\n .nav-link.show,\n .nav-link.active {\n color: $navbar-dark-active-color;\n }\n }\n\n .navbar-toggler {\n color: $navbar-dark-color;\n border-color: $navbar-dark-toggler-border-color;\n }\n\n .navbar-toggler-icon {\n background-image: $navbar-dark-toggler-icon-bg;\n }\n\n .navbar-text {\n color: $navbar-dark-color;\n a {\n color: $navbar-dark-active-color;\n\n @include hover-focus {\n color: $navbar-dark-active-color;\n }\n }\n }\n}\n","//\n// Base styles\n//\n\n.card {\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0;\n word-wrap: break-word;\n background-color: $card-bg;\n background-clip: border-box;\n border: $card-border-width solid $card-border-color;\n @include border-radius($card-border-radius);\n\n > hr {\n margin-right: 0;\n margin-left: 0;\n }\n\n > .list-group:first-child {\n .list-group-item:first-child {\n @include border-top-radius($card-border-radius);\n }\n }\n\n > .list-group:last-child {\n .list-group-item:last-child {\n @include border-bottom-radius($card-border-radius);\n }\n }\n}\n\n.card-body {\n // Enable `flex-grow: 1` for decks and groups so that card blocks take up\n // as much space as possible, ensuring footers are aligned to the bottom.\n flex: 1 1 auto;\n padding: $card-spacer-x;\n}\n\n.card-title {\n margin-bottom: $card-spacer-y;\n}\n\n.card-subtitle {\n margin-top: -($card-spacer-y / 2);\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link {\n @include hover {\n text-decoration: none;\n }\n\n + .card-link {\n margin-left: $card-spacer-x;\n }\n}\n\n//\n// Optional textual caps\n//\n\n.card-header {\n padding: $card-spacer-y $card-spacer-x;\n margin-bottom: 0; // Removes the default margin-bottom of <hN>\n background-color: $card-cap-bg;\n border-bottom: $card-border-width solid $card-border-color;\n\n &:first-child {\n @include border-radius($card-inner-border-radius $card-inner-border-radius 0 0);\n }\n\n + .list-group {\n .list-group-item:first-child {\n border-top: 0;\n }\n }\n}\n\n.card-footer {\n padding: $card-spacer-y $card-spacer-x;\n background-color: $card-cap-bg;\n border-top: $card-border-width solid $card-border-color;\n\n &:last-child {\n @include border-radius(0 0 $card-inner-border-radius $card-inner-border-radius);\n }\n}\n\n\n//\n// Header navs\n//\n\n.card-header-tabs {\n margin-right: -($card-spacer-x / 2);\n margin-bottom: -$card-spacer-y;\n margin-left: -($card-spacer-x / 2);\n border-bottom: 0;\n}\n\n.card-header-pills {\n margin-right: -($card-spacer-x / 2);\n margin-left: -($card-spacer-x / 2);\n}\n\n// Card image\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: $card-img-overlay-padding;\n}\n\n.card-img {\n width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch\n @include border-radius($card-inner-border-radius);\n}\n\n// Card image caps\n.card-img-top {\n width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch\n @include border-top-radius($card-inner-border-radius);\n}\n\n.card-img-bottom {\n width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch\n @include border-bottom-radius($card-inner-border-radius);\n}\n\n\n// Card deck\n\n.card-deck {\n display: flex;\n flex-direction: column;\n\n .card {\n margin-bottom: $card-deck-margin;\n }\n\n @include media-breakpoint-up(sm) {\n flex-flow: row wrap;\n margin-right: -$card-deck-margin;\n margin-left: -$card-deck-margin;\n\n .card {\n display: flex;\n // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n flex: 1 0 0%;\n flex-direction: column;\n margin-right: $card-deck-margin;\n margin-bottom: 0; // Override the default\n margin-left: $card-deck-margin;\n }\n }\n}\n\n\n//\n// Card groups\n//\n\n.card-group {\n display: flex;\n flex-direction: column;\n\n // The child selector allows nested `.card` within `.card-group`\n // to display properly.\n > .card {\n margin-bottom: $card-group-margin;\n }\n\n @include media-breakpoint-up(sm) {\n flex-flow: row wrap;\n // The child selector allows nested `.card` within `.card-group`\n // to display properly.\n > .card {\n // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n flex: 1 0 0%;\n margin-bottom: 0;\n\n + .card {\n margin-left: 0;\n border-left: 0;\n }\n\n // Handle rounded corners\n @if $enable-rounded {\n &:first-child {\n @include border-right-radius(0);\n\n .card-img-top,\n .card-header {\n border-top-right-radius: 0;\n }\n .card-img-bottom,\n .card-footer {\n border-bottom-right-radius: 0;\n }\n }\n\n &:last-child {\n @include border-left-radius(0);\n\n .card-img-top,\n .card-header {\n border-top-left-radius: 0;\n }\n .card-img-bottom,\n .card-footer {\n border-bottom-left-radius: 0;\n }\n }\n\n &:only-child {\n @include border-radius($card-border-radius);\n\n .card-img-top,\n .card-header {\n @include border-top-radius($card-border-radius);\n }\n .card-img-bottom,\n .card-footer {\n @include border-bottom-radius($card-border-radius);\n }\n }\n\n &:not(:first-child):not(:last-child):not(:only-child) {\n @include border-radius(0);\n\n .card-img-top,\n .card-img-bottom,\n .card-header,\n .card-footer {\n @include border-radius(0);\n }\n }\n }\n }\n }\n}\n\n\n//\n// Columns\n//\n\n.card-columns {\n .card {\n margin-bottom: $card-columns-margin;\n }\n\n @include media-breakpoint-up(sm) {\n column-count: $card-columns-count;\n column-gap: $card-columns-gap;\n orphans: 1;\n widows: 1;\n\n .card {\n display: inline-block; // Don't let them vertically span multiple columns\n width: 100%; // Don't let their width change\n }\n }\n}\n\n\n//\n// Accordion\n//\n\n.accordion {\n .card:not(:first-of-type):not(:last-of-type) {\n border-bottom: 0;\n border-radius: 0;\n }\n\n .card:not(:first-of-type) {\n .card-header:first-child {\n border-radius: 0;\n }\n }\n\n .card:first-of-type {\n border-bottom: 0;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n }\n\n .card:last-of-type {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n}\n",".breadcrumb {\n display: flex;\n flex-wrap: wrap;\n padding: $breadcrumb-padding-y $breadcrumb-padding-x;\n margin-bottom: $breadcrumb-margin-bottom;\n list-style: none;\n background-color: $breadcrumb-bg;\n @include border-radius($breadcrumb-border-radius);\n}\n\n.breadcrumb-item {\n // The separator between breadcrumbs (by default, a forward-slash: \"/\")\n + .breadcrumb-item {\n padding-left: $breadcrumb-item-padding;\n\n &::before {\n display: inline-block; // Suppress underlining of the separator in modern browsers\n padding-right: $breadcrumb-item-padding;\n color: $breadcrumb-divider-color;\n content: $breadcrumb-divider;\n }\n }\n\n // IE9-11 hack to properly handle hyperlink underlines for breadcrumbs built\n // without `<ul>`s. The `::before` pseudo-element generates an element\n // *within* the .breadcrumb-item and thereby inherits the `text-decoration`.\n //\n // To trick IE into suppressing the underline, we give the pseudo-element an\n // underline and then immediately remove it.\n + .breadcrumb-item:hover::before {\n text-decoration: underline;\n }\n // stylelint-disable-next-line no-duplicate-selectors\n + .breadcrumb-item:hover::before {\n text-decoration: none;\n }\n\n &.active {\n color: $breadcrumb-active-color;\n }\n}\n",".pagination {\n display: flex;\n @include list-unstyled();\n @include border-radius();\n}\n\n.page-link {\n position: relative;\n display: block;\n padding: $pagination-padding-y $pagination-padding-x;\n margin-left: -$pagination-border-width;\n line-height: $pagination-line-height;\n color: $pagination-color;\n background-color: $pagination-bg;\n border: $pagination-border-width solid $pagination-border-color;\n\n &:hover {\n z-index: 2;\n color: $pagination-hover-color;\n text-decoration: none;\n background-color: $pagination-hover-bg;\n border-color: $pagination-hover-border-color;\n }\n\n &:focus {\n z-index: 2;\n outline: $pagination-focus-outline;\n box-shadow: $pagination-focus-box-shadow;\n }\n\n // Opinionated: add \"hand\" cursor to non-disabled .page-link elements\n &:not(:disabled):not(.disabled) {\n cursor: pointer;\n }\n}\n\n.page-item {\n &:first-child {\n .page-link {\n margin-left: 0;\n @include border-left-radius($border-radius);\n }\n }\n &:last-child {\n .page-link {\n @include border-right-radius($border-radius);\n }\n }\n\n &.active .page-link {\n z-index: 1;\n color: $pagination-active-color;\n background-color: $pagination-active-bg;\n border-color: $pagination-active-border-color;\n }\n\n &.disabled .page-link {\n color: $pagination-disabled-color;\n pointer-events: none;\n // Opinionated: remove the \"hand\" cursor set previously for .page-link\n cursor: auto;\n background-color: $pagination-disabled-bg;\n border-color: $pagination-disabled-border-color;\n }\n}\n\n\n//\n// Sizing\n//\n\n.pagination-lg {\n @include pagination-size($pagination-padding-y-lg, $pagination-padding-x-lg, $font-size-lg, $line-height-lg, $border-radius-lg);\n}\n\n.pagination-sm {\n @include pagination-size($pagination-padding-y-sm, $pagination-padding-x-sm, $font-size-sm, $line-height-sm, $border-radius-sm);\n}\n","// Pagination\n\n@mixin pagination-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) {\n .page-link {\n padding: $padding-y $padding-x;\n font-size: $font-size;\n line-height: $line-height;\n }\n\n .page-item {\n &:first-child {\n .page-link {\n @include border-left-radius($border-radius);\n }\n }\n &:last-child {\n .page-link {\n @include border-right-radius($border-radius);\n }\n }\n }\n}\n","// Base class\n//\n// Requires one of the contextual, color modifier classes for `color` and\n// `background-color`.\n\n.badge {\n display: inline-block;\n padding: $badge-padding-y $badge-padding-x;\n font-size: $badge-font-size;\n font-weight: $badge-font-weight;\n line-height: 1;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n @include border-radius($badge-border-radius);\n\n // Empty badges collapse automatically\n &:empty {\n display: none;\n }\n}\n\n// Quick fix for badges in buttons\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n// Pill badges\n//\n// Make them extra rounded with a modifier to replace v3's badges.\n\n.badge-pill {\n padding-right: $badge-pill-padding-x;\n padding-left: $badge-pill-padding-x;\n @include border-radius($badge-pill-border-radius);\n}\n\n// Colors\n//\n// Contextual variations (linked badges get darker on :hover).\n\n@each $color, $value in $theme-colors {\n .badge-#{$color} {\n @include badge-variant($value);\n }\n}\n","@mixin badge-variant($bg) {\n color: color-yiq($bg);\n background-color: $bg;\n\n &[href] {\n @include hover-focus {\n color: color-yiq($bg);\n text-decoration: none;\n background-color: darken($bg, 10%);\n }\n }\n}\n",".jumbotron {\n padding: $jumbotron-padding ($jumbotron-padding / 2);\n margin-bottom: $jumbotron-padding;\n background-color: $jumbotron-bg;\n @include border-radius($border-radius-lg);\n\n @include media-breakpoint-up(sm) {\n padding: ($jumbotron-padding * 2) $jumbotron-padding;\n }\n}\n\n.jumbotron-fluid {\n padding-right: 0;\n padding-left: 0;\n @include border-radius(0);\n}\n","//\n// Base styles\n//\n\n.alert {\n position: relative;\n padding: $alert-padding-y $alert-padding-x;\n margin-bottom: $alert-margin-bottom;\n border: $alert-border-width solid transparent;\n @include border-radius($alert-border-radius);\n}\n\n// Headings for larger alerts\n.alert-heading {\n // Specified to prevent conflicts of changing $headings-color\n color: inherit;\n}\n\n// Provide class for links that match alerts\n.alert-link {\n font-weight: $alert-link-font-weight;\n}\n\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissible {\n padding-right: ($close-font-size + $alert-padding-x * 2);\n\n // Adjust close link position\n .close {\n position: absolute;\n top: 0;\n right: 0;\n padding: $alert-padding-y $alert-padding-x;\n color: inherit;\n }\n}\n\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n@each $color, $value in $theme-colors {\n .alert-#{$color} {\n @include alert-variant(theme-color-level($color, $alert-bg-level), theme-color-level($color, $alert-border-level), theme-color-level($color, $alert-color-level));\n }\n}\n","@mixin alert-variant($background, $border, $color) {\n color: $color;\n @include gradient-bg($background);\n border-color: $border;\n\n hr {\n border-top-color: darken($border, 5%);\n }\n\n .alert-link {\n color: darken($color, 10%);\n }\n}\n","@keyframes progress-bar-stripes {\n from { background-position: $progress-height 0; }\n to { background-position: 0 0; }\n}\n\n.progress {\n display: flex;\n height: $progress-height;\n overflow: hidden; // force rounded corners by cropping it\n font-size: $progress-font-size;\n background-color: $progress-bg;\n @include border-radius($progress-border-radius);\n @include box-shadow($progress-box-shadow);\n}\n\n.progress-bar {\n display: flex;\n flex-direction: column;\n justify-content: center;\n color: $progress-bar-color;\n text-align: center;\n white-space: nowrap;\n background-color: $progress-bar-bg;\n @include transition($progress-bar-transition);\n}\n\n.progress-bar-striped {\n @include gradient-striped();\n background-size: $progress-height $progress-height;\n}\n\n.progress-bar-animated {\n animation: progress-bar-stripes $progress-bar-animation-timing;\n}\n",".media {\n display: flex;\n align-items: flex-start;\n}\n\n.media-body {\n flex: 1;\n}\n","// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n display: flex;\n flex-direction: column;\n\n // No need to set list-style: none; since .list-group-item is block level\n padding-left: 0; // reset padding because ul and ol\n margin-bottom: 0;\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive\n// list items. Includes an extra `.active` modifier class for selected items.\n\n.list-group-item-action {\n width: 100%; // For `<button>`s (anchors become 100% by default though)\n color: $list-group-action-color;\n text-align: inherit; // For `<button>`s (anchors inherit)\n\n // Hover state\n @include hover-focus {\n color: $list-group-action-hover-color;\n text-decoration: none;\n background-color: $list-group-hover-bg;\n }\n\n &:active {\n color: $list-group-action-active-color;\n background-color: $list-group-action-active-bg;\n }\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: $list-group-item-padding-y $list-group-item-padding-x;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -$list-group-border-width;\n background-color: $list-group-bg;\n border: $list-group-border-width solid $list-group-border-color;\n\n &:first-child {\n @include border-top-radius($list-group-border-radius);\n }\n\n &:last-child {\n margin-bottom: 0;\n @include border-bottom-radius($list-group-border-radius);\n }\n\n @include hover-focus {\n z-index: 1; // Place hover/active items above their siblings for proper border styling\n text-decoration: none;\n }\n\n &.disabled,\n &:disabled {\n color: $list-group-disabled-color;\n background-color: $list-group-disabled-bg;\n }\n\n // Include both here for `<a>`s and `<button>`s\n &.active {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: $list-group-active-color;\n background-color: $list-group-active-bg;\n border-color: $list-group-active-border-color;\n }\n}\n\n\n// Flush list items\n//\n// Remove borders and border-radius to keep list group items edge-to-edge. Most\n// useful within other components (e.g., cards).\n\n.list-group-flush {\n .list-group-item {\n border-right: 0;\n border-left: 0;\n @include border-radius(0);\n }\n\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n }\n }\n\n &:last-child {\n .list-group-item:last-child {\n border-bottom: 0;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n@each $color, $value in $theme-colors {\n @include list-group-item-variant($color, theme-color-level($color, -9), theme-color-level($color, 6));\n}\n","// List Groups\n\n@mixin list-group-item-variant($state, $background, $color) {\n .list-group-item-#{$state} {\n color: $color;\n background-color: $background;\n\n &.list-group-item-action {\n @include hover-focus {\n color: $color;\n background-color: darken($background, 5%);\n }\n\n &.active {\n color: $white;\n background-color: $color;\n border-color: $color;\n }\n }\n }\n}\n",".close {\n float: right;\n font-size: $close-font-size;\n font-weight: $close-font-weight;\n line-height: 1;\n color: $close-color;\n text-shadow: $close-text-shadow;\n opacity: .5;\n\n @include hover-focus {\n color: $close-color;\n text-decoration: none;\n opacity: .75;\n }\n\n // Opinionated: add \"hand\" cursor to non-disabled .close elements\n &:not(:disabled):not(.disabled) {\n cursor: pointer;\n }\n}\n\n// Additional properties for button version\n// iOS requires the button element instead of an anchor tag.\n// If you want the anchor version, it requires `href=\"#\"`.\n// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n// stylelint-disable property-no-vendor-prefix, selector-no-qualifying-type\nbutton.close {\n padding: 0;\n background-color: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n// stylelint-enable\n","// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and stuff\n\n\n// Kill the scroll on the body\n.modal-open {\n overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: $zindex-modal;\n display: none;\n overflow: hidden;\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n // We deliberately don't use `-webkit-overflow-scrolling: touch;` due to a\n // gnarly iOS Safari bug: https://bugs.webkit.org/show_bug.cgi?id=158342\n // See also https://github.com/twbs/bootstrap/issues/17695\n\n .modal-open & {\n overflow-x: hidden;\n overflow-y: auto;\n }\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: $modal-dialog-margin;\n // allow clicks to pass through for custom click handling to close modal\n pointer-events: none;\n\n // When fading in the modal, animate it to slide down\n .modal.fade & {\n @include transition($modal-transition);\n transform: translate(0, -25%);\n }\n .modal.show & {\n transform: translate(0, 0);\n }\n}\n\n.modal-dialog-centered {\n display: flex;\n align-items: center;\n min-height: calc(100% - (#{$modal-dialog-margin} * 2));\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%; // Ensure `.modal-content` extends the full width of the parent `.modal-dialog`\n // counteract the pointer-events: none; in the .modal-dialog\n pointer-events: auto;\n background-color: $modal-content-bg;\n background-clip: padding-box;\n border: $modal-content-border-width solid $modal-content-border-color;\n @include border-radius($modal-content-border-radius);\n @include box-shadow($modal-content-box-shadow-xs);\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: $zindex-modal-backdrop;\n background-color: $modal-backdrop-bg;\n\n // Fade for backdrop\n &.fade { opacity: 0; }\n &.show { opacity: $modal-backdrop-opacity; }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n display: flex;\n align-items: flex-start; // so the close btn always stays on the upper right corner\n justify-content: space-between; // Put modal header elements (title and dismiss) on opposite ends\n padding: $modal-header-padding;\n border-bottom: $modal-header-border-width solid $modal-header-border-color;\n @include border-top-radius($modal-content-border-radius);\n\n .close {\n padding: $modal-header-padding;\n // auto on the left force icon to the right even when there is no .modal-title\n margin: (-$modal-header-padding) (-$modal-header-padding) (-$modal-header-padding) auto;\n }\n}\n\n// Title text within header\n.modal-title {\n margin-bottom: 0;\n line-height: $modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n // Enable `flex-grow: 1` so that the body take up as much space as possible\n // when should there be a fixed height on `.modal-dialog`.\n flex: 1 1 auto;\n padding: $modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n display: flex;\n align-items: center; // vertically center\n justify-content: flex-end; // Right align buttons with flex property because text-align doesn't work on flex items\n padding: $modal-inner-padding;\n border-top: $modal-footer-border-width solid $modal-footer-border-color;\n\n // Easily place margin between footer elements\n > :not(:first-child) { margin-left: .25rem; }\n > :not(:last-child) { margin-right: .25rem; }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n// Scale up the modal\n@include media-breakpoint-up(sm) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n max-width: $modal-md;\n margin: $modal-dialog-margin-y-sm-up auto;\n }\n\n .modal-dialog-centered {\n min-height: calc(100% - (#{$modal-dialog-margin-y-sm-up} * 2));\n }\n\n .modal-content {\n @include box-shadow($modal-content-box-shadow-sm-up);\n }\n\n .modal-sm { max-width: $modal-sm; }\n\n}\n\n@include media-breakpoint-up(lg) {\n .modal-lg { max-width: $modal-lg; }\n}\n","// Base class\n.tooltip {\n position: absolute;\n z-index: $zindex-tooltip;\n display: block;\n margin: $tooltip-margin;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n @include reset-text();\n font-size: $tooltip-font-size;\n // Allow breaking very long words so they don't overflow the tooltip's bounds\n word-wrap: break-word;\n opacity: 0;\n\n &.show { opacity: $tooltip-opacity; }\n\n .arrow {\n position: absolute;\n display: block;\n width: $tooltip-arrow-width;\n height: $tooltip-arrow-height;\n\n &::before {\n position: absolute;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n }\n }\n}\n\n.bs-tooltip-top {\n padding: $tooltip-arrow-height 0;\n\n .arrow {\n bottom: 0;\n\n &::before {\n top: 0;\n border-width: $tooltip-arrow-height ($tooltip-arrow-width / 2) 0;\n border-top-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-right {\n padding: 0 $tooltip-arrow-height;\n\n .arrow {\n left: 0;\n width: $tooltip-arrow-height;\n height: $tooltip-arrow-width;\n\n &::before {\n right: 0;\n border-width: ($tooltip-arrow-width / 2) $tooltip-arrow-height ($tooltip-arrow-width / 2) 0;\n border-right-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-bottom {\n padding: $tooltip-arrow-height 0;\n\n .arrow {\n top: 0;\n\n &::before {\n bottom: 0;\n border-width: 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height;\n border-bottom-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-left {\n padding: 0 $tooltip-arrow-height;\n\n .arrow {\n right: 0;\n width: $tooltip-arrow-height;\n height: $tooltip-arrow-width;\n\n &::before {\n left: 0;\n border-width: ($tooltip-arrow-width / 2) 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height;\n border-left-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-auto {\n &[x-placement^=\"top\"] {\n @extend .bs-tooltip-top;\n }\n &[x-placement^=\"right\"] {\n @extend .bs-tooltip-right;\n }\n &[x-placement^=\"bottom\"] {\n @extend .bs-tooltip-bottom;\n }\n &[x-placement^=\"left\"] {\n @extend .bs-tooltip-left;\n }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: $tooltip-max-width;\n padding: $tooltip-padding-y $tooltip-padding-x;\n color: $tooltip-color;\n text-align: center;\n background-color: $tooltip-bg;\n @include border-radius($tooltip-border-radius);\n}\n","@mixin reset-text {\n font-family: $font-family-base;\n // We deliberately do NOT reset font-size or word-wrap.\n font-style: normal;\n font-weight: $font-weight-normal;\n line-height: $line-height-base;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start; // stylelint-disable-line declaration-block-no-duplicate-properties\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n}\n",".popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: $zindex-popover;\n display: block;\n max-width: $popover-max-width;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n @include reset-text();\n font-size: $popover-font-size;\n // Allow breaking very long words so they don't overflow the popover's bounds\n word-wrap: break-word;\n background-color: $popover-bg;\n background-clip: padding-box;\n border: $popover-border-width solid $popover-border-color;\n @include border-radius($popover-border-radius);\n @include box-shadow($popover-box-shadow);\n\n .arrow {\n position: absolute;\n display: block;\n width: $popover-arrow-width;\n height: $popover-arrow-height;\n margin: 0 $border-radius-lg;\n\n &::before,\n &::after {\n position: absolute;\n display: block;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n }\n }\n}\n\n.bs-popover-top {\n margin-bottom: $popover-arrow-height;\n\n .arrow {\n bottom: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);\n }\n\n .arrow::before,\n .arrow::after {\n border-width: $popover-arrow-height ($popover-arrow-width / 2) 0;\n }\n\n .arrow::before {\n bottom: 0;\n border-top-color: $popover-arrow-outer-color;\n }\n\n .arrow::after {\n bottom: $popover-border-width;\n border-top-color: $popover-arrow-color;\n }\n}\n\n.bs-popover-right {\n margin-left: $popover-arrow-height;\n\n .arrow {\n left: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);\n width: $popover-arrow-height;\n height: $popover-arrow-width;\n margin: $border-radius-lg 0; // make sure the arrow does not touch the popover's rounded corners\n }\n\n .arrow::before,\n .arrow::after {\n border-width: ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2) 0;\n }\n\n .arrow::before {\n left: 0;\n border-right-color: $popover-arrow-outer-color;\n }\n\n .arrow::after {\n left: $popover-border-width;\n border-right-color: $popover-arrow-color;\n }\n}\n\n.bs-popover-bottom {\n margin-top: $popover-arrow-height;\n\n .arrow {\n top: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);\n }\n\n .arrow::before,\n .arrow::after {\n border-width: 0 ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2);\n }\n\n .arrow::before {\n top: 0;\n border-bottom-color: $popover-arrow-outer-color;\n }\n\n .arrow::after {\n top: $popover-border-width;\n border-bottom-color: $popover-arrow-color;\n }\n\n // This will remove the popover-header's border just below the arrow\n .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: $popover-arrow-width;\n margin-left: ($popover-arrow-width / -2);\n content: \"\";\n border-bottom: $popover-border-width solid $popover-header-bg;\n }\n}\n\n.bs-popover-left {\n margin-right: $popover-arrow-height;\n\n .arrow {\n right: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);\n width: $popover-arrow-height;\n height: $popover-arrow-width;\n margin: $border-radius-lg 0; // make sure the arrow does not touch the popover's rounded corners\n }\n\n .arrow::before,\n .arrow::after {\n border-width: ($popover-arrow-width / 2) 0 ($popover-arrow-width / 2) $popover-arrow-height;\n }\n\n .arrow::before {\n right: 0;\n border-left-color: $popover-arrow-outer-color;\n }\n\n .arrow::after {\n right: $popover-border-width;\n border-left-color: $popover-arrow-color;\n }\n}\n\n.bs-popover-auto {\n &[x-placement^=\"top\"] {\n @extend .bs-popover-top;\n }\n &[x-placement^=\"right\"] {\n @extend .bs-popover-right;\n }\n &[x-placement^=\"bottom\"] {\n @extend .bs-popover-bottom;\n }\n &[x-placement^=\"left\"] {\n @extend .bs-popover-left;\n }\n}\n\n\n// Offset the popover to account for the popover arrow\n.popover-header {\n padding: $popover-header-padding-y $popover-header-padding-x;\n margin-bottom: 0; // Reset the default from Reboot\n font-size: $font-size-base;\n color: $popover-header-color;\n background-color: $popover-header-bg;\n border-bottom: $popover-border-width solid darken($popover-header-bg, 5%);\n $offset-border-width: calc(#{$border-radius-lg} - #{$popover-border-width});\n @include border-top-radius($offset-border-width);\n\n &:empty {\n display: none;\n }\n}\n\n.popover-body {\n padding: $popover-body-padding-y $popover-body-padding-x;\n color: $popover-body-color;\n}\n","// Notes on the classes:\n//\n// 1. The .carousel-item-left and .carousel-item-right is used to indicate where\n// the active slide is heading.\n// 2. .active.carousel-item is the current slide.\n// 3. .active.carousel-item-left and .active.carousel-item-right is the current\n// slide in its in-transition state. Only one of these occurs at a time.\n// 4. .carousel-item-next.carousel-item-left and .carousel-item-prev.carousel-item-right\n// is the upcoming slide in transition.\n\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n\n.carousel-item {\n position: relative;\n display: none;\n align-items: center;\n width: 100%;\n @include transition($carousel-transition);\n backface-visibility: hidden;\n perspective: 1000px;\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n.carousel-item-next,\n.carousel-item-prev {\n position: absolute;\n top: 0;\n}\n\n.carousel-item-next.carousel-item-left,\n.carousel-item-prev.carousel-item-right {\n transform: translateX(0);\n\n @supports (transform-style: preserve-3d) {\n transform: translate3d(0, 0, 0);\n }\n}\n\n.carousel-item-next,\n.active.carousel-item-right {\n transform: translateX(100%);\n\n @supports (transform-style: preserve-3d) {\n transform: translate3d(100%, 0, 0);\n }\n}\n\n.carousel-item-prev,\n.active.carousel-item-left {\n transform: translateX(-100%);\n\n @supports (transform-style: preserve-3d) {\n transform: translate3d(-100%, 0, 0);\n }\n}\n\n\n//\n// Alternate transitions\n//\n\n.carousel-fade {\n .carousel-item {\n opacity: 0;\n transition-duration: .6s;\n transition-property: opacity;\n }\n\n .carousel-item.active,\n .carousel-item-next.carousel-item-left,\n .carousel-item-prev.carousel-item-right {\n opacity: 1;\n }\n\n .active.carousel-item-left,\n .active.carousel-item-right {\n opacity: 0;\n }\n\n .carousel-item-next,\n .carousel-item-prev,\n .carousel-item.active,\n .active.carousel-item-left,\n .active.carousel-item-prev {\n transform: translateX(0);\n\n @supports (transform-style: preserve-3d) {\n transform: translate3d(0, 0, 0);\n }\n }\n}\n\n\n//\n// Left/right controls for nav\n//\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n // Use flex for alignment (1-3)\n display: flex; // 1. allow flex styles\n align-items: center; // 2. vertically center contents\n justify-content: center; // 3. horizontally center contents\n width: $carousel-control-width;\n color: $carousel-control-color;\n text-align: center;\n opacity: $carousel-control-opacity;\n // We can't have a transition here because WebKit cancels the carousel\n // animation if you trip this while in the middle of another animation.\n\n // Hover/focus state\n @include hover-focus {\n color: $carousel-control-color;\n text-decoration: none;\n outline: 0;\n opacity: .9;\n }\n}\n.carousel-control-prev {\n left: 0;\n @if $enable-gradients {\n background: linear-gradient(90deg, rgba($black, .25), rgba($black, .001));\n }\n}\n.carousel-control-next {\n right: 0;\n @if $enable-gradients {\n background: linear-gradient(270deg, rgba($black, .25), rgba($black, .001));\n }\n}\n\n// Icons for within\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: $carousel-control-icon-width;\n height: $carousel-control-icon-width;\n background: transparent no-repeat center center;\n background-size: 100% 100%;\n}\n.carousel-control-prev-icon {\n background-image: $carousel-control-prev-icon-bg;\n}\n.carousel-control-next-icon {\n background-image: $carousel-control-next-icon-bg;\n}\n\n\n// Optional indicator pips\n//\n// Add an ordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 10px;\n left: 0;\n z-index: 15;\n display: flex;\n justify-content: center;\n padding-left: 0; // override <ol> default\n // Use the .carousel-control's width as margin so we don't overlay those\n margin-right: $carousel-control-width;\n margin-left: $carousel-control-width;\n list-style: none;\n\n li {\n position: relative;\n flex: 0 1 auto;\n width: $carousel-indicator-width;\n height: $carousel-indicator-height;\n margin-right: $carousel-indicator-spacer;\n margin-left: $carousel-indicator-spacer;\n text-indent: -999px;\n cursor: pointer;\n background-color: rgba($carousel-indicator-active-bg, .5);\n\n // Use pseudo classes to increase the hit area by 10px on top and bottom.\n &::before {\n position: absolute;\n top: -10px;\n left: 0;\n display: inline-block;\n width: 100%;\n height: 10px;\n content: \"\";\n }\n &::after {\n position: absolute;\n bottom: -10px;\n left: 0;\n display: inline-block;\n width: 100%;\n height: 10px;\n content: \"\";\n }\n }\n\n .active {\n background-color: $carousel-indicator-active-bg;\n }\n}\n\n\n// Optional captions\n//\n//\n\n.carousel-caption {\n position: absolute;\n right: ((100% - $carousel-caption-width) / 2);\n bottom: 20px;\n left: ((100% - $carousel-caption-width) / 2);\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: $carousel-caption-color;\n text-align: center;\n}\n","// stylelint-disable declaration-no-important\n\n.align-baseline { vertical-align: baseline !important; } // Browser default\n.align-top { vertical-align: top !important; }\n.align-middle { vertical-align: middle !important; }\n.align-bottom { vertical-align: bottom !important; }\n.align-text-bottom { vertical-align: text-bottom !important; }\n.align-text-top { vertical-align: text-top !important; }\n","// stylelint-disable declaration-no-important\n\n// Contextual backgrounds\n\n@mixin bg-variant($parent, $color) {\n #{$parent} {\n background-color: $color !important;\n }\n a#{$parent},\n button#{$parent} {\n @include hover-focus {\n background-color: darken($color, 10%) !important;\n }\n }\n}\n\n@mixin bg-gradient-variant($parent, $color) {\n #{$parent} {\n background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x !important;\n }\n}\n","// stylelint-disable declaration-no-important\n\n@each $color, $value in $theme-colors {\n @include bg-variant(\".bg-#{$color}\", $value);\n}\n\n@if $enable-gradients {\n @each $color, $value in $theme-colors {\n @include bg-gradient-variant(\".bg-gradient-#{$color}\", $value);\n }\n}\n\n.bg-white {\n background-color: $white !important;\n}\n\n.bg-transparent {\n background-color: transparent !important;\n}\n","// stylelint-disable declaration-no-important\n\n//\n// Border\n//\n\n.border { border: $border-width solid $border-color !important; }\n.border-top { border-top: $border-width solid $border-color !important; }\n.border-right { border-right: $border-width solid $border-color !important; }\n.border-bottom { border-bottom: $border-width solid $border-color !important; }\n.border-left { border-left: $border-width solid $border-color !important; }\n\n.border-0 { border: 0 !important; }\n.border-top-0 { border-top: 0 !important; }\n.border-right-0 { border-right: 0 !important; }\n.border-bottom-0 { border-bottom: 0 !important; }\n.border-left-0 { border-left: 0 !important; }\n\n@each $color, $value in $theme-colors {\n .border-#{$color} {\n border-color: $value !important;\n }\n}\n\n.border-white {\n border-color: $white !important;\n}\n\n//\n// Border-radius\n//\n\n.rounded {\n border-radius: $border-radius !important;\n}\n.rounded-top {\n border-top-left-radius: $border-radius !important;\n border-top-right-radius: $border-radius !important;\n}\n.rounded-right {\n border-top-right-radius: $border-radius !important;\n border-bottom-right-radius: $border-radius !important;\n}\n.rounded-bottom {\n border-bottom-right-radius: $border-radius !important;\n border-bottom-left-radius: $border-radius !important;\n}\n.rounded-left {\n border-top-left-radius: $border-radius !important;\n border-bottom-left-radius: $border-radius !important;\n}\n\n.rounded-circle {\n border-radius: 50% !important;\n}\n\n.rounded-0 {\n border-radius: 0 !important;\n}\n","@mixin clearfix() {\n &::after {\n display: block;\n clear: both;\n content: \"\";\n }\n}\n","// stylelint-disable declaration-no-important\n\n//\n// Utilities for common `display` values\n//\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .d#{$infix}-none { display: none !important; }\n .d#{$infix}-inline { display: inline !important; }\n .d#{$infix}-inline-block { display: inline-block !important; }\n .d#{$infix}-block { display: block !important; }\n .d#{$infix}-table { display: table !important; }\n .d#{$infix}-table-row { display: table-row !important; }\n .d#{$infix}-table-cell { display: table-cell !important; }\n .d#{$infix}-flex { display: flex !important; }\n .d#{$infix}-inline-flex { display: inline-flex !important; }\n }\n}\n\n\n//\n// Utilities for toggling `display` in print\n//\n\n@media print {\n .d-print-none { display: none !important; }\n .d-print-inline { display: inline !important; }\n .d-print-inline-block { display: inline-block !important; }\n .d-print-block { display: block !important; }\n .d-print-table { display: table !important; }\n .d-print-table-row { display: table-row !important; }\n .d-print-table-cell { display: table-cell !important; }\n .d-print-flex { display: flex !important; }\n .d-print-inline-flex { display: inline-flex !important; }\n}\n","// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n width: 100%;\n padding: 0;\n overflow: hidden;\n\n &::before {\n display: block;\n content: \"\";\n }\n\n .embed-responsive-item,\n iframe,\n embed,\n object,\n video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n }\n}\n\n.embed-responsive-21by9 {\n &::before {\n padding-top: percentage(9 / 21);\n }\n}\n\n.embed-responsive-16by9 {\n &::before {\n padding-top: percentage(9 / 16);\n }\n}\n\n.embed-responsive-4by3 {\n &::before {\n padding-top: percentage(3 / 4);\n }\n}\n\n.embed-responsive-1by1 {\n &::before {\n padding-top: percentage(1 / 1);\n }\n}\n","// stylelint-disable declaration-no-important\n\n// Flex variation\n//\n// Custom styles for additional flex alignment options.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .flex#{$infix}-row { flex-direction: row !important; }\n .flex#{$infix}-column { flex-direction: column !important; }\n .flex#{$infix}-row-reverse { flex-direction: row-reverse !important; }\n .flex#{$infix}-column-reverse { flex-direction: column-reverse !important; }\n\n .flex#{$infix}-wrap { flex-wrap: wrap !important; }\n .flex#{$infix}-nowrap { flex-wrap: nowrap !important; }\n .flex#{$infix}-wrap-reverse { flex-wrap: wrap-reverse !important; }\n .flex#{$infix}-fill { flex: 1 1 auto !important; }\n .flex#{$infix}-grow-0 { flex-grow: 0 !important; }\n .flex#{$infix}-grow-1 { flex-grow: 1 !important; }\n .flex#{$infix}-shrink-0 { flex-shrink: 0 !important; }\n .flex#{$infix}-shrink-1 { flex-shrink: 1 !important; }\n\n .justify-content#{$infix}-start { justify-content: flex-start !important; }\n .justify-content#{$infix}-end { justify-content: flex-end !important; }\n .justify-content#{$infix}-center { justify-content: center !important; }\n .justify-content#{$infix}-between { justify-content: space-between !important; }\n .justify-content#{$infix}-around { justify-content: space-around !important; }\n\n .align-items#{$infix}-start { align-items: flex-start !important; }\n .align-items#{$infix}-end { align-items: flex-end !important; }\n .align-items#{$infix}-center { align-items: center !important; }\n .align-items#{$infix}-baseline { align-items: baseline !important; }\n .align-items#{$infix}-stretch { align-items: stretch !important; }\n\n .align-content#{$infix}-start { align-content: flex-start !important; }\n .align-content#{$infix}-end { align-content: flex-end !important; }\n .align-content#{$infix}-center { align-content: center !important; }\n .align-content#{$infix}-between { align-content: space-between !important; }\n .align-content#{$infix}-around { align-content: space-around !important; }\n .align-content#{$infix}-stretch { align-content: stretch !important; }\n\n .align-self#{$infix}-auto { align-self: auto !important; }\n .align-self#{$infix}-start { align-self: flex-start !important; }\n .align-self#{$infix}-end { align-self: flex-end !important; }\n .align-self#{$infix}-center { align-self: center !important; }\n .align-self#{$infix}-baseline { align-self: baseline !important; }\n .align-self#{$infix}-stretch { align-self: stretch !important; }\n }\n}\n","@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .float#{$infix}-left { @include float-left; }\n .float#{$infix}-right { @include float-right; }\n .float#{$infix}-none { @include float-none; }\n }\n}\n","// stylelint-disable declaration-no-important\n\n@mixin float-left {\n float: left !important;\n}\n@mixin float-right {\n float: right !important;\n}\n@mixin float-none {\n float: none !important;\n}\n","// stylelint-disable declaration-no-important\n\n// Common values\n\n// Sass list not in variables since it's not intended for customization.\n// stylelint-disable-next-line scss/dollar-variable-default\n$positions: static, relative, absolute, fixed, sticky;\n\n@each $position in $positions {\n .position-#{$position} { position: $position !important; }\n}\n\n// Shorthand\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: $zindex-fixed;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: $zindex-fixed;\n}\n\n.sticky-top {\n @supports (position: sticky) {\n position: sticky;\n top: 0;\n z-index: $zindex-sticky;\n }\n}\n","//\n// Screenreaders\n//\n\n.sr-only {\n @include sr-only();\n}\n\n.sr-only-focusable {\n @include sr-only-focusable();\n}\n","// Only display content to screen readers\n//\n// See: https://a11yproject.com/posts/how-to-hide-content/\n// See: https://hugogiraudel.com/2016/10/13/css-hide-and-seek/\n\n@mixin sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n//\n// Useful for \"Skip to main content\" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n//\n// Credit: HTML5 Boilerplate\n\n@mixin sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n overflow: visible;\n clip: auto;\n white-space: normal;\n }\n}\n","// stylelint-disable declaration-no-important\n\n.shadow-sm { box-shadow: $box-shadow-sm !important; }\n.shadow { box-shadow: $box-shadow !important; }\n.shadow-lg { box-shadow: $box-shadow-lg !important; }\n.shadow-none { box-shadow: none !important; }\n","// stylelint-disable declaration-no-important\n\n// Width and height\n\n@each $prop, $abbrev in (width: w, height: h) {\n @each $size, $length in $sizes {\n .#{$abbrev}-#{$size} { #{$prop}: $length !important; }\n }\n}\n\n.mw-100 { max-width: 100% !important; }\n.mh-100 { max-height: 100% !important; }\n","// stylelint-disable declaration-no-important\n\n// Margin and Padding\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @each $prop, $abbrev in (margin: m, padding: p) {\n @each $size, $length in $spacers {\n\n .#{$abbrev}#{$infix}-#{$size} { #{$prop}: $length !important; }\n .#{$abbrev}t#{$infix}-#{$size},\n .#{$abbrev}y#{$infix}-#{$size} {\n #{$prop}-top: $length !important;\n }\n .#{$abbrev}r#{$infix}-#{$size},\n .#{$abbrev}x#{$infix}-#{$size} {\n #{$prop}-right: $length !important;\n }\n .#{$abbrev}b#{$infix}-#{$size},\n .#{$abbrev}y#{$infix}-#{$size} {\n #{$prop}-bottom: $length !important;\n }\n .#{$abbrev}l#{$infix}-#{$size},\n .#{$abbrev}x#{$infix}-#{$size} {\n #{$prop}-left: $length !important;\n }\n }\n }\n\n // Some special margin utils\n .m#{$infix}-auto { margin: auto !important; }\n .mt#{$infix}-auto,\n .my#{$infix}-auto {\n margin-top: auto !important;\n }\n .mr#{$infix}-auto,\n .mx#{$infix}-auto {\n margin-right: auto !important;\n }\n .mb#{$infix}-auto,\n .my#{$infix}-auto {\n margin-bottom: auto !important;\n }\n .ml#{$infix}-auto,\n .mx#{$infix}-auto {\n margin-left: auto !important;\n }\n }\n}\n","// stylelint-disable declaration-no-important\n\n//\n// Text\n//\n\n.text-monospace { font-family: $font-family-monospace; }\n\n// Alignment\n\n.text-justify { text-align: justify !important; }\n.text-nowrap { white-space: nowrap !important; }\n.text-truncate { @include text-truncate; }\n\n// Responsive alignment\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .text#{$infix}-left { text-align: left !important; }\n .text#{$infix}-right { text-align: right !important; }\n .text#{$infix}-center { text-align: center !important; }\n }\n}\n\n// Transformation\n\n.text-lowercase { text-transform: lowercase !important; }\n.text-uppercase { text-transform: uppercase !important; }\n.text-capitalize { text-transform: capitalize !important; }\n\n// Weight and italics\n\n.font-weight-light { font-weight: $font-weight-light !important; }\n.font-weight-normal { font-weight: $font-weight-normal !important; }\n.font-weight-bold { font-weight: $font-weight-bold !important; }\n.font-italic { font-style: italic !important; }\n\n// Contextual colors\n\n.text-white { color: $white !important; }\n\n@each $color, $value in $theme-colors {\n @include text-emphasis-variant(\".text-#{$color}\", $value);\n}\n\n.text-body { color: $body-color !important; }\n.text-muted { color: $text-muted !important; }\n\n.text-black-50 { color: rgba($black, .5) !important; }\n.text-white-50 { color: rgba($white, .5) !important; }\n\n// Misc\n\n.text-hide {\n @include text-hide($ignore-warning: true);\n}\n","// Text truncate\n// Requires inline-block or block for proper styling\n\n@mixin text-truncate() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","// stylelint-disable declaration-no-important\n\n// Typography\n\n@mixin text-emphasis-variant($parent, $color) {\n #{$parent} {\n color: $color !important;\n }\n a#{$parent} {\n @include hover-focus {\n color: darken($color, 10%) !important;\n }\n }\n}\n","// CSS image replacement\n@mixin text-hide($ignore-warning: false) {\n // stylelint-disable-next-line font-family-no-missing-generic-family-keyword\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n\n @if ($ignore-warning != true) {\n @warn \"The `text-hide()` mixin has been deprecated as of v4.1.1. It will be removed entirely in v5.\";\n }\n}\n","//\n// Visibility utilities\n//\n\n.visible {\n @include invisible(visible);\n}\n\n.invisible {\n @include invisible(hidden);\n}\n","// stylelint-disable declaration-no-important\n\n// Visibility\n\n@mixin invisible($visibility) {\n visibility: $visibility !important;\n}\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type\n\n// Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request:\n// https://www.phpied.com/delay-loading-your-print-css/\n// ==========================================================================\n\n@if $enable-print-styles {\n @media print {\n *,\n *::before,\n *::after {\n // Bootstrap specific; comment out `color` and `background`\n //color: $black !important; // Black prints faster\n text-shadow: none !important;\n //background: transparent !important;\n box-shadow: none !important;\n }\n\n a {\n &:not(.btn) {\n text-decoration: underline;\n }\n }\n\n // Bootstrap specific; comment the following selector out\n //a[href]::after {\n // content: \" (\" attr(href) \")\";\n //}\n\n abbr[title]::after {\n content: \" (\" attr(title) \")\";\n }\n\n // Bootstrap specific; comment the following selector out\n //\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n //\n\n //a[href^=\"#\"]::after,\n //a[href^=\"javascript:\"]::after {\n // content: \"\";\n //}\n\n pre {\n white-space: pre-wrap !important;\n }\n pre,\n blockquote {\n border: $border-width solid $gray-500; // Bootstrap custom code; using `$border-width` instead of 1px\n page-break-inside: avoid;\n }\n\n //\n // Printing Tables:\n // http://css-discuss.incutio.com/wiki/Printing_Tables\n //\n\n thead {\n display: table-header-group;\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Specify a size and min-width to make printing closer across browsers.\n // We don't set margin here because it breaks `size` in Chrome. We also\n // don't use `!important` on `size` as it breaks in Chrome.\n @page {\n size: $print-page-size;\n }\n body {\n min-width: $print-body-min-width !important;\n }\n .container {\n min-width: $print-body-min-width !important;\n }\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .badge {\n border: $border-width solid $black;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: $white !important;\n }\n }\n\n .table-bordered {\n th,\n td {\n border: 1px solid $gray-300 !important;\n }\n }\n\n .table-dark {\n color: inherit;\n\n th,\n td,\n thead th,\n tbody + tbody {\n border-color: $table-border-color;\n }\n }\n\n .table .thead-dark th {\n color: inherit;\n border-color: $table-border-color;\n }\n\n // Bootstrap specific changes end\n }\n}\n"]} \ No newline at end of file diff --git a/explorer/public/paper-dashboard/assets/css/paper-dashboard.css b/explorer/public/paper-dashboard/assets/css/paper-dashboard.css new file mode 100644 index 00000000000..42746003300 --- /dev/null +++ b/explorer/public/paper-dashboard/assets/css/paper-dashboard.css @@ -0,0 +1,6431 @@ +/*! + + ========================================================= + * Paper Dashboard 2 - v2.0.0 + ========================================================= + + * Product Page: https://www.creative-tim.com/product/paper-dashboard-2 + * Copyright 2018 Creative Tim (http://www.creative-tim.com) + + * Designed by www.invisionapp.com Coded by www.creative-tim.com + + ========================================================= + + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + + */ + +/*! +Animate.css - http://daneden.me/animate +Licensed under the MIT license - http://opensource.org/licenses/MIT + +Copyright (c) 2015 Daniel Eden +*/ + +.animated { + -webkit-animation-duration: 1s; + animation-duration: 1s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} + +.animated.infinite { + -webkit-animation-iteration-count: infinite; + animation-iteration-count: infinite; +} + +.animated.hinge { + -webkit-animation-duration: 2s; + animation-duration: 2s; +} + +.animated.bounceIn, +.animated.bounceOut { + -webkit-animation-duration: .75s; + animation-duration: .75s; +} + +.animated.flipOutX, +.animated.flipOutY { + -webkit-animation-duration: .75s; + animation-duration: .75s; +} + +@-webkit-keyframes shake { + from, + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + 10%, + 30%, + 50%, + 70%, + 90% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + } + 20%, + 40%, + 60%, + 80% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0); + } +} + +@keyframes shake { + from, + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + 10%, + 30%, + 50%, + 70%, + 90% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + } + 20%, + 40%, + 60%, + 80% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0); + } +} + +.shake { + -webkit-animation-name: shake; + animation-name: shake; +} + +@-webkit-keyframes fadeInDown { + from { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInDown { + from { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInDown { + -webkit-animation-name: fadeInDown; + animation-name: fadeInDown; +} + +@-webkit-keyframes fadeOut { + from { + opacity: 1; + } + to { + opacity: 0; + } +} + +@keyframes fadeOut { + from { + opacity: 1; + } + to { + opacity: 0; + } +} + +.fadeOut { + -webkit-animation-name: fadeOut; + animation-name: fadeOut; +} + +@-webkit-keyframes fadeOutDown { + from { + opacity: 1; + } + to { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +@keyframes fadeOutDown { + from { + opacity: 1; + } + to { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +.fadeOutDown { + -webkit-animation-name: fadeOutDown; + animation-name: fadeOutDown; +} + +@-webkit-keyframes fadeOutUp { + from { + opacity: 1; + } + to { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +@keyframes fadeOutUp { + from { + opacity: 1; + } + to { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +.fadeOutUp { + -webkit-animation-name: fadeOutUp; + animation-name: fadeOutUp; +} + +/* perfect-scrollbar v0.6.13 */ + +.ps-container { + -ms-touch-action: auto; + touch-action: auto; + overflow: hidden !important; + -ms-overflow-style: none; +} + +@supports (-ms-overflow-style: none) { + .ps-container { + overflow: auto !important; + } +} + +@media screen and (-ms-high-contrast: active), +(-ms-high-contrast: none) { + .ps-container { + overflow: auto !important; + } +} + +.ps-container.ps-active-x>.ps-scrollbar-x-rail, +.ps-container.ps-active-y>.ps-scrollbar-y-rail { + display: block; + background-color: transparent; +} + +.ps-container.ps-in-scrolling.ps-x>.ps-scrollbar-x-rail { + background-color: #eee; + opacity: 0.9; +} + +.ps-container.ps-in-scrolling.ps-x>.ps-scrollbar-x-rail>.ps-scrollbar-x { + background-color: #999; + height: 11px; +} + +.ps-container.ps-in-scrolling.ps-y>.ps-scrollbar-y-rail { + background-color: #eee; + opacity: 0.9; +} + +.ps-container.ps-in-scrolling.ps-y>.ps-scrollbar-y-rail>.ps-scrollbar-y { + background-color: #999; + width: 11px; +} + +.ps-container>.ps-scrollbar-x-rail { + display: none; + position: absolute; + /* please don't change 'position' */ + opacity: 0; + -webkit-transition: background-color .2s linear, opacity .2s linear; + -o-transition: background-color .2s linear, opacity .2s linear; + -moz-transition: background-color .2s linear, opacity .2s linear; + transition: background-color .2s linear, opacity .2s linear; + bottom: 0px; + /* there must be 'bottom' for ps-scrollbar-x-rail */ + height: 15px; +} + +.ps-container>.ps-scrollbar-x-rail>.ps-scrollbar-x { + position: absolute; + /* please don't change 'position' */ + background-color: #aaa; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-transition: background-color .2s linear, height .2s linear, width .2s ease-in-out, -webkit-border-radius .2s ease-in-out; + transition: background-color .2s linear, height .2s linear, width .2s ease-in-out, -webkit-border-radius .2s ease-in-out; + -o-transition: background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out; + -moz-transition: background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out, -moz-border-radius .2s ease-in-out; + transition: background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out; + transition: background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out, -webkit-border-radius .2s ease-in-out, -moz-border-radius .2s ease-in-out; + bottom: 2px; + /* there must be 'bottom' for ps-scrollbar-x */ + height: 6px; +} + +.ps-container>.ps-scrollbar-x-rail:hover>.ps-scrollbar-x, +.ps-container>.ps-scrollbar-x-rail:active>.ps-scrollbar-x { + height: 11px; +} + +.ps-container>.ps-scrollbar-y-rail { + display: none; + position: absolute; + /* please don't change 'position' */ + opacity: 0; + -webkit-transition: background-color .2s linear, opacity .2s linear; + -o-transition: background-color .2s linear, opacity .2s linear; + -moz-transition: background-color .2s linear, opacity .2s linear; + transition: background-color .2s linear, opacity .2s linear; + right: 0; + /* there must be 'right' for ps-scrollbar-y-rail */ + width: 15px; +} + +.ps-container>.ps-scrollbar-y-rail>.ps-scrollbar-y { + position: absolute; + /* please don't change 'position' */ + background-color: #aaa; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-transition: background-color .2s linear, height .2s linear, width .2s ease-in-out, -webkit-border-radius .2s ease-in-out; + transition: background-color .2s linear, height .2s linear, width .2s ease-in-out, -webkit-border-radius .2s ease-in-out; + -o-transition: background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out; + -moz-transition: background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out, -moz-border-radius .2s ease-in-out; + transition: background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out; + transition: background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out, -webkit-border-radius .2s ease-in-out, -moz-border-radius .2s ease-in-out; + right: 2px; + /* there must be 'right' for ps-scrollbar-y */ + width: 6px; +} + +.ps-container>.ps-scrollbar-y-rail:hover>.ps-scrollbar-y, +.ps-container>.ps-scrollbar-y-rail:active>.ps-scrollbar-y { + width: 11px; +} + +.ps-container:hover.ps-in-scrolling.ps-x>.ps-scrollbar-x-rail { + background-color: #eee; + opacity: 0.9; +} + +.ps-container:hover.ps-in-scrolling.ps-x>.ps-scrollbar-x-rail>.ps-scrollbar-x { + background-color: #999; + height: 11px; +} + +.ps-container:hover.ps-in-scrolling.ps-y>.ps-scrollbar-y-rail { + background-color: #eee; + opacity: 0.9; +} + +.ps-container:hover.ps-in-scrolling.ps-y>.ps-scrollbar-y-rail>.ps-scrollbar-y { + background-color: #999; + width: 11px; +} + +.ps-container:hover>.ps-scrollbar-x-rail, +.ps-container:hover>.ps-scrollbar-y-rail { + opacity: 0.6; +} + +.ps-container:hover>.ps-scrollbar-x-rail:hover { + background-color: #eee; + opacity: 0.9; +} + +.ps-container:hover>.ps-scrollbar-x-rail:hover>.ps-scrollbar-x { + background-color: #999; +} + +.ps-container:hover>.ps-scrollbar-y-rail:hover { + background-color: #eee; + opacity: 0.9; +} + +.ps-container:hover>.ps-scrollbar-y-rail:hover>.ps-scrollbar-y { + background-color: #999; +} + +.btn, +.navbar .navbar-nav>a.btn { + border-width: 2px; + font-weight: 600; + font-size: 0.8571em; + line-height: 1.35em; + text-transform: uppercase; + border: none; + margin: 10px 1px; + border-radius: 3px; + padding: 11px 22px; + cursor: pointer; + background-color: #66615B; + color: #FFFFFF; + -webkit-transition: all 150ms linear; + -moz-transition: all 150ms linear; + -o-transition: all 150ms linear; + -ms-transition: all 150ms linear; + transition: all 150ms linear; +} + +.btn:hover, +.btn:focus, +.btn:active, +.btn.active, +.btn:active:focus, +.btn:active:hover, +.btn.active:focus, +.btn.active:hover, +.show>.btn.dropdown-toggle, +.show>.btn.dropdown-toggle:focus, +.show>.btn.dropdown-toggle:hover, +.navbar .navbar-nav>a.btn:hover, +.navbar .navbar-nav>a.btn:focus, +.navbar .navbar-nav>a.btn:active, +.navbar .navbar-nav>a.btn.active, +.navbar .navbar-nav>a.btn:active:focus, +.navbar .navbar-nav>a.btn:active:hover, +.navbar .navbar-nav>a.btn.active:focus, +.navbar .navbar-nav>a.btn.active:hover, +.show>.navbar .navbar-nav>a.btn.dropdown-toggle, +.show>.navbar .navbar-nav>a.btn.dropdown-toggle:focus, +.show>.navbar .navbar-nav>a.btn.dropdown-toggle:hover { + background-color: #403D39 !important; + color: #FFFFFF !important; + box-shadow: none !important; +} + +.btn:not([data-action]):hover, +.navbar .navbar-nav>a.btn:not([data-action]):hover { + box-shadow: none; +} + +.btn.disabled, +.btn.disabled:hover, +.btn.disabled:focus, +.btn.disabled.focus, +.btn.disabled:active, +.btn.disabled.active, +.btn:disabled, +.btn:disabled:hover, +.btn:disabled:focus, +.btn:disabled.focus, +.btn:disabled:active, +.btn:disabled.active, +.btn[disabled], +.btn[disabled]:hover, +.btn[disabled]:focus, +.btn[disabled].focus, +.btn[disabled]:active, +.btn[disabled].active, +fieldset[disabled] .btn, +fieldset[disabled] .btn:hover, +fieldset[disabled] .btn:focus, +fieldset[disabled] .btn.focus, +fieldset[disabled] .btn:active, +fieldset[disabled] .btn.active, +.navbar .navbar-nav>a.btn.disabled, +.navbar .navbar-nav>a.btn.disabled:hover, +.navbar .navbar-nav>a.btn.disabled:focus, +.navbar .navbar-nav>a.btn.disabled.focus, +.navbar .navbar-nav>a.btn.disabled:active, +.navbar .navbar-nav>a.btn.disabled.active, +.navbar .navbar-nav>a.btn:disabled, +.navbar .navbar-nav>a.btn:disabled:hover, +.navbar .navbar-nav>a.btn:disabled:focus, +.navbar .navbar-nav>a.btn:disabled.focus, +.navbar .navbar-nav>a.btn:disabled:active, +.navbar .navbar-nav>a.btn:disabled.active, +.navbar .navbar-nav>a.btn[disabled], +.navbar .navbar-nav>a.btn[disabled]:hover, +.navbar .navbar-nav>a.btn[disabled]:focus, +.navbar .navbar-nav>a.btn[disabled].focus, +.navbar .navbar-nav>a.btn[disabled]:active, +.navbar .navbar-nav>a.btn[disabled].active, +fieldset[disabled] .navbar .navbar-nav>a.btn, +fieldset[disabled] .navbar .navbar-nav>a.btn:hover, +fieldset[disabled] .navbar .navbar-nav>a.btn:focus, +fieldset[disabled] .navbar .navbar-nav>a.btn.focus, +fieldset[disabled] .navbar .navbar-nav>a.btn:active, +fieldset[disabled] .navbar .navbar-nav>a.btn.active { + background-color: #66615B; + border-color: #66615B; +} + +.btn.btn-simple, +.navbar .navbar-nav>a.btn.btn-simple { + color: #66615B; + border-color: #66615B; +} + +.btn.btn-simple:hover, +.btn.btn-simple:focus, +.btn.btn-simple:active, +.navbar .navbar-nav>a.btn.btn-simple:hover, +.navbar .navbar-nav>a.btn.btn-simple:focus, +.navbar .navbar-nav>a.btn.btn-simple:active { + background-color: transparent; + color: #403D39; + border-color: #403D39; + box-shadow: none; +} + +.btn.btn-link, +.navbar .navbar-nav>a.btn.btn-link { + color: #66615B; +} + +.btn.btn-link:hover, +.btn.btn-link:focus, +.btn.btn-link:active, +.btn.btn-link:active:focus, +.navbar .navbar-nav>a.btn.btn-link:hover, +.navbar .navbar-nav>a.btn.btn-link:focus, +.navbar .navbar-nav>a.btn.btn-link:active, +.navbar .navbar-nav>a.btn.btn-link:active:focus { + background-color: transparent; + color: #403D39; + text-decoration: none; + box-shadow: none; +} + +.btn:hover, +.btn:focus, +.navbar .navbar-nav>a.btn:hover, +.navbar .navbar-nav>a.btn:focus { + opacity: 1; + filter: alpha(opacity=100); + outline: 0 !important; +} + +.btn:active, +.btn.active, +.open>.btn.dropdown-toggle, +.navbar .navbar-nav>a.btn:active, +.navbar .navbar-nav>a.btn.active, +.open>.navbar .navbar-nav>a.btn.dropdown-toggle { + -webkit-box-shadow: none; + box-shadow: none; + outline: 0 !important; +} + +.btn .badge, +.navbar .navbar-nav>a.btn .badge { + margin: 0; +} + +.btn.btn-icon, +.navbar .navbar-nav>a.btn.btn-icon { + height: 2.375rem; + min-width: 2.375rem; + width: 2.375rem; + padding: 0; + font-size: 0.9375rem; + overflow: hidden; + position: relative; + line-height: normal; +} + +.btn.btn-icon.btn-simple, +.navbar .navbar-nav>a.btn.btn-icon.btn-simple { + padding: 0; +} + +.btn.btn-icon.btn-sm, +.navbar .navbar-nav>a.btn.btn-icon.btn-sm { + height: 1.875rem; + min-width: 1.875rem; + width: 1.875rem; +} + +.btn.btn-icon.btn-sm .fa, +.btn.btn-icon.btn-sm .far, +.btn.btn-icon.btn-sm .fas, +.btn.btn-icon.btn-sm .nc-icon, +.navbar .navbar-nav>a.btn.btn-icon.btn-sm .fa, +.navbar .navbar-nav>a.btn.btn-icon.btn-sm .far, +.navbar .navbar-nav>a.btn.btn-icon.btn-sm .fas, +.navbar .navbar-nav>a.btn.btn-icon.btn-sm .nc-icon { + font-size: 0.6875rem; +} + +.btn.btn-icon.btn-lg, +.navbar .navbar-nav>a.btn.btn-icon.btn-lg { + height: 3.6rem; + min-width: 3.6rem; + width: 3.6rem; +} + +.btn.btn-icon.btn-lg .fa, +.btn.btn-icon.btn-lg .far, +.btn.btn-icon.btn-lg .fas, +.btn.btn-icon.btn-lg .nc-icon, +.navbar .navbar-nav>a.btn.btn-icon.btn-lg .fa, +.navbar .navbar-nav>a.btn.btn-icon.btn-lg .far, +.navbar .navbar-nav>a.btn.btn-icon.btn-lg .fas, +.navbar .navbar-nav>a.btn.btn-icon.btn-lg .nc-icon { + font-size: 1.325rem; +} + +.btn.btn-icon:not(.btn-footer) .nc-icon, +.btn.btn-icon:not(.btn-footer) .fa, +.btn.btn-icon:not(.btn-footer) .far, +.btn.btn-icon:not(.btn-footer) .fas, +.navbar .navbar-nav>a.btn.btn-icon:not(.btn-footer) .nc-icon, +.navbar .navbar-nav>a.btn.btn-icon:not(.btn-footer) .fa, +.navbar .navbar-nav>a.btn.btn-icon:not(.btn-footer) .far, +.navbar .navbar-nav>a.btn.btn-icon:not(.btn-footer) .fas { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-12px, -12px); + line-height: 1.5626rem; + width: 24px; +} + +.btn.btn-icon.btn-neutral, +.navbar .navbar-nav>a.btn.btn-icon.btn-neutral { + font-size: 20px; +} + +.btn:not(.btn-icon) .nc-icon, +.navbar .navbar-nav>a.btn:not(.btn-icon) .nc-icon { + position: relative; + top: 1px; +} + +.btn-primary { + background-color: #51cbce; + color: #FFFFFF; +} + +.btn-primary:hover, +.btn-primary:focus, +.btn-primary:active, +.btn-primary.active, +.btn-primary:active:focus, +.btn-primary:active:hover, +.btn-primary.active:focus, +.btn-primary.active:hover, +.show>.btn-primary.dropdown-toggle, +.show>.btn-primary.dropdown-toggle:focus, +.show>.btn-primary.dropdown-toggle:hover { + background-color: #34b5b8 !important; + color: #FFFFFF !important; + box-shadow: none !important; +} + +.btn-primary:not([data-action]):hover { + box-shadow: none; +} + +.btn-primary.disabled, +.btn-primary.disabled:hover, +.btn-primary.disabled:focus, +.btn-primary.disabled.focus, +.btn-primary.disabled:active, +.btn-primary.disabled.active, +.btn-primary:disabled, +.btn-primary:disabled:hover, +.btn-primary:disabled:focus, +.btn-primary:disabled.focus, +.btn-primary:disabled:active, +.btn-primary:disabled.active, +.btn-primary[disabled], +.btn-primary[disabled]:hover, +.btn-primary[disabled]:focus, +.btn-primary[disabled].focus, +.btn-primary[disabled]:active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary, +fieldset[disabled] .btn-primary:hover, +fieldset[disabled] .btn-primary:focus, +fieldset[disabled] .btn-primary.focus, +fieldset[disabled] .btn-primary:active, +fieldset[disabled] .btn-primary.active { + background-color: #51cbce; + border-color: #51cbce; +} + +.btn-primary.btn-simple { + color: #51cbce; + border-color: #51cbce; +} + +.btn-primary.btn-simple:hover, +.btn-primary.btn-simple:focus, +.btn-primary.btn-simple:active { + background-color: transparent; + color: #34b5b8; + border-color: #34b5b8; + box-shadow: none; +} + +.btn-primary.btn-link { + color: #51cbce; +} + +.btn-primary.btn-link:hover, +.btn-primary.btn-link:focus, +.btn-primary.btn-link:active, +.btn-primary.btn-link:active:focus { + background-color: transparent; + color: #34b5b8; + text-decoration: none; + box-shadow: none; +} + +.btn-success { + background-color: #6bd098; + color: #FFFFFF; +} + +.btn-success:hover, +.btn-success:focus, +.btn-success:active, +.btn-success.active, +.btn-success:active:focus, +.btn-success:active:hover, +.btn-success.active:focus, +.btn-success.active:hover, +.show>.btn-success.dropdown-toggle, +.show>.btn-success.dropdown-toggle:focus, +.show>.btn-success.dropdown-toggle:hover { + background-color: #44c47d !important; + color: #FFFFFF !important; + box-shadow: none !important; +} + +.btn-success:not([data-action]):hover { + box-shadow: none; +} + +.btn-success.disabled, +.btn-success.disabled:hover, +.btn-success.disabled:focus, +.btn-success.disabled.focus, +.btn-success.disabled:active, +.btn-success.disabled.active, +.btn-success:disabled, +.btn-success:disabled:hover, +.btn-success:disabled:focus, +.btn-success:disabled.focus, +.btn-success:disabled:active, +.btn-success:disabled.active, +.btn-success[disabled], +.btn-success[disabled]:hover, +.btn-success[disabled]:focus, +.btn-success[disabled].focus, +.btn-success[disabled]:active, +.btn-success[disabled].active, +fieldset[disabled] .btn-success, +fieldset[disabled] .btn-success:hover, +fieldset[disabled] .btn-success:focus, +fieldset[disabled] .btn-success.focus, +fieldset[disabled] .btn-success:active, +fieldset[disabled] .btn-success.active { + background-color: #6bd098; + border-color: #6bd098; +} + +.btn-success.btn-simple { + color: #6bd098; + border-color: #6bd098; +} + +.btn-success.btn-simple:hover, +.btn-success.btn-simple:focus, +.btn-success.btn-simple:active { + background-color: transparent; + color: #44c47d; + border-color: #44c47d; + box-shadow: none; +} + +.btn-success.btn-link { + color: #6bd098; +} + +.btn-success.btn-link:hover, +.btn-success.btn-link:focus, +.btn-success.btn-link:active, +.btn-success.btn-link:active:focus { + background-color: transparent; + color: #44c47d; + text-decoration: none; + box-shadow: none; +} + +.btn-info { + background-color: #51bcda; + color: #FFFFFF; +} + +.btn-info:hover, +.btn-info:focus, +.btn-info:active, +.btn-info.active, +.btn-info:active:focus, +.btn-info:active:hover, +.btn-info.active:focus, +.btn-info.active:hover, +.show>.btn-info.dropdown-toggle, +.show>.btn-info.dropdown-toggle:focus, +.show>.btn-info.dropdown-toggle:hover { + background-color: #2ba9cd !important; + color: #FFFFFF !important; + box-shadow: none !important; +} + +.btn-info:not([data-action]):hover { + box-shadow: none; +} + +.btn-info.disabled, +.btn-info.disabled:hover, +.btn-info.disabled:focus, +.btn-info.disabled.focus, +.btn-info.disabled:active, +.btn-info.disabled.active, +.btn-info:disabled, +.btn-info:disabled:hover, +.btn-info:disabled:focus, +.btn-info:disabled.focus, +.btn-info:disabled:active, +.btn-info:disabled.active, +.btn-info[disabled], +.btn-info[disabled]:hover, +.btn-info[disabled]:focus, +.btn-info[disabled].focus, +.btn-info[disabled]:active, +.btn-info[disabled].active, +fieldset[disabled] .btn-info, +fieldset[disabled] .btn-info:hover, +fieldset[disabled] .btn-info:focus, +fieldset[disabled] .btn-info.focus, +fieldset[disabled] .btn-info:active, +fieldset[disabled] .btn-info.active { + background-color: #51bcda; + border-color: #51bcda; +} + +.btn-info.btn-simple { + color: #51bcda; + border-color: #51bcda; +} + +.btn-info.btn-simple:hover, +.btn-info.btn-simple:focus, +.btn-info.btn-simple:active { + background-color: transparent; + color: #2ba9cd; + border-color: #2ba9cd; + box-shadow: none; +} + +.btn-info.btn-link { + color: #51bcda; +} + +.btn-info.btn-link:hover, +.btn-info.btn-link:focus, +.btn-info.btn-link:active, +.btn-info.btn-link:active:focus { + background-color: transparent; + color: #2ba9cd; + text-decoration: none; + box-shadow: none; +} + +.btn-warning { + background-color: #fbc658; + color: #FFFFFF; +} + +.btn-warning:hover, +.btn-warning:focus, +.btn-warning:active, +.btn-warning.active, +.btn-warning:active:focus, +.btn-warning:active:hover, +.btn-warning.active:focus, +.btn-warning.active:hover, +.show>.btn-warning.dropdown-toggle, +.show>.btn-warning.dropdown-toggle:focus, +.show>.btn-warning.dropdown-toggle:hover { + background-color: #fab526 !important; + color: #FFFFFF !important; + box-shadow: none !important; +} + +.btn-warning:not([data-action]):hover { + box-shadow: none; +} + +.btn-warning.disabled, +.btn-warning.disabled:hover, +.btn-warning.disabled:focus, +.btn-warning.disabled.focus, +.btn-warning.disabled:active, +.btn-warning.disabled.active, +.btn-warning:disabled, +.btn-warning:disabled:hover, +.btn-warning:disabled:focus, +.btn-warning:disabled.focus, +.btn-warning:disabled:active, +.btn-warning:disabled.active, +.btn-warning[disabled], +.btn-warning[disabled]:hover, +.btn-warning[disabled]:focus, +.btn-warning[disabled].focus, +.btn-warning[disabled]:active, +.btn-warning[disabled].active, +fieldset[disabled] .btn-warning, +fieldset[disabled] .btn-warning:hover, +fieldset[disabled] .btn-warning:focus, +fieldset[disabled] .btn-warning.focus, +fieldset[disabled] .btn-warning:active, +fieldset[disabled] .btn-warning.active { + background-color: #fbc658; + border-color: #fbc658; +} + +.btn-warning.btn-simple { + color: #fbc658; + border-color: #fbc658; +} + +.btn-warning.btn-simple:hover, +.btn-warning.btn-simple:focus, +.btn-warning.btn-simple:active { + background-color: transparent; + color: #fab526; + border-color: #fab526; + box-shadow: none; +} + +.btn-warning.btn-link { + color: #fbc658; +} + +.btn-warning.btn-link:hover, +.btn-warning.btn-link:focus, +.btn-warning.btn-link:active, +.btn-warning.btn-link:active:focus { + background-color: transparent; + color: #fab526; + text-decoration: none; + box-shadow: none; +} + +.btn-danger { + background-color: #ef8157; + color: #FFFFFF; +} + +.btn-danger:hover, +.btn-danger:focus, +.btn-danger:active, +.btn-danger.active, +.btn-danger:active:focus, +.btn-danger:active:hover, +.btn-danger.active:focus, +.btn-danger.active:hover, +.show>.btn-danger.dropdown-toggle, +.show>.btn-danger.dropdown-toggle:focus, +.show>.btn-danger.dropdown-toggle:hover { + background-color: #eb6532 !important; + color: #FFFFFF !important; + box-shadow: none !important; +} + +.btn-danger:not([data-action]):hover { + box-shadow: none; +} + +.btn-danger.disabled, +.btn-danger.disabled:hover, +.btn-danger.disabled:focus, +.btn-danger.disabled.focus, +.btn-danger.disabled:active, +.btn-danger.disabled.active, +.btn-danger:disabled, +.btn-danger:disabled:hover, +.btn-danger:disabled:focus, +.btn-danger:disabled.focus, +.btn-danger:disabled:active, +.btn-danger:disabled.active, +.btn-danger[disabled], +.btn-danger[disabled]:hover, +.btn-danger[disabled]:focus, +.btn-danger[disabled].focus, +.btn-danger[disabled]:active, +.btn-danger[disabled].active, +fieldset[disabled] .btn-danger, +fieldset[disabled] .btn-danger:hover, +fieldset[disabled] .btn-danger:focus, +fieldset[disabled] .btn-danger.focus, +fieldset[disabled] .btn-danger:active, +fieldset[disabled] .btn-danger.active { + background-color: #ef8157; + border-color: #ef8157; +} + +.btn-danger.btn-simple { + color: #ef8157; + border-color: #ef8157; +} + +.btn-danger.btn-simple:hover, +.btn-danger.btn-simple:focus, +.btn-danger.btn-simple:active { + background-color: transparent; + color: #eb6532; + border-color: #eb6532; + box-shadow: none; +} + +.btn-danger.btn-link { + color: #ef8157; +} + +.btn-danger.btn-link:hover, +.btn-danger.btn-link:focus, +.btn-danger.btn-link:active, +.btn-danger.btn-link:active:focus { + background-color: transparent; + color: #eb6532; + text-decoration: none; + box-shadow: none; +} + +.btn-outline-default { + background: transparent; + border: 2px solid #66615B !important; + color: #66615B; + opacity: 1; + filter: alpha(opacity=100); +} + +.btn-outline-default:hover, +.btn-outline-default:focus, +.btn-outline-default:active, +.btn-outline-default:focus:active, +.btn-outline-default.active, +.open>.btn-outline-default.dropdown-toggle { + background-color: #66615B !important; + color: rgba(255, 255, 255, 0.8) !important; + border-color: #66615B !important; +} + +.btn-outline-default:hover .caret, +.btn-outline-default:focus .caret, +.btn-outline-default:active .caret, +.btn-outline-default:focus:active .caret, +.btn-outline-default.active .caret, +.open>.btn-outline-default.dropdown-toggle .caret { + border-top-color: rgba(255, 255, 255, 0.8) !important; +} + +.btn-outline-default .caret { + border-top-color: #FFFFFF !important; +} + +.btn-outline-default.disabled, +.btn-outline-default.disabled:hover, +.btn-outline-default.disabled:focus, +.btn-outline-default.disabled.focus, +.btn-outline-default.disabled:active, +.btn-outline-default.disabled.active, +.btn-outline-default:disabled, +.btn-outline-default:disabled:hover, +.btn-outline-default:disabled:focus, +.btn-outline-default:disabled.focus, +.btn-outline-default:disabled:active, +.btn-outline-default:disabled.active, +.btn-outline-default[disabled], +.btn-outline-default[disabled]:hover, +.btn-outline-default[disabled]:focus, +.btn-outline-default[disabled].focus, +.btn-outline-default[disabled]:active, +.btn-outline-default[disabled].active, +fieldset[disabled] .btn-outline-default, +fieldset[disabled] .btn-outline-default:hover, +fieldset[disabled] .btn-outline-default:focus, +fieldset[disabled] .btn-outline-default.focus, +fieldset[disabled] .btn-outline-default:active, +fieldset[disabled] .btn-outline-default.active { + background-color: transparent !important; + border-color: #66615B !important; +} + +.btn-outline-primary { + background: transparent; + border: 2px solid #51cbce !important; + color: #51cbce; + opacity: 1; + filter: alpha(opacity=100); +} + +.btn-outline-primary:hover, +.btn-outline-primary:focus, +.btn-outline-primary:active, +.btn-outline-primary:focus:active, +.btn-outline-primary.active, +.open>.btn-outline-primary.dropdown-toggle { + background-color: #51cbce !important; + color: rgba(255, 255, 255, 0.8) !important; + border-color: #51cbce !important; +} + +.btn-outline-primary:hover .caret, +.btn-outline-primary:focus .caret, +.btn-outline-primary:active .caret, +.btn-outline-primary:focus:active .caret, +.btn-outline-primary.active .caret, +.open>.btn-outline-primary.dropdown-toggle .caret { + border-top-color: rgba(255, 255, 255, 0.8) !important; +} + +.btn-outline-primary .caret { + border-top-color: #FFFFFF !important; +} + +.btn-outline-primary.disabled, +.btn-outline-primary.disabled:hover, +.btn-outline-primary.disabled:focus, +.btn-outline-primary.disabled.focus, +.btn-outline-primary.disabled:active, +.btn-outline-primary.disabled.active, +.btn-outline-primary:disabled, +.btn-outline-primary:disabled:hover, +.btn-outline-primary:disabled:focus, +.btn-outline-primary:disabled.focus, +.btn-outline-primary:disabled:active, +.btn-outline-primary:disabled.active, +.btn-outline-primary[disabled], +.btn-outline-primary[disabled]:hover, +.btn-outline-primary[disabled]:focus, +.btn-outline-primary[disabled].focus, +.btn-outline-primary[disabled]:active, +.btn-outline-primary[disabled].active, +fieldset[disabled] .btn-outline-primary, +fieldset[disabled] .btn-outline-primary:hover, +fieldset[disabled] .btn-outline-primary:focus, +fieldset[disabled] .btn-outline-primary.focus, +fieldset[disabled] .btn-outline-primary:active, +fieldset[disabled] .btn-outline-primary.active { + background-color: transparent !important; + border-color: #51cbce !important; +} + +.btn-outline-success { + background: transparent; + border: 2px solid #6bd098 !important; + color: #6bd098; + opacity: 1; + filter: alpha(opacity=100); +} + +.btn-outline-success:hover, +.btn-outline-success:focus, +.btn-outline-success:active, +.btn-outline-success:focus:active, +.btn-outline-success.active, +.open>.btn-outline-success.dropdown-toggle { + background-color: #6bd098 !important; + color: rgba(255, 255, 255, 0.8) !important; + border-color: #6bd098 !important; +} + +.btn-outline-success:hover .caret, +.btn-outline-success:focus .caret, +.btn-outline-success:active .caret, +.btn-outline-success:focus:active .caret, +.btn-outline-success.active .caret, +.open>.btn-outline-success.dropdown-toggle .caret { + border-top-color: rgba(255, 255, 255, 0.8) !important; +} + +.btn-outline-success .caret { + border-top-color: #FFFFFF !important; +} + +.btn-outline-success.disabled, +.btn-outline-success.disabled:hover, +.btn-outline-success.disabled:focus, +.btn-outline-success.disabled.focus, +.btn-outline-success.disabled:active, +.btn-outline-success.disabled.active, +.btn-outline-success:disabled, +.btn-outline-success:disabled:hover, +.btn-outline-success:disabled:focus, +.btn-outline-success:disabled.focus, +.btn-outline-success:disabled:active, +.btn-outline-success:disabled.active, +.btn-outline-success[disabled], +.btn-outline-success[disabled]:hover, +.btn-outline-success[disabled]:focus, +.btn-outline-success[disabled].focus, +.btn-outline-success[disabled]:active, +.btn-outline-success[disabled].active, +fieldset[disabled] .btn-outline-success, +fieldset[disabled] .btn-outline-success:hover, +fieldset[disabled] .btn-outline-success:focus, +fieldset[disabled] .btn-outline-success.focus, +fieldset[disabled] .btn-outline-success:active, +fieldset[disabled] .btn-outline-success.active { + background-color: transparent !important; + border-color: #6bd098 !important; +} + +.btn-outline-info { + background: transparent; + border: 2px solid #51bcda !important; + color: #51bcda; + opacity: 1; + filter: alpha(opacity=100); +} + +.btn-outline-info:hover, +.btn-outline-info:focus, +.btn-outline-info:active, +.btn-outline-info:focus:active, +.btn-outline-info.active, +.open>.btn-outline-info.dropdown-toggle { + background-color: #51bcda !important; + color: rgba(255, 255, 255, 0.8) !important; + border-color: #51bcda !important; +} + +.btn-outline-info:hover .caret, +.btn-outline-info:focus .caret, +.btn-outline-info:active .caret, +.btn-outline-info:focus:active .caret, +.btn-outline-info.active .caret, +.open>.btn-outline-info.dropdown-toggle .caret { + border-top-color: rgba(255, 255, 255, 0.8) !important; +} + +.btn-outline-info .caret { + border-top-color: #FFFFFF !important; +} + +.btn-outline-info.disabled, +.btn-outline-info.disabled:hover, +.btn-outline-info.disabled:focus, +.btn-outline-info.disabled.focus, +.btn-outline-info.disabled:active, +.btn-outline-info.disabled.active, +.btn-outline-info:disabled, +.btn-outline-info:disabled:hover, +.btn-outline-info:disabled:focus, +.btn-outline-info:disabled.focus, +.btn-outline-info:disabled:active, +.btn-outline-info:disabled.active, +.btn-outline-info[disabled], +.btn-outline-info[disabled]:hover, +.btn-outline-info[disabled]:focus, +.btn-outline-info[disabled].focus, +.btn-outline-info[disabled]:active, +.btn-outline-info[disabled].active, +fieldset[disabled] .btn-outline-info, +fieldset[disabled] .btn-outline-info:hover, +fieldset[disabled] .btn-outline-info:focus, +fieldset[disabled] .btn-outline-info.focus, +fieldset[disabled] .btn-outline-info:active, +fieldset[disabled] .btn-outline-info.active { + background-color: transparent !important; + border-color: #51bcda !important; +} + +.btn-outline-warning { + background: transparent; + border: 2px solid #fbc658 !important; + color: #fbc658; + opacity: 1; + filter: alpha(opacity=100); +} + +.btn-outline-warning:hover, +.btn-outline-warning:focus, +.btn-outline-warning:active, +.btn-outline-warning:focus:active, +.btn-outline-warning.active, +.open>.btn-outline-warning.dropdown-toggle { + background-color: #fbc658 !important; + color: rgba(255, 255, 255, 0.8) !important; + border-color: #fbc658 !important; +} + +.btn-outline-warning:hover .caret, +.btn-outline-warning:focus .caret, +.btn-outline-warning:active .caret, +.btn-outline-warning:focus:active .caret, +.btn-outline-warning.active .caret, +.open>.btn-outline-warning.dropdown-toggle .caret { + border-top-color: rgba(255, 255, 255, 0.8) !important; +} + +.btn-outline-warning .caret { + border-top-color: #FFFFFF !important; +} + +.btn-outline-warning.disabled, +.btn-outline-warning.disabled:hover, +.btn-outline-warning.disabled:focus, +.btn-outline-warning.disabled.focus, +.btn-outline-warning.disabled:active, +.btn-outline-warning.disabled.active, +.btn-outline-warning:disabled, +.btn-outline-warning:disabled:hover, +.btn-outline-warning:disabled:focus, +.btn-outline-warning:disabled.focus, +.btn-outline-warning:disabled:active, +.btn-outline-warning:disabled.active, +.btn-outline-warning[disabled], +.btn-outline-warning[disabled]:hover, +.btn-outline-warning[disabled]:focus, +.btn-outline-warning[disabled].focus, +.btn-outline-warning[disabled]:active, +.btn-outline-warning[disabled].active, +fieldset[disabled] .btn-outline-warning, +fieldset[disabled] .btn-outline-warning:hover, +fieldset[disabled] .btn-outline-warning:focus, +fieldset[disabled] .btn-outline-warning.focus, +fieldset[disabled] .btn-outline-warning:active, +fieldset[disabled] .btn-outline-warning.active { + background-color: transparent !important; + border-color: #fbc658 !important; +} + +.btn-outline-danger { + background: transparent; + border: 2px solid #ef8157 !important; + color: #ef8157; + opacity: 1; + filter: alpha(opacity=100); +} + +.btn-outline-danger:hover, +.btn-outline-danger:focus, +.btn-outline-danger:active, +.btn-outline-danger:focus:active, +.btn-outline-danger.active, +.open>.btn-outline-danger.dropdown-toggle { + background-color: #ef8157 !important; + color: rgba(255, 255, 255, 0.8) !important; + border-color: #ef8157 !important; +} + +.btn-outline-danger:hover .caret, +.btn-outline-danger:focus .caret, +.btn-outline-danger:active .caret, +.btn-outline-danger:focus:active .caret, +.btn-outline-danger.active .caret, +.open>.btn-outline-danger.dropdown-toggle .caret { + border-top-color: rgba(255, 255, 255, 0.8) !important; +} + +.btn-outline-danger .caret { + border-top-color: #FFFFFF !important; +} + +.btn-outline-danger.disabled, +.btn-outline-danger.disabled:hover, +.btn-outline-danger.disabled:focus, +.btn-outline-danger.disabled.focus, +.btn-outline-danger.disabled:active, +.btn-outline-danger.disabled.active, +.btn-outline-danger:disabled, +.btn-outline-danger:disabled:hover, +.btn-outline-danger:disabled:focus, +.btn-outline-danger:disabled.focus, +.btn-outline-danger:disabled:active, +.btn-outline-danger:disabled.active, +.btn-outline-danger[disabled], +.btn-outline-danger[disabled]:hover, +.btn-outline-danger[disabled]:focus, +.btn-outline-danger[disabled].focus, +.btn-outline-danger[disabled]:active, +.btn-outline-danger[disabled].active, +fieldset[disabled] .btn-outline-danger, +fieldset[disabled] .btn-outline-danger:hover, +fieldset[disabled] .btn-outline-danger:focus, +fieldset[disabled] .btn-outline-danger.focus, +fieldset[disabled] .btn-outline-danger:active, +fieldset[disabled] .btn-outline-danger.active { + background-color: transparent !important; + border-color: #ef8157 !important; +} + +.btn-outline-neutral { + background: transparent; + border: 2px solid #FFFFFF !important; + color: #FFFFFF; + opacity: 1; + filter: alpha(opacity=100); +} + +.btn-outline-neutral:hover, +.btn-outline-neutral:focus, +.btn-outline-neutral:active, +.btn-outline-neutral:focus:active, +.btn-outline-neutral.active, +.open>.btn-outline-neutral.dropdown-toggle { + background-color: #FFFFFF !important; + color: rgba(255, 255, 255, 0.8) !important; + border-color: #FFFFFF !important; +} + +.btn-outline-neutral:hover .caret, +.btn-outline-neutral:focus .caret, +.btn-outline-neutral:active .caret, +.btn-outline-neutral:focus:active .caret, +.btn-outline-neutral.active .caret, +.open>.btn-outline-neutral.dropdown-toggle .caret { + border-top-color: rgba(255, 255, 255, 0.8) !important; +} + +.btn-outline-neutral .caret { + border-top-color: #FFFFFF !important; +} + +.btn-outline-neutral.disabled, +.btn-outline-neutral.disabled:hover, +.btn-outline-neutral.disabled:focus, +.btn-outline-neutral.disabled.focus, +.btn-outline-neutral.disabled:active, +.btn-outline-neutral.disabled.active, +.btn-outline-neutral:disabled, +.btn-outline-neutral:disabled:hover, +.btn-outline-neutral:disabled:focus, +.btn-outline-neutral:disabled.focus, +.btn-outline-neutral:disabled:active, +.btn-outline-neutral:disabled.active, +.btn-outline-neutral[disabled], +.btn-outline-neutral[disabled]:hover, +.btn-outline-neutral[disabled]:focus, +.btn-outline-neutral[disabled].focus, +.btn-outline-neutral[disabled]:active, +.btn-outline-neutral[disabled].active, +fieldset[disabled] .btn-outline-neutral, +fieldset[disabled] .btn-outline-neutral:hover, +fieldset[disabled] .btn-outline-neutral:focus, +fieldset[disabled] .btn-outline-neutral.focus, +fieldset[disabled] .btn-outline-neutral:active, +fieldset[disabled] .btn-outline-neutral.active { + background-color: transparent !important; + border-color: #FFFFFF !important; +} + +.btn-outline-neutral:hover, +.btn-outline-neutral:focus { + color: #403D39; + background-color: #FFFFFF; +} + +.btn-neutral { + background-color: #FFFFFF; + color: #51cbce; + color: #66615B; +} + +.btn-neutral:hover, +.btn-neutral:focus, +.btn-neutral:active, +.btn-neutral.active, +.btn-neutral:active:focus, +.btn-neutral:active:hover, +.btn-neutral.active:focus, +.btn-neutral.active:hover, +.show>.btn-neutral.dropdown-toggle, +.show>.btn-neutral.dropdown-toggle:focus, +.show>.btn-neutral.dropdown-toggle:hover { + background-color: #FFFFFF !important; + color: #FFFFFF !important; + box-shadow: none !important; +} + +.btn-neutral:not([data-action]):hover { + box-shadow: none; +} + +.btn-neutral.disabled, +.btn-neutral.disabled:hover, +.btn-neutral.disabled:focus, +.btn-neutral.disabled.focus, +.btn-neutral.disabled:active, +.btn-neutral.disabled.active, +.btn-neutral:disabled, +.btn-neutral:disabled:hover, +.btn-neutral:disabled:focus, +.btn-neutral:disabled.focus, +.btn-neutral:disabled:active, +.btn-neutral:disabled.active, +.btn-neutral[disabled], +.btn-neutral[disabled]:hover, +.btn-neutral[disabled]:focus, +.btn-neutral[disabled].focus, +.btn-neutral[disabled]:active, +.btn-neutral[disabled].active, +fieldset[disabled] .btn-neutral, +fieldset[disabled] .btn-neutral:hover, +fieldset[disabled] .btn-neutral:focus, +fieldset[disabled] .btn-neutral.focus, +fieldset[disabled] .btn-neutral:active, +fieldset[disabled] .btn-neutral.active { + background-color: #FFFFFF; + border-color: #FFFFFF; +} + +.btn-neutral.btn-danger { + color: #ef8157; +} + +.btn-neutral.btn-danger:hover, +.btn-neutral.btn-danger:focus, +.btn-neutral.btn-danger:active, +.btn-neutral.btn-danger:active:focus { + color: #eb6532 !important; +} + +.btn-neutral.btn-info { + color: #51bcda !important; +} + +.btn-neutral.btn-info:hover, +.btn-neutral.btn-info:focus, +.btn-neutral.btn-info:active, +.btn-neutral.btn-info:active:focus { + color: #2ba9cd !important; +} + +.btn-neutral.btn-warning { + color: #fbc658 !important; +} + +.btn-neutral.btn-warning:hover, +.btn-neutral.btn-warning:focus, +.btn-neutral.btn-warning:active, +.btn-neutral.btn-warning:active:focus { + color: #fab526 !important; +} + +.btn-neutral.btn-success { + color: #6bd098 !important; +} + +.btn-neutral.btn-success:hover, +.btn-neutral.btn-success:focus, +.btn-neutral.btn-success:active, +.btn-neutral.btn-success:active:focus { + color: #44c47d !important; +} + +.btn-neutral.btn-default { + color: #66615B !important; +} + +.btn-neutral.btn-default:hover, +.btn-neutral.btn-default:focus, +.btn-neutral.btn-default:active, +.btn-neutral.btn-default:active:focus { + color: #403D39 !important; +} + +.btn-neutral.active, +.btn-neutral:active, +.btn-neutral:active:focus, +.btn-neutral:active:hover, +.btn-neutral.active:focus, +.btn-neutral.active:hover, +.show>.btn-neutral.dropdown-toggle, +.show>.btn-neutral.dropdown-toggle:focus, +.show>.btn-neutral.dropdown-toggle:hover { + background-color: #FFFFFF !important; + color: #34b5b8 !important; + box-shadow: none !important; +} + +.btn-neutral:hover, +.btn-neutral:focus { + color: #34b5b8 !important; +} + +.btn-neutral:hover:not(.nav-link), +.btn-neutral:focus:not(.nav-link) { + box-shadow: none; +} + +.btn-neutral.btn-simple { + color: #FFFFFF; + border-color: #FFFFFF; +} + +.btn-neutral.btn-simple:hover, +.btn-neutral.btn-simple:focus, +.btn-neutral.btn-simple:active { + background-color: transparent; + color: #FFFFFF; + border-color: #FFFFFF; + box-shadow: none; +} + +.btn-neutral.btn-link { + color: #FFFFFF; +} + +.btn-neutral.btn-link:hover, +.btn-neutral.btn-link:focus, +.btn-neutral.btn-link:active, +.btn-neutral.btn-link:active:focus { + background-color: transparent; + color: #FFFFFF; + text-decoration: none; + box-shadow: none; +} + +.btn-neutral:hover, +.btn-neutral:focus { + color: #403D39; +} + +.btn-neutral.btn-border:hover, +.btn-neutral.btn-border:focus { + color: #66615B; +} + +.btn-neutral.btn-border:active, +.btn-neutral.btn-border.active, +.open>.btn-neutral.btn-border.dropdown-toggle { + background-color: #FFFFFF; + color: #66615B; +} + +.btn-neutral.btn-link:active, +.btn-neutral.btn-link.active { + background-color: transparent; +} + +.btn:disabled, +.btn[disabled], +.btn.disabled { + opacity: 0.5; + filter: alpha(opacity=50); + pointer-events: none; +} + +.btn-simple { + border: 1px solid; + border-color: #66615B; + padding: 10px 22px; + background-color: transparent; +} + +.btn-simple.disabled, +.btn-simple.disabled:hover, +.btn-simple.disabled:focus, +.btn-simple.disabled.focus, +.btn-simple.disabled:active, +.btn-simple.disabled.active, +.btn-simple:disabled, +.btn-simple:disabled:hover, +.btn-simple:disabled:focus, +.btn-simple:disabled.focus, +.btn-simple:disabled:active, +.btn-simple:disabled.active, +.btn-simple[disabled], +.btn-simple[disabled]:hover, +.btn-simple[disabled]:focus, +.btn-simple[disabled].focus, +.btn-simple[disabled]:active, +.btn-simple[disabled].active, +fieldset[disabled] .btn-simple, +fieldset[disabled] .btn-simple:hover, +fieldset[disabled] .btn-simple:focus, +fieldset[disabled] .btn-simple.focus, +fieldset[disabled] .btn-simple:active, +fieldset[disabled] .btn-simple.active, +.btn-link.disabled, +.btn-link.disabled:hover, +.btn-link.disabled:focus, +.btn-link.disabled.focus, +.btn-link.disabled:active, +.btn-link.disabled.active, +.btn-link:disabled, +.btn-link:disabled:hover, +.btn-link:disabled:focus, +.btn-link:disabled.focus, +.btn-link:disabled:active, +.btn-link:disabled.active, +.btn-link[disabled], +.btn-link[disabled]:hover, +.btn-link[disabled]:focus, +.btn-link[disabled].focus, +.btn-link[disabled]:active, +.btn-link[disabled].active, +fieldset[disabled] .btn-link, +fieldset[disabled] .btn-link:hover, +fieldset[disabled] .btn-link:focus, +fieldset[disabled] .btn-link.focus, +fieldset[disabled] .btn-link:active, +fieldset[disabled] .btn-link.active { + background-color: transparent; +} + +.btn-link { + border: 0; + padding: 0.5rem 0.7rem; + background-color: transparent; +} + +.btn-lg { + font-size: 1rem; + border-radius: 6px; + padding: 15px 48px; +} + +.btn-lg.btn-simple { + padding: 14px 47px; +} + +.btn-sm { + font-size: 0.8571em; + border-radius: 3px; + padding: 5px 15px; +} + +.btn-sm.btn-simple { + padding: 4px 14px; +} + +.btn-wd { + min-width: 140px; +} + +.btn-group.select { + width: 100%; +} + +.btn-group.select .btn { + text-align: left; +} + +.btn-group.select .caret { + position: absolute; + top: 50%; + margin-top: -1px; + right: 8px; +} + +.btn-group .btn+.btn { + margin-left: -3px; +} + +.btn-group .btn:focus { + background-color: #51bcda !important; +} + +.btn-round { + border-width: 1px; + border-radius: 30px; + padding-right: 23px; + padding-left: 23px; +} + +.btn-round.btn-simple { + padding: 10px 22px; +} + +.no-caret.dropdown-toggle::after { + display: none; +} + +::-moz-placeholder { + color: #9A9A9A; +} + +:-ms-input-placeholder { + color: #9A9A9A; +} + +::-webkit-input-placeholder { + color: #9A9A9A; +} + +.form-control { + background-color: #FFFFFF; + border: 1px solid #DDDDDD; + border-radius: 4px; + color: #66615b; + line-height: normal; + font-size: 14px; + -webkit-transition: color 0.3s ease-in-out, border-color 0.3s ease-in-out, background-color 0.3s ease-in-out; + -moz-transition: color 0.3s ease-in-out, border-color 0.3s ease-in-out, background-color 0.3s ease-in-out; + -o-transition: color 0.3s ease-in-out, border-color 0.3s ease-in-out, background-color 0.3s ease-in-out; + -ms-transition: color 0.3s ease-in-out, border-color 0.3s ease-in-out, background-color 0.3s ease-in-out; + transition: color 0.3s ease-in-out, border-color 0.3s ease-in-out, background-color 0.3s ease-in-out; + -webkit-box-shadow: none; + box-shadow: none; +} + +.form-control:focus { + border: 1px solid #9A9A9A; + -webkit-box-shadow: none; + box-shadow: none; + outline: 0 !important; + color: #66615B; +} + +.form-control:focus+.input-group-append .input-group-text, +.form-control:focus~.input-group-append .input-group-text, +.form-control:focus+.input-group-prepend .input-group-text, +.form-control:focus~.input-group-prepend .input-group-text { + border: 1px solid #ccc; + border-left: none; + background-color: transparent; +} + +.has-success .form-control, +.has-error .form-control, +.has-success .form-control:focus, +.has-error .form-control:focus { + -webkit-box-shadow: none; + box-shadow: none; +} + +.has-success .form-control { + border: 1px solid #ccc; + color: #66615b; +} + +.has-success .form-control.form-control-success { + padding-right: 2.5em !important; +} + +.has-success .form-control:focus { + border: 1px solid #6bd098; + color: #6bd098; +} + +.has-danger .form-control { + background-color: #FFC0A4; + border: 1px solid #ef8157; + color: #ef8157; +} + +.has-danger .form-control.form-control-danger { + padding-right: 2.5em !important; +} + +.has-danger .form-control:focus { + background-color: #FFFFFF; + border: 1px solid #ef8157; +} + +.form-control+.form-control-feedback { + border-radius: 6px; + font-size: 14px; + margin-top: -7px; + position: absolute; + right: 10px; + top: 50%; + vertical-align: middle; +} + +.open .form-control { + border-radius: 6px 6px 0 0; + border-bottom-color: transparent; +} + +.form-control+.input-group-append .input-group-text, +.form-control+.input-group-prepend .input-group-text { + background-color: #FFFFFF; +} + +.form-group.no-border.form-control-lg .input-group-append .input-group-text, +.input-group.no-border.form-control-lg .input-group-append .input-group-text { + padding: 15px 0 15px 11px; +} + +.form-group.no-border.form-control-lg .form-control, +.input-group.no-border.form-control-lg .form-control { + padding: 15px 11px; +} + +.form-group.no-border.form-control-lg .form-control+.input-group-prepend .input-group-text, +.form-group.no-border.form-control-lg .form-control+.input-group-append .input-group-text, +.input-group.no-border.form-control-lg .form-control+.input-group-prepend .input-group-text, +.input-group.no-border.form-control-lg .form-control+.input-group-append .input-group-text { + padding: 15px 11px 15px 0; +} + +.form-group.form-control-lg .form-control, +.input-group.form-control-lg .form-control { + padding: 14px 10px; +} + +.form-group.form-control-lg .form-control+.input-group-prepend .input-group-text, +.form-group.form-control-lg .form-control+.input-group-append .input-group-text, +.input-group.form-control-lg .form-control+.input-group-prepend .input-group-text, +.input-group.form-control-lg .form-control+.input-group-append .input-group-text { + padding: 14px 10px 14px 0; +} + +.form-group.form-control-lg .input-group-prepend .input-group-text, +.form-group.form-control-lg .input-group-append .input-group-text, +.input-group.form-control-lg .input-group-prepend .input-group-text, +.input-group.form-control-lg .input-group-append .input-group-text { + padding: 14px 0 15px 10px; +} + +.form-group.form-control-lg .input-group-prepend .input-group-text+.form-control, +.form-group.form-control-lg .input-group-append .input-group-text+.form-control, +.input-group.form-control-lg .input-group-prepend .input-group-text+.form-control, +.input-group.form-control-lg .input-group-append .input-group-text+.form-control { + padding: 15px 10px 15px 8px; +} + +.form-group.no-border .form-control, +.input-group.no-border .form-control { + padding: 11px 11px; +} + +.form-group.no-border .form-control+.input-group-prepend .input-group-text, +.form-group.no-border .form-control+.input-group-append .input-group-text, +.input-group.no-border .form-control+.input-group-prepend .input-group-text, +.input-group.no-border .form-control+.input-group-append .input-group-text { + padding: 11px 11px 11px 0; +} + +.form-group.no-border .input-group-prepend .input-group-text, +.form-group.no-border .input-group-append .input-group-text, +.input-group.no-border .input-group-prepend .input-group-text, +.input-group.no-border .input-group-append .input-group-text { + padding: 11px 0 11px 11px; +} + +.form-group .form-control, +.input-group .form-control { + padding: 10px 10px 10px 10px; +} + +.form-group .form-control+.input-group-prepend .input-group-text, +.form-group .form-control+.input-group-append .input-group-text, +.input-group .form-control+.input-group-prepend .input-group-text, +.input-group .form-control+.input-group-append .input-group-text { + padding: 10px 10px 10px 0; +} + +.form-group .input-group-prepend .input-group-text, +.form-group .input-group-append .input-group-text, +.input-group .input-group-prepend .input-group-text, +.input-group .input-group-append .input-group-text { + padding: 10px 0 10px 10px; +} + +.form-group .input-group-prepend .input-group-text+.form-control, +.form-group .input-group-prepend .input-group-text~.form-control, +.form-group .input-group-append .input-group-text+.form-control, +.form-group .input-group-append .input-group-text~.form-control, +.input-group .input-group-prepend .input-group-text+.form-control, +.input-group .input-group-prepend .input-group-text~.form-control, +.input-group .input-group-append .input-group-text+.form-control, +.input-group .input-group-append .input-group-text~.form-control { + padding: 10px 11px 11px 8px; +} + +.input-group.has-success .input-group-prepend .input-group-text, +.input-group.has-success .input-group-append .input-group-text { + border: 1px solid #ccc; + color: #66615b; + background-color: #FFFFFF; + border-right: none; +} + +.form-group.no-border .form-control, +.form-group.no-border .form-control+.input-group-prepend .input-group-text, +.form-group.no-border .form-control+.input-group-append .input-group-text, +.input-group.no-border .form-control, +.input-group.no-border .form-control+.input-group-prepend .input-group-text, +.input-group.no-border .form-control+.input-group-append .input-group-text { + background-color: rgba(222, 222, 222, 0.3); + border: medium none; +} + +.form-group.no-border .form-control:focus, +.form-group.no-border .form-control:active, +.form-group.no-border .form-control:active, +.form-group.no-border .form-control+.input-group-prepend .input-group-text:focus, +.form-group.no-border .form-control+.input-group-prepend .input-group-text:active, +.form-group.no-border .form-control+.input-group-prepend .input-group-text:active, +.form-group.no-border .form-control+.input-group-append .input-group-text:focus, +.form-group.no-border .form-control+.input-group-append .input-group-text:active, +.form-group.no-border .form-control+.input-group-append .input-group-text:active, +.input-group.no-border .form-control:focus, +.input-group.no-border .form-control:active, +.input-group.no-border .form-control:active, +.input-group.no-border .form-control+.input-group-prepend .input-group-text:focus, +.input-group.no-border .form-control+.input-group-prepend .input-group-text:active, +.input-group.no-border .form-control+.input-group-prepend .input-group-text:active, +.input-group.no-border .form-control+.input-group-append .input-group-text:focus, +.input-group.no-border .form-control+.input-group-append .input-group-text:active, +.input-group.no-border .form-control+.input-group-append .input-group-text:active { + border: medium none; + background-color: rgba(222, 222, 222, 0.5); +} + +.form-group.no-border .form-control:focus+.input-group-prepend .input-group-text, +.form-group.no-border .form-control:focus+.input-group-append .input-group-text, +.input-group.no-border .form-control:focus+.input-group-prepend .input-group-text, +.input-group.no-border .form-control:focus+.input-group-append .input-group-text { + background-color: rgba(222, 222, 222, 0.5); +} + +.form-group.no-border .input-group-prepend .input-group-text, +.form-group.no-border .input-group-append .input-group-text, +.input-group.no-border .input-group-prepend .input-group-text, +.input-group.no-border .input-group-append .input-group-text { + background-color: rgba(222, 222, 222, 0.3); + border: none; +} + +.has-error .form-control-feedback, +.has-error .control-label { + color: #ef8157; +} + +.has-success .form-control-feedback, +.has-success .control-label { + color: #6bd098; +} + +.input-group.has-danger .input-group-prepend { + border-radius: 4px; +} + +.input-group.has-danger .input-group-prepend .input-group-text { + border: 1px solid #ef8157; + border-right: none; +} + +.input-group.has-danger .error { + display: block; + width: 100%; + color: #ef8157; + margin-top: 3px; +} + +.input-group.has-success .input-group-prepend { + border-radius: 4px; +} + +.input-group.has-success .input-group-prepend .input-group-text { + border-right: none; +} + +.input-group-focus .input-group-prepend .input-group-text, +.input-group-focus .input-group-append .input-group-text { + background-color: #FFFFFF; + border-color: #9A9A9A; +} + +.input-group-focus.no-border .input-group-prepend .input-group-text, +.input-group-focus.no-border .input-group-append .input-group-text { + background-color: rgba(222, 222, 222, 0.5); +} + +.input-group-focus.has-danger .input-group-append .input-group-text, +.input-group-focus.has-danger .input-group-prepend .input-group-text { + background-color: #FFC0A4; +} + +.input-group-focus.has-success .input-group-append .input-group-text, +.input-group-focus.has-success .input-group-prepend .input-group-text { + background-color: #ABF3CB; + border: 1px solid #6bd098; + border-right: none; +} + +.input-group-append .input-group-text, +.input-group-prepend .input-group-text { + background-color: transparent; + border: 1px solid #E3E3E3; + color: #66615B; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + -webkit-transition: color 0.3s ease-in-out, border-color 0.3s ease-in-out, background-color 0.3s ease-in-out; + -moz-transition: color 0.3s ease-in-out, border-color 0.3s ease-in-out, background-color 0.3s ease-in-out; + -o-transition: color 0.3s ease-in-out, border-color 0.3s ease-in-out, background-color 0.3s ease-in-out; + -ms-transition: color 0.3s ease-in-out, border-color 0.3s ease-in-out, background-color 0.3s ease-in-out; + transition: color 0.3s ease-in-out, border-color 0.3s ease-in-out, background-color 0.3s ease-in-out; +} + +.input-group-append .input-group-text i, +.input-group-prepend .input-group-text i { + opacity: .5; +} + +.has-danger .input-group-append .input-group-text, +.has-danger .input-group-prepend .input-group-text { + background-color: #FFC0A4; +} + +.has-success .input-group-append .input-group-text, +.has-success .input-group-prepend .input-group-text { + background-color: #ABF3CB; +} + +.has-danger.input-group-focus .input-group-append .input-group-text, +.has-danger.input-group-focus .input-group-prepend .input-group-text { + background-color: #FFFFFF; + color: #ef8157; +} + +.has-success.input-group-focus .input-group-append .input-group-text, +.has-success.input-group-focus .input-group-prepend .input-group-text { + background-color: #FFFFFF; + color: #6bd098; +} + +.has-danger .form-control:focus+.input-group-append .input-group-text, +.has-danger .form-control:focus+.input-group-prepend .input-group-text { + color: #ef8157; +} + +.has-success .form-control:focus+.input-group-append .input-group-text, +.has-success .form-control:focus+.input-group-prepend .input-group-text { + color: #6bd098; +} + +.input-group-append .input-group-text+.form-control, +.input-group-append .input-group-text~.form-control, +.input-group-prepend .input-group-text+.form-control, +.input-group-prepend .input-group-text~.form-control { + padding: -0.5rem 0.7rem; + padding-left: 18px; +} + +.input-group-append .input-group-text i, +.input-group-prepend .input-group-text i { + width: 17px; +} + +.input-group-append, +.input-group-prepend { + margin: 0; +} + +.input-group-append .input-group-text { + border-left: none; +} + +.input-group-prepend .input-group-text { + border-right: none; +} + +.input-group, +.form-group { + margin-bottom: 10px; + position: relative; +} + +.input-group .form-control-static, +.form-group .form-control-static { + margin-top: 9px; +} + +.input-group.has-danger .error, +.form-group.has-danger .error { + color: #ef8157; +} + +.input-group[disabled] .input-group-prepend .input-group-text, +.input-group[disabled] .input-group-append .input-group-text { + background-color: #E3E3E3; +} + +.input-group .form-control:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child) { + border-radius: 4px; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + border-left: 0 none; +} + +.input-group .form-control:first-child, +.input-group-btn:first-child>.dropdown-toggle, +.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle) { + border-right: 0 none; +} + +.input-group .form-control:last-child, +.input-group-btn:last-child>.dropdown-toggle, +.input-group-btn:first-child>.btn:not(:first-child) { + border-left: 0 none; +} + +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + background-color: #E3E3E3; + color: #66615B; + cursor: not-allowed; +} + +.input-group-btn .btn { + border-width: 1px; + padding: 11px 0.7rem; +} + +.input-group-btn .btn-default:not(.btn-fill) { + border-color: #DDDDDD; +} + +.input-group-btn:last-child>.btn { + margin-left: 0; +} + +textarea.form-control { + max-width: 100%; + max-height: 80px; + padding: 10px 10px 0 0; + resize: none; + border: none; + border: 1px solid #E3E3E3; + border-radius: 4px; + line-height: 2; +} + +.has-success.form-group .form-control, +.has-success.form-group.no-border .form-control, +.has-danger.form-group .form-control, +.has-danger.form-group.no-border .form-control { + padding-right: 32px; +} + +.form.form-newsletter .form-group { + float: left; + width: 78%; + margin-right: 2%; + margin-top: 9px; +} + +.input-group .input-group-btn { + padding: 0 12px; +} + +.form-group input[type=file] { + opacity: 0; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 100; +} + +.form-text { + font-size: 0.8571em; +} + +.form-control-lg { + padding: 0; + font-size: inherit; + line-height: 0; + border-radius: 0; +} + +.form-horizontal .col-form-label, +.form-horizontal .label-on-right { + padding: 10px 5px 0 15px; + text-align: right; + max-width: 180px; +} + +.form-horizontal .checkbox-radios { + margin-bottom: 15px; +} + +.form-horizontal .checkbox-radios .form-check:first-child { + margin-top: 8px; +} + +.form-horizontal .label-on-right { + text-align: left; + padding: 10px 15px 0 5px; +} + +.form-horizontal .form-check-inline { + margin-top: 6px; +} + +button, +input, +optgroup, +select, +textarea { + font-family: "Montserrat", "Helvetica Neue", Arial, sans-serif; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + font-weight: 400; +} + +a { + color: #51cbce; +} + +a:hover, +a:focus { + color: #51cbce; +} + +h1, +.h1 { + font-size: 3.5em; + line-height: 1.15; + margin-bottom: 30px; +} + +h1 small, +.h1 small { + font-weight: 700; + text-transform: uppercase; + opacity: .8; +} + +h2, +.h2 { + font-size: 2.5em; + margin-bottom: 30px; +} + +h3, +.h3 { + font-size: 2em; + margin-bottom: 30px; + line-height: 1.4em; +} + +h4, +.h4 { + font-size: 1.714em; + line-height: 1.45em; + margin-top: 30px; + margin-bottom: 15px; +} + +h4+.category, +h4.title+.category, +.h4+.category, +.h4.title+.category { + margin-top: -10px; +} + +h5, +.h5 { + font-size: 1.57em; + line-height: 1.4em; + margin-bottom: 15px; +} + +h6, +.h6 { + font-size: 1em; + font-weight: 700; + text-transform: uppercase; +} + +p.description { + font-size: 1.14em; +} + +.title { + font-weight: 700; +} + +.title.title-up { + text-transform: uppercase; +} + +.title.title-up a { + color: #2c2c2c; + text-decoration: none; +} + +.title+.category { + margin-top: -10px; +} + +.description, +.card-description, +.footer-big p, +.card .footer .stats { + color: #9A9A9A; + font-weight: 300; +} + +.category, +.card-category { + text-transform: capitalize; + font-weight: 400; + color: #9A9A9A; + font-size: 0.7142em; +} + +.card-category { + font-size: 1em; +} + +.text-primary, +a.text-primary:focus, +a.text-primary:hover { + color: #51cbce !important; +} + +.text-info, +a.text-info:focus, +a.text-info:hover { + color: #51bcda !important; +} + +.text-success, +a.text-success:focus, +a.text-success:hover { + color: #6bd098 !important; +} + +.text-warning, +a.text-warning:focus, +a.text-warning:hover { + color: #fbc658 !important; +} + +.text-danger, +a.text-danger:focus, +a.text-danger:hover { + color: #ef8157 !important; +} + +.text-gray, +a.text-gray:focus, +a.text-gray:hover { + color: #E3E3E3 !important; +} + +.blockquote { + border-left: none; + border: 1px solid #66615B; + padding: 20px; + font-size: 1.1em; + line-height: 1.8; +} + +.blockquote small { + color: #66615B; + font-size: 0.8571em; + text-transform: uppercase; +} + +.blockquote.blockquote-primary { + border-color: #51cbce; + color: #51cbce; +} + +.blockquote.blockquote-primary small { + color: #51cbce; +} + +.blockquote.blockquote-danger { + border-color: #ef8157; + color: #ef8157; +} + +.blockquote.blockquote-danger small { + color: #ef8157; +} + +.blockquote.blockquote-white { + border-color: rgba(255, 255, 255, 0.8); + color: #FFFFFF; +} + +.blockquote.blockquote-white small { + color: rgba(255, 255, 255, 0.8); +} + +body { + color: #2c2c2c; + font-size: 14px; + font-family: "Montserrat", "Helvetica Neue", Arial, sans-serif; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; +} + +.main { + position: relative; + background: #FFFFFF; +} + +/* Animations */ + +.nav-pills .nav-link, +.navbar, +.nav-tabs .nav-link, +.sidebar .nav a, +.sidebar .nav a i, +.animation-transition-general, +.sidebar .navbar-minimize, +.off-canvas-sidebar .navbar-minimize, +.sidebar .logo a.logo-mini, +.sidebar .logo a.logo-normal, +.off-canvas-sidebar .logo a.logo-mini, +.off-canvas-sidebar .logo a.logo-normal, +.tag, +.tag [data-role="remove"], +.animation-transition-general, +.sidebar .navbar-minimize, +.off-canvas-sidebar .navbar-minimize, +.sidebar .logo a.logo-mini, +.sidebar .logo a.logo-normal, +.off-canvas-sidebar .logo a.logo-mini, +.off-canvas-sidebar .logo a.logo-normal { + -webkit-transition: all 300ms ease 0s; + -moz-transition: all 300ms ease 0s; + -o-transition: all 300ms ease 0s; + -ms-transition: all 300ms ease 0s; + transition: all 300ms ease 0s; +} + +.dropdown-toggle:after, +.bootstrap-switch-label:before, +.caret { + -webkit-transition: all 150ms ease 0s; + -moz-transition: all 150ms ease 0s; + -o-transition: all 150ms ease 0s; + -ms-transition: all 150ms ease 0s; + transition: all 150ms ease 0s; +} + +.dropdown-toggle[aria-expanded="true"]:after, +a[data-toggle="collapse"][aria-expanded="true"] .caret, +.card-collapse .card a[data-toggle="collapse"][aria-expanded="true"] i, +.card-collapse .card a[data-toggle="collapse"].expanded i { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} + +.button-bar { + display: block; + position: relative; + width: 22px; + height: 1px; + border-radius: 1px; + background: #FFFFFF; +} + +.button-bar+.button-bar { + margin-top: 7px; +} + +.button-bar:nth-child(2) { + width: 17px; +} + +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-top: 4px solid\9; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} + +.pull-left { + float: left; +} + +.pull-right { + float: right; +} + +.offline-doc .navbar.navbar-transparent { + padding-top: 25px; + border-bottom: none; +} + +.offline-doc .navbar.navbar-transparent .navbar-minimize { + display: none; +} + +.offline-doc .navbar.navbar-transparent .navbar-brand, +.offline-doc .navbar.navbar-transparent .collapse .navbar-nav .nav-link { + color: #FFFFFF !important; +} + +.offline-doc .footer { + z-index: 3 !important; +} + +.offline-doc .page-header .container { + z-index: 3; +} + +.offline-doc .page-header:after { + background-color: rgba(0, 0, 0, 0.5); + content: ""; + display: block; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; + z-index: 2; +} + +.fixed-plugin .dropdown-menu li { + padding: 2px !important; +} + +.badge.badge-default { + border-color: #66615B; + background-color: #66615B; +} + +.badge.badge-primary { + border-color: #51cbce; + background-color: #51cbce; +} + +.badge.badge-info { + border-color: #51bcda; + background-color: #51bcda; +} + +.badge.badge-success { + border-color: #6bd098; + background-color: #6bd098; +} + +.badge.badge-warning { + border-color: #fbc658; + background-color: #fbc658; +} + +.badge.badge-danger { + border-color: #ef8157; + background-color: #ef8157; +} + +.badge.badge-neutral { + border-color: #FFFFFF; + background-color: #FFFFFF; + color: inherit; +} + +.card-user form .form-group { + margin-bottom: 20px; +} + +.from-check, +.form-check-radio { + margin-bottom: 12px; + position: relative; +} + +.form-check { + padding-left: 0; + margin-bottom: .5rem; +} + +.form-check .form-check-label { + display: inline-block; + position: relative; + cursor: pointer; + padding-left: 35px; + line-height: 26px; + margin-bottom: 0; +} + +.form-check .form-check-sign::before, +.form-check .form-check-sign::after { + content: " "; + display: inline-block; + position: absolute; + width: 24px; + height: 24px; + left: 0; + cursor: pointer; + border-radius: 6px; + top: 0; + background-color: #AAA7A4; + -webkit-transition: opacity 0.3s linear; + -moz-transition: opacity 0.3s linear; + -o-transition: opacity 0.3s linear; + -ms-transition: opacity 0.3s linear; + transition: opacity 0.3s linear; +} + +.form-check .form-check-sign::after { + font-family: 'FontAwesome'; + content: "\f00c"; + top: -1px; + text-align: center; + font-size: 15px; + opacity: 0; + color: #FFF; + border: 0; + background-color: inherit; +} + +.form-check.disabled .form-check-label { + color: #9A9A9A; + opacity: .5; + cursor: not-allowed; +} + +.form-check input[type="checkbox"], +.form-check-radio input[type="radio"] { + opacity: 0; + position: absolute; + visibility: hidden; +} + +.form-check input[type="checkbox"]:checked+.form-check-sign::after { + opacity: 1; +} + +.form-control input[type="checkbox"]:disabled+.form-check-sign::before, +.checkbox input[type="checkbox"]:disabled+.form-check-sign::after { + cursor: not-allowed; +} + +.form-check .form-check-label input[type="checkbox"]:disabled+.form-check-sign, +.form-check-radio input[type="radio"]:disabled+.form-check-sign { + pointer-events: none !important; +} + +.form-check-radio { + margin-left: -3px; +} + +.form-check-radio .form-check-label { + padding-left: 2rem; +} + +.form-check-radio.disabled .form-check-label { + color: #9A9A9A; + opacity: .5; + cursor: not-allowed; +} + +.form-check-radio .form-check-sign::before { + font-family: 'FontAwesome'; + content: "\f10c"; + font-size: 22px; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + display: inline-block; + position: absolute; + opacity: .50; + left: 5px; + top: -5px; +} + +.form-check-label input[type="checkbox"]:checked+.form-check-sign:before { + background-color: #66615B; +} + +.form-check-radio input[type="radio"]+.form-check-sign:after, +.form-check-radio input[type="radio"] { + opacity: 0; + -webkit-transition: opacity 0.3s linear; + -moz-transition: opacity 0.3s linear; + -o-transition: opacity 0.3s linear; + -ms-transition: opacity 0.3s linear; + transition: opacity 0.3s linear; + content: " "; + display: block; +} + +.form-check-radio input[type="radio"]:checked+.form-check-sign::after { + font-family: 'FontAwesome'; + content: "\f192"; + top: -5px; + position: absolute; + left: 5px; + opacity: 1; + font-size: 22px; +} + +.form-check-radio input[type="radio"]:checked+.form-check-sign::after { + opacity: 1; +} + +.form-check-radio input[type="radio"]:disabled+.form-check-sign::before, +.form-check-radio input[type="radio"]:disabled+.form-check-sign::after { + color: #9A9A9A; +} + +.navbar { + padding-top: 0.625rem; + padding-bottom: 0.625rem; + min-height: 53px; + margin-bottom: 20px; +} + +.navbar a { + vertical-align: middle; +} + +.navbar a:not(.btn):not(.dropdown-item) { + color: #FFFFFF; +} + +.navbar a.dropdown-item { + color: #66615B; +} + +.navbar.bg-white .input-group .form-control, +.navbar.bg-white .input-group.no-border .form-control { + color: #66615B; +} + +.navbar.bg-white .input-group .form-control::-moz-placeholder, +.navbar.bg-white .input-group.no-border .form-control::-moz-placeholder { + color: #66615B; +} + +.navbar.bg-white .input-group .form-control:-ms-input-placeholder, +.navbar.bg-white .input-group.no-border .form-control:-ms-input-placeholder { + color: #66615B; +} + +.navbar.bg-white .input-group .form-control::-webkit-input-placeholder, +.navbar.bg-white .input-group.no-border .form-control::-webkit-input-placeholder { + color: #66615B; +} + +.navbar.bg-white .input-group-prepend .input-group-text i, +.navbar.bg-white .input-group-append .input-group-text i { + color: #66615B; + opacity: .5; +} + +.navbar .form-group, +.navbar .input-group { + margin: 0; + margin-left: -3px; + margin-right: 5px; +} + +.navbar .form-group .form-group-addon, +.navbar .form-group .input-group-prepend .input-group-text, +.navbar .form-group .input-group-append .input-group-text, +.navbar .input-group .form-group-addon, +.navbar .input-group .input-group-prepend .input-group-text, +.navbar .input-group .input-group-append .input-group-text { + color: #66615B; +} + +.navbar .form-group .form-group-addon i, +.navbar .form-group .input-group-prepend .input-group-text i, +.navbar .form-group .input-group-append .input-group-text i, +.navbar .input-group .form-group-addon i, +.navbar .input-group .input-group-prepend .input-group-text i, +.navbar .input-group .input-group-append .input-group-text i { + opacity: 1; +} + +.navbar .form-group.no-border .form-control, +.navbar .input-group.no-border .form-control { + color: #66615B; +} + +.navbar .form-group.no-border .form-control::-moz-placeholder, +.navbar .input-group.no-border .form-control::-moz-placeholder { + color: #66615B; +} + +.navbar .form-group.no-border .form-control:-ms-input-placeholder, +.navbar .input-group.no-border .form-control:-ms-input-placeholder { + color: #66615B; +} + +.navbar .form-group.no-border .form-control::-webkit-input-placeholder, +.navbar .input-group.no-border .form-control::-webkit-input-placeholder { + color: #66615B; +} + +.navbar p { + display: inline-block; + margin: 0; + line-height: 1.8em; + font-size: 1em; + font-weight: 400; +} + +.navbar.navbar-absolute { + position: absolute; + width: 100%; + padding-top: 10px; + z-index: 1029; +} + +.documentation .navbar.fixed-top { + left: 0; + width: initial; +} + +.navbar .navbar-wrapper { + display: inline-flex; + align-items: center; +} + +.navbar .navbar-wrapper .navbar-minimize { + padding-right: 10px; +} + +.navbar .navbar-wrapper .navbar-minimize .btn { + margin: 0; +} + +.navbar .navbar-wrapper .navbar-toggle .navbar-toggler { + padding-left: 0; +} + +.navbar .navbar-wrapper .navbar-toggle:hover .navbar-toggler-bar.bar2 { + width: 22px; +} + +.navbar .navbar-nav.navbar-logo { + position: absolute; + left: 0; + right: 0; + margin: 0 auto; + width: 49px; + top: -4px; +} + +.navbar .navbar-nav .nav-link.btn { + padding: 11px 22px; +} + +.navbar .navbar-nav .nav-link.btn.btn-lg { + padding: 15px 48px; +} + +.navbar .navbar-nav .nav-link.btn.btn-sm { + padding: 5px 15px; +} + +.navbar .navbar-nav .nav-link { + text-transform: uppercase; + font-size: 0.7142em; + padding: 0.5rem 0.7rem; + line-height: 1.625rem; + margin-right: 3px; +} + +.navbar .navbar-nav .nav-link i.fa+p, +.navbar .navbar-nav .nav-link i.nc-icon+p { + margin-left: 3px; +} + +.navbar .navbar-nav .nav-link i.fa, +.navbar .navbar-nav .nav-link i.nc-icon { + font-size: 18px; + position: relative; + top: 3px; + text-align: center; + width: 21px; +} + +.navbar .navbar-nav .nav-link i.nc-icon { + top: 4px; + font-size: 16px; +} + +.navbar .navbar-nav .nav-link.profile-photo .profile-photo-small { + width: 27px; + height: 27px; +} + +.navbar .navbar-nav .nav-link.disabled { + opacity: .5; + color: #FFFFFF; +} + +.navbar .navbar-nav .nav-item.active .nav-link:not(.btn), +.navbar .navbar-nav .nav-item .nav-link:not(.btn):focus, +.navbar .navbar-nav .nav-item .nav-link:not(.btn):hover, +.navbar .navbar-nav .nav-item .nav-link:not(.btn):active { + border-radius: 3px; + color: #66615B; +} + +.navbar .logo-container { + width: 27px; + height: 27px; + overflow: hidden; + margin: 0 auto; + border-radius: 50%; + border: 1px solid transparent; +} + +.navbar .navbar-brand { + text-transform: capitalize; + font-size: 20px; + padding-top: 0.5rem; + padding-bottom: 0.5rem; + line-height: 1.625rem; +} + +.navbar .navbar-toggler { + width: 37px; + height: 27px; + vertical-align: middle; + outline: 0; + cursor: pointer; +} + +.navbar .navbar-toggler .navbar-toggler-bar.navbar-kebab { + width: 3px; + height: 3px; + border-radius: 50%; + margin: 0 auto; +} + +.navbar .button-dropdown .navbar-toggler-bar:nth-child(2) { + width: 17px; +} + +.navbar.navbar-transparent { + background-color: transparent !important; + box-shadow: none; + border-bottom: 1px solid #ddd; +} + +.navbar.navbar-transparent a:not(.dropdown-item):not(.btn) { + color: #66615B; +} + +.navbar.navbar-transparent a:not(.dropdown-item):not(.btn).disabled { + opacity: .5; + color: #66615B; +} + +.navbar.navbar-transparent .button-bar { + background: #66615B; +} + +.navbar.navbar-transparent .nav-item .nav-link:not(.btn) { + color: #66615B; +} + +.navbar.navbar-transparent .nav-item.active .nav-link:not(.btn), +.navbar.navbar-transparent .nav-item .nav-link:not(.btn):focus, +.navbar.navbar-transparent .nav-item .nav-link:not(.btn):hover, +.navbar.navbar-transparent .nav-item .nav-link:not(.btn):focus:hover, +.navbar.navbar-transparent .nav-item .nav-link:not(.btn):active { + color: #51cbce; +} + +.navbar.bg-white a:not(.dropdown-item):not(.btn) { + color: #66615B; +} + +.navbar.bg-white a:not(.dropdown-item):not(.btn).disabled { + opacity: .5; + color: #66615B; +} + +.navbar.bg-white .button-bar { + background: #66615B; +} + +.navbar.bg-white .nav-item.active .nav-link:not(.btn), +.navbar.bg-white .nav-item .nav-link:not(.btn):focus, +.navbar.bg-white .nav-item .nav-link:not(.btn):hover, +.navbar.bg-white .nav-item .nav-link:not(.btn):active { + color: #51bcda; +} + +.navbar.bg-white .logo-container { + border: 1px solid #66615B; +} + +.navbar .navbar-collapse .nav-item a { + font-size: 14px; +} + +.bg-default { + background-color: #66615B !important; +} + +.bg-primary { + background-color: #51cbce !important; +} + +.bg-info { + background-color: #51bcda !important; +} + +.bg-success { + background-color: #6bd098 !important; +} + +.bg-danger { + background-color: #ef8157 !important; +} + +.bg-warning { + background-color: #fbc658 !important; +} + +.bg-white { + background-color: #FFFFFF !important; +} + +.page-header { + min-height: 100vh; + max-height: 1000px; + padding: 0; + color: #FFFFFF; + position: relative; +} + +.page-header .page-header-image { + position: absolute; + background-size: cover; + background-position: center center; + width: 100%; + height: 100%; + z-index: -1; +} + +.page-header .content-center { + position: absolute; + top: 50%; + left: 50%; + z-index: 2; + -ms-transform: translate(-50%, -50%); + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + text-align: center; + color: #FFFFFF; + padding: 0 15px; + width: 100%; + max-width: 880px; +} + +.page-header footer { + position: absolute; + bottom: 0; + width: 100%; +} + +.page-header .container { + height: 100%; + z-index: 1; +} + +.page-header .category, +.page-header .description { + color: rgba(255, 255, 255, 0.8); +} + +.page-header.page-header-small { + min-height: 60vh; + max-height: 440px; +} + +.page-header.page-header-mini { + min-height: 40vh; + max-height: 340px; +} + +.page-header .title { + margin-bottom: 15px; +} + +.page-header .title+h4 { + margin-top: 10px; +} + +.page-header:after, +.page-header:before { + position: absolute; + z-index: 0; + width: 100%; + height: 100%; + display: block; + left: 0; + top: 0; + content: ""; +} + +.page-header:before { + background-color: rgba(0, 0, 0, 0.3); +} + +.page-header[filter-color="orange"] { + background: rgba(44, 44, 44, 0.2); + /* For browsers that do not support gradients */ + background: -webkit-linear-gradient(90deg, rgba(44, 44, 44, 0.2), rgba(224, 23, 3, 0.6)); + /* For Safari 5.1 to 6.0 */ + background: -o-linear-gradient(90deg, rgba(44, 44, 44, 0.2), rgba(224, 23, 3, 0.6)); + /* For Opera 11.1 to 12.0 */ + background: -moz-linear-gradient(90deg, rgba(44, 44, 44, 0.2), rgba(224, 23, 3, 0.6)); + /* For Firefox 3.6 to 15 */ + background: linear-gradient(0deg, rgba(44, 44, 44, 0.2), rgba(224, 23, 3, 0.6)); + /* Standard syntax */ +} + +.dropdown .dropdown-menu, +.dropup .dropdown-menu, +.bootstrap-select .dropdown-menu { + display: block; + opacity: 0; + filter: alpha(opacity=0); + -webkit-box-shadow: 1px 2px 7px 1px rgba(0, 0, 0, 0.125); + box-shadow: 1px 2px 7px 1px rgba(0, 0, 0, 0.125); + visibility: hidden; + position: absolute; + transition: all 0.3s cubic-bezier(0.215, 0.61, 0.355, 1) 0s, opacity 0.3s ease 0s, height 0s linear 0.35s; +} + +.dropdown .dropdown-menu[x-placement="top-start"], +.dropup .dropdown-menu[x-placement="top-start"], +.bootstrap-select .dropdown-menu[x-placement="top-start"] { + -webkit-transform: translate3d(-20px, 0px, 0) !important; + -moz-transform: translate3d(-20px, 0px, 0) !important; + -o-transform: translate3d(-20px, 0px, 0) !important; + -ms-transform: translate3d(-20px, 0px, 0) !important; + transform: translate3d(-20px, 0px, 0) !important; +} + +.dropdown .dropdown-menu[x-placement="bottom-start"], +.dropup .dropdown-menu[x-placement="bottom-start"], +.bootstrap-select .dropdown-menu[x-placement="bottom-start"] { + -webkit-transform: translate3d(-20px, 0px, 0) !important; + -moz-transform: translate3d(-20px, 0px, 0) !important; + -o-transform: translate3d(-20px, 0px, 0) !important; + -ms-transform: translate3d(-20px, 0px, 0) !important; + transform: translate3d(-20px, 0px, 0) !important; +} + +.dropdown.show .dropdown-menu, +.dropup.show .dropdown-menu, +.bootstrap-select.show .dropdown-menu { + opacity: 1; + filter: alpha(opacity=100); + visibility: visible; +} + +.dropdown.show .dropdown-menu[x-placement="top-start"], +.dropup.show .dropdown-menu[x-placement="top-start"], +.bootstrap-select.show .dropdown-menu[x-placement="top-start"] { + -webkit-transform: translate3d(-20px, -50px, 0) !important; + -moz-transform: translate3d(-20px, -50px, 0) !important; + -o-transform: translate3d(-20px, -50px, 0) !important; + -ms-transform: translate3d(-20px, -50px, 0) !important; + transform: translate3d(-20px, -50px, 0) !important; + top: auto !important; + bottom: 0 !important; +} + +.dropdown.show .dropdown-menu[x-placement="bottom-start"], +.dropup.show .dropdown-menu[x-placement="bottom-start"], +.bootstrap-select.show .dropdown-menu[x-placement="bottom-start"] { + -webkit-transform: translate3d(-20px, 50px, 0) !important; + -moz-transform: translate3d(-20px, 50px, 0) !important; + -o-transform: translate3d(-20px, 50px, 0) !important; + -ms-transform: translate3d(-20px, 50px, 0) !important; + transform: translate3d(-20px, 50px, 0) !important; + bottom: auto !important; + top: 0 !important; +} + +.dropup .dropdown-menu, +.dropdown-btn .dropdown-menu { + -webkit-transform: translate3d(-20px, 0px, 0) !important; + -moz-transform: translate3d(-20px, 0px, 0) !important; + -o-transform: translate3d(-20px, 0px, 0) !important; + -ms-transform: translate3d(-20px, 0px, 0) !important; + transform: translate3d(-20px, 0px, 0) !important; + top: auto !important; + bottom: 0 !important; +} + +.dropup.show .dropdown-menu, +.dropdown-btn.show .dropdown-menu { + opacity: 1; + visibility: visible; +} + +.dropup.show .dropdown-menu .dropdown-menu.inner, +.dropdown-btn.show .dropdown-menu .dropdown-menu.inner { + -webkit-transform: translate3d(0, 0px, 0) !important; + -moz-transform: translate3d(0, 0px, 0) !important; + -o-transform: translate3d(0, 0px, 0) !important; + -ms-transform: translate3d(0, 0px, 0) !important; + transform: translate3d(0, 0px, 0) !important; +} + +.bootstrap-select.show .dropdown-menu.show[x-placement="top-start"] { + -webkit-transform: translate3d(-20px, -60px, 0) !important; + -moz-transform: translate3d(-20px, -60px, 0) !important; + -o-transform: translate3d(-20px, -60px, 0) !important; + -ms-transform: translate3d(-20px, -60px, 0) !important; + transform: translate3d(-20px, -60px, 0) !important; + top: auto !important; + bottom: 0 !important; +} + +.bootstrap-select.show .dropdown-menu.show li:last-child a:hover { + border-radius: 0 0 12px 12px; +} + +.bootstrap-select.dropup.show:before { + top: -1px !important; +} + +.bootstrap-select.dropup.show:after { + top: -2px !important; +} + +.dropdown-menu { + background-color: #FFFFFF; + border: 0 none; + border-radius: 12px; + margin-top: 10px; + padding: 0px; +} + +.dropdown-menu .divider { + background-color: #F1EAE0; + margin: 0px; +} + +.dropdown-menu .dropdown-header { + color: #9A9A9A; + font-size: 0.8571em; + padding: 10px 15px; +} + +.dropdown-menu .no-notification { + color: #9A9A9A; + font-size: 1.2em; + padding: 30px 30px; + text-align: center; +} + +.dropdown-menu .dropdown-item { + color: #66615b; + font-size: 14px; + padding: 10px 45px 10px 15px; + clear: both; + white-space: nowrap; + width: 100%; + display: block; +} + +.dropdown-menu .dropdown-item img { + margin-top: -3px; +} + +.dropdown-menu .dropdown-item:focus { + outline: 0 !important; +} + +.btn-group.select .dropdown-menu { + min-width: 100%; +} + +.dropdown-menu .dropdown-item:first-child { + border-top-left-radius: 12px; + border-top-right-radius: 12px; +} + +.dropdown-menu .dropdown-item:last-child { + border-bottom-left-radius: 12px; + border-bottom-right-radius: 12px; +} + +.select .dropdown-menu .dropdown-item:first-child { + border-radius: 0; + border-bottom: 0 none; +} + +.dropdown-menu .dropdown-item:hover, +.dropdown-menu .dropdown-item:focus { + color: #FFFFFF !important; + opacity: 1; + text-decoration: none; +} + +.dropdown-menu .dropdown-item:hover, +.dropdown-menu .dropdown-item:focus { + background-color: #66615B; +} + +.dropdown-menu.dropdown-primary .dropdown-item:hover, +.dropdown-menu.dropdown-primary .dropdown-item:focus { + background-color: #6dd3d6; +} + +.dropdown-menu.dropdown-info .dropdown-item:hover, +.dropdown-menu.dropdown-info .dropdown-item:focus { + background-color: #6ec7e0; +} + +.dropdown-menu.dropdown-success .dropdown-item:hover, +.dropdown-menu.dropdown-success .dropdown-item:focus { + background-color: #86d9ab; +} + +.dropdown-menu.dropdown-warning .dropdown-item:hover, +.dropdown-menu.dropdown-warning .dropdown-item:focus { + background-color: #fcd27b; +} + +.dropdown-menu.dropdown-danger .dropdown-item:hover, +.dropdown-menu.dropdown-danger .dropdown-item:focus { + background-color: #f29978; +} + +.dropdown-divider { + margin: 0 !important; +} + +.btn-group.select.open { + overflow: visible; +} + +.dropdown-menu-right { + right: -2px; + left: auto; +} + +.navbar-nav .dropdown-menu:before, +.dropdown .dropdown-menu[x-placement="bottom-start"]:before, +.dropdown .dropdown-menu[x-placement="bottom-end"]:before, +.card.card-just-text .dropdown .dropdown-menu:before, +.card-just-text .dropdown .dropdown-menu:before, +.dropdown-btn .dropdown-menu:before { + border-bottom: 11px solid #F1EAE0; + border-left: 11px solid transparent; + border-right: 11px solid transparent; + content: ""; + display: inline-block; + position: absolute; + right: 12px; + top: -12px; +} + +.navbar-nav .dropdown-menu:after, +.dropdown .dropdown-menu[x-placement="bottom-start"]:after, +.dropdown .dropdown-menu[x-placement="bottom-end"]:after, +.card.card-just-text .dropdown .dropdown-menu:after, +.card-just-text .dropdown .dropdown-menu:after, +.dropdown-btn .dropdown-menu:after { + border-bottom: 11px solid #FFFFFF; + border-left: 11px solid transparent; + border-right: 11px solid transparent; + content: ""; + display: inline-block; + position: absolute; + right: 12px; + top: -11px; +} + +.dropdown .dropdown-menu.dropdown-notification[x-placement="top-start"]:before, +.dropdown .dropdown-menu.dropdown-notification[x-placement="bottom-start"]:before { + left: 30px !important; + right: auto; +} + +.dropdown .dropdown-menu.dropdown-notification[x-placement="top-start"]:after, +.dropdown .dropdown-menu.dropdown-notification[x-placement="bottom-start"]:after { + left: 30px !important; + right: auto; +} + +@media screen and (min-width: 768px) { + .navbar-form { + margin-top: 21px; + margin-bottom: 21px; + padding-left: 5px; + padding-right: 5px; + } + .navbar-search-form { + display: none; + } + .navbar-nav .dropdown-item .dropdown-menu, + .dropdown .dropdown-menu, + .dropdown-btn .dropdown-menu { + transform: translate3d(0px, -40px, 0px); + transition: all 0.3s cubic-bezier(0.215, 0.61, 0.355, 1) 0s, opacity 0.3s ease 0s, height 0s linear 0.35s; + } + .navbar-nav .dropdown-item.show .dropdown-menu, + .dropdown.show .dropdown-menu, + .dropdown-btn.show .dropdown-menu { + transform: translate3d(0px, 0px, 0px); + visibility: visible !important; + } + .bootstrap-select .dropdown-menu { + -webkit-transition: all 150ms linear; + -moz-transition: all 150ms linear; + -o-transition: all 150ms linear; + -ms-transition: all 150ms linear; + transition: all 150ms linear; + } + .bootstrap-datetimepicker-widget { + visibility: visible !important; + } + .bootstrap-select .show .dropdown-menu { + transition: all 0.3s cubic-bezier(0.215, 0.61, 0.355, 1) 0s, opacity 0.3s ease 0s, height 0s linear 0.35s; + transform: translate3d(0px, 0px, 0px); + } + .navbar-nav.navbar-right li .dropdown-menu:before, + .navbar-nav.navbar-right li .dropdown-menu:after { + left: auto; + right: 12px; + } + .footer:not(.footer-big) nav ul li:first-child { + margin-left: 0; + } + body>.navbar-collapse.collapse { + display: none !important; + } +} + +.dropdown-sharing .dropup-item { + color: #66615b; + font-size: 14px; +} + +.dropdown-sharing .dropup-item .social-line { + line-height: 28px; + padding: 10px 20px 5px 20px !important; +} + +.dropdown-sharing .dropup-item .social-line [class*="icon-"] { + font-size: 20px; +} + +.dropdown-sharing .dropup-item:last-child { + margin: 0 13px; + display: block; +} + +.dropdown-sharing .dropup-item .btn { + margin: 10px; +} + +.dropdown-sharing .dropup-item:hover .social-line, +.dropdown-sharing .dropup-item:hover .action-line, +.dropdown-sharing .dropup-item:focus .social-line, +.dropdown-sharing .dropup-item:focus .action-line { + background-color: #FFFFFF; + color: #66615b; + opacity: 1; + text-decoration: none; +} + +.show .dropdown-sharing, +.show .dropdown-actions { + margin-bottom: 1px; +} + +.dropdown-actions .dropdown-item { + margin: -15px 35px; +} + +.dropdown-actions .dropdown-item .action-line { + padding: 5px 10px; + line-height: 24px; + font-weight: bold; +} + +.dropdown-actions .dropdown-item .action-line [class*="icon-"] { + font-size: 24px; +} + +.dropdown-actions .dropdown-item .action-line .col-sm-9 { + line-height: 34px; +} + +.dropdown-actions .dropdown-item .link-danger { + color: #ef8157; +} + +.dropdown-actions .dropdown-item .link-danger:hover, +.dropdown-actions .dropdown-item .link-danger:active, +.dropdown-actions .dropdown-item .link-danger:focus { + color: #ef8157; +} + +.dropdown-actions li:hover a, +.dropdown-actions li:focus a { + color: #66615b; + opacity: 1; + text-decoration: none; +} + +.dropdown-actions .action-line .icon-simple { + margin-left: -15px; +} + +.dropdown .dropdown-menu[x-placement="top-start"]:before, +.dropdown .dropdown-menu[x-placement="top-end"]:before, +.dropup .dropdown-menu:before { + border-top: 11px solid #DCD9D1; + border-left: 11px solid transparent; + border-right: 11px solid transparent; + content: ""; + display: inline-block; + position: absolute; + right: 12px; + bottom: -12px; +} + +.dropdown .dropdown-menu[x-placement="top-start"]:after, +.dropdown .dropdown-menu[x-placement="top-end"]:after, +.dropup .dropdown-menu:after { + border-top: 11px solid #FFF; + border-left: 11px solid transparent; + border-right: 11px solid transparent; + content: ""; + display: inline-block; + position: absolute; + right: 12px; + bottom: -11px; +} + +.dropup .dropdown-toggle:after, +.dropdown .dropdown-toggle:after { + margin-left: 0; +} + +.dropdown-notification .dropdown-notification-list .notification-item { + border-bottom: 1px solid #F1EAE0; + font-size: 16px; + color: #66615b; +} + +.dropdown-notification .dropdown-notification-list .notification-item .notification-text { + padding-left: 40px; + position: relative; + min-width: 330px; + min-height: 70px; + white-space: normal; +} + +.dropdown-notification .dropdown-notification-list .notification-item .notification-text .label { + display: block; + position: absolute; + top: 50%; + margin-top: -12px; + left: 7px; +} + +.dropdown-notification .dropdown-notification-list .notification-item .notification-text .message { + font-size: 0.9em; + line-height: 0.7; + margin-left: 10px; +} + +.dropdown-notification .dropdown-notification-list .notification-item .notification-text .time { + color: #9A9A9A; + font-size: 0.7em; + margin-left: 10px; +} + +.dropdown-notification .dropdown-notification-list .notification-item .read-notification { + font-size: 12px; + opacity: 0; + position: absolute; + right: 5px; + top: 50%; + margin-top: -12px; +} + +.dropdown-notification .dropdown-notification-list .notification-item:hover { + text-decoration: none; +} + +.dropdown-notification .dropdown-notification-list .notification-item:hover .notification-text { + color: #66615b; + background-color: #F0EFEB !important; +} + +.dropdown-notification .dropdown-notification-list .notification-item:hover .read-notification { + opacity: 1 !important; +} + +.dropdown-notification .dropdown-footer { + background-color: #E8E7E3; + border-radius: 0 0 8px 8px; +} + +.dropdown-notification .dropdown-footer .dropdown-footer-menu { + list-style: outside none none; + padding: 0px 5px; +} + +.dropdown-notification .dropdown-footer .dropdown-footer-menu li { + display: inline-block; + text-align: left; + padding: 0 10px; +} + +.dropdown-notification .dropdown-footer .dropdown-footer-menu li a { + color: #9C9B99; + font-size: 0.9em; + line-height: 35px; +} + +.alert { + border: 0; + border-radius: 3px; + color: #FFFFFF; + padding-top: .9rem; + padding-bottom: .9rem; + position: relative; +} + +.alert.alert-success { + background-color: #7ed6a5; +} + +.alert.alert-danger { + background-color: #f1926e; +} + +.alert.alert-warning { + background-color: #fccf71; +} + +.alert.alert-info { + background-color: #66c4de; +} + +.alert.alert-primary { + background-color: #65d1d4; +} + +.alert .close { + color: #FFFFFF; + opacity: .9; + text-shadow: none; + line-height: 0; + outline: 0; +} + +.alert .close i.fa, +.alert .close i.nc-icon { + font-size: 14px !important; +} + +.alert .close:hover, +.alert .close:focus { + opacity: 1; +} + +.alert span[data-notify="icon"] { + font-size: 27px; + display: block; + left: 19px; + position: absolute; + top: 50%; + margin-top: -11px; +} + +.alert button.close { + position: absolute; + right: 10px; + top: 50%; + margin-top: -13px; + width: 25px; + height: 25px; + padding: 3px; +} + +.alert .close~span { + display: block; + max-width: 89%; +} + +.alert.alert-with-icon { + padding-left: 65px; +} + +img { + max-width: 100%; + border-radius: 3px; +} + +.img-raised { + box-shadow: 0px 10px 25px 0px rgba(0, 0, 0, 0.3); +} + +/*-------------------------------- + +nucleo-icons Web Font - built using nucleoapp.com +License - nucleoapp.com/license/ + +-------------------------------- */ + +@font-face { + font-family: 'nucleo-icons'; + src: url("../fonts/nucleo-icons.eot"); + src: url("../fonts/nucleo-icons.eot") format("embedded-opentype"), url("../fonts/nucleo-icons.woff2") format("woff2"), url("../fonts/nucleo-icons.woff") format("woff"), url("../fonts/nucleo-icons.ttf") format("truetype"), url("../fonts/nucleo-icons.svg") format("svg"); + font-weight: normal; + font-style: normal; +} + +/*------------------------ + base class definition +-------------------------*/ + +.nc-icon { + display: inline-block; + font: normal normal normal 14px/1 'nucleo-icons'; + font-size: inherit; + speak: none; + text-transform: none; + /* Better Font Rendering */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/*------------------------ + change icon size +-------------------------*/ + +.nc-icon.lg { + font-size: 1.33333333em; + vertical-align: -16%; +} + +.nc-icon.x2 { + font-size: 2em; +} + +.nc-icon.x3 { + font-size: 3em; +} + +/*---------------------------------- + add a square/circle background +-----------------------------------*/ + +.nc-icon.square, +.nc-icon.circle { + padding: 0.33333333em; + vertical-align: -16%; + background-color: #eee; +} + +.nc-icon.circle { + border-radius: 50%; +} + +/*------------------------ + list icons +-------------------------*/ + +.nc-icon-ul { + padding-left: 0; + margin-left: 2.14285714em; + list-style-type: none; +} + +.nc-icon-ul>li { + position: relative; +} + +.nc-icon-ul>li>.nc-icon { + position: absolute; + left: -1.57142857em; + top: 0.14285714em; + text-align: center; +} + +.nc-icon-ul>li>.nc-icon.lg { + top: 0; + left: -1.35714286em; +} + +.nc-icon-ul>li>.nc-icon.circle, +.nc-icon-ul>li>.nc-icon.square { + top: -0.19047619em; + left: -1.9047619em; +} + +/*------------------------ + spinning icons +-------------------------*/ + +.nc-icon.spin { + -webkit-animation: nc-icon-spin 2s infinite linear; + -moz-animation: nc-icon-spin 2s infinite linear; + animation: nc-icon-spin 2s infinite linear; +} + +@-webkit-keyframes nc-icon-spin { + 0% { + -webkit-transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(360deg); + } +} + +@-moz-keyframes nc-icon-spin { + 0% { + -moz-transform: rotate(0deg); + } + 100% { + -moz-transform: rotate(360deg); + } +} + +@keyframes nc-icon-spin { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + -o-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -ms-transform: rotate(360deg); + -o-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +/*------------------------ + rotated/flipped icons +-------------------------*/ + +.nc-icon.rotate-90 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); + -webkit-transform: rotate(90deg); + -moz-transform: rotate(90deg); + -ms-transform: rotate(90deg); + -o-transform: rotate(90deg); + transform: rotate(90deg); +} + +.nc-icon.rotate-180 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + -webkit-transform: rotate(180deg); + -moz-transform: rotate(180deg); + -ms-transform: rotate(180deg); + -o-transform: rotate(180deg); + transform: rotate(180deg); +} + +.nc-icon.rotate-270 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); + -webkit-transform: rotate(270deg); + -moz-transform: rotate(270deg); + -ms-transform: rotate(270deg); + -o-transform: rotate(270deg); + transform: rotate(270deg); +} + +.nc-icon.flip-y { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0); + -webkit-transform: scale(-1, 1); + -moz-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + -o-transform: scale(-1, 1); + transform: scale(-1, 1); +} + +.nc-icon.flip-x { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + -webkit-transform: scale(1, -1); + -moz-transform: scale(1, -1); + -ms-transform: scale(1, -1); + -o-transform: scale(1, -1); + transform: scale(1, -1); +} + +/*------------------------ + font icons +-------------------------*/ + +.nc-air-baloon::before { + content: "\ea01"; +} + +.nc-album-2::before { + content: "\ea02"; +} + +.nc-alert-circle-i::before { + content: "\ea04"; +} + +.nc-align-center::before { + content: "\ea03"; +} + +.nc-align-left-2::before { + content: "\ea05"; +} + +.nc-ambulance::before { + content: "\ea06"; +} + +.nc-app::before { + content: "\ea07"; +} + +.nc-atom::before { + content: "\ea08"; +} + +.nc-badge::before { + content: "\ea09"; +} + +.nc-bag-16::before { + content: "\ea0a"; +} + +.nc-bank::before { + content: "\ea0b"; +} + +.nc-basket::before { + content: "\ea0c"; +} + +.nc-bell-55::before { + content: "\ea0d"; +} + +.nc-bold::before { + content: "\ea0e"; +} + +.nc-book-bookmark::before { + content: "\ea0f"; +} + +.nc-bookmark-2::before { + content: "\ea10"; +} + +.nc-box-2::before { + content: "\ea11"; +} + +.nc-box::before { + content: "\ea12"; +} + +.nc-briefcase-24::before { + content: "\ea13"; +} + +.nc-bulb-63::before { + content: "\ea14"; +} + +.nc-bullet-list-67::before { + content: "\ea15"; +} + +.nc-bus-front-12::before { + content: "\ea16"; +} + +.nc-button-pause::before { + content: "\ea17"; +} + +.nc-button-play::before { + content: "\ea18"; +} + +.nc-button-power::before { + content: "\ea19"; +} + +.nc-calendar-60::before { + content: "\ea1a"; +} + +.nc-camera-compact::before { + content: "\ea1b"; +} + +.nc-caps-small::before { + content: "\ea1c"; +} + +.nc-cart-simple::before { + content: "\ea1d"; +} + +.nc-chart-bar-32::before { + content: "\ea1e"; +} + +.nc-chart-pie-36::before { + content: "\ea1f"; +} + +.nc-chat-33::before { + content: "\ea20"; +} + +.nc-check-2::before { + content: "\ea21"; +} + +.nc-circle-10::before { + content: "\ea22"; +} + +.nc-cloud-download-93::before { + content: "\ea23"; +} + +.nc-cloud-upload-94::before { + content: "\ea24"; +} + +.nc-compass-05::before { + content: "\ea25"; +} + +.nc-controller-modern::before { + content: "\ea26"; +} + +.nc-credit-card::before { + content: "\ea27"; +} + +.nc-delivery-fast::before { + content: "\ea28"; +} + +.nc-diamond::before { + content: "\ea29"; +} + +.nc-email-85::before { + content: "\ea2a"; +} + +.nc-favourite-28::before { + content: "\ea2b"; +} + +.nc-glasses-2::before { + content: "\ea2c"; +} + +.nc-globe-2::before { + content: "\ea2d"; +} + +.nc-globe::before { + content: "\ea2e"; +} + +.nc-hat-3::before { + content: "\ea2f"; +} + +.nc-headphones::before { + content: "\ea30"; +} + +.nc-html5::before { + content: "\ea31"; +} + +.nc-image::before { + content: "\ea32"; +} + +.nc-istanbul::before { + content: "\ea33"; +} + +.nc-key-25::before { + content: "\ea34"; +} + +.nc-laptop::before { + content: "\ea35"; +} + +.nc-layout-11::before { + content: "\ea36"; +} + +.nc-lock-circle-open::before { + content: "\ea37"; +} + +.nc-map-big::before { + content: "\ea38"; +} + +.nc-minimal-down::before { + content: "\ea39"; +} + +.nc-minimal-left::before { + content: "\ea3a"; +} + +.nc-minimal-right::before { + content: "\ea3b"; +} + +.nc-minimal-up::before { + content: "\ea3c"; +} + +.nc-mobile::before { + content: "\ea3d"; +} + +.nc-money-coins::before { + content: "\ea3e"; +} + +.nc-note-03::before { + content: "\ea3f"; +} + +.nc-palette::before { + content: "\ea40"; +} + +.nc-paper::before { + content: "\ea41"; +} + +.nc-pin-3::before { + content: "\ea42"; +} + +.nc-planet::before { + content: "\ea43"; +} + +.nc-refresh-69::before { + content: "\ea44"; +} + +.nc-ruler-pencil::before { + content: "\ea45"; +} + +.nc-satisfied::before { + content: "\ea46"; +} + +.nc-scissors::before { + content: "\ea47"; +} + +.nc-send::before { + content: "\ea48"; +} + +.nc-settings-gear-65::before { + content: "\ea49"; +} + +.nc-settings::before { + content: "\ea4a"; +} + +.nc-share-66::before { + content: "\ea4b"; +} + +.nc-shop::before { + content: "\ea4c"; +} + +.nc-simple-add::before { + content: "\ea4d"; +} + +.nc-simple-delete::before { + content: "\ea4e"; +} + +.nc-simple-remove::before { + content: "\ea4f"; +} + +.nc-single-02::before { + content: "\ea50"; +} + +.nc-single-copy-04::before { + content: "\ea51"; +} + +.nc-sound-wave::before { + content: "\ea52"; +} + +.nc-spaceship::before { + content: "\ea53"; +} + +.nc-sun-fog-29::before { + content: "\ea54"; +} + +.nc-support-17::before { + content: "\ea55"; +} + +.nc-tablet-2::before { + content: "\ea56"; +} + +.nc-tag-content::before { + content: "\ea57"; +} + +.nc-tap-01::before { + content: "\ea58"; +} + +.nc-tie-bow::before { + content: "\ea59"; +} + +.nc-tile-56::before { + content: "\ea5a"; +} + +.nc-time-alarm::before { + content: "\ea5b"; +} + +.nc-touch-id::before { + content: "\ea5c"; +} + +.nc-trophy::before { + content: "\ea5d"; +} + +.nc-tv-2::before { + content: "\ea5e"; +} + +.nc-umbrella-13::before { + content: "\ea5f"; +} + +.nc-user-run::before { + content: "\ea60"; +} + +.nc-vector::before { + content: "\ea61"; +} + +.nc-watch-time::before { + content: "\ea62"; +} + +.nc-world-2::before { + content: "\ea63"; +} + +.nc-zoom-split::before { + content: "\ea64"; +} + +/* all icon font classes list here */ + +.table .img-wrapper { + width: 40px; + height: 40px; + border-radius: 50%; + overflow: hidden; + margin: 0 auto; +} + +.table .img-row { + max-width: 60px; + width: 60px; +} + +.table .form-check { + margin: 0; +} + +.table .form-check label .form-check-sign::before, +.table .form-check label .form-check-sign::after { + top: -17px; + left: 4px; +} + +.table .btn { + margin: 0; +} + +.table small, +.table .small { + font-weight: 300; +} + +.card-tasks .card-body .table { + margin-bottom: 0; +} + +.card-tasks .card-body .table>thead>tr>th, +.card-tasks .card-body .table>tbody>tr>th, +.card-tasks .card-body .table>tfoot>tr>th, +.card-tasks .card-body .table>thead>tr>td, +.card-tasks .card-body .table>tbody>tr>td, +.card-tasks .card-body .table>tfoot>tr>td { + padding-top: 0; + padding-bottom: 0; +} + +.table>thead>tr>th { + font-size: 14px; + font-weight: 700; + padding-bottom: 0; + text-transform: uppercase; + border: 0; +} + +.table .radio, +.table .checkbox { + margin-top: 0; + margin-bottom: 0; + padding: 0; + width: 15px; +} + +.table .radio .icons, +.table .checkbox .icons { + position: relative; +} + +.table .radio label:after, +.table .radio label:before, +.table .checkbox label:after, +.table .checkbox label:before { + top: -17px; + left: -3px; +} + +.table>thead>tr>th, +.table>tbody>tr>th, +.table>tfoot>tr>th, +.table>thead>tr>td, +.table>tbody>tr>td, +.table>tfoot>tr>td { + padding: 12px 7px; + vertical-align: middle; +} + +.table .th-description { + max-width: 150px; +} + +.table .td-price { + font-size: 26px; + font-weight: 300; + margin-top: 5px; + position: relative; + top: 4px; + text-align: right; +} + +.table .td-total { + font-weight: 700; + font-size: 1.57em; + padding-top: 20px; + text-align: right; +} + +.table .td-actions .btn { + margin: 0px; +} + +.table>tbody>tr { + position: relative; +} + +.table-shopping>thead>tr>th { + font-size: 1em; + text-transform: uppercase; +} + +.table-shopping>tbody>tr>td { + font-size: 1em; +} + +.table-shopping>tbody>tr>td b { + display: block; + margin-bottom: 5px; +} + +.table-shopping .td-name { + font-weight: 400; + font-size: 1.5em; +} + +.table-shopping .td-name small { + color: #9A9A9A; + font-size: 0.75em; + font-weight: 300; +} + +.table-shopping .td-number { + font-weight: 300; + font-size: 1.714em; +} + +.table-shopping .td-name { + min-width: 200px; +} + +.table-shopping .td-number { + text-align: right; + min-width: 170px; +} + +.table-shopping .td-number small { + margin-right: 3px; +} + +.table-shopping .img-container { + width: 120px; + max-height: 160px; + overflow: hidden; + display: block; +} + +.table-shopping .img-container img { + width: 100%; +} + +.table-responsive { + overflow: scroll; + padding-bottom: 10px; +} + +#tables .table-responsive { + margin-bottom: 30px; +} + +.table-hover>tbody>tr:hover { + background-color: #f5f5f5; +} + +.wrapper { + position: relative; + top: 0; + height: 100vh; +} + +.wrapper.wrapper-full-page { + min-height: 100vh; + height: auto; +} + +.sidebar, +.off-canvas-sidebar { + position: fixed; + top: 0; + height: 100%; + bottom: 0; + width: 260px; + left: 0; + z-index: 1030; + border-right: 1px solid #ddd; +} + +.sidebar .sidebar-wrapper, +.off-canvas-sidebar .sidebar-wrapper { + position: relative; + height: calc(100vh - 75px); + overflow: auto; + width: 260px; + z-index: 4; + padding-bottom: 100px; +} + +.sidebar .sidebar-wrapper .dropdown .dropdown-backdrop, +.off-canvas-sidebar .sidebar-wrapper .dropdown .dropdown-backdrop { + display: none !important; +} + +.sidebar .sidebar-wrapper .navbar-form, +.off-canvas-sidebar .sidebar-wrapper .navbar-form { + border: none; +} + +.sidebar .navbar-minimize, +.off-canvas-sidebar .navbar-minimize { + position: absolute; + right: 20px; + top: 2px; + opacity: 1; +} + +.sidebar .logo-tim, +.off-canvas-sidebar .logo-tim { + border-radius: 50%; + border: 1px solid #333; + display: block; + height: 61px; + width: 61px; + float: left; + overflow: hidden; +} + +.sidebar .logo-tim img, +.off-canvas-sidebar .logo-tim img { + width: 60px; + height: 60px; +} + +.sidebar .nav, +.off-canvas-sidebar .nav { + margin-top: 20px; + display: block; +} + +.sidebar .nav .caret, +.off-canvas-sidebar .nav .caret { + top: 14px; + position: absolute; + right: 10px; +} + +.sidebar .nav li>a+div .nav li>a, +.off-canvas-sidebar .nav li>a+div .nav li>a { + margin-top: 7px; +} + +.sidebar .nav li>a, +.off-canvas-sidebar .nav li>a { + margin: 10px 15px 0; + color: #FFFFFF; + display: block; + text-decoration: none; + position: relative; + text-transform: uppercase; + cursor: pointer; + font-size: 12px; + padding: 10px 8px; + line-height: 30px; + opacity: .7; +} + +.sidebar .nav li .nav>li>a, +.off-canvas-sidebar .nav li .nav>li>a { + padding: 5px 8px; +} + +.sidebar .nav li.active>a, +.sidebar .nav li.active>a>i, +.off-canvas-sidebar .nav li.active>a, +.off-canvas-sidebar .nav li.active>a>i { + opacity: 1; +} + +.sidebar .nav li:hover:not(.active)>a, +.sidebar .nav li:focus:not(.active)>a, +.off-canvas-sidebar .nav li:hover:not(.active)>a, +.off-canvas-sidebar .nav li:focus:not(.active)>a { + opacity: 1; +} + +.sidebar .nav i, +.off-canvas-sidebar .nav i { + font-size: 24px; + float: left; + margin-right: 12px; + line-height: 30px; + width: 34px; + text-align: center; + color: rgba(255, 255, 255, 0.5); + position: relative; +} + +.sidebar .nav p, +.off-canvas-sidebar .nav p { + margin-bottom: 0; +} + +.sidebar .nav .collapse .nav, +.sidebar .nav .collapsing .nav, +.off-canvas-sidebar .nav .collapse .nav, +.off-canvas-sidebar .nav .collapsing .nav { + margin-top: 0; +} + +.sidebar .sidebar-background, +.off-canvas-sidebar .sidebar-background { + position: absolute; + z-index: 1; + height: 100%; + width: 100%; + display: block; + top: 0; + left: 0; + background-size: cover; + background-position: center center; +} + +.sidebar .sidebar-background:after, +.off-canvas-sidebar .sidebar-background:after { + position: absolute; + z-index: 3; + width: 100%; + height: 100%; + content: ""; + display: block; + background: #FFFFFF; + opacity: 1; +} + +.sidebar .logo, +.off-canvas-sidebar .logo { + position: relative; + padding: 7px 0.7rem; + z-index: 4; +} + +.sidebar .logo a.logo-mini, +.off-canvas-sidebar .logo a.logo-mini { + opacity: 1; + float: left; + width: 34px; + text-align: center; + margin-left: 10px; + margin-right: 12px; +} + +.sidebar .logo a.logo-normal, +.off-canvas-sidebar .logo a.logo-normal { + display: block; + opacity: 1; + padding: 11px 0 8px; + -webkit-transform: translate3d(0px, 0, 0); + -moz-transform: translate3d(0px, 0, 0); + -o-transform: translate3d(0px, 0, 0); + -ms-transform: translate3d(0px, 0, 0); + transform: translate3d(0px, 0, 0); +} + +.sidebar .logo:after, +.off-canvas-sidebar .logo:after { + content: ''; + position: absolute; + bottom: 0; + right: 15px; + height: 1px; + width: calc(100% - 30px); + background-color: rgba(255, 255, 255, 0.5); +} + +.sidebar .logo p, +.off-canvas-sidebar .logo p { + float: left; + font-size: 20px; + margin: 10px 10px; + color: #FFFFFF; + line-height: 20px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +.sidebar .logo .simple-text, +.off-canvas-sidebar .logo .simple-text { + text-transform: uppercase; + padding: 0.5rem 0; + display: block; + white-space: nowrap; + font-size: 1rem; + color: #FFFFFF; + text-decoration: none; + font-weight: 400; + line-height: 30px; + overflow: hidden; +} + +.sidebar .logo-tim, +.off-canvas-sidebar .logo-tim { + border-radius: 50%; + border: 1px solid #333; + display: block; + height: 61px; + width: 61px; + float: left; + overflow: hidden; +} + +.sidebar .logo-tim img, +.off-canvas-sidebar .logo-tim img { + width: 60px; + height: 60px; +} + +.sidebar:before, +.sidebar:after, +.off-canvas-sidebar:before, +.off-canvas-sidebar:after { + display: block; + content: ""; + opacity: 1; + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; +} + +.sidebar:after, +.off-canvas-sidebar:after { + background: #66615B; + background: -webkit-linear-gradient(#66615B 0%, #000 80%); + background: -o-linear-gradient(#66615B 0%, #000 80%); + background: -moz-linear-gradient(#66615B 0%, #000 80%); + background: linear-gradient(#66615B 0%, #000 80%); + z-index: 3; +} + +.sidebar[data-color="white"]:after, +.off-canvas-sidebar[data-color="white"]:after { + background: #FFFFFF; +} + +.sidebar[data-color="white"] .nav li a, +.sidebar[data-color="white"] .nav li a i, +.sidebar[data-color="white"] .nav li a[data-toggle="collapse"], +.sidebar[data-color="white"] .nav li a[data-toggle="collapse"] i, +.sidebar[data-color="white"] .nav li a[data-toggle="collapse"]~div>ul>li .sidebar-mini-icon, +.sidebar[data-color="white"] .nav li a[data-toggle="collapse"]~div>ul>li>a, +.off-canvas-sidebar[data-color="white"] .nav li a, +.off-canvas-sidebar[data-color="white"] .nav li a i, +.off-canvas-sidebar[data-color="white"] .nav li a[data-toggle="collapse"], +.off-canvas-sidebar[data-color="white"] .nav li a[data-toggle="collapse"] i, +.off-canvas-sidebar[data-color="white"] .nav li a[data-toggle="collapse"]~div>ul>li .sidebar-mini-icon, +.off-canvas-sidebar[data-color="white"] .nav li a[data-toggle="collapse"]~div>ul>li>a { + color: #66615B; + opacity: .7; +} + +.sidebar[data-color="white"] .nav li:hover:not(.active)>a, +.sidebar[data-color="white"] .nav li:focus:not(.active)>a, +.off-canvas-sidebar[data-color="white"] .nav li:hover:not(.active)>a, +.off-canvas-sidebar[data-color="white"] .nav li:focus:not(.active)>a { + opacity: 1; +} + +.sidebar[data-color="white"] .logo .simple-text, +.off-canvas-sidebar[data-color="white"] .logo .simple-text { + color: #66615B; +} + +.sidebar[data-color="white"] .logo:after, +.off-canvas-sidebar[data-color="white"] .logo:after { + background-color: #66615B; + opacity: .4; +} + +.sidebar[data-color="white"] .user .info a span, +.sidebar[data-color="white"] .user .nav .sidebar-mini-icon, +.sidebar[data-color="white"] .user .nav .sidebar-normal, +.off-canvas-sidebar[data-color="white"] .user .info a span, +.off-canvas-sidebar[data-color="white"] .user .nav .sidebar-mini-icon, +.off-canvas-sidebar[data-color="white"] .user .nav .sidebar-normal { + color: #66615B !important; +} + +.sidebar[data-color="white"] .user:after, +.off-canvas-sidebar[data-color="white"] .user:after { + background-color: #66615B; + opacity: .4; +} + +.sidebar[data-color="black"]:after, +.off-canvas-sidebar[data-color="black"]:after { + background: #212120; +} + +.sidebar[data-active-color="primary"] .nav li.active>a, +.sidebar[data-active-color="primary"] .nav li.active>a i, +.sidebar[data-active-color="primary"] .nav li.active>a[data-toggle="collapse"], +.sidebar[data-active-color="primary"] .nav li.active>a[data-toggle="collapse"] i, +.sidebar[data-active-color="primary"] .nav li.active>a[data-toggle="collapse"]~div>ul>li.active .sidebar-mini-icon, +.sidebar[data-active-color="primary"] .nav li.active>a[data-toggle="collapse"]~div>ul>li.active>a, +.off-canvas-sidebar[data-active-color="primary"] .nav li.active>a, +.off-canvas-sidebar[data-active-color="primary"] .nav li.active>a i, +.off-canvas-sidebar[data-active-color="primary"] .nav li.active>a[data-toggle="collapse"], +.off-canvas-sidebar[data-active-color="primary"] .nav li.active>a[data-toggle="collapse"] i, +.off-canvas-sidebar[data-active-color="primary"] .nav li.active>a[data-toggle="collapse"]~div>ul>li.active .sidebar-mini-icon, +.off-canvas-sidebar[data-active-color="primary"] .nav li.active>a[data-toggle="collapse"]~div>ul>li.active>a { + color: #51cbce; + opacity: 1; +} + +.sidebar[data-active-color="info"] .nav li.active>a, +.sidebar[data-active-color="info"] .nav li.active>a i, +.sidebar[data-active-color="info"] .nav li.active>a[data-toggle="collapse"], +.sidebar[data-active-color="info"] .nav li.active>a[data-toggle="collapse"] i, +.sidebar[data-active-color="info"] .nav li.active>a[data-toggle="collapse"]~div>ul>li.active .sidebar-mini-icon, +.sidebar[data-active-color="info"] .nav li.active>a[data-toggle="collapse"]~div>ul>li.active>a, +.off-canvas-sidebar[data-active-color="info"] .nav li.active>a, +.off-canvas-sidebar[data-active-color="info"] .nav li.active>a i, +.off-canvas-sidebar[data-active-color="info"] .nav li.active>a[data-toggle="collapse"], +.off-canvas-sidebar[data-active-color="info"] .nav li.active>a[data-toggle="collapse"] i, +.off-canvas-sidebar[data-active-color="info"] .nav li.active>a[data-toggle="collapse"]~div>ul>li.active .sidebar-mini-icon, +.off-canvas-sidebar[data-active-color="info"] .nav li.active>a[data-toggle="collapse"]~div>ul>li.active>a { + color: #51bcda; + opacity: 1; +} + +.sidebar[data-active-color="success"] .nav li.active>a, +.sidebar[data-active-color="success"] .nav li.active>a i, +.sidebar[data-active-color="success"] .nav li.active>a[data-toggle="collapse"], +.sidebar[data-active-color="success"] .nav li.active>a[data-toggle="collapse"] i, +.sidebar[data-active-color="success"] .nav li.active>a[data-toggle="collapse"]~div>ul>li.active .sidebar-mini-icon, +.sidebar[data-active-color="success"] .nav li.active>a[data-toggle="collapse"]~div>ul>li.active>a, +.off-canvas-sidebar[data-active-color="success"] .nav li.active>a, +.off-canvas-sidebar[data-active-color="success"] .nav li.active>a i, +.off-canvas-sidebar[data-active-color="success"] .nav li.active>a[data-toggle="collapse"], +.off-canvas-sidebar[data-active-color="success"] .nav li.active>a[data-toggle="collapse"] i, +.off-canvas-sidebar[data-active-color="success"] .nav li.active>a[data-toggle="collapse"]~div>ul>li.active .sidebar-mini-icon, +.off-canvas-sidebar[data-active-color="success"] .nav li.active>a[data-toggle="collapse"]~div>ul>li.active>a { + color: #6bd098; + opacity: 1; +} + +.sidebar[data-active-color="warning"] .nav li.active>a, +.sidebar[data-active-color="warning"] .nav li.active>a i, +.sidebar[data-active-color="warning"] .nav li.active>a[data-toggle="collapse"], +.sidebar[data-active-color="warning"] .nav li.active>a[data-toggle="collapse"] i, +.sidebar[data-active-color="warning"] .nav li.active>a[data-toggle="collapse"]~div>ul>li.active .sidebar-mini-icon, +.sidebar[data-active-color="warning"] .nav li.active>a[data-toggle="collapse"]~div>ul>li.active>a, +.off-canvas-sidebar[data-active-color="warning"] .nav li.active>a, +.off-canvas-sidebar[data-active-color="warning"] .nav li.active>a i, +.off-canvas-sidebar[data-active-color="warning"] .nav li.active>a[data-toggle="collapse"], +.off-canvas-sidebar[data-active-color="warning"] .nav li.active>a[data-toggle="collapse"] i, +.off-canvas-sidebar[data-active-color="warning"] .nav li.active>a[data-toggle="collapse"]~div>ul>li.active .sidebar-mini-icon, +.off-canvas-sidebar[data-active-color="warning"] .nav li.active>a[data-toggle="collapse"]~div>ul>li.active>a { + color: #fbc658; + opacity: 1; +} + +.sidebar[data-active-color="danger"] .nav li.active>a, +.sidebar[data-active-color="danger"] .nav li.active>a i, +.sidebar[data-active-color="danger"] .nav li.active>a[data-toggle="collapse"], +.sidebar[data-active-color="danger"] .nav li.active>a[data-toggle="collapse"] i, +.sidebar[data-active-color="danger"] .nav li.active>a[data-toggle="collapse"]~div>ul>li.active .sidebar-mini-icon, +.sidebar[data-active-color="danger"] .nav li.active>a[data-toggle="collapse"]~div>ul>li.active>a, +.off-canvas-sidebar[data-active-color="danger"] .nav li.active>a, +.off-canvas-sidebar[data-active-color="danger"] .nav li.active>a i, +.off-canvas-sidebar[data-active-color="danger"] .nav li.active>a[data-toggle="collapse"], +.off-canvas-sidebar[data-active-color="danger"] .nav li.active>a[data-toggle="collapse"] i, +.off-canvas-sidebar[data-active-color="danger"] .nav li.active>a[data-toggle="collapse"]~div>ul>li.active .sidebar-mini-icon, +.off-canvas-sidebar[data-active-color="danger"] .nav li.active>a[data-toggle="collapse"]~div>ul>li.active>a { + color: #ef8157; + opacity: 1; +} + +.visible-on-sidebar-regular { + display: inline-block !important; +} + +.visible-on-sidebar-mini { + display: none !important; +} + +.off-canvas-sidebar .nav>li>a, +.off-canvas-sidebar .nav>li>a:hover { + color: #FFFFFF; +} + +.off-canvas-sidebar .nav>li>a:focus { + background: rgba(200, 200, 200, 0.2); +} + +.main-panel { + position: relative; + float: right; + width: calc(100% - 260px); + background-color: #f4f3ef; + -webkit-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -moz-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -o-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -ms-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); +} + +.main-panel>.content { + padding: 0 30px 30px; + min-height: calc(100vh - 123px); + margin-top: 93px; +} + +.main-panel>.navbar { + margin-bottom: 0; +} + +.main-panel .header { + margin-bottom: 50px; +} + +.perfect-scrollbar-on .sidebar, +.perfect-scrollbar-on .main-panel { + height: 100%; + max-height: 100%; +} + +.panel-header { + height: 260px; + padding-top: 80px; + padding-bottom: 45px; + background: #141E30; + /* fallback for old browsers */ + background: -webkit-gradient(linear, left top, right top, from(#0c2646), color-stop(60%, #204065), to(#2a5788)); + background: linear-gradient(to right, #0c2646 0%, #204065 60%, #2a5788 100%); + position: relative; + overflow: hidden; +} + +.panel-header .header .title { + color: #FFFFFF; +} + +.panel-header .header .category { + max-width: 600px; + color: rgba(255, 255, 255, 0.5); + margin: 0 auto; + font-size: 13px; +} + +.panel-header .header .category a { + color: #FFFFFF; +} + +.panel-header-sm { + height: 135px; +} + +.panel-header-lg { + height: 380px; +} + +.footer { + padding: 24px 0; +} + +.footer.footer-default { + background-color: #f2f2f2; +} + +.footer nav { + display: inline-block; + float: left; + padding-left: 0; +} + +.footer ul { + margin-bottom: 0; + padding: 0; + list-style: none; +} + +.footer ul li { + display: inline-block; +} + +.footer ul li a { + color: inherit; + padding: 0.5rem; + font-size: 0.8571em; + text-transform: uppercase; + text-decoration: none; +} + +.footer ul li a:hover { + text-decoration: none; +} + +.footer .copyright { + font-size: 0.8571em; + line-height: 1.8; +} + +.footer:after { + display: table; + clear: both; + content: " "; +} + +.fixed-plugin { + position: fixed; + right: 0; + width: 64px; + background: rgba(0, 0, 0, 0.3); + z-index: 1031; + border-radius: 8px 0 0 8px; + text-align: center; + top: 120px; +} + +.fixed-plugin li>a, +.fixed-plugin .badge { + transition: all .34s; + -webkit-transition: all .34s; + -moz-transition: all .34s; +} + +.fixed-plugin .fa-cog { + color: #FFFFFF; + padding: 10px; + border-radius: 0 0 6px 6px; + width: auto; +} + +.fixed-plugin .dropdown-menu { + right: 80px; + left: auto !important; + top: -52px !important; + width: 290px; + border-radius: 10px; + padding: 0 10px; +} + +.fixed-plugin .dropdown .dropdown-menu .nc-icon { + top: 2px; + right: 10px; + font-size: 14px; +} + +.fixed-plugin .dropdown-menu:after, +.fixed-plugin .dropdown-menu:before { + right: 10px; + margin-left: auto; + left: auto; +} + +.fixed-plugin .fa-circle-thin { + color: #FFFFFF; +} + +.fixed-plugin .active .fa-circle-thin { + color: #00bbff; +} + +.fixed-plugin .dropdown-menu>.active>a, +.fixed-plugin .dropdown-menu>.active>a:hover, +.fixed-plugin .dropdown-menu>.active>a:focus { + color: #777777; + text-align: center; +} + +.fixed-plugin img { + border-radius: 0; + width: 100%; + height: 100px; + margin: 0 auto; +} + +.fixed-plugin .dropdown-menu li>a:hover, +.fixed-plugin .dropdown-menu li>a:focus { + box-shadow: none; +} + +.fixed-plugin .badge { + border: 3px solid #FFFFFF; + border-radius: 50%; + cursor: pointer; + display: inline-block; + height: 23px; + margin-right: 5px; + position: relative; + width: 23px; +} + +.fixed-plugin .badge.badge-light { + border: 1px solid #E3E3E3; +} + +.fixed-plugin .badge.badge-light.active, +.fixed-plugin .badge.badge-light:hover { + border: 3px solid #0bf; +} + +.fixed-plugin .badge.active, +.fixed-plugin .badge:hover { + border-color: #00bbff; +} + +.fixed-plugin .badge-blue { + background-color: #51bcda; +} + +.fixed-plugin .badge-green { + background-color: #6bd098; +} + +.fixed-plugin .badge-orange { + background-color: #51cbce; +} + +.fixed-plugin .badge-yellow { + background-color: #fbc658; +} + +.fixed-plugin .badge-red { + background-color: #ef8157; +} + +.fixed-plugin h5 { + font-size: 14px; + margin: 10px; +} + +.fixed-plugin .dropdown-menu li { + display: block; + padding: 15px 2px; + width: 25%; + float: left; +} + +.fixed-plugin li.adjustments-line, +.fixed-plugin li.header-title, +.fixed-plugin li.button-container { + width: 100%; + height: 35px; + min-height: inherit; +} + +.fixed-plugin li.button-container { + height: auto; +} + +.fixed-plugin li.button-container div { + margin-bottom: 5px; +} + +.fixed-plugin #sharrreTitle { + text-align: center; + padding: 10px 0; + height: 50px; +} + +.fixed-plugin li.header-title { + height: 30px; + line-height: 25px; + font-size: 12px; + font-weight: 600; + text-align: center; + text-transform: uppercase; +} + +.fixed-plugin .adjustments-line p { + float: left; + display: inline-block; + margin-bottom: 0; + font-size: 1em; + color: #3C4858; +} + +.fixed-plugin .adjustments-line a { + color: transparent; +} + +.fixed-plugin .adjustments-line a .badge-colors { + position: relative; + top: -2px; +} + +.fixed-plugin .adjustments-line a a:hover, +.fixed-plugin .adjustments-line a a:focus { + color: transparent; +} + +.fixed-plugin .adjustments-line .togglebutton { + text-align: center; +} + +.fixed-plugin .adjustments-line .togglebutton .label-switch { + position: relative; + left: -10px; + font-size: 0.7142em; + color: #66615B; +} + +.fixed-plugin .adjustments-line .togglebutton .label-switch.label-right { + left: 10px; +} + +.fixed-plugin .adjustments-line .togglebutton .toggle { + margin-right: 0; +} + +.fixed-plugin .adjustments-line .dropdown-menu>li.adjustments-line>a { + padding-right: 0; + padding-left: 0; + border-bottom: 1px solid #ddd; + border-radius: 0; + margin: 0; +} + +.fixed-plugin .dropdown-menu>li>a.img-holder { + font-size: 16px; + text-align: center; + border-radius: 10px; + background-color: #FFF; + border: 3px solid #FFF; + padding-left: 0; + padding-right: 0; + opacity: 1; + cursor: pointer; + display: block; + max-height: 100px; + overflow: hidden; + padding: 0; +} + +.fixed-plugin .dropdown-menu>li>a.img-holder img { + margin-top: auto; +} + +.fixed-plugin .dropdown-menu>li a.switch-trigger:hover, +.fixed-plugin .dropdown-menu>li>a.switch-trigger:focus { + background-color: transparent; +} + +.fixed-plugin .dropdown-menu>li:hover>a.img-holder, +.fixed-plugin .dropdown-menu>li:focus>a.img-holder { + border-color: rgba(0, 187, 255, 0.53); +} + +.fixed-plugin .dropdown-menu>.active>a.img-holder, +.fixed-plugin .dropdown-menu>.active>a.img-holder { + border-color: #00bbff; + background-color: #FFFFFF; +} + +.fixed-plugin .btn-social { + width: 50%; + display: block; + width: 48%; + float: left; + font-weight: 600; +} + +.fixed-plugin .btn-social i { + margin-right: 5px; +} + +.fixed-plugin .btn-social:first-child { + margin-right: 2%; +} + +.fixed-plugin .dropdown .dropdown-menu { + transform-origin: 0 0; +} + +.fixed-plugin .dropdown .dropdown-menu:before { + border-bottom: 16px solid transparent; + border-left: 16px solid rgba(0, 0, 0, 0.2); + border-top: 16px solid transparent; + right: -27px; + bottom: 425px; +} + +.fixed-plugin .dropdown .dropdown-menu:after { + border-bottom: 16px solid transparent; + border-left: 16px solid #FFFFFF; + border-top: 16px solid transparent; + right: -26px; + bottom: 425px; +} + +.fixed-plugin .dropdown .dropdown-menu:before, +.fixed-plugin .dropdown .dropdown-menu:after { + content: ""; + display: inline-block; + position: absolute; + width: 16px; + transform: translateY(-50px); + -webkit-transform: translateY(-50px); + -moz-transform: translateY(-50px); +} + +.fixed-plugin .dropdown.show-dropdown .show .dropdown-menu .show { + transform: translate3d(0, -60px, 0) !important; + bottom: auto !important; + top: 0 !important; +} + +.fixed-plugin .bootstrap-switch { + margin: 0; +} + +.fixed-plugin .show-dropdown .dropdown-menu[x-placement=bottom-start] { + -webkit-transform: translate3d(0, -100px, 0) !important; + -moz-transform: translate3d(0, -100px, 0) !important; + -o-transform: translate3d(0, -100px, 0) !important; + -ms-transform: translate3d(0, -100px, 0) !important; + transform: translate3d(0, -100px, 0) !important; +} + +.fixed-plugin .show-dropdown .dropdown-menu[x-placement=bottom-start]:before, +.fixed-plugin .show-dropdown .dropdown-menu[x-placement=bottom-start]:after { + top: 100px; +} + +.fixed-plugin .show-dropdown .dropdown-menu[x-placement=top-start] { + -webkit-transform: translate3d(0, 100px, 0) !important; + -moz-transform: translate3d(0, 100px, 0) !important; + -o-transform: translate3d(0, 100px, 0) !important; + -ms-transform: translate3d(0, 100px, 0) !important; + transform: translate3d(0, 100px, 0) !important; +} + +.fixed-plugin .show-dropdown.show .dropdown-menu.show[x-placement=bottom-start] { + -webkit-transform: translate3d(0, -60px, 0) !important; + -moz-transform: translate3d(0, -60px, 0) !important; + -o-transform: translate3d(0, -60px, 0) !important; + -ms-transform: translate3d(0, -60px, 0) !important; + transform: translate3d(0, -60px, 0) !important; +} + +.fixed-plugin .show-dropdown.show .dropdown-menu.show[x-placement=top-start] { + -webkit-transform: translate3d(0, 470px, 0) !important; + -moz-transform: translate3d(0, 470px, 0) !important; + -o-transform: translate3d(0, 470px, 0) !important; + -ms-transform: translate3d(0, 470px, 0) !important; + transform: translate3d(0, 470px, 0) !important; +} + +.card { + border-radius: 12px; + box-shadow: 0 6px 10px -4px rgba(0, 0, 0, 0.15); + background-color: #FFFFFF; + color: #252422; + margin-bottom: 20px; + position: relative; + border: 0 none; + -webkit-transition: transform 300ms cubic-bezier(0.34, 2, 0.6, 1), box-shadow 200ms ease; + -moz-transition: transform 300ms cubic-bezier(0.34, 2, 0.6, 1), box-shadow 200ms ease; + -o-transition: transform 300ms cubic-bezier(0.34, 2, 0.6, 1), box-shadow 200ms ease; + -ms-transition: transform 300ms cubic-bezier(0.34, 2, 0.6, 1), box-shadow 200ms ease; + transition: transform 300ms cubic-bezier(0.34, 2, 0.6, 1), box-shadow 200ms ease; +} + +.card .card-body { + padding: 15px 15px 10px 15px; +} + +.card .card-body.table-full-width { + padding-left: 0; + padding-right: 0; +} + +.card .card-header { + padding: 15px 15px 0; + border: 0; +} + +.card .card-header:not([data-background-color]) { + background-color: transparent; +} + +.card .card-header .card-title { + margin-top: 10px; +} + +.card .map { + border-radius: 3px; +} + +.card .map.map-big { + height: 400px; +} + +.card[data-background-color="orange"] { + background-color: #51cbce; +} + +.card[data-background-color="orange"] .card-header { + background-color: #51cbce; +} + +.card[data-background-color="orange"] .card-footer .stats { + color: #FFFFFF; +} + +.card[data-background-color="red"] { + background-color: #ef8157; +} + +.card[data-background-color="yellow"] { + background-color: #fbc658; +} + +.card[data-background-color="blue"] { + background-color: #51bcda; +} + +.card[data-background-color="green"] { + background-color: #6bd098; +} + +.card .image { + overflow: hidden; + height: 200px; + position: relative; +} + +.card .avatar { + width: 30px; + height: 30px; + overflow: hidden; + border-radius: 50%; + margin-bottom: 15px; +} + +.card .numbers { + font-size: 2em; +} + +.card .big-title { + font-size: 12px; + text-align: center; + font-weight: 500; + padding-bottom: 15px; +} + +.card label { + font-size: 0.8571em; + margin-bottom: 5px; + color: #9A9A9A; +} + +.card .card-footer { + background-color: transparent; + border: 0; +} + +.card .card-footer .stats i { + margin-right: 5px; + position: relative; + top: 0px; + color: #66615B; +} + +.card .card-footer .btn { + margin: 0; +} + +.card.card-plain { + background-color: transparent; + box-shadow: none; + border-radius: 0; +} + +.card.card-plain .card-body { + padding-left: 5px; + padding-right: 5px; +} + +.card.card-plain img { + border-radius: 12px; +} + +.card-plain { + background: transparent; + box-shadow: none; +} + +.card-plain .card-header, +.card-plain .card-footer { + margin-left: 0; + margin-right: 0; + background-color: transparent; +} + +.card-plain:not(.card-subcategories).card-body { + padding-left: 0; + padding-right: 0; +} + +.card-chart .card-header .card-title { + margin-top: 10px; + margin-bottom: 0; +} + +.card-chart .card-header .card-category { + margin-bottom: 5px; +} + +.card-chart .table { + margin-bottom: 0; +} + +.card-chart .table td { + border-top: none; + border-bottom: 1px solid #e9ecef; +} + +.card-chart .card-progress { + margin-top: 30px; +} + +.card-chart .chart-area { + height: 190px; + width: calc(100% + 30px); + margin-left: -15px; + margin-right: -15px; +} + +.card-chart .card-footer { + margin-top: 15px; +} + +.card-chart .card-footer .stats { + color: #9A9A9A; +} + +.card-chart .dropdown { + position: absolute; + right: 20px; + top: 20px; +} + +.card-chart .dropdown .btn { + margin: 0; +} + +.card-user .image { + height: 130px; +} + +.card-user .image img { + border-radius: 12px; +} + +.card-user .author { + text-align: center; + text-transform: none; + margin-top: -77px; +} + +.card-user .author a+p.description { + margin-top: -7px; +} + +.card-user .avatar { + width: 124px; + height: 124px; + border: 1px solid #FFFFFF; + position: relative; +} + +.card-user .card-body { + min-height: 240px; +} + +.card-user hr { + margin: 5px 15px 15px; +} + +.card-user .card-body+.card-footer { + padding-top: 0; +} + +.card-user .card-footer h5 { + font-size: 1.25em; + margin-bottom: 0; +} + +.card-user .button-container { + margin-bottom: 6px; + text-align: center; +} + +.map { + height: 500px; +} + +.card-stats .card-body { + padding: 15px 15px 0px; +} + +.card-stats .card-body .numbers { + text-align: right; + font-size: 2em; +} + +.card-stats .card-body .numbers p { + margin-bottom: 0; +} + +.card-stats .card-body .numbers .card-category { + color: #9A9A9A; + font-size: 16px; + line-height: 1.4em; +} + +.card-stats .card-footer { + padding: 0px 15px 15px; +} + +.card-stats .card-footer .stats { + color: #9A9A9A; +} + +.card-stats .card-footer hr { + margin-top: 10px; + margin-bottom: 15px; +} + +.card-stats .icon-big { + font-size: 3em; + min-height: 64px; +} + +.card-stats .icon-big i { + line-height: 59px; +} + +@media screen and (max-width: 991px) { + .navbar { + padding: 0; + } + .navbar.navbar-absolute { + padding-top: 0; + } + .navbar .navbar-brand { + font-size: 16px; + margin-right: 0; + } + .profile-photo .profile-photo-small { + margin-left: -2px; + } + .button-dropdown { + display: none; + } + #minimizeSidebar { + display: none; + } + .navbar .container-fluid { + padding-right: 15px; + padding-left: 15px; + } + .navbar .navbar-collapse .input-group { + margin: 0; + margin-top: 5px; + } + .navbar .navbar-nav .nav-item:first-child { + margin-top: 10px; + } + .navbar .navbar-nav .nav-item:not(:last-child) { + margin-bottom: 10px; + } + .navbar .dropdown.show .dropdown-menu { + display: block; + } + .navbar .dropdown .dropdown-menu { + display: none; + } + .navbar .dropdown.show .dropdown-menu, + .navbar .dropdown .dropdown-menu { + border: 0; + transition: none; + -webkit-box-shadow: none; + width: auto; + margin: 0px 1rem; + margin-top: 0px; + box-shadow: none; + position: static; + padding-left: 10px; + } + .navbar .dropdown.show .dropdown-menu:before, + .navbar .dropdown .dropdown-menu:before { + display: none; + } + .navbar .dropdown-menu .dropdown-item:focus, + .navbar .dropdown-menu .dropdown-item:hover { + color: #FFFFFF; + } + .navbar.bg-white .dropdown-menu .dropdown-item:focus, + .navbar.bg-white .dropdown-menu .dropdown-item:hover { + color: #66615B; + } + .navbar .navbar-toggler-bar { + display: block; + position: relative; + width: 22px; + height: 1px; + border-radius: 1px; + background: #66615B; + } + .navbar .navbar-toggler-bar+.navbar-toggler-bar { + margin-top: 7px; + } + .navbar .navbar-toggler-bar+.navbar-toggler-bar.navbar-kebab { + margin-top: 3px; + } + .navbar .navbar-toggler-bar.bar2 { + width: 17px; + transition: width .2s linear; + } + .navbar.bg-white:not(.navbar-transparent) .navbar-toggler-bar { + background-color: #66615B; + } + .navbar .toggled .navbar-toggler-bar { + width: 24px; + } + .navbar .toggled .navbar-toggler-bar+.navbar-toggler-bar { + margin-top: 5px; + } + .wrapper { + -webkit-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -moz-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -o-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -ms-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + } + .nav-open .main-panel { + right: 0; + -webkit-transform: translate3d(260px, 0, 0); + -moz-transform: translate3d(260px, 0, 0); + -o-transform: translate3d(260px, 0, 0); + -ms-transform: translate3d(260px, 0, 0); + transform: translate3d(260px, 0, 0); + } + .nav-open .sidebar { + -webkit-transform: translate3d(0px, 0, 0); + -moz-transform: translate3d(0px, 0, 0); + -o-transform: translate3d(0px, 0, 0); + -ms-transform: translate3d(0px, 0, 0); + transform: translate3d(0px, 0, 0); + } + .nav-open body { + position: relative; + overflow-x: hidden; + } + .nav-open .menu-on-right .main-panel { + -webkit-transform: translate3d(-260px, 0, 0); + -moz-transform: translate3d(-260px, 0, 0); + -o-transform: translate3d(-260px, 0, 0); + -ms-transform: translate3d(-260px, 0, 0); + transform: translate3d(-260px, 0, 0); + } + .nav-open .menu-on-right .navbar-collapse, + .nav-open .menu-on-right .sidebar { + -webkit-transform: translate3d(0px, 0, 0); + -moz-transform: translate3d(0px, 0, 0); + -o-transform: translate3d(0px, 0, 0); + -ms-transform: translate3d(0px, 0, 0); + transform: translate3d(0px, 0, 0); + } + .nav-open .menu-on-right .navbar-translate { + -webkit-transform: translate3d(-300px, 0, 0); + -moz-transform: translate3d(-300px, 0, 0); + -o-transform: translate3d(-300px, 0, 0); + -ms-transform: translate3d(-300px, 0, 0); + transform: translate3d(-300px, 0, 0); + } + .nav-open .menu-on-right #bodyClick { + right: 260px; + left: auto; + } + .menu-on-right .sidebar { + left: auto; + right: 0; + -webkit-transform: translate3d(260px, 0, 0); + -moz-transform: translate3d(260px, 0, 0); + -o-transform: translate3d(260px, 0, 0); + -ms-transform: translate3d(260px, 0, 0); + transform: translate3d(260px, 0, 0); + } + .bar1, + .bar2, + .bar3 { + outline: 1px solid transparent; + } + .bar1 { + top: 0px; + -webkit-animation: topbar-back 500ms linear 0s; + -moz-animation: topbar-back 500ms linear 0s; + animation: topbar-back 500ms 0s; + -webkit-animation-fill-mode: forwards; + -moz-animation-fill-mode: forwards; + animation-fill-mode: forwards; + } + .bar2 { + opacity: 1; + } + .bar3 { + bottom: 0px; + -webkit-animation: bottombar-back 500ms linear 0s; + -moz-animation: bottombar-back 500ms linear 0s; + animation: bottombar-back 500ms 0s; + -webkit-animation-fill-mode: forwards; + -moz-animation-fill-mode: forwards; + animation-fill-mode: forwards; + } + .toggled .bar1 { + top: 6px; + -webkit-animation: topbar-x 500ms linear 0s; + -moz-animation: topbar-x 500ms linear 0s; + animation: topbar-x 500ms 0s; + -webkit-animation-fill-mode: forwards; + -moz-animation-fill-mode: forwards; + animation-fill-mode: forwards; + } + .toggled .bar2 { + opacity: 0; + } + .toggled .bar3 { + bottom: 6px; + -webkit-animation: bottombar-x 500ms linear 0s; + -moz-animation: bottombar-x 500ms linear 0s; + animation: bottombar-x 500ms 0s; + -webkit-animation-fill-mode: forwards; + -moz-animation-fill-mode: forwards; + animation-fill-mode: forwards; + } + @keyframes topbar-x { + 0% { + top: 0px; + transform: rotate(0deg); + } + 45% { + top: 6px; + transform: rotate(145deg); + } + 75% { + transform: rotate(130deg); + } + 100% { + transform: rotate(135deg); + } + } + @-webkit-keyframes topbar-x { + 0% { + top: 0px; + -webkit-transform: rotate(0deg); + } + 45% { + top: 6px; + -webkit-transform: rotate(145deg); + } + 75% { + -webkit-transform: rotate(130deg); + } + 100% { + -webkit-transform: rotate(135deg); + } + } + @-moz-keyframes topbar-x { + 0% { + top: 0px; + -moz-transform: rotate(0deg); + } + 45% { + top: 6px; + -moz-transform: rotate(145deg); + } + 75% { + -moz-transform: rotate(130deg); + } + 100% { + -moz-transform: rotate(135deg); + } + } + @keyframes topbar-back { + 0% { + top: 6px; + transform: rotate(135deg); + } + 45% { + transform: rotate(-10deg); + } + 75% { + transform: rotate(5deg); + } + 100% { + top: 0px; + transform: rotate(0); + } + } + @-webkit-keyframes topbar-back { + 0% { + top: 6px; + -webkit-transform: rotate(135deg); + } + 45% { + -webkit-transform: rotate(-10deg); + } + 75% { + -webkit-transform: rotate(5deg); + } + 100% { + top: 0px; + -webkit-transform: rotate(0); + } + } + @-moz-keyframes topbar-back { + 0% { + top: 6px; + -moz-transform: rotate(135deg); + } + 45% { + -moz-transform: rotate(-10deg); + } + 75% { + -moz-transform: rotate(5deg); + } + 100% { + top: 0px; + -moz-transform: rotate(0); + } + } + @keyframes bottombar-x { + 0% { + bottom: 0px; + transform: rotate(0deg); + } + 45% { + bottom: 6px; + transform: rotate(-145deg); + } + 75% { + transform: rotate(-130deg); + } + 100% { + transform: rotate(-135deg); + } + } + @-webkit-keyframes bottombar-x { + 0% { + bottom: 0px; + -webkit-transform: rotate(0deg); + } + 45% { + bottom: 6px; + -webkit-transform: rotate(-145deg); + } + 75% { + -webkit-transform: rotate(-130deg); + } + 100% { + -webkit-transform: rotate(-135deg); + } + } + @-moz-keyframes bottombar-x { + 0% { + bottom: 0px; + -moz-transform: rotate(0deg); + } + 45% { + bottom: 6px; + -moz-transform: rotate(-145deg); + } + 75% { + -moz-transform: rotate(-130deg); + } + 100% { + -moz-transform: rotate(-135deg); + } + } + @keyframes bottombar-back { + 0% { + bottom: 6px; + transform: rotate(-135deg); + } + 45% { + transform: rotate(10deg); + } + 75% { + transform: rotate(-5deg); + } + 100% { + bottom: 0px; + transform: rotate(0); + } + } + @-webkit-keyframes bottombar-back { + 0% { + bottom: 6px; + -webkit-transform: rotate(-135deg); + } + 45% { + -webkit-transform: rotate(10deg); + } + 75% { + -webkit-transform: rotate(-5deg); + } + 100% { + bottom: 0px; + -webkit-transform: rotate(0); + } + } + @-moz-keyframes bottombar-back { + 0% { + bottom: 6px; + -moz-transform: rotate(-135deg); + } + 45% { + -moz-transform: rotate(10deg); + } + 75% { + -moz-transform: rotate(-5deg); + } + 100% { + bottom: 0px; + -moz-transform: rotate(0); + } + } + @-webkit-keyframes fadeIn { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } + } + @-moz-keyframes fadeIn { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } + } + @keyframes fadeIn { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } + } + #bodyClick { + height: 100%; + width: 100%; + position: fixed; + opacity: 1; + top: 0; + right: 0; + left: 260px; + content: ""; + z-index: 9999; + overflow-x: hidden; + background-color: transparent; + -webkit-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -moz-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -o-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -ms-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + } + .footer .copyright { + text-align: right; + } + .section-nucleo-icons .icons-container { + margin-top: 65px; + } + .navbar-nav .nav-link i.fa, + .navbar-nav .nav-link i.nc-icon { + opacity: .5; + } + .sidebar, + .bootstrap-navbar { + position: fixed; + display: block; + top: 0; + height: 100%; + width: 260px; + right: auto; + left: 0; + z-index: 1032; + visibility: visible; + overflow-y: visible; + padding: 0; + -webkit-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -moz-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -o-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -ms-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -webkit-transform: translate3d(-260px, 0, 0); + -moz-transform: translate3d(-260px, 0, 0); + -o-transform: translate3d(-260px, 0, 0); + -ms-transform: translate3d(-260px, 0, 0); + transform: translate3d(-260px, 0, 0); + } + .main-panel { + width: 100%; + } + .timeline:before { + left: 5% !important; + } + .timeline>li>.timeline-badge { + left: 5% !important; + } + .timeline>li>.timeline-panel { + float: right !important; + width: 82% !important; + } + .timeline>li>.timeline-panel:before { + border-left-width: 0 !important; + border-right-width: 15px !important; + left: -15px !important; + right: auto !important; + } + .timeline>li>.timeline-panel:after { + border-left-width: 0 !important; + border-right-width: 14px !important; + left: -14px !important; + right: auto !important; + } +} + +@media (max-width: 991px) and (min-width: 768px) { + .nav-tabs-navigation.verical-navs { + padding: 0px 2px; + } +} + +@media screen and (min-width: 768px) { + .footer .footer-nav { + padding-left: 21px; + } + .footer .credits { + padding-right: 15px; + } +} + +@media screen and (min-width: 992px) { + .navbar-collapse { + background: none !important; + } + .navbar .navbar-toggle { + display: none; + } + .navbar-nav .nav-link.profile-photo { + padding: 0; + margin: 7px 0.7rem; + } + .section-nucleo-icons .icons-container { + margin: 0 0 0 auto; + } + .dropdown-menu .dropdown-item { + color: inherit; + } + .footer .copyright { + float: right; + padding-right: 15px; + } + .sidebar .sidebar-wrapper li.active>a:not([data-toggle="collapse"]):before, + .sidebar .sidebar-wrapper li.active>[data-toggle="collapse"]+div .nav li:before { + border-right: 17px solid #DDDDDD; + border-top: 17px solid transparent; + border-bottom: 17px solid transparent; + content: ""; + display: inline-block; + position: absolute; + right: -16px; + opacity: 1; + top: 7px; + transition: opacity 150ms ease-in; + } + .sidebar .sidebar-wrapper li.active>a:not([data-toggle="collapse"]):after, + .sidebar .sidebar-wrapper li.active>[data-toggle="collapse"]+div .nav li:after { + border-right: 17px solid #f4f3ef; + border-top: 17px solid transparent; + border-bottom: 17px solid transparent; + content: ""; + display: inline-block; + position: absolute; + right: -17px; + opacity: 1; + top: 7px; + transition: opacity 150ms ease-in; + } + .sidebar .sidebar-wrapper li.active>[data-toggle="collapse"]+div .nav li a:before, + .sidebar .sidebar-wrapper li.active>[data-toggle="collapse"]+div .nav li a:after { + top: 0; + } +} + +@media screen and (max-width: 768px) { + .card-stats [class*="col-"] .statistics::after { + display: none; + } + .main-panel .content { + padding-left: 15px; + padding-right: 15px; + } + .footer nav { + display: block; + margin-bottom: 5px; + float: none; + } + .landing-page .section-story-overview .image-container:nth-child(2) { + margin-left: 0; + margin-bottom: 30px; + } + .card .form-horizontal .col-md-3.col-form-label { + text-align: left; + } +} + +@media screen and (max-width: 767px) { + .nav-tabs-navigation.verical-navs { + padding: 0 28px; + } + .typography-line { + padding-left: 23% !important; + } + .typography-line span { + width: 60px !important; + } + .login-page .navbar, + .lock-page .navbar, + .register-page .navbar { + padding: .5rem 1rem; + } + .footer .footer-nav, + .footer .credits { + margin: 0 auto !important; + } + .footer .footer-nav { + margin-bottom: 10px !important; + } + .register-page .content { + padding-top: 5vh; + } + .register-page .footer { + position: relative; + } + .register-page .info-area.info-horizontal { + margin-top: 0; + } +} + +@media screen and (max-width: 374px) { + .login-page .content { + padding-top: 10vh; + } +} + +@media screen and (max-width: 413px) { + .fixed-plugin .dropdown.show-dropdown.show .dropdown-menu.show { + width: 225px !important; + } + .fixed-plugin .dropdown.show-dropdown.show .dropdown-menu.show[x-placement=top-start] { + transform: translate3d(0, 400px, 0) !important; + } + .fixed-plugin .dropdown.show-dropdown.show .dropdown-menu.show:before, + .fixed-plugin .dropdown.show-dropdown.show .dropdown-menu.show:after { + bottom: 360px !important; + } +} + +@media screen and (max-width: 576px) { + .navbar[class*='navbar-toggleable-'] .container { + margin-left: 0; + margin-right: 0; + } + .card-contributions .card-stats { + flex-direction: column; + } + .card-contributions .card-stats .bootstrap-switch { + margin-bottom: 15px; + } + .footer .copyright { + text-align: center; + } + .section-nucleo-icons .icons-container i { + font-size: 30px; + } + .section-nucleo-icons .icons-container i:nth-child(6) { + font-size: 48px; + } + .page-header .container h6.category-absolute { + width: 90%; + } + .card-timeline .timeline .timeline-panel { + width: 38%; + padding: 15px; + } +} + +/*# sourceMappingURL=dashboard-free.css.map */ \ No newline at end of file diff --git a/explorer/public/paper-dashboard/assets/css/paper-dashboard.css.map b/explorer/public/paper-dashboard/assets/css/paper-dashboard.css.map new file mode 100644 index 00000000000..4f425c6f772 --- /dev/null +++ b/explorer/public/paper-dashboard/assets/css/paper-dashboard.css.map @@ -0,0 +1,78 @@ +{ + "version": 3, + "file": "dashboard-free.css", + "sources": [ + "../scss/dashboard-free.scss", + "../scss/dashboard/core/_variables.scss", + "../scss/dashboard/core/_mixins.scss", + "../scss/dashboard/core/mixins/_buttons.scss", + "../scss/dashboard/core/mixins/_vendor-prefixes.scss", + "../scss/dashboard/core/mixins/_inputs.scss", + "../scss/dashboard/core/mixins/_page-header.scss", + "../scss/dashboard/core/mixins/_dropdown.scss", + "../scss/dashboard/core/mixins/_cards.scss", + "../scss/dashboard/core/mixins/_transparency.scss", + "../scss/dashboard/core/plugins/_plugin-animate-bootstrap-notify.scss", + "../scss/core/plugins/_plugin-perfect-scrollbar.scss", + "../scss/dashboard/core/_buttons.scss", + "../scss/dashboard/core/_inputs.scss", + "../scss/dashboard/core/_typography.scss", + "../scss/dashboard/core/_misc.scss", + "../scss/dashboard/core/_checkboxes-radio.scss", + "../scss/dashboard/core/_navbar.scss", + "../scss/dashboard/core/_page-header.scss", + "../scss/dashboard/core/_dropdown.scss", + "../scss/dashboard/core/_alerts.scss", + "../scss/dashboard/core/_images.scss", + "../scss/core/_nucleo-outline.scss", + "../scss/dashboard/core/_tables.scss", + "../scss/dashboard/core/_sidebar-and-main-panel.scss", + "../scss/dashboard/core/_footers.scss", + "../scss/dashboard/core/_fixed-plugin.scss", + "../scss/dashboard/core/_cards.scss", + "../scss/dashboard/core/cards/_card-plain.scss", + "../scss/dashboard/core/cards/_card-chart.scss", + "../scss/dashboard/core/cards/_card-user.scss", + "../scss/dashboard/core/cards/_card-map.scss", + "../scss/dashboard/core/cards/_card-stats.scss", + "../scss/dashboard/core/_responsive.scss" + ], + "sourcesContent": [ + "/*!\n\n =========================================================\n * Paper Dashboard 2 - v2.0.0\n =========================================================\n\n * Product Page: https://www.creative-tim.com/product/paper-dashboard-2\n * Copyright 2018 Creative Tim (http://www.creative-tim.com)\n\n * Designed by www.invisionapp.com Coded by www.creative-tim.com\n\n =========================================================\n\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\n */\n\n@import 'dashboard/core/variables';\n@import 'dashboard/core/mixins';\n\n// Plugins CSS\n@import \"dashboard/core/plugins/plugin-animate-bootstrap-notify\";\n@import \"core/plugins/plugin-perfect-scrollbar\";\n\n// Core CSS\n@import \"dashboard/core/buttons\";\n@import \"dashboard/core/inputs\";\n@import \"dashboard/core/typography\";\n@import \"dashboard/core/misc\";\n@import \"dashboard/core/checkboxes-radio\";\n\n\n// components\n@import \"dashboard/core/navbar\";\n@import \"dashboard/core/page-header\";\n@import \"dashboard/core/dropdown\";\n@import \"dashboard/core/alerts\";\n@import \"dashboard/core/images\";\n@import \"core/nucleo-outline\";\n@import \"dashboard/core/tables\";\n@import \"dashboard/core/sidebar-and-main-panel\";\n@import \"dashboard/core/footers\";\n@import \"dashboard/core/fixed-plugin\";\n\n// cards\n@import \"dashboard/core/cards\";\n@import \"dashboard/core/cards/card-plain\";\n@import \"dashboard/core/cards/card-chart\";\n@import \"dashboard/core/cards/card-user\";\n@import \"dashboard/core/cards/card-map\";\n@import \"dashboard/core/cards/card-stats\";\n\n@import \"dashboard/core/responsive\";\n", + "//== Buttons\n//\n//## For each of Bootstrap's buttons, define text, background and border color.\n\n$font-color: #66615b !default;\n$fill-font-color: rgba(255, 255, 255, 0.8);\n$font-family-sans-serif: 'Montserrat', \"Helvetica\", Arial, sans-serif;\n$sans-serif-family: 'Montserrat', 'Helvetica Neue', Arial, sans-serif;\n\n\n$none: 0 !default;\n$border-thin: 1px !default;\n$border-thick: 2px !default;\n\n$white-color: #FFFFFF !default;\n$white-bg: #FFFFFF !default;\n$orange-bg: #e95e38 !default;\n\n$smoke-bg: #F5F5F5 !default;\n$light-black: #444 !default;\n\n$black-bg: rgba(30,30,30,.97) !default;\n\n$black-color: #2c2c2c !default;\n$black-hr: #444444 !default;\n\n$hr-line: rgba(0,0,0, .1) !default;\n\n$light-gray: #E3E3E3 !default;\n$medium-gray: #DDDDDD !default;\n$dark-gray: #9A9A9A !default;\n\n$table-line-color: #ccc !default;\n$muted-color: #a49e93 !default;\n\n$opacity-gray-3: rgba(222,222,222, .3) !default;\n$opacity-gray-5: rgba(222,222,222, .5) !default;\n$opacity-gray-8: rgba(222,222,222, .8) !default;\n\n\n$opacity-5: rgba(255,255,255, .5) !default;\n$opacity-8: rgba(255,255,255, .8) !default;\n\n$datepicker-color-days: rgba(255,255,255, .8) !default;\n$datepicker-color-old-new-days: rgba(255,255,255, .4) !default;\n\n\n$opacity-1: rgba(255,255,255, .1) !default;\n$opacity-2: rgba(255,255,255, .2) !default;\n\n$transparent-bg: transparent !default;\n$dark-background: #555555 !default;\n\n$gray-input-bg: #fffcf5 !default;\n$danger-input-bg: #FFC0A4 !default;\n$success-input-bg: #ABF3CB !default;\n$other-medium-gray: #A49E93 !default;\n$transparent-bg: transparent !default;\n\n$placeholder-gray: rgba(210, 210, 210, 1) !default;\n\n$default-color: #66615B !default;\n$default-bg: #66615B !default;\n$default-states-color: #403D39 !default;\n\n$smoke-bg: #F5F5F5 !default;\n$pale-bg: #FFFCF5 !default;\n$medium-pale-bg: #F1EAE0 !default;\n$default-body-bg: #f4f3ef !default;\n\n$primary-color: #51cbce !default;\n$primary-states-color: darken($primary-color, 10%) !default;\n\n$success-color: #6bd098 !default;\n$success-states-color: darken($success-color, 10%) !default;\n\n$info-color: #51bcda !default;\n$info-states-color: darken($info-color, 10%) !default;\n\n$warning-color: #fbc658 !default;\n$warning-states-color: darken($warning-color, 10%) !default;\n\n$danger-color: #ef8157 !default;\n$danger-states-color: darken($danger-color, 8%) !default;\n\n$link-disabled-color: #666666 !default;\n\n$purple-color: #c178c1 !default;\n$purple-states-color: darken($purple-color, 8%) !default;\n\n$medium-pale-bg: #F1EAE0 !default;\n\n$brown-color: #dcb285 !default;\n$default-color-opacity: rgba(182, 182, 182, .6) !default;\n$primary-color-opacity: rgba(249, 99, 50, .3) !default;\n$success-color-opacity: rgba(24, 206, 15, .3) !default;\n$info-color-opacity: rgba(44, 168, 255, .3) !default;\n$warning-color-opacity: rgba(255, 178, 54, .3) !default;\n$danger-color-opacity: rgba(255, 54, 54, .3) !default;\n\n$new-blue: #1DC7EA;\n$new-purple: #9368E9;\n$new-red: #FB404B;\n$new-green: #87CB16;\n$new-orange: #FFA534;\n$new-dark-blue: #1F77D0;\n$new-black: #5e5e5e;\n\n$orange-color: #f96332 !default;\n$color-red-error: rgb(185, 74, 72) !default;\n$color-grey-arrow: rgba(204, 204, 204, 0.2) !default;\n\n$bg-nude: #FFFCF5 !default;\n$bg-primary: lighten($primary-color, 7%) !default;\n$bg-info: lighten($info-color, 7%) !default;\n$bg-success: lighten($success-color, 7%) !default;\n$bg-warning: lighten($warning-color, 7%) !default;\n$bg-danger: lighten($danger-color, 7%) !default;\n$bg-brown: lighten($brown-color, 7%) !default;\n$bg-purple: lighten($purple-color, 7%) !default;\n\n// brand Colors\n$brand-primary: $primary-color !default;\n$brand-info: $info-color !default;\n$brand-success: $success-color !default;\n$brand-warning: $warning-color !default;\n$brand-danger: $danger-color !default;\n$brand-inverse: $black-color !default;\n\n$link-disabled-color: #666666 !default;\n$dark-color: #212120 !default;\n// light colors\n$light-blue: rgba($primary-color, .2);\n$light-azure: rgba($info-color, .2);\n$light-green: rgba($success-color, .2);\n$light-orange: rgba($warning-color, .2);\n$light-red: rgba($danger-color, .2);\n\n// padding for links inside dropdown menu\n$padding-dropdown-vertical: 10px !default;\n$padding-dropdown-horizontal: 15px !default;\n\n$margin-large-vertical: 30px !default;\n$margin-base-vertical: 15px !default;\n\n// border radius for buttons\n$border-radius-none: 0px !default;\n$border-radius-btn-small: 26px !default;\n$border-radius-btn-base: 20px !default;\n$border-radius-btn-large: 50px !default;\n\n\n$margin-bottom: 0 0 10px 0 !default;\n$border-radius-small: 3px !default;\n$border-radius-base: 4px !default;\n$border-radius-large: 6px !default;\n$border-radius-x-large: 8px !default;\n$border-radius-extreme: 12px !default;\n\n//variables used in cards\n$card-black-color: #252422 !default;\n$card-muted-color: #ccc5b9 !default;\n\n$card-background-blue: #b8d8d8 !default;\n$card-font-blue: #506568 !default;\n$card-subtitle-blue: #7a9e9f !default;\n\n$card-background-green: #d5e5a3 !default;\n$card-font-green: #60773d !default;\n$card-subtitle-green: #92ac56 !default;\n\n$card-background-yellow: #ffe28c !default;\n$card-font-yellow: #b25825 !default;\n$card-subtitle-yellow: #d88715 !default;\n\n$card-background-brown: #d6c1ab !default;\n$card-font-brown: #75442e !default;\n$card-subtitle-brown: #a47e65 !default;\n\n$card-background-purple: #baa9ba !default;\n$card-font-purple: #3a283d !default;\n$card-subtitle-purple: #5a283d !default;\n\n$card-background-orange: #ff8f5e !default;\n$card-font-orange: #772510 !default;\n$card-subtitle-orange: #e95e37 !default;\n\n\n\n//== Components\n//\n\n$padding-input-vertical: 11px !default;\n$padding-input-horizontal: 11px !default;\n\n$padding-btn-vertical: 11px !default;\n$padding-btn-horizontal: 22px !default;\n\n$padding-base-vertical: .5rem !default;\n$padding-base-horizontal: .7rem !default;\n\n$padding-round-horizontal: 23px !default;\n\n$padding-simple-vertical: 10px !default;\n$padding-simple-horizontal: 17px !default;\n\n$padding-large-vertical: 15px !default;\n$padding-large-horizontal: 48px !default;\n\n$padding-small-vertical: 5px !default;\n$padding-small-horizontal: 15px !default;\n\n// $padding-xs-vertical: 1px !default;\n// $padding-xs-horizontal: 5px !default;\n\n$padding-label-vertical: 2px !default;\n$padding-label-horizontal: 12px !default;\n\n$margin-large-vertical: 30px !default;\n$margin-base-vertical: 15px !default;\n\n$margin-base-horizontal: 15px !default;\n\n$margin-bottom: 10px !default;\n$border: 1px solid !default;\n$border-radius-extra-small: 0.125rem !default;\n$border-radius-small: 0.1875rem !default;\n$border-radius-large: 0.25rem !default;\n$border-radius-extreme: 0.875rem !default;\n\n$border-radius-large-top: $border-radius-large $border-radius-large 0 0 !default;\n$border-radius-large-bottom: 0 0 $border-radius-large $border-radius-large !default;\n\n$btn-round-radius: 30px !default;\n\n$height-base: 40px !default;\n\n$btn-icon-size: 3.5rem !default;\n$btn-icon-size-regular: 2.375rem !default;\n$btn-icon-font-size-regular: 0.9375rem !default;\n$btn-icon-font-size-small: 0.6875rem !default;\n$btn-icon-size-small: 1.875rem !default;\n$btn-icon-font-size-lg: 1.325rem !default;\n$btn-icon-size-lg: 3.6rem !default;\n\n$font-size-h1: 3.5em !default; // ~ 49px\n$font-size-h2: 2.5em !default; // ~ 35px\n$font-size-h3: 2em !default; // ~ 28px\n$font-size-h4: 1.714em !default; // ~ 24px\n$font-size-h5: 1.57em !default; // ~ 22px\n$font-size-h6: 1em !default; // ~ 14px\n\n$font-paragraph: 1em !default;\n$font-size-navbar: 1em !default;\n$font-size-mini: 0.7142em !default;\n$font-size-small: 0.8571em !default;\n$font-size-base: 14px !default;\n$font-size-large: 1rem !default;\n$font-size-large-navbar: 20px !default;\n$font-size-blockquote: 1.1em !default; // ~ 15px\n$font-size-medium: 16px !default;\n$font-size-xs: 12px !default;\n\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-semi: 600 !default;\n$font-weight-bold: 700 !default;\n\n$line-height-general: 1.5 !default;\n$line-height-nav-link: 1.625rem !default;\n$btn-icon-line-height: 2.4em !default;\n$line-height: 1.35em !default;\n$line-height-lg: 54px !default;\n\n\n$border-radius-top: 10px 10px 0 0 !default;\n$border-radius-bottom: 0 0 10px 10px !default;\n\n$dropdown-shadow: 1px 2px 7px 1px rgba(0,0,0,.125);\n$box-shadow-raised: 0px 10px 25px 0px rgba(0, 0, 0, 0.3);\n$box-shadow: 0 2px 2px rgba(204, 197, 185, 0.5);\n$sidebar-box-shadow: 0px 2px 22px 0 rgba(0, 0, 0,.20), 0px 2px 30px 0 rgba(0, 0, 0,.35);\n\n$general-transition-time: 300ms !default;\n\n$slow-transition-time: 370ms !default;\n$dropdown-coordinates: 29px -50px !default;\n\n$fast-transition-time: 150ms !default;\n$select-coordinates: 50% -40px !default;\n\n$transition-linear: linear !default;\n$transition-bezier: cubic-bezier(0.34, 1.61, 0.7, 1) !default;\n$transition-ease: ease 0s;\n\n\n//$navbar-padding-a: 9px 13px;\n$navbar-margin-a: 15px 0px;\n\n$padding-social-a: 10px 5px;\n\n$navbar-margin-a-btn: 15px 0px;\n$navbar-margin-a-btn-round: 16px 0px;\n\n$navbar-padding-a-icons: 6px 15px;\n$navbar-margin-a-icons: 6px 3px;\n\n$navbar-padding-base: 0.625rem;\n//$navbar-margin-brand: 5px 0px;\n\n$navbar-margin-brand-icons: 12px auto;\n$navbar-margin-btn: 15px 3px;\n\n$height-icon-sm:\t\t\t\t 32px;\n$width-icon-sm:\t\t\t\t\t 32px;\n$padding-icon-sm:\t\t\t 4px;\n$border-radius-icon-sm:\t\t\t 7px;\n\n$height-icon-message:\t\t\t 40px;\n$width-icon-message:\t\t\t 40px;\n\n$height-icon-message-sm: \t\t 20px;\n$width-icon-message-sm:\t\t\t 20px;\n\n$white-navbar: rgba(#FFFFFF, .96);\n$primary-navbar: rgba(#34ACDC, .98);\n$info-navbar: rgba(#5BCAFF, .98);\n$success-navbar: rgba(#4CD964, .98);\n$warning-navbar: rgba(#FF9500, .98);\n$danger-navbar: rgba(#FF4C40, .98);\n\n$topbar-x: topbar-x !default;\n$topbar-back: topbar-back !default;\n$bottombar-x: bottombar-x !default;\n$bottombar-back: bottombar-back !default;\n\n//Nucleo Icons\n\n$nc-font-path: '../fonts' !default;\n$nc-font-size-base: 14px !default;\n$nc-css-prefix: nc !default;\n$nc-background-color: #eee !default;\n$nc-li-width: (30em / 14) !default;\n$nc-padding-width: (1em/3) !default;\n\n// Social icons color\n$social-twitter: #55acee !default;\n$social-twitter-state-color: darken(#55acee, 5%) !default;\n\n$social-facebook: \t\t\t #3b5998 !default;\n$social-facebook-state-color: darken(#3b5998, 5%) !default;\n\n$social-google: \t\t\t #dd4b39 !default;\n$social-google-state-color: darken(#dd4b39, 5%) !default;\n\n$social-linkedin: \t\t\t #0077B5 !default;\n$social-linkedin-state-color: darken(#0077B5, 5%) !default;\n\n// Sidebar variables\n$sidebar-width: calc(100% - 260px) !default;\n$sidebar-mini-width: calc(100% - 80px) !default;\n\n\n// Social icons color\n$social-twitter: #55acee !default;\n$social-twitter-state-color: lighten(#55acee, 6%) !default;\n\n$social-facebook: \t\t\t #3b5998 !default;\n$social-facebook-state-color: lighten(#3b5998, 6%) !default;\n\n$social-google: \t\t\t #dd4b39 !default;\n$social-google-state-color: lighten(#dd4b39, 6%) !default;\n\n$social-linkedin: \t\t\t #0077B5 !default;\n$social-linkedin-state-color: lighten(#0077B5, 6%) !default;\n\n$social-pinterest: \t\t\t #cc2127 !default;\n$social-pinterest-state-color: lighten(#cc2127, 6%) !default;\n\n$social-dribbble: \t\t #ea4c89 !default;\n$social-dribbble-state-color: lighten(#ea4c89, 6%) !default;\n\n$social-github: \t\t \t #333333 !default;\n$social-github-state-color: lighten(#333333, 6%) !default;\n\n$social-youtube: \t\t \t #e52d27 !default;\n$social-youtube-state-color: lighten(#e52d27, 6%) !default;\n\n$social-instagram: \t\t #125688 !default;\n$social-instagram-state-color: lighten(#125688, 6%) !default;\n\n$social-reddit: \t\t \t #ff4500 !default;\n$social-reddit-state-color: lighten(#ff4500, 6%) !default;\n\n$social-tumblr: \t\t\t #35465c !default;\n$social-tumblr-state-color: lighten(#35465c, 6%) !default;\n\n$social-behance: \t\t\t #1769ff !default;\n$social-behance-state-color: lighten(#1769ff, 6%) !default;\n\n// Placeholder text color\n$input-color-placeholder: #999 !default;\n\n$zindex-select-dropdown: 1060 !default; // must be higher than a modal background (1050)\n", + "//Components\n@import \"mixins/buttons\";\n@import \"mixins/vendor-prefixes\";\n@import \"mixins/inputs\";\n@import \"mixins/page-header\";\n@import \"mixins/dropdown\";\n@import \"mixins/cards\";\n@import \"mixins/transparency\";\n", + "// Mixin for generating new styles\n@mixin btn-styles($btn-color, $btn-states-color) {\n background-color: $btn-color;\n\n &:hover,\n &:focus,\n &:active,\n &.active,\n &:active:focus,\n &:active:hover,\n &.active:focus,\n &.active:hover,\n .show > &.dropdown-toggle,\n .show > &.dropdown-toggle:focus,\n .show > &.dropdown-toggle:hover {\n background-color: $btn-states-color !important;\n color: $white-color !important;\n box-shadow: none !important;\n }\n\n &:not([data-action]):hover{\n box-shadow: none;\n }\n\n &.disabled,\n &:disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: $btn-color;\n border-color: $btn-color;\n }\n }\n\n // btn-neutral style\n @if $btn-color == $white-color{\n color: $primary-color;\n\n &.btn-danger{\n color: $danger-color;\n\n &:hover,\n &:focus,\n &:active,\n &:active:focus{\n color: $danger-states-color !important;\n }\n }\n\n &.btn-info{\n color: $info-color !important;\n\n &:hover,\n &:focus,\n &:active,\n &:active:focus{\n color: $info-states-color !important;\n }\n }\n\n &.btn-warning{\n color: $warning-color !important;\n\n &:hover,\n &:focus,\n &:active,\n &:active:focus{\n color: $warning-states-color !important;\n }\n }\n\n &.btn-success{\n color: $success-color !important;\n\n &:hover,\n &:focus,\n &:active,\n &:active:focus{\n color: $success-states-color !important;\n }\n }\n\n &.btn-default{\n color: $default-color !important;\n\n &:hover,\n &:focus,\n &:active,\n &:active:focus{\n color: $default-states-color !important;\n }\n }\n\n &.active,\n &:active,\n &:active:focus,\n &:active:hover,\n &.active:focus,\n &.active:hover,\n .show > &.dropdown-toggle,\n .show > &.dropdown-toggle:focus,\n .show > &.dropdown-toggle:hover {\n background-color: $white-color !important;\n color: $primary-states-color !important;\n box-shadow: none !important;\n }\n\n &:hover,\n &:focus{\n color: $primary-states-color !important;\n\n &:not(.nav-link){\n box-shadow: none;\n }\n\n }\n\n } @else {\n color: $white-color;\n }\n\n &.btn-simple{\n color: $btn-color;\n border-color: $btn-color;\n\n &:hover,\n &:focus,\n &:active{\n background-color: $transparent-bg;\n color: $btn-states-color;\n border-color: $btn-states-color;\n box-shadow: none;\n }\n }\n\n &.btn-link{\n color: $btn-color;\n\n &:hover,\n &:focus,\n &:active,\n &:active:focus {\n background-color: $transparent-bg;\n color: $btn-states-color;\n text-decoration: none;\n box-shadow: none;\n }\n }\n}\n\n@mixin btn-outline-styles($btn-color, $btn-states-color){\n background: $transparent-bg;\n border: 2px solid $btn-color !important;\n color: $btn-color;\n @include opacity(1);\n\n &:hover,\n &:focus,\n &:active,\n &:focus:active,\n &.active,\n .open > &.dropdown-toggle {\n background-color: $btn-color !important;\n color: $fill-font-color !important;\n border-color: $btn-color !important;\n .caret{\n border-top-color: $fill-font-color !important;\n }\n }\n\n .caret{\n border-top-color: $white-color !important;\n }\n\n &.disabled,\n &:disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: $transparent-bg !important;\n border-color: $btn-color !important;\n }\n }\n}\n\n@mixin btn-size($padding-vertical, $padding-horizontal, $font-size, $border){\n font-size: $font-size;\n border-radius: $border;\n padding: $padding-vertical $padding-horizontal;\n\n &.btn-simple{\n padding: $padding-vertical - 1 $padding-horizontal - 1;\n }\n\n}\n\n@mixin rotate-180(){\n filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);\n -webkit-transform: rotate(180deg);\n -ms-transform: rotate(180deg);\n transform: rotate(180deg);\n}\n", + "@mixin box-shadow($shadow...) {\n -webkit-box-shadow: $shadow; // iOS <4.3 & Android <4.1\n box-shadow: $shadow;\n}\n\n@mixin transition($time, $type){\n -webkit-transition: all $time $type;\n -moz-transition: all $time $type;\n -o-transition: all $time $type;\n -ms-transition: all $time $type;\n transition: all $time $type;\n}\n\n\n@mixin sidebar-color($color){\n &:after{\n background: $color;\n }\n}\n\n@mixin bar-animation($type){\n -webkit-animation: $type 500ms linear 0s;\n -moz-animation: $type 500ms linear 0s;\n animation: $type 500ms 0s;\n -webkit-animation-fill-mode: forwards;\n -moz-animation-fill-mode: forwards;\n animation-fill-mode: forwards;\n}\n\n@mixin sidebar-active-color($font-color){\n .nav {\n li {\n &.active > a,\n &.active > a i,\n &.active > a[data-toggle=\"collapse\"],\n &.active > a[data-toggle=\"collapse\"] i,\n &.active > a[data-toggle=\"collapse\"] ~ div > ul > li.active .sidebar-mini-icon,\n &.active > a[data-toggle=\"collapse\"] ~ div > ul > li.active > a {\n color: $font-color;\n opacity: 1;\n }\n }\n }\n}\n\n@mixin transition-opacity($time, $type){\n -webkit-transition: opacity $time $type;\n -moz-transition: opacity $time $type;\n -o-transition: opacity $time $type;\n -ms-transition: opacity $time $type;\n transition: opacity $time $type;\n}\n\n@mixin transform-translate-y-dropdown($value) {\n -webkit-transform: translate3d(-20px,$value,0) !important;\n -moz-transform: translate3d(-20px,$value,0) !important;\n -o-transform: translate3d(-20px,$value,0) !important;\n -ms-transform: translate3d(-20px,$value,0) !important;\n transform: translate3d(-20px,$value,0) !important;\n}\n\n@mixin transform-translate-x($value){\n -webkit-transform: translate3d($value, 0, 0);\n -moz-transform: translate3d($value, 0, 0);\n -o-transform: translate3d($value, 0, 0);\n -ms-transform: translate3d($value, 0, 0);\n transform: translate3d($value, 0, 0);\n}\n\n@mixin transform-translate-y($value){\n -webkit-transform: translate3d(0,$value,0) !important;\n -moz-transform: translate3d(0,$value,0) !important;\n -o-transform: translate3d(0,$value,0) !important;\n -ms-transform: translate3d(0,$value,0) !important;\n transform: translate3d(0,$value,0) !important;\n}\n\n@mixin transform-translate-y-fixed-plugin($value){\n -webkit-transform: translate3d(0,$value,0) !important;\n -moz-transform: translate3d(0,$value,0) !important;\n -o-transform: translate3d(0,$value,0) !important;\n -ms-transform: translate3d(0,$value,0) !important;\n transform: translate3d(0,$value,0) !important;\n}\n\n@mixin icon-gradient($color, $bottomColor: #000){\n background: $color;\n background: -webkit-linear-gradient($color 0%, $bottomColor 80%);\n background: -o-linear-gradient($color 0%, $bottomColor 80%);\n background: -moz-linear-gradient($color 0%, $bottomColor 80%);\n background: linear-gradient($color 0%, $bottomColor 80%);\n}\n\n@mixin topbar-x-rotation(){\n @keyframes topbar-x {\n 0% {top: 0px; transform: rotate(0deg); }\n 45% {top: 6px; transform: rotate(145deg); }\n 75% {transform: rotate(130deg); }\n 100% {transform: rotate(135deg); }\n }\n @-webkit-keyframes topbar-x {\n 0% {top: 0px; -webkit-transform: rotate(0deg); }\n 45% {top: 6px; -webkit-transform: rotate(145deg); }\n 75% {-webkit-transform: rotate(130deg); }\n 100% { -webkit-transform: rotate(135deg); }\n }\n @-moz-keyframes topbar-x {\n 0% {top: 0px; -moz-transform: rotate(0deg); }\n 45% {top: 6px; -moz-transform: rotate(145deg); }\n 75% {-moz-transform: rotate(130deg); }\n 100% { -moz-transform: rotate(135deg); }\n }\n}\n\n\n@mixin topbar-back-rotation(){\n @keyframes topbar-back {\n 0% { top: 6px; transform: rotate(135deg); }\n 45% { transform: rotate(-10deg); }\n 75% { transform: rotate(5deg); }\n 100% { top: 0px; transform: rotate(0); }\n }\n\n @-webkit-keyframes topbar-back {\n 0% { top: 6px; -webkit-transform: rotate(135deg); }\n 45% { -webkit-transform: rotate(-10deg); }\n 75% { -webkit-transform: rotate(5deg); }\n 100% { top: 0px; -webkit-transform: rotate(0); }\n }\n\n @-moz-keyframes topbar-back {\n 0% { top: 6px; -moz-transform: rotate(135deg); }\n 45% { -moz-transform: rotate(-10deg); }\n 75% { -moz-transform: rotate(5deg); }\n 100% { top: 0px; -moz-transform: rotate(0); }\n }\n}\n\n@mixin bottombar-x-rotation(){\n @keyframes bottombar-x {\n 0% {bottom: 0px; transform: rotate(0deg);}\n 45% {bottom: 6px; transform: rotate(-145deg);}\n 75% {transform: rotate(-130deg);}\n 100% {transform: rotate(-135deg);}\n }\n @-webkit-keyframes bottombar-x {\n 0% {bottom: 0px; -webkit-transform: rotate(0deg);}\n 45% {bottom: 6px; -webkit-transform: rotate(-145deg);}\n 75% {-webkit-transform: rotate(-130deg);}\n 100% {-webkit-transform: rotate(-135deg);}\n }\n @-moz-keyframes bottombar-x {\n 0% {bottom: 0px; -moz-transform: rotate(0deg);}\n 45% {bottom: 6px; -moz-transform: rotate(-145deg);}\n 75% {-moz-transform: rotate(-130deg);}\n 100% {-moz-transform: rotate(-135deg);}\n }\n}\n\n@mixin bottombar-back-rotation{\n @keyframes bottombar-back {\n 0% { bottom: 6px;transform: rotate(-135deg);}\n 45% { transform: rotate(10deg);}\n 75% { transform: rotate(-5deg);}\n 100% { bottom: 0px;transform: rotate(0);}\n }\n @-webkit-keyframes bottombar-back {\n 0% {bottom: 6px;-webkit-transform: rotate(-135deg);}\n 45% {-webkit-transform: rotate(10deg);}\n 75% {-webkit-transform: rotate(-5deg);}\n 100% {bottom: 0px;-webkit-transform: rotate(0);}\n }\n @-moz-keyframes bottombar-back {\n 0% {bottom: 6px;-moz-transform: rotate(-135deg);}\n 45% {-moz-transform: rotate(10deg);}\n 75% {-moz-transform: rotate(-5deg);}\n 100% {bottom: 0px;-moz-transform: rotate(0);}\n }\n\n}\n\n@mixin sidebar-text-color($text-color){\n .nav {\n li {\n a,\n a i,\n a[data-toggle=\"collapse\"],\n a[data-toggle=\"collapse\"] i,\n a[data-toggle=\"collapse\"] ~ div > ul > li .sidebar-mini-icon,\n a[data-toggle=\"collapse\"] ~ div > ul > li > a {\n color: $text-color;\n opacity: .7;\n }\n\n &:hover:not(.active) > a,\n &:focus:not(.active) > a {\n opacity: 1;\n }\n }\n }\n\n .logo {\n .simple-text {\n color: $text-color;\n }\n &:after {\n background-color: $text-color;\n opacity: .4;\n }\n }\n\n .user {\n .info a span,\n .nav .sidebar-mini-icon,\n .nav .sidebar-normal {\n color: $text-color !important;\n }\n &:after {\n background-color: $text-color;\n opacity: .4;\n }\n }\n}\n\n@mixin badge-color($color) {\n border-color: $color;\n background-color: $color;\n}\n", + "@mixin input-size($padding-vertical, $padding-horizontal){\n padding: $padding-vertical $padding-horizontal;\n}\n\n@mixin form-control-placeholder($color, $opacity){\n .form-control::-moz-placeholder{\n color: $color;\n @include opacity(1);\n }\n .form-control:-moz-placeholder{\n color: $color;\n @include opacity(1);\n }\n .form-control::-webkit-input-placeholder{\n color: $color;\n @include opacity(1);\n }\n .form-control:-ms-input-placeholder{\n color: $color;\n @include opacity(1);\n }\n}\n\n@mixin placeholder() {\n &::-moz-placeholder {@content; } // Firefox\n &:-ms-input-placeholder {@content; } // Internet Explorer 10+\n &::-webkit-input-placeholder {@content; } // Safari and Chrome\n}\n\n@mixin light-form(){\n border-radius: 0;\n border:0;\n padding: 0;\n background-color: transparent;\n\n}\n\n\n@mixin form-control-lg-padding($padding-vertical, $padding-horizontal) {\n .form-group.no-border.form-control-lg,\n .input-group.no-border.form-control-lg{\n .input-group-append .input-group-text{\n padding: $padding-vertical 0 $padding-vertical $padding-horizontal;\n }\n\n .form-control{\n padding: $padding-vertical $padding-horizontal;\n\n & + .input-group-prepend .input-group-text,\n & + .input-group-append .input-group-text{\n padding: $padding-vertical $padding-horizontal $padding-vertical 0;\n }\n }\n }\n\n .form-group.form-control-lg,\n .input-group.form-control-lg{\n .form-control{\n padding: $padding-vertical - 1 $padding-horizontal - 1;\n\n & + .input-group-prepend .input-group-text,\n & + .input-group-append .input-group-text{\n padding: $padding-vertical - 1 $padding-horizontal - 1 $padding-vertical - 1 0;\n }\n }\n\n .input-group-prepend .input-group-text,\n .input-group-append .input-group-text{\n padding: $padding-vertical - 1 0 $padding-vertical $padding-horizontal - 1;\n\n & + .form-control{\n padding: $padding-vertical $padding-horizontal - 1 $padding-vertical $padding-horizontal - 3;\n }\n }\n }\n}\n\n\n\n@mixin input-base-padding($padding-vertical, $padding-horizontal) {\n .form-group.no-border,\n .input-group.no-border{\n .form-control{\n padding: $padding-vertical $padding-horizontal;\n\n & + .input-group-prepend .input-group-text,\n & + .input-group-append .input-group-text{\n padding: $padding-vertical $padding-horizontal $padding-vertical 0;\n }\n }\n\n .input-group-prepend .input-group-text,\n .input-group-append .input-group-text{\n padding: $padding-vertical 0 $padding-vertical $padding-horizontal;\n }\n }\n\n .form-group,\n .input-group{\n .form-control{\n padding: $padding-vertical - 1 $padding-horizontal - 1 $padding-vertical - 1 $padding-horizontal - 1;\n\n & + .input-group-prepend .input-group-text,\n & + .input-group-append .input-group-text{\n padding: $padding-vertical - 1 $padding-horizontal - 1 $padding-vertical - 1 0;\n }\n }\n\n .input-group-prepend .input-group-text,\n .input-group-append .input-group-text{\n padding: $padding-vertical - 1 0 $padding-vertical - 1 $padding-horizontal - 1;\n\n & + .form-control,\n & ~ .form-control{\n padding:$padding-vertical - 1 $padding-horizontal $padding-vertical $padding-horizontal - 3;\n }\n }\n }\n}\n\n\n//color1 = $opacity-5\n//color2 = $opacity-8\n//color3 = $white-color\n//color4 = $transparent-bg\n//color5 = $opacity-1\n//color6 = $opacity-2\n\n\n@mixin input-coloured-bg($color1, $color2, $color3, $color4, $color5, $color6) {\n @include form-control-placeholder(darken($color2, 8%), 1);\n\n .form-control{\n border-color: $color1;\n color: $color2;\n\n &:focus{\n border-color: $color3;\n background-color: $color4;\n color: $color3;\n }\n }\n\n .has-success,\n .has-danger{\n &:after{\n color: $color3;\n }\n }\n\n .has-danger{\n .form-control{\n background-color: $color4;\n }\n }\n\n .input-group-prepend .input-group-text,\n .input-group-append .input-group-text{\n background-color: $color4;\n border-color: $color1;\n color: $color2;\n }\n\n .input-group-focus{\n .input-group-prepend .input-group-text,\n .input-group-append .input-group-text{\n background-color: $color4;\n border-color: $color3;\n color: $color3;\n }\n }\n\n .form-group.no-border,\n .input-group.no-border{\n .form-control{\n background-color: $color5;\n color: $color2;\n\n &:focus,\n &:active,\n &:active{\n background-color: $color6;\n color: $color3;\n }\n }\n\n .form-control + .input-group-prepend .input-group-text,\n .form-control + .input-group-append .input-group-text{\n background-color: $color5;\n\n &:focus,\n &:active,\n &:active{\n background-color: $color6;\n color: $color3;\n }\n }\n\n .form-control{\n &:focus{\n & + .input-group-prepend .input-group-text,\n & + .input-group-append .input-group-text{\n background-color: $color6;\n color: $color3;\n }\n }\n }\n\n .input-group-prepend .input-group-text,\n .input-group-append .input-group-text{\n background-color: $color5;\n border: none;\n color: $color2;\n }\n\n &.input-group-focus{\n .input-group-prepend .input-group-text,\n .input-group-append .input-group-text{\n background-color: $color6;\n color: $color3;\n }\n }\n }\n}\n\n@mixin transition-input-focus-color() {\n -webkit-transition: color 0.3s ease-in-out, border-color 0.3s ease-in-out, background-color 0.3s ease-in-out;\n -moz-transition: color 0.3s ease-in-out, border-color 0.3s ease-in-out, background-color 0.3s ease-in-out;\n -o-transition: color 0.3s ease-in-out, border-color 0.3s ease-in-out, background-color 0.3s ease-in-out;\n -ms-transition: color 0.3s ease-in-out, border-color 0.3s ease-in-out, background-color 0.3s ease-in-out;\n transition: color 0.3s ease-in-out, border-color 0.3s ease-in-out, background-color 0.3s ease-in-out;\n}\n", + "@mixin linear-gradient($color1, $color2){\n background: $color1; /* For browsers that do not support gradients */\n background: -webkit-linear-gradient(90deg, $color1 , $color2); /* For Safari 5.1 to 6.0 */\n background: -o-linear-gradient(90deg, $color1, $color2); /* For Opera 11.1 to 12.0 */\n background: -moz-linear-gradient(90deg, $color1, $color2); /* For Firefox 3.6 to 15 */\n background: linear-gradient(0deg, $color1 , $color2); /* Standard syntax */\n}\n", + "@mixin dropdown-colors($brand-color, $dropdown-header-color, $dropdown-color, $background-color ) {\n background-color: $brand-color;\n\n &:before{\n color: $brand-color;\n }\n\n .dropdown-header:not([href]):not([tabindex]){\n color: $dropdown-header-color;\n }\n\n .dropdown-item{\n color: $dropdown-color;\n\n &:hover,\n &:focus{\n background-color: $background-color;\n }\n }\n\n .dropdown-divider{\n background-color: $background-color;\n }\n}\n", + "@mixin icon-color($color) {\n box-shadow: 0px 9px 30px -6px $color;\n color: $color;\n}\n", + "// Opacity\n\n@mixin opacity($opacity) {\n opacity: $opacity;\n // IE8 filter\n $opacity-ie: ($opacity * 100);\n filter: #{alpha(opacity=$opacity-ie)};\n}\n", + "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// This file was modified by Creative Tim to keep only the animation that we need for Bootstrap Notify\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n@charset \"UTF-8\";\n\n/*!\nAnimate.css - http://daneden.me/animate\nLicensed under the MIT license - http://opensource.org/licenses/MIT\n\nCopyright (c) 2015 Daniel Eden\n*/\n\n.animated {\n -webkit-animation-duration: 1s;\n animation-duration: 1s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n}\n\n.animated.infinite {\n -webkit-animation-iteration-count: infinite;\n animation-iteration-count: infinite;\n}\n\n.animated.hinge {\n -webkit-animation-duration: 2s;\n animation-duration: 2s;\n}\n\n.animated.bounceIn,\n.animated.bounceOut {\n -webkit-animation-duration: .75s;\n animation-duration: .75s;\n}\n\n.animated.flipOutX,\n.animated.flipOutY {\n -webkit-animation-duration: .75s;\n animation-duration: .75s;\n}\n\n@-webkit-keyframes shake {\n from, to {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n }\n\n 10%, 30%, 50%, 70%, 90% {\n -webkit-transform: translate3d(-10px, 0, 0);\n transform: translate3d(-10px, 0, 0);\n }\n\n 20%, 40%, 60%, 80% {\n -webkit-transform: translate3d(10px, 0, 0);\n transform: translate3d(10px, 0, 0);\n }\n}\n\n@keyframes shake {\n from, to {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n }\n\n 10%, 30%, 50%, 70%, 90% {\n -webkit-transform: translate3d(-10px, 0, 0);\n transform: translate3d(-10px, 0, 0);\n }\n\n 20%, 40%, 60%, 80% {\n -webkit-transform: translate3d(10px, 0, 0);\n transform: translate3d(10px, 0, 0);\n }\n}\n\n.shake {\n -webkit-animation-name: shake;\n animation-name: shake;\n}\n\n\n\n@-webkit-keyframes fadeInDown {\n from {\n opacity: 0;\n -webkit-transform: translate3d(0, -100%, 0);\n transform: translate3d(0, -100%, 0);\n }\n\n to {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n@keyframes fadeInDown {\n from {\n opacity: 0;\n -webkit-transform: translate3d(0, -100%, 0);\n transform: translate3d(0, -100%, 0);\n }\n\n to {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n.fadeInDown {\n -webkit-animation-name: fadeInDown;\n animation-name: fadeInDown;\n}\n\n\n@-webkit-keyframes fadeOut {\n from {\n opacity: 1;\n }\n\n to {\n opacity: 0;\n }\n}\n\n@keyframes fadeOut {\n from {\n opacity: 1;\n }\n\n to {\n opacity: 0;\n }\n}\n\n.fadeOut {\n -webkit-animation-name: fadeOut;\n animation-name: fadeOut;\n}\n\n@-webkit-keyframes fadeOutDown {\n from {\n opacity: 1;\n }\n\n to {\n opacity: 0;\n -webkit-transform: translate3d(0, 100%, 0);\n transform: translate3d(0, 100%, 0);\n }\n}\n\n@keyframes fadeOutDown {\n from {\n opacity: 1;\n }\n\n to {\n opacity: 0;\n -webkit-transform: translate3d(0, 100%, 0);\n transform: translate3d(0, 100%, 0);\n }\n}\n\n.fadeOutDown {\n -webkit-animation-name: fadeOutDown;\n animation-name: fadeOutDown;\n}\n\n@-webkit-keyframes fadeOutUp {\n from {\n opacity: 1;\n }\n\n to {\n opacity: 0;\n -webkit-transform: translate3d(0, -100%, 0);\n transform: translate3d(0, -100%, 0);\n }\n}\n\n@keyframes fadeOutUp {\n from {\n opacity: 1;\n }\n\n to {\n opacity: 0;\n -webkit-transform: translate3d(0, -100%, 0);\n transform: translate3d(0, -100%, 0);\n }\n}\n\n.fadeOutUp {\n -webkit-animation-name: fadeOutUp;\n animation-name: fadeOutUp;\n}\n", + "/* perfect-scrollbar v0.6.13 */\n.ps-container {\n -ms-touch-action: auto;\n touch-action: auto;\n overflow: hidden !important;\n -ms-overflow-style: none; }\n @supports (-ms-overflow-style: none) {\n .ps-container {\n overflow: auto !important; } }\n @media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {\n .ps-container {\n overflow: auto !important; } }\n .ps-container.ps-active-x > .ps-scrollbar-x-rail,\n .ps-container.ps-active-y > .ps-scrollbar-y-rail {\n display: block;\n background-color: transparent; }\n .ps-container.ps-in-scrolling.ps-x > .ps-scrollbar-x-rail {\n background-color: #eee;\n opacity: 0.9; }\n .ps-container.ps-in-scrolling.ps-x > .ps-scrollbar-x-rail > .ps-scrollbar-x {\n background-color: #999;\n height: 11px; }\n .ps-container.ps-in-scrolling.ps-y > .ps-scrollbar-y-rail {\n background-color: #eee;\n opacity: 0.9; }\n .ps-container.ps-in-scrolling.ps-y > .ps-scrollbar-y-rail > .ps-scrollbar-y {\n background-color: #999;\n width: 11px; }\n .ps-container > .ps-scrollbar-x-rail {\n display: none;\n position: absolute;\n /* please don't change 'position' */\n opacity: 0;\n -webkit-transition: background-color .2s linear, opacity .2s linear;\n -o-transition: background-color .2s linear, opacity .2s linear;\n -moz-transition: background-color .2s linear, opacity .2s linear;\n transition: background-color .2s linear, opacity .2s linear;\n bottom: 0px;\n /* there must be 'bottom' for ps-scrollbar-x-rail */\n height: 15px; }\n .ps-container > .ps-scrollbar-x-rail > .ps-scrollbar-x {\n position: absolute;\n /* please don't change 'position' */\n background-color: #aaa;\n -webkit-border-radius: 6px;\n -moz-border-radius: 6px;\n border-radius: 6px;\n -webkit-transition: background-color .2s linear, height .2s linear, width .2s ease-in-out, -webkit-border-radius .2s ease-in-out;\n transition: background-color .2s linear, height .2s linear, width .2s ease-in-out, -webkit-border-radius .2s ease-in-out;\n -o-transition: background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out;\n -moz-transition: background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out, -moz-border-radius .2s ease-in-out;\n transition: background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out;\n transition: background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out, -webkit-border-radius .2s ease-in-out, -moz-border-radius .2s ease-in-out;\n bottom: 2px;\n /* there must be 'bottom' for ps-scrollbar-x */\n height: 6px; }\n .ps-container > .ps-scrollbar-x-rail:hover > .ps-scrollbar-x, .ps-container > .ps-scrollbar-x-rail:active > .ps-scrollbar-x {\n height: 11px; }\n .ps-container > .ps-scrollbar-y-rail {\n display: none;\n position: absolute;\n /* please don't change 'position' */\n opacity: 0;\n -webkit-transition: background-color .2s linear, opacity .2s linear;\n -o-transition: background-color .2s linear, opacity .2s linear;\n -moz-transition: background-color .2s linear, opacity .2s linear;\n transition: background-color .2s linear, opacity .2s linear;\n right: 0;\n /* there must be 'right' for ps-scrollbar-y-rail */\n width: 15px; }\n .ps-container > .ps-scrollbar-y-rail > .ps-scrollbar-y {\n position: absolute;\n /* please don't change 'position' */\n background-color: #aaa;\n -webkit-border-radius: 6px;\n -moz-border-radius: 6px;\n border-radius: 6px;\n -webkit-transition: background-color .2s linear, height .2s linear, width .2s ease-in-out, -webkit-border-radius .2s ease-in-out;\n transition: background-color .2s linear, height .2s linear, width .2s ease-in-out, -webkit-border-radius .2s ease-in-out;\n -o-transition: background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out;\n -moz-transition: background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out, -moz-border-radius .2s ease-in-out;\n transition: background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out;\n transition: background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out, -webkit-border-radius .2s ease-in-out, -moz-border-radius .2s ease-in-out;\n right: 2px;\n /* there must be 'right' for ps-scrollbar-y */\n width: 6px; }\n .ps-container > .ps-scrollbar-y-rail:hover > .ps-scrollbar-y, .ps-container > .ps-scrollbar-y-rail:active > .ps-scrollbar-y {\n width: 11px; }\n .ps-container:hover.ps-in-scrolling.ps-x > .ps-scrollbar-x-rail {\n background-color: #eee;\n opacity: 0.9; }\n .ps-container:hover.ps-in-scrolling.ps-x > .ps-scrollbar-x-rail > .ps-scrollbar-x {\n background-color: #999;\n height: 11px; }\n .ps-container:hover.ps-in-scrolling.ps-y > .ps-scrollbar-y-rail {\n background-color: #eee;\n opacity: 0.9; }\n .ps-container:hover.ps-in-scrolling.ps-y > .ps-scrollbar-y-rail > .ps-scrollbar-y {\n background-color: #999;\n width: 11px; }\n .ps-container:hover > .ps-scrollbar-x-rail,\n .ps-container:hover > .ps-scrollbar-y-rail {\n opacity: 0.6; }\n .ps-container:hover > .ps-scrollbar-x-rail:hover {\n background-color: #eee;\n opacity: 0.9; }\n .ps-container:hover > .ps-scrollbar-x-rail:hover > .ps-scrollbar-x {\n background-color: #999; }\n .ps-container:hover > .ps-scrollbar-y-rail:hover {\n background-color: #eee;\n opacity: 0.9; }\n .ps-container:hover > .ps-scrollbar-y-rail:hover > .ps-scrollbar-y {\n background-color: #999; }\n", + ".btn,\n.navbar .navbar-nav > a.btn{\n border-width: $border-thick;\n font-weight: $font-weight-semi;\n font-size: $font-size-small;\n line-height: $line-height;\n text-transform: uppercase;\n border: none;\n margin: 10px 1px;\n border-radius: $border-radius-small;\n padding: $padding-btn-vertical $padding-btn-horizontal;\n cursor: pointer;\n\n @include btn-styles($default-color, $default-states-color);\n @include transition($fast-transition-time, linear);\n\n &:hover,\n &:focus{\n @include opacity(1);\n outline: 0 !important;\n }\n &:active,\n &.active,\n .open > &.dropdown-toggle {\n @include box-shadow(none);\n outline: 0 !important;\n }\n\n .badge{\n margin: 0;\n }\n\n &.btn-icon {\n // see above for color variations\n height: $btn-icon-size-regular;\n min-width: $btn-icon-size-regular;\n width: $btn-icon-size-regular;\n padding: 0;\n font-size: $btn-icon-font-size-regular;\n overflow: hidden;\n position: relative;\n line-height: normal;\n\n &.btn-simple{\n padding: 0;\n }\n\n &.btn-sm{\n height: $btn-icon-size-small;\n min-width: $btn-icon-size-small;\n width: $btn-icon-size-small;\n\n .fa,\n .far,\n .fas,\n .nc-icon{\n font-size: $btn-icon-font-size-small;\n }\n }\n\n &.btn-lg{\n height: $btn-icon-size-lg;\n min-width: $btn-icon-size-lg;\n width: $btn-icon-size-lg;\n\n .fa,\n .far,\n .fas,\n .nc-icon{\n font-size: $btn-icon-font-size-lg;\n }\n }\n\n &:not(.btn-footer) .nc-icon,\n &:not(.btn-footer) .fa,\n &:not(.btn-footer) .far,\n &:not(.btn-footer) .fas{\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-12px, -12px);\n line-height: 1.5626rem;\n width: 24px;\n }\n\n &.btn-neutral {\n font-size: 20px;\n }\n }\n\n &:not(.btn-icon) .nc-icon{\n position: relative;\n top: 1px;\n }\n}\n\n// Apply the mixin to the buttons\n// .btn-default { @include btn-styles($default-color, $default-states-color); }\n.btn-primary { @include btn-styles($primary-color, $primary-states-color); }\n.btn-success { @include btn-styles($success-color, $success-states-color); }\n.btn-info { @include btn-styles($info-color, $info-states-color); }\n.btn-warning { @include btn-styles($warning-color, $warning-states-color); }\n.btn-danger { @include btn-styles($danger-color, $danger-states-color); }\n// .btn-neutral { @include btn-styles($white-color, $white-color); }\n\n.btn-outline-default { @include btn-outline-styles($default-color, $default-states-color); }\n.btn-outline-primary { @include btn-outline-styles($primary-color, $primary-states-color); }\n.btn-outline-success { @include btn-outline-styles($success-color, $success-states-color); }\n.btn-outline-info { @include btn-outline-styles($info-color, $info-states-color); }\n.btn-outline-warning { @include btn-outline-styles($warning-color, $warning-states-color); }\n.btn-outline-danger { @include btn-outline-styles($danger-color, $danger-states-color); }\n.btn-outline-neutral { @include btn-outline-styles($white-color, $default-states-color);\n &:hover,\n &:focus{\n color: $default-states-color;\n background-color: $white-color;\n }\n}\n.btn-neutral {\n @include btn-styles($white-color, $white-color);\n color: $default-color;\n &:hover,\n &:focus{\n color: $default-states-color;\n }\n\n &.btn-border{\n &:hover,\n &:focus{\n color: $default-color;\n }\n\n &:active,\n &.active,\n .open > &.dropdown-toggle{\n background-color: $white-color;\n color: $default-color;\n }\n }\n\n &.btn-link:active,\n &.btn-link.active{\n background-color: transparent;\n }\n}\n\n.btn{\n &:disabled,\n &[disabled],\n &.disabled{\n @include opacity(.5);\n pointer-events: none;\n }\n}\n.btn-simple{\n border: $border;\n border-color: $default-color;\n padding: $padding-btn-vertical - 1 $padding-round-horizontal - 1;\n background-color: $transparent-bg;\n}\n\n.btn-simple,\n.btn-link{\n &.disabled,\n &:disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: $transparent-bg;\n }\n }\n}\n\n.btn-link{\n border: $none;\n padding: $padding-base-vertical $padding-base-horizontal;\n background-color: $transparent-bg;\n}\n\n.btn-lg{\n @include btn-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $border-radius-large);\n}\n.btn-sm{\n @include btn-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $border-radius-small);\n}\n\n.btn-wd {\n min-width: 140px;\n}\n.btn-group.select{\n width: 100%;\n}\n.btn-group.select .btn{\n text-align: left;\n}\n.btn-group.select .caret{\n position: absolute;\n top: 50%;\n margin-top: -1px;\n right: 8px;\n}\n.btn-group {\n .btn + .btn {\n margin-left: -3px;\n }\n .btn {\n &:focus {\n background-color: $info-color !important;\n }\n }\n}\n\n\n.btn-round{\n border-width: $border-thin;\n border-radius: $btn-round-radius;\n padding-right: $padding-round-horizontal;\n padding-left: $padding-round-horizontal;\n\n &.btn-simple{\n padding: $padding-btn-vertical - 1 $padding-round-horizontal - 1;\n }\n}\n\n.no-caret {\n &.dropdown-toggle::after {\n display: none;\n }\n}\n", + "@include placeholder() {\n color: $dark-gray;\n};\n\n\n.form-control {\n background-color: $white-color;\n border: 1px solid $medium-gray;\n border-radius: $border-radius-base;\n color: $font-color;\n line-height: normal;\n font-size: $font-size-base;\n @include transition-input-focus-color();\n @include box-shadow(none);\n\n\n\n &:focus{\n border: 1px solid $dark-gray;\n @include box-shadow(none);\n outline: 0 !important;\n color: $default-color;\n\n & + .input-group-append .input-group-text,\n & ~ .input-group-append .input-group-text,\n & + .input-group-prepend .input-group-text,\n & ~ .input-group-prepend .input-group-text{\n border: 1px solid #ccc;\n border-left: none;\n background-color: $transparent-bg;\n }\n }\n\n .has-success &,\n .has-error &,\n .has-success &:focus,\n .has-error &:focus{\n @include box-shadow(none);\n }\n\n .has-success &{\n border: 1px solid $table-line-color;\n color: $font-color;\n\n &.form-control-success{\n padding-right: 2.5em !important;\n }\n }\n .has-success &:focus{\n border: 1px solid $success-color;\n color: $success-color;\n }\n .has-danger &{\n background-color: $danger-input-bg;\n border: 1px solid $danger-color;\n color: $danger-color;\n\n &.form-control-danger{\n padding-right: 2.5em !important;\n }\n }\n .has-danger &:focus{\n background-color: $white-color;\n border: 1px solid $danger-color;\n }\n\n & + .form-control-feedback{\n border-radius: $border-radius-large;\n font-size: $font-size-base;\n margin-top: -7px;\n position: absolute;\n right: 10px;\n top: 50%;\n vertical-align: middle;\n }\n\n .open &{\n border-radius: $border-radius-large $border-radius-large 0 0;\n border-bottom-color: transparent;\n }\n\n & + .input-group-append .input-group-text,\n & + .input-group-prepend .input-group-text{\n background-color: $white-bg;\n }\n}\n\n\n@include form-control-lg-padding($padding-large-vertical, $padding-input-horizontal);\n@include input-base-padding($padding-input-vertical, $padding-input-horizontal);\n\n.input-group {\n &.has-success {\n .input-group-prepend,\n .input-group-append {\n .input-group-text {\n border: 1px solid $table-line-color;\n color: $font-color;\n background-color: $white-color;\n border-right: none;\n }\n }\n }\n}\n\n.form-group.no-border,\n.input-group.no-border{\n .form-control,\n .form-control + .input-group-prepend .input-group-text,\n .form-control + .input-group-append .input-group-text{\n background-color: $opacity-gray-3;\n border: medium none;\n &:focus,\n &:active,\n &:active{\n border: medium none;\n background-color: $opacity-gray-5;\n }\n }\n\n .form-control{\n &:focus{\n & + .input-group-prepend .input-group-text,\n & + .input-group-append .input-group-text{\n background-color: $opacity-gray-5;\n }\n }\n }\n\n .input-group-prepend .input-group-text,\n .input-group-append .input-group-text{\n background-color: $opacity-gray-3;\n border: none;\n }\n}\n\n.has-error{\n .form-control-feedback, .control-label{\n color: $danger-color;\n }\n}\n.has-success{\n .form-control-feedback, .control-label{\n color: $success-color;\n }\n}\n\n.input-group.has-danger {\n .input-group-prepend {\n border-radius: $border-radius-base;\n .input-group-text {\n border: 1px solid $danger-color;\n border-right: none;\n }\n }\n .error {\n display: block;\n width: 100%;\n color: $danger-color;\n margin-top: 3px;\n }\n}\n\n.input-group.has-success {\n .input-group-prepend {\n border-radius: $border-radius-base;\n .input-group-text {\n // border: 1px solid $success-color;\n border-right: none;\n }\n }\n}\n\n\n.input-group-focus{\n .input-group-prepend .input-group-text,\n .input-group-append .input-group-text{\n background-color: $white-bg;\n border-color: $dark-gray;\n }\n\n &.no-border{\n .input-group-prepend .input-group-text,\n .input-group-append .input-group-text{\n background-color: $opacity-gray-5;\n }\n }\n\n &.has-danger {\n .input-group-append,\n .input-group-prepend {\n .input-group-text {\n background-color: $danger-input-bg;\n }\n }\n }\n\n &.has-success {\n .input-group-append,\n .input-group-prepend {\n .input-group-text {\n background-color: $success-input-bg;\n border: 1px solid $success-color;\n border-right: none;\n }\n }\n }\n}\n\n.input-group-append .input-group-text,\n.input-group-prepend .input-group-text {\n background-color: transparent;\n border: 1px solid $light-gray;\n color: $default-color;\n border-top-right-radius: $border-radius-base;\n border-bottom-right-radius: $border-radius-base;\n\n & i{\n opacity: .5;\n }\n\n @include transition-input-focus-color();\n\n .has-danger &{\n background-color: $danger-input-bg;\n }\n .has-success &{\n background-color: $success-input-bg;\n }\n .has-danger.input-group-focus &{\n background-color: $white-color;\n color: $danger-color;\n }\n .has-success.input-group-focus &{\n background-color: $white-color;\n color: $success-color;\n }\n .has-danger .form-control:focus + &{\n color: $danger-color;\n }\n .has-success .form-control:focus + &{\n color: $success-color;\n }\n\n & + .form-control,\n & ~ .form-control{\n @include input-size($padding-base-vertical - 1, $padding-base-horizontal);\n padding-left: 18px;\n }\n\n i{\n width: 17px;\n }\n}\n\n.input-group-append,\n.input-group-prepend{\n margin: 0;\n}\n\n\n.input-group-append .input-group-text{\n border-left: none;\n}\n.input-group-prepend .input-group-text{\n border-right: none;\n}\n\n.input-group,\n.form-group{\n margin-bottom: 10px;\n position: relative;\n\n .form-control-static{\n margin-top: 9px;\n }\n &.has-danger {\n .error {\n color: $danger-color;\n }\n }\n}\n.input-group[disabled]{\n .input-group-prepend .input-group-text,\n .input-group-append .input-group-text{\n background-color: $light-gray;\n }\n}\n\n.input-group .form-control:not(:first-child):not(:last-child), .input-group-btn:not(:first-child):not(:last-child){\n border-radius: $border-radius-base;\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n border-left: 0 none;\n}\n\n.input-group .form-control:first-child,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) {\n border-right: 0 none;\n}\n.input-group .form-control:last-child,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child) {\n border-left: 0 none;\n}\n.form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control {\n background-color: $light-gray;\n color: $default-color;\n cursor: not-allowed;\n}\n\n.input-group-btn .btn{\n border-width: $border-thin;\n padding: $padding-btn-vertical $padding-base-horizontal;\n}\n.input-group-btn .btn-default:not(.btn-fill){\n border-color: $medium-gray;\n}\n\n.input-group-btn:last-child > .btn{\n margin-left: 0;\n}\ntextarea.form-control{\n max-width: 100%;\n max-height: 80px;\n padding: 10px 10px 0 0;\n resize: none;\n border: none;\n border: 1px solid $light-gray;\n border-radius: $border-radius-base;\n line-height: 2;\n}\n\n.has-success,\n.has-danger{\n\n &.form-group .form-control,\n &.form-group.no-border .form-control{\n padding-right: $padding-input-horizontal + 21;\n }\n}\n\n.form.form-newsletter .form-group{\n float: left;\n width: 78%;\n margin-right: 2%;\n margin-top: 9px;\n}\n\n.input-group .input-group-btn{\n padding: 0 12px;\n}\n\n// Input files - hide actual input - requires specific markup in the sample.\n.form-group input[type=file] {\n opacity: 0;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 100;\n}\n\n.form-text{\n font-size: $font-size-small;\n}\n\n.form-control-lg{\n padding: 0;\n font-size: inherit;\n line-height: 0;\n border-radius: 0;\n}\n\n.form-horizontal{\n .col-form-label,\n .label-on-right{\n padding: 10px 5px 0 15px;\n text-align: right;\n max-width: 180px;\n }\n\n .checkbox-radios{\n margin-bottom: 15px;\n\n .form-check:first-child{\n margin-top: 8px;\n }\n }\n\n .label-on-right{\n text-align: left;\n padding: 10px 15px 0 5px;\n }\n\n .form-check-inline{\n margin-top: 6px;\n }\n}\n", + "button,\ninput,\noptgroup,\nselect,\ntextarea{\n font-family: $sans-serif-family;\n}\nh1,h2,h3,h4,h5,h6{\n font-weight: $font-weight-normal;\n}\n\na{\n color: $primary-color;\n &:hover,\n &:focus{\n color: $primary-color;\n }\n}\nh1, .h1 {\n font-size: $font-size-h1;\n line-height: 1.15;\n margin-bottom: $margin-base-vertical * 2;\n\n small{\n font-weight: $font-weight-bold;\n text-transform: uppercase;\n opacity: .8;\n }\n}\nh2, .h2{\n font-size: $font-size-h2;\n margin-bottom: $margin-base-vertical * 2;\n}\nh3, .h3{\n font-size: $font-size-h3;\n margin-bottom: $margin-base-vertical * 2;\n line-height: 1.4em;\n}\nh4, .h4{\n font-size: $font-size-h4;\n line-height: 1.45em;\n margin-top: $margin-base-vertical * 2;\n margin-bottom: $margin-base-vertical;\n\n & + .category,\n &.title + .category{\n margin-top: -10px;\n }\n}\nh5, .h5 {\n font-size: $font-size-h5;\n line-height: 1.4em;\n margin-bottom: 15px;\n}\nh6, .h6{\n font-size: $font-size-h6;\n font-weight: $font-weight-bold;\n text-transform: uppercase;\n}\np{\n &.description{\n font-size: 1.14em;\n }\n}\n\n// i.fa{\n// font-size: 18px;\n// position: relative;\n// top: 1px;\n// }\n\n.title{\n font-weight: $font-weight-bold;\n\n &.title-up{\n text-transform: uppercase;\n\n a{\n color: $black-color;\n text-decoration: none;\n }\n }\n & + .category{\n margin-top: -10px;\n }\n}\n\n.description,\n.card-description,\n.footer-big p,\n.card .footer .stats{\n color: $dark-gray;\n font-weight: $font-weight-light;\n}\n.category,\n.card-category{\n text-transform: capitalize;\n font-weight: $font-weight-normal;\n color: $dark-gray;\n font-size: $font-size-mini;\n}\n\n.card-category{\n font-size: $font-size-h6;\n}\n\n.text-primary,\na.text-primary:focus, a.text-primary:hover {\n color: $brand-primary !important;\n}\n.text-info,\na.text-info:focus, a.text-info:hover {\n color: $brand-info !important;\n}\n.text-success,\na.text-success:focus, a.text-success:hover {\n color: $brand-success !important;\n}\n.text-warning,\na.text-warning:focus, a.text-warning:hover {\n color: $brand-warning !important;\n}\n.text-danger,\na.text-danger:focus, a.text-danger:hover {\n color: $brand-danger !important;\n}\n\n.text-gray,\na.text-gray:focus, a.text-gray:hover{\n color: $light-gray !important;\n}\n\n\n.blockquote{\n border-left: none;\n border: 1px solid $default-color;\n padding: 20px;\n font-size: $font-size-blockquote;\n line-height: 1.8;\n\n small{\n color: $default-color;\n font-size: $font-size-small;\n text-transform: uppercase;\n }\n\n &.blockquote-primary{\n border-color: $primary-color;\n color: $primary-color;\n\n small{\n color: $primary-color;\n }\n }\n\n &.blockquote-danger{\n border-color: $danger-color;\n color: $danger-color;\n\n small{\n color: $danger-color;\n }\n }\n\n &.blockquote-white{\n border-color: $opacity-8;\n color: $white-color;\n\n small{\n color: $opacity-8;\n }\n }\n}\n", + "body{\n color: $black-color;\n font-size: $font-size-base;\n font-family: $sans-serif-family;\n -moz-osx-font-smoothing: grayscale;\n -webkit-font-smoothing: antialiased;\n}\n\n.main{\n position: relative;\n background: $white-color;\n}\n/* Animations */\n.nav-pills .nav-link,\n.navbar,\n.nav-tabs .nav-link,\n.sidebar .nav a,\n.sidebar .nav a i,\n.animation-transition-general,\n.tag,\n.tag [data-role=\"remove\"],\n.animation-transition-general{\n @include transition($general-transition-time, $transition-ease);\n}\n\n//transition for dropdown caret\n.dropdown-toggle:after,\n.bootstrap-switch-label:before,\n.caret{\n @include transition($fast-transition-time, $transition-ease);\n}\n\n.dropdown-toggle[aria-expanded=\"true\"]:after,\na[data-toggle=\"collapse\"][aria-expanded=\"true\"] .caret,\n.card-collapse .card a[data-toggle=\"collapse\"][aria-expanded=\"true\"] i,\n.card-collapse .card a[data-toggle=\"collapse\"].expanded i{\n @include rotate-180();\n}\n\n.button-bar{\n display: block;\n position: relative;\n width: 22px;\n height: 1px;\n border-radius: 1px;\n background: $white-bg;\n\n & + .button-bar{\n margin-top: 7px;\n }\n\n &:nth-child(2){\n width: 17px;\n }\n}\n\n.caret{\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid\\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n\n.pull-left{\n float: left;\n}\n.pull-right{\n float: right;\n}\n\n\n.offline-doc {\n .navbar.navbar-transparent{\n padding-top: 25px;\n border-bottom: none;\n\n .navbar-minimize {\n display: none;\n }\n .navbar-brand,\n .collapse .navbar-nav .nav-link {\n color: $white-color !important;\n }\n }\n .footer {\n z-index: 3 !important;\n }\n .page-header{\n .container {\n z-index: 3;\n }\n &:after {\n background-color: rgba(0, 0, 0, 0.5);\n content: \"\";\n display: block;\n height: 100%;\n left: 0;\n position: absolute;\n top: 0;\n width: 100%;\n z-index: 2;\n }\n }\n}\n\n.fixed-plugin {\n .dropdown-menu li {\n padding: 2px !important;\n }\n}\n\n// badge color\n\n.badge{\n &.badge-default{\n @include badge-color($default-color);\n }\n &.badge-primary{\n @include badge-color($primary-color);\n }\n &.badge-info{\n @include badge-color($info-color);\n }\n &.badge-success{\n @include badge-color($success-color);\n }\n &.badge-warning{\n @include badge-color($warning-color);\n }\n &.badge-danger{\n @include badge-color($danger-color);\n }\n &.badge-neutral{\n @include badge-color($white-color);\n color: inherit;\n }\n}\n\n.card-user {\n form {\n .form-group {\n margin-bottom: 20px;\n }\n }\n}\n", + ".from-check,\n.form-check-radio {\n margin-bottom: 12px;\n position: relative;\n}\n\n.form-check {\n padding-left: 0;\n margin-bottom: .5rem;\n\n .form-check-label{\n display: inline-block;\n position: relative;\n cursor: pointer;\n padding-left: 35px;\n line-height: 26px;\n margin-bottom: 0;\n }\n\n .form-check-sign::before,\n .form-check-sign::after {\n content: \" \";\n display: inline-block;\n position: absolute;\n width: 24px;\n height: 24px;\n left: 0;\n cursor: pointer;\n border-radius: 6px;\n top: 0;\n background-color: #AAA7A4;\n -webkit-transition: opacity 0.3s linear;\n -moz-transition: opacity 0.3s linear;\n -o-transition: opacity 0.3s linear;\n -ms-transition: opacity 0.3s linear;\n transition: opacity 0.3s linear;\n }\n .form-check-sign::after {\n font-family: 'FontAwesome';\n content: \"\\f00c\";\n top: -1px;\n text-align: center;\n font-size: 15px;\n opacity: 0;\n color: #FFF;\n border: 0;\n background-color: inherit;\n }\n &.disabled{\n .form-check-label{\n color: $dark-gray;\n opacity: .5;\n cursor: not-allowed;\n }\n }\n\n}\n\n.form-check.disabled .form-check-label,\n.form-check.disabled .form-check-label {\n\n}\n\n.form-check input[type=\"checkbox\"],\n.form-check-radio input[type=\"radio\"]{\n opacity: 0;\n position: absolute;\n visibility: hidden;\n}\n.form-check input[type=\"checkbox\"]:checked + .form-check-sign::after{\n opacity: 1;\n}\n\n.form-control input[type=\"checkbox\"]:disabled + .form-check-sign::before,\n.checkbox input[type=\"checkbox\"]:disabled + .form-check-sign::after{\n cursor: not-allowed;\n}\n\n.form-check .form-check-label input[type=\"checkbox\"]:disabled + .form-check-sign,\n.form-check-radio input[type=\"radio\"]:disabled + .form-check-sign{\n pointer-events: none !important;\n}\n\n.form-check-radio{\n margin-left: -3px;\n\n .form-check-label{\n padding-left: 2rem;\n }\n &.disabled{\n .form-check-label{\n color: $dark-gray;\n opacity: .5;\n cursor: not-allowed;\n }\n }\n}\n\n.form-check-radio .form-check-sign::before{\n font-family: 'FontAwesome';\n content: \"\\f10c\";\n font-size: 22px;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n display: inline-block;\n position: absolute;\n opacity: .50;\n left: 5px;\n top: -5px;\n}\n\n.form-check-label input[type=\"checkbox\"]:checked + .form-check-sign:before{\n background-color: #66615B;\n}\n\n.form-check-radio input[type=\"radio\"] + .form-check-sign:after,\n.form-check-radio input[type=\"radio\"] {\n opacity: 0;\n @include transition-opacity(0.3s, linear);\n content:\" \";\n display: block;\n}\n\n.form-check-radio input[type=\"radio\"]:checked + .form-check-sign::after {\n font-family: 'FontAwesome';\n content: \"\\f192\";\n top: -5px;\n position: absolute;\n left: 5px;\n opacity: 1;\n font-size: 22px;\n}\n\n.form-check-radio input[type=\"radio\"]:checked + .form-check-sign::after{\n opacity: 1;\n}\n\n\n.form-check-radio input[type=\"radio\"]:disabled + .form-check-sign::before,\n.form-check-radio input[type=\"radio\"]:disabled + .form-check-sign::after {\n color: $dark-gray;\n}\n", + ".navbar{\n padding-top: $navbar-padding-base;\n padding-bottom: $navbar-padding-base;\n min-height: 53px;\n margin-bottom: 20px;\n\n a{\n vertical-align: middle;\n\n &:not(.btn):not(.dropdown-item){\n color: $white-color;\n }\n\n &.dropdown-item{\n color: $default-color;\n }\n }\n\n\n\n &.bg-white{\n .input-group .form-control,\n .input-group.no-border .form-control{\n color: $default-color;\n\n @include placeholder(){\n color: $default-color;\n };\n }\n .input-group-prepend .input-group-text i,\n .input-group-append .input-group-text i{\n color: $default-color;\n opacity: .5;\n }\n }\n\n .form-group,\n .input-group{\n margin: 0;\n margin-left: -3px;\n margin-right: 5px;\n\n .form-group-addon,\n .input-group-prepend .input-group-text,\n .input-group-append .input-group-text{\n color: $default-color;\n\n i {\n opacity: 1;\n }\n }\n\n &.no-border{\n .form-control{\n color: $default-color;\n\n @include placeholder(){\n color: $default-color;\n };\n }\n }\n }\n\n p{\n display: inline-block;\n margin: 0;\n line-height: 1.8em;\n font-size: 1em;\n font-weight: 400;\n }\n\n &.navbar-absolute{\n position: absolute;\n width: 100%;\n padding-top: 10px;\n z-index: 1029;\n }\n\n .documentation &{\n &.fixed-top{\n left: 0;\n width: initial;\n }\n }\n\n .navbar-wrapper{\n display: inline-flex;\n align-items: center;\n\n .navbar-minimize{\n padding-right: 10px;\n\n .btn{\n margin: 0;\n }\n }\n\n .navbar-toggle{\n .navbar-toggler{\n padding-left: 0;\n }\n\n &:hover{\n & .navbar-toggler-bar.bar2{\n width: 22px;\n }\n }\n }\n }\n\n\n\n .navbar-nav{\n &.navbar-logo{\n position: absolute;\n left: 0;\n right: 0;\n margin: 0 auto;\n width: 49px;\n top: -4px;\n }\n\n .nav-link.btn{\n padding: $padding-btn-vertical $padding-btn-horizontal;\n &.btn-lg{\n padding: $padding-large-vertical $padding-large-horizontal;\n }\n &.btn-sm{\n padding: $padding-small-vertical $padding-small-horizontal;\n }\n }\n\n .nav-link{\n text-transform: uppercase;\n font-size: $font-size-mini;\n padding: $padding-base-vertical $padding-base-horizontal;\n line-height: $line-height-nav-link;\n margin-right: 3px;\n\n i.fa + p,\n i.nc-icon + p{\n margin-left: 3px;\n }\n\n i.fa,\n i.nc-icon{\n font-size: 18px;\n position: relative;\n top: 3px;\n text-align: center;\n width: 21px;\n }\n\n i.nc-icon{\n top: 4px;\n font-size: 16px;\n }\n\n &.profile-photo{\n .profile-photo-small{\n width: 27px;\n height: 27px;\n }\n }\n\n &.disabled{\n opacity: .5;\n color: $white-color;\n }\n }\n\n .nav-item.active .nav-link:not(.btn),\n .nav-item .nav-link:not(.btn):focus,\n .nav-item .nav-link:not(.btn):hover,\n .nav-item .nav-link:not(.btn):active{\n border-radius: $border-radius-small;\n color: $default-color;\n }\n }\n\n .logo-container{\n width: 27px;\n height: 27px;\n overflow: hidden;\n margin: 0 auto;\n border-radius: 50%;\n border: 1px solid transparent;\n }\n\n .navbar-brand{\n text-transform: capitalize;\n font-size: $font-size-large-navbar;\n padding-top: $padding-base-vertical;\n padding-bottom: $padding-base-vertical;\n line-height: $line-height-nav-link;\n }\n\n .navbar-toggler{\n width: 37px;\n height: 27px;\n vertical-align: middle;\n outline: 0;\n cursor: pointer;\n\n & .navbar-toggler-bar.navbar-kebab{\n width: 3px;\n height: 3px;\n border-radius: 50%;\n margin: 0 auto;\n }\n }\n\n .button-dropdown{\n .navbar-toggler-bar:nth-child(2){\n width: 17px;\n }\n }\n\n &.navbar-transparent{\n background-color: $transparent-bg !important;\n box-shadow: none;\n border-bottom: 1px solid #ddd;\n\n a:not(.dropdown-item):not(.btn){\n color: $default-color;\n\n &.disabled{\n opacity: .5;\n color: $default-color;\n }\n }\n\n .button-bar{\n background: $default-color;\n }\n\n .nav-item .nav-link:not(.btn){\n color: $default-color;\n }\n .nav-item.active .nav-link:not(.btn),\n .nav-item .nav-link:not(.btn):focus,\n .nav-item .nav-link:not(.btn):hover,\n .nav-item .nav-link:not(.btn):focus:hover,\n .nav-item .nav-link:not(.btn):active {\n color: $primary-color;\n }\n }\n\n &.bg-white {\n a:not(.dropdown-item):not(.btn){\n color: $default-color;\n\n &.disabled{\n opacity: .5;\n color: $default-color;\n }\n }\n\n .button-bar{\n background: $default-color;\n }\n\n .nav-item.active .nav-link:not(.btn),\n .nav-item .nav-link:not(.btn):focus,\n .nav-item .nav-link:not(.btn):hover,\n .nav-item .nav-link:not(.btn):active{\n color: $info-color;\n }\n\n .logo-container{\n border: 1px solid $default-color;\n }\n }\n\n .navbar-collapse {\n .nav-item {\n a {\n font-size: $font-size-base;\n }\n }\n }\n}\n\n.bg-default{\n background-color: $default-color !important;\n}\n\n.bg-primary{\n background-color: $primary-color !important;\n}\n\n.bg-info{\n background-color: $info-color !important;\n}\n\n.bg-success{\n background-color: $success-color !important;\n}\n\n.bg-danger{\n background-color: $danger-color !important;\n}\n\n.bg-warning{\n background-color: $warning-color !important;\n}\n\n.bg-white{\n background-color: $white-color !important;\n}\n", + ".page-header{\n min-height: 100vh;\n max-height: 1000px;\n padding: 0;\n color: $white-color;\n position: relative;\n\n .page-header-image{\n position: absolute;\n background-size: cover;\n background-position: center center;\n width: 100%;\n height: 100%;\n z-index: -1;\n }\n\n .content-center{\n position: absolute;\n top: 50%;\n left: 50%;\n z-index: 2;\n -ms-transform: translate(-50%, -50%);\n -webkit-transform: translate(-50%, -50%);\n transform: translate(-50%, -50%);\n text-align: center;\n color: #FFFFFF;\n padding: 0 15px;\n width: 100%;\n max-width: 880px;\n\n }\n\n footer{\n position: absolute;\n bottom: 0;\n width: 100%;\n }\n\n .container{\n height: 100%;\n z-index: 1;\n }\n\n .category,\n .description{\n color: $opacity-8;\n }\n\n &.page-header-small{\n min-height: 60vh;\n max-height: 440px;\n }\n\n &.page-header-mini{\n min-height: 40vh;\n max-height: 340px;\n }\n\n .title{\n margin-bottom: 15px;\n }\n .title + h4{\n margin-top: 10px;\n }\n\n &:after,\n &:before{\n position: absolute;\n z-index: 0;\n width: 100%;\n height: 100%;\n display: block;\n left: 0;\n top: 0;\n content: \"\";\n }\n\n &:before{\n background-color: rgba(0,0,0,.3);\n }\n\n &[filter-color=\"orange\"]{\n @include linear-gradient(rgba($black-color,.20), rgba(224, 23, 3, 0.6));\n }\n}\n", + ".dropdown,\n.dropup,\n.bootstrap-select{\n .dropdown-menu{\n display: block;\n @include opacity(0);\n @include box-shadow($dropdown-shadow);\n visibility: hidden;\n position: absolute;\n transition: all 0.3s cubic-bezier(0.215, 0.61, 0.355, 1) 0s, opacity 0.3s ease 0s, height 0s linear 0.35s;\n\n &[x-placement=\"top-start\"]{\n @include transform-translate-y-dropdown(0px);\n\n }\n &[x-placement=\"bottom-start\"]{\n @include transform-translate-y-dropdown(0px);\n }\n }\n\n &.show .dropdown-menu{\n @include opacity(1);\n visibility: visible;\n\n &[x-placement=\"top-start\"]{\n @include transform-translate-y-dropdown(-50px);\n top: auto !important;\n bottom: 0 !important;\n\n }\n &[x-placement=\"bottom-start\"]{\n @include transform-translate-y-dropdown(50px);\n bottom: auto !important;\n top: 0 !important;\n }\n }\n\n}\n\n.dropup .dropdown-menu,\n.dropdown-btn .dropdown-menu{\n @include transform-translate-y-dropdown(0px);\n top: auto !important;\n bottom: 0 !important;\n\n}\n\n.dropup.show .dropdown-menu,\n.dropdown-btn.show .dropdown-menu{\n opacity: 1;\n visibility: visible;\n\n .dropdown-menu.inner{\n @include transform-translate-y(0px);\n }\n}\n\n.bootstrap-select.show{\n .dropdown-menu.show{\n &[x-placement=\"top-start\"]{\n @include transform-translate-y-dropdown(-60px);\n top: auto !important;\n bottom: 0 !important;\n }\n\n li:last-child {\n a:hover{\n border-radius: 0 0 12px 12px;\n }\n }\n }\n}\n\n.bootstrap-select.dropup.show{\n &:before {\n top: -1px !important;\n }\n\n &:after {\n top: -2px !important;\n }\n}\n.dropdown-menu{\n background-color: $white-color;\n border: 0 none;\n border-radius: $border-radius-extreme;\n margin-top: 10px;\n padding: 0px;\n\n .divider{\n background-color: $medium-pale-bg;\n margin: 0px;\n }\n\n .dropdown-header{\n color: $dark-gray;\n font-size: $font-size-small;\n padding: $padding-dropdown-vertical $padding-dropdown-horizontal;\n }\n\n .no-notification{\n color: #9A9A9A;\n font-size: 1.2em;\n padding: 30px 30px;\n text-align: center;\n }\n\n .dropdown-item{\n color: $font-color;\n font-size: $font-size-base;\n padding: 10px 45px 10px 15px;\n clear: both;\n white-space: nowrap;\n width: 100%;\n display: block;\n\n img{\n margin-top: -3px;\n }\n\n }\n .dropdown-item:focus{\n outline: 0 !important;\n }\n\n .btn-group.select &{\n min-width: 100%;\n }\n\n .dropdown-item:first-child{\n border-top-left-radius: $border-radius-extreme;\n border-top-right-radius: $border-radius-extreme;\n }\n\n .dropdown-item:last-child{\n border-bottom-left-radius: $border-radius-extreme;\n border-bottom-right-radius: $border-radius-extreme;\n }\n\n .select & .dropdown-item:first-child{\n border-radius: 0;\n border-bottom: 0 none;\n }\n\n .dropdown-item:hover,\n .dropdown-item:focus{\n color: $white-color !important;\n opacity: 1;\n text-decoration: none;\n\n }\n .dropdown-item:hover,\n .dropdown-item:focus{\n background-color: $default-color;\n }\n\n &.dropdown-primary .dropdown-item:hover,\n &.dropdown-primary .dropdown-item:focus{\n background-color: $bg-primary;\n }\n &.dropdown-info .dropdown-item:hover,\n &.dropdown-info .dropdown-item:focus{\n background-color: $bg-info;\n }\n &.dropdown-success .dropdown-item:hover,\n &.dropdown-success .dropdown-item:focus{\n background-color: $bg-success;\n }\n &.dropdown-warning .dropdown-item:hover,\n &.dropdown-warning .dropdown-item:focus{\n background-color: $bg-warning;\n }\n &.dropdown-danger .dropdown-item:hover,\n &.dropdown-danger .dropdown-item:focus{\n background-color: $bg-danger;\n }\n\n}\n.dropdown-divider{\n margin: 0 !important;\n}\n\n//fix bug for the select items in btn-group\n.btn-group.select{\n // overflow: hidden;\n}\n.btn-group.select.open{\n overflow: visible;\n}\n.dropdown-menu-right{\n right: -2px;\n left: auto;\n}\n\n.navbar-nav .dropdown-menu:before,\n.dropdown .dropdown-menu[x-placement=\"bottom-start\"]:before,\n.dropdown .dropdown-menu[x-placement=\"bottom-end\"]:before,\n.card.card-just-text .dropdown .dropdown-menu:before,\n.card-just-text .dropdown .dropdown-menu:before,\n.dropdown-btn .dropdown-menu:before{\n border-bottom: 11px solid $medium-pale-bg;\n border-left: 11px solid rgba(0, 0, 0, 0);\n border-right: 11px solid rgba(0, 0, 0, 0);\n content: \"\";\n display: inline-block;\n position: absolute;\n right: 12px;\n top: -12px;\n}\n\n.navbar-nav .dropdown-menu:after,\n.dropdown .dropdown-menu[x-placement=\"bottom-start\"]:after,\n.dropdown .dropdown-menu[x-placement=\"bottom-end\"]:after,\n.card.card-just-text .dropdown .dropdown-menu:after,\n.card-just-text .dropdown .dropdown-menu:after,\n.dropdown-btn .dropdown-menu:after{\n border-bottom: 11px solid $white-color;\n border-left: 11px solid rgba(0, 0, 0, 0);\n border-right: 11px solid rgba(0, 0, 0, 0);\n content: \"\";\n display: inline-block;\n position: absolute;\n right: 12px;\n top: -11px;\n}\n\n.dropdown .dropdown-menu.dropdown-notification[x-placement=\"top-start\"]:before,\n.dropdown .dropdown-menu.dropdown-notification[x-placement=\"bottom-start\"]:before{\n left: 30px !important;\n right: auto;\n}\n.dropdown .dropdown-menu.dropdown-notification[x-placement=\"top-start\"]:after,\n.dropdown .dropdown-menu.dropdown-notification[x-placement=\"bottom-start\"]:after{\n left: 30px !important;\n right: auto;\n}\n// the style for opening dropdowns on mobile devices; for the desktop version check the _responsive.scss file\n// code from _responsive.scss\n\n@media screen and (min-width: 768px){\n .navbar-form {\n margin-top: 21px;\n margin-bottom: 21px;\n padding-left: 5px;\n padding-right: 5px;\n }\n .navbar-search-form{\n display: none;\n }\n .navbar-nav .dropdown-item .dropdown-menu,\n .dropdown .dropdown-menu,\n .dropdown-btn .dropdown-menu{\n transform: translate3d(0px, -40px, 0px);\n transition: all 0.3s cubic-bezier(0.215, 0.61, 0.355, 1) 0s, opacity 0.3s ease 0s, height 0s linear 0.35s;\n }\n .navbar-nav .dropdown-item.show .dropdown-menu,\n .dropdown.show .dropdown-menu,\n .dropdown-btn.show .dropdown-menu{\n transform: translate3d(0px, 0px, 0px);\n visibility: visible !important;\n }\n .bootstrap-select .dropdown-menu{\n -webkit-transition: all 150ms linear;\n -moz-transition: all 150ms linear;\n -o-transition: all 150ms linear;\n -ms-transition: all 150ms linear;\n transition: all 150ms linear;\n }\n .bootstrap-datetimepicker-widget{\n visibility: visible !important;\n }\n\n .bootstrap-select .show .dropdown-menu{\n transition: all 0.3s cubic-bezier(0.215, 0.61, 0.355, 1) 0s, opacity 0.3s ease 0s, height 0s linear 0.35s;\n transform: translate3d(0px, 0px, 0px);\n }\n\n .navbar-nav.navbar-right li .dropdown-menu:before,\n .navbar-nav.navbar-right li .dropdown-menu:after{\n left: auto;\n right: 12px;\n }\n\n\n .footer:not(.footer-big){\n nav ul{\n li:first-child{\n margin-left: 0;\n }\n }\n }\n\n// no dragging the others navs in page\n body > .navbar-collapse.collapse{\n display: none !important;\n }\n}\n\n.dropdown-sharing{\n .dropup-item{\n color: $font-color;\n font-size: $font-size-base;\n\n .social-line{\n line-height: 28px;\n padding: 10px 20px 5px 20px !important;\n\n [class*=\"icon-\"]{\n font-size: 20px;\n }\n }\n &:last-child{\n margin: 0 13px;\n display: block;\n }\n .btn{\n margin: 10px;\n }\n }\n\n .dropup-item:hover,\n .dropup-item:focus{\n .social-line,\n .action-line{\n background-color: $white-color;\n color: $font-color;\n opacity: 1;\n text-decoration: none;\n }\n }\n}\n.show .dropdown-sharing,\n.show .dropdown-actions{\n margin-bottom: 1px;\n}\n\n.dropdown-actions{\n .dropdown-item{\n margin: -15px 35px;\n .action-line{\n padding: 5px 10px;\n line-height: 24px;\n font-weight: bold;\n [class*=\"icon-\"]{\n font-size: 24px;\n }\n .col-sm-9{\n line-height: 34px;\n }\n }\n .link-danger{\n color: $danger-color;\n &:hover, &:active, &:focus{\n color: $danger-color;\n }\n }\n }\n li:hover,\n li:focus{\n a{\n color: $font-color;\n opacity: 1;\n text-decoration: none;\n }\n }\n .action-line{\n .icon-simple{\n margin-left: -15px;\n }\n }\n}\n.dropdown .dropdown-menu[x-placement=\"top-start\"]:before,\n.dropdown .dropdown-menu[x-placement=\"top-end\"]:before,\n.dropup .dropdown-menu:before{\n border-top: 11px solid #DCD9D1;\n border-left: 11px solid transparent;\n border-right: 11px solid transparent;\n content: \"\";\n display: inline-block;\n position: absolute;\n right: 12px;\n bottom: -12px;\n}\n\n.dropdown .dropdown-menu[x-placement=\"top-start\"]:after,\n.dropdown .dropdown-menu[x-placement=\"top-end\"]:after,\n.dropup .dropdown-menu:after{\n border-top: 11px solid #FFF;\n border-left: 11px solid transparent;\n border-right: 11px solid transparent;\n content: \"\";\n display: inline-block;\n position: absolute;\n right: 12px;\n bottom: -11px;\n}\n\n.dropup,\n.dropdown{\n .dropdown-toggle:after{\n margin-left: 0;\n }\n}\n\n.dropdown-notification{\n .dropdown-notification-list{\n .notification-item{\n border-bottom: 1px solid #F1EAE0;\n font-size: 16px;\n color: #66615b;\n\n .notification-text{\n padding-left: 40px;\n position: relative;\n min-width: 330px;\n min-height: 70px;\n white-space: normal;\n\n\n .label{\n display: block;\n position: absolute;\n top: 50%;\n margin-top: -12px;\n left: 7px;\n }\n .message{\n font-size: 0.9em;\n line-height: 0.7;\n margin-left: 10px;\n }\n .time{\n color: #9A9A9A;\n font-size: 0.7em;\n margin-left: 10px;\n }\n }\n .read-notification{\n font-size: 12px;\n opacity: 0;\n position: absolute;\n right: 5px;\n top: 50%;\n margin-top: -12px;\n }\n &:hover{\n text-decoration: none;\n\n .notification-text{\n color: #66615b;\n background-color: #F0EFEB !important;\n }\n .read-notification{\n opacity: 1 !important;\n }\n }\n }\n\n }\n .dropdown-footer{\n background-color: #E8E7E3;\n border-radius: 0 0 8px 8px;\n\n .dropdown-footer-menu{\n list-style: outside none none;\n padding: 0px 5px;\n li{\n display: inline-block;\n text-align: left;\n padding: 0 10px;\n\n a{\n color: #9C9B99;\n font-size: 0.9em;\n line-height: 35px;\n }\n }\n }\n }\n}\n", + ".alert{\n border: 0;\n border-radius: $border-radius-small;\n color: $white-color;\n padding-top: .9rem;\n padding-bottom: .9rem;\n position: relative;\n\n &.alert-success{\n background-color: lighten($success-color, 5%);\n }\n\n &.alert-danger{\n background-color: lighten($danger-color, 5%);\n }\n\n &.alert-warning{\n background-color: lighten($warning-color, 5%);\n }\n\n &.alert-info{\n background-color: lighten($info-color, 5%);\n }\n\n &.alert-primary{\n background-color: lighten($primary-color, 5%);\n }\n\n .close{\n color: $white-color;\n opacity: .9;\n text-shadow: none;\n line-height: 0;\n outline: 0;\n\n i.fa,\n i.nc-icon{\n font-size: 14px !important;\n }\n\n &:hover,\n &:focus {\n opacity: 1;\n }\n }\n\n span[data-notify=\"icon\"]{\n font-size: 27px;\n display: block;\n left: 19px;\n position: absolute;\n top: 50%;\n margin-top: -11px;\n }\n\n button.close{\n position: absolute;\n right: 10px;\n top: 50%;\n margin-top: -13px;\n width: 25px;\n height: 25px;\n padding: 3px;\n }\n\n .close ~ span{\n display: block;\n max-width: 89%;\n }\n\n &.alert-with-icon{\n padding-left: 65px;\n }\n}\n", + "img{\n max-width: 100%;\n border-radius: $border-radius-small;\n}\n.img-raised{\n box-shadow: $box-shadow-raised;\n}\n", + "/*--------------------------------\n\nnucleo-icons Web Font - built using nucleoapp.com\nLicense - nucleoapp.com/license/\n\n-------------------------------- */\n@font-face {\n font-family: 'nucleo-icons';\n src: url('../fonts/nucleo-icons.eot');\n src: url('../fonts/nucleo-icons.eot') format('embedded-opentype'), url('../fonts/nucleo-icons.woff2') format('woff2'), url('../fonts/nucleo-icons.woff') format('woff'), url('../fonts/nucleo-icons.ttf') format('truetype'), url('../fonts/nucleo-icons.svg') format('svg');\n font-weight: normal;\n font-style: normal;\n}\n/*------------------------\n\tbase class definition\n-------------------------*/\n.nc-icon {\n display: inline-block;\n font: normal normal normal 14px/1 'nucleo-icons';\n font-size: inherit;\n speak: none;\n text-transform: none;\n /* Better Font Rendering */\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n/*------------------------\n change icon size\n-------------------------*/\n.nc-icon.lg {\n font-size: 1.33333333em;\n vertical-align: -16%;\n}\n.nc-icon.x2 {\n font-size: 2em;\n}\n.nc-icon.x3 {\n font-size: 3em;\n}\n/*----------------------------------\n add a square/circle background\n-----------------------------------*/\n.nc-icon.square,\n.nc-icon.circle {\n padding: 0.33333333em;\n vertical-align: -16%;\n background-color: #eee;\n}\n.nc-icon.circle {\n border-radius: 50%;\n}\n/*------------------------\n list icons\n-------------------------*/\n.nc-icon-ul {\n padding-left: 0;\n margin-left: 2.14285714em;\n list-style-type: none;\n}\n.nc-icon-ul > li {\n position: relative;\n}\n.nc-icon-ul > li > .nc-icon {\n position: absolute;\n left: -1.57142857em;\n top: 0.14285714em;\n text-align: center;\n}\n.nc-icon-ul > li > .nc-icon.lg {\n top: 0;\n left: -1.35714286em;\n}\n.nc-icon-ul > li > .nc-icon.circle,\n.nc-icon-ul > li > .nc-icon.square {\n top: -0.19047619em;\n left: -1.9047619em;\n}\n/*------------------------\n spinning icons\n-------------------------*/\n.nc-icon.spin {\n -webkit-animation: nc-icon-spin 2s infinite linear;\n -moz-animation: nc-icon-spin 2s infinite linear;\n animation: nc-icon-spin 2s infinite linear;\n}\n@-webkit-keyframes nc-icon-spin {\n 0% {\n -webkit-transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(360deg);\n }\n}\n@-moz-keyframes nc-icon-spin {\n 0% {\n -moz-transform: rotate(0deg);\n }\n 100% {\n -moz-transform: rotate(360deg);\n }\n}\n@keyframes nc-icon-spin {\n 0% {\n -webkit-transform: rotate(0deg);\n -moz-transform: rotate(0deg);\n -ms-transform: rotate(0deg);\n -o-transform: rotate(0deg);\n transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(360deg);\n -moz-transform: rotate(360deg);\n -ms-transform: rotate(360deg);\n -o-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n/*------------------------\n rotated/flipped icons\n-------------------------*/\n.nc-icon.rotate-90 {\n filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);\n -webkit-transform: rotate(90deg);\n -moz-transform: rotate(90deg);\n -ms-transform: rotate(90deg);\n -o-transform: rotate(90deg);\n transform: rotate(90deg);\n}\n.nc-icon.rotate-180 {\n filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);\n -webkit-transform: rotate(180deg);\n -moz-transform: rotate(180deg);\n -ms-transform: rotate(180deg);\n -o-transform: rotate(180deg);\n transform: rotate(180deg);\n}\n.nc-icon.rotate-270 {\n filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);\n -webkit-transform: rotate(270deg);\n -moz-transform: rotate(270deg);\n -ms-transform: rotate(270deg);\n -o-transform: rotate(270deg);\n transform: rotate(270deg);\n}\n.nc-icon.flip-y {\n filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0);\n -webkit-transform: scale(-1, 1);\n -moz-transform: scale(-1, 1);\n -ms-transform: scale(-1, 1);\n -o-transform: scale(-1, 1);\n transform: scale(-1, 1);\n}\n.nc-icon.flip-x {\n filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);\n -webkit-transform: scale(1, -1);\n -moz-transform: scale(1, -1);\n -ms-transform: scale(1, -1);\n -o-transform: scale(1, -1);\n transform: scale(1, -1);\n}\n/*------------------------\n\tfont icons\n-------------------------*/\n\n.nc-air-baloon::before {\n content: \"\\ea01\";\n}\n\n.nc-album-2::before {\n content: \"\\ea02\";\n}\n\n.nc-alert-circle-i::before {\n content: \"\\ea04\";\n}\n\n.nc-align-center::before {\n content: \"\\ea03\";\n}\n\n.nc-align-left-2::before {\n content: \"\\ea05\";\n}\n\n.nc-ambulance::before {\n content: \"\\ea06\";\n}\n\n.nc-app::before {\n content: \"\\ea07\";\n}\n\n.nc-atom::before {\n content: \"\\ea08\";\n}\n\n.nc-badge::before {\n content: \"\\ea09\";\n}\n\n.nc-bag-16::before {\n content: \"\\ea0a\";\n}\n\n.nc-bank::before {\n content: \"\\ea0b\";\n}\n\n.nc-basket::before {\n content: \"\\ea0c\";\n}\n\n.nc-bell-55::before {\n content: \"\\ea0d\";\n}\n\n.nc-bold::before {\n content: \"\\ea0e\";\n}\n\n.nc-book-bookmark::before {\n content: \"\\ea0f\";\n}\n\n.nc-bookmark-2::before {\n content: \"\\ea10\";\n}\n\n.nc-box-2::before {\n content: \"\\ea11\";\n}\n\n.nc-box::before {\n content: \"\\ea12\";\n}\n\n.nc-briefcase-24::before {\n content: \"\\ea13\";\n}\n\n.nc-bulb-63::before {\n content: \"\\ea14\";\n}\n\n.nc-bullet-list-67::before {\n content: \"\\ea15\";\n}\n\n.nc-bus-front-12::before {\n content: \"\\ea16\";\n}\n\n.nc-button-pause::before {\n content: \"\\ea17\";\n}\n\n.nc-button-play::before {\n content: \"\\ea18\";\n}\n\n.nc-button-power::before {\n content: \"\\ea19\";\n}\n\n.nc-calendar-60::before {\n content: \"\\ea1a\";\n}\n\n.nc-camera-compact::before {\n content: \"\\ea1b\";\n}\n\n.nc-caps-small::before {\n content: \"\\ea1c\";\n}\n\n.nc-cart-simple::before {\n content: \"\\ea1d\";\n}\n\n.nc-chart-bar-32::before {\n content: \"\\ea1e\";\n}\n\n.nc-chart-pie-36::before {\n content: \"\\ea1f\";\n}\n\n.nc-chat-33::before {\n content: \"\\ea20\";\n}\n\n.nc-check-2::before {\n content: \"\\ea21\";\n}\n\n.nc-circle-10::before {\n content: \"\\ea22\";\n}\n\n.nc-cloud-download-93::before {\n content: \"\\ea23\";\n}\n\n.nc-cloud-upload-94::before {\n content: \"\\ea24\";\n}\n\n.nc-compass-05::before {\n content: \"\\ea25\";\n}\n\n.nc-controller-modern::before {\n content: \"\\ea26\";\n}\n\n.nc-credit-card::before {\n content: \"\\ea27\";\n}\n\n.nc-delivery-fast::before {\n content: \"\\ea28\";\n}\n\n.nc-diamond::before {\n content: \"\\ea29\";\n}\n\n.nc-email-85::before {\n content: \"\\ea2a\";\n}\n\n.nc-favourite-28::before {\n content: \"\\ea2b\";\n}\n\n.nc-glasses-2::before {\n content: \"\\ea2c\";\n}\n\n.nc-globe-2::before {\n content: \"\\ea2d\";\n}\n\n.nc-globe::before {\n content: \"\\ea2e\";\n}\n\n.nc-hat-3::before {\n content: \"\\ea2f\";\n}\n\n.nc-headphones::before {\n content: \"\\ea30\";\n}\n\n.nc-html5::before {\n content: \"\\ea31\";\n}\n\n.nc-image::before {\n content: \"\\ea32\";\n}\n\n.nc-istanbul::before {\n content: \"\\ea33\";\n}\n\n.nc-key-25::before {\n content: \"\\ea34\";\n}\n\n.nc-laptop::before {\n content: \"\\ea35\";\n}\n\n.nc-layout-11::before {\n content: \"\\ea36\";\n}\n\n.nc-lock-circle-open::before {\n content: \"\\ea37\";\n}\n\n.nc-map-big::before {\n content: \"\\ea38\";\n}\n\n.nc-minimal-down::before {\n content: \"\\ea39\";\n}\n\n.nc-minimal-left::before {\n content: \"\\ea3a\";\n}\n\n.nc-minimal-right::before {\n content: \"\\ea3b\";\n}\n\n.nc-minimal-up::before {\n content: \"\\ea3c\";\n}\n\n.nc-mobile::before {\n content: \"\\ea3d\";\n}\n\n.nc-money-coins::before {\n content: \"\\ea3e\";\n}\n\n.nc-note-03::before {\n content: \"\\ea3f\";\n}\n\n.nc-palette::before {\n content: \"\\ea40\";\n}\n\n.nc-paper::before {\n content: \"\\ea41\";\n}\n\n.nc-pin-3::before {\n content: \"\\ea42\";\n}\n\n.nc-planet::before {\n content: \"\\ea43\";\n}\n\n.nc-refresh-69::before {\n content: \"\\ea44\";\n}\n\n.nc-ruler-pencil::before {\n content: \"\\ea45\";\n}\n\n.nc-satisfied::before {\n content: \"\\ea46\";\n}\n\n.nc-scissors::before {\n content: \"\\ea47\";\n}\n\n.nc-send::before {\n content: \"\\ea48\";\n}\n\n.nc-settings-gear-65::before {\n content: \"\\ea49\";\n}\n\n.nc-settings::before {\n content: \"\\ea4a\";\n}\n\n.nc-share-66::before {\n content: \"\\ea4b\";\n}\n\n.nc-shop::before {\n content: \"\\ea4c\";\n}\n\n.nc-simple-add::before {\n content: \"\\ea4d\";\n}\n\n.nc-simple-delete::before {\n content: \"\\ea4e\";\n}\n\n.nc-simple-remove::before {\n content: \"\\ea4f\";\n}\n\n.nc-single-02::before {\n content: \"\\ea50\";\n}\n\n.nc-single-copy-04::before {\n content: \"\\ea51\";\n}\n\n.nc-sound-wave::before {\n content: \"\\ea52\";\n}\n\n.nc-spaceship::before {\n content: \"\\ea53\";\n}\n\n.nc-sun-fog-29::before {\n content: \"\\ea54\";\n}\n\n.nc-support-17::before {\n content: \"\\ea55\";\n}\n\n.nc-tablet-2::before {\n content: \"\\ea56\";\n}\n\n.nc-tag-content::before {\n content: \"\\ea57\";\n}\n\n.nc-tap-01::before {\n content: \"\\ea58\";\n}\n\n.nc-tie-bow::before {\n content: \"\\ea59\";\n}\n\n.nc-tile-56::before {\n content: \"\\ea5a\";\n}\n\n.nc-time-alarm::before {\n content: \"\\ea5b\";\n}\n\n.nc-touch-id::before {\n content: \"\\ea5c\";\n}\n\n.nc-trophy::before {\n content: \"\\ea5d\";\n}\n\n.nc-tv-2::before {\n content: \"\\ea5e\";\n}\n\n.nc-umbrella-13::before {\n content: \"\\ea5f\";\n}\n\n.nc-user-run::before {\n content: \"\\ea60\";\n}\n\n.nc-vector::before {\n content: \"\\ea61\";\n}\n\n.nc-watch-time::before {\n content: \"\\ea62\";\n}\n\n.nc-world-2::before {\n content: \"\\ea63\";\n}\n\n.nc-zoom-split::before {\n content: \"\\ea64\";\n}\n\n\n/* all icon font classes list here */\n", + ".table{\n\n .img-wrapper{\n width: 40px;\n height: 40px;\n border-radius: 50%;\n overflow: hidden;\n margin: 0 auto;\n }\n\n .img-row{\n max-width: 60px;\n width: 60px;\n }\n\n .form-check{\n margin: 0;\n\n & label .form-check-sign::before,\n & label .form-check-sign::after{\n top: -17px;\n left: 4px;\n }\n }\n\n .btn{\n margin: 0;\n }\n\n small,.small{\n font-weight: 300;\n }\n\n .card-tasks .card-body &{\n margin-bottom: 0;\n\n > thead > tr > th,\n > tbody > tr > th,\n > tfoot > tr > th,\n > thead > tr > td,\n > tbody > tr > td,\n > tfoot > tr > td{\n padding-top: 0;\n padding-bottom: 0;\n }\n }\n\n > thead > tr > th{\n font-size: 14px;\n font-weight: $font-weight-bold;\n padding-bottom: 0;\n text-transform: uppercase;\n border: 0;\n }\n\n .radio,\n .checkbox{\n margin-top: 0;\n margin-bottom: 0;\n padding: 0;\n width: 15px;\n\n .icons{\n position: relative;\n }\n\n label{\n &:after,\n &:before{\n top: -17px;\n left: -3px;\n }\n }\n }\n > thead > tr > th,\n > tbody > tr > th,\n > tfoot > tr > th,\n > thead > tr > td,\n > tbody > tr > td,\n > tfoot > tr > td{\n padding: 12px 7px;\n vertical-align: middle;\n }\n\n .th-description{\n max-width: 150px;\n }\n .td-price{\n font-size: 26px;\n font-weight: $font-weight-light;\n margin-top: 5px;\n position: relative;\n top: 4px;\n text-align: right;\n }\n .td-total{\n font-weight: $font-weight-bold;\n font-size: $font-size-h5;\n padding-top: 20px;\n text-align: right;\n }\n\n .td-actions .btn{\n margin: 0px;\n }\n\n > tbody > tr{\n position: relative;\n }\n}\n\n.table-shopping{\n > thead > tr > th{\n font-size: $font-size-h6;\n text-transform: uppercase;\n }\n > tbody > tr > td{\n font-size: $font-paragraph;\n\n b{\n display: block;\n margin-bottom: 5px;\n }\n }\n .td-name{\n font-weight: $font-weight-normal;\n font-size: 1.5em;\n small{\n color: $dark-gray;\n font-size: 0.75em;\n font-weight: $font-weight-light;\n }\n }\n .td-number{\n font-weight: $font-weight-light;\n font-size: $font-size-h4;\n }\n .td-name{\n min-width: 200px;\n }\n .td-number{\n text-align: right;\n min-width: 170px;\n\n small{\n margin-right: 3px;\n }\n }\n\n .img-container{\n width: 120px;\n max-height: 160px;\n overflow: hidden;\n display: block;\n\n img{\n width: 100%;\n }\n }\n}\n\n.table-responsive{\n overflow: scroll;\n padding-bottom: 10px;\n}\n\n#tables .table-responsive{\n margin-bottom: 30px;\n}\n\n.table-hover>tbody>tr:hover{\n background-color: #f5f5f5;\n}\n", + ".wrapper{\n position: relative;\n top: 0;\n height: 100vh;\n\n &.wrapper-full-page{\n min-height: 100vh;\n height: auto;\n }\n}\n\n.sidebar,\n.off-canvas-sidebar{\n position: fixed;\n top: 0;\n height: 100%;\n bottom: 0;\n width: 260px;\n left: 0;\n z-index: 1030;\n border-right: 1px solid #ddd;\n\n .sidebar-wrapper{\n position: relative;\n height: calc(100vh - 75px);\n overflow: auto;\n width: 260px;\n z-index: 4;\n padding-bottom: 100px;\n\n .dropdown .dropdown-backdrop{\n display: none !important;\n }\n\n .navbar-form{\n border: none;\n }\n }\n\n .navbar-minimize{\n position: absolute;\n right: 20px;\n top: 2px;\n opacity: 1;\n\n @extend .animation-transition-general;\n }\n .logo-tim{\n border-radius: 50%;\n border: 1px solid #333;\n display: block;\n height: 61px;\n width: 61px;\n float: left;\n overflow: hidden;\n\n img{\n width: 60px;\n height: 60px;\n }\n }\n\n .nav{\n margin-top: 20px;\n display: block;\n\n .caret{\n top: 14px;\n position: absolute;\n right: 10px;\n }\n\n li{\n > a + div .nav li > a{\n margin-top: 7px;\n }\n\n > a{\n margin: 10px 15px 0;\n color: $white-color;\n display: block;\n text-decoration: none;\n position: relative;\n text-transform: uppercase;\n cursor: pointer;\n font-size: 12px;\n padding: 10px 8px;\n line-height: 30px;\n opacity: .7;\n }\n\n .nav > li > a{\n padding: 5px 8px;\n }\n\n &.active > a,\n &.active > a > i {\n opacity: 1;\n }\n\n &:hover:not(.active) > a,\n &:focus:not(.active) > a {\n opacity: 1;\n }\n }\n\n i{\n font-size: 24px;\n float: left;\n margin-right: 12px;\n line-height: 30px;\n width: 34px;\n text-align: center;\n color: $opacity-5;\n position: relative;\n }\n\n p {\n margin-bottom: 0;\n }\n\n .collapse,\n .collapsing {\n .nav {\n margin-top: 0;\n }\n }\n }\n\n .sidebar-background{\n position: absolute;\n z-index: 1;\n height: 100%;\n width: 100%;\n display: block;\n top: 0;\n left: 0;\n background-size: cover;\n background-position: center center;\n\n &:after{\n position: absolute;\n z-index: 3;\n width: 100%;\n height: 100%;\n content: \"\";\n display: block;\n background: #FFFFFF;\n opacity: 1;\n }\n }\n\n .logo{\n position: relative;\n padding: 7px $padding-base-horizontal;\n z-index: 4;\n\n a.logo-mini,\n a.logo-normal{\n @extend .animation-transition-general;\n }\n\n a.logo-mini{\n opacity: 1;\n float: left;\n width: 34px;\n text-align: center;\n margin-left: 10px;\n margin-right: 12px;\n }\n\n a.logo-normal{\n display: block;\n opacity: 1;\n padding: 11px 0 8px;\n @include transform-translate-x(0px);\n }\n\n &:after{\n content: '';\n position: absolute;\n bottom: 0;\n right: 15px;\n height: 1px;\n width: calc(100% - 30px);\n background-color: $opacity-5;\n\n }\n\n p{\n float: left;\n font-size: 20px;\n margin: 10px 10px;\n color: $white-color;\n line-height: 20px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n }\n\n .simple-text{\n text-transform: uppercase;\n padding: $padding-base-vertical 0;\n display: block;\n white-space: nowrap;\n font-size: $font-size-large;\n color: $white-color;\n text-decoration: none;\n font-weight: $font-weight-normal;\n line-height: 30px;\n overflow: hidden;\n }\n }\n\n .logo-tim{\n border-radius: 50%;\n border: 1px solid #333;\n display: block;\n height: 61px;\n width: 61px;\n float: left;\n overflow: hidden;\n\n img{\n width: 60px;\n height: 60px;\n }\n }\n\n &:before,\n &:after{\n display: block;\n content: \"\";\n opacity: 1;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n }\n\n &:after{\n @include icon-gradient($default-color);\n z-index: 3;\n }\n\n &[data-color=\"white\"]{\n @include sidebar-color($white-color);\n @include sidebar-text-color($default-color);\n }\n &[data-color=\"black\"]{\n @include sidebar-color($dark-color);\n }\n\n\n // Active color changing\n\n &[data-active-color=\"primary\"]{\n @include sidebar-active-color($primary-color);\n }\n &[data-active-color=\"info\"]{\n @include sidebar-active-color($info-color);\n }\n &[data-active-color=\"success\"]{\n @include sidebar-active-color($success-color);\n }\n &[data-active-color=\"warning\"]{\n @include sidebar-active-color($warning-color);\n }\n &[data-active-color=\"danger\"]{\n @include sidebar-active-color($danger-color);\n }\n}\n\n.visible-on-sidebar-regular{\n display: inline-block !important;\n}\n.visible-on-sidebar-mini{\n display: none !important;\n}\n\n.off-canvas-sidebar{\n .nav {\n > li > a,\n > li > a:hover{\n color: $white-color;\n }\n\n > li > a:focus{\n background: rgba(200, 200, 200, 0.2);\n }\n }\n}\n\n\n.main-panel{\n position: relative;\n float: right;\n width: $sidebar-width;\n background-color: #f4f3ef;;\n\n\n @include transition (0.50s, cubic-bezier(0.685, 0.0473, 0.346, 1));\n\n > .content{\n padding: 0 30px 30px;\n min-height: calc(100vh - 123px);\n margin-top: 93px;\n }\n\n > .navbar{\n margin-bottom: 0;\n }\n\n\n .header{\n margin-bottom: 50px;\n }\n}\n\n\n.perfect-scrollbar-on{\n .sidebar,\n .main-panel{\n height: 100%;\n max-height: 100%;\n }\n}\n\n.panel-header {\n height: 260px;\n padding-top: 80px;\n padding-bottom: 45px;\n background: #141E30; /* fallback for old browsers */\n background: -webkit-gradient(linear, left top, right top, from(#0c2646), color-stop(60%, #204065), to(#2a5788));\n background: linear-gradient(to right, #0c2646 0%, #204065 60%, #2a5788 100%);\n position: relative;\n overflow: hidden;\n\n .header{\n .title{\n color: $white-color;\n }\n .category{\n max-width: 600px;\n color: $opacity-5;\n margin: 0 auto;\n font-size: 13px;\n\n a{\n color: $white-color;\n }\n }\n }\n}\n\n.panel-header-sm{\n height: 135px;\n}\n\n.panel-header-lg{\n height: 380px\n}\n", + ".footer{\n padding: 24px 0;\n\n &.footer-default{\n background-color: #f2f2f2;\n }\n\n nav{\n display: inline-block;\n float: left;\n padding-left: 0;\n }\n\n ul{\n margin-bottom: 0;\n padding: 0;\n list-style: none;\n\n li{\n display: inline-block;\n\n a{\n color: inherit;\n padding: $padding-base-vertical;\n font-size: $font-size-small;\n text-transform: uppercase;\n text-decoration: none;\n\n &:hover{\n text-decoration: none;\n }\n }\n }\n }\n\n .copyright{\n font-size: $font-size-small;\n line-height: 1.8;\n }\n\n &:after{\n display: table;\n clear: both;\n content: \" \";\n }\n}\n", + ".fixed-plugin{\n position: fixed;\n right: 0;\n width: 64px;\n background: rgba(0,0,0,.3);\n z-index: 1031;\n border-radius: 8px 0 0 8px;\n text-align: center;\n top: 120px;\n\n li > a,\n .badge{\n transition: all .34s;\n -webkit-transition: all .34s;\n -moz-transition: all .34s;\n }\n\n .fa-cog{\n color: #FFFFFF;\n padding: 10px;\n border-radius: 0 0 6px 6px;\n width: auto;\n }\n\n .dropdown-menu{\n right: 80px;\n left: auto !important;\n top: -52px !important;\n width: 290px;\n border-radius: 10px;\n padding: 0 10px;\n }\n\n .dropdown .dropdown-menu .nc-icon{\n top: 2px;\n right: 10px;\n font-size: 14px;\n }\n\n .dropdown-menu:after,\n .dropdown-menu:before{\n right: 10px;\n margin-left: auto;\n left: auto;\n }\n\n .fa-circle-thin{\n color: #FFFFFF;\n }\n\n .active .fa-circle-thin{\n color: #00bbff;\n }\n\n .dropdown-menu > .active > a,\n .dropdown-menu > .active > a:hover,\n .dropdown-menu > .active > a:focus{\n color: #777777;\n text-align: center;\n }\n\n img{\n border-radius: 0;\n width: 100%;\n height: 100px;\n margin: 0 auto;\n }\n\n .dropdown-menu li > a:hover,\n .dropdown-menu li > a:focus{\n box-shadow: none;\n }\n\n .badge{\n border: 3px solid #FFFFFF;\n border-radius: 50%;\n cursor: pointer;\n display: inline-block;\n height: 23px;\n margin-right: 5px;\n position: relative;\n width: 23px;\n\n &.badge-light {\n border: 1px solid $light-gray;\n\n &.active,\n &:hover {\n border: 3px solid #0bf;\n }\n }\n }\n\n .badge.active,\n .badge:hover{\n border-color: #00bbff;\n }\n\n .badge-blue{\n background-color: $brand-info;\n }\n .badge-green{\n background-color: $brand-success;\n }\n .badge-orange{\n background-color: $brand-primary;\n }\n .badge-yellow{\n background-color: $brand-warning;\n }\n .badge-red{\n background-color: $brand-danger;\n }\n\n h5{\n font-size: 14px;\n margin: 10px;\n }\n\n .dropdown-menu li{\n display: block;\n padding: 15px 2px;\n width: 25%;\n float: left;\n }\n\n li.adjustments-line,\n li.header-title,\n li.button-container{\n width: 100%;\n height: 35px;\n min-height: inherit;\n }\n\n li.button-container{\n height: auto;\n\n div{\n margin-bottom: 5px;\n }\n }\n\n #sharrreTitle{\n text-align: center;\n padding: 10px 0;\n height: 50px;\n }\n\n li.header-title{\n height: 30px;\n line-height: 25px;\n font-size: 12px;\n font-weight: 600;\n text-align: center;\n text-transform: uppercase;\n }\n\n .adjustments-line{\n p{\n float: left;\n display: inline-block;\n margin-bottom: 0;\n font-size: 1em;\n color: #3C4858;\n }\n\n a{\n color: transparent;\n\n .badge-colors{\n position: relative;\n top: -2px;\n }\n\n a:hover,\n a:focus{\n color: transparent;\n }\n }\n\n .togglebutton{\n text-align: center;\n\n .label-switch{\n position: relative;\n left: -10px;\n font-size: $font-size-mini;\n color: $default-color;\n\n &.label-right{\n left: 10px;\n }\n }\n\n .toggle{\n margin-right: 0;\n }\n }\n\n .dropdown-menu > li.adjustments-line > a{\n padding-right: 0;\n padding-left: 0;\n border-bottom: 1px solid #ddd;\n border-radius: 0;\n margin: 0;\n }\n }\n\n\n\n .dropdown-menu{\n > li{\n & > a.img-holder{\n font-size: 16px;\n text-align: center;\n border-radius: 10px;\n background-color: #FFF;\n border: 3px solid #FFF;\n padding-left: 0;\n padding-right: 0;\n opacity: 1;\n cursor: pointer;\n display: block;\n max-height: 100px;\n overflow: hidden;\n padding: 0;\n\n img{\n margin-top: auto;\n }\n }\n\n a.switch-trigger:hover,\n & > a.switch-trigger:focus{\n background-color: transparent;\n }\n\n &:hover,\n &:focus{\n > a.img-holder{\n border-color: rgba(0, 187, 255, 0.53);;\n }\n }\n }\n\n > .active > a.img-holder,\n > .active > a.img-holder{\n border-color: #00bbff;\n background-color: #FFFFFF;\n }\n\n }\n\n .btn-social{\n width: 50%;\n display: block;\n width: 48%;\n float: left;\n font-weight: 600;\n }\n\n .btn-social{\n i{\n margin-right: 5px;\n }\n\n &:first-child{\n margin-right: 2%;\n }\n }\n\n .dropdown{\n .dropdown-menu{\n transform-origin: 0 0;\n\n &:before{\n border-bottom: 16px solid rgba(0, 0, 0, 0);\n border-left: 16px solid rgba(0,0,0,0.2);\n border-top: 16px solid rgba(0,0,0,0);\n right: -27px;\n bottom: 425px;\n }\n\n &:after{\n border-bottom: 16px solid rgba(0, 0, 0, 0);\n border-left: 16px solid #FFFFFF;\n border-top: 16px solid rgba(0,0,0,0);\n right: -26px;\n bottom: 425px;\n }\n\n &:before,\n &:after{\n content: \"\";\n display: inline-block;\n position: absolute;\n width: 16px;\n transform: translateY(-50px);\n -webkit-transform: translateY(-50px);\n -moz-transform: translateY(-50px);\n }\n }\n\n &.show-dropdown .show{\n .dropdown-menu .show{\n transform: translate3d(0, -60px, 0)!important;\n bottom: auto!important;\n top: 0!important;\n }\n }\n }\n\n .bootstrap-switch{\n margin:0;\n }\n}\n\n.fixed-plugin {\n .show-dropdown {\n .dropdown-menu[x-placement=bottom-start] {\n @include transform-translate-y-fixed-plugin (-100px);\n\n &:before,\n &:after {\n top: 100px;\n }\n }\n .dropdown-menu[x-placement=top-start] {\n @include transform-translate-y-fixed-plugin (100px);\n }\n\n &.show {\n .dropdown-menu.show[x-placement=bottom-start] {\n @include transform-translate-y-fixed-plugin (-60px);\n }\n\n .dropdown-menu.show[x-placement=top-start] {\n @include transform-translate-y-fixed-plugin (470px);\n }\n }\n }\n}\n", + ".card{\n border-radius: $border-radius-extreme;\n box-shadow: 0 6px 10px -4px rgba(0, 0, 0, 0.15);\n background-color: #FFFFFF;\n color: $card-black-color;\n margin-bottom: 20px;\n position: relative;\n border: 0 none;\n\n -webkit-transition: transform 300ms cubic-bezier(0.34, 2, 0.6, 1), box-shadow 200ms ease;\n -moz-transition: transform 300ms cubic-bezier(0.34, 2, 0.6, 1), box-shadow 200ms ease;\n -o-transition: transform 300ms cubic-bezier(0.34, 2, 0.6, 1), box-shadow 200ms ease;\n -ms-transition: transform 300ms cubic-bezier(0.34, 2, 0.6, 1), box-shadow 200ms ease;\n transition: transform 300ms cubic-bezier(0.34, 2, 0.6, 1), box-shadow 200ms ease;\n\n .card-body{\n padding: 15px 15px 10px 15px;\n\n &.table-full-width{\n padding-left: 0;\n padding-right: 0;\n }\n }\n\n .card-header{\n &:not([data-background-color]){\n background-color: transparent;\n }\n padding: 15px 15px 0;\n border: 0;\n\n .card-title{\n margin-top: 10px;\n }\n }\n\n .map{\n border-radius: $border-radius-small;\n\n &.map-big{\n height: 400px;\n }\n }\n\n &[data-background-color=\"orange\"]{\n background-color: $primary-color;\n\n .card-header{\n background-color: $primary-color;\n }\n\n .card-footer{\n .stats{\n color: $white-color;\n }\n }\n }\n\n &[data-background-color=\"red\"]{\n background-color: $danger-color;\n }\n\n &[data-background-color=\"yellow\"]{\n background-color: $warning-color;\n }\n\n &[data-background-color=\"blue\"]{\n background-color: $info-color;\n }\n\n &[data-background-color=\"green\"]{\n background-color: $success-color;\n }\n\n .image{\n overflow: hidden;\n height: 200px;\n position: relative;\n }\n\n .avatar{\n width: 30px;\n height: 30px;\n overflow: hidden;\n border-radius: 50%;\n margin-bottom: 15px;\n }\n\n .numbers {\n font-size: 2em;\n }\n\n .big-title {\n font-size: 12px;\n text-align: center;\n font-weight: 500;\n padding-bottom: 15px;\n }\n\n label{\n font-size: $font-size-small;\n margin-bottom: 5px;\n color: $dark-gray;\n }\n\n .card-footer{\n background-color: transparent;\n border: 0;\n\n\n .stats{\n i{\n margin-right: 5px;\n position: relative;\n top: 0px;\n color: $default-color;\n }\n }\n\n .btn{\n margin: 0;\n }\n }\n\n &.card-plain{\n background-color: transparent;\n box-shadow: none;\n border-radius: 0;\n\n\n .card-body{\n padding-left: 5px;\n padding-right: 5px;\n }\n\n img{\n border-radius: $border-radius-extreme;\n }\n }\n}\n", + "\n.card-plain{\n background: transparent;\n box-shadow: none;\n\n .card-header,\n .card-footer{\n margin-left: 0;\n margin-right: 0;\n background-color: transparent;\n }\n\n &:not(.card-subcategories).card-body{\n padding-left: 0;\n padding-right: 0;\n }\n}\n", + ".card-chart {\n .card-header{\n .card-title{\n margin-top: 10px;\n margin-bottom: 0;\n }\n .card-category{\n margin-bottom: 5px;\n }\n }\n\n .table{\n margin-bottom: 0;\n\n td{\n border-top: none;\n border-bottom: 1px solid #e9ecef;\n }\n }\n\n .card-progress {\n margin-top: 30px;\n }\n\n .chart-area {\n height: 190px;\n width: calc(100% + 30px);\n margin-left: -15px;\n margin-right: -15px;\n }\n .card-footer {\n margin-top: 15px;\n\n .stats{\n color: $dark-gray;\n }\n }\n\n .dropdown{\n position: absolute;\n right: 20px;\n top: 20px;\n\n .btn{\n margin: 0;\n }\n }\n}\n", + ".card-user{\n .image{\n height: 130px;\n\n img {\n border-radius: 12px;\n }\n }\n\n .author{\n text-align: center;\n text-transform: none;\n margin-top: -77px;\n\n a + p.description{\n margin-top: -7px;\n }\n }\n\n .avatar{\n width: 124px;\n height: 124px;\n border: 1px solid $white-color;\n position: relative;\n }\n\n .card-body{\n min-height: 240px;\n }\n\n hr{\n margin: 5px 15px 15px;\n }\n\n .card-body + .card-footer {\n padding-top: 0;\n }\n\n .card-footer {\n h5 {\n font-size: 1.25em;\n margin-bottom: 0;\n }\n }\n\n .button-container{\n margin-bottom: 6px;\n text-align: center;\n }\n}\n", + ".map{\n height: 500px;\n}\n", + "%card-stats{\n hr{\n margin: 5px 15px;\n }\n}\n\n\n.card-stats{\n .card-body{\n padding: 15px 15px 0px;\n\n .numbers{\n text-align: right;\n font-size: 2em;\n\n p{\n margin-bottom: 0;\n }\n .card-category {\n color: $dark-gray;\n font-size: 16px;\n line-height: 1.4em;\n }\n }\n }\n .card-footer{\n padding: 0px 15px 15px;\n\n .stats{\n color: $dark-gray;\n }\n\n hr{\n margin-top: 10px;\n margin-bottom: 15px;\n }\n }\n .icon-big {\n font-size: 3em;\n min-height: 64px;\n\n i{\n line-height: 59px;\n }\n }\n\n\n}\n", + "@media screen and (max-width: 991px){\n\n .navbar {\n padding: 0;\n\n &.navbar-absolute {\n padding-top: 0;\n }\n\n .navbar-brand {\n font-size: 16px;\n margin-right: 0;\n }\n }\n\n .profile-photo .profile-photo-small{\n margin-left: -2px;\n }\n\n .button-dropdown{\n display: none;\n }\n\n #minimizeSidebar{\n display: none;\n }\n\n .navbar{\n .container-fluid{\n padding-right: 15px;\n padding-left: 15px;\n }\n\n .navbar-collapse{\n .input-group{\n margin: 0;\n margin-top: 5px;\n }\n }\n\n .navbar-nav{\n .nav-item:first-child{\n margin-top: 10px;\n }\n .nav-item:not(:last-child){\n margin-bottom: 10px;\n }\n }\n\n .dropdown.show .dropdown-menu{\n display: block;\n }\n\n .dropdown .dropdown-menu{\n display: none;\n }\n\n .dropdown.show .dropdown-menu,\n .dropdown .dropdown-menu{\n border: 0;\n transition: none;\n -webkit-box-shadow: none;\n width: auto;\n margin: 0px 1rem;\n margin-top: 0px;\n box-shadow: none;\n position: static;\n padding-left: 10px;\n\n &:before{\n display: none;\n }\n }\n\n .dropdown-menu .dropdown-item:focus,\n .dropdown-menu .dropdown-item:hover{\n color: $white-color;\n }\n\n &.bg-white .dropdown-menu .dropdown-item:focus,\n &.bg-white .dropdown-menu .dropdown-item:hover{\n color: $default-color;\n }\n\n .navbar-toggler-bar{\n display: block;\n position: relative;\n width: 22px;\n height: 1px;\n border-radius: 1px;\n background: $default-color;\n\n & + .navbar-toggler-bar{\n margin-top: 7px;\n }\n\n & + .navbar-toggler-bar.navbar-kebab{\n margin-top: 3px;\n }\n\n &.bar2{\n width: 17px;\n transition: width .2s linear;\n }\n }\n\n &.bg-white:not(.navbar-transparent) .navbar-toggler-bar{\n background-color: $default-color;\n }\n\n & .toggled .navbar-toggler-bar{\n width: 24px;\n\n & + .navbar-toggler-bar{\n margin-top: 5px;\n }\n }\n\n }\n\n .wrapper{\n @include transition (0.50s, cubic-bezier(0.685, 0.0473, 0.346, 1));\n }\n\n .nav-open{\n .main-panel{\n right: 0;\n @include transform-translate-x(260px);\n }\n\n .sidebar{\n @include transform-translate-x(0px);\n }\n\n body{\n position: relative;\n overflow-x: hidden;\n }\n\n .menu-on-right{\n .main-panel{\n @include transform-translate-x(-260px);\n }\n\n .navbar-collapse,\n .sidebar{\n @include transform-translate-x(0px);\n }\n\n .navbar-translate{\n @include transform-translate-x(-300px);\n }\n\n #bodyClick{\n right: 260px;\n left: auto;\n }\n }\n }\n\n .menu-on-right{\n .sidebar{\n left: auto;\n right:0;\n @include transform-translate-x(260px);\n }\n }\n\n .bar1,\n .bar2,\n .bar3 {\n outline: 1px solid transparent;\n }\n .bar1 {\n top: 0px;\n @include bar-animation($topbar-back);\n }\n .bar2 {\n opacity: 1;\n }\n .bar3 {\n bottom: 0px;\n @include bar-animation($bottombar-back);\n }\n .toggled .bar1 {\n top: 6px;\n @include bar-animation($topbar-x);\n }\n .toggled .bar2 {\n opacity: 0;\n }\n .toggled .bar3 {\n bottom: 6px;\n @include bar-animation($bottombar-x);\n }\n\n @include topbar-x-rotation();\n @include topbar-back-rotation();\n @include bottombar-x-rotation();\n @include bottombar-back-rotation();\n\n @-webkit-keyframes fadeIn {\n 0% {opacity: 0;}\n 100% {opacity: 1;}\n }\n @-moz-keyframes fadeIn {\n 0% {opacity: 0;}\n 100% {opacity: 1;}\n }\n @keyframes fadeIn {\n 0% {opacity: 0;}\n 100% {opacity: 1;}\n }\n\n #bodyClick{\n height: 100%;\n width: 100%;\n position: fixed;\n opacity: 1;\n top: 0;\n right: 0;\n left: 260px;\n content: \"\";\n z-index: 9999;\n overflow-x: hidden;\n background-color: transparent;\n @include transition (0.50s, cubic-bezier(0.685, 0.0473, 0.346, 1));\n }\n\n .footer{\n .copyright{\n text-align: right;\n }\n }\n\n .section-nucleo-icons .icons-container{\n margin-top: 65px;\n }\n\n .navbar-nav{\n .nav-link{\n i.fa,\n i.nc-icon{\n opacity: .5;\n }\n }\n }\n\n .sidebar,\n .bootstrap-navbar {\n position: fixed;\n display: block;\n top: 0;\n height: 100%;\n width: 260px;\n right: auto;\n left: 0;\n z-index: 1032;\n visibility: visible;\n overflow-y: visible;\n padding: 0;\n @include transition (0.50s, cubic-bezier(0.685, 0.0473, 0.346, 1));\n\n @include transform-translate-x(-260px);\n }\n\n\n\n .main-panel{\n width: 100%;\n }\n\n .timeline{\n &:before{\n left: 5% !important;\n }\n\n > li > .timeline-badge{\n left: 5% !important;\n }\n\n > li > .timeline-panel{\n float: right !important;\n width: 82% !important;\n\n &:before{\n border-left-width: 0 !important;\n border-right-width: 15px !important;\n left: -15px !important;\n right: auto !important;\n }\n\n &:after{\n border-left-width: 0 !important;\n border-right-width: 14px !important;\n left: -14px !important;\n right: auto !important;\n }\n }\n }\n\n}\n@media (max-width: 991px) and (min-width: 768px){\n .nav-tabs-navigation.verical-navs {\n padding: 0px 2px;\n }\n}\n\n@media screen and (min-width: 768px){\n .footer {\n .footer-nav {\n padding-left: 21px;\n }\n\n .credits {\n padding-right: 15px;\n }\n }\n}\n\n@media screen and (min-width: 992px){\n .navbar-collapse{\n background: none !important;\n }\n\n .navbar .navbar-toggle{\n display: none;\n }\n\n .navbar-nav{\n .nav-link{\n &.profile-photo{\n padding: 0;\n margin: 7px $padding-base-horizontal;\n }\n }\n }\n\n .section-nucleo-icons .icons-container{\n margin: 0 0 0 auto;\n }\n\n .dropdown-menu .dropdown-item{\n color: inherit;\n }\n\n .footer{\n .copyright{\n float: right;\n padding-right: 15px;\n }\n }\n\n .sidebar{\n .sidebar-wrapper{\n li.active{\n > a:not([data-toggle=\"collapse\"]),\n > [data-toggle=\"collapse\"] + div .nav li {\n &:before{\n border-right: 17px solid $medium-gray;\n border-top: 17px solid transparent;\n border-bottom: 17px solid transparent;\n content: \"\";\n display: inline-block;\n position: absolute;\n right: -16px;\n opacity: 1;\n top: 7px;\n transition: opacity 150ms ease-in;\n }\n\n &:after{\n border-right: 17px solid $default-body-bg;\n border-top: 17px solid transparent;\n border-bottom: 17px solid transparent;\n content: \"\";\n display: inline-block;\n position: absolute;\n right: -17px;\n opacity: 1;\n top: 7px;\n transition: opacity 150ms ease-in;\n }\n }\n >[data-toggle=\"collapse\"] + div .nav li {\n a{\n &:before,\n &:after {\n top: 0;\n }\n }\n }\n }\n }\n }\n\n}\n\n@media screen and (max-width: 768px){\n .card-stats [class*=\"col-\"] .statistics::after {\n display: none;\n }\n\n .main-panel .content {\n padding-left: 15px;\n padding-right: 15px;\n }\n\n .footer{\n nav{\n display: block;\n margin-bottom: 5px;\n float: none;\n }\n }\n\n .landing-page .section-story-overview .image-container:nth-child(2){\n margin-left: 0;\n margin-bottom: 30px;\n }\n\n .card {\n .form-horizontal {\n .col-md-3.col-form-label {\n text-align: left;\n }\n }\n }\n\n}\n\n@media screen and (max-width: 767px){\n .nav-tabs-navigation.verical-navs{\n padding: 0 28px;\n }\n\n .typography-line {\n padding-left: 23% !important;\n\n span {\n width: 60px !important;\n }\n }\n\n .login-page,\n .lock-page,\n .register-page {\n .navbar{\n padding: .5rem 1rem;\n }\n }\n\n .footer {\n .footer-nav,\n .credits {\n margin: 0 auto !important;\n }\n\n .footer-nav {\n margin-bottom: 10px !important;\n }\n }\n\n .register-page {\n .content {\n padding-top: 5vh;\n }\n .footer {\n position: relative;\n }\n .info-area.info-horizontal {\n margin-top: 0;\n }\n }\n}\n\n@media screen and (max-width: 374px){\n .login-page {\n .content {\n padding-top: 10vh;\n }\n }\n}\n\n@media screen and (max-width: 413px){\n .fixed-plugin {\n .dropdown.show-dropdown.show{\n .dropdown-menu.show {\n width: 225px !important;\n\n &[x-placement=top-start] {\n transform: translate3d(0,400px,0)!important;\n }\n\n &:before,\n &:after {\n bottom: 360px !important;\n }\n }\n }\n }\n\n}\n\n\n@media screen and (max-width: 576px){\n .navbar[class*='navbar-toggleable-'] .container{\n margin-left: 0;\n margin-right: 0;\n }\n\n .card-contributions .card-stats{\n flex-direction: column;\n\n .bootstrap-switch{\n margin-bottom: 15px;\n }\n }\n\n .footer{\n .copyright{\n text-align: center;\n }\n }\n\n .section-nucleo-icons{\n .icons-container{\n i{\n font-size: 30px;\n\n &:nth-child(6){\n font-size: 48px;\n }\n }\n }\n }\n\n .page-header{\n .container h6.category-absolute{\n width: 90%;\n }\n }\n\n .card-timeline .timeline {\n .timeline-panel {\n width: 38%;\n padding: 15px;\n }\n }\n}\n" + ], + "names": [], + "mappings": "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" +} \ No newline at end of file diff --git a/explorer/public/paper-dashboard/assets/css/paper-dashboard.min.css b/explorer/public/paper-dashboard/assets/css/paper-dashboard.min.css new file mode 100644 index 00000000000..a3c1a8e0435 --- /dev/null +++ b/explorer/public/paper-dashboard/assets/css/paper-dashboard.min.css @@ -0,0 +1,22 @@ +/*! + + ========================================================= + * Paper Dashboard 2 - v2.0.0 + ========================================================= + + * Product Page: https://www.creative-tim.com/product/paper-dashboard-2 + * Copyright 2018 Creative Tim (http://www.creative-tim.com) + + * Designed by www.invisionapp.com Coded by www.creative-tim.com + + ========================================================= + + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + + */ +/*! +Animate.css - http://daneden.me/animate +Licensed under the MIT license - http://opensource.org/licenses/MIT + +Copyright (c) 2015 Daniel Eden +*/.animated{animation-duration:1s;animation-fill-mode:both}.animated.infinite{animation-iteration-count:infinite}.animated.hinge{animation-duration:2s}.animated.bounceIn,.animated.bounceOut,.animated.flipOutX,.animated.flipOutY{animation-duration:.75s}@keyframes a{0%,to{transform:translateZ(0)}10%,30%,50%,70%,90%{transform:translate3d(-10px,0,0)}20%,40%,60%,80%{transform:translate3d(10px,0,0)}}.shake{animation-name:a}@keyframes b{0%{opacity:0;transform:translate3d(0,-100%,0)}to{opacity:1;transform:none}}.fadeInDown{animation-name:b}@keyframes c{0%{opacity:1}to{opacity:0}}.fadeOut{animation-name:c}@keyframes d{0%{opacity:1}to{opacity:0;transform:translate3d(0,100%,0)}}.fadeOutDown{animation-name:d}@keyframes e{0%{opacity:1}to{opacity:0;transform:translate3d(0,-100%,0)}}.fadeOutUp{animation-name:e}.ps-container{-ms-touch-action:auto;touch-action:auto;overflow:hidden!important;-ms-overflow-style:none}@supports (-ms-overflow-style:none){.ps-container{overflow:auto!important}}@media (-ms-high-contrast:none),screen and (-ms-high-contrast:active){.ps-container{overflow:auto!important}}.ps-container.ps-active-x>.ps-scrollbar-x-rail,.ps-container.ps-active-y>.ps-scrollbar-y-rail{display:block;background-color:transparent}.ps-container.ps-in-scrolling.ps-x>.ps-scrollbar-x-rail{background-color:#eee;opacity:.9}.ps-container.ps-in-scrolling.ps-x>.ps-scrollbar-x-rail>.ps-scrollbar-x{background-color:#999;height:11px}.ps-container.ps-in-scrolling.ps-y>.ps-scrollbar-y-rail{background-color:#eee;opacity:.9}.ps-container.ps-in-scrolling.ps-y>.ps-scrollbar-y-rail>.ps-scrollbar-y{background-color:#999;width:11px}.ps-container>.ps-scrollbar-x-rail{display:none;position:absolute;opacity:0;transition:background-color .2s linear,opacity .2s linear;bottom:0;height:15px}.ps-container>.ps-scrollbar-x-rail>.ps-scrollbar-x{position:absolute;background-color:#aaa;border-radius:6px;transition:background-color .2s linear,height .2s linear,width .2s ease-in-out,border-radius .2s ease-in-out;bottom:2px;height:6px}.ps-container>.ps-scrollbar-x-rail:active>.ps-scrollbar-x,.ps-container>.ps-scrollbar-x-rail:hover>.ps-scrollbar-x{height:11px}.ps-container>.ps-scrollbar-y-rail{display:none;position:absolute;opacity:0;transition:background-color .2s linear,opacity .2s linear;right:0;width:15px}.ps-container>.ps-scrollbar-y-rail>.ps-scrollbar-y{position:absolute;background-color:#aaa;border-radius:6px;transition:background-color .2s linear,height .2s linear,width .2s ease-in-out,border-radius .2s ease-in-out;right:2px;width:6px}.ps-container>.ps-scrollbar-y-rail:active>.ps-scrollbar-y,.ps-container>.ps-scrollbar-y-rail:hover>.ps-scrollbar-y{width:11px}.ps-container:hover.ps-in-scrolling.ps-x>.ps-scrollbar-x-rail{background-color:#eee;opacity:.9}.ps-container:hover.ps-in-scrolling.ps-x>.ps-scrollbar-x-rail>.ps-scrollbar-x{background-color:#999;height:11px}.ps-container:hover.ps-in-scrolling.ps-y>.ps-scrollbar-y-rail{background-color:#eee;opacity:.9}.ps-container:hover.ps-in-scrolling.ps-y>.ps-scrollbar-y-rail>.ps-scrollbar-y{background-color:#999;width:11px}.ps-container:hover>.ps-scrollbar-x-rail,.ps-container:hover>.ps-scrollbar-y-rail{opacity:.6}.ps-container:hover>.ps-scrollbar-x-rail:hover{background-color:#eee;opacity:.9}.ps-container:hover>.ps-scrollbar-x-rail:hover>.ps-scrollbar-x{background-color:#999}.ps-container:hover>.ps-scrollbar-y-rail:hover{background-color:#eee;opacity:.9}.ps-container:hover>.ps-scrollbar-y-rail:hover>.ps-scrollbar-y{background-color:#999}.btn,.navbar .navbar-nav>a.btn{border-width:2px;font-weight:600;font-size:.8571em;line-height:1.35em;text-transform:uppercase;border:none;margin:10px 1px;border-radius:3px;padding:11px 22px;cursor:pointer;background-color:#66615b;color:#fff;transition:all .15s linear}.btn.active,.btn.active:focus,.btn.active:hover,.btn:active,.btn:active:focus,.btn:active:hover,.btn:focus,.btn:hover,.navbar .navbar-nav>a.btn.active,.navbar .navbar-nav>a.btn.active:focus,.navbar .navbar-nav>a.btn.active:hover,.navbar .navbar-nav>a.btn:active,.navbar .navbar-nav>a.btn:active:focus,.navbar .navbar-nav>a.btn:active:hover,.navbar .navbar-nav>a.btn:focus,.navbar .navbar-nav>a.btn:hover,.show>.btn.dropdown-toggle,.show>.btn.dropdown-toggle:focus,.show>.btn.dropdown-toggle:hover,.show>.navbar .navbar-nav>a.btn.dropdown-toggle,.show>.navbar .navbar-nav>a.btn.dropdown-toggle:focus,.show>.navbar .navbar-nav>a.btn.dropdown-toggle:hover{background-color:#403d39!important;color:#fff!important;box-shadow:none!important}.btn:not([data-action]):hover,.navbar .navbar-nav>a.btn:not([data-action]):hover{box-shadow:none}.btn.disabled,.btn.disabled.active,.btn.disabled.focus,.btn.disabled:active,.btn.disabled:focus,.btn.disabled:hover,.btn:disabled,.btn:disabled.active,.btn:disabled.focus,.btn:disabled:active,.btn:disabled:focus,.btn:disabled:hover,.btn[disabled],.btn[disabled].active,.btn[disabled].focus,.btn[disabled]:active,.btn[disabled]:focus,.btn[disabled]:hover,.navbar .navbar-nav>a.btn.disabled,.navbar .navbar-nav>a.btn.disabled.active,.navbar .navbar-nav>a.btn.disabled.focus,.navbar .navbar-nav>a.btn.disabled:active,.navbar .navbar-nav>a.btn.disabled:focus,.navbar .navbar-nav>a.btn.disabled:hover,.navbar .navbar-nav>a.btn:disabled,.navbar .navbar-nav>a.btn:disabled.active,.navbar .navbar-nav>a.btn:disabled.focus,.navbar .navbar-nav>a.btn:disabled:active,.navbar .navbar-nav>a.btn:disabled:focus,.navbar .navbar-nav>a.btn:disabled:hover,.navbar .navbar-nav>a.btn[disabled],.navbar .navbar-nav>a.btn[disabled].active,.navbar .navbar-nav>a.btn[disabled].focus,.navbar .navbar-nav>a.btn[disabled]:active,.navbar .navbar-nav>a.btn[disabled]:focus,.navbar .navbar-nav>a.btn[disabled]:hover,fieldset[disabled] .btn,fieldset[disabled] .btn.active,fieldset[disabled] .btn.focus,fieldset[disabled] .btn:active,fieldset[disabled] .btn:focus,fieldset[disabled] .btn:hover,fieldset[disabled] .navbar .navbar-nav>a.btn,fieldset[disabled] .navbar .navbar-nav>a.btn.active,fieldset[disabled] .navbar .navbar-nav>a.btn.focus,fieldset[disabled] .navbar .navbar-nav>a.btn:active,fieldset[disabled] .navbar .navbar-nav>a.btn:focus,fieldset[disabled] .navbar .navbar-nav>a.btn:hover{background-color:#66615b;border-color:#66615b}.btn.btn-simple,.navbar .navbar-nav>a.btn.btn-simple{color:#66615b;border-color:#66615b}.btn.btn-simple:active,.btn.btn-simple:focus,.btn.btn-simple:hover,.navbar .navbar-nav>a.btn.btn-simple:active,.navbar .navbar-nav>a.btn.btn-simple:focus,.navbar .navbar-nav>a.btn.btn-simple:hover{background-color:transparent;color:#403d39;border-color:#403d39;box-shadow:none}.btn.btn-link,.navbar .navbar-nav>a.btn.btn-link{color:#66615b}.btn.btn-link:active,.btn.btn-link:active:focus,.btn.btn-link:focus,.btn.btn-link:hover,.navbar .navbar-nav>a.btn.btn-link:active,.navbar .navbar-nav>a.btn.btn-link:active:focus,.navbar .navbar-nav>a.btn.btn-link:focus,.navbar .navbar-nav>a.btn.btn-link:hover{background-color:transparent;color:#403d39;text-decoration:none;box-shadow:none}.btn:focus,.btn:hover,.navbar .navbar-nav>a.btn:focus,.navbar .navbar-nav>a.btn:hover{opacity:1;filter:alpha(opacity=100);outline:0!important}.btn.active,.btn:active,.navbar .navbar-nav>a.btn.active,.navbar .navbar-nav>a.btn:active,.open>.btn.dropdown-toggle,.open>.navbar .navbar-nav>a.btn.dropdown-toggle{box-shadow:none;outline:0!important}.btn .badge,.navbar .navbar-nav>a.btn .badge{margin:0}.btn.btn-icon,.navbar .navbar-nav>a.btn.btn-icon{height:2.375rem;min-width:2.375rem;width:2.375rem;padding:0;font-size:.9375rem;overflow:hidden;position:relative;line-height:normal}.btn.btn-icon.btn-simple,.navbar .navbar-nav>a.btn.btn-icon.btn-simple{padding:0}.btn.btn-icon.btn-sm,.navbar .navbar-nav>a.btn.btn-icon.btn-sm{height:1.875rem;min-width:1.875rem;width:1.875rem}.btn.btn-icon.btn-sm .fa,.btn.btn-icon.btn-sm .far,.btn.btn-icon.btn-sm .fas,.btn.btn-icon.btn-sm .nc-icon,.navbar .navbar-nav>a.btn.btn-icon.btn-sm .fa,.navbar .navbar-nav>a.btn.btn-icon.btn-sm .far,.navbar .navbar-nav>a.btn.btn-icon.btn-sm .fas,.navbar .navbar-nav>a.btn.btn-icon.btn-sm .nc-icon{font-size:.6875rem}.btn.btn-icon.btn-lg,.navbar .navbar-nav>a.btn.btn-icon.btn-lg{height:3.6rem;min-width:3.6rem;width:3.6rem}.btn.btn-icon.btn-lg .fa,.btn.btn-icon.btn-lg .far,.btn.btn-icon.btn-lg .fas,.btn.btn-icon.btn-lg .nc-icon,.navbar .navbar-nav>a.btn.btn-icon.btn-lg .fa,.navbar .navbar-nav>a.btn.btn-icon.btn-lg .far,.navbar .navbar-nav>a.btn.btn-icon.btn-lg .fas,.navbar .navbar-nav>a.btn.btn-icon.btn-lg .nc-icon{font-size:1.325rem}.btn.btn-icon:not(.btn-footer) .fa,.btn.btn-icon:not(.btn-footer) .far,.btn.btn-icon:not(.btn-footer) .fas,.btn.btn-icon:not(.btn-footer) .nc-icon,.navbar .navbar-nav>a.btn.btn-icon:not(.btn-footer) .fa,.navbar .navbar-nav>a.btn.btn-icon:not(.btn-footer) .far,.navbar .navbar-nav>a.btn.btn-icon:not(.btn-footer) .fas,.navbar .navbar-nav>a.btn.btn-icon:not(.btn-footer) .nc-icon{position:absolute;top:50%;left:50%;transform:translate(-12px,-12px);line-height:1.5626rem;width:24px}.btn.btn-icon.btn-neutral,.navbar .navbar-nav>a.btn.btn-icon.btn-neutral{font-size:20px}.btn:not(.btn-icon) .nc-icon,.navbar .navbar-nav>a.btn:not(.btn-icon) .nc-icon{position:relative;top:1px}.btn-primary{background-color:#51cbce;color:#fff}.btn-primary.active,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active,.btn-primary:active:focus,.btn-primary:active:hover,.btn-primary:focus,.btn-primary:hover,.show>.btn-primary.dropdown-toggle,.show>.btn-primary.dropdown-toggle:focus,.show>.btn-primary.dropdown-toggle:hover{background-color:#34b5b8!important;color:#fff!important;box-shadow:none!important}.btn-primary:not([data-action]):hover{box-shadow:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary:disabled,.btn-primary:disabled.active,.btn-primary:disabled.focus,.btn-primary:disabled:active,.btn-primary:disabled:focus,.btn-primary:disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#51cbce;border-color:#51cbce}.btn-primary.btn-simple{color:#51cbce;border-color:#51cbce}.btn-primary.btn-simple:active,.btn-primary.btn-simple:focus,.btn-primary.btn-simple:hover{background-color:transparent;color:#34b5b8;border-color:#34b5b8;box-shadow:none}.btn-primary.btn-link{color:#51cbce}.btn-primary.btn-link:active,.btn-primary.btn-link:active:focus,.btn-primary.btn-link:focus,.btn-primary.btn-link:hover{background-color:transparent;color:#34b5b8;text-decoration:none;box-shadow:none}.btn-success{background-color:#6bd098;color:#fff}.btn-success.active,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active,.btn-success:active:focus,.btn-success:active:hover,.btn-success:focus,.btn-success:hover,.show>.btn-success.dropdown-toggle,.show>.btn-success.dropdown-toggle:focus,.show>.btn-success.dropdown-toggle:hover{background-color:#44c47d!important;color:#fff!important;box-shadow:none!important}.btn-success:not([data-action]):hover{box-shadow:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success:disabled,.btn-success:disabled.active,.btn-success:disabled.focus,.btn-success:disabled:active,.btn-success:disabled:focus,.btn-success:disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#6bd098;border-color:#6bd098}.btn-success.btn-simple{color:#6bd098;border-color:#6bd098}.btn-success.btn-simple:active,.btn-success.btn-simple:focus,.btn-success.btn-simple:hover{background-color:transparent;color:#44c47d;border-color:#44c47d;box-shadow:none}.btn-success.btn-link{color:#6bd098}.btn-success.btn-link:active,.btn-success.btn-link:active:focus,.btn-success.btn-link:focus,.btn-success.btn-link:hover{background-color:transparent;color:#44c47d;text-decoration:none;box-shadow:none}.btn-info{background-color:#51bcda;color:#fff}.btn-info.active,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active,.btn-info:active:focus,.btn-info:active:hover,.btn-info:focus,.btn-info:hover,.show>.btn-info.dropdown-toggle,.show>.btn-info.dropdown-toggle:focus,.show>.btn-info.dropdown-toggle:hover{background-color:#2ba9cd!important;color:#fff!important;box-shadow:none!important}.btn-info:not([data-action]):hover{box-shadow:none}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info:disabled,.btn-info:disabled.active,.btn-info:disabled.focus,.btn-info:disabled:active,.btn-info:disabled:focus,.btn-info:disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#51bcda;border-color:#51bcda}.btn-info.btn-simple{color:#51bcda;border-color:#51bcda}.btn-info.btn-simple:active,.btn-info.btn-simple:focus,.btn-info.btn-simple:hover{background-color:transparent;color:#2ba9cd;border-color:#2ba9cd;box-shadow:none}.btn-info.btn-link{color:#51bcda}.btn-info.btn-link:active,.btn-info.btn-link:active:focus,.btn-info.btn-link:focus,.btn-info.btn-link:hover{background-color:transparent;color:#2ba9cd;text-decoration:none;box-shadow:none}.btn-warning{background-color:#fbc658;color:#fff}.btn-warning.active,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active,.btn-warning:active:focus,.btn-warning:active:hover,.btn-warning:focus,.btn-warning:hover,.show>.btn-warning.dropdown-toggle,.show>.btn-warning.dropdown-toggle:focus,.show>.btn-warning.dropdown-toggle:hover{background-color:#fab526!important;color:#fff!important;box-shadow:none!important}.btn-warning:not([data-action]):hover{box-shadow:none}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning:disabled,.btn-warning:disabled.active,.btn-warning:disabled.focus,.btn-warning:disabled:active,.btn-warning:disabled:focus,.btn-warning:disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#fbc658;border-color:#fbc658}.btn-warning.btn-simple{color:#fbc658;border-color:#fbc658}.btn-warning.btn-simple:active,.btn-warning.btn-simple:focus,.btn-warning.btn-simple:hover{background-color:transparent;color:#fab526;border-color:#fab526;box-shadow:none}.btn-warning.btn-link{color:#fbc658}.btn-warning.btn-link:active,.btn-warning.btn-link:active:focus,.btn-warning.btn-link:focus,.btn-warning.btn-link:hover{background-color:transparent;color:#fab526;text-decoration:none;box-shadow:none}.btn-danger{background-color:#ef8157;color:#fff}.btn-danger.active,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active,.btn-danger:active:focus,.btn-danger:active:hover,.btn-danger:focus,.btn-danger:hover,.show>.btn-danger.dropdown-toggle,.show>.btn-danger.dropdown-toggle:focus,.show>.btn-danger.dropdown-toggle:hover{background-color:#eb6532!important;color:#fff!important;box-shadow:none!important}.btn-danger:not([data-action]):hover{box-shadow:none}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger:disabled,.btn-danger:disabled.active,.btn-danger:disabled.focus,.btn-danger:disabled:active,.btn-danger:disabled:focus,.btn-danger:disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#ef8157;border-color:#ef8157}.btn-danger.btn-simple{color:#ef8157;border-color:#ef8157}.btn-danger.btn-simple:active,.btn-danger.btn-simple:focus,.btn-danger.btn-simple:hover{background-color:transparent;color:#eb6532;border-color:#eb6532;box-shadow:none}.btn-danger.btn-link{color:#ef8157}.btn-danger.btn-link:active,.btn-danger.btn-link:active:focus,.btn-danger.btn-link:focus,.btn-danger.btn-link:hover{background-color:transparent;color:#eb6532;text-decoration:none;box-shadow:none}.btn-outline-default{background:transparent;border:2px solid #66615b!important;color:#66615b;opacity:1;filter:alpha(opacity=100)}.btn-outline-default.active,.btn-outline-default:active,.btn-outline-default:focus,.btn-outline-default:focus:active,.btn-outline-default:hover,.open>.btn-outline-default.dropdown-toggle{background-color:#66615b!important;color:hsla(0,0%,100%,.8)!important;border-color:#66615b!important}.btn-outline-default.active .caret,.btn-outline-default:active .caret,.btn-outline-default:focus .caret,.btn-outline-default:focus:active .caret,.btn-outline-default:hover .caret,.open>.btn-outline-default.dropdown-toggle .caret{border-top-color:hsla(0,0%,100%,.8)!important}.btn-outline-default .caret{border-top-color:#fff!important}.btn-outline-default.disabled,.btn-outline-default.disabled.active,.btn-outline-default.disabled.focus,.btn-outline-default.disabled:active,.btn-outline-default.disabled:focus,.btn-outline-default.disabled:hover,.btn-outline-default:disabled,.btn-outline-default:disabled.active,.btn-outline-default:disabled.focus,.btn-outline-default:disabled:active,.btn-outline-default:disabled:focus,.btn-outline-default:disabled:hover,.btn-outline-default[disabled],.btn-outline-default[disabled].active,.btn-outline-default[disabled].focus,.btn-outline-default[disabled]:active,.btn-outline-default[disabled]:focus,.btn-outline-default[disabled]:hover,fieldset[disabled] .btn-outline-default,fieldset[disabled] .btn-outline-default.active,fieldset[disabled] .btn-outline-default.focus,fieldset[disabled] .btn-outline-default:active,fieldset[disabled] .btn-outline-default:focus,fieldset[disabled] .btn-outline-default:hover{background-color:transparent!important;border-color:#66615b!important}.btn-outline-primary{background:transparent;border:2px solid #51cbce!important;color:#51cbce;opacity:1;filter:alpha(opacity=100)}.btn-outline-primary.active,.btn-outline-primary:active,.btn-outline-primary:focus,.btn-outline-primary:focus:active,.btn-outline-primary:hover,.open>.btn-outline-primary.dropdown-toggle{background-color:#51cbce!important;color:hsla(0,0%,100%,.8)!important;border-color:#51cbce!important}.btn-outline-primary.active .caret,.btn-outline-primary:active .caret,.btn-outline-primary:focus .caret,.btn-outline-primary:focus:active .caret,.btn-outline-primary:hover .caret,.open>.btn-outline-primary.dropdown-toggle .caret{border-top-color:hsla(0,0%,100%,.8)!important}.btn-outline-primary .caret{border-top-color:#fff!important}.btn-outline-primary.disabled,.btn-outline-primary.disabled.active,.btn-outline-primary.disabled.focus,.btn-outline-primary.disabled:active,.btn-outline-primary.disabled:focus,.btn-outline-primary.disabled:hover,.btn-outline-primary:disabled,.btn-outline-primary:disabled.active,.btn-outline-primary:disabled.focus,.btn-outline-primary:disabled:active,.btn-outline-primary:disabled:focus,.btn-outline-primary:disabled:hover,.btn-outline-primary[disabled],.btn-outline-primary[disabled].active,.btn-outline-primary[disabled].focus,.btn-outline-primary[disabled]:active,.btn-outline-primary[disabled]:focus,.btn-outline-primary[disabled]:hover,fieldset[disabled] .btn-outline-primary,fieldset[disabled] .btn-outline-primary.active,fieldset[disabled] .btn-outline-primary.focus,fieldset[disabled] .btn-outline-primary:active,fieldset[disabled] .btn-outline-primary:focus,fieldset[disabled] .btn-outline-primary:hover{background-color:transparent!important;border-color:#51cbce!important}.btn-outline-success{background:transparent;border:2px solid #6bd098!important;color:#6bd098;opacity:1;filter:alpha(opacity=100)}.btn-outline-success.active,.btn-outline-success:active,.btn-outline-success:focus,.btn-outline-success:focus:active,.btn-outline-success:hover,.open>.btn-outline-success.dropdown-toggle{background-color:#6bd098!important;color:hsla(0,0%,100%,.8)!important;border-color:#6bd098!important}.btn-outline-success.active .caret,.btn-outline-success:active .caret,.btn-outline-success:focus .caret,.btn-outline-success:focus:active .caret,.btn-outline-success:hover .caret,.open>.btn-outline-success.dropdown-toggle .caret{border-top-color:hsla(0,0%,100%,.8)!important}.btn-outline-success .caret{border-top-color:#fff!important}.btn-outline-success.disabled,.btn-outline-success.disabled.active,.btn-outline-success.disabled.focus,.btn-outline-success.disabled:active,.btn-outline-success.disabled:focus,.btn-outline-success.disabled:hover,.btn-outline-success:disabled,.btn-outline-success:disabled.active,.btn-outline-success:disabled.focus,.btn-outline-success:disabled:active,.btn-outline-success:disabled:focus,.btn-outline-success:disabled:hover,.btn-outline-success[disabled],.btn-outline-success[disabled].active,.btn-outline-success[disabled].focus,.btn-outline-success[disabled]:active,.btn-outline-success[disabled]:focus,.btn-outline-success[disabled]:hover,fieldset[disabled] .btn-outline-success,fieldset[disabled] .btn-outline-success.active,fieldset[disabled] .btn-outline-success.focus,fieldset[disabled] .btn-outline-success:active,fieldset[disabled] .btn-outline-success:focus,fieldset[disabled] .btn-outline-success:hover{background-color:transparent!important;border-color:#6bd098!important}.btn-outline-info{background:transparent;border:2px solid #51bcda!important;color:#51bcda;opacity:1;filter:alpha(opacity=100)}.btn-outline-info.active,.btn-outline-info:active,.btn-outline-info:focus,.btn-outline-info:focus:active,.btn-outline-info:hover,.open>.btn-outline-info.dropdown-toggle{background-color:#51bcda!important;color:hsla(0,0%,100%,.8)!important;border-color:#51bcda!important}.btn-outline-info.active .caret,.btn-outline-info:active .caret,.btn-outline-info:focus .caret,.btn-outline-info:focus:active .caret,.btn-outline-info:hover .caret,.open>.btn-outline-info.dropdown-toggle .caret{border-top-color:hsla(0,0%,100%,.8)!important}.btn-outline-info .caret{border-top-color:#fff!important}.btn-outline-info.disabled,.btn-outline-info.disabled.active,.btn-outline-info.disabled.focus,.btn-outline-info.disabled:active,.btn-outline-info.disabled:focus,.btn-outline-info.disabled:hover,.btn-outline-info:disabled,.btn-outline-info:disabled.active,.btn-outline-info:disabled.focus,.btn-outline-info:disabled:active,.btn-outline-info:disabled:focus,.btn-outline-info:disabled:hover,.btn-outline-info[disabled],.btn-outline-info[disabled].active,.btn-outline-info[disabled].focus,.btn-outline-info[disabled]:active,.btn-outline-info[disabled]:focus,.btn-outline-info[disabled]:hover,fieldset[disabled] .btn-outline-info,fieldset[disabled] .btn-outline-info.active,fieldset[disabled] .btn-outline-info.focus,fieldset[disabled] .btn-outline-info:active,fieldset[disabled] .btn-outline-info:focus,fieldset[disabled] .btn-outline-info:hover{background-color:transparent!important;border-color:#51bcda!important}.btn-outline-warning{background:transparent;border:2px solid #fbc658!important;color:#fbc658;opacity:1;filter:alpha(opacity=100)}.btn-outline-warning.active,.btn-outline-warning:active,.btn-outline-warning:focus,.btn-outline-warning:focus:active,.btn-outline-warning:hover,.open>.btn-outline-warning.dropdown-toggle{background-color:#fbc658!important;color:hsla(0,0%,100%,.8)!important;border-color:#fbc658!important}.btn-outline-warning.active .caret,.btn-outline-warning:active .caret,.btn-outline-warning:focus .caret,.btn-outline-warning:focus:active .caret,.btn-outline-warning:hover .caret,.open>.btn-outline-warning.dropdown-toggle .caret{border-top-color:hsla(0,0%,100%,.8)!important}.btn-outline-warning .caret{border-top-color:#fff!important}.btn-outline-warning.disabled,.btn-outline-warning.disabled.active,.btn-outline-warning.disabled.focus,.btn-outline-warning.disabled:active,.btn-outline-warning.disabled:focus,.btn-outline-warning.disabled:hover,.btn-outline-warning:disabled,.btn-outline-warning:disabled.active,.btn-outline-warning:disabled.focus,.btn-outline-warning:disabled:active,.btn-outline-warning:disabled:focus,.btn-outline-warning:disabled:hover,.btn-outline-warning[disabled],.btn-outline-warning[disabled].active,.btn-outline-warning[disabled].focus,.btn-outline-warning[disabled]:active,.btn-outline-warning[disabled]:focus,.btn-outline-warning[disabled]:hover,fieldset[disabled] .btn-outline-warning,fieldset[disabled] .btn-outline-warning.active,fieldset[disabled] .btn-outline-warning.focus,fieldset[disabled] .btn-outline-warning:active,fieldset[disabled] .btn-outline-warning:focus,fieldset[disabled] .btn-outline-warning:hover{background-color:transparent!important;border-color:#fbc658!important}.btn-outline-danger{background:transparent;border:2px solid #ef8157!important;color:#ef8157;opacity:1;filter:alpha(opacity=100)}.btn-outline-danger.active,.btn-outline-danger:active,.btn-outline-danger:focus,.btn-outline-danger:focus:active,.btn-outline-danger:hover,.open>.btn-outline-danger.dropdown-toggle{background-color:#ef8157!important;color:hsla(0,0%,100%,.8)!important;border-color:#ef8157!important}.btn-outline-danger.active .caret,.btn-outline-danger:active .caret,.btn-outline-danger:focus .caret,.btn-outline-danger:focus:active .caret,.btn-outline-danger:hover .caret,.open>.btn-outline-danger.dropdown-toggle .caret{border-top-color:hsla(0,0%,100%,.8)!important}.btn-outline-danger .caret{border-top-color:#fff!important}.btn-outline-danger.disabled,.btn-outline-danger.disabled.active,.btn-outline-danger.disabled.focus,.btn-outline-danger.disabled:active,.btn-outline-danger.disabled:focus,.btn-outline-danger.disabled:hover,.btn-outline-danger:disabled,.btn-outline-danger:disabled.active,.btn-outline-danger:disabled.focus,.btn-outline-danger:disabled:active,.btn-outline-danger:disabled:focus,.btn-outline-danger:disabled:hover,.btn-outline-danger[disabled],.btn-outline-danger[disabled].active,.btn-outline-danger[disabled].focus,.btn-outline-danger[disabled]:active,.btn-outline-danger[disabled]:focus,.btn-outline-danger[disabled]:hover,fieldset[disabled] .btn-outline-danger,fieldset[disabled] .btn-outline-danger.active,fieldset[disabled] .btn-outline-danger.focus,fieldset[disabled] .btn-outline-danger:active,fieldset[disabled] .btn-outline-danger:focus,fieldset[disabled] .btn-outline-danger:hover{background-color:transparent!important;border-color:#ef8157!important}.btn-outline-neutral{background:transparent;border:2px solid #fff!important;color:#fff;opacity:1;filter:alpha(opacity=100)}.btn-outline-neutral.active,.btn-outline-neutral:active,.btn-outline-neutral:focus,.btn-outline-neutral:focus:active,.btn-outline-neutral:hover,.open>.btn-outline-neutral.dropdown-toggle{background-color:#fff!important;color:hsla(0,0%,100%,.8)!important;border-color:#fff!important}.btn-outline-neutral.active .caret,.btn-outline-neutral:active .caret,.btn-outline-neutral:focus .caret,.btn-outline-neutral:focus:active .caret,.btn-outline-neutral:hover .caret,.open>.btn-outline-neutral.dropdown-toggle .caret{border-top-color:hsla(0,0%,100%,.8)!important}.btn-outline-neutral .caret{border-top-color:#fff!important}.btn-outline-neutral.disabled,.btn-outline-neutral.disabled.active,.btn-outline-neutral.disabled.focus,.btn-outline-neutral.disabled:active,.btn-outline-neutral.disabled:focus,.btn-outline-neutral.disabled:hover,.btn-outline-neutral:disabled,.btn-outline-neutral:disabled.active,.btn-outline-neutral:disabled.focus,.btn-outline-neutral:disabled:active,.btn-outline-neutral:disabled:focus,.btn-outline-neutral:disabled:hover,.btn-outline-neutral[disabled],.btn-outline-neutral[disabled].active,.btn-outline-neutral[disabled].focus,.btn-outline-neutral[disabled]:active,.btn-outline-neutral[disabled]:focus,.btn-outline-neutral[disabled]:hover,fieldset[disabled] .btn-outline-neutral,fieldset[disabled] .btn-outline-neutral.active,fieldset[disabled] .btn-outline-neutral.focus,fieldset[disabled] .btn-outline-neutral:active,fieldset[disabled] .btn-outline-neutral:focus,fieldset[disabled] .btn-outline-neutral:hover{background-color:transparent!important;border-color:#fff!important}.btn-outline-neutral:focus,.btn-outline-neutral:hover{color:#403d39;background-color:#fff}.btn-neutral{background-color:#fff;color:#51cbce;color:#66615b}.btn-neutral.active,.btn-neutral.active:focus,.btn-neutral.active:hover,.btn-neutral:active,.btn-neutral:active:focus,.btn-neutral:active:hover,.btn-neutral:focus,.btn-neutral:hover,.show>.btn-neutral.dropdown-toggle,.show>.btn-neutral.dropdown-toggle:focus,.show>.btn-neutral.dropdown-toggle:hover{background-color:#fff!important;color:#fff!important;box-shadow:none!important}.btn-neutral:not([data-action]):hover{box-shadow:none}.btn-neutral.disabled,.btn-neutral.disabled.active,.btn-neutral.disabled.focus,.btn-neutral.disabled:active,.btn-neutral.disabled:focus,.btn-neutral.disabled:hover,.btn-neutral:disabled,.btn-neutral:disabled.active,.btn-neutral:disabled.focus,.btn-neutral:disabled:active,.btn-neutral:disabled:focus,.btn-neutral:disabled:hover,.btn-neutral[disabled],.btn-neutral[disabled].active,.btn-neutral[disabled].focus,.btn-neutral[disabled]:active,.btn-neutral[disabled]:focus,.btn-neutral[disabled]:hover,fieldset[disabled] .btn-neutral,fieldset[disabled] .btn-neutral.active,fieldset[disabled] .btn-neutral.focus,fieldset[disabled] .btn-neutral:active,fieldset[disabled] .btn-neutral:focus,fieldset[disabled] .btn-neutral:hover{background-color:#fff;border-color:#fff}.btn-neutral.btn-danger{color:#ef8157}.btn-neutral.btn-danger:active,.btn-neutral.btn-danger:active:focus,.btn-neutral.btn-danger:focus,.btn-neutral.btn-danger:hover{color:#eb6532!important}.btn-neutral.btn-info{color:#51bcda!important}.btn-neutral.btn-info:active,.btn-neutral.btn-info:active:focus,.btn-neutral.btn-info:focus,.btn-neutral.btn-info:hover{color:#2ba9cd!important}.btn-neutral.btn-warning{color:#fbc658!important}.btn-neutral.btn-warning:active,.btn-neutral.btn-warning:active:focus,.btn-neutral.btn-warning:focus,.btn-neutral.btn-warning:hover{color:#fab526!important}.btn-neutral.btn-success{color:#6bd098!important}.btn-neutral.btn-success:active,.btn-neutral.btn-success:active:focus,.btn-neutral.btn-success:focus,.btn-neutral.btn-success:hover{color:#44c47d!important}.btn-neutral.btn-default{color:#66615b!important}.btn-neutral.btn-default:active,.btn-neutral.btn-default:active:focus,.btn-neutral.btn-default:focus,.btn-neutral.btn-default:hover{color:#403d39!important}.btn-neutral.active,.btn-neutral.active:focus,.btn-neutral.active:hover,.btn-neutral:active,.btn-neutral:active:focus,.btn-neutral:active:hover,.show>.btn-neutral.dropdown-toggle,.show>.btn-neutral.dropdown-toggle:focus,.show>.btn-neutral.dropdown-toggle:hover{background-color:#fff!important;color:#34b5b8!important;box-shadow:none!important}.btn-neutral:focus,.btn-neutral:hover{color:#34b5b8!important}.btn-neutral:focus:not(.nav-link),.btn-neutral:hover:not(.nav-link){box-shadow:none}.btn-neutral.btn-simple{color:#fff;border-color:#fff}.btn-neutral.btn-simple:active,.btn-neutral.btn-simple:focus,.btn-neutral.btn-simple:hover{background-color:transparent;color:#fff;border-color:#fff;box-shadow:none}.btn-neutral.btn-link{color:#fff}.btn-neutral.btn-link:active,.btn-neutral.btn-link:active:focus,.btn-neutral.btn-link:focus,.btn-neutral.btn-link:hover{background-color:transparent;color:#fff;text-decoration:none;box-shadow:none}.btn-neutral:focus,.btn-neutral:hover{color:#403d39}.btn-neutral.btn-border:focus,.btn-neutral.btn-border:hover{color:#66615b}.btn-neutral.btn-border.active,.btn-neutral.btn-border:active,.open>.btn-neutral.btn-border.dropdown-toggle{background-color:#fff;color:#66615b}.btn-neutral.btn-link.active,.btn-neutral.btn-link:active{background-color:transparent}.btn.disabled,.btn:disabled,.btn[disabled]{opacity:.5;filter:alpha(opacity=50);pointer-events:none}.btn-simple{border:1px solid;border-color:#66615b;padding:10px 22px}.btn-link,.btn-link.disabled,.btn-link.disabled.active,.btn-link.disabled.focus,.btn-link.disabled:active,.btn-link.disabled:focus,.btn-link.disabled:hover,.btn-link:disabled,.btn-link:disabled.active,.btn-link:disabled.focus,.btn-link:disabled:active,.btn-link:disabled:focus,.btn-link:disabled:hover,.btn-link[disabled],.btn-link[disabled].active,.btn-link[disabled].focus,.btn-link[disabled]:active,.btn-link[disabled]:focus,.btn-link[disabled]:hover,.btn-simple,.btn-simple.disabled,.btn-simple.disabled.active,.btn-simple.disabled.focus,.btn-simple.disabled:active,.btn-simple.disabled:focus,.btn-simple.disabled:hover,.btn-simple:disabled,.btn-simple:disabled.active,.btn-simple:disabled.focus,.btn-simple:disabled:active,.btn-simple:disabled:focus,.btn-simple:disabled:hover,.btn-simple[disabled],.btn-simple[disabled].active,.btn-simple[disabled].focus,.btn-simple[disabled]:active,.btn-simple[disabled]:focus,.btn-simple[disabled]:hover,fieldset[disabled] .btn-link,fieldset[disabled] .btn-link.active,fieldset[disabled] .btn-link.focus,fieldset[disabled] .btn-link:active,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover,fieldset[disabled] .btn-simple,fieldset[disabled] .btn-simple.active,fieldset[disabled] .btn-simple.focus,fieldset[disabled] .btn-simple:active,fieldset[disabled] .btn-simple:focus,fieldset[disabled] .btn-simple:hover{background-color:transparent}.btn-link{border:0;padding:.5rem .7rem}.btn-lg{font-size:1rem;border-radius:6px;padding:15px 48px}.btn-lg.btn-simple{padding:14px 47px}.btn-sm{font-size:.8571em;border-radius:3px;padding:5px 15px}.btn-sm.btn-simple{padding:4px 14px}.btn-wd{min-width:140px}.btn-group.select{width:100%}.btn-group.select .btn{text-align:left}.btn-group.select .caret{position:absolute;top:50%;margin-top:-1px;right:8px}.btn-group .btn+.btn{margin-left:-3px}.btn-group .btn:focus{background-color:#51bcda!important}.btn-round{border-width:1px;border-radius:30px;padding-right:23px;padding-left:23px}.btn-round.btn-simple{padding:10px 22px}.no-caret.dropdown-toggle:after{display:none}::-moz-placeholder{color:#9a9a9a}:-ms-input-placeholder{color:#9a9a9a}::-webkit-input-placeholder{color:#9a9a9a}.form-control{background-color:#fff;border:1px solid #ddd;border-radius:4px;color:#66615b;line-height:normal;font-size:14px;transition:color .3s ease-in-out,border-color .3s ease-in-out,background-color .3s ease-in-out;box-shadow:none}.form-control:focus{border:1px solid #9a9a9a;box-shadow:none;outline:0!important;color:#66615b}.form-control:focus+.input-group-append .input-group-text,.form-control:focus+.input-group-prepend .input-group-text,.form-control:focus~.input-group-append .input-group-text,.form-control:focus~.input-group-prepend .input-group-text{border:1px solid #ccc;border-left:none;background-color:transparent}.has-error .form-control,.has-error .form-control:focus,.has-success .form-control,.has-success .form-control:focus{box-shadow:none}.has-success .form-control{border:1px solid #ccc;color:#66615b}.has-success .form-control.form-control-success{padding-right:2.5em!important}.has-success .form-control:focus{border:1px solid #6bd098;color:#6bd098}.has-danger .form-control{background-color:#ffc0a4;border:1px solid #ef8157;color:#ef8157}.has-danger .form-control.form-control-danger{padding-right:2.5em!important}.has-danger .form-control:focus{background-color:#fff;border:1px solid #ef8157}.form-control+.form-control-feedback{border-radius:6px;font-size:14px;margin-top:-7px;position:absolute;right:10px;top:50%;vertical-align:middle}.open .form-control{border-radius:6px 6px 0 0;border-bottom-color:transparent}.form-control+.input-group-append .input-group-text,.form-control+.input-group-prepend .input-group-text{background-color:#fff}.form-group.no-border.form-control-lg .input-group-append .input-group-text,.input-group.no-border.form-control-lg .input-group-append .input-group-text{padding:15px 0 15px 11px}.form-group.no-border.form-control-lg .form-control,.input-group.no-border.form-control-lg .form-control{padding:15px 11px}.form-group.no-border.form-control-lg .form-control+.input-group-append .input-group-text,.form-group.no-border.form-control-lg .form-control+.input-group-prepend .input-group-text,.input-group.no-border.form-control-lg .form-control+.input-group-append .input-group-text,.input-group.no-border.form-control-lg .form-control+.input-group-prepend .input-group-text{padding:15px 11px 15px 0}.form-group.form-control-lg .form-control,.input-group.form-control-lg .form-control{padding:14px 10px}.form-group.form-control-lg .form-control+.input-group-append .input-group-text,.form-group.form-control-lg .form-control+.input-group-prepend .input-group-text,.input-group.form-control-lg .form-control+.input-group-append .input-group-text,.input-group.form-control-lg .form-control+.input-group-prepend .input-group-text{padding:14px 10px 14px 0}.form-group.form-control-lg .input-group-append .input-group-text,.form-group.form-control-lg .input-group-prepend .input-group-text,.input-group.form-control-lg .input-group-append .input-group-text,.input-group.form-control-lg .input-group-prepend .input-group-text{padding:14px 0 15px 10px}.form-group.form-control-lg .input-group-append .input-group-text+.form-control,.form-group.form-control-lg .input-group-prepend .input-group-text+.form-control,.input-group.form-control-lg .input-group-append .input-group-text+.form-control,.input-group.form-control-lg .input-group-prepend .input-group-text+.form-control{padding:15px 10px 15px 8px}.form-group.no-border .form-control,.input-group.no-border .form-control{padding:11px}.form-group.no-border .form-control+.input-group-append .input-group-text,.form-group.no-border .form-control+.input-group-prepend .input-group-text,.input-group.no-border .form-control+.input-group-append .input-group-text,.input-group.no-border .form-control+.input-group-prepend .input-group-text{padding:11px 11px 11px 0}.form-group.no-border .input-group-append .input-group-text,.form-group.no-border .input-group-prepend .input-group-text,.input-group.no-border .input-group-append .input-group-text,.input-group.no-border .input-group-prepend .input-group-text{padding:11px 0 11px 11px}.form-group .form-control,.input-group .form-control{padding:10px}.form-group .form-control+.input-group-append .input-group-text,.form-group .form-control+.input-group-prepend .input-group-text,.input-group .form-control+.input-group-append .input-group-text,.input-group .form-control+.input-group-prepend .input-group-text{padding:10px 10px 10px 0}.form-group .input-group-append .input-group-text,.form-group .input-group-prepend .input-group-text,.input-group .input-group-append .input-group-text,.input-group .input-group-prepend .input-group-text{padding:10px 0 10px 10px}.form-group .input-group-append .input-group-text+.form-control,.form-group .input-group-append .input-group-text~.form-control,.form-group .input-group-prepend .input-group-text+.form-control,.form-group .input-group-prepend .input-group-text~.form-control,.input-group .input-group-append .input-group-text+.form-control,.input-group .input-group-append .input-group-text~.form-control,.input-group .input-group-prepend .input-group-text+.form-control,.input-group .input-group-prepend .input-group-text~.form-control{padding:10px 11px 11px 8px}.input-group.has-success .input-group-append .input-group-text,.input-group.has-success .input-group-prepend .input-group-text{border:1px solid #ccc;color:#66615b;background-color:#fff;border-right:none}.form-group.no-border .form-control,.form-group.no-border .form-control+.input-group-append .input-group-text,.form-group.no-border .form-control+.input-group-prepend .input-group-text,.input-group.no-border .form-control,.input-group.no-border .form-control+.input-group-append .input-group-text,.input-group.no-border .form-control+.input-group-prepend .input-group-text{background-color:hsla(0,0%,87%,.3);border:medium none}.form-group.no-border .form-control+.input-group-append .input-group-text:active,.form-group.no-border .form-control+.input-group-append .input-group-text:focus,.form-group.no-border .form-control+.input-group-prepend .input-group-text:active,.form-group.no-border .form-control+.input-group-prepend .input-group-text:focus,.form-group.no-border .form-control:active,.form-group.no-border .form-control:focus,.input-group.no-border .form-control+.input-group-append .input-group-text:active,.input-group.no-border .form-control+.input-group-append .input-group-text:focus,.input-group.no-border .form-control+.input-group-prepend .input-group-text:active,.input-group.no-border .form-control+.input-group-prepend .input-group-text:focus,.input-group.no-border .form-control:active,.input-group.no-border .form-control:focus{border:medium none;background-color:hsla(0,0%,87%,.5)}.form-group.no-border .form-control:focus+.input-group-append .input-group-text,.form-group.no-border .form-control:focus+.input-group-prepend .input-group-text,.input-group.no-border .form-control:focus+.input-group-append .input-group-text,.input-group.no-border .form-control:focus+.input-group-prepend .input-group-text{background-color:hsla(0,0%,87%,.5)}.form-group.no-border .input-group-append .input-group-text,.form-group.no-border .input-group-prepend .input-group-text,.input-group.no-border .input-group-append .input-group-text,.input-group.no-border .input-group-prepend .input-group-text{background-color:hsla(0,0%,87%,.3);border:none}.has-error .control-label,.has-error .form-control-feedback{color:#ef8157}.has-success .control-label,.has-success .form-control-feedback{color:#6bd098}.input-group.has-danger .input-group-prepend{border-radius:4px}.input-group.has-danger .input-group-prepend .input-group-text{border:1px solid #ef8157;border-right:none}.input-group.has-danger .error{display:block;width:100%;color:#ef8157;margin-top:3px}.input-group.has-success .input-group-prepend{border-radius:4px}.input-group.has-success .input-group-prepend .input-group-text{border-right:none}.input-group-focus .input-group-append .input-group-text,.input-group-focus .input-group-prepend .input-group-text{background-color:#fff;border-color:#9a9a9a}.input-group-focus.no-border .input-group-append .input-group-text,.input-group-focus.no-border .input-group-prepend .input-group-text{background-color:hsla(0,0%,87%,.5)}.input-group-focus.has-danger .input-group-append .input-group-text,.input-group-focus.has-danger .input-group-prepend .input-group-text{background-color:#ffc0a4}.input-group-focus.has-success .input-group-append .input-group-text,.input-group-focus.has-success .input-group-prepend .input-group-text{background-color:#abf3cb;border:1px solid #6bd098;border-right:none}.input-group-append .input-group-text,.input-group-prepend .input-group-text{background-color:transparent;border:1px solid #e3e3e3;color:#66615b;border-top-right-radius:4px;border-bottom-right-radius:4px;transition:color .3s ease-in-out,border-color .3s ease-in-out,background-color .3s ease-in-out}.input-group-append .input-group-text i,.input-group-prepend .input-group-text i{opacity:.5}.has-danger .input-group-append .input-group-text,.has-danger .input-group-prepend .input-group-text{background-color:#ffc0a4}.has-success .input-group-append .input-group-text,.has-success .input-group-prepend .input-group-text{background-color:#abf3cb}.has-danger.input-group-focus .input-group-append .input-group-text,.has-danger.input-group-focus .input-group-prepend .input-group-text{background-color:#fff;color:#ef8157}.has-success.input-group-focus .input-group-append .input-group-text,.has-success.input-group-focus .input-group-prepend .input-group-text{background-color:#fff;color:#6bd098}.has-danger .form-control:focus+.input-group-append .input-group-text,.has-danger .form-control:focus+.input-group-prepend .input-group-text{color:#ef8157}.has-success .form-control:focus+.input-group-append .input-group-text,.has-success .form-control:focus+.input-group-prepend .input-group-text{color:#6bd098}.input-group-append .input-group-text+.form-control,.input-group-append .input-group-text~.form-control,.input-group-prepend .input-group-text+.form-control,.input-group-prepend .input-group-text~.form-control{padding:-.5rem .7rem;padding-left:18px}.input-group-append .input-group-text i,.input-group-prepend .input-group-text i{width:17px}.input-group-append,.input-group-prepend{margin:0}.input-group-append .input-group-text{border-left:none}.input-group-prepend .input-group-text{border-right:none}.form-group,.input-group{margin-bottom:10px;position:relative}.form-group .form-control-static,.input-group .form-control-static{margin-top:9px}.form-group.has-danger .error,.input-group.has-danger .error{color:#ef8157}.input-group[disabled] .input-group-append .input-group-text,.input-group[disabled] .input-group-prepend .input-group-text{background-color:#e3e3e3}.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:4px;border-top-left-radius:0;border-bottom-left-radius:0;border-left:0 none}.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group .form-control:first-child{border-right:0 none}.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.dropdown-toggle,.input-group .form-control:last-child{border-left:0 none}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#e3e3e3;color:#66615b;cursor:not-allowed}.input-group-btn .btn{border-width:1px;padding:11px .7rem}.input-group-btn .btn-default:not(.btn-fill){border-color:#ddd}.input-group-btn:last-child>.btn{margin-left:0}textarea.form-control{max-width:100%;max-height:80px;padding:10px 10px 0 0;resize:none;border:none;border:1px solid #e3e3e3;border-radius:4px;line-height:2}.has-danger.form-group .form-control,.has-danger.form-group.no-border .form-control,.has-success.form-group .form-control,.has-success.form-group.no-border .form-control{padding-right:32px}.form.form-newsletter .form-group{float:left;width:78%;margin-right:2%;margin-top:9px}.input-group .input-group-btn{padding:0 12px}.form-group input[type=file]{opacity:0;position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;z-index:100}.form-text{font-size:.8571em}.form-control-lg{padding:0;font-size:inherit;line-height:0;border-radius:0}.form-horizontal .col-form-label,.form-horizontal .label-on-right{padding:10px 5px 0 15px;text-align:right;max-width:180px}.form-horizontal .checkbox-radios{margin-bottom:15px}.form-horizontal .checkbox-radios .form-check:first-child{margin-top:8px}.form-horizontal .label-on-right{text-align:left;padding:10px 15px 0 5px}.form-horizontal .form-check-inline{margin-top:6px}button,input,optgroup,select,textarea{font-family:Montserrat,Helvetica Neue,Arial,sans-serif}h1,h2,h3,h4,h5,h6{font-weight:400}a,a:focus,a:hover{color:#51cbce}.h1,h1{font-size:3.5em;line-height:1.15;margin-bottom:30px}.h1 small,h1 small{font-weight:700;text-transform:uppercase;opacity:.8}.h2,h2{font-size:2.5em}.h2,.h3,h2,h3{margin-bottom:30px}.h3,h3{font-size:2em;line-height:1.4em}.h4,h4{font-size:1.714em;line-height:1.45em;margin-top:30px;margin-bottom:15px}.h4+.category,.h4.title+.category,h4+.category,h4.title+.category{margin-top:-10px}.h5,h5{font-size:1.57em;line-height:1.4em;margin-bottom:15px}.h6,h6{font-size:1em;font-weight:700;text-transform:uppercase}p.description{font-size:1.14em}.title{font-weight:700}.title.title-up{text-transform:uppercase}.title.title-up a{color:#2c2c2c;text-decoration:none}.title+.category{margin-top:-10px}.card-description,.card .footer .stats,.description,.footer-big p{color:#9a9a9a;font-weight:300}.card-category,.category{text-transform:capitalize;font-weight:400;color:#9a9a9a;font-size:.7142em}.card-category{font-size:1em}.text-primary,a.text-primary:focus,a.text-primary:hover{color:#51cbce!important}.text-info,a.text-info:focus,a.text-info:hover{color:#51bcda!important}.text-success,a.text-success:focus,a.text-success:hover{color:#6bd098!important}.text-warning,a.text-warning:focus,a.text-warning:hover{color:#fbc658!important}.text-danger,a.text-danger:focus,a.text-danger:hover{color:#ef8157!important}.text-gray,a.text-gray:focus,a.text-gray:hover{color:#e3e3e3!important}.blockquote{border-left:none;border:1px solid #66615b;padding:20px;font-size:1.1em;line-height:1.8}.blockquote small{color:#66615b;font-size:.8571em;text-transform:uppercase}.blockquote.blockquote-primary{border-color:#51cbce;color:#51cbce}.blockquote.blockquote-primary small{color:#51cbce}.blockquote.blockquote-danger{border-color:#ef8157;color:#ef8157}.blockquote.blockquote-danger small{color:#ef8157}.blockquote.blockquote-white{border-color:hsla(0,0%,100%,.8);color:#fff}.blockquote.blockquote-white small{color:hsla(0,0%,100%,.8)}body{color:#2c2c2c;font-size:14px;font-family:Montserrat,Helvetica Neue,Arial,sans-serif;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}.main{position:relative;background:#fff}.animation-transition-general,.nav-pills .nav-link,.nav-tabs .nav-link,.navbar,.off-canvas-sidebar .logo a.logo-mini,.off-canvas-sidebar .logo a.logo-normal,.off-canvas-sidebar .navbar-minimize,.sidebar .logo a.logo-mini,.sidebar .logo a.logo-normal,.sidebar .nav a,.sidebar .nav a i,.sidebar .navbar-minimize,.tag,.tag [data-role=remove]{transition:all .3s ease 0s}.bootstrap-switch-label:before,.caret,.dropdown-toggle:after{transition:all .15s ease 0s}.card-collapse .card a[data-toggle=collapse].expanded i,.card-collapse .card a[data-toggle=collapse][aria-expanded=true] i,.dropdown-toggle[aria-expanded=true]:after,a[data-toggle=collapse][aria-expanded=true] .caret{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);transform:rotate(180deg)}.button-bar{display:block;position:relative;width:22px;height:1px;border-radius:1px;background:#fff}.button-bar+.button-bar{margin-top:7px}.button-bar:nth-child(2){width:17px}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.pull-left{float:left}.pull-right{float:right}.offline-doc .navbar.navbar-transparent{padding-top:25px;border-bottom:none}.offline-doc .navbar.navbar-transparent .navbar-minimize{display:none}.offline-doc .navbar.navbar-transparent .collapse .navbar-nav .nav-link,.offline-doc .navbar.navbar-transparent .navbar-brand{color:#fff!important}.offline-doc .footer{z-index:3!important}.offline-doc .page-header .container{z-index:3}.offline-doc .page-header:after{background-color:rgba(0,0,0,.5);content:"";display:block;height:100%;left:0;position:absolute;top:0;width:100%;z-index:2}.fixed-plugin .dropdown-menu li{padding:2px!important}.badge.badge-default{border-color:#66615b;background-color:#66615b}.badge.badge-primary{border-color:#51cbce;background-color:#51cbce}.badge.badge-info{border-color:#51bcda;background-color:#51bcda}.badge.badge-success{border-color:#6bd098;background-color:#6bd098}.badge.badge-warning{border-color:#fbc658;background-color:#fbc658}.badge.badge-danger{border-color:#ef8157;background-color:#ef8157}.badge.badge-neutral{border-color:#fff;background-color:#fff;color:inherit}.card-user form .form-group{margin-bottom:20px}.form-check-radio,.from-check{margin-bottom:12px;position:relative}.form-check{padding-left:0;margin-bottom:.5rem}.form-check .form-check-label{display:inline-block;position:relative;cursor:pointer;padding-left:35px;line-height:26px;margin-bottom:0}.form-check .form-check-sign:after,.form-check .form-check-sign:before{content:" ";display:inline-block;position:absolute;width:24px;height:24px;left:0;cursor:pointer;border-radius:6px;top:0;background-color:#aaa7a4;transition:opacity .3s linear}.form-check .form-check-sign:after{font-family:FontAwesome;content:"\f00c";top:-1px;text-align:center;font-size:15px;opacity:0;color:#fff;border:0;background-color:inherit}.form-check.disabled .form-check-label{color:#9a9a9a;opacity:.5;cursor:not-allowed}.form-check-radio input[type=radio],.form-check input[type=checkbox]{opacity:0;position:absolute;visibility:hidden}.form-check input[type=checkbox]:checked+.form-check-sign:after{opacity:1}.checkbox input[type=checkbox]:disabled+.form-check-sign:after,.form-control input[type=checkbox]:disabled+.form-check-sign:before{cursor:not-allowed}.form-check-radio input[type=radio]:disabled+.form-check-sign,.form-check .form-check-label input[type=checkbox]:disabled+.form-check-sign{pointer-events:none!important}.form-check-radio{margin-left:-3px}.form-check-radio .form-check-label{padding-left:2rem}.form-check-radio.disabled .form-check-label{color:#9a9a9a;opacity:.5;cursor:not-allowed}.form-check-radio .form-check-sign:before{font-family:FontAwesome;content:"\f10c";font-size:22px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;position:absolute;opacity:.5;left:5px;top:-5px}.form-check-label input[type=checkbox]:checked+.form-check-sign:before{background-color:#66615b}.form-check-radio input[type=radio],.form-check-radio input[type=radio]+.form-check-sign:after{opacity:0;transition:opacity .3s linear;content:" ";display:block}.form-check-radio input[type=radio]:checked+.form-check-sign:after{font-family:FontAwesome;content:"\f192";top:-5px;position:absolute;left:5px;font-size:22px;opacity:1}.form-check-radio input[type=radio]:disabled+.form-check-sign:after,.form-check-radio input[type=radio]:disabled+.form-check-sign:before{color:#9a9a9a}.navbar{padding-top:.625rem;padding-bottom:.625rem;min-height:53px;margin-bottom:20px}.navbar a{vertical-align:middle}.navbar a:not(.btn):not(.dropdown-item){color:#fff}.navbar.bg-white .input-group .form-control,.navbar.bg-white .input-group.no-border .form-control,.navbar a.dropdown-item{color:#66615b}.navbar.bg-white .input-group .form-control::-moz-placeholder,.navbar.bg-white .input-group.no-border .form-control::-moz-placeholder{color:#66615b}.navbar.bg-white .input-group .form-control:-ms-input-placeholder,.navbar.bg-white .input-group.no-border .form-control:-ms-input-placeholder{color:#66615b}.navbar.bg-white .input-group .form-control::-webkit-input-placeholder,.navbar.bg-white .input-group.no-border .form-control::-webkit-input-placeholder{color:#66615b}.navbar.bg-white .input-group-append .input-group-text i,.navbar.bg-white .input-group-prepend .input-group-text i{color:#66615b;opacity:.5}.navbar .form-group,.navbar .input-group{margin:0;margin-left:-3px;margin-right:5px}.navbar .form-group .form-group-addon,.navbar .form-group .input-group-append .input-group-text,.navbar .form-group .input-group-prepend .input-group-text,.navbar .input-group .form-group-addon,.navbar .input-group .input-group-append .input-group-text,.navbar .input-group .input-group-prepend .input-group-text{color:#66615b}.navbar .form-group .form-group-addon i,.navbar .form-group .input-group-append .input-group-text i,.navbar .form-group .input-group-prepend .input-group-text i,.navbar .input-group .form-group-addon i,.navbar .input-group .input-group-append .input-group-text i,.navbar .input-group .input-group-prepend .input-group-text i{opacity:1}.navbar .form-group.no-border .form-control,.navbar .input-group.no-border .form-control{color:#66615b}.navbar .form-group.no-border .form-control::-moz-placeholder,.navbar .input-group.no-border .form-control::-moz-placeholder{color:#66615b}.navbar .form-group.no-border .form-control:-ms-input-placeholder,.navbar .input-group.no-border .form-control:-ms-input-placeholder{color:#66615b}.navbar .form-group.no-border .form-control::-webkit-input-placeholder,.navbar .input-group.no-border .form-control::-webkit-input-placeholder{color:#66615b}.navbar p{display:inline-block;margin:0;line-height:1.8em;font-size:1em;font-weight:400}.navbar.navbar-absolute{position:absolute;width:100%;padding-top:10px;z-index:1029}.documentation .navbar.fixed-top{left:0;width:auto}.navbar .navbar-wrapper{display:inline-flex;align-items:center}.navbar .navbar-wrapper .navbar-minimize{padding-right:10px}.navbar .navbar-wrapper .navbar-minimize .btn{margin:0}.navbar .navbar-wrapper .navbar-toggle .navbar-toggler{padding-left:0}.navbar .navbar-wrapper .navbar-toggle:hover .navbar-toggler-bar.bar2{width:22px}.navbar .navbar-nav.navbar-logo{position:absolute;left:0;right:0;margin:0 auto;width:49px;top:-4px}.navbar .navbar-nav .nav-link.btn{padding:11px 22px}.navbar .navbar-nav .nav-link.btn.btn-lg{padding:15px 48px}.navbar .navbar-nav .nav-link.btn.btn-sm{padding:5px 15px}.navbar .navbar-nav .nav-link{text-transform:uppercase;font-size:.7142em;padding:.5rem .7rem;line-height:1.625rem;margin-right:3px}.navbar .navbar-nav .nav-link i.fa+p,.navbar .navbar-nav .nav-link i.nc-icon+p{margin-left:3px}.navbar .navbar-nav .nav-link i.fa,.navbar .navbar-nav .nav-link i.nc-icon{font-size:18px;position:relative;top:3px;text-align:center;width:21px}.navbar .navbar-nav .nav-link i.nc-icon{top:4px;font-size:16px}.navbar .navbar-nav .nav-link.profile-photo .profile-photo-small{width:27px;height:27px}.navbar .navbar-nav .nav-link.disabled{opacity:.5;color:#fff}.navbar .navbar-nav .nav-item.active .nav-link:not(.btn),.navbar .navbar-nav .nav-item .nav-link:not(.btn):active,.navbar .navbar-nav .nav-item .nav-link:not(.btn):focus,.navbar .navbar-nav .nav-item .nav-link:not(.btn):hover{border-radius:3px;color:#66615b}.navbar .logo-container{width:27px;height:27px;overflow:hidden;margin:0 auto;border-radius:50%;border:1px solid transparent}.navbar .navbar-brand{text-transform:capitalize;font-size:20px;padding-top:.5rem;padding-bottom:.5rem;line-height:1.625rem}.navbar .navbar-toggler{width:37px;height:27px;vertical-align:middle;outline:0;cursor:pointer}.navbar .navbar-toggler .navbar-toggler-bar.navbar-kebab{width:3px;height:3px;border-radius:50%;margin:0 auto}.navbar .button-dropdown .navbar-toggler-bar:nth-child(2){width:17px}.navbar.navbar-transparent{background-color:transparent!important;box-shadow:none;border-bottom:1px solid #ddd}.navbar.navbar-transparent a:not(.dropdown-item):not(.btn){color:#66615b}.navbar.navbar-transparent a:not(.dropdown-item):not(.btn).disabled{opacity:.5;color:#66615b}.navbar.navbar-transparent .button-bar{background:#66615b}.navbar.navbar-transparent .nav-item .nav-link:not(.btn){color:#66615b}.navbar.navbar-transparent .nav-item.active .nav-link:not(.btn),.navbar.navbar-transparent .nav-item .nav-link:not(.btn):active,.navbar.navbar-transparent .nav-item .nav-link:not(.btn):focus,.navbar.navbar-transparent .nav-item .nav-link:not(.btn):focus:hover,.navbar.navbar-transparent .nav-item .nav-link:not(.btn):hover{color:#51cbce}.navbar.bg-white a:not(.dropdown-item):not(.btn){color:#66615b}.navbar.bg-white a:not(.dropdown-item):not(.btn).disabled{opacity:.5;color:#66615b}.navbar.bg-white .button-bar{background:#66615b}.navbar.bg-white .nav-item.active .nav-link:not(.btn),.navbar.bg-white .nav-item .nav-link:not(.btn):active,.navbar.bg-white .nav-item .nav-link:not(.btn):focus,.navbar.bg-white .nav-item .nav-link:not(.btn):hover{color:#51bcda}.navbar.bg-white .logo-container{border:1px solid #66615b}.navbar .navbar-collapse .nav-item a{font-size:14px}.bg-default{background-color:#66615b!important}.bg-primary{background-color:#51cbce!important}.bg-info{background-color:#51bcda!important}.bg-success{background-color:#6bd098!important}.bg-danger{background-color:#ef8157!important}.bg-warning{background-color:#fbc658!important}.bg-white{background-color:#fff!important}.page-header{min-height:100vh;max-height:1000px;padding:0;color:#fff;position:relative}.page-header .page-header-image{position:absolute;background-size:cover;background-position:50%;width:100%;height:100%;z-index:-1}.page-header .content-center{position:absolute;top:50%;left:50%;z-index:2;transform:translate(-50%,-50%);text-align:center;color:#fff;padding:0 15px;width:100%;max-width:880px}.page-header footer{position:absolute;bottom:0;width:100%}.page-header .container{height:100%;z-index:1}.page-header .category,.page-header .description{color:hsla(0,0%,100%,.8)}.page-header.page-header-small{min-height:60vh;max-height:440px}.page-header.page-header-mini{min-height:40vh;max-height:340px}.page-header .title{margin-bottom:15px}.page-header .title+h4{margin-top:10px}.page-header:after,.page-header:before{position:absolute;z-index:0;width:100%;height:100%;display:block;left:0;top:0;content:""}.page-header:before{background-color:rgba(0,0,0,.3)}.page-header[filter-color=orange]{background:rgba(44,44,44,.2);background:linear-gradient(0deg,rgba(44,44,44,.2),rgba(224,23,3,.6))}.bootstrap-select .dropdown-menu,.dropdown .dropdown-menu,.dropup .dropdown-menu{display:block;opacity:0;filter:alpha(opacity=0);box-shadow:1px 2px 7px 1px rgba(0,0,0,.125);visibility:hidden;position:absolute;transition:all .3s cubic-bezier(.215,.61,.355,1) 0s,opacity .3s ease 0s,height 0s linear .35s}.bootstrap-select .dropdown-menu[x-placement=bottom-start],.bootstrap-select .dropdown-menu[x-placement=top-start],.dropdown .dropdown-menu[x-placement=bottom-start],.dropdown .dropdown-menu[x-placement=top-start],.dropup .dropdown-menu[x-placement=bottom-start],.dropup .dropdown-menu[x-placement=top-start]{transform:translate3d(-20px,0,0)!important}.bootstrap-select.show .dropdown-menu,.dropdown.show .dropdown-menu,.dropup.show .dropdown-menu{opacity:1;filter:alpha(opacity=100);visibility:visible}.bootstrap-select.show .dropdown-menu[x-placement=top-start],.dropdown.show .dropdown-menu[x-placement=top-start],.dropup.show .dropdown-menu[x-placement=top-start]{transform:translate3d(-20px,-50px,0)!important;top:auto!important;bottom:0!important}.bootstrap-select.show .dropdown-menu[x-placement=bottom-start],.dropdown.show .dropdown-menu[x-placement=bottom-start],.dropup.show .dropdown-menu[x-placement=bottom-start]{transform:translate3d(-20px,50px,0)!important;bottom:auto!important;top:0!important}.dropdown-btn .dropdown-menu,.dropup .dropdown-menu{transform:translate3d(-20px,0,0)!important;top:auto!important;bottom:0!important}.dropdown-btn.show .dropdown-menu,.dropup.show .dropdown-menu{opacity:1;visibility:visible}.dropdown-btn.show .dropdown-menu .dropdown-menu.inner,.dropup.show .dropdown-menu .dropdown-menu.inner{transform:translateZ(0)!important}.bootstrap-select.show .dropdown-menu.show[x-placement=top-start]{transform:translate3d(-20px,-60px,0)!important;top:auto!important;bottom:0!important}.bootstrap-select.show .dropdown-menu.show li:last-child a:hover{border-radius:0 0 12px 12px}.bootstrap-select.dropup.show:before{top:-1px!important}.bootstrap-select.dropup.show:after{top:-2px!important}.dropdown-menu{background-color:#fff;border:0 none;border-radius:12px;margin-top:10px;padding:0}.dropdown-menu .divider{background-color:#f1eae0;margin:0}.dropdown-menu .dropdown-header{color:#9a9a9a;font-size:.8571em;padding:10px 15px}.dropdown-menu .no-notification{color:#9a9a9a;font-size:1.2em;padding:30px;text-align:center}.dropdown-menu .dropdown-item{color:#66615b;font-size:14px;padding:10px 45px 10px 15px;clear:both;white-space:nowrap;width:100%;display:block}.dropdown-menu .dropdown-item img{margin-top:-3px}.dropdown-menu .dropdown-item:focus{outline:0!important}.btn-group.select .dropdown-menu{min-width:100%}.dropdown-menu .dropdown-item:first-child{border-top-left-radius:12px;border-top-right-radius:12px}.dropdown-menu .dropdown-item:last-child{border-bottom-left-radius:12px;border-bottom-right-radius:12px}.select .dropdown-menu .dropdown-item:first-child{border-radius:0;border-bottom:0 none}.dropdown-menu .dropdown-item:focus,.dropdown-menu .dropdown-item:hover{color:#fff!important;opacity:1;text-decoration:none;background-color:#66615b}.dropdown-menu.dropdown-primary .dropdown-item:focus,.dropdown-menu.dropdown-primary .dropdown-item:hover{background-color:#6dd3d6}.dropdown-menu.dropdown-info .dropdown-item:focus,.dropdown-menu.dropdown-info .dropdown-item:hover{background-color:#6ec7e0}.dropdown-menu.dropdown-success .dropdown-item:focus,.dropdown-menu.dropdown-success .dropdown-item:hover{background-color:#86d9ab}.dropdown-menu.dropdown-warning .dropdown-item:focus,.dropdown-menu.dropdown-warning .dropdown-item:hover{background-color:#fcd27b}.dropdown-menu.dropdown-danger .dropdown-item:focus,.dropdown-menu.dropdown-danger .dropdown-item:hover{background-color:#f29978}.dropdown-divider{margin:0!important}.btn-group.select.open{overflow:visible}.dropdown-menu-right{right:-2px;left:auto}.card-just-text .dropdown .dropdown-menu:before,.card.card-just-text .dropdown .dropdown-menu:before,.dropdown-btn .dropdown-menu:before,.dropdown .dropdown-menu[x-placement=bottom-end]:before,.dropdown .dropdown-menu[x-placement=bottom-start]:before,.navbar-nav .dropdown-menu:before{border-bottom:11px solid #f1eae0;border-left:11px solid transparent;border-right:11px solid transparent;content:"";display:inline-block;position:absolute;right:12px;top:-12px}.card-just-text .dropdown .dropdown-menu:after,.card.card-just-text .dropdown .dropdown-menu:after,.dropdown-btn .dropdown-menu:after,.dropdown .dropdown-menu[x-placement=bottom-end]:after,.dropdown .dropdown-menu[x-placement=bottom-start]:after,.navbar-nav .dropdown-menu:after{border-bottom:11px solid #fff;border-left:11px solid transparent;border-right:11px solid transparent;content:"";display:inline-block;position:absolute;right:12px;top:-11px}.dropdown .dropdown-menu.dropdown-notification[x-placement=bottom-start]:after,.dropdown .dropdown-menu.dropdown-notification[x-placement=bottom-start]:before,.dropdown .dropdown-menu.dropdown-notification[x-placement=top-start]:after,.dropdown .dropdown-menu.dropdown-notification[x-placement=top-start]:before{left:30px!important;right:auto}@media screen and (min-width:768px){.navbar-form{margin-top:21px;margin-bottom:21px;padding-left:5px;padding-right:5px}.navbar-search-form{display:none}.dropdown-btn .dropdown-menu,.dropdown .dropdown-menu,.navbar-nav .dropdown-item .dropdown-menu{transform:translate3d(0,-40px,0);transition:all .3s cubic-bezier(.215,.61,.355,1) 0s,opacity .3s ease 0s,height 0s linear .35s}.dropdown-btn.show .dropdown-menu,.dropdown.show .dropdown-menu,.navbar-nav .dropdown-item.show .dropdown-menu{transform:translateZ(0);visibility:visible!important}.bootstrap-select .dropdown-menu{transition:all .15s linear}.bootstrap-datetimepicker-widget{visibility:visible!important}.bootstrap-select .show .dropdown-menu{transition:all .3s cubic-bezier(.215,.61,.355,1) 0s,opacity .3s ease 0s,height 0s linear .35s;transform:translateZ(0)}.navbar-nav.navbar-right li .dropdown-menu:after,.navbar-nav.navbar-right li .dropdown-menu:before{left:auto;right:12px}.footer:not(.footer-big) nav ul li:first-child{margin-left:0}body>.navbar-collapse.collapse{display:none!important}}.dropdown-sharing .dropup-item{color:#66615b;font-size:14px}.dropdown-sharing .dropup-item .social-line{line-height:28px;padding:10px 20px 5px!important}.dropdown-sharing .dropup-item .social-line [class*=icon-]{font-size:20px}.dropdown-sharing .dropup-item:last-child{margin:0 13px;display:block}.dropdown-sharing .dropup-item .btn{margin:10px}.dropdown-sharing .dropup-item:focus .action-line,.dropdown-sharing .dropup-item:focus .social-line,.dropdown-sharing .dropup-item:hover .action-line,.dropdown-sharing .dropup-item:hover .social-line{background-color:#fff;color:#66615b;opacity:1;text-decoration:none}.show .dropdown-actions,.show .dropdown-sharing{margin-bottom:1px}.dropdown-actions .dropdown-item{margin:-15px 35px}.dropdown-actions .dropdown-item .action-line{padding:5px 10px;line-height:24px;font-weight:700}.dropdown-actions .dropdown-item .action-line [class*=icon-]{font-size:24px}.dropdown-actions .dropdown-item .action-line .col-sm-9{line-height:34px}.dropdown-actions .dropdown-item .link-danger,.dropdown-actions .dropdown-item .link-danger:active,.dropdown-actions .dropdown-item .link-danger:focus,.dropdown-actions .dropdown-item .link-danger:hover{color:#ef8157}.dropdown-actions li:focus a,.dropdown-actions li:hover a{color:#66615b;opacity:1;text-decoration:none}.dropdown-actions .action-line .icon-simple{margin-left:-15px}.dropdown .dropdown-menu[x-placement=top-end]:before,.dropdown .dropdown-menu[x-placement=top-start]:before,.dropup .dropdown-menu:before{border-top:11px solid #dcd9d1;border-left:11px solid transparent;border-right:11px solid transparent;content:"";display:inline-block;position:absolute;right:12px;bottom:-12px}.dropdown .dropdown-menu[x-placement=top-end]:after,.dropdown .dropdown-menu[x-placement=top-start]:after,.dropup .dropdown-menu:after{border-top:11px solid #fff;border-left:11px solid transparent;border-right:11px solid transparent;content:"";display:inline-block;position:absolute;right:12px;bottom:-11px}.dropdown .dropdown-toggle:after,.dropup .dropdown-toggle:after{margin-left:0}.dropdown-notification .dropdown-notification-list .notification-item{border-bottom:1px solid #f1eae0;font-size:16px;color:#66615b}.dropdown-notification .dropdown-notification-list .notification-item .notification-text{padding-left:40px;position:relative;min-width:330px;min-height:70px;white-space:normal}.dropdown-notification .dropdown-notification-list .notification-item .notification-text .label{display:block;position:absolute;top:50%;margin-top:-12px;left:7px}.dropdown-notification .dropdown-notification-list .notification-item .notification-text .message{font-size:.9em;line-height:.7;margin-left:10px}.dropdown-notification .dropdown-notification-list .notification-item .notification-text .time{color:#9a9a9a;font-size:.7em;margin-left:10px}.dropdown-notification .dropdown-notification-list .notification-item .read-notification{font-size:12px;opacity:0;position:absolute;right:5px;top:50%;margin-top:-12px}.dropdown-notification .dropdown-notification-list .notification-item:hover{text-decoration:none}.dropdown-notification .dropdown-notification-list .notification-item:hover .notification-text{color:#66615b;background-color:#f0efeb!important}.dropdown-notification .dropdown-notification-list .notification-item:hover .read-notification{opacity:1!important}.dropdown-notification .dropdown-footer{background-color:#e8e7e3;border-radius:0 0 8px 8px}.dropdown-notification .dropdown-footer .dropdown-footer-menu{list-style:outside none none;padding:0 5px}.dropdown-notification .dropdown-footer .dropdown-footer-menu li{display:inline-block;text-align:left;padding:0 10px}.dropdown-notification .dropdown-footer .dropdown-footer-menu li a{color:#9c9b99;font-size:.9em;line-height:35px}.alert{border:0;border-radius:3px;color:#fff;padding-top:.9rem;padding-bottom:.9rem;position:relative}.alert.alert-success{background-color:#7ed6a5}.alert.alert-danger{background-color:#f1926e}.alert.alert-warning{background-color:#fccf71}.alert.alert-info{background-color:#66c4de}.alert.alert-primary{background-color:#65d1d4}.alert .close{color:#fff;opacity:.9;text-shadow:none;line-height:0;outline:0}.alert .close i.fa,.alert .close i.nc-icon{font-size:14px!important}.alert .close:focus,.alert .close:hover{opacity:1}.alert span[data-notify=icon]{font-size:27px;display:block;left:19px;position:absolute;top:50%;margin-top:-11px}.alert button.close{position:absolute;right:10px;top:50%;margin-top:-13px;width:25px;height:25px;padding:3px}.alert .close~span{display:block;max-width:89%}.alert.alert-with-icon{padding-left:65px}img{max-width:100%;border-radius:3px}.img-raised{box-shadow:0 10px 25px 0 rgba(0,0,0,.3)}@font-face{font-family:nucleo-icons;src:url(../fonts/nucleo-icons.eot);src:url(../fonts/nucleo-icons.eot) format("embedded-opentype"),url(../fonts/nucleo-icons.woff2) format("woff2"),url(../fonts/nucleo-icons.woff) format("woff"),url(../fonts/nucleo-icons.ttf) format("truetype"),url(../fonts/nucleo-icons.svg) format("svg");font-weight:400;font-style:normal}.nc-icon{display:inline-block;font:normal normal normal 14px/1 nucleo-icons;font-size:inherit;speak:none;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.nc-icon.lg{font-size:1.33333333em;vertical-align:-16%}.nc-icon.x2{font-size:2em}.nc-icon.x3{font-size:3em}.nc-icon.circle,.nc-icon.square{padding:.33333333em;vertical-align:-16%;background-color:#eee}.nc-icon.circle{border-radius:50%}.nc-icon-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.nc-icon-ul>li{position:relative}.nc-icon-ul>li>.nc-icon{position:absolute;left:-1.57142857em;top:.14285714em;text-align:center}.nc-icon-ul>li>.nc-icon.lg{top:0;left:-1.35714286em}.nc-icon-ul>li>.nc-icon.circle,.nc-icon-ul>li>.nc-icon.square{top:-.19047619em;left:-1.9047619em}.nc-icon.spin{animation:f 2s infinite linear}@keyframes f{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.nc-icon.rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);transform:rotate(90deg)}.nc-icon.rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);transform:rotate(180deg)}.nc-icon.rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);transform:rotate(270deg)}.nc-icon.flip-y{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0);transform:scaleX(-1)}.nc-icon.flip-x{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);transform:scaleY(-1)}.nc-air-baloon:before{content:"\ea01"}.nc-album-2:before{content:"\ea02"}.nc-alert-circle-i:before{content:"\ea04"}.nc-align-center:before{content:"\ea03"}.nc-align-left-2:before{content:"\ea05"}.nc-ambulance:before{content:"\ea06"}.nc-app:before{content:"\ea07"}.nc-atom:before{content:"\ea08"}.nc-badge:before{content:"\ea09"}.nc-bag-16:before{content:"\ea0a"}.nc-bank:before{content:"\ea0b"}.nc-basket:before{content:"\ea0c"}.nc-bell-55:before{content:"\ea0d"}.nc-bold:before{content:"\ea0e"}.nc-book-bookmark:before{content:"\ea0f"}.nc-bookmark-2:before{content:"\ea10"}.nc-box-2:before{content:"\ea11"}.nc-box:before{content:"\ea12"}.nc-briefcase-24:before{content:"\ea13"}.nc-bulb-63:before{content:"\ea14"}.nc-bullet-list-67:before{content:"\ea15"}.nc-bus-front-12:before{content:"\ea16"}.nc-button-pause:before{content:"\ea17"}.nc-button-play:before{content:"\ea18"}.nc-button-power:before{content:"\ea19"}.nc-calendar-60:before{content:"\ea1a"}.nc-camera-compact:before{content:"\ea1b"}.nc-caps-small:before{content:"\ea1c"}.nc-cart-simple:before{content:"\ea1d"}.nc-chart-bar-32:before{content:"\ea1e"}.nc-chart-pie-36:before{content:"\ea1f"}.nc-chat-33:before{content:"\ea20"}.nc-check-2:before{content:"\ea21"}.nc-circle-10:before{content:"\ea22"}.nc-cloud-download-93:before{content:"\ea23"}.nc-cloud-upload-94:before{content:"\ea24"}.nc-compass-05:before{content:"\ea25"}.nc-controller-modern:before{content:"\ea26"}.nc-credit-card:before{content:"\ea27"}.nc-delivery-fast:before{content:"\ea28"}.nc-diamond:before{content:"\ea29"}.nc-email-85:before{content:"\ea2a"}.nc-favourite-28:before{content:"\ea2b"}.nc-glasses-2:before{content:"\ea2c"}.nc-globe-2:before{content:"\ea2d"}.nc-globe:before{content:"\ea2e"}.nc-hat-3:before{content:"\ea2f"}.nc-headphones:before{content:"\ea30"}.nc-html5:before{content:"\ea31"}.nc-image:before{content:"\ea32"}.nc-istanbul:before{content:"\ea33"}.nc-key-25:before{content:"\ea34"}.nc-laptop:before{content:"\ea35"}.nc-layout-11:before{content:"\ea36"}.nc-lock-circle-open:before{content:"\ea37"}.nc-map-big:before{content:"\ea38"}.nc-minimal-down:before{content:"\ea39"}.nc-minimal-left:before{content:"\ea3a"}.nc-minimal-right:before{content:"\ea3b"}.nc-minimal-up:before{content:"\ea3c"}.nc-mobile:before{content:"\ea3d"}.nc-money-coins:before{content:"\ea3e"}.nc-note-03:before{content:"\ea3f"}.nc-palette:before{content:"\ea40"}.nc-paper:before{content:"\ea41"}.nc-pin-3:before{content:"\ea42"}.nc-planet:before{content:"\ea43"}.nc-refresh-69:before{content:"\ea44"}.nc-ruler-pencil:before{content:"\ea45"}.nc-satisfied:before{content:"\ea46"}.nc-scissors:before{content:"\ea47"}.nc-send:before{content:"\ea48"}.nc-settings-gear-65:before{content:"\ea49"}.nc-settings:before{content:"\ea4a"}.nc-share-66:before{content:"\ea4b"}.nc-shop:before{content:"\ea4c"}.nc-simple-add:before{content:"\ea4d"}.nc-simple-delete:before{content:"\ea4e"}.nc-simple-remove:before{content:"\ea4f"}.nc-single-02:before{content:"\ea50"}.nc-single-copy-04:before{content:"\ea51"}.nc-sound-wave:before{content:"\ea52"}.nc-spaceship:before{content:"\ea53"}.nc-sun-fog-29:before{content:"\ea54"}.nc-support-17:before{content:"\ea55"}.nc-tablet-2:before{content:"\ea56"}.nc-tag-content:before{content:"\ea57"}.nc-tap-01:before{content:"\ea58"}.nc-tie-bow:before{content:"\ea59"}.nc-tile-56:before{content:"\ea5a"}.nc-time-alarm:before{content:"\ea5b"}.nc-touch-id:before{content:"\ea5c"}.nc-trophy:before{content:"\ea5d"}.nc-tv-2:before{content:"\ea5e"}.nc-umbrella-13:before{content:"\ea5f"}.nc-user-run:before{content:"\ea60"}.nc-vector:before{content:"\ea61"}.nc-watch-time:before{content:"\ea62"}.nc-world-2:before{content:"\ea63"}.nc-zoom-split:before{content:"\ea64"}.table .img-wrapper{width:40px;height:40px;border-radius:50%;overflow:hidden;margin:0 auto}.table .img-row{max-width:60px;width:60px}.table .form-check{margin:0}.table .form-check label .form-check-sign:after,.table .form-check label .form-check-sign:before{top:-17px;left:4px}.table .btn{margin:0}.table .small,.table small{font-weight:300}.card-tasks .card-body .table{margin-bottom:0}.card-tasks .card-body .table>tbody>tr>td,.card-tasks .card-body .table>tbody>tr>th,.card-tasks .card-body .table>tfoot>tr>td,.card-tasks .card-body .table>tfoot>tr>th,.card-tasks .card-body .table>thead>tr>td,.card-tasks .card-body .table>thead>tr>th{padding-top:0;padding-bottom:0}.table>thead>tr>th{font-size:14px;font-weight:700;padding-bottom:0;text-transform:uppercase;border:0}.table .checkbox,.table .radio{margin-top:0;margin-bottom:0;padding:0;width:15px}.table .checkbox .icons,.table .radio .icons{position:relative}.table .checkbox label:after,.table .checkbox label:before,.table .radio label:after,.table .radio label:before{top:-17px;left:-3px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:12px 7px;vertical-align:middle}.table .th-description{max-width:150px}.table .td-price{font-size:26px;font-weight:300;margin-top:5px;position:relative;top:4px;text-align:right}.table .td-total{font-weight:700;font-size:1.57em;padding-top:20px;text-align:right}.table .td-actions .btn{margin:0}.table>tbody>tr{position:relative}.table-shopping>thead>tr>th{font-size:1em;text-transform:uppercase}.table-shopping>tbody>tr>td{font-size:1em}.table-shopping>tbody>tr>td b{display:block;margin-bottom:5px}.table-shopping .td-name{font-weight:400;font-size:1.5em}.table-shopping .td-name small{color:#9a9a9a;font-size:.75em;font-weight:300}.table-shopping .td-number{font-weight:300;font-size:1.714em}.table-shopping .td-name{min-width:200px}.table-shopping .td-number{text-align:right;min-width:170px}.table-shopping .td-number small{margin-right:3px}.table-shopping .img-container{width:120px;max-height:160px;overflow:hidden;display:block}.table-shopping .img-container img{width:100%}.table-responsive{overflow:scroll;padding-bottom:10px}#tables .table-responsive{margin-bottom:30px}.table-hover>tbody>tr:hover{background-color:#f5f5f5}.wrapper{position:relative;top:0;height:100vh}.wrapper.wrapper-full-page{min-height:100vh;height:auto}.off-canvas-sidebar,.sidebar{position:fixed;top:0;height:100%;bottom:0;width:260px;left:0;z-index:1030;border-right:1px solid #ddd}.off-canvas-sidebar .sidebar-wrapper,.sidebar .sidebar-wrapper{position:relative;height:calc(100vh - 75px);overflow:auto;width:260px;z-index:4;padding-bottom:100px}.off-canvas-sidebar .sidebar-wrapper .dropdown .dropdown-backdrop,.sidebar .sidebar-wrapper .dropdown .dropdown-backdrop{display:none!important}.off-canvas-sidebar .sidebar-wrapper .navbar-form,.sidebar .sidebar-wrapper .navbar-form{border:none}.off-canvas-sidebar .navbar-minimize,.sidebar .navbar-minimize{position:absolute;right:20px;top:2px;opacity:1}.off-canvas-sidebar .nav,.sidebar .nav{margin-top:20px;display:block}.off-canvas-sidebar .nav .caret,.sidebar .nav .caret{top:14px;position:absolute;right:10px}.off-canvas-sidebar .nav li>a+div .nav li>a,.sidebar .nav li>a+div .nav li>a{margin-top:7px}.off-canvas-sidebar .nav li>a,.sidebar .nav li>a{margin:10px 15px 0;color:#fff;display:block;text-decoration:none;position:relative;text-transform:uppercase;cursor:pointer;font-size:12px;padding:10px 8px;line-height:30px;opacity:.7}.off-canvas-sidebar .nav li .nav>li>a,.sidebar .nav li .nav>li>a{padding:5px 8px}.off-canvas-sidebar .nav li.active>a,.off-canvas-sidebar .nav li.active>a>i,.off-canvas-sidebar .nav li:focus:not(.active)>a,.off-canvas-sidebar .nav li:hover:not(.active)>a,.sidebar .nav li.active>a,.sidebar .nav li.active>a>i,.sidebar .nav li:focus:not(.active)>a,.sidebar .nav li:hover:not(.active)>a{opacity:1}.off-canvas-sidebar .nav i,.sidebar .nav i{font-size:24px;float:left;margin-right:12px;line-height:30px;width:34px;text-align:center;color:hsla(0,0%,100%,.5);position:relative}.off-canvas-sidebar .nav p,.sidebar .nav p{margin-bottom:0}.off-canvas-sidebar .nav .collapse .nav,.off-canvas-sidebar .nav .collapsing .nav,.sidebar .nav .collapse .nav,.sidebar .nav .collapsing .nav{margin-top:0}.off-canvas-sidebar .sidebar-background,.sidebar .sidebar-background{position:absolute;z-index:1;height:100%;width:100%;display:block;top:0;left:0;background-size:cover;background-position:50%}.off-canvas-sidebar .sidebar-background:after,.sidebar .sidebar-background:after{position:absolute;z-index:3;width:100%;height:100%;content:"";display:block;background:#fff;opacity:1}.off-canvas-sidebar .logo,.sidebar .logo{position:relative;padding:7px .7rem;z-index:4}.off-canvas-sidebar .logo a.logo-mini,.sidebar .logo a.logo-mini{opacity:1;float:left;width:34px;text-align:center;margin-left:10px;margin-right:12px}.off-canvas-sidebar .logo a.logo-normal,.sidebar .logo a.logo-normal{display:block;opacity:1;padding:11px 0 8px;transform:translateZ(0)}.off-canvas-sidebar .logo:after,.sidebar .logo:after{content:"";position:absolute;bottom:0;right:15px;height:1px;width:calc(100% - 30px);background-color:hsla(0,0%,100%,.5)}.off-canvas-sidebar .logo p,.sidebar .logo p{float:left;font-size:20px;margin:10px;color:#fff;line-height:20px;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}.off-canvas-sidebar .logo .simple-text,.sidebar .logo .simple-text{text-transform:uppercase;padding:.5rem 0;display:block;white-space:nowrap;font-size:1rem;color:#fff;text-decoration:none;font-weight:400;line-height:30px;overflow:hidden}.off-canvas-sidebar .logo-tim,.sidebar .logo-tim{border-radius:50%;border:1px solid #333;display:block;height:61px;width:61px;float:left;overflow:hidden}.off-canvas-sidebar .logo-tim img,.sidebar .logo-tim img{width:60px;height:60px}.off-canvas-sidebar:after,.off-canvas-sidebar:before,.sidebar:after,.sidebar:before{display:block;content:"";opacity:1;position:absolute;width:100%;height:100%;top:0;left:0}.off-canvas-sidebar:after,.sidebar:after{background:#66615b;background:linear-gradient(#66615b,#000 80%);z-index:3}.off-canvas-sidebar[data-color=white]:after,.sidebar[data-color=white]:after{background:#fff}.off-canvas-sidebar[data-color=white] .nav li a,.off-canvas-sidebar[data-color=white] .nav li a[data-toggle=collapse],.off-canvas-sidebar[data-color=white] .nav li a[data-toggle=collapse] i,.off-canvas-sidebar[data-color=white] .nav li a[data-toggle=collapse]~div>ul>li .sidebar-mini-icon,.off-canvas-sidebar[data-color=white] .nav li a[data-toggle=collapse]~div>ul>li>a,.off-canvas-sidebar[data-color=white] .nav li a i,.sidebar[data-color=white] .nav li a,.sidebar[data-color=white] .nav li a[data-toggle=collapse],.sidebar[data-color=white] .nav li a[data-toggle=collapse] i,.sidebar[data-color=white] .nav li a[data-toggle=collapse]~div>ul>li .sidebar-mini-icon,.sidebar[data-color=white] .nav li a[data-toggle=collapse]~div>ul>li>a,.sidebar[data-color=white] .nav li a i{color:#66615b;opacity:.7}.off-canvas-sidebar[data-color=white] .nav li:focus:not(.active)>a,.off-canvas-sidebar[data-color=white] .nav li:hover:not(.active)>a,.sidebar[data-color=white] .nav li:focus:not(.active)>a,.sidebar[data-color=white] .nav li:hover:not(.active)>a{opacity:1}.off-canvas-sidebar[data-color=white] .logo .simple-text,.sidebar[data-color=white] .logo .simple-text{color:#66615b}.off-canvas-sidebar[data-color=white] .logo:after,.sidebar[data-color=white] .logo:after{background-color:#66615b;opacity:.4}.off-canvas-sidebar[data-color=white] .user .info a span,.off-canvas-sidebar[data-color=white] .user .nav .sidebar-mini-icon,.off-canvas-sidebar[data-color=white] .user .nav .sidebar-normal,.sidebar[data-color=white] .user .info a span,.sidebar[data-color=white] .user .nav .sidebar-mini-icon,.sidebar[data-color=white] .user .nav .sidebar-normal{color:#66615b!important}.off-canvas-sidebar[data-color=white] .user:after,.sidebar[data-color=white] .user:after{background-color:#66615b;opacity:.4}.off-canvas-sidebar[data-color=black]:after,.sidebar[data-color=black]:after{background:#212120}.off-canvas-sidebar[data-active-color=primary] .nav li.active>a,.off-canvas-sidebar[data-active-color=primary] .nav li.active>a[data-toggle=collapse],.off-canvas-sidebar[data-active-color=primary] .nav li.active>a[data-toggle=collapse] i,.off-canvas-sidebar[data-active-color=primary] .nav li.active>a[data-toggle=collapse]~div>ul>li.active .sidebar-mini-icon,.off-canvas-sidebar[data-active-color=primary] .nav li.active>a[data-toggle=collapse]~div>ul>li.active>a,.off-canvas-sidebar[data-active-color=primary] .nav li.active>a i,.sidebar[data-active-color=primary] .nav li.active>a,.sidebar[data-active-color=primary] .nav li.active>a[data-toggle=collapse],.sidebar[data-active-color=primary] .nav li.active>a[data-toggle=collapse] i,.sidebar[data-active-color=primary] .nav li.active>a[data-toggle=collapse]~div>ul>li.active .sidebar-mini-icon,.sidebar[data-active-color=primary] .nav li.active>a[data-toggle=collapse]~div>ul>li.active>a,.sidebar[data-active-color=primary] .nav li.active>a i{color:#51cbce;opacity:1}.off-canvas-sidebar[data-active-color=info] .nav li.active>a,.off-canvas-sidebar[data-active-color=info] .nav li.active>a[data-toggle=collapse],.off-canvas-sidebar[data-active-color=info] .nav li.active>a[data-toggle=collapse] i,.off-canvas-sidebar[data-active-color=info] .nav li.active>a[data-toggle=collapse]~div>ul>li.active .sidebar-mini-icon,.off-canvas-sidebar[data-active-color=info] .nav li.active>a[data-toggle=collapse]~div>ul>li.active>a,.off-canvas-sidebar[data-active-color=info] .nav li.active>a i,.sidebar[data-active-color=info] .nav li.active>a,.sidebar[data-active-color=info] .nav li.active>a[data-toggle=collapse],.sidebar[data-active-color=info] .nav li.active>a[data-toggle=collapse] i,.sidebar[data-active-color=info] .nav li.active>a[data-toggle=collapse]~div>ul>li.active .sidebar-mini-icon,.sidebar[data-active-color=info] .nav li.active>a[data-toggle=collapse]~div>ul>li.active>a,.sidebar[data-active-color=info] .nav li.active>a i{color:#51bcda;opacity:1}.off-canvas-sidebar[data-active-color=success] .nav li.active>a,.off-canvas-sidebar[data-active-color=success] .nav li.active>a[data-toggle=collapse],.off-canvas-sidebar[data-active-color=success] .nav li.active>a[data-toggle=collapse] i,.off-canvas-sidebar[data-active-color=success] .nav li.active>a[data-toggle=collapse]~div>ul>li.active .sidebar-mini-icon,.off-canvas-sidebar[data-active-color=success] .nav li.active>a[data-toggle=collapse]~div>ul>li.active>a,.off-canvas-sidebar[data-active-color=success] .nav li.active>a i,.sidebar[data-active-color=success] .nav li.active>a,.sidebar[data-active-color=success] .nav li.active>a[data-toggle=collapse],.sidebar[data-active-color=success] .nav li.active>a[data-toggle=collapse] i,.sidebar[data-active-color=success] .nav li.active>a[data-toggle=collapse]~div>ul>li.active .sidebar-mini-icon,.sidebar[data-active-color=success] .nav li.active>a[data-toggle=collapse]~div>ul>li.active>a,.sidebar[data-active-color=success] .nav li.active>a i{color:#6bd098;opacity:1}.off-canvas-sidebar[data-active-color=warning] .nav li.active>a,.off-canvas-sidebar[data-active-color=warning] .nav li.active>a[data-toggle=collapse],.off-canvas-sidebar[data-active-color=warning] .nav li.active>a[data-toggle=collapse] i,.off-canvas-sidebar[data-active-color=warning] .nav li.active>a[data-toggle=collapse]~div>ul>li.active .sidebar-mini-icon,.off-canvas-sidebar[data-active-color=warning] .nav li.active>a[data-toggle=collapse]~div>ul>li.active>a,.off-canvas-sidebar[data-active-color=warning] .nav li.active>a i,.sidebar[data-active-color=warning] .nav li.active>a,.sidebar[data-active-color=warning] .nav li.active>a[data-toggle=collapse],.sidebar[data-active-color=warning] .nav li.active>a[data-toggle=collapse] i,.sidebar[data-active-color=warning] .nav li.active>a[data-toggle=collapse]~div>ul>li.active .sidebar-mini-icon,.sidebar[data-active-color=warning] .nav li.active>a[data-toggle=collapse]~div>ul>li.active>a,.sidebar[data-active-color=warning] .nav li.active>a i{color:#fbc658;opacity:1}.off-canvas-sidebar[data-active-color=danger] .nav li.active>a,.off-canvas-sidebar[data-active-color=danger] .nav li.active>a[data-toggle=collapse],.off-canvas-sidebar[data-active-color=danger] .nav li.active>a[data-toggle=collapse] i,.off-canvas-sidebar[data-active-color=danger] .nav li.active>a[data-toggle=collapse]~div>ul>li.active .sidebar-mini-icon,.off-canvas-sidebar[data-active-color=danger] .nav li.active>a[data-toggle=collapse]~div>ul>li.active>a,.off-canvas-sidebar[data-active-color=danger] .nav li.active>a i,.sidebar[data-active-color=danger] .nav li.active>a,.sidebar[data-active-color=danger] .nav li.active>a[data-toggle=collapse],.sidebar[data-active-color=danger] .nav li.active>a[data-toggle=collapse] i,.sidebar[data-active-color=danger] .nav li.active>a[data-toggle=collapse]~div>ul>li.active .sidebar-mini-icon,.sidebar[data-active-color=danger] .nav li.active>a[data-toggle=collapse]~div>ul>li.active>a,.sidebar[data-active-color=danger] .nav li.active>a i{color:#ef8157;opacity:1}.visible-on-sidebar-regular{display:inline-block!important}.visible-on-sidebar-mini{display:none!important}.off-canvas-sidebar .nav>li>a,.off-canvas-sidebar .nav>li>a:hover{color:#fff}.off-canvas-sidebar .nav>li>a:focus{background:hsla(0,0%,78%,.2)}.main-panel{position:relative;float:right;width:calc(100% - 260px);background-color:#f4f3ef;transition:all .5s cubic-bezier(.685,.0473,.346,1)}.main-panel>.content{padding:0 30px 30px;min-height:calc(100vh - 123px);margin-top:93px}.main-panel>.navbar{margin-bottom:0}.main-panel .header{margin-bottom:50px}.perfect-scrollbar-on .main-panel,.perfect-scrollbar-on .sidebar{height:100%;max-height:100%}.panel-header{height:260px;padding-top:80px;padding-bottom:45px;background:#141e30;background:linear-gradient(90deg,#0c2646 0,#204065 60%,#2a5788);position:relative;overflow:hidden}.panel-header .header .title{color:#fff}.panel-header .header .category{max-width:600px;color:hsla(0,0%,100%,.5);margin:0 auto;font-size:13px}.panel-header .header .category a{color:#fff}.panel-header-sm{height:135px}.panel-header-lg{height:380px}.footer{padding:24px 0}.footer.footer-default{background-color:#f2f2f2}.footer nav{display:inline-block;float:left;padding-left:0}.footer ul{margin-bottom:0;padding:0;list-style:none}.footer ul li{display:inline-block}.footer ul li a{color:inherit;padding:.5rem;font-size:.8571em;text-transform:uppercase}.footer ul li a,.footer ul li a:hover{text-decoration:none}.footer .copyright{font-size:.8571em;line-height:1.8}.footer:after{display:table;clear:both;content:" "}.fixed-plugin{position:fixed;right:0;width:64px;background:rgba(0,0,0,.3);z-index:1031;border-radius:8px 0 0 8px;text-align:center;top:120px}.fixed-plugin .badge,.fixed-plugin li>a{transition:all .34s;-webkit-transition:all .34s;-moz-transition:all .34s}.fixed-plugin .fa-cog{color:#fff;padding:10px;border-radius:0 0 6px 6px;width:auto}.fixed-plugin .dropdown-menu{right:80px;left:auto!important;top:-52px!important;width:290px;border-radius:10px;padding:0 10px}.fixed-plugin .dropdown .dropdown-menu .nc-icon{top:2px;right:10px;font-size:14px}.fixed-plugin .dropdown-menu:after,.fixed-plugin .dropdown-menu:before{right:10px;margin-left:auto;left:auto}.fixed-plugin .fa-circle-thin{color:#fff}.fixed-plugin .active .fa-circle-thin{color:#0bf}.fixed-plugin .dropdown-menu>.active>a,.fixed-plugin .dropdown-menu>.active>a:focus,.fixed-plugin .dropdown-menu>.active>a:hover{color:#777;text-align:center}.fixed-plugin img{border-radius:0;width:100%;height:100px;margin:0 auto}.fixed-plugin .dropdown-menu li>a:focus,.fixed-plugin .dropdown-menu li>a:hover{box-shadow:none}.fixed-plugin .badge{border:3px solid #fff;border-radius:50%;cursor:pointer;display:inline-block;height:23px;margin-right:5px;position:relative;width:23px}.fixed-plugin .badge.badge-light{border:1px solid #e3e3e3}.fixed-plugin .badge.badge-light.active,.fixed-plugin .badge.badge-light:hover{border:3px solid #0bf}.fixed-plugin .badge.active,.fixed-plugin .badge:hover{border-color:#0bf}.fixed-plugin .badge-blue{background-color:#51bcda}.fixed-plugin .badge-green{background-color:#6bd098}.fixed-plugin .badge-orange{background-color:#51cbce}.fixed-plugin .badge-yellow{background-color:#fbc658}.fixed-plugin .badge-red{background-color:#ef8157}.fixed-plugin h5{font-size:14px;margin:10px}.fixed-plugin .dropdown-menu li{display:block;padding:15px 2px;width:25%;float:left}.fixed-plugin li.adjustments-line,.fixed-plugin li.button-container,.fixed-plugin li.header-title{width:100%;height:35px;min-height:inherit}.fixed-plugin li.button-container{height:auto}.fixed-plugin li.button-container div{margin-bottom:5px}.fixed-plugin #sharrreTitle{text-align:center;padding:10px 0;height:50px}.fixed-plugin li.header-title{height:30px;line-height:25px;font-size:12px;font-weight:600;text-align:center;text-transform:uppercase}.fixed-plugin .adjustments-line p{float:left;display:inline-block;margin-bottom:0;font-size:1em;color:#3c4858}.fixed-plugin .adjustments-line a{color:transparent}.fixed-plugin .adjustments-line a .badge-colors{position:relative;top:-2px}.fixed-plugin .adjustments-line a a:focus,.fixed-plugin .adjustments-line a a:hover{color:transparent}.fixed-plugin .adjustments-line .togglebutton{text-align:center}.fixed-plugin .adjustments-line .togglebutton .label-switch{position:relative;left:-10px;font-size:.7142em;color:#66615b}.fixed-plugin .adjustments-line .togglebutton .label-switch.label-right{left:10px}.fixed-plugin .adjustments-line .togglebutton .toggle{margin-right:0}.fixed-plugin .adjustments-line .dropdown-menu>li.adjustments-line>a{padding-right:0;padding-left:0;border-bottom:1px solid #ddd;border-radius:0;margin:0}.fixed-plugin .dropdown-menu>li>a.img-holder{font-size:16px;text-align:center;border-radius:10px;background-color:#fff;border:3px solid #fff;padding-left:0;padding-right:0;opacity:1;cursor:pointer;display:block;max-height:100px;overflow:hidden;padding:0}.fixed-plugin .dropdown-menu>li>a.img-holder img{margin-top:auto}.fixed-plugin .dropdown-menu>li>a.switch-trigger:focus,.fixed-plugin .dropdown-menu>li a.switch-trigger:hover{background-color:transparent}.fixed-plugin .dropdown-menu>li:focus>a.img-holder,.fixed-plugin .dropdown-menu>li:hover>a.img-holder{border-color:rgba(0,187,255,.53)}.fixed-plugin .dropdown-menu>.active>a.img-holder{border-color:#0bf;background-color:#fff}.fixed-plugin .btn-social{width:50%;display:block;width:48%;float:left;font-weight:600}.fixed-plugin .btn-social i{margin-right:5px}.fixed-plugin .btn-social:first-child{margin-right:2%}.fixed-plugin .dropdown .dropdown-menu{transform-origin:0 0}.fixed-plugin .dropdown .dropdown-menu:before{border-bottom:16px solid transparent;border-left:16px solid rgba(0,0,0,.2);border-top:16px solid transparent;right:-27px;bottom:425px}.fixed-plugin .dropdown .dropdown-menu:after{border-bottom:16px solid transparent;border-left:16px solid #fff;border-top:16px solid transparent;right:-26px;bottom:425px}.fixed-plugin .dropdown .dropdown-menu:after,.fixed-plugin .dropdown .dropdown-menu:before{content:"";display:inline-block;position:absolute;width:16px;transform:translateY(-50px);-webkit-transform:translateY(-50px);-moz-transform:translateY(-50px)}.fixed-plugin .dropdown.show-dropdown .show .dropdown-menu .show{transform:translate3d(0,-60px,0)!important;bottom:auto!important;top:0!important}.fixed-plugin .bootstrap-switch{margin:0}.fixed-plugin .show-dropdown .dropdown-menu[x-placement=bottom-start]{transform:translate3d(0,-100px,0)!important}.fixed-plugin .show-dropdown .dropdown-menu[x-placement=bottom-start]:after,.fixed-plugin .show-dropdown .dropdown-menu[x-placement=bottom-start]:before{top:100px}.fixed-plugin .show-dropdown .dropdown-menu[x-placement=top-start]{transform:translate3d(0,100px,0)!important}.fixed-plugin .show-dropdown.show .dropdown-menu.show[x-placement=bottom-start]{transform:translate3d(0,-60px,0)!important}.fixed-plugin .show-dropdown.show .dropdown-menu.show[x-placement=top-start]{transform:translate3d(0,470px,0)!important}.card{border-radius:12px;box-shadow:0 6px 10px -4px rgba(0,0,0,.15);background-color:#fff;color:#252422;margin-bottom:20px;position:relative;border:0 none;transition:transform .3s cubic-bezier(.34,2,.6,1),box-shadow .2s ease}.card .card-body{padding:15px 15px 10px}.card .card-body.table-full-width{padding-left:0;padding-right:0}.card .card-header{padding:15px 15px 0;border:0}.card .card-header:not([data-background-color]){background-color:transparent}.card .card-header .card-title{margin-top:10px}.card .map{border-radius:3px}.card .map.map-big{height:400px}.card[data-background-color=orange],.card[data-background-color=orange] .card-header{background-color:#51cbce}.card[data-background-color=orange] .card-footer .stats{color:#fff}.card[data-background-color=red]{background-color:#ef8157}.card[data-background-color=yellow]{background-color:#fbc658}.card[data-background-color=blue]{background-color:#51bcda}.card[data-background-color=green]{background-color:#6bd098}.card .image{overflow:hidden;height:200px;position:relative}.card .avatar{width:30px;height:30px;overflow:hidden;border-radius:50%;margin-bottom:15px}.card .numbers{font-size:2em}.card .big-title{font-size:12px;text-align:center;font-weight:500;padding-bottom:15px}.card label{font-size:.8571em;margin-bottom:5px;color:#9a9a9a}.card .card-footer{background-color:transparent;border:0}.card .card-footer .stats i{margin-right:5px;position:relative;top:0;color:#66615b}.card .card-footer .btn{margin:0}.card.card-plain{background-color:transparent;box-shadow:none;border-radius:0}.card.card-plain .card-body{padding-left:5px;padding-right:5px}.card.card-plain img{border-radius:12px}.card-plain{background:transparent;box-shadow:none}.card-plain .card-footer,.card-plain .card-header{margin-left:0;margin-right:0;background-color:transparent}.card-plain:not(.card-subcategories).card-body{padding-left:0;padding-right:0}.card-chart .card-header .card-title{margin-top:10px;margin-bottom:0}.card-chart .card-header .card-category{margin-bottom:5px}.card-chart .table{margin-bottom:0}.card-chart .table td{border-top:none;border-bottom:1px solid #e9ecef}.card-chart .card-progress{margin-top:30px}.card-chart .chart-area{height:190px;width:calc(100% + 30px);margin-left:-15px;margin-right:-15px}.card-chart .card-footer{margin-top:15px}.card-chart .card-footer .stats{color:#9a9a9a}.card-chart .dropdown{position:absolute;right:20px;top:20px}.card-chart .dropdown .btn{margin:0}.card-user .image{height:130px}.card-user .image img{border-radius:12px}.card-user .author{text-align:center;text-transform:none;margin-top:-77px}.card-user .author a+p.description{margin-top:-7px}.card-user .avatar{width:124px;height:124px;border:1px solid #fff;position:relative}.card-user .card-body{min-height:240px}.card-user hr{margin:5px 15px 15px}.card-user .card-body+.card-footer{padding-top:0}.card-user .card-footer h5{font-size:1.25em;margin-bottom:0}.card-user .button-container{margin-bottom:6px;text-align:center}.map{height:500px}.card-stats .card-body{padding:15px 15px 0}.card-stats .card-body .numbers{text-align:right;font-size:2em}.card-stats .card-body .numbers p{margin-bottom:0}.card-stats .card-body .numbers .card-category{color:#9a9a9a;font-size:16px;line-height:1.4em}.card-stats .card-footer{padding:0 15px 15px}.card-stats .card-footer .stats{color:#9a9a9a}.card-stats .card-footer hr{margin-top:10px;margin-bottom:15px}.card-stats .icon-big{font-size:3em;min-height:64px}.card-stats .icon-big i{line-height:59px}@media screen and (max-width:991px){.navbar{padding:0}.navbar.navbar-absolute{padding-top:0}.navbar .navbar-brand{font-size:16px;margin-right:0}.profile-photo .profile-photo-small{margin-left:-2px}#minimizeSidebar,.button-dropdown{display:none}.navbar .container-fluid{padding-right:15px;padding-left:15px}.navbar .navbar-collapse .input-group{margin:0;margin-top:5px}.navbar .navbar-nav .nav-item:first-child{margin-top:10px}.navbar .navbar-nav .nav-item:not(:last-child){margin-bottom:10px}.navbar .dropdown.show .dropdown-menu{display:block}.navbar .dropdown .dropdown-menu{display:none}.navbar .dropdown .dropdown-menu,.navbar .dropdown.show .dropdown-menu{border:0;transition:none;-webkit-box-shadow:none;width:auto;margin:0 1rem;margin-top:0;box-shadow:none;position:static;padding-left:10px}.navbar .dropdown .dropdown-menu:before,.navbar .dropdown.show .dropdown-menu:before{display:none}.navbar .dropdown-menu .dropdown-item:focus,.navbar .dropdown-menu .dropdown-item:hover{color:#fff}.navbar.bg-white .dropdown-menu .dropdown-item:focus,.navbar.bg-white .dropdown-menu .dropdown-item:hover{color:#66615b}.navbar .navbar-toggler-bar{display:block;position:relative;width:22px;height:1px;border-radius:1px;background:#66615b}.navbar .navbar-toggler-bar+.navbar-toggler-bar{margin-top:7px}.navbar .navbar-toggler-bar+.navbar-toggler-bar.navbar-kebab{margin-top:3px}.navbar .navbar-toggler-bar.bar2{width:17px;transition:width .2s linear}.navbar.bg-white:not(.navbar-transparent) .navbar-toggler-bar{background-color:#66615b}.navbar .toggled .navbar-toggler-bar{width:24px}.navbar .toggled .navbar-toggler-bar+.navbar-toggler-bar{margin-top:5px}.wrapper{transition:all .5s cubic-bezier(.685,.0473,.346,1)}.nav-open .main-panel{right:0;transform:translate3d(260px,0,0)}.nav-open .sidebar{transform:translateZ(0)}.nav-open body{position:relative;overflow-x:hidden}.nav-open .menu-on-right .main-panel{transform:translate3d(-260px,0,0)}.nav-open .menu-on-right .navbar-collapse,.nav-open .menu-on-right .sidebar{transform:translateZ(0)}.nav-open .menu-on-right .navbar-translate{transform:translate3d(-300px,0,0)}.nav-open .menu-on-right #bodyClick{right:260px;left:auto}.menu-on-right .sidebar{left:auto;right:0;transform:translate3d(260px,0,0)}.bar1,.bar2,.bar3{outline:1px solid transparent}.bar1{top:0;animation:h .5s 0s;animation-fill-mode:forwards}.bar2{opacity:1}.bar3{bottom:0;animation:j .5s 0s;animation-fill-mode:forwards}.toggled .bar1{top:6px;animation:g .5s 0s;animation-fill-mode:forwards}.toggled .bar2{opacity:0}.toggled .bar3{bottom:6px;animation:i .5s 0s;animation-fill-mode:forwards}@keyframes g{0%{top:0;transform:rotate(0deg)}45%{top:6px;transform:rotate(145deg)}75%{transform:rotate(130deg)}to{transform:rotate(135deg)}}@keyframes h{0%{top:6px;transform:rotate(135deg)}45%{transform:rotate(-10deg)}75%{transform:rotate(5deg)}to{top:0;transform:rotate(0)}}@keyframes i{0%{bottom:0;transform:rotate(0deg)}45%{bottom:6px;transform:rotate(-145deg)}75%{transform:rotate(-130deg)}to{transform:rotate(-135deg)}}@keyframes j{0%{bottom:6px;transform:rotate(-135deg)}45%{transform:rotate(10deg)}75%{transform:rotate(-5deg)}to{bottom:0;transform:rotate(0)}}#bodyClick{height:100%;width:100%;position:fixed;opacity:1;top:0;right:0;left:260px;content:"";z-index:9999;overflow-x:hidden;background-color:transparent;transition:all .5s cubic-bezier(.685,.0473,.346,1)}.footer .copyright{text-align:right}.section-nucleo-icons .icons-container{margin-top:65px}.navbar-nav .nav-link i.fa,.navbar-nav .nav-link i.nc-icon{opacity:.5}.bootstrap-navbar,.sidebar{position:fixed;display:block;top:0;height:100%;width:260px;right:auto;left:0;z-index:1032;visibility:visible;overflow-y:visible;padding:0;transition:all .5s cubic-bezier(.685,.0473,.346,1);transform:translate3d(-260px,0,0)}.main-panel{width:100%}.timeline:before,.timeline>li>.timeline-badge{left:5%!important}.timeline>li>.timeline-panel{float:right!important;width:82%!important}.timeline>li>.timeline-panel:before{border-left-width:0!important;border-right-width:15px!important;left:-15px!important;right:auto!important}.timeline>li>.timeline-panel:after{border-left-width:0!important;border-right-width:14px!important;left:-14px!important;right:auto!important}}@media (max-width:991px) and (min-width:768px){.nav-tabs-navigation.verical-navs{padding:0 2px}}@media screen and (min-width:768px){.footer .footer-nav{padding-left:21px}.footer .credits{padding-right:15px}}@media screen and (min-width:992px){.navbar-collapse{background:none!important}.navbar .navbar-toggle{display:none}.navbar-nav .nav-link.profile-photo{padding:0;margin:7px .7rem}.section-nucleo-icons .icons-container{margin:0 0 0 auto}.dropdown-menu .dropdown-item{color:inherit}.footer .copyright{float:right;padding-right:15px}.sidebar .sidebar-wrapper li.active>[data-toggle=collapse]+div .nav li:before,.sidebar .sidebar-wrapper li.active>a:not([data-toggle=collapse]):before{border-right:17px solid #ddd;border-top:17px solid transparent;border-bottom:17px solid transparent;content:"";display:inline-block;position:absolute;right:-16px;opacity:1;top:7px;transition:opacity .15s ease-in}.sidebar .sidebar-wrapper li.active>[data-toggle=collapse]+div .nav li:after,.sidebar .sidebar-wrapper li.active>a:not([data-toggle=collapse]):after{border-right:17px solid #f4f3ef;border-top:17px solid transparent;border-bottom:17px solid transparent;content:"";display:inline-block;position:absolute;right:-17px;opacity:1;top:7px;transition:opacity .15s ease-in}.sidebar .sidebar-wrapper li.active>[data-toggle=collapse]+div .nav li a:after,.sidebar .sidebar-wrapper li.active>[data-toggle=collapse]+div .nav li a:before{top:0}}@media screen and (max-width:768px){.card-stats [class*=col-] .statistics:after{display:none}.main-panel .content{padding-left:15px;padding-right:15px}.footer nav{display:block;margin-bottom:5px;float:none}.landing-page .section-story-overview .image-container:nth-child(2){margin-left:0;margin-bottom:30px}.card .form-horizontal .col-md-3.col-form-label{text-align:left}}@media screen and (max-width:767px){.nav-tabs-navigation.verical-navs{padding:0 28px}.typography-line{padding-left:23%!important}.typography-line span{width:60px!important}.lock-page .navbar,.login-page .navbar,.register-page .navbar{padding:.5rem 1rem}.footer .credits,.footer .footer-nav{margin:0 auto!important}.footer .footer-nav{margin-bottom:10px!important}.register-page .content{padding-top:5vh}.register-page .footer{position:relative}.register-page .info-area.info-horizontal{margin-top:0}}@media screen and (max-width:374px){.login-page .content{padding-top:10vh}}@media screen and (max-width:413px){.fixed-plugin .dropdown.show-dropdown.show .dropdown-menu.show{width:225px!important}.fixed-plugin .dropdown.show-dropdown.show .dropdown-menu.show[x-placement=top-start]{transform:translate3d(0,400px,0)!important}.fixed-plugin .dropdown.show-dropdown.show .dropdown-menu.show:after,.fixed-plugin .dropdown.show-dropdown.show .dropdown-menu.show:before{bottom:360px!important}}@media screen and (max-width:576px){.navbar[class*=navbar-toggleable-] .container{margin-left:0;margin-right:0}.card-contributions .card-stats{flex-direction:column}.card-contributions .card-stats .bootstrap-switch{margin-bottom:15px}.footer .copyright{text-align:center}.section-nucleo-icons .icons-container i{font-size:30px}.section-nucleo-icons .icons-container i:nth-child(6){font-size:48px}.page-header .container h6.category-absolute{width:90%}.card-timeline .timeline .timeline-panel{width:38%;padding:15px}} \ No newline at end of file diff --git a/explorer/public/paper-dashboard/assets/demo/demo.css b/explorer/public/paper-dashboard/assets/demo/demo.css new file mode 100644 index 00000000000..b550075b8dd --- /dev/null +++ b/explorer/public/paper-dashboard/assets/demo/demo.css @@ -0,0 +1,189 @@ +.tim-row { + margin-bottom: 20px; +} + +.tim-white-buttons { + background-color: #777777; +} + +.typography-line { + padding-left: 25%; + margin-bottom: 35px; + position: relative; + display: block; + width: 100%; +} + +.typography-line span { + bottom: 10px; + color: #c0c1c2; + display: block; + font-weight: 400; + font-size: 13px; + line-height: 13px; + left: 0; + position: absolute; + width: 260px; + text-transform: none; +} + +.tim-row { + padding-top: 60px; +} + +.tim-row h3 { + margin-top: 0; +} + +.offline-doc .page-header { + display: flex; + align-items: center; +} + +.offline-doc .footer { + position: absolute; + width: 100%; + background: transparent; + bottom: 0; + color: #fff; + z-index: 1; +} + +@media all and (min-width: 992px) { + .sidebar .nav>li.active-pro { + position: absolute; + width: 100%; + bottom: 10px; + } +} + +.card.card-upgrade .card-category { + max-width: 530px; + margin: 0 auto; +} + +/* Nucleo Style */ + +.demo-iconshtml { + font-size: 62.5%; +} + +.demo-icons body { + font-size: 1.6rem; + font-family: sans-serif; + color: #333333; + background: white; +} + +.demo-icons a { + color: #608CEE; + text-decoration: none; +} + +.demo-icons header { + text-align: center; + padding: 100px 0 0; +} + +.demo-icons header h1 { + font-size: 2.8rem; +} + +.demo-icons header p { + font-size: 1.4rem; + margin-top: 1em; +} + +.demo-icons header a:hover { + text-decoration: underline; +} + +.demo-icons .nc-icon { + font-size: 34px; +} + +.demo-icons section h2 { + border-bottom: 1px solid #e2e2e2; + padding: 0 0 1em .2em; + margin-bottom: 1em; +} + +.demo-icons ul { + padding-left: 0; +} + +.demo-icons ul::after { + clear: both; + content: ""; + display: table; +} + +.demo-icons ul li { + width: 20%; + float: left; + padding: 16px 0; + text-align: center; + border-radius: .25em; + -webkit-transition: background 0.2s; + -moz-transition: background 0.2s; + transition: background 0.2s; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + overflow: hidden; +} + +.demo-icons ul li:hover { + background: #f4f4f4; +} + +.demo-icons ul p, +.demo-icons ul em, +.demo-icons ul input { + display: inline-block; + font-size: 1rem; + color: #999999; + -webkit-user-select: auto; + -moz-user-select: auto; + -ms-user-select: auto; + user-select: auto; + white-space: nowrap; + width: 100%; + overflow: hidden; + text-overflow: ellipsis; + cursor: pointer; +} + +.demo-icons ul p { + padding: 20px 0 0; + font-size: 12px; + margin: 0; +} + +.demo-icons ul p::selection, +.demo-icons ul em::selection { + background: #608CEE; + color: #efefef; +} + +.demo-icons ul em { + font-size: 12px; +} + +.demo-icons ul em::before { + content: '['; +} + +.demo-icons ul em::after { + content: ']'; +} + +.demo-icons ul input { + text-align: center; + background: transparent; + border: none; + box-shadow: none; + outline: none; + display: none; +} \ No newline at end of file diff --git a/explorer/public/paper-dashboard/assets/demo/demo.js b/explorer/public/paper-dashboard/assets/demo/demo.js new file mode 100644 index 00000000000..ae21bd1f447 --- /dev/null +++ b/explorer/public/paper-dashboard/assets/demo/demo.js @@ -0,0 +1,408 @@ +demo = { + initPickColor: function() { + $('.pick-class-label').click(function() { + var new_class = $(this).attr('new-class'); + var old_class = $('#display-buttons').attr('data-class'); + var display_div = $('#display-buttons'); + if (display_div.length) { + var display_buttons = display_div.find('.btn'); + display_buttons.removeClass(old_class); + display_buttons.addClass(new_class); + display_div.attr('data-class', new_class); + } + }); + }, + + initDocChart: function() { + chartColor = "#FFFFFF"; + + ctx = document.getElementById('chartHours').getContext("2d"); + + myChart = new Chart(ctx, { + type: 'line', + + data: { + labels: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct"], + datasets: [{ + borderColor: "#6bd098", + backgroundColor: "#6bd098", + pointRadius: 0, + pointHoverRadius: 0, + borderWidth: 3, + data: [300, 310, 316, 322, 330, 326, 333, 345, 338, 354] + }, + { + borderColor: "#f17e5d", + backgroundColor: "#f17e5d", + pointRadius: 0, + pointHoverRadius: 0, + borderWidth: 3, + data: [320, 340, 365, 360, 370, 385, 390, 384, 408, 420] + }, + { + borderColor: "#fcc468", + backgroundColor: "#fcc468", + pointRadius: 0, + pointHoverRadius: 0, + borderWidth: 3, + data: [370, 394, 415, 409, 425, 445, 460, 450, 478, 484] + } + ] + }, + options: { + legend: { + display: false + }, + + tooltips: { + enabled: false + }, + + scales: { + yAxes: [{ + + ticks: { + fontColor: "#9f9f9f", + beginAtZero: false, + maxTicksLimit: 5, + //padding: 20 + }, + gridLines: { + drawBorder: false, + zeroLineColor: "#ccc", + color: 'rgba(255,255,255,0.05)' + } + + }], + + xAxes: [{ + barPercentage: 1.6, + gridLines: { + drawBorder: false, + color: 'rgba(255,255,255,0.1)', + zeroLineColor: "transparent", + display: false, + }, + ticks: { + padding: 20, + fontColor: "#9f9f9f" + } + }] + }, + } + }); + + }, + + initChartsPages: function() { + chartColor = "#FFFFFF"; + + ctx = document.getElementById('chartHours').getContext("2d"); + + myChart = new Chart(ctx, { + type: 'line', + + data: { + labels: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct"], + datasets: [{ + borderColor: "#6bd098", + backgroundColor: "#6bd098", + pointRadius: 0, + pointHoverRadius: 0, + borderWidth: 3, + data: [300, 310, 316, 322, 330, 326, 333, 345, 338, 354] + }, + { + borderColor: "#f17e5d", + backgroundColor: "#f17e5d", + pointRadius: 0, + pointHoverRadius: 0, + borderWidth: 3, + data: [320, 340, 365, 360, 370, 385, 390, 384, 408, 420] + }, + { + borderColor: "#fcc468", + backgroundColor: "#fcc468", + pointRadius: 0, + pointHoverRadius: 0, + borderWidth: 3, + data: [370, 394, 415, 409, 425, 445, 460, 450, 478, 484] + } + ] + }, + options: { + legend: { + display: false + }, + + tooltips: { + enabled: false + }, + + scales: { + yAxes: [{ + + ticks: { + fontColor: "#9f9f9f", + beginAtZero: false, + maxTicksLimit: 5, + //padding: 20 + }, + gridLines: { + drawBorder: false, + zeroLineColor: "#ccc", + color: 'rgba(255,255,255,0.05)' + } + + }], + + xAxes: [{ + barPercentage: 1.6, + gridLines: { + drawBorder: false, + color: 'rgba(255,255,255,0.1)', + zeroLineColor: "transparent", + display: false, + }, + ticks: { + padding: 20, + fontColor: "#9f9f9f" + } + }] + }, + } + }); + + + ctx = document.getElementById('chartEmail').getContext("2d"); + + myChart = new Chart(ctx, { + type: 'pie', + data: { + labels: [1, 2, 3], + datasets: [{ + label: "Emails", + pointRadius: 0, + pointHoverRadius: 0, + backgroundColor: [ + '#e3e3e3', + '#4acccd', + '#fcc468', + '#ef8157' + ], + borderWidth: 0, + data: [342, 480, 530, 120] + }] + }, + + options: { + + legend: { + display: false + }, + + pieceLabel: { + render: 'percentage', + fontColor: ['white'], + precision: 2 + }, + + tooltips: { + enabled: false + }, + + scales: { + yAxes: [{ + + ticks: { + display: false + }, + gridLines: { + drawBorder: false, + zeroLineColor: "transparent", + color: 'rgba(255,255,255,0.05)' + } + + }], + + xAxes: [{ + barPercentage: 1.6, + gridLines: { + drawBorder: false, + color: 'rgba(255,255,255,0.1)', + zeroLineColor: "transparent" + }, + ticks: { + display: false, + } + }] + }, + } + }); + + var speedCanvas = document.getElementById("speedChart"); + + var dataFirst = { + data: [0, 19, 15, 20, 30, 40, 40, 50, 25, 30, 50, 70], + fill: false, + borderColor: '#fbc658', + backgroundColor: 'transparent', + pointBorderColor: '#fbc658', + pointRadius: 4, + pointHoverRadius: 4, + pointBorderWidth: 8, + }; + + var dataSecond = { + data: [0, 5, 10, 12, 20, 27, 30, 34, 42, 45, 55, 63], + fill: false, + borderColor: '#51CACF', + backgroundColor: 'transparent', + pointBorderColor: '#51CACF', + pointRadius: 4, + pointHoverRadius: 4, + pointBorderWidth: 8 + }; + + var speedData = { + labels: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], + datasets: [dataFirst, dataSecond] + }; + + var chartOptions = { + legend: { + display: false, + position: 'top' + } + }; + + var lineChart = new Chart(speedCanvas, { + type: 'line', + hover: false, + data: speedData, + options: chartOptions + }); + }, + + initGoogleMaps: function() { + var myLatlng = new google.maps.LatLng(40.748817, -73.985428); + var mapOptions = { + zoom: 13, + center: myLatlng, + scrollwheel: false, //we disable de scroll over the map, it is a really annoing when you scroll through page + styles: [{ + "featureType": "water", + "stylers": [{ + "saturation": 43 + }, { + "lightness": -11 + }, { + "hue": "#0088ff" + }] + }, { + "featureType": "road", + "elementType": "geometry.fill", + "stylers": [{ + "hue": "#ff0000" + }, { + "saturation": -100 + }, { + "lightness": 99 + }] + }, { + "featureType": "road", + "elementType": "geometry.stroke", + "stylers": [{ + "color": "#808080" + }, { + "lightness": 54 + }] + }, { + "featureType": "landscape.man_made", + "elementType": "geometry.fill", + "stylers": [{ + "color": "#ece2d9" + }] + }, { + "featureType": "poi.park", + "elementType": "geometry.fill", + "stylers": [{ + "color": "#ccdca1" + }] + }, { + "featureType": "road", + "elementType": "labels.text.fill", + "stylers": [{ + "color": "#767676" + }] + }, { + "featureType": "road", + "elementType": "labels.text.stroke", + "stylers": [{ + "color": "#ffffff" + }] + }, { + "featureType": "poi", + "stylers": [{ + "visibility": "off" + }] + }, { + "featureType": "landscape.natural", + "elementType": "geometry.fill", + "stylers": [{ + "visibility": "on" + }, { + "color": "#b8cb93" + }] + }, { + "featureType": "poi.park", + "stylers": [{ + "visibility": "on" + }] + }, { + "featureType": "poi.sports_complex", + "stylers": [{ + "visibility": "on" + }] + }, { + "featureType": "poi.medical", + "stylers": [{ + "visibility": "on" + }] + }, { + "featureType": "poi.business", + "stylers": [{ + "visibility": "simplified" + }] + }] + + } + var map = new google.maps.Map(document.getElementById("map"), mapOptions); + + var marker = new google.maps.Marker({ + position: myLatlng, + title: "Hello World!" + }); + + // To add the marker to the map, call setMap(); + marker.setMap(map); + }, + + showNotification: function(from, align) { + color = 'primary'; + + $.notify({ + icon: "nc-icon nc-bell-55", + message: "Welcome to <b>Paper Dashboard</b> - a beautiful bootstrap dashboard for every web developer." + + }, { + type: color, + timer: 8000, + placement: { + from: from, + align: align + } + }); + } + +}; \ No newline at end of file diff --git a/explorer/public/paper-dashboard/assets/fonts/nucleo-icons.eot b/explorer/public/paper-dashboard/assets/fonts/nucleo-icons.eot new file mode 100644 index 00000000000..390eb0cf059 Binary files /dev/null and b/explorer/public/paper-dashboard/assets/fonts/nucleo-icons.eot differ diff --git a/explorer/public/paper-dashboard/assets/fonts/nucleo-icons.ttf b/explorer/public/paper-dashboard/assets/fonts/nucleo-icons.ttf new file mode 100644 index 00000000000..20645242a29 Binary files /dev/null and b/explorer/public/paper-dashboard/assets/fonts/nucleo-icons.ttf differ diff --git a/explorer/public/paper-dashboard/assets/fonts/nucleo-icons.woff b/explorer/public/paper-dashboard/assets/fonts/nucleo-icons.woff new file mode 100644 index 00000000000..e9e2e51de26 Binary files /dev/null and b/explorer/public/paper-dashboard/assets/fonts/nucleo-icons.woff differ diff --git a/explorer/public/paper-dashboard/assets/fonts/nucleo-icons.woff2 b/explorer/public/paper-dashboard/assets/fonts/nucleo-icons.woff2 new file mode 100644 index 00000000000..b69037cba27 Binary files /dev/null and b/explorer/public/paper-dashboard/assets/fonts/nucleo-icons.woff2 differ diff --git a/explorer/public/paper-dashboard/assets/img/apple-icon.png b/explorer/public/paper-dashboard/assets/img/apple-icon.png new file mode 100644 index 00000000000..a20470fac33 Binary files /dev/null and b/explorer/public/paper-dashboard/assets/img/apple-icon.png differ diff --git a/explorer/public/paper-dashboard/assets/img/bg5.jpg b/explorer/public/paper-dashboard/assets/img/bg5.jpg new file mode 100644 index 00000000000..423e8889123 Binary files /dev/null and b/explorer/public/paper-dashboard/assets/img/bg5.jpg differ diff --git a/explorer/public/paper-dashboard/assets/img/damir-bosnjak.jpg b/explorer/public/paper-dashboard/assets/img/damir-bosnjak.jpg new file mode 100644 index 00000000000..529f7dc344d Binary files /dev/null and b/explorer/public/paper-dashboard/assets/img/damir-bosnjak.jpg differ diff --git a/explorer/public/paper-dashboard/assets/img/default-avatar.png b/explorer/public/paper-dashboard/assets/img/default-avatar.png new file mode 100644 index 00000000000..ca9fa88471a Binary files /dev/null and b/explorer/public/paper-dashboard/assets/img/default-avatar.png differ diff --git a/explorer/public/paper-dashboard/assets/img/faces/ayo-ogunseinde-1.jpg b/explorer/public/paper-dashboard/assets/img/faces/ayo-ogunseinde-1.jpg new file mode 100644 index 00000000000..318ca16db52 Binary files /dev/null and b/explorer/public/paper-dashboard/assets/img/faces/ayo-ogunseinde-1.jpg differ diff --git a/explorer/public/paper-dashboard/assets/img/faces/ayo-ogunseinde-2.jpg b/explorer/public/paper-dashboard/assets/img/faces/ayo-ogunseinde-2.jpg new file mode 100644 index 00000000000..6a599dfaf8d Binary files /dev/null and b/explorer/public/paper-dashboard/assets/img/faces/ayo-ogunseinde-2.jpg differ diff --git a/explorer/public/paper-dashboard/assets/img/faces/clem-onojeghuo-1.jpg b/explorer/public/paper-dashboard/assets/img/faces/clem-onojeghuo-1.jpg new file mode 100644 index 00000000000..8c94935005c Binary files /dev/null and b/explorer/public/paper-dashboard/assets/img/faces/clem-onojeghuo-1.jpg differ diff --git a/explorer/public/paper-dashboard/assets/img/faces/clem-onojeghuo-2.jpg b/explorer/public/paper-dashboard/assets/img/faces/clem-onojeghuo-2.jpg new file mode 100644 index 00000000000..fe6dde7a534 Binary files /dev/null and b/explorer/public/paper-dashboard/assets/img/faces/clem-onojeghuo-2.jpg differ diff --git a/explorer/public/paper-dashboard/assets/img/faces/clem-onojeghuo-3.jpg b/explorer/public/paper-dashboard/assets/img/faces/clem-onojeghuo-3.jpg new file mode 100644 index 00000000000..269404391e0 Binary files /dev/null and b/explorer/public/paper-dashboard/assets/img/faces/clem-onojeghuo-3.jpg differ diff --git a/explorer/public/paper-dashboard/assets/img/faces/clem-onojeghuo-4.jpg b/explorer/public/paper-dashboard/assets/img/faces/clem-onojeghuo-4.jpg new file mode 100644 index 00000000000..b9c80dc691d Binary files /dev/null and b/explorer/public/paper-dashboard/assets/img/faces/clem-onojeghuo-4.jpg differ diff --git a/explorer/public/paper-dashboard/assets/img/faces/erik-lucatero-1.jpg b/explorer/public/paper-dashboard/assets/img/faces/erik-lucatero-1.jpg new file mode 100644 index 00000000000..e5316a1a737 Binary files /dev/null and b/explorer/public/paper-dashboard/assets/img/faces/erik-lucatero-1.jpg differ diff --git a/explorer/public/paper-dashboard/assets/img/faces/erik-lucatero-2.jpg b/explorer/public/paper-dashboard/assets/img/faces/erik-lucatero-2.jpg new file mode 100644 index 00000000000..41c29788ed4 Binary files /dev/null and b/explorer/public/paper-dashboard/assets/img/faces/erik-lucatero-2.jpg differ diff --git a/explorer/public/paper-dashboard/assets/img/faces/joe-gardner-1.jpg b/explorer/public/paper-dashboard/assets/img/faces/joe-gardner-1.jpg new file mode 100644 index 00000000000..71d8406cf69 Binary files /dev/null and b/explorer/public/paper-dashboard/assets/img/faces/joe-gardner-1.jpg differ diff --git a/explorer/public/paper-dashboard/assets/img/faces/joe-gardner-2.jpg b/explorer/public/paper-dashboard/assets/img/faces/joe-gardner-2.jpg new file mode 100644 index 00000000000..433f4983398 Binary files /dev/null and b/explorer/public/paper-dashboard/assets/img/faces/joe-gardner-2.jpg differ diff --git a/explorer/public/paper-dashboard/assets/img/faces/kaci-baum-1.jpg b/explorer/public/paper-dashboard/assets/img/faces/kaci-baum-1.jpg new file mode 100644 index 00000000000..2f7171f069e Binary files /dev/null and b/explorer/public/paper-dashboard/assets/img/faces/kaci-baum-1.jpg differ diff --git a/explorer/public/paper-dashboard/assets/img/faces/kaci-baum-2.jpg b/explorer/public/paper-dashboard/assets/img/faces/kaci-baum-2.jpg new file mode 100644 index 00000000000..e7a87975a32 Binary files /dev/null and b/explorer/public/paper-dashboard/assets/img/faces/kaci-baum-2.jpg differ diff --git a/explorer/public/paper-dashboard/assets/img/favicon.png b/explorer/public/paper-dashboard/assets/img/favicon.png new file mode 100644 index 00000000000..7d8b7d07221 Binary files /dev/null and b/explorer/public/paper-dashboard/assets/img/favicon.png differ diff --git a/explorer/public/paper-dashboard/assets/img/header.jpg b/explorer/public/paper-dashboard/assets/img/header.jpg new file mode 100644 index 00000000000..f98e2387745 Binary files /dev/null and b/explorer/public/paper-dashboard/assets/img/header.jpg differ diff --git a/explorer/public/paper-dashboard/assets/img/jan-sendereks.jpg b/explorer/public/paper-dashboard/assets/img/jan-sendereks.jpg new file mode 100644 index 00000000000..5bb73867c21 Binary files /dev/null and b/explorer/public/paper-dashboard/assets/img/jan-sendereks.jpg differ diff --git a/explorer/public/paper-dashboard/assets/img/logo-small.png b/explorer/public/paper-dashboard/assets/img/logo-small.png new file mode 100644 index 00000000000..1860ee498d0 Binary files /dev/null and b/explorer/public/paper-dashboard/assets/img/logo-small.png differ diff --git a/explorer/public/paper-dashboard/assets/img/mike.jpg b/explorer/public/paper-dashboard/assets/img/mike.jpg new file mode 100644 index 00000000000..cac7d3a1747 Binary files /dev/null and b/explorer/public/paper-dashboard/assets/img/mike.jpg differ diff --git a/explorer/public/paper-dashboard/assets/js/core/bootstrap.min.js b/explorer/public/paper-dashboard/assets/js/core/bootstrap.min.js new file mode 100644 index 00000000000..cd3cce6cda4 --- /dev/null +++ b/explorer/public/paper-dashboard/assets/js/core/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v4.1.1 (https://getbootstrap.com/) + * Copyright 2011-2018 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e(t.bootstrap={},t.jQuery,t.Popper)}(this,function(t,e,c){"use strict";function i(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function o(t,e,n){return e&&i(t.prototype,e),n&&i(t,n),t}function h(r){for(var t=1;t<arguments.length;t++){var s=null!=arguments[t]?arguments[t]:{},e=Object.keys(s);"function"==typeof Object.getOwnPropertySymbols&&(e=e.concat(Object.getOwnPropertySymbols(s).filter(function(t){return Object.getOwnPropertyDescriptor(s,t).enumerable}))),e.forEach(function(t){var e,n,i;e=r,i=s[n=t],n in e?Object.defineProperty(e,n,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[n]=i})}return r}e=e&&e.hasOwnProperty("default")?e.default:e,c=c&&c.hasOwnProperty("default")?c.default:c;var r,n,s,a,l,u,f,d,_,g,m,p,v,E,y,T,C,I,A,D,b,S,w,N,O,k,P,L,j,R,H,W,M,x,U,K,F,V,Q,B,Y,G,q,z,X,J,Z,$,tt,et,nt,it,rt,st,ot,at,lt,ht,ct,ut,ft,dt,_t,gt,mt,pt,vt,Et,yt,Tt,Ct,It,At,Dt,bt,St,wt,Nt,Ot,kt,Pt,Lt,jt,Rt,Ht,Wt,Mt,xt,Ut,Kt,Ft,Vt,Qt,Bt,Yt,Gt,qt,zt,Xt,Jt,Zt,$t,te,ee,ne,ie,re,se,oe,ae,le,he,ce,ue,fe,de,_e,ge,me,pe,ve,Ee,ye,Te,Ce,Ie,Ae,De,be,Se,we,Ne,Oe,ke,Pe,Le,je,Re,He,We,Me,xe,Ue,Ke,Fe,Ve,Qe,Be,Ye,Ge,qe,ze,Xe,Je,Ze,$e,tn,en,nn,rn,sn,on,an,ln,hn,cn,un,fn,dn,_n,gn,mn,pn,vn,En,yn,Tn,Cn=function(i){var e="transitionend";function t(t){var e=this,n=!1;return i(this).one(l.TRANSITION_END,function(){n=!0}),setTimeout(function(){n||l.triggerTransitionEnd(e)},t),this}var l={TRANSITION_END:"bsTransitionEnd",getUID:function(t){for(;t+=~~(1e6*Math.random()),document.getElementById(t););return t},getSelectorFromElement:function(t){var e=t.getAttribute("data-target");e&&"#"!==e||(e=t.getAttribute("href")||"");try{return 0<i(document).find(e).length?e:null}catch(t){return null}},getTransitionDurationFromElement:function(t){if(!t)return 0;var e=i(t).css("transition-duration");return parseFloat(e)?(e=e.split(",")[0],1e3*parseFloat(e)):0},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(t){i(t).trigger(e)},supportsTransitionEnd:function(){return Boolean(e)},isElement:function(t){return(t[0]||t).nodeType},typeCheckConfig:function(t,e,n){for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i)){var r=n[i],s=e[i],o=s&&l.isElement(s)?"element":(a=s,{}.toString.call(a).match(/\s([a-z]+)/i)[1].toLowerCase());if(!new RegExp(r).test(o))throw new Error(t.toUpperCase()+': Option "'+i+'" provided type "'+o+'" but expected type "'+r+'".')}var a}};return i.fn.emulateTransitionEnd=t,i.event.special[l.TRANSITION_END]={bindType:e,delegateType:e,handle:function(t){if(i(t.target).is(this))return t.handleObj.handler.apply(this,arguments)}},l}(e),In=(n="alert",a="."+(s="bs.alert"),l=(r=e).fn[n],u={CLOSE:"close"+a,CLOSED:"closed"+a,CLICK_DATA_API:"click"+a+".data-api"},f="alert",d="fade",_="show",g=function(){function i(t){this._element=t}var t=i.prototype;return t.close=function(t){var e=this._element;t&&(e=this._getRootElement(t)),this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},t.dispose=function(){r.removeData(this._element,s),this._element=null},t._getRootElement=function(t){var e=Cn.getSelectorFromElement(t),n=!1;return e&&(n=r(e)[0]),n||(n=r(t).closest("."+f)[0]),n},t._triggerCloseEvent=function(t){var e=r.Event(u.CLOSE);return r(t).trigger(e),e},t._removeElement=function(e){var n=this;if(r(e).removeClass(_),r(e).hasClass(d)){var t=Cn.getTransitionDurationFromElement(e);r(e).one(Cn.TRANSITION_END,function(t){return n._destroyElement(e,t)}).emulateTransitionEnd(t)}else this._destroyElement(e)},t._destroyElement=function(t){r(t).detach().trigger(u.CLOSED).remove()},i._jQueryInterface=function(n){return this.each(function(){var t=r(this),e=t.data(s);e||(e=new i(this),t.data(s,e)),"close"===n&&e[n](this)})},i._handleDismiss=function(e){return function(t){t&&t.preventDefault(),e.close(this)}},o(i,null,[{key:"VERSION",get:function(){return"4.1.1"}}]),i}(),r(document).on(u.CLICK_DATA_API,'[data-dismiss="alert"]',g._handleDismiss(new g)),r.fn[n]=g._jQueryInterface,r.fn[n].Constructor=g,r.fn[n].noConflict=function(){return r.fn[n]=l,g._jQueryInterface},g),An=(p="button",E="."+(v="bs.button"),y=".data-api",T=(m=e).fn[p],C="active",I="btn",D='[data-toggle^="button"]',b='[data-toggle="buttons"]',S="input",w=".active",N=".btn",O={CLICK_DATA_API:"click"+E+y,FOCUS_BLUR_DATA_API:(A="focus")+E+y+" blur"+E+y},k=function(){function n(t){this._element=t}var t=n.prototype;return t.toggle=function(){var t=!0,e=!0,n=m(this._element).closest(b)[0];if(n){var i=m(this._element).find(S)[0];if(i){if("radio"===i.type)if(i.checked&&m(this._element).hasClass(C))t=!1;else{var r=m(n).find(w)[0];r&&m(r).removeClass(C)}if(t){if(i.hasAttribute("disabled")||n.hasAttribute("disabled")||i.classList.contains("disabled")||n.classList.contains("disabled"))return;i.checked=!m(this._element).hasClass(C),m(i).trigger("change")}i.focus(),e=!1}}e&&this._element.setAttribute("aria-pressed",!m(this._element).hasClass(C)),t&&m(this._element).toggleClass(C)},t.dispose=function(){m.removeData(this._element,v),this._element=null},n._jQueryInterface=function(e){return this.each(function(){var t=m(this).data(v);t||(t=new n(this),m(this).data(v,t)),"toggle"===e&&t[e]()})},o(n,null,[{key:"VERSION",get:function(){return"4.1.1"}}]),n}(),m(document).on(O.CLICK_DATA_API,D,function(t){t.preventDefault();var e=t.target;m(e).hasClass(I)||(e=m(e).closest(N)),k._jQueryInterface.call(m(e),"toggle")}).on(O.FOCUS_BLUR_DATA_API,D,function(t){var e=m(t.target).closest(N)[0];m(e).toggleClass(A,/^focus(in)?$/.test(t.type))}),m.fn[p]=k._jQueryInterface,m.fn[p].Constructor=k,m.fn[p].noConflict=function(){return m.fn[p]=T,k._jQueryInterface},k),Dn=(L="carousel",R="."+(j="bs.carousel"),H=".data-api",W=(P=e).fn[L],M={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0},x={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean"},U="next",K="prev",F="left",V="right",Q={SLIDE:"slide"+R,SLID:"slid"+R,KEYDOWN:"keydown"+R,MOUSEENTER:"mouseenter"+R,MOUSELEAVE:"mouseleave"+R,TOUCHEND:"touchend"+R,LOAD_DATA_API:"load"+R+H,CLICK_DATA_API:"click"+R+H},B="carousel",Y="active",G="slide",q="carousel-item-right",z="carousel-item-left",X="carousel-item-next",J="carousel-item-prev",Z={ACTIVE:".active",ACTIVE_ITEM:".active.carousel-item",ITEM:".carousel-item",NEXT_PREV:".carousel-item-next, .carousel-item-prev",INDICATORS:".carousel-indicators",DATA_SLIDE:"[data-slide], [data-slide-to]",DATA_RIDE:'[data-ride="carousel"]'},$=function(){function s(t,e){this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this._config=this._getConfig(e),this._element=P(t)[0],this._indicatorsElement=P(this._element).find(Z.INDICATORS)[0],this._addEventListeners()}var t=s.prototype;return t.next=function(){this._isSliding||this._slide(U)},t.nextWhenVisible=function(){!document.hidden&&P(this._element).is(":visible")&&"hidden"!==P(this._element).css("visibility")&&this.next()},t.prev=function(){this._isSliding||this._slide(K)},t.pause=function(t){t||(this._isPaused=!0),P(this._element).find(Z.NEXT_PREV)[0]&&(Cn.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},t.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},t.to=function(t){var e=this;this._activeElement=P(this._element).find(Z.ACTIVE_ITEM)[0];var n=this._getItemIndex(this._activeElement);if(!(t>this._items.length-1||t<0))if(this._isSliding)P(this._element).one(Q.SLID,function(){return e.to(t)});else{if(n===t)return this.pause(),void this.cycle();var i=n<t?U:K;this._slide(i,this._items[t])}},t.dispose=function(){P(this._element).off(R),P.removeData(this._element,j),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},t._getConfig=function(t){return t=h({},M,t),Cn.typeCheckConfig(L,t,x),t},t._addEventListeners=function(){var e=this;this._config.keyboard&&P(this._element).on(Q.KEYDOWN,function(t){return e._keydown(t)}),"hover"===this._config.pause&&(P(this._element).on(Q.MOUSEENTER,function(t){return e.pause(t)}).on(Q.MOUSELEAVE,function(t){return e.cycle(t)}),"ontouchstart"in document.documentElement&&P(this._element).on(Q.TOUCHEND,function(){e.pause(),e.touchTimeout&&clearTimeout(e.touchTimeout),e.touchTimeout=setTimeout(function(t){return e.cycle(t)},500+e._config.interval)}))},t._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next()}},t._getItemIndex=function(t){return this._items=P.makeArray(P(t).parent().find(Z.ITEM)),this._items.indexOf(t)},t._getItemByDirection=function(t,e){var n=t===U,i=t===K,r=this._getItemIndex(e),s=this._items.length-1;if((i&&0===r||n&&r===s)&&!this._config.wrap)return e;var o=(r+(t===K?-1:1))%this._items.length;return-1===o?this._items[this._items.length-1]:this._items[o]},t._triggerSlideEvent=function(t,e){var n=this._getItemIndex(t),i=this._getItemIndex(P(this._element).find(Z.ACTIVE_ITEM)[0]),r=P.Event(Q.SLIDE,{relatedTarget:t,direction:e,from:i,to:n});return P(this._element).trigger(r),r},t._setActiveIndicatorElement=function(t){if(this._indicatorsElement){P(this._indicatorsElement).find(Z.ACTIVE).removeClass(Y);var e=this._indicatorsElement.children[this._getItemIndex(t)];e&&P(e).addClass(Y)}},t._slide=function(t,e){var n,i,r,s=this,o=P(this._element).find(Z.ACTIVE_ITEM)[0],a=this._getItemIndex(o),l=e||o&&this._getItemByDirection(t,o),h=this._getItemIndex(l),c=Boolean(this._interval);if(t===U?(n=z,i=X,r=F):(n=q,i=J,r=V),l&&P(l).hasClass(Y))this._isSliding=!1;else if(!this._triggerSlideEvent(l,r).isDefaultPrevented()&&o&&l){this._isSliding=!0,c&&this.pause(),this._setActiveIndicatorElement(l);var u=P.Event(Q.SLID,{relatedTarget:l,direction:r,from:a,to:h});if(P(this._element).hasClass(G)){P(l).addClass(i),Cn.reflow(l),P(o).addClass(n),P(l).addClass(n);var f=Cn.getTransitionDurationFromElement(o);P(o).one(Cn.TRANSITION_END,function(){P(l).removeClass(n+" "+i).addClass(Y),P(o).removeClass(Y+" "+i+" "+n),s._isSliding=!1,setTimeout(function(){return P(s._element).trigger(u)},0)}).emulateTransitionEnd(f)}else P(o).removeClass(Y),P(l).addClass(Y),this._isSliding=!1,P(this._element).trigger(u);c&&this.cycle()}},s._jQueryInterface=function(i){return this.each(function(){var t=P(this).data(j),e=h({},M,P(this).data());"object"==typeof i&&(e=h({},e,i));var n="string"==typeof i?i:e.slide;if(t||(t=new s(this,e),P(this).data(j,t)),"number"==typeof i)t.to(i);else if("string"==typeof n){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}else e.interval&&(t.pause(),t.cycle())})},s._dataApiClickHandler=function(t){var e=Cn.getSelectorFromElement(this);if(e){var n=P(e)[0];if(n&&P(n).hasClass(B)){var i=h({},P(n).data(),P(this).data()),r=this.getAttribute("data-slide-to");r&&(i.interval=!1),s._jQueryInterface.call(P(n),i),r&&P(n).data(j).to(r),t.preventDefault()}}},o(s,null,[{key:"VERSION",get:function(){return"4.1.1"}},{key:"Default",get:function(){return M}}]),s}(),P(document).on(Q.CLICK_DATA_API,Z.DATA_SLIDE,$._dataApiClickHandler),P(window).on(Q.LOAD_DATA_API,function(){P(Z.DATA_RIDE).each(function(){var t=P(this);$._jQueryInterface.call(t,t.data())})}),P.fn[L]=$._jQueryInterface,P.fn[L].Constructor=$,P.fn[L].noConflict=function(){return P.fn[L]=W,$._jQueryInterface},$),bn=(et="collapse",it="."+(nt="bs.collapse"),rt=(tt=e).fn[et],st={toggle:!0,parent:""},ot={toggle:"boolean",parent:"(string|element)"},at={SHOW:"show"+it,SHOWN:"shown"+it,HIDE:"hide"+it,HIDDEN:"hidden"+it,CLICK_DATA_API:"click"+it+".data-api"},lt="show",ht="collapse",ct="collapsing",ut="collapsed",ft="width",dt="height",_t={ACTIVES:".show, .collapsing",DATA_TOGGLE:'[data-toggle="collapse"]'},gt=function(){function a(t,e){this._isTransitioning=!1,this._element=t,this._config=this._getConfig(e),this._triggerArray=tt.makeArray(tt('[data-toggle="collapse"][href="#'+t.id+'"],[data-toggle="collapse"][data-target="#'+t.id+'"]'));for(var n=tt(_t.DATA_TOGGLE),i=0;i<n.length;i++){var r=n[i],s=Cn.getSelectorFromElement(r);null!==s&&0<tt(s).filter(t).length&&(this._selector=s,this._triggerArray.push(r))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var t=a.prototype;return t.toggle=function(){tt(this._element).hasClass(lt)?this.hide():this.show()},t.show=function(){var t,e,n=this;if(!this._isTransitioning&&!tt(this._element).hasClass(lt)&&(this._parent&&0===(t=tt.makeArray(tt(this._parent).find(_t.ACTIVES).filter('[data-parent="'+this._config.parent+'"]'))).length&&(t=null),!(t&&(e=tt(t).not(this._selector).data(nt))&&e._isTransitioning))){var i=tt.Event(at.SHOW);if(tt(this._element).trigger(i),!i.isDefaultPrevented()){t&&(a._jQueryInterface.call(tt(t).not(this._selector),"hide"),e||tt(t).data(nt,null));var r=this._getDimension();tt(this._element).removeClass(ht).addClass(ct),(this._element.style[r]=0)<this._triggerArray.length&&tt(this._triggerArray).removeClass(ut).attr("aria-expanded",!0),this.setTransitioning(!0);var s="scroll"+(r[0].toUpperCase()+r.slice(1)),o=Cn.getTransitionDurationFromElement(this._element);tt(this._element).one(Cn.TRANSITION_END,function(){tt(n._element).removeClass(ct).addClass(ht).addClass(lt),n._element.style[r]="",n.setTransitioning(!1),tt(n._element).trigger(at.SHOWN)}).emulateTransitionEnd(o),this._element.style[r]=this._element[s]+"px"}}},t.hide=function(){var t=this;if(!this._isTransitioning&&tt(this._element).hasClass(lt)){var e=tt.Event(at.HIDE);if(tt(this._element).trigger(e),!e.isDefaultPrevented()){var n=this._getDimension();if(this._element.style[n]=this._element.getBoundingClientRect()[n]+"px",Cn.reflow(this._element),tt(this._element).addClass(ct).removeClass(ht).removeClass(lt),0<this._triggerArray.length)for(var i=0;i<this._triggerArray.length;i++){var r=this._triggerArray[i],s=Cn.getSelectorFromElement(r);if(null!==s)tt(s).hasClass(lt)||tt(r).addClass(ut).attr("aria-expanded",!1)}this.setTransitioning(!0);this._element.style[n]="";var o=Cn.getTransitionDurationFromElement(this._element);tt(this._element).one(Cn.TRANSITION_END,function(){t.setTransitioning(!1),tt(t._element).removeClass(ct).addClass(ht).trigger(at.HIDDEN)}).emulateTransitionEnd(o)}}},t.setTransitioning=function(t){this._isTransitioning=t},t.dispose=function(){tt.removeData(this._element,nt),this._config=null,this._parent=null,this._element=null,this._triggerArray=null,this._isTransitioning=null},t._getConfig=function(t){return(t=h({},st,t)).toggle=Boolean(t.toggle),Cn.typeCheckConfig(et,t,ot),t},t._getDimension=function(){return tt(this._element).hasClass(ft)?ft:dt},t._getParent=function(){var n=this,t=null;Cn.isElement(this._config.parent)?(t=this._config.parent,"undefined"!=typeof this._config.parent.jquery&&(t=this._config.parent[0])):t=tt(this._config.parent)[0];var e='[data-toggle="collapse"][data-parent="'+this._config.parent+'"]';return tt(t).find(e).each(function(t,e){n._addAriaAndCollapsedClass(a._getTargetFromElement(e),[e])}),t},t._addAriaAndCollapsedClass=function(t,e){if(t){var n=tt(t).hasClass(lt);0<e.length&&tt(e).toggleClass(ut,!n).attr("aria-expanded",n)}},a._getTargetFromElement=function(t){var e=Cn.getSelectorFromElement(t);return e?tt(e)[0]:null},a._jQueryInterface=function(i){return this.each(function(){var t=tt(this),e=t.data(nt),n=h({},st,t.data(),"object"==typeof i&&i?i:{});if(!e&&n.toggle&&/show|hide/.test(i)&&(n.toggle=!1),e||(e=new a(this,n),t.data(nt,e)),"string"==typeof i){if("undefined"==typeof e[i])throw new TypeError('No method named "'+i+'"');e[i]()}})},o(a,null,[{key:"VERSION",get:function(){return"4.1.1"}},{key:"Default",get:function(){return st}}]),a}(),tt(document).on(at.CLICK_DATA_API,_t.DATA_TOGGLE,function(t){"A"===t.currentTarget.tagName&&t.preventDefault();var n=tt(this),e=Cn.getSelectorFromElement(this);tt(e).each(function(){var t=tt(this),e=t.data(nt)?"toggle":n.data();gt._jQueryInterface.call(t,e)})}),tt.fn[et]=gt._jQueryInterface,tt.fn[et].Constructor=gt,tt.fn[et].noConflict=function(){return tt.fn[et]=rt,gt._jQueryInterface},gt),Sn=(pt="dropdown",Et="."+(vt="bs.dropdown"),yt=".data-api",Tt=(mt=e).fn[pt],Ct=new RegExp("38|40|27"),It={HIDE:"hide"+Et,HIDDEN:"hidden"+Et,SHOW:"show"+Et,SHOWN:"shown"+Et,CLICK:"click"+Et,CLICK_DATA_API:"click"+Et+yt,KEYDOWN_DATA_API:"keydown"+Et+yt,KEYUP_DATA_API:"keyup"+Et+yt},At="disabled",Dt="show",bt="dropup",St="dropright",wt="dropleft",Nt="dropdown-menu-right",Ot="position-static",kt='[data-toggle="dropdown"]',Pt=".dropdown form",Lt=".dropdown-menu",jt=".navbar-nav",Rt=".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",Ht="top-start",Wt="top-end",Mt="bottom-start",xt="bottom-end",Ut="right-start",Kt="left-start",Ft={offset:0,flip:!0,boundary:"scrollParent",reference:"toggle",display:"dynamic"},Vt={offset:"(number|string|function)",flip:"boolean",boundary:"(string|element)",reference:"(string|element)",display:"string"},Qt=function(){function l(t,e){this._element=t,this._popper=null,this._config=this._getConfig(e),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}var t=l.prototype;return t.toggle=function(){if(!this._element.disabled&&!mt(this._element).hasClass(At)){var t=l._getParentFromElement(this._element),e=mt(this._menu).hasClass(Dt);if(l._clearMenus(),!e){var n={relatedTarget:this._element},i=mt.Event(It.SHOW,n);if(mt(t).trigger(i),!i.isDefaultPrevented()){if(!this._inNavbar){if("undefined"==typeof c)throw new TypeError("Bootstrap dropdown require Popper.js (https://popper.js.org)");var r=this._element;"parent"===this._config.reference?r=t:Cn.isElement(this._config.reference)&&(r=this._config.reference,"undefined"!=typeof this._config.reference.jquery&&(r=this._config.reference[0])),"scrollParent"!==this._config.boundary&&mt(t).addClass(Ot),this._popper=new c(r,this._menu,this._getPopperConfig())}"ontouchstart"in document.documentElement&&0===mt(t).closest(jt).length&&mt(document.body).children().on("mouseover",null,mt.noop),this._element.focus(),this._element.setAttribute("aria-expanded",!0),mt(this._menu).toggleClass(Dt),mt(t).toggleClass(Dt).trigger(mt.Event(It.SHOWN,n))}}}},t.dispose=function(){mt.removeData(this._element,vt),mt(this._element).off(Et),this._element=null,(this._menu=null)!==this._popper&&(this._popper.destroy(),this._popper=null)},t.update=function(){this._inNavbar=this._detectNavbar(),null!==this._popper&&this._popper.scheduleUpdate()},t._addEventListeners=function(){var e=this;mt(this._element).on(It.CLICK,function(t){t.preventDefault(),t.stopPropagation(),e.toggle()})},t._getConfig=function(t){return t=h({},this.constructor.Default,mt(this._element).data(),t),Cn.typeCheckConfig(pt,t,this.constructor.DefaultType),t},t._getMenuElement=function(){if(!this._menu){var t=l._getParentFromElement(this._element);this._menu=mt(t).find(Lt)[0]}return this._menu},t._getPlacement=function(){var t=mt(this._element).parent(),e=Mt;return t.hasClass(bt)?(e=Ht,mt(this._menu).hasClass(Nt)&&(e=Wt)):t.hasClass(St)?e=Ut:t.hasClass(wt)?e=Kt:mt(this._menu).hasClass(Nt)&&(e=xt),e},t._detectNavbar=function(){return 0<mt(this._element).closest(".navbar").length},t._getPopperConfig=function(){var e=this,t={};"function"==typeof this._config.offset?t.fn=function(t){return t.offsets=h({},t.offsets,e._config.offset(t.offsets)||{}),t}:t.offset=this._config.offset;var n={placement:this._getPlacement(),modifiers:{offset:t,flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}};return"static"===this._config.display&&(n.modifiers.applyStyle={enabled:!1}),n},l._jQueryInterface=function(e){return this.each(function(){var t=mt(this).data(vt);if(t||(t=new l(this,"object"==typeof e?e:null),mt(this).data(vt,t)),"string"==typeof e){if("undefined"==typeof t[e])throw new TypeError('No method named "'+e+'"');t[e]()}})},l._clearMenus=function(t){if(!t||3!==t.which&&("keyup"!==t.type||9===t.which))for(var e=mt.makeArray(mt(kt)),n=0;n<e.length;n++){var i=l._getParentFromElement(e[n]),r=mt(e[n]).data(vt),s={relatedTarget:e[n]};if(r){var o=r._menu;if(mt(i).hasClass(Dt)&&!(t&&("click"===t.type&&/input|textarea/i.test(t.target.tagName)||"keyup"===t.type&&9===t.which)&&mt.contains(i,t.target))){var a=mt.Event(It.HIDE,s);mt(i).trigger(a),a.isDefaultPrevented()||("ontouchstart"in document.documentElement&&mt(document.body).children().off("mouseover",null,mt.noop),e[n].setAttribute("aria-expanded","false"),mt(o).removeClass(Dt),mt(i).removeClass(Dt).trigger(mt.Event(It.HIDDEN,s)))}}}},l._getParentFromElement=function(t){var e,n=Cn.getSelectorFromElement(t);return n&&(e=mt(n)[0]),e||t.parentNode},l._dataApiKeydownHandler=function(t){if((/input|textarea/i.test(t.target.tagName)?!(32===t.which||27!==t.which&&(40!==t.which&&38!==t.which||mt(t.target).closest(Lt).length)):Ct.test(t.which))&&(t.preventDefault(),t.stopPropagation(),!this.disabled&&!mt(this).hasClass(At))){var e=l._getParentFromElement(this),n=mt(e).hasClass(Dt);if((n||27===t.which&&32===t.which)&&(!n||27!==t.which&&32!==t.which)){var i=mt(e).find(Rt).get();if(0!==i.length){var r=i.indexOf(t.target);38===t.which&&0<r&&r--,40===t.which&&r<i.length-1&&r++,r<0&&(r=0),i[r].focus()}}else{if(27===t.which){var s=mt(e).find(kt)[0];mt(s).trigger("focus")}mt(this).trigger("click")}}},o(l,null,[{key:"VERSION",get:function(){return"4.1.1"}},{key:"Default",get:function(){return Ft}},{key:"DefaultType",get:function(){return Vt}}]),l}(),mt(document).on(It.KEYDOWN_DATA_API,kt,Qt._dataApiKeydownHandler).on(It.KEYDOWN_DATA_API,Lt,Qt._dataApiKeydownHandler).on(It.CLICK_DATA_API+" "+It.KEYUP_DATA_API,Qt._clearMenus).on(It.CLICK_DATA_API,kt,function(t){t.preventDefault(),t.stopPropagation(),Qt._jQueryInterface.call(mt(this),"toggle")}).on(It.CLICK_DATA_API,Pt,function(t){t.stopPropagation()}),mt.fn[pt]=Qt._jQueryInterface,mt.fn[pt].Constructor=Qt,mt.fn[pt].noConflict=function(){return mt.fn[pt]=Tt,Qt._jQueryInterface},Qt),wn=(Yt="modal",qt="."+(Gt="bs.modal"),zt=(Bt=e).fn[Yt],Xt={backdrop:!0,keyboard:!0,focus:!0,show:!0},Jt={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean",show:"boolean"},Zt={HIDE:"hide"+qt,HIDDEN:"hidden"+qt,SHOW:"show"+qt,SHOWN:"shown"+qt,FOCUSIN:"focusin"+qt,RESIZE:"resize"+qt,CLICK_DISMISS:"click.dismiss"+qt,KEYDOWN_DISMISS:"keydown.dismiss"+qt,MOUSEUP_DISMISS:"mouseup.dismiss"+qt,MOUSEDOWN_DISMISS:"mousedown.dismiss"+qt,CLICK_DATA_API:"click"+qt+".data-api"},$t="modal-scrollbar-measure",te="modal-backdrop",ee="modal-open",ne="fade",ie="show",re={DIALOG:".modal-dialog",DATA_TOGGLE:'[data-toggle="modal"]',DATA_DISMISS:'[data-dismiss="modal"]',FIXED_CONTENT:".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",STICKY_CONTENT:".sticky-top",NAVBAR_TOGGLER:".navbar-toggler"},se=function(){function r(t,e){this._config=this._getConfig(e),this._element=t,this._dialog=Bt(t).find(re.DIALOG)[0],this._backdrop=null,this._isShown=!1,this._isBodyOverflowing=!1,this._ignoreBackdropClick=!1,this._scrollbarWidth=0}var t=r.prototype;return t.toggle=function(t){return this._isShown?this.hide():this.show(t)},t.show=function(t){var e=this;if(!this._isTransitioning&&!this._isShown){Bt(this._element).hasClass(ne)&&(this._isTransitioning=!0);var n=Bt.Event(Zt.SHOW,{relatedTarget:t});Bt(this._element).trigger(n),this._isShown||n.isDefaultPrevented()||(this._isShown=!0,this._checkScrollbar(),this._setScrollbar(),this._adjustDialog(),Bt(document.body).addClass(ee),this._setEscapeEvent(),this._setResizeEvent(),Bt(this._element).on(Zt.CLICK_DISMISS,re.DATA_DISMISS,function(t){return e.hide(t)}),Bt(this._dialog).on(Zt.MOUSEDOWN_DISMISS,function(){Bt(e._element).one(Zt.MOUSEUP_DISMISS,function(t){Bt(t.target).is(e._element)&&(e._ignoreBackdropClick=!0)})}),this._showBackdrop(function(){return e._showElement(t)}))}},t.hide=function(t){var e=this;if(t&&t.preventDefault(),!this._isTransitioning&&this._isShown){var n=Bt.Event(Zt.HIDE);if(Bt(this._element).trigger(n),this._isShown&&!n.isDefaultPrevented()){this._isShown=!1;var i=Bt(this._element).hasClass(ne);if(i&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),Bt(document).off(Zt.FOCUSIN),Bt(this._element).removeClass(ie),Bt(this._element).off(Zt.CLICK_DISMISS),Bt(this._dialog).off(Zt.MOUSEDOWN_DISMISS),i){var r=Cn.getTransitionDurationFromElement(this._element);Bt(this._element).one(Cn.TRANSITION_END,function(t){return e._hideModal(t)}).emulateTransitionEnd(r)}else this._hideModal()}}},t.dispose=function(){Bt.removeData(this._element,Gt),Bt(window,document,this._element,this._backdrop).off(qt),this._config=null,this._element=null,this._dialog=null,this._backdrop=null,this._isShown=null,this._isBodyOverflowing=null,this._ignoreBackdropClick=null,this._scrollbarWidth=null},t.handleUpdate=function(){this._adjustDialog()},t._getConfig=function(t){return t=h({},Xt,t),Cn.typeCheckConfig(Yt,t,Jt),t},t._showElement=function(t){var e=this,n=Bt(this._element).hasClass(ne);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.scrollTop=0,n&&Cn.reflow(this._element),Bt(this._element).addClass(ie),this._config.focus&&this._enforceFocus();var i=Bt.Event(Zt.SHOWN,{relatedTarget:t}),r=function(){e._config.focus&&e._element.focus(),e._isTransitioning=!1,Bt(e._element).trigger(i)};if(n){var s=Cn.getTransitionDurationFromElement(this._element);Bt(this._dialog).one(Cn.TRANSITION_END,r).emulateTransitionEnd(s)}else r()},t._enforceFocus=function(){var e=this;Bt(document).off(Zt.FOCUSIN).on(Zt.FOCUSIN,function(t){document!==t.target&&e._element!==t.target&&0===Bt(e._element).has(t.target).length&&e._element.focus()})},t._setEscapeEvent=function(){var e=this;this._isShown&&this._config.keyboard?Bt(this._element).on(Zt.KEYDOWN_DISMISS,function(t){27===t.which&&(t.preventDefault(),e.hide())}):this._isShown||Bt(this._element).off(Zt.KEYDOWN_DISMISS)},t._setResizeEvent=function(){var e=this;this._isShown?Bt(window).on(Zt.RESIZE,function(t){return e.handleUpdate(t)}):Bt(window).off(Zt.RESIZE)},t._hideModal=function(){var t=this;this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._isTransitioning=!1,this._showBackdrop(function(){Bt(document.body).removeClass(ee),t._resetAdjustments(),t._resetScrollbar(),Bt(t._element).trigger(Zt.HIDDEN)})},t._removeBackdrop=function(){this._backdrop&&(Bt(this._backdrop).remove(),this._backdrop=null)},t._showBackdrop=function(t){var e=this,n=Bt(this._element).hasClass(ne)?ne:"";if(this._isShown&&this._config.backdrop){if(this._backdrop=document.createElement("div"),this._backdrop.className=te,n&&Bt(this._backdrop).addClass(n),Bt(this._backdrop).appendTo(document.body),Bt(this._element).on(Zt.CLICK_DISMISS,function(t){e._ignoreBackdropClick?e._ignoreBackdropClick=!1:t.target===t.currentTarget&&("static"===e._config.backdrop?e._element.focus():e.hide())}),n&&Cn.reflow(this._backdrop),Bt(this._backdrop).addClass(ie),!t)return;if(!n)return void t();var i=Cn.getTransitionDurationFromElement(this._backdrop);Bt(this._backdrop).one(Cn.TRANSITION_END,t).emulateTransitionEnd(i)}else if(!this._isShown&&this._backdrop){Bt(this._backdrop).removeClass(ie);var r=function(){e._removeBackdrop(),t&&t()};if(Bt(this._element).hasClass(ne)){var s=Cn.getTransitionDurationFromElement(this._backdrop);Bt(this._backdrop).one(Cn.TRANSITION_END,r).emulateTransitionEnd(s)}else r()}else t&&t()},t._adjustDialog=function(){var t=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},t._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},t._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right<window.innerWidth,this._scrollbarWidth=this._getScrollbarWidth()},t._setScrollbar=function(){var r=this;if(this._isBodyOverflowing){Bt(re.FIXED_CONTENT).each(function(t,e){var n=Bt(e)[0].style.paddingRight,i=Bt(e).css("padding-right");Bt(e).data("padding-right",n).css("padding-right",parseFloat(i)+r._scrollbarWidth+"px")}),Bt(re.STICKY_CONTENT).each(function(t,e){var n=Bt(e)[0].style.marginRight,i=Bt(e).css("margin-right");Bt(e).data("margin-right",n).css("margin-right",parseFloat(i)-r._scrollbarWidth+"px")}),Bt(re.NAVBAR_TOGGLER).each(function(t,e){var n=Bt(e)[0].style.marginRight,i=Bt(e).css("margin-right");Bt(e).data("margin-right",n).css("margin-right",parseFloat(i)+r._scrollbarWidth+"px")});var t=document.body.style.paddingRight,e=Bt(document.body).css("padding-right");Bt(document.body).data("padding-right",t).css("padding-right",parseFloat(e)+this._scrollbarWidth+"px")}},t._resetScrollbar=function(){Bt(re.FIXED_CONTENT).each(function(t,e){var n=Bt(e).data("padding-right");"undefined"!=typeof n&&Bt(e).css("padding-right",n).removeData("padding-right")}),Bt(re.STICKY_CONTENT+", "+re.NAVBAR_TOGGLER).each(function(t,e){var n=Bt(e).data("margin-right");"undefined"!=typeof n&&Bt(e).css("margin-right",n).removeData("margin-right")});var t=Bt(document.body).data("padding-right");"undefined"!=typeof t&&Bt(document.body).css("padding-right",t).removeData("padding-right")},t._getScrollbarWidth=function(){var t=document.createElement("div");t.className=$t,document.body.appendChild(t);var e=t.getBoundingClientRect().width-t.clientWidth;return document.body.removeChild(t),e},r._jQueryInterface=function(n,i){return this.each(function(){var t=Bt(this).data(Gt),e=h({},Xt,Bt(this).data(),"object"==typeof n&&n?n:{});if(t||(t=new r(this,e),Bt(this).data(Gt,t)),"string"==typeof n){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n](i)}else e.show&&t.show(i)})},o(r,null,[{key:"VERSION",get:function(){return"4.1.1"}},{key:"Default",get:function(){return Xt}}]),r}(),Bt(document).on(Zt.CLICK_DATA_API,re.DATA_TOGGLE,function(t){var e,n=this,i=Cn.getSelectorFromElement(this);i&&(e=Bt(i)[0]);var r=Bt(e).data(Gt)?"toggle":h({},Bt(e).data(),Bt(this).data());"A"!==this.tagName&&"AREA"!==this.tagName||t.preventDefault();var s=Bt(e).one(Zt.SHOW,function(t){t.isDefaultPrevented()||s.one(Zt.HIDDEN,function(){Bt(n).is(":visible")&&n.focus()})});se._jQueryInterface.call(Bt(e),r,this)}),Bt.fn[Yt]=se._jQueryInterface,Bt.fn[Yt].Constructor=se,Bt.fn[Yt].noConflict=function(){return Bt.fn[Yt]=zt,se._jQueryInterface},se),Nn=(ae="tooltip",he="."+(le="bs.tooltip"),ce=(oe=e).fn[ae],ue="bs-tooltip",fe=new RegExp("(^|\\s)"+ue+"\\S+","g"),ge={animation:!0,template:'<div class="tooltip" role="tooltip"><div class="arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!(_e={AUTO:"auto",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left"}),selector:!(de={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(number|string)",container:"(string|element|boolean)",fallbackPlacement:"(string|array)",boundary:"(string|element)"}),placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent"},pe="out",ve={HIDE:"hide"+he,HIDDEN:"hidden"+he,SHOW:(me="show")+he,SHOWN:"shown"+he,INSERTED:"inserted"+he,CLICK:"click"+he,FOCUSIN:"focusin"+he,FOCUSOUT:"focusout"+he,MOUSEENTER:"mouseenter"+he,MOUSELEAVE:"mouseleave"+he},Ee="fade",ye="show",Te=".tooltip-inner",Ce=".arrow",Ie="hover",Ae="focus",De="click",be="manual",Se=function(){function i(t,e){if("undefined"==typeof c)throw new TypeError("Bootstrap tooltips require Popper.js (https://popper.js.org)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var t=i.prototype;return t.enable=function(){this._isEnabled=!0},t.disable=function(){this._isEnabled=!1},t.toggleEnabled=function(){this._isEnabled=!this._isEnabled},t.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=oe(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),oe(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(oe(this.getTipElement()).hasClass(ye))return void this._leave(null,this);this._enter(null,this)}},t.dispose=function(){clearTimeout(this._timeout),oe.removeData(this.element,this.constructor.DATA_KEY),oe(this.element).off(this.constructor.EVENT_KEY),oe(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&oe(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,(this._activeTrigger=null)!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},t.show=function(){var e=this;if("none"===oe(this.element).css("display"))throw new Error("Please use show on visible elements");var t=oe.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){oe(this.element).trigger(t);var n=oe.contains(this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!n)return;var i=this.getTipElement(),r=Cn.getUID(this.constructor.NAME);i.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&oe(i).addClass(Ee);var s="function"==typeof this.config.placement?this.config.placement.call(this,i,this.element):this.config.placement,o=this._getAttachment(s);this.addAttachmentClass(o);var a=!1===this.config.container?document.body:oe(this.config.container);oe(i).data(this.constructor.DATA_KEY,this),oe.contains(this.element.ownerDocument.documentElement,this.tip)||oe(i).appendTo(a),oe(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new c(this.element,i,{placement:o,modifiers:{offset:{offset:this.config.offset},flip:{behavior:this.config.fallbackPlacement},arrow:{element:Ce},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){e._handlePopperPlacementChange(t)}}),oe(i).addClass(ye),"ontouchstart"in document.documentElement&&oe(document.body).children().on("mouseover",null,oe.noop);var l=function(){e.config.animation&&e._fixTransition();var t=e._hoverState;e._hoverState=null,oe(e.element).trigger(e.constructor.Event.SHOWN),t===pe&&e._leave(null,e)};if(oe(this.tip).hasClass(Ee)){var h=Cn.getTransitionDurationFromElement(this.tip);oe(this.tip).one(Cn.TRANSITION_END,l).emulateTransitionEnd(h)}else l()}},t.hide=function(t){var e=this,n=this.getTipElement(),i=oe.Event(this.constructor.Event.HIDE),r=function(){e._hoverState!==me&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),oe(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(oe(this.element).trigger(i),!i.isDefaultPrevented()){if(oe(n).removeClass(ye),"ontouchstart"in document.documentElement&&oe(document.body).children().off("mouseover",null,oe.noop),this._activeTrigger[De]=!1,this._activeTrigger[Ae]=!1,this._activeTrigger[Ie]=!1,oe(this.tip).hasClass(Ee)){var s=Cn.getTransitionDurationFromElement(n);oe(n).one(Cn.TRANSITION_END,r).emulateTransitionEnd(s)}else r();this._hoverState=""}},t.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},t.isWithContent=function(){return Boolean(this.getTitle())},t.addAttachmentClass=function(t){oe(this.getTipElement()).addClass(ue+"-"+t)},t.getTipElement=function(){return this.tip=this.tip||oe(this.config.template)[0],this.tip},t.setContent=function(){var t=oe(this.getTipElement());this.setElementContent(t.find(Te),this.getTitle()),t.removeClass(Ee+" "+ye)},t.setElementContent=function(t,e){var n=this.config.html;"object"==typeof e&&(e.nodeType||e.jquery)?n?oe(e).parent().is(t)||t.empty().append(e):t.text(oe(e).text()):t[n?"html":"text"](e)},t.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},t._getAttachment=function(t){return _e[t.toUpperCase()]},t._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(t){if("click"===t)oe(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(t){return i.toggle(t)});else if(t!==be){var e=t===Ie?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=t===Ie?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;oe(i.element).on(e,i.config.selector,function(t){return i._enter(t)}).on(n,i.config.selector,function(t){return i._leave(t)})}oe(i.element).closest(".modal").on("hide.bs.modal",function(){return i.hide()})}),this.config.selector?this.config=h({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},t._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},t._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||oe(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),oe(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?Ae:Ie]=!0),oe(e.getTipElement()).hasClass(ye)||e._hoverState===me?e._hoverState=me:(clearTimeout(e._timeout),e._hoverState=me,e.config.delay&&e.config.delay.show?e._timeout=setTimeout(function(){e._hoverState===me&&e.show()},e.config.delay.show):e.show())},t._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||oe(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),oe(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?Ae:Ie]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=pe,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout(function(){e._hoverState===pe&&e.hide()},e.config.delay.hide):e.hide())},t._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},t._getConfig=function(t){return"number"==typeof(t=h({},this.constructor.Default,oe(this.element).data(),"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),Cn.typeCheckConfig(ae,t,this.constructor.DefaultType),t},t._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},t._cleanTipClass=function(){var t=oe(this.getTipElement()),e=t.attr("class").match(fe);null!==e&&0<e.length&&t.removeClass(e.join(""))},t._handlePopperPlacementChange=function(t){this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},t._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(oe(t).removeClass(Ee),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},i._jQueryInterface=function(n){return this.each(function(){var t=oe(this).data(le),e="object"==typeof n&&n;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),oe(this).data(le,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},o(i,null,[{key:"VERSION",get:function(){return"4.1.1"}},{key:"Default",get:function(){return ge}},{key:"NAME",get:function(){return ae}},{key:"DATA_KEY",get:function(){return le}},{key:"Event",get:function(){return ve}},{key:"EVENT_KEY",get:function(){return he}},{key:"DefaultType",get:function(){return de}}]),i}(),oe.fn[ae]=Se._jQueryInterface,oe.fn[ae].Constructor=Se,oe.fn[ae].noConflict=function(){return oe.fn[ae]=ce,Se._jQueryInterface},Se),On=(Ne="popover",ke="."+(Oe="bs.popover"),Pe=(we=e).fn[Ne],Le="bs-popover",je=new RegExp("(^|\\s)"+Le+"\\S+","g"),Re=h({},Nn.Default,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>'}),He=h({},Nn.DefaultType,{content:"(string|element|function)"}),We="fade",xe=".popover-header",Ue=".popover-body",Ke={HIDE:"hide"+ke,HIDDEN:"hidden"+ke,SHOW:(Me="show")+ke,SHOWN:"shown"+ke,INSERTED:"inserted"+ke,CLICK:"click"+ke,FOCUSIN:"focusin"+ke,FOCUSOUT:"focusout"+ke,MOUSEENTER:"mouseenter"+ke,MOUSELEAVE:"mouseleave"+ke},Fe=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),(e.prototype.constructor=e).__proto__=n;var r=i.prototype;return r.isWithContent=function(){return this.getTitle()||this._getContent()},r.addAttachmentClass=function(t){we(this.getTipElement()).addClass(Le+"-"+t)},r.getTipElement=function(){return this.tip=this.tip||we(this.config.template)[0],this.tip},r.setContent=function(){var t=we(this.getTipElement());this.setElementContent(t.find(xe),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(Ue),e),t.removeClass(We+" "+Me)},r._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},r._cleanTipClass=function(){var t=we(this.getTipElement()),e=t.attr("class").match(je);null!==e&&0<e.length&&t.removeClass(e.join(""))},i._jQueryInterface=function(n){return this.each(function(){var t=we(this).data(Oe),e="object"==typeof n?n:null;if((t||!/destroy|hide/.test(n))&&(t||(t=new i(this,e),we(this).data(Oe,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},o(i,null,[{key:"VERSION",get:function(){return"4.1.1"}},{key:"Default",get:function(){return Re}},{key:"NAME",get:function(){return Ne}},{key:"DATA_KEY",get:function(){return Oe}},{key:"Event",get:function(){return Ke}},{key:"EVENT_KEY",get:function(){return ke}},{key:"DefaultType",get:function(){return He}}]),i}(Nn),we.fn[Ne]=Fe._jQueryInterface,we.fn[Ne].Constructor=Fe,we.fn[Ne].noConflict=function(){return we.fn[Ne]=Pe,Fe._jQueryInterface},Fe),kn=(Qe="scrollspy",Ye="."+(Be="bs.scrollspy"),Ge=(Ve=e).fn[Qe],qe={offset:10,method:"auto",target:""},ze={offset:"number",method:"string",target:"(string|element)"},Xe={ACTIVATE:"activate"+Ye,SCROLL:"scroll"+Ye,LOAD_DATA_API:"load"+Ye+".data-api"},Je="dropdown-item",Ze="active",$e={DATA_SPY:'[data-spy="scroll"]',ACTIVE:".active",NAV_LIST_GROUP:".nav, .list-group",NAV_LINKS:".nav-link",NAV_ITEMS:".nav-item",LIST_ITEMS:".list-group-item",DROPDOWN:".dropdown",DROPDOWN_ITEMS:".dropdown-item",DROPDOWN_TOGGLE:".dropdown-toggle"},tn="offset",en="position",nn=function(){function n(t,e){var n=this;this._element=t,this._scrollElement="BODY"===t.tagName?window:t,this._config=this._getConfig(e),this._selector=this._config.target+" "+$e.NAV_LINKS+","+this._config.target+" "+$e.LIST_ITEMS+","+this._config.target+" "+$e.DROPDOWN_ITEMS,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,Ve(this._scrollElement).on(Xe.SCROLL,function(t){return n._process(t)}),this.refresh(),this._process()}var t=n.prototype;return t.refresh=function(){var e=this,t=this._scrollElement===this._scrollElement.window?tn:en,r="auto"===this._config.method?t:this._config.method,s=r===en?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),Ve.makeArray(Ve(this._selector)).map(function(t){var e,n=Cn.getSelectorFromElement(t);if(n&&(e=Ve(n)[0]),e){var i=e.getBoundingClientRect();if(i.width||i.height)return[Ve(e)[r]().top+s,n]}return null}).filter(function(t){return t}).sort(function(t,e){return t[0]-e[0]}).forEach(function(t){e._offsets.push(t[0]),e._targets.push(t[1])})},t.dispose=function(){Ve.removeData(this._element,Be),Ve(this._scrollElement).off(Ye),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},t._getConfig=function(t){if("string"!=typeof(t=h({},qe,"object"==typeof t&&t?t:{})).target){var e=Ve(t.target).attr("id");e||(e=Cn.getUID(Qe),Ve(t.target).attr("id",e)),t.target="#"+e}return Cn.typeCheckConfig(Qe,t,ze),t},t._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},t._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},t._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},t._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),n<=t){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t<this._offsets[0]&&0<this._offsets[0])return this._activeTarget=null,void this._clear();for(var r=this._offsets.length;r--;){this._activeTarget!==this._targets[r]&&t>=this._offsets[r]&&("undefined"==typeof this._offsets[r+1]||t<this._offsets[r+1])&&this._activate(this._targets[r])}}},t._activate=function(e){this._activeTarget=e,this._clear();var t=this._selector.split(",");t=t.map(function(t){return t+'[data-target="'+e+'"],'+t+'[href="'+e+'"]'});var n=Ve(t.join(","));n.hasClass(Je)?(n.closest($e.DROPDOWN).find($e.DROPDOWN_TOGGLE).addClass(Ze),n.addClass(Ze)):(n.addClass(Ze),n.parents($e.NAV_LIST_GROUP).prev($e.NAV_LINKS+", "+$e.LIST_ITEMS).addClass(Ze),n.parents($e.NAV_LIST_GROUP).prev($e.NAV_ITEMS).children($e.NAV_LINKS).addClass(Ze)),Ve(this._scrollElement).trigger(Xe.ACTIVATE,{relatedTarget:e})},t._clear=function(){Ve(this._selector).filter($e.ACTIVE).removeClass(Ze)},n._jQueryInterface=function(e){return this.each(function(){var t=Ve(this).data(Be);if(t||(t=new n(this,"object"==typeof e&&e),Ve(this).data(Be,t)),"string"==typeof e){if("undefined"==typeof t[e])throw new TypeError('No method named "'+e+'"');t[e]()}})},o(n,null,[{key:"VERSION",get:function(){return"4.1.1"}},{key:"Default",get:function(){return qe}}]),n}(),Ve(window).on(Xe.LOAD_DATA_API,function(){for(var t=Ve.makeArray(Ve($e.DATA_SPY)),e=t.length;e--;){var n=Ve(t[e]);nn._jQueryInterface.call(n,n.data())}}),Ve.fn[Qe]=nn._jQueryInterface,Ve.fn[Qe].Constructor=nn,Ve.fn[Qe].noConflict=function(){return Ve.fn[Qe]=Ge,nn._jQueryInterface},nn),Pn=(on="."+(sn="bs.tab"),an=(rn=e).fn.tab,ln={HIDE:"hide"+on,HIDDEN:"hidden"+on,SHOW:"show"+on,SHOWN:"shown"+on,CLICK_DATA_API:"click"+on+".data-api"},hn="dropdown-menu",cn="active",un="disabled",fn="fade",dn="show",_n=".dropdown",gn=".nav, .list-group",mn=".active",pn="> li > .active",vn='[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',En=".dropdown-toggle",yn="> .dropdown-menu .active",Tn=function(){function i(t){this._element=t}var t=i.prototype;return t.show=function(){var n=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&rn(this._element).hasClass(cn)||rn(this._element).hasClass(un))){var t,i,e=rn(this._element).closest(gn)[0],r=Cn.getSelectorFromElement(this._element);if(e){var s="UL"===e.nodeName?pn:mn;i=(i=rn.makeArray(rn(e).find(s)))[i.length-1]}var o=rn.Event(ln.HIDE,{relatedTarget:this._element}),a=rn.Event(ln.SHOW,{relatedTarget:i});if(i&&rn(i).trigger(o),rn(this._element).trigger(a),!a.isDefaultPrevented()&&!o.isDefaultPrevented()){r&&(t=rn(r)[0]),this._activate(this._element,e);var l=function(){var t=rn.Event(ln.HIDDEN,{relatedTarget:n._element}),e=rn.Event(ln.SHOWN,{relatedTarget:i});rn(i).trigger(t),rn(n._element).trigger(e)};t?this._activate(t,t.parentNode,l):l()}}},t.dispose=function(){rn.removeData(this._element,sn),this._element=null},t._activate=function(t,e,n){var i=this,r=("UL"===e.nodeName?rn(e).find(pn):rn(e).children(mn))[0],s=n&&r&&rn(r).hasClass(fn),o=function(){return i._transitionComplete(t,r,n)};if(r&&s){var a=Cn.getTransitionDurationFromElement(r);rn(r).one(Cn.TRANSITION_END,o).emulateTransitionEnd(a)}else o()},t._transitionComplete=function(t,e,n){if(e){rn(e).removeClass(dn+" "+cn);var i=rn(e.parentNode).find(yn)[0];i&&rn(i).removeClass(cn),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}if(rn(t).addClass(cn),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),Cn.reflow(t),rn(t).addClass(dn),t.parentNode&&rn(t.parentNode).hasClass(hn)){var r=rn(t).closest(_n)[0];r&&rn(r).find(En).addClass(cn),t.setAttribute("aria-expanded",!0)}n&&n()},i._jQueryInterface=function(n){return this.each(function(){var t=rn(this),e=t.data(sn);if(e||(e=new i(this),t.data(sn,e)),"string"==typeof n){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n]()}})},o(i,null,[{key:"VERSION",get:function(){return"4.1.1"}}]),i}(),rn(document).on(ln.CLICK_DATA_API,vn,function(t){t.preventDefault(),Tn._jQueryInterface.call(rn(this),"show")}),rn.fn.tab=Tn._jQueryInterface,rn.fn.tab.Constructor=Tn,rn.fn.tab.noConflict=function(){return rn.fn.tab=an,Tn._jQueryInterface},Tn);!function(t){if("undefined"==typeof t)throw new TypeError("Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.");var e=t.fn.jquery.split(" ")[0].split(".");if(e[0]<2&&e[1]<9||1===e[0]&&9===e[1]&&e[2]<1||4<=e[0])throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(e),t.Util=Cn,t.Alert=In,t.Button=An,t.Carousel=Dn,t.Collapse=bn,t.Dropdown=Sn,t.Modal=wn,t.Popover=On,t.Scrollspy=kn,t.Tab=Pn,t.Tooltip=Nn,Object.defineProperty(t,"__esModule",{value:!0})}); +//# sourceMappingURL=bootstrap.min.js.map diff --git a/explorer/public/paper-dashboard/assets/js/core/jquery.min.js b/explorer/public/paper-dashboard/assets/js/core/jquery.min.js new file mode 100644 index 00000000000..644d35e274f --- /dev/null +++ b/explorer/public/paper-dashboard/assets/js/core/jquery.min.js @@ -0,0 +1,4 @@ +/*! jQuery v3.2.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.2.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c<b?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:h,sort:c.sort,splice:c.splice},r.extend=r.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||r.isFunction(g)||(g={}),h===i&&(g=this,h--);h<i;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(r.isPlainObject(d)||(e=Array.isArray(d)))?(e?(e=!1,f=c&&Array.isArray(c)?c:[]):f=c&&r.isPlainObject(c)?c:{},g[b]=r.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},r.extend({expando:"jQuery"+(q+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===r.type(a)},isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=r.type(a);return("number"===b||"string"===b)&&!isNaN(a-parseFloat(a))},isPlainObject:function(a){var b,c;return!(!a||"[object Object]"!==k.call(a))&&(!(b=e(a))||(c=l.call(b,"constructor")&&b.constructor,"function"==typeof c&&m.call(c)===n))},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?j[k.call(a)]||"object":typeof a},globalEval:function(a){p(a)},camelCase:function(a){return a.replace(t,"ms-").replace(u,v)},each:function(a,b){var c,d=0;if(w(a)){for(c=a.length;d<c;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(s,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(w(Object(a))?r.merge(c,"string"==typeof a?[a]:a):h.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:i.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;d<c;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;f<g;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,f=0,h=[];if(w(a))for(d=a.length;f<d;f++)e=b(a[f],f,c),null!=e&&h.push(e);else for(f in a)e=b(a[f],f,c),null!=e&&h.push(e);return g.apply([],h)},guid:1,proxy:function(a,b){var c,d,e;if("string"==typeof b&&(c=a[b],b=a,a=c),r.isFunction(a))return d=f.call(arguments,2),e=function(){return a.apply(b||this,d.concat(f.call(arguments)))},e.guid=a.guid=a.guid||r.guid++,e},now:Date.now,support:o}),"function"==typeof Symbol&&(r.fn[Symbol.iterator]=c[Symbol.iterator]),r.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){j["[object "+b+"]"]=b.toLowerCase()});function w(a){var b=!!a&&"length"in a&&a.length,c=r.type(a);return"function"!==c&&!r.isWindow(a)&&("array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",M="\\["+K+"*("+L+")(?:"+K+"*([*^$|!~]?=)"+K+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+L+"))|)"+K+"*\\]",N=":("+L+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+M+")*)|.*)\\)|)",O=new RegExp(K+"+","g"),P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c<b;c+=2)a.push(c);return a}),odd:pa(function(a,b){for(var c=1;c<b;c+=2)a.push(c);return a}),lt:pa(function(a,b,c){for(var d=c<0?c+b:c;--d>=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function ra(){}ra.prototype=d.filters=d.pseudos,d.setFilters=new ra,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=Q.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function sa(a){for(var b=0,c=a.length,d="";b<c;b++)d+=a[b].value;return d}function ta(a,b,c){var d=b.dir,e=b.next,f=e||d,g=c&&"parentNode"===f,h=x++;return b.first?function(b,c,e){while(b=b[d])if(1===b.nodeType||g)return a(b,c,e);return!1}:function(b,c,i){var j,k,l,m=[w,h];if(i){while(b=b[d])if((1===b.nodeType||g)&&a(b,c,i))return!0}else while(b=b[d])if(1===b.nodeType||g)if(l=b[u]||(b[u]={}),k=l[b.uniqueID]||(l[b.uniqueID]={}),e&&e===b.nodeName.toLowerCase())b=b[d]||b;else{if((j=k[f])&&j[0]===w&&j[1]===h)return m[2]=j[2];if(k[f]=m,m[2]=a(b,c,i))return!0}return!1}}function ua(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d<e;d++)ga(a,b[d],c);return c}function wa(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;h<i;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function xa(a,b,c,d,e,f){return d&&!d[u]&&(d=xa(d)),e&&!e[u]&&(e=xa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||va(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:wa(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=wa(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i<f;i++)if(c=d.relative[a[i].type])m=[ta(ua(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;e<f;e++)if(d.relative[a[e].type])break;return xa(i>1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i<e&&ya(a.slice(i,e)),e<f&&ya(a=a.slice(e)),e<f&&sa(a))}m.push(c)}return ua(m)}function za(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b<d;b++)if(r.contains(e[b],this))return!0}));for(c=this.pushStack([]),b=0;b<d;b++)r.find(a,e[b],c);return d>1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a<c;a++)if(r.contains(this,b[a]))return!0})},closest:function(a,b){var c,d=0,e=this.length,f=[],g="string"!=typeof a&&r(a);if(!A.test(a))for(;d<e;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){r.each(b,function(b,c){r.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==r.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return r.each(arguments,function(a,b){var c;while((c=r.inArray(b,f,c))>-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b<f)){if(a=d.apply(h,i),a===c.promise())throw new TypeError("Thenable self-resolution");j=a&&("object"==typeof a||"function"==typeof a)&&a.then,r.isFunction(j)?e?j.call(a,g(f,c,N,e),g(f,c,O,e)):(f++,j.call(a,g(f,c,N,e),g(f,c,O,e),g(f,c,N,c.notifyWith))):(d!==N&&(h=void 0,i=[a]),(e||c.resolveWith)(h,i))}},k=e?j:function(){try{j()}catch(a){r.Deferred.exceptionHook&&r.Deferred.exceptionHook(a,k.stackTrace),b+1>=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S), +a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h<i;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},U=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function V(){this.expando=r.expando+V.uid++}V.uid=1,V.prototype={cache:function(a){var b=a[this.expando];return b||(b={},U(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[r.camelCase(b)]=c;else for(d in b)e[r.camelCase(d)]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][r.camelCase(b)]},access:function(a,b,c){return void 0===b||b&&"string"==typeof b&&void 0===c?this.get(a,b):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d=a[this.expando];if(void 0!==d){if(void 0!==b){Array.isArray(b)?b=b.map(r.camelCase):(b=r.camelCase(b),b=b in d?[b]:b.match(L)||[]),c=b.length;while(c--)delete d[b[c]]}(void 0===b||r.isEmptyObject(d))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!r.isEmptyObject(b)}};var W=new V,X=new V,Y=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Z=/[A-Z]/g;function $(a){return"true"===a||"false"!==a&&("null"===a?null:a===+a+""?+a:Y.test(a)?JSON.parse(a):a)}function _(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Z,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c=$(c)}catch(e){}X.set(a,b,c)}else c=void 0;return c}r.extend({hasData:function(a){return X.hasData(a)||W.hasData(a)},data:function(a,b,c){return X.access(a,b,c)},removeData:function(a,b){X.remove(a,b)},_data:function(a,b,c){return W.access(a,b,c)},_removeData:function(a,b){W.remove(a,b)}}),r.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=X.get(f),1===f.nodeType&&!W.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=r.camelCase(d.slice(5)),_(f,d,e[d])));W.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){X.set(this,a)}):T(this,function(b){var c;if(f&&void 0===b){if(c=X.get(f,a),void 0!==c)return c;if(c=_(f,a),void 0!==c)return c}else this.each(function(){X.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?r.queue(this[0],a):void 0===b?this:this.each(function(){var c=r.queue(this,a,b);r._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&r.dequeue(this,a)})},dequeue:function(a){return this.each(function(){r.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=r.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=W.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var aa=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,ba=new RegExp("^(?:([+-])=|)("+aa+")([a-z%]*)$","i"),ca=["Top","Right","Bottom","Left"],da=function(a,b){return a=b||a,"none"===a.style.display||""===a.style.display&&r.contains(a.ownerDocument,a)&&"none"===r.css(a,"display")},ea=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};function fa(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return r.css(a,b,"")},i=h(),j=c&&c[3]||(r.cssNumber[b]?"":"px"),k=(r.cssNumber[b]||"px"!==j&&+i)&&ba.exec(r.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,r.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var ga={};function ha(a){var b,c=a.ownerDocument,d=a.nodeName,e=ga[d];return e?e:(b=c.body.appendChild(c.createElement(d)),e=r.css(b,"display"),b.parentNode.removeChild(b),"none"===e&&(e="block"),ga[d]=e,e)}function ia(a,b){for(var c,d,e=[],f=0,g=a.length;f<g;f++)d=a[f],d.style&&(c=d.style.display,b?("none"===c&&(e[f]=W.get(d,"display")||null,e[f]||(d.style.display="")),""===d.style.display&&da(d)&&(e[f]=ha(d))):"none"!==c&&(e[f]="none",W.set(d,"display",c)));for(f=0;f<g;f++)null!=e[f]&&(a[f].style.display=e[f]);return a}r.fn.extend({show:function(){return ia(this,!0)},hide:function(){return ia(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){da(this)?r(this).show():r(this).hide()})}});var ja=/^(?:checkbox|radio)$/i,ka=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c<d;c++)W.set(a[c],"globalEval",!b||W.get(b[c],"globalEval"))}var pa=/<|&#?\w+;/;function qa(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],n=0,o=a.length;n<o;n++)if(f=a[n],f||0===f)if("object"===r.type(f))r.merge(m,f.nodeType?[f]:f);else if(pa.test(f)){g=g||l.appendChild(b.createElement("div")),h=(ka.exec(f)||["",""])[1].toLowerCase(),i=ma[h]||ma._default,g.innerHTML=i[1]+r.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;r.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",n=0;while(f=m[n++])if(d&&r.inArray(f,d)>-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c<arguments.length;c++)i[c]=arguments[c];if(b.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,b)!==!1){h=r.event.handlers.call(this,b,j),c=0;while((f=h[c++])&&!b.isPropagationStopped()){b.currentTarget=f.elem,d=0;while((g=f.handlers[d++])&&!b.isImmediatePropagationStopped())b.rnamespace&&!b.rnamespace.test(g.namespace)||(b.handleObj=g,b.data=g.data,e=((r.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(b.result=e)===!1&&(b.preventDefault(),b.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,b),b.result}},handlers:function(a,b){var c,d,e,f,g,h=[],i=b.delegateCount,j=a.target;if(i&&j.nodeType&&!("click"===a.type&&a.button>=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c<i;c++)d=b[c],e=d.selector+" ",void 0===g[e]&&(g[e]=d.needsContext?r(e,this).index(j)>-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i<b.length&&h.push({elem:j,handlers:b.slice(i)}),h},addProp:function(a,b){Object.defineProperty(r.Event.prototype,a,{enumerable:!0,configurable:!0,get:r.isFunction(b)?function(){if(this.originalEvent)return b(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[a]},set:function(b){Object.defineProperty(this,a,{enumerable:!0,configurable:!0,writable:!0,value:b})}})},fix:function(a){return a[r.expando]?a:new r.Event(a)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==xa()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===xa()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&B(this,"input"))return this.click(),!1},_default:function(a){return B(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},r.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},r.Event=function(a,b){return this instanceof r.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?va:wa,this.target=a.target&&3===a.target.nodeType?a.target.parentNode:a.target,this.currentTarget=a.currentTarget,this.relatedTarget=a.relatedTarget):this.type=a,b&&r.extend(this,b),this.timeStamp=a&&a.timeStamp||r.now(),void(this[r.expando]=!0)):new r.Event(a,b)},r.Event.prototype={constructor:r.Event,isDefaultPrevented:wa,isPropagationStopped:wa,isImmediatePropagationStopped:wa,isSimulated:!1,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=va,a&&!this.isSimulated&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=va,a&&!this.isSimulated&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=va,a&&!this.isSimulated&&a.stopImmediatePropagation(),this.stopPropagation()}},r.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(a){var b=a.button;return null==a.which&&sa.test(a.type)?null!=a.charCode?a.charCode:a.keyCode:!a.which&&void 0!==b&&ta.test(a.type)?1&b?1:2&b?3:4&b?2:0:a.which}},r.event.addProp),r.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){r.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||r.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),r.fn.extend({on:function(a,b,c,d){return ya(this,a,b,c,d)},one:function(a,b,c,d){return ya(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,r(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=wa),this.each(function(){r.event.remove(this,a,c,b)})}});var za=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/<script|<style|<link/i,Ba=/checked\s*(?:[^=]|=\s*.checked.)/i,Ca=/^true\/(.*)/,Da=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Ea(a,b){return B(a,"table")&&B(11!==b.nodeType?b:b.firstChild,"tr")?r(">tbody",a)[0]||a:a}function Fa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ga(a){var b=Ca.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ha(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(W.hasData(a)&&(f=W.access(a),g=W.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c<d;c++)r.event.add(b,e,j[e][c])}X.hasData(a)&&(h=X.access(a),i=r.extend({},h),X.set(b,i))}}function Ia(a,b){var c=b.nodeName.toLowerCase();"input"===c&&ja.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function Ja(a,b,c,d){b=g.apply([],b);var e,f,h,i,j,k,l=0,m=a.length,n=m-1,q=b[0],s=r.isFunction(q);if(s||m>1&&"string"==typeof q&&!o.checkClone&&Ba.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ja(f,b,c,d)});if(m&&(e=qa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(na(e,"script"),Fa),i=h.length;l<m;l++)j=e,l!==n&&(j=r.clone(j,!0,!0),i&&r.merge(h,na(j,"script"))),c.call(a[l],j,l);if(i)for(k=h[h.length-1].ownerDocument,r.map(h,Ga),l=0;l<i;l++)j=h[l],la.test(j.type||"")&&!W.access(j,"globalEval")&&r.contains(k,j)&&(j.src?r._evalUrl&&r._evalUrl(j.src):p(j.textContent.replace(Da,""),k))}return a}function Ka(a,b,c){for(var d,e=b?r.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||r.cleanData(na(d)),d.parentNode&&(c&&r.contains(d.ownerDocument,d)&&oa(na(d,"script")),d.parentNode.removeChild(d));return a}r.extend({htmlPrefilter:function(a){return a.replace(za,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=na(h),f=na(a),d=0,e=f.length;d<e;d++)Ia(f[d],g[d]);if(b)if(c)for(f=f||na(a),g=g||na(h),d=0,e=f.length;d<e;d++)Ha(f[d],g[d]);else Ha(a,h);return g=na(h,"script"),g.length>0&&oa(g,!i&&na(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(U(c)){if(b=c[W.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[W.expando]=void 0}c[X.expando]&&(c[X.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ka(this,a,!0)},remove:function(a){return Ka(this,a)},text:function(a){return T(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.appendChild(a)}})},prepend:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(na(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return T(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Aa.test(a)&&!ma[(ka.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c<d;c++)b=this[c]||{},1===b.nodeType&&(r.cleanData(na(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ja(this,arguments,function(b){var c=this.parentNode;r.inArray(this,a)<0&&(r.cleanData(na(this)),c&&c.replaceChild(b,this))},a)}}),r.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){r.fn[a]=function(a){for(var c,d=[],e=r(a),f=e.length-1,g=0;g<=f;g++)c=g===f?this:this.clone(!0),r(e[g])[b](c),h.apply(d,c.get());return this.pushStack(d)}});var La=/^margin/,Ma=new RegExp("^("+aa+")(?!px)[a-z%]+$","i"),Na=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)};!function(){function b(){if(i){i.style.cssText="box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",i.innerHTML="",ra.appendChild(h);var b=a.getComputedStyle(i);c="1%"!==b.top,g="2px"===b.marginLeft,e="4px"===b.width,i.style.marginRight="50%",f="4px"===b.marginRight,ra.removeChild(h),i=null}}var c,e,f,g,h=d.createElement("div"),i=d.createElement("div");i.style&&(i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",o.clearCloneStyle="content-box"===i.style.backgroundClip,h.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",h.appendChild(i),r.extend(o,{pixelPosition:function(){return b(),c},boxSizingReliable:function(){return b(),e},pixelMarginRight:function(){return b(),f},reliableMarginLeft:function(){return b(),g}}))}();function Oa(a,b,c){var d,e,f,g,h=a.style;return c=c||Na(a),c&&(g=c.getPropertyValue(b)||c[b],""!==g||r.contains(a.ownerDocument,a)||(g=r.style(a,b)),!o.pixelMarginRight()&&Ma.test(g)&&La.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function Pa(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Qa=/^(none|table(?!-c[ea]).+)/,Ra=/^--/,Sa={position:"absolute",visibility:"hidden",display:"block"},Ta={letterSpacing:"0",fontWeight:"400"},Ua=["Webkit","Moz","ms"],Va=d.createElement("div").style;function Wa(a){if(a in Va)return a;var b=a[0].toUpperCase()+a.slice(1),c=Ua.length;while(c--)if(a=Ua[c]+b,a in Va)return a}function Xa(a){var b=r.cssProps[a];return b||(b=r.cssProps[a]=Wa(a)||a),b}function Ya(a,b,c){var d=ba.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Za(a,b,c,d,e){var f,g=0;for(f=c===(d?"border":"content")?4:"width"===b?1:0;f<4;f+=2)"margin"===c&&(g+=r.css(a,c+ca[f],!0,e)),d?("content"===c&&(g-=r.css(a,"padding"+ca[f],!0,e)),"margin"!==c&&(g-=r.css(a,"border"+ca[f]+"Width",!0,e))):(g+=r.css(a,"padding"+ca[f],!0,e),"padding"!==c&&(g+=r.css(a,"border"+ca[f]+"Width",!0,e)));return g}function $a(a,b,c){var d,e=Na(a),f=Oa(a,b,e),g="border-box"===r.css(a,"boxSizing",!1,e);return Ma.test(f)?f:(d=g&&(o.boxSizingReliable()||f===a.style[b]),"auto"===f&&(f=a["offset"+b[0].toUpperCase()+b.slice(1)]),f=parseFloat(f)||0,f+Za(a,b,c||(g?"border":"content"),d,e)+"px")}r.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Oa(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=r.camelCase(b),i=Ra.test(b),j=a.style;return i||(b=Xa(h)),g=r.cssHooks[b]||r.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:j[b]:(f=typeof c,"string"===f&&(e=ba.exec(c))&&e[1]&&(c=fa(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(r.cssNumber[h]?"":"px")),o.clearCloneStyle||""!==c||0!==b.indexOf("background")||(j[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i?j.setProperty(b,c):j[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=r.camelCase(b),i=Ra.test(b);return i||(b=Xa(h)),g=r.cssHooks[b]||r.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Oa(a,b,d)),"normal"===e&&b in Ta&&(e=Ta[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),r.each(["height","width"],function(a,b){r.cssHooks[b]={get:function(a,c,d){if(c)return!Qa.test(r.css(a,"display"))||a.getClientRects().length&&a.getBoundingClientRect().width?$a(a,b,d):ea(a,Sa,function(){return $a(a,b,d)})},set:function(a,c,d){var e,f=d&&Na(a),g=d&&Za(a,b,d,"border-box"===r.css(a,"boxSizing",!1,f),f);return g&&(e=ba.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=r.css(a,b)),Ya(a,c,g)}}}),r.cssHooks.marginLeft=Pa(o.reliableMarginLeft,function(a,b){if(b)return(parseFloat(Oa(a,"marginLeft"))||a.getBoundingClientRect().left-ea(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px"}),r.each({margin:"",padding:"",border:"Width"},function(a,b){r.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];d<4;d++)e[a+ca[d]+b]=f[d]||f[d-2]||f[0];return e}},La.test(a)||(r.cssHooks[a+b].set=Ya)}),r.fn.extend({css:function(a,b){return T(this,function(a,b,c){var d,e,f={},g=0;if(Array.isArray(b)){for(d=Na(a),e=b.length;g<e;g++)f[b[g]]=r.css(a,b[g],!1,d);return f}return void 0!==c?r.style(a,b,c):r.css(a,b)},a,b,arguments.length>1)}});function _a(a,b,c,d,e){return new _a.prototype.init(a,b,c,d,e)}r.Tween=_a,_a.prototype={constructor:_a,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=_a.propHooks[this.prop];return a&&a.get?a.get(this):_a.propHooks._default.get(this)},run:function(a){var b,c=_a.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):_a.propHooks._default.set(this),this}},_a.prototype.init.prototype=_a.prototype,_a.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},_a.propHooks.scrollTop=_a.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=_a.prototype.init,r.fx.step={};var ab,bb,cb=/^(?:toggle|show|hide)$/,db=/queueHooks$/;function eb(){bb&&(d.hidden===!1&&a.requestAnimationFrame?a.requestAnimationFrame(eb):a.setTimeout(eb,r.fx.interval),r.fx.tick())}function fb(){return a.setTimeout(function(){ab=void 0}),ab=r.now()}function gb(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ca[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function hb(a,b,c){for(var d,e=(kb.tweeners[b]||[]).concat(kb.tweeners["*"]),f=0,g=e.length;f<g;f++)if(d=e[f].call(c,b,a))return d}function ib(a,b,c){var d,e,f,g,h,i,j,k,l="width"in b||"height"in b,m=this,n={},o=a.style,p=a.nodeType&&da(a),q=W.get(a,"fxshow");c.queue||(g=r._queueHooks(a,"fx"),null==g.unqueued&&(g.unqueued=0,h=g.empty.fire,g.empty.fire=function(){g.unqueued||h()}),g.unqueued++,m.always(function(){m.always(function(){g.unqueued--,r.queue(a,"fx").length||g.empty.fire()})}));for(d in b)if(e=b[d],cb.test(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}n[d]=q&&q[d]||r.style(a,d)}if(i=!r.isEmptyObject(b),i||!r.isEmptyObject(n)){l&&1===a.nodeType&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=q&&q.display,null==j&&(j=W.get(a,"display")),k=r.css(a,"display"),"none"===k&&(j?k=j:(ia([a],!0),j=a.style.display||j,k=r.css(a,"display"),ia([a]))),("inline"===k||"inline-block"===k&&null!=j)&&"none"===r.css(a,"float")&&(i||(m.done(function(){o.display=j}),null==j&&(k=o.display,j="none"===k?"":k)),o.display="inline-block")),c.overflow&&(o.overflow="hidden",m.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]})),i=!1;for(d in n)i||(q?"hidden"in q&&(p=q.hidden):q=W.access(a,"fxshow",{display:j}),f&&(q.hidden=!p),p&&ia([a],!0),m.done(function(){p||ia([a]),W.remove(a,"fxshow");for(d in n)r.style(a,d,n[d])})),i=hb(p?q[d]:0,d,m),d in q||(q[d]=i.start,p&&(i.end=i.start,i.start=0))}}function jb(a,b){var c,d,e,f,g;for(c in a)if(d=r.camelCase(c),e=b[d],f=a[c],Array.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=r.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kb(a,b,c){var d,e,f=0,g=kb.prefilters.length,h=r.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=ab||fb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;g<i;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),f<1&&i?c:(i||h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:r.extend({},b),opts:r.extend(!0,{specialEasing:{},easing:r.easing._default},c),originalProperties:b,originalOptions:c,startTime:ab||fb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=r.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;c<d;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jb(k,j.opts.specialEasing);f<g;f++)if(d=kb.prefilters[f].call(j,a,k,j.opts))return r.isFunction(d.stop)&&(r._queueHooks(j.elem,j.opts.queue).stop=r.proxy(d.stop,d)),d;return r.map(k,hb,j),r.isFunction(j.opts.start)&&j.opts.start.call(a,j),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always),r.fx.timer(r.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j}r.Animation=r.extend(kb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return fa(c.elem,a,ba.exec(b),c),c}]},tweener:function(a,b){r.isFunction(a)?(b=a,a=["*"]):a=a.match(L);for(var c,d=0,e=a.length;d<e;d++)c=a[d],kb.tweeners[c]=kb.tweeners[c]||[],kb.tweeners[c].unshift(b)},prefilters:[ib],prefilter:function(a,b){b?kb.prefilters.unshift(a):kb.prefilters.push(a)}}),r.speed=function(a,b,c){var d=a&&"object"==typeof a?r.extend({},a):{complete:c||!c&&b||r.isFunction(a)&&a,duration:a,easing:c&&b||b&&!r.isFunction(b)&&b};return r.fx.off?d.duration=0:"number"!=typeof d.duration&&(d.duration in r.fx.speeds?d.duration=r.fx.speeds[d.duration]:d.duration=r.fx.speeds._default),null!=d.queue&&d.queue!==!0||(d.queue="fx"),d.old=d.complete,d.complete=function(){r.isFunction(d.old)&&d.old.call(this),d.queue&&r.dequeue(this,d.queue)},d},r.fn.extend({fadeTo:function(a,b,c,d){return this.filter(da).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=r.isEmptyObject(a),f=r.speed(b,c,d),g=function(){var b=kb(this,r.extend({},a),f);(e||W.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=r.timers,g=W.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&db.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||r.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=W.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=r.timers,g=d?d.length:0;for(c.finish=!0,r.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;b<g;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),r.each(["toggle","show","hide"],function(a,b){var c=r.fn[b];r.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gb(b,!0),a,d,e)}}),r.each({slideDown:gb("show"),slideUp:gb("hide"),slideToggle:gb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){r.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),r.timers=[],r.fx.tick=function(){var a,b=0,c=r.timers;for(ab=r.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||r.fx.stop(),ab=void 0},r.fx.timer=function(a){r.timers.push(a),r.fx.start()},r.fx.interval=13,r.fx.start=function(){bb||(bb=!0,eb())},r.fx.stop=function(){bb=null},r.fx.speeds={slow:600,fast:200,_default:400},r.fn.delay=function(b,c){return b=r.fx?r.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",o.checkOn=""!==a.value,o.optSelected=c.selected,a=d.createElement("input"),a.value="t",a.type="radio",o.radioValue="t"===a.value}();var lb,mb=r.expr.attrHandle;r.fn.extend({attr:function(a,b){return T(this,r.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?lb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b), +null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&B(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(L);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),lb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=mb[b]||r.find.attr;mb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=mb[g],mb[g]=e,e=null!=c(a,b,d)?g:null,mb[g]=f),e}});var nb=/^(?:input|select|textarea|button)$/i,ob=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return T(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):nb.test(a.nodeName)||ob.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function pb(a){var b=a.match(L)||[];return b.join(" ")}function qb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,qb(this)))});if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,qb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,qb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(L)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=qb(this),b&&W.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":W.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+pb(qb(c))+" ").indexOf(b)>-1)return!0;return!1}});var rb=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:pb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d<i;d++)if(c=e[d],(c.selected||d===f)&&!c.disabled&&(!c.parentNode.disabled||!B(c.parentNode,"optgroup"))){if(b=r(c).val(),g)return b;h.push(b)}return h},set:function(a,b){var c,d,e=a.options,f=r.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=r.inArray(r.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var sb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!sb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,sb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(W.get(h,"events")||{})[b.type]&&W.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&U(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!U(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=W.access(d,b);e||d.addEventListener(a,c,!0),W.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=W.access(d,b)-1;e?W.access(d,b,e):(d.removeEventListener(a,c,!0),W.remove(d,b))}}});var tb=a.location,ub=r.now(),vb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(Array.isArray(b))r.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(Array.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!ja.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:Array.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}});var Bb=/%20/g,Cb=/#.*$/,Db=/([?&])_=[^&]*/,Eb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Fb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Gb=/^(?:GET|HEAD)$/,Hb=/^\/\//,Ib={},Jb={},Kb="*/".concat("*"),Lb=d.createElement("a");Lb.href=tb.href;function Mb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(L)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Nb(a,b,c,d){var e={},f=a===Jb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Ob(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Pb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Qb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:tb.href,type:"GET",isLocal:Fb.test(tb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Kb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Ob(Ob(a,r.ajaxSettings),b):Ob(r.ajaxSettings,a)},ajaxPrefilter:Mb(Ib),ajaxTransport:Mb(Jb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Eb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||tb.href)+"").replace(Hb,tb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(L)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Lb.protocol+"//"+Lb.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Nb(Ib,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Gb.test(o.type),f=o.url.replace(Cb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(Bb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(vb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Db,"$1"),n=(vb.test(f)?"&":"?")+"_="+ub++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Kb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Nb(Jb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Pb(o,y,d)),v=Qb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Rb={0:200,1223:204},Sb=r.ajaxSettings.xhr();o.cors=!!Sb&&"withCredentials"in Sb,o.ajax=Sb=!!Sb,r.ajaxTransport(function(b){var c,d;if(o.cors||Sb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Rb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r("<script>").prop({charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&f("error"===a.type?404:200,a.type)}),d.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Tb=[],Ub=/(=)\?(?=&|$)|\?\?/;r.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Tb.pop()||r.expando+"_"+ub++;return this[a]=!0,a}}),r.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Ub.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ub.test(b.data)&&"data");if(h||"jsonp"===b.dataTypes[0])return e=b.jsonpCallback=r.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Ub,"$1"+e):b.jsonp!==!1&&(b.url+=(vb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||r.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?r(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Tb.push(e)),g&&r.isFunction(f)&&f(g[0]),g=f=void 0}),"script"}),o.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="<form></form><form></form>",2===a.childNodes.length}(),r.parseHTML=function(a,b,c){if("string"!=typeof a)return[];"boolean"==typeof b&&(c=b,b=!1);var e,f,g;return b||(o.createHTMLDocument?(b=d.implementation.createHTMLDocument(""),e=b.createElement("base"),e.href=d.location.href,b.head.appendChild(e)):b=d),f=C.exec(a),g=!c&&[],f?[b.createElement(f[1])]:(f=qa([a],b,g),g&&g.length&&r(g).remove(),r.merge([],f.childNodes))},r.fn.load=function(a,b,c){var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=pb(a.slice(h)),a=a.slice(0,h)),r.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&r.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?r("<div>").append(r.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},r.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){r.fn[b]=function(a){return this.on(b,a)}}),r.expr.pseudos.animated=function(a){return r.grep(r.timers,function(b){return a===b.elem}).length},r.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=r.css(a,"position"),l=r(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=r.css(a,"top"),i=r.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),r.isFunction(b)&&(b=b.call(a,c,r.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},r.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){r.offset.setOffset(this,a,b)});var b,c,d,e,f=this[0];if(f)return f.getClientRects().length?(d=f.getBoundingClientRect(),b=f.ownerDocument,c=b.documentElement,e=b.defaultView,{top:d.top+e.pageYOffset-c.clientTop,left:d.left+e.pageXOffset-c.clientLeft}):{top:0,left:0}},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===r.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),B(a[0],"html")||(d=a.offset()),d={top:d.top+r.css(a[0],"borderTopWidth",!0),left:d.left+r.css(a[0],"borderLeftWidth",!0)}),{top:b.top-d.top-r.css(c,"marginTop",!0),left:b.left-d.left-r.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===r.css(a,"position"))a=a.offsetParent;return a||ra})}}),r.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;r.fn[a]=function(d){return T(this,function(a,d,e){var f;return r.isWindow(a)?f=a:9===a.nodeType&&(f=a.defaultView),void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),r.each(["top","left"],function(a,b){r.cssHooks[b]=Pa(o.pixelPosition,function(a,c){if(c)return c=Oa(a,b),Ma.test(c)?r(a).position()[b]+"px":c})}),r.each({Height:"height",Width:"width"},function(a,b){r.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){r.fn[d]=function(e,f){var g=arguments.length&&(c||"boolean"!=typeof e),h=c||(e===!0||f===!0?"margin":"border");return T(this,function(b,c,e){var f;return r.isWindow(b)?0===d.indexOf("outer")?b["inner"+a]:b.document.documentElement["client"+a]:9===b.nodeType?(f=b.documentElement,Math.max(b.body["scroll"+a],f["scroll"+a],b.body["offset"+a],f["offset"+a],f["client"+a])):void 0===e?r.css(b,c,h):r.style(b,c,e,h)},b,g?e:void 0,g)}})}),r.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),r.holdReady=function(a){a?r.readyWait++:r.ready(!0)},r.isArray=Array.isArray,r.parseJSON=JSON.parse,r.nodeName=B,"function"==typeof define&&define.amd&&define("jquery",[],function(){return r});var Vb=a.jQuery,Wb=a.$;return r.noConflict=function(b){return a.$===r&&(a.$=Wb),b&&a.jQuery===r&&(a.jQuery=Vb),r},b||(a.jQuery=a.$=r),r}); diff --git a/explorer/public/paper-dashboard/assets/js/core/popper.min.js b/explorer/public/paper-dashboard/assets/js/core/popper.min.js new file mode 100644 index 00000000000..ce33a863d3d --- /dev/null +++ b/explorer/public/paper-dashboard/assets/js/core/popper.min.js @@ -0,0 +1,4 @@ +/* + Copyright (C) Federico Zivolo 2017 + Distributed under the MIT License (license terms are at http://opensource.org/licenses/MIT). + */(function(e,t){'object'==typeof exports&&'undefined'!=typeof module?module.exports=t():'function'==typeof define&&define.amd?define(t):e.Popper=t()})(this,function(){'use strict';function e(e){return e&&'[object Function]'==={}.toString.call(e)}function t(e,t){if(1!==e.nodeType)return[];var o=window.getComputedStyle(e,null);return t?o[t]:o}function o(e){return'HTML'===e.nodeName?e:e.parentNode||e.host}function n(e){if(!e||-1!==['HTML','BODY','#document'].indexOf(e.nodeName))return window.document.body;var i=t(e),r=i.overflow,p=i.overflowX,s=i.overflowY;return /(auto|scroll)/.test(r+s+p)?e:n(o(e))}function r(e){var o=e&&e.offsetParent,i=o&&o.nodeName;return i&&'BODY'!==i&&'HTML'!==i?-1!==['TD','TABLE'].indexOf(o.nodeName)&&'static'===t(o,'position')?r(o):o:window.document.documentElement}function p(e){var t=e.nodeName;return'BODY'!==t&&('HTML'===t||r(e.firstElementChild)===e)}function s(e){return null===e.parentNode?e:s(e.parentNode)}function d(e,t){if(!e||!e.nodeType||!t||!t.nodeType)return window.document.documentElement;var o=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,i=o?e:t,n=o?t:e,a=document.createRange();a.setStart(i,0),a.setEnd(n,0);var f=a.commonAncestorContainer;if(e!==f&&t!==f||i.contains(n))return p(f)?f:r(f);var l=s(e);return l.host?d(l.host,t):d(e,s(t).host)}function a(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:'top',o='top'===t?'scrollTop':'scrollLeft',i=e.nodeName;if('BODY'===i||'HTML'===i){var n=window.document.documentElement,r=window.document.scrollingElement||n;return r[o]}return e[o]}function f(e,t){var o=2<arguments.length&&void 0!==arguments[2]&&arguments[2],i=a(t,'top'),n=a(t,'left'),r=o?-1:1;return e.top+=i*r,e.bottom+=i*r,e.left+=n*r,e.right+=n*r,e}function l(e,t){var o='x'===t?'Left':'Top',i='Left'==o?'Right':'Bottom';return+e['border'+o+'Width'].split('px')[0]+ +e['border'+i+'Width'].split('px')[0]}function m(e,t,o,i){return _(t['offset'+e],o['client'+e],o['offset'+e],ie()?o['offset'+e]+i['margin'+('Height'===e?'Top':'Left')]+i['margin'+('Height'===e?'Bottom':'Right')]:0)}function h(){var e=window.document.body,t=window.document.documentElement,o=ie()&&window.getComputedStyle(t);return{height:m('Height',e,t,o),width:m('Width',e,t,o)}}function c(e){return se({},e,{right:e.left+e.width,bottom:e.top+e.height})}function g(e){var o={};if(ie())try{o=e.getBoundingClientRect();var i=a(e,'top'),n=a(e,'left');o.top+=i,o.left+=n,o.bottom+=i,o.right+=n}catch(e){}else o=e.getBoundingClientRect();var r={left:o.left,top:o.top,width:o.right-o.left,height:o.bottom-o.top},p='HTML'===e.nodeName?h():{},s=p.width||e.clientWidth||r.right-r.left,d=p.height||e.clientHeight||r.bottom-r.top,f=e.offsetWidth-s,m=e.offsetHeight-d;if(f||m){var g=t(e);f-=l(g,'x'),m-=l(g,'y'),r.width-=f,r.height-=m}return c(r)}function u(e,o){var i=ie(),r='HTML'===o.nodeName,p=g(e),s=g(o),d=n(e),a=t(o),l=+a.borderTopWidth.split('px')[0],m=+a.borderLeftWidth.split('px')[0],h=c({top:p.top-s.top-l,left:p.left-s.left-m,width:p.width,height:p.height});if(h.marginTop=0,h.marginLeft=0,!i&&r){var u=+a.marginTop.split('px')[0],b=+a.marginLeft.split('px')[0];h.top-=l-u,h.bottom-=l-u,h.left-=m-b,h.right-=m-b,h.marginTop=u,h.marginLeft=b}return(i?o.contains(d):o===d&&'BODY'!==d.nodeName)&&(h=f(h,o)),h}function b(e){var t=window.document.documentElement,o=u(e,t),i=_(t.clientWidth,window.innerWidth||0),n=_(t.clientHeight,window.innerHeight||0),r=a(t),p=a(t,'left'),s={top:r-o.top+o.marginTop,left:p-o.left+o.marginLeft,width:i,height:n};return c(s)}function y(e){var i=e.nodeName;return'BODY'===i||'HTML'===i?!1:'fixed'===t(e,'position')||y(o(e))}function w(e,t,i,r){var p={top:0,left:0},s=d(e,t);if('viewport'===r)p=b(s);else{var a;'scrollParent'===r?(a=n(o(e)),'BODY'===a.nodeName&&(a=window.document.documentElement)):'window'===r?a=window.document.documentElement:a=r;var f=u(a,s);if('HTML'===a.nodeName&&!y(s)){var l=h(),m=l.height,c=l.width;p.top+=f.top-f.marginTop,p.bottom=m+f.top,p.left+=f.left-f.marginLeft,p.right=c+f.left}else p=f}return p.left+=i,p.top+=i,p.right-=i,p.bottom-=i,p}function v(e){var t=e.width,o=e.height;return t*o}function E(e,t,o,i,n){var r=5<arguments.length&&void 0!==arguments[5]?arguments[5]:0;if(-1===e.indexOf('auto'))return e;var p=w(o,i,r,n),s={top:{width:p.width,height:t.top-p.top},right:{width:p.right-t.right,height:p.height},bottom:{width:p.width,height:p.bottom-t.bottom},left:{width:t.left-p.left,height:p.height}},d=Object.keys(s).map(function(e){return se({key:e},s[e],{area:v(s[e])})}).sort(function(e,t){return t.area-e.area}),a=d.filter(function(e){var t=e.width,i=e.height;return t>=o.clientWidth&&i>=o.clientHeight}),f=0<a.length?a[0].key:d[0].key,l=e.split('-')[1];return f+(l?'-'+l:'')}function x(e,t,o){var i=d(t,o);return u(o,i)}function O(e){var t=window.getComputedStyle(e),o=parseFloat(t.marginTop)+parseFloat(t.marginBottom),i=parseFloat(t.marginLeft)+parseFloat(t.marginRight),n={width:e.offsetWidth+i,height:e.offsetHeight+o};return n}function L(e){var t={left:'right',right:'left',bottom:'top',top:'bottom'};return e.replace(/left|right|bottom|top/g,function(e){return t[e]})}function S(e,t,o){o=o.split('-')[0];var i=O(e),n={width:i.width,height:i.height},r=-1!==['right','left'].indexOf(o),p=r?'top':'left',s=r?'left':'top',d=r?'height':'width',a=r?'width':'height';return n[p]=t[p]+t[d]/2-i[d]/2,n[s]=o===s?t[s]-i[a]:t[L(s)],n}function T(e,t){return Array.prototype.find?e.find(t):e.filter(t)[0]}function C(e,t,o){if(Array.prototype.findIndex)return e.findIndex(function(e){return e[t]===o});var i=T(e,function(e){return e[t]===o});return e.indexOf(i)}function N(t,o,i){var n=void 0===i?t:t.slice(0,C(t,'name',i));return n.forEach(function(t){t.function&&console.warn('`modifier.function` is deprecated, use `modifier.fn`!');var i=t.function||t.fn;t.enabled&&e(i)&&(o.offsets.popper=c(o.offsets.popper),o.offsets.reference=c(o.offsets.reference),o=i(o,t))}),o}function k(){if(!this.state.isDestroyed){var e={instance:this,styles:{},attributes:{},flipped:!1,offsets:{}};e.offsets.reference=x(this.state,this.popper,this.reference),e.placement=E(this.options.placement,e.offsets.reference,this.popper,this.reference,this.options.modifiers.flip.boundariesElement,this.options.modifiers.flip.padding),e.originalPlacement=e.placement,e.offsets.popper=S(this.popper,e.offsets.reference,e.placement),e.offsets.popper.position='absolute',e=N(this.modifiers,e),this.state.isCreated?this.options.onUpdate(e):(this.state.isCreated=!0,this.options.onCreate(e))}}function W(e,t){return e.some(function(e){var o=e.name,i=e.enabled;return i&&o===t})}function B(e){for(var t=[!1,'ms','Webkit','Moz','O'],o=e.charAt(0).toUpperCase()+e.slice(1),n=0;n<t.length-1;n++){var i=t[n],r=i?''+i+o:e;if('undefined'!=typeof window.document.body.style[r])return r}return null}function D(){return this.state.isDestroyed=!0,W(this.modifiers,'applyStyle')&&(this.popper.removeAttribute('x-placement'),this.popper.style.left='',this.popper.style.position='',this.popper.style.top='',this.popper.style[B('transform')]=''),this.disableEventListeners(),this.options.removeOnDestroy&&this.popper.parentNode.removeChild(this.popper),this}function H(e,t,o,i){var r='BODY'===e.nodeName,p=r?window:e;p.addEventListener(t,o,{passive:!0}),r||H(n(p.parentNode),t,o,i),i.push(p)}function P(e,t,o,i){o.updateBound=i,window.addEventListener('resize',o.updateBound,{passive:!0});var r=n(e);return H(r,'scroll',o.updateBound,o.scrollParents),o.scrollElement=r,o.eventsEnabled=!0,o}function A(){this.state.eventsEnabled||(this.state=P(this.reference,this.options,this.state,this.scheduleUpdate))}function M(e,t){return window.removeEventListener('resize',t.updateBound),t.scrollParents.forEach(function(e){e.removeEventListener('scroll',t.updateBound)}),t.updateBound=null,t.scrollParents=[],t.scrollElement=null,t.eventsEnabled=!1,t}function I(){this.state.eventsEnabled&&(window.cancelAnimationFrame(this.scheduleUpdate),this.state=M(this.reference,this.state))}function R(e){return''!==e&&!isNaN(parseFloat(e))&&isFinite(e)}function U(e,t){Object.keys(t).forEach(function(o){var i='';-1!==['width','height','top','right','bottom','left'].indexOf(o)&&R(t[o])&&(i='px'),e.style[o]=t[o]+i})}function Y(e,t){Object.keys(t).forEach(function(o){var i=t[o];!1===i?e.removeAttribute(o):e.setAttribute(o,t[o])})}function F(e,t,o){var i=T(e,function(e){var o=e.name;return o===t}),n=!!i&&e.some(function(e){return e.name===o&&e.enabled&&e.order<i.order});if(!n){var r='`'+t+'`';console.warn('`'+o+'`'+' modifier is required by '+r+' modifier in order to work, be sure to include it before '+r+'!')}return n}function j(e){return'end'===e?'start':'start'===e?'end':e}function K(e){var t=1<arguments.length&&void 0!==arguments[1]&&arguments[1],o=ae.indexOf(e),i=ae.slice(o+1).concat(ae.slice(0,o));return t?i.reverse():i}function q(e,t,o,i){var n=e.match(/((?:\-|\+)?\d*\.?\d*)(.*)/),r=+n[1],p=n[2];if(!r)return e;if(0===p.indexOf('%')){var s;switch(p){case'%p':s=o;break;case'%':case'%r':default:s=i;}var d=c(s);return d[t]/100*r}if('vh'===p||'vw'===p){var a;return a='vh'===p?_(document.documentElement.clientHeight,window.innerHeight||0):_(document.documentElement.clientWidth,window.innerWidth||0),a/100*r}return r}function G(e,t,o,i){var n=[0,0],r=-1!==['right','left'].indexOf(i),p=e.split(/(\+|\-)/).map(function(e){return e.trim()}),s=p.indexOf(T(p,function(e){return-1!==e.search(/,|\s/)}));p[s]&&-1===p[s].indexOf(',')&&console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');var d=/\s*,\s*|\s+/,a=-1===s?[p]:[p.slice(0,s).concat([p[s].split(d)[0]]),[p[s].split(d)[1]].concat(p.slice(s+1))];return a=a.map(function(e,i){var n=(1===i?!r:r)?'height':'width',p=!1;return e.reduce(function(e,t){return''===e[e.length-1]&&-1!==['+','-'].indexOf(t)?(e[e.length-1]=t,p=!0,e):p?(e[e.length-1]+=t,p=!1,e):e.concat(t)},[]).map(function(e){return q(e,n,t,o)})}),a.forEach(function(e,t){e.forEach(function(o,i){R(o)&&(n[t]+=o*('-'===e[i-1]?-1:1))})}),n}for(var z=Math.min,V=Math.floor,_=Math.max,X=['native code','[object MutationObserverConstructor]'],Q=function(e){return X.some(function(t){return-1<(e||'').toString().indexOf(t)})},J='undefined'!=typeof window,Z=['Edge','Trident','Firefox'],$=0,ee=0;ee<Z.length;ee+=1)if(J&&0<=navigator.userAgent.indexOf(Z[ee])){$=1;break}var i,te=J&&Q(window.MutationObserver),oe=te?function(e){var t=!1,o=0,i=document.createElement('span'),n=new MutationObserver(function(){e(),t=!1});return n.observe(i,{attributes:!0}),function(){t||(t=!0,i.setAttribute('x-index',o),++o)}}:function(e){var t=!1;return function(){t||(t=!0,setTimeout(function(){t=!1,e()},$))}},ie=function(){return void 0==i&&(i=-1!==navigator.appVersion.indexOf('MSIE 10')),i},ne=function(e,t){if(!(e instanceof t))throw new TypeError('Cannot call a class as a function')},re=function(){function e(e,t){for(var o,n=0;n<t.length;n++)o=t[n],o.enumerable=o.enumerable||!1,o.configurable=!0,'value'in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}return function(t,o,i){return o&&e(t.prototype,o),i&&e(t,i),t}}(),pe=function(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e},se=Object.assign||function(e){for(var t,o=1;o<arguments.length;o++)for(var i in t=arguments[o],t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e},de=['auto-start','auto','auto-end','top-start','top','top-end','right-start','right','right-end','bottom-end','bottom','bottom-start','left-end','left','left-start'],ae=de.slice(3),fe={FLIP:'flip',CLOCKWISE:'clockwise',COUNTERCLOCKWISE:'counterclockwise'},le=function(){function t(o,i){var n=this,r=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{};ne(this,t),this.scheduleUpdate=function(){return requestAnimationFrame(n.update)},this.update=oe(this.update.bind(this)),this.options=se({},t.Defaults,r),this.state={isDestroyed:!1,isCreated:!1,scrollParents:[]},this.reference=o.jquery?o[0]:o,this.popper=i.jquery?i[0]:i,this.options.modifiers={},Object.keys(se({},t.Defaults.modifiers,r.modifiers)).forEach(function(e){n.options.modifiers[e]=se({},t.Defaults.modifiers[e]||{},r.modifiers?r.modifiers[e]:{})}),this.modifiers=Object.keys(this.options.modifiers).map(function(e){return se({name:e},n.options.modifiers[e])}).sort(function(e,t){return e.order-t.order}),this.modifiers.forEach(function(t){t.enabled&&e(t.onLoad)&&t.onLoad(n.reference,n.popper,n.options,t,n.state)}),this.update();var p=this.options.eventsEnabled;p&&this.enableEventListeners(),this.state.eventsEnabled=p}return re(t,[{key:'update',value:function(){return k.call(this)}},{key:'destroy',value:function(){return D.call(this)}},{key:'enableEventListeners',value:function(){return A.call(this)}},{key:'disableEventListeners',value:function(){return I.call(this)}}]),t}();return le.Utils=('undefined'==typeof window?global:window).PopperUtils,le.placements=de,le.Defaults={placement:'bottom',eventsEnabled:!0,removeOnDestroy:!1,onCreate:function(){},onUpdate:function(){},modifiers:{shift:{order:100,enabled:!0,fn:function(e){var t=e.placement,o=t.split('-')[0],i=t.split('-')[1];if(i){var n=e.offsets,r=n.reference,p=n.popper,s=-1!==['bottom','top'].indexOf(o),d=s?'left':'top',a=s?'width':'height',f={start:pe({},d,r[d]),end:pe({},d,r[d]+r[a]-p[a])};e.offsets.popper=se({},p,f[i])}return e}},offset:{order:200,enabled:!0,fn:function(e,t){var o,i=t.offset,n=e.placement,r=e.offsets,p=r.popper,s=r.reference,d=n.split('-')[0];return o=R(+i)?[+i,0]:G(i,p,s,d),'left'===d?(p.top+=o[0],p.left-=o[1]):'right'===d?(p.top+=o[0],p.left+=o[1]):'top'===d?(p.left+=o[0],p.top-=o[1]):'bottom'===d&&(p.left+=o[0],p.top+=o[1]),e.popper=p,e},offset:0},preventOverflow:{order:300,enabled:!0,fn:function(e,t){var o=t.boundariesElement||r(e.instance.popper);e.instance.reference===o&&(o=r(o));var i=w(e.instance.popper,e.instance.reference,t.padding,o);t.boundaries=i;var n=t.priority,p=e.offsets.popper,s={primary:function(e){var o=p[e];return p[e]<i[e]&&!t.escapeWithReference&&(o=_(p[e],i[e])),pe({},e,o)},secondary:function(e){var o='right'===e?'left':'top',n=p[o];return p[e]>i[e]&&!t.escapeWithReference&&(n=z(p[o],i[e]-('right'===e?p.width:p.height))),pe({},o,n)}};return n.forEach(function(e){var t=-1===['left','top'].indexOf(e)?'secondary':'primary';p=se({},p,s[t](e))}),e.offsets.popper=p,e},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,o=t.popper,i=t.reference,n=e.placement.split('-')[0],r=V,p=-1!==['top','bottom'].indexOf(n),s=p?'right':'bottom',d=p?'left':'top',a=p?'width':'height';return o[s]<r(i[d])&&(e.offsets.popper[d]=r(i[d])-o[a]),o[d]>r(i[s])&&(e.offsets.popper[d]=r(i[s])),e}},arrow:{order:500,enabled:!0,fn:function(e,t){if(!F(e.instance.modifiers,'arrow','keepTogether'))return e;var o=t.element;if('string'==typeof o){if(o=e.instance.popper.querySelector(o),!o)return e;}else if(!e.instance.popper.contains(o))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),e;var i=e.placement.split('-')[0],n=e.offsets,r=n.popper,p=n.reference,s=-1!==['left','right'].indexOf(i),d=s?'height':'width',a=s?'top':'left',f=s?'left':'top',l=s?'bottom':'right',m=O(o)[d];p[l]-m<r[a]&&(e.offsets.popper[a]-=r[a]-(p[l]-m)),p[a]+m>r[l]&&(e.offsets.popper[a]+=p[a]+m-r[l]);var h=p[a]+p[d]/2-m/2,g=h-c(e.offsets.popper)[a];return g=_(z(r[d]-m,g),0),e.arrowElement=o,e.offsets.arrow={},e.offsets.arrow[a]=Math.round(g),e.offsets.arrow[f]='',e},element:'[x-arrow]'},flip:{order:600,enabled:!0,fn:function(e,t){if(W(e.instance.modifiers,'inner'))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var o=w(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement),i=e.placement.split('-')[0],n=L(i),r=e.placement.split('-')[1]||'',p=[];switch(t.behavior){case fe.FLIP:p=[i,n];break;case fe.CLOCKWISE:p=K(i);break;case fe.COUNTERCLOCKWISE:p=K(i,!0);break;default:p=t.behavior;}return p.forEach(function(s,d){if(i!==s||p.length===d+1)return e;i=e.placement.split('-')[0],n=L(i);var a=e.offsets.popper,f=e.offsets.reference,l=V,m='left'===i&&l(a.right)>l(f.left)||'right'===i&&l(a.left)<l(f.right)||'top'===i&&l(a.bottom)>l(f.top)||'bottom'===i&&l(a.top)<l(f.bottom),h=l(a.left)<l(o.left),c=l(a.right)>l(o.right),g=l(a.top)<l(o.top),u=l(a.bottom)>l(o.bottom),b='left'===i&&h||'right'===i&&c||'top'===i&&g||'bottom'===i&&u,y=-1!==['top','bottom'].indexOf(i),w=!!t.flipVariations&&(y&&'start'===r&&h||y&&'end'===r&&c||!y&&'start'===r&&g||!y&&'end'===r&&u);(m||b||w)&&(e.flipped=!0,(m||b)&&(i=p[d+1]),w&&(r=j(r)),e.placement=i+(r?'-'+r:''),e.offsets.popper=se({},e.offsets.popper,S(e.instance.popper,e.offsets.reference,e.placement)),e=N(e.instance.modifiers,e,'flip'))}),e},behavior:'flip',padding:5,boundariesElement:'viewport'},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,o=t.split('-')[0],i=e.offsets,n=i.popper,r=i.reference,p=-1!==['left','right'].indexOf(o),s=-1===['top','left'].indexOf(o);return n[p?'left':'top']=r[t]-(s?n[p?'width':'height']:0),e.placement=L(t),e.offsets.popper=c(n),e}},hide:{order:800,enabled:!0,fn:function(e){if(!F(e.instance.modifiers,'hide','preventOverflow'))return e;var t=e.offsets.reference,o=T(e.instance.modifiers,function(e){return'preventOverflow'===e.name}).boundaries;if(t.bottom<o.top||t.left>o.right||t.top>o.bottom||t.right<o.left){if(!0===e.hide)return e;e.hide=!0,e.attributes['x-out-of-boundaries']=''}else{if(!1===e.hide)return e;e.hide=!1,e.attributes['x-out-of-boundaries']=!1}return e}},computeStyle:{order:850,enabled:!0,fn:function(e,t){var o=t.x,i=t.y,n=e.offsets.popper,p=T(e.instance.modifiers,function(e){return'applyStyle'===e.name}).gpuAcceleration;void 0!==p&&console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');var s,d,a=void 0===p?t.gpuAcceleration:p,f=r(e.instance.popper),l=g(f),m={position:n.position},h={left:V(n.left),top:V(n.top),bottom:V(n.bottom),right:V(n.right)},c='bottom'===o?'top':'bottom',u='right'===i?'left':'right',b=B('transform');if(d='bottom'==c?-l.height+h.bottom:h.top,s='right'==u?-l.width+h.right:h.left,a&&b)m[b]='translate3d('+s+'px, '+d+'px, 0)',m[c]=0,m[u]=0,m.willChange='transform';else{var y='bottom'==c?-1:1,w='right'==u?-1:1;m[c]=d*y,m[u]=s*w,m.willChange=c+', '+u}var v={"x-placement":e.placement};return e.attributes=se({},v,e.attributes),e.styles=se({},m,e.styles),e},gpuAcceleration:!0,x:'bottom',y:'right'},applyStyle:{order:900,enabled:!0,fn:function(e){return U(e.instance.popper,e.styles),Y(e.instance.popper,e.attributes),e.offsets.arrow&&U(e.arrowElement,e.offsets.arrow),e},onLoad:function(e,t,o,i,n){var r=x(n,t,e),p=E(o.placement,r,t,e,o.modifiers.flip.boundariesElement,o.modifiers.flip.padding);return t.setAttribute('x-placement',p),U(t,{position:'absolute'}),o},gpuAcceleration:void 0}}},le}); diff --git a/explorer/public/paper-dashboard/assets/js/paper-dashboard.js b/explorer/public/paper-dashboard/assets/js/paper-dashboard.js new file mode 100644 index 00000000000..2428aabc1ca --- /dev/null +++ b/explorer/public/paper-dashboard/assets/js/paper-dashboard.js @@ -0,0 +1,194 @@ +// ========================================================= +// Paper Dashboard 2 - v2.0.0 +// ========================================================= +// +// Product Page: https://www.creative-tim.com/product/paper-dashboard-2 +// Copyright 2019 Creative Tim (https://www.creative-tim.com) +// Licensed under MIT (https://github.com/creativetimofficial/paper-dashboard/blob/master/LICENSE) +// +// Coded by Creative Tim +// +// ========================================================= +// +// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + + +(function() { + isWindows = navigator.platform.indexOf('Win') > -1 ? true : false; + + if (isWindows) { + // if we are on windows OS we activate the perfectScrollbar function + $('.sidebar .sidebar-wrapper, .main-panel').perfectScrollbar(); + + $('html').addClass('perfect-scrollbar-on'); + } else { + $('html').addClass('perfect-scrollbar-off'); + } +})(); + +transparent = true; +transparentDemo = true; +fixedTop = false; + +navbar_initialized = false; +backgroundOrange = false; +sidebar_mini_active = false; +toggle_initialized = false; + +seq = 0, delays = 80, durations = 500; +seq2 = 0, delays2 = 80, durations2 = 500; + +$(document).ready(function() { + + if ($('.full-screen-map').length == 0 && $('.bd-docs').length == 0) { + // On click navbar-collapse the menu will be white not transparent + $('.collapse').on('show.bs.collapse', function() { + $(this).closest('.navbar').removeClass('navbar-transparent').addClass('bg-white'); + }).on('hide.bs.collapse', function() { + $(this).closest('.navbar').addClass('navbar-transparent').removeClass('bg-white'); + }); + } + + paperDashboard.initMinimizeSidebar(); + + $navbar = $('.navbar[color-on-scroll]'); + scroll_distance = $navbar.attr('color-on-scroll') || 500; + + // Check if we have the class "navbar-color-on-scroll" then add the function to remove the class "navbar-transparent" so it will transform to a plain color. + if ($('.navbar[color-on-scroll]').length != 0) { + paperDashboard.checkScrollForTransparentNavbar(); + $(window).on('scroll', paperDashboard.checkScrollForTransparentNavbar) + } + + $('.form-control').on("focus", function() { + $(this).parent('.input-group').addClass("input-group-focus"); + }).on("blur", function() { + $(this).parent(".input-group").removeClass("input-group-focus"); + }); + + // Activate bootstrapSwitch + $('.bootstrap-switch').each(function() { + $this = $(this); + data_on_label = $this.data('on-label') || ''; + data_off_label = $this.data('off-label') || ''; + + $this.bootstrapSwitch({ + onText: data_on_label, + offText: data_off_label + }); + }); +}); + +$(document).on('click', '.navbar-toggle', function() { + $toggle = $(this); + + if (paperDashboard.misc.navbar_menu_visible == 1) { + $('html').removeClass('nav-open'); + paperDashboard.misc.navbar_menu_visible = 0; + setTimeout(function() { + $toggle.removeClass('toggled'); + $('#bodyClick').remove(); + }, 550); + + } else { + setTimeout(function() { + $toggle.addClass('toggled'); + }, 580); + + div = '<div id="bodyClick"></div>'; + $(div).appendTo('body').click(function() { + $('html').removeClass('nav-open'); + paperDashboard.misc.navbar_menu_visible = 0; + setTimeout(function() { + $toggle.removeClass('toggled'); + $('#bodyClick').remove(); + }, 550); + }); + + $('html').addClass('nav-open'); + paperDashboard.misc.navbar_menu_visible = 1; + } +}); + +$(window).resize(function() { + // reset the seq for charts drawing animations + seq = seq2 = 0; + + if ($('.full-screen-map').length == 0 && $('.bd-docs').length == 0) { + $navbar = $('.navbar'); + isExpanded = $('.navbar').find('[data-toggle="collapse"]').attr("aria-expanded"); + if ($navbar.hasClass('bg-white') && $(window).width() > 991) { + $navbar.removeClass('bg-white').addClass('navbar-transparent'); + } else if ($navbar.hasClass('navbar-transparent') && $(window).width() < 991 && isExpanded != "false") { + $navbar.addClass('bg-white').removeClass('navbar-transparent'); + } + } +}); + +paperDashboard = { + misc: { + navbar_menu_visible: 0 + }, + + initMinimizeSidebar: function() { + if ($('.sidebar-mini').length != 0) { + sidebar_mini_active = true; + } + + $('#minimizeSidebar').click(function() { + var $btn = $(this); + + if (sidebar_mini_active == true) { + $('body').addClass('sidebar-mini'); + sidebar_mini_active = true; + paperDashboard.showSidebarMessage('Sidebar mini activated...'); + } else { + $('body').removeClass('sidebar-mini'); + sidebar_mini_active = false; + paperDashboard.showSidebarMessage('Sidebar mini deactivated...'); + } + + // we simulate the window Resize so the charts will get updated in realtime. + var simulateWindowResize = setInterval(function() { + window.dispatchEvent(new Event('resize')); + }, 180); + + // we stop the simulation of Window Resize after the animations are completed + setTimeout(function() { + clearInterval(simulateWindowResize); + }, 1000); + }); + }, + + showSidebarMessage: function(message) { + try { + $.notify({ + icon: "now-ui-icons ui-1_bell-53", + message: message + }, { + type: 'info', + timer: 4000, + placement: { + from: 'top', + align: 'right' + } + }); + } catch (e) { + console.log('Notify library is missing, please make sure you have the notifications library added.'); + } + + } + +}; + +function hexToRGB(hex, alpha) { + var r = parseInt(hex.slice(1, 3), 16), + g = parseInt(hex.slice(3, 5), 16), + b = parseInt(hex.slice(5, 7), 16); + + if (alpha) { + return "rgba(" + r + ", " + g + ", " + b + ", " + alpha + ")"; + } else { + return "rgb(" + r + ", " + g + ", " + b + ")"; + } +} diff --git a/explorer/public/paper-dashboard/assets/js/paper-dashboard.js.map b/explorer/public/paper-dashboard/assets/js/paper-dashboard.js.map new file mode 100644 index 00000000000..4b97fbb15f9 --- /dev/null +++ b/explorer/public/paper-dashboard/assets/js/paper-dashboard.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["_site_dashboard_free/assets/js/dashboard-free.js"],"names":["hexToRGB","hex","alpha","r","parseInt","slice","g","b","isWindows","navigator","platform","indexOf","$","perfectScrollbar","addClass","transparent","transparentDemo","fixedTop","navbar_initialized","backgroundOrange","sidebar_mini_active","toggle_initialized","seq","delays","durations","seq2","delays2","durations2","document","ready","length","on","this","closest","removeClass","paperDashboard","initMinimizeSidebar","$navbar","scroll_distance","attr","checkScrollForTransparentNavbar","window","parent","each","$this","data_on_label","data","data_off_label","bootstrapSwitch","onText","offText","$toggle","misc","navbar_menu_visible","setTimeout","remove","div","appendTo","click","resize","isExpanded","find","hasClass","width","showSidebarMessage","simulateWindowResize","setInterval","dispatchEvent","Event","clearInterval","message","notify","icon","type","timer","placement","from","align","e","console","log"],"mappings":"AAyLA,SAASA,SAASC,EAAKC,GACnB,IAAIC,EAAIC,SAASH,EAAII,MAAM,EAAG,GAAI,IAC9BC,EAAIF,SAASH,EAAII,MAAM,EAAG,GAAI,IAC9BE,EAAIH,SAASH,EAAII,MAAM,EAAG,GAAI,IAElC,OAAIH,EACO,QAAUC,EAAI,KAAOG,EAAI,KAAOC,EAAI,KAAOL,EAAQ,IAEnD,OAASC,EAAI,KAAOG,EAAI,KAAOC,EAAI,IA/K9CC,WAAiD,EAArCC,UAAUC,SAASC,QAAQ,OAEnCH,WAEDI,EAAE,0CAA0CC,mBAE5CD,EAAE,QAAQE,SAAS,yBAEnBF,EAAE,QAAQE,SAAS,yBAI1BC,aAAc,EACdC,iBAAkB,EAClBC,UAAW,EAEXC,oBAAqB,EACrBC,kBAAmB,EACnBC,qBAAsB,EACtBC,oBAAqB,EAErBC,IAAM,EAAGC,OAAS,GAAIC,UAAY,IAClCC,KAAO,EAAGC,QAAU,GAAIC,WAAa,IAErCf,EAAEgB,UAAUC,MAAM,WAEoB,GAAhCjB,EAAE,oBAAoBkB,QAAuC,GAAxBlB,EAAE,YAAYkB,QAErDlB,EAAE,aAAamB,GAAG,mBAAoB,WAClCnB,EAAEoB,MAAMC,QAAQ,WAAWC,YAAY,sBAAsBpB,SAAS,cACvEiB,GAAG,mBAAoB,WACtBnB,EAAEoB,MAAMC,QAAQ,WAAWnB,SAAS,sBAAsBoB,YAAY,cAI5EC,eAAeC,sBAEfC,QAAUzB,EAAE,4BACZ0B,gBAAkBD,QAAQE,KAAK,oBAAsB,IAGV,GAAxC3B,EAAE,4BAA4BkB,SAC7BK,eAAeK,kCACf5B,EAAE6B,QAAQV,GAAG,SAAUI,eAAeK,kCAG1C5B,EAAE,iBAAiBmB,GAAG,QAAS,WAC3BnB,EAAEoB,MAAMU,OAAO,gBAAgB5B,SAAS,uBACzCiB,GAAG,OAAQ,WACVnB,EAAEoB,MAAMU,OAAO,gBAAgBR,YAAY,uBAI/CtB,EAAE,qBAAqB+B,KAAK,WACxBC,MAAQhC,EAAEoB,MACVa,cAAgBD,MAAME,KAAK,aAAe,GAC1CC,eAAiBH,MAAME,KAAK,cAAgB,GAE5CF,MAAMI,gBAAgB,CAClBC,OAAQJ,cACRK,QAASH,qBAKnBnC,EAAEgB,UAAUG,GAAG,QAAS,iBAAkB,WACtCoB,QAAUvC,EAAEoB,MAEkC,GAA3CG,eAAeiB,KAAKC,qBACnBzC,EAAE,QAAQsB,YAAY,YACtBC,eAAeiB,KAAKC,oBAAsB,EAC1CC,WAAW,WACPH,QAAQjB,YAAY,WACpBtB,EAAE,cAAc2C,UACjB,OAGHD,WAAW,WACPH,QAAQrC,SAAS,YAClB,KAEH0C,IAAM,6BACN5C,EAAE4C,KAAKC,SAAS,QAAQC,MAAM,WAC1B9C,EAAE,QAAQsB,YAAY,YACtBC,eAAeiB,KAAKC,oBAAsB,EACtCC,WAAW,WACPH,QAAQjB,YAAY,WACpBtB,EAAE,cAAc2C,UAClB,OAGV3C,EAAE,QAAQE,SAAS,YACnBqB,eAAeiB,KAAKC,oBAAsB,KAIlDzC,EAAE6B,QAAQkB,OAAO,WAEbrC,IAAMG,KAAO,EAEsB,GAAhCb,EAAE,oBAAoBkB,QAAuC,GAAxBlB,EAAE,YAAYkB,SACpDO,QAAUzB,EAAE,WACZgD,WAAahD,EAAE,WAAWiD,KAAK,4BAA4BtB,KAAK,iBAC5DF,QAAQyB,SAAS,aAAmC,IAApBlD,EAAE6B,QAAQsB,QAC5C1B,QAAQH,YAAY,YAAYpB,SAAS,sBAChCuB,QAAQyB,SAAS,uBAAyBlD,EAAE6B,QAAQsB,QAAU,KAAqB,SAAdH,YAC9EvB,QAAQvB,SAAS,YAAYoB,YAAY,yBAKjDC,eAAiB,CACfiB,KAAK,CACDC,oBAAqB,GAGzBjB,oBAAoB,WACgB,GAA7BxB,EAAE,iBAAiBkB,SACpBV,qBAAsB,GAGxBR,EAAE,oBAAoB8C,MAAM,WACb9C,EAAEoB,MAEa,GAAvBZ,qBACDR,EAAE,QAAQE,SAAS,gBACnBM,qBAAsB,EACtBe,eAAe6B,mBAAmB,+BAElCpD,EAAE,QAAQsB,YAAY,gBACtBd,qBAAsB,EACtBe,eAAe6B,mBAAmB,gCAIpC,IAAIC,EAAuBC,YAAY,WACnCzB,OAAO0B,cAAc,IAAIC,MAAM,YACjC,KAGFd,WAAW,WACPe,cAAcJ,IAChB,QAIVD,mBAAoB,SAASM,GAC3B,IACE1D,EAAE2D,OAAO,CACLC,KAAM,4BACNF,QAASA,GACT,CACEG,KAAM,OACNC,MAAO,IACPC,UAAW,CACPC,KAAM,MACNC,MAAO,WAGjB,MAAOC,GACPC,QAAQC,IAAI"} \ No newline at end of file diff --git a/explorer/public/paper-dashboard/assets/js/paper-dashboard.min.js b/explorer/public/paper-dashboard/assets/js/paper-dashboard.min.js new file mode 100644 index 00000000000..f622902d56a --- /dev/null +++ b/explorer/public/paper-dashboard/assets/js/paper-dashboard.min.js @@ -0,0 +1,16 @@ +// ========================================================= +// Paper Dashboard 2 - v2.0.0 +// ========================================================= +// +// Product Page: https://www.creative-tim.com/product/paper-dashboard-2 +// Copyright 2019 Creative Tim (https://www.creative-tim.com) +// Licensed under MIT (https://github.com/creativetimofficial/paper-dashboard/blob/master/LICENSE) +// +// Coded by Creative Tim +// +// ========================================================= +// +// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +function hexToRGB(a,e){var i=parseInt(a.slice(1,3),16),n=parseInt(a.slice(3,5),16),s=parseInt(a.slice(5,7),16);return e?"rgba("+i+", "+n+", "+s+", "+e+")":"rgb("+i+", "+n+", "+s+")"}isWindows=-1<navigator.platform.indexOf("Win"),isWindows?($(".sidebar .sidebar-wrapper, .main-panel").perfectScrollbar(),$("html").addClass("perfect-scrollbar-on")):$("html").addClass("perfect-scrollbar-off"),transparent=!0,transparentDemo=!0,fixedTop=!1,navbar_initialized=!1,backgroundOrange=!1,sidebar_mini_active=!1,toggle_initialized=!1,seq=0,delays=80,durations=500,seq2=0,delays2=80,durations2=500,$(document).ready(function(){0==$(".full-screen-map").length&&0==$(".bd-docs").length&&$(".collapse").on("show.bs.collapse",function(){$(this).closest(".navbar").removeClass("navbar-transparent").addClass("bg-white")}).on("hide.bs.collapse",function(){$(this).closest(".navbar").addClass("navbar-transparent").removeClass("bg-white")}),paperDashboard.initMinimizeSidebar(),$navbar=$(".navbar[color-on-scroll]"),scroll_distance=$navbar.attr("color-on-scroll")||500,0!=$(".navbar[color-on-scroll]").length&&(paperDashboard.checkScrollForTransparentNavbar(),$(window).on("scroll",paperDashboard.checkScrollForTransparentNavbar)),$(".form-control").on("focus",function(){$(this).parent(".input-group").addClass("input-group-focus")}).on("blur",function(){$(this).parent(".input-group").removeClass("input-group-focus")}),$(".bootstrap-switch").each(function(){$this=$(this),data_on_label=$this.data("on-label")||"",data_off_label=$this.data("off-label")||"",$this.bootstrapSwitch({onText:data_on_label,offText:data_off_label})})}),$(document).on("click",".navbar-toggle",function(){$toggle=$(this),1==paperDashboard.misc.navbar_menu_visible?($("html").removeClass("nav-open"),paperDashboard.misc.navbar_menu_visible=0,setTimeout(function(){$toggle.removeClass("toggled"),$("#bodyClick").remove()},550)):(setTimeout(function(){$toggle.addClass("toggled")},580),div='<div id="bodyClick"></div>',$(div).appendTo("body").click(function(){$("html").removeClass("nav-open"),paperDashboard.misc.navbar_menu_visible=0,setTimeout(function(){$toggle.removeClass("toggled"),$("#bodyClick").remove()},550)}),$("html").addClass("nav-open"),paperDashboard.misc.navbar_menu_visible=1)}),$(window).resize(function(){seq=seq2=0,0==$(".full-screen-map").length&&0==$(".bd-docs").length&&($navbar=$(".navbar"),isExpanded=$(".navbar").find('[data-toggle="collapse"]').attr("aria-expanded"),$navbar.hasClass("bg-white")&&991<$(window).width()?$navbar.removeClass("bg-white").addClass("navbar-transparent"):$navbar.hasClass("navbar-transparent")&&$(window).width()<991&&"false"!=isExpanded&&$navbar.addClass("bg-white").removeClass("navbar-transparent"))}),paperDashboard={misc:{navbar_menu_visible:0},initMinimizeSidebar:function(){0!=$(".sidebar-mini").length&&(sidebar_mini_active=!0),$("#minimizeSidebar").click(function(){$(this);1==sidebar_mini_active?($("body").addClass("sidebar-mini"),sidebar_mini_active=!0,paperDashboard.showSidebarMessage("Sidebar mini activated...")):($("body").removeClass("sidebar-mini"),sidebar_mini_active=!1,paperDashboard.showSidebarMessage("Sidebar mini deactivated..."));var a=setInterval(function(){window.dispatchEvent(new Event("resize"))},180);setTimeout(function(){clearInterval(a)},1e3)})},showSidebarMessage:function(a){try{$.notify({icon:"now-ui-icons ui-1_bell-53",message:a},{type:"info",timer:4e3,placement:{from:"top",align:"right"}})}catch(a){console.log("Notify library is missing, please make sure you have the notifications library added.")}}}; +//# sourceMappingURL=_site_dashboard_free/assets/js/dashboard-free.js.map diff --git a/explorer/public/paper-dashboard/assets/js/plugins/bootstrap-notify.js b/explorer/public/paper-dashboard/assets/js/plugins/bootstrap-notify.js new file mode 100644 index 00000000000..68082b5beb5 --- /dev/null +++ b/explorer/public/paper-dashboard/assets/js/plugins/bootstrap-notify.js @@ -0,0 +1,432 @@ +/* + + + + Creative Tim Modifications + + Lines: 238, 239 was changed from top: 5px to top: 50% and we added margin-top: -13px. In this way the close button will be aligned vertically + Line:222 - modified when the icon is set, we add the class "alert-with-icon", so there will be enough space for the icon. + + + + +*/ + + +/* + * Project: Bootstrap Notify = v3.1.5 + * Description: Turns standard Bootstrap alerts into "Growl-like" notifications. + * Author: Mouse0270 aka Robert McIntosh + * License: MIT License + * Website: https://github.com/mouse0270/bootstrap-growl + */ + +/* global define:false, require: false, jQuery:false */ + +(function(factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(['jquery'], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS + factory(require('jquery')); + } else { + // Browser globals + factory(jQuery); + } +}(function($) { + // Create the defaults once + var defaults = { + element: 'body', + position: null, + type: "info", + allow_dismiss: true, + allow_duplicates: true, + newest_on_top: false, + showProgressbar: false, + placement: { + from: "top", + align: "right" + }, + offset: 20, + spacing: 10, + z_index: 1060, + delay: 5000, + timer: 1000, + url_target: '_blank', + mouse_over: null, + animate: { + enter: 'animated fadeInDown', + exit: 'animated fadeOutUp' + }, + onShow: null, + onShown: null, + onClose: null, + onClosed: null, + onClick: null, + icon_type: 'class', + template: '<div data-notify="container" class="col-11 col-md-4 alert alert-{0}" role="alert"><button type="button" aria-hidden="true" class="close" data-notify="dismiss"><i class="nc-icon nc-simple-remove"></i></button><span data-notify="icon"></span> <span data-notify="title">{1}</span> <span data-notify="message">{2}</span><div class="progress" data-notify="progressbar"><div class="progress-bar progress-bar-{0}" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0%;"></div></div><a href="{3}" target="{4}" data-notify="url"></a></div>' + }; + + String.format = function() { + var args = arguments; + var str = arguments[0]; + return str.replace(/(\{\{\d\}\}|\{\d\})/g, function(str) { + if (str.substring(0, 2) === "{{") return str; + var num = parseInt(str.match(/\d/)[0]); + return args[num + 1]; + }); + }; + + function isDuplicateNotification(notification) { + var isDupe = false; + + $('[data-notify="container"]').each(function(i, el) { + var $el = $(el); + var title = $el.find('[data-notify="title"]').html().trim(); + var message = $el.find('[data-notify="message"]').html().trim(); + + // The input string might be different than the actual parsed HTML string! + // (<br> vs <br /> for example) + // So we have to force-parse this as HTML here! + var isSameTitle = title === $("<div>" + notification.settings.content.title + "</div>").html().trim(); + var isSameMsg = message === $("<div>" + notification.settings.content.message + "</div>").html().trim(); + var isSameType = $el.hasClass('alert-' + notification.settings.type); + + if (isSameTitle && isSameMsg && isSameType) { + //we found the dupe. Set the var and stop checking. + isDupe = true; + } + return !isDupe; + }); + + return isDupe; + } + + function Notify(element, content, options) { + // Setup Content of Notify + var contentObj = { + content: { + message: typeof content === 'object' ? content.message : content, + title: content.title ? content.title : '', + icon: content.icon ? content.icon : '', + url: content.url ? content.url : '#', + target: content.target ? content.target : '-' + } + }; + + options = $.extend(true, {}, contentObj, options); + this.settings = $.extend(true, {}, defaults, options); + this._defaults = defaults; + if (this.settings.content.target === "-") { + this.settings.content.target = this.settings.url_target; + } + this.animations = { + start: 'webkitAnimationStart oanimationstart MSAnimationStart animationstart', + end: 'webkitAnimationEnd oanimationend MSAnimationEnd animationend' + }; + + if (typeof this.settings.offset === 'number') { + this.settings.offset = { + x: this.settings.offset, + y: this.settings.offset + }; + } + + //if duplicate messages are not allowed, then only continue if this new message is not a duplicate of one that it already showing + if (this.settings.allow_duplicates || (!this.settings.allow_duplicates && !isDuplicateNotification(this))) { + this.init(); + } + } + + $.extend(Notify.prototype, { + init: function() { + var self = this; + + this.buildNotify(); + if (this.settings.content.icon) { + this.setIcon(); + } + if (this.settings.content.url != "#") { + this.styleURL(); + } + this.styleDismiss(); + this.placement(); + this.bind(); + + this.notify = { + $ele: this.$ele, + update: function(command, update) { + var commands = {}; + if (typeof command === "string") { + commands[command] = update; + } else { + commands = command; + } + for (var cmd in commands) { + switch (cmd) { + case "type": + this.$ele.removeClass('alert-' + self.settings.type); + this.$ele.find('[data-notify="progressbar"] > .progress-bar').removeClass('progress-bar-' + self.settings.type); + self.settings.type = commands[cmd]; + this.$ele.addClass('alert-' + commands[cmd]).find('[data-notify="progressbar"] > .progress-bar').addClass('progress-bar-' + commands[cmd]); + break; + case "icon": + var $icon = this.$ele.find('[data-notify="icon"]'); + if (self.settings.icon_type.toLowerCase() === 'class') { + $icon.removeClass(self.settings.content.icon).addClass(commands[cmd]); + } else { + if (!$icon.is('img')) { + $icon.find('img'); + } + $icon.attr('src', commands[cmd]); + } + self.settings.content.icon = commands[command]; + break; + case "progress": + var newDelay = self.settings.delay - (self.settings.delay * (commands[cmd] / 100)); + this.$ele.data('notify-delay', newDelay); + this.$ele.find('[data-notify="progressbar"] > div').attr('aria-valuenow', commands[cmd]).css('width', commands[cmd] + '%'); + break; + case "url": + this.$ele.find('[data-notify="url"]').attr('href', commands[cmd]); + break; + case "target": + this.$ele.find('[data-notify="url"]').attr('target', commands[cmd]); + break; + default: + this.$ele.find('[data-notify="' + cmd + '"]').html(commands[cmd]); + } + } + var posX = this.$ele.outerHeight() + parseInt(self.settings.spacing) + parseInt(self.settings.offset.y); + self.reposition(posX); + }, + close: function() { + self.close(); + } + }; + + }, + buildNotify: function() { + var content = this.settings.content; + this.$ele = $(String.format(this.settings.template, this.settings.type, content.title, content.message, content.url, content.target)); + this.$ele.attr('data-notify-position', this.settings.placement.from + '-' + this.settings.placement.align); + if (!this.settings.allow_dismiss) { + this.$ele.find('[data-notify="dismiss"]').css('display', 'none'); + } + if ((this.settings.delay <= 0 && !this.settings.showProgressbar) || !this.settings.showProgressbar) { + this.$ele.find('[data-notify="progressbar"]').remove(); + } + }, + setIcon: function() { + this.$ele.addClass('alert-with-icon'); + + if (this.settings.icon_type.toLowerCase() === 'class') { + this.$ele.find('[data-notify="icon"]').addClass(this.settings.content.icon); + } else { + if (this.$ele.find('[data-notify="icon"]').is('img')) { + this.$ele.find('[data-notify="icon"]').attr('src', this.settings.content.icon); + } else { + this.$ele.find('[data-notify="icon"]').append('<img src="' + this.settings.content.icon + '" alt="Notify Icon" />'); + } + } + }, + styleDismiss: function() { + this.$ele.find('[data-notify="dismiss"]').css({ + position: 'absolute', + right: '10px', + top: '50%', + marginTop: '-13px', + zIndex: this.settings.z_index + 2 + }); + }, + styleURL: function() { + this.$ele.find('[data-notify="url"]').css({ + backgroundImage: 'url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)', + height: '100%', + left: 0, + position: 'absolute', + top: 0, + width: '100%', + zIndex: this.settings.z_index + 1 + }); + }, + placement: function() { + var self = this, + offsetAmt = this.settings.offset.y, + css = { + display: 'inline-block', + margin: '0px auto', + position: this.settings.position ? this.settings.position : (this.settings.element === 'body' ? 'fixed' : 'absolute'), + transition: 'all .5s ease-in-out', + zIndex: this.settings.z_index + }, + hasAnimation = false, + settings = this.settings; + + $('[data-notify-position="' + this.settings.placement.from + '-' + this.settings.placement.align + '"]:not([data-closing="true"])').each(function() { + offsetAmt = Math.max(offsetAmt, parseInt($(this).css(settings.placement.from)) + parseInt($(this).outerHeight()) + parseInt(settings.spacing)); + }); + if (this.settings.newest_on_top === true) { + offsetAmt = this.settings.offset.y; + } + css[this.settings.placement.from] = offsetAmt + 'px'; + + switch (this.settings.placement.align) { + case "left": + case "right": + css[this.settings.placement.align] = this.settings.offset.x + 'px'; + break; + case "center": + css.left = 0; + css.right = 0; + break; + } + this.$ele.css(css).addClass(this.settings.animate.enter); + $.each(Array('webkit-', 'moz-', 'o-', 'ms-', ''), function(index, prefix) { + self.$ele[0].style[prefix + 'AnimationIterationCount'] = 1; + }); + + $(this.settings.element).append(this.$ele); + + if (this.settings.newest_on_top === true) { + offsetAmt = (parseInt(offsetAmt) + parseInt(this.settings.spacing)) + this.$ele.outerHeight(); + this.reposition(offsetAmt); + } + + if ($.isFunction(self.settings.onShow)) { + self.settings.onShow.call(this.$ele); + } + + this.$ele.one(this.animations.start, function() { + hasAnimation = true; + }).one(this.animations.end, function() { + self.$ele.removeClass(self.settings.animate.enter); + if ($.isFunction(self.settings.onShown)) { + self.settings.onShown.call(this); + } + }); + + setTimeout(function() { + if (!hasAnimation) { + if ($.isFunction(self.settings.onShown)) { + self.settings.onShown.call(this); + } + } + }, 600); + }, + bind: function() { + var self = this; + + this.$ele.find('[data-notify="dismiss"]').on('click', function() { + self.close(); + }); + + if ($.isFunction(self.settings.onClick)) { + this.$ele.on('click', function(event) { + if (event.target != self.$ele.find('[data-notify="dismiss"]')[0]) { + self.settings.onClick.call(this, event); + } + }); + } + + this.$ele.mouseover(function() { + $(this).data('data-hover', "true"); + }).mouseout(function() { + $(this).data('data-hover', "false"); + }); + this.$ele.data('data-hover', "false"); + + if (this.settings.delay > 0) { + self.$ele.data('notify-delay', self.settings.delay); + var timer = setInterval(function() { + var delay = parseInt(self.$ele.data('notify-delay')) - self.settings.timer; + if ((self.$ele.data('data-hover') === 'false' && self.settings.mouse_over === "pause") || self.settings.mouse_over != "pause") { + var percent = ((self.settings.delay - delay) / self.settings.delay) * 100; + self.$ele.data('notify-delay', delay); + self.$ele.find('[data-notify="progressbar"] > div').attr('aria-valuenow', percent).css('width', percent + '%'); + } + if (delay <= -(self.settings.timer)) { + clearInterval(timer); + self.close(); + } + }, self.settings.timer); + } + }, + close: function() { + var self = this, + posX = parseInt(this.$ele.css(this.settings.placement.from)), + hasAnimation = false; + + this.$ele.attr('data-closing', 'true').addClass(this.settings.animate.exit); + self.reposition(posX); + + if ($.isFunction(self.settings.onClose)) { + self.settings.onClose.call(this.$ele); + } + + this.$ele.one(this.animations.start, function() { + hasAnimation = true; + }).one(this.animations.end, function() { + $(this).remove(); + if ($.isFunction(self.settings.onClosed)) { + self.settings.onClosed.call(this); + } + }); + + setTimeout(function() { + if (!hasAnimation) { + self.$ele.remove(); + if (self.settings.onClosed) { + self.settings.onClosed(self.$ele); + } + } + }, 600); + }, + reposition: function(posX) { + var self = this, + notifies = '[data-notify-position="' + this.settings.placement.from + '-' + this.settings.placement.align + '"]:not([data-closing="true"])', + $elements = this.$ele.nextAll(notifies); + if (this.settings.newest_on_top === true) { + $elements = this.$ele.prevAll(notifies); + } + $elements.each(function() { + $(this).css(self.settings.placement.from, posX); + posX = (parseInt(posX) + parseInt(self.settings.spacing)) + $(this).outerHeight(); + }); + } + }); + + $.notify = function(content, options) { + var plugin = new Notify(this, content, options); + return plugin.notify; + }; + $.notifyDefaults = function(options) { + defaults = $.extend(true, {}, defaults, options); + return defaults; + }; + + $.notifyClose = function(selector) { + + if (typeof selector === "undefined" || selector === "all") { + $('[data-notify]').find('[data-notify="dismiss"]').trigger('click'); + } else if (selector === 'success' || selector === 'info' || selector === 'warning' || selector === 'danger') { + $('.alert-' + selector + '[data-notify]').find('[data-notify="dismiss"]').trigger('click'); + } else if (selector) { + $(selector + '[data-notify]').find('[data-notify="dismiss"]').trigger('click'); + } else { + $('[data-notify-position="' + selector + '"]').find('[data-notify="dismiss"]').trigger('click'); + } + }; + + $.notifyCloseExcept = function(selector) { + + if (selector === 'success' || selector === 'info' || selector === 'warning' || selector === 'danger') { + $('[data-notify]').not('.alert-' + selector).find('[data-notify="dismiss"]').trigger('click'); + } else { + $('[data-notify]').not(selector).find('[data-notify="dismiss"]').trigger('click'); + } + }; + + +})); \ No newline at end of file diff --git a/explorer/public/paper-dashboard/assets/js/plugins/chartjs.min.js b/explorer/public/paper-dashboard/assets/js/plugins/chartjs.min.js new file mode 100644 index 00000000000..f62dda72acb --- /dev/null +++ b/explorer/public/paper-dashboard/assets/js/plugins/chartjs.min.js @@ -0,0 +1,10 @@ +/*! + * Chart.js + * http://chartjs.org/ + * Version: 2.7.1 + * + * Copyright 2017 Nick Downie + * Released under the MIT license + * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md + */ +!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).Chart=t()}}(function(){return function t(e,n,i){function a(r,l){if(!n[r]){if(!e[r]){var s="function"==typeof require&&require;if(!l&&s)return s(r,!0);if(o)return o(r,!0);var u=new Error("Cannot find module '"+r+"'");throw u.code="MODULE_NOT_FOUND",u}var d=n[r]={exports:{}};e[r][0].call(d.exports,function(t){var n=e[r][1][t];return a(n||t)},d,d.exports,t,e,n,i)}return n[r].exports}for(var o="function"==typeof require&&require,r=0;r<i.length;r++)a(i[r]);return a}({1:[function(t,e,n){},{}],2:[function(t,e,n){function i(t){if(t){var e=[0,0,0],n=1,i=t.match(/^#([a-fA-F0-9]{3})$/i);if(i){i=i[1];for(a=0;a<e.length;a++)e[a]=parseInt(i[a]+i[a],16)}else if(i=t.match(/^#([a-fA-F0-9]{6})$/i)){i=i[1];for(a=0;a<e.length;a++)e[a]=parseInt(i.slice(2*a,2*a+2),16)}else if(i=t.match(/^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i)){for(a=0;a<e.length;a++)e[a]=parseInt(i[a+1]);n=parseFloat(i[4])}else if(i=t.match(/^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i)){for(a=0;a<e.length;a++)e[a]=Math.round(2.55*parseFloat(i[a+1]));n=parseFloat(i[4])}else if(i=t.match(/(\w+)/)){if("transparent"==i[1])return[0,0,0,0];if(!(e=c[i[1]]))return}for(var a=0;a<e.length;a++)e[a]=u(e[a],0,255);return n=n||0==n?u(n,0,1):1,e[3]=n,e}}function a(t){if(t){var e=t.match(/^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/);if(e){var n=parseFloat(e[4]);return[u(parseInt(e[1]),0,360),u(parseFloat(e[2]),0,100),u(parseFloat(e[3]),0,100),u(isNaN(n)?1:n,0,1)]}}}function o(t){if(t){var e=t.match(/^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/);if(e){var n=parseFloat(e[4]);return[u(parseInt(e[1]),0,360),u(parseFloat(e[2]),0,100),u(parseFloat(e[3]),0,100),u(isNaN(n)?1:n,0,1)]}}}function r(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"rgba("+t[0]+", "+t[1]+", "+t[2]+", "+e+")"}function l(t,e){return"rgba("+Math.round(t[0]/255*100)+"%, "+Math.round(t[1]/255*100)+"%, "+Math.round(t[2]/255*100)+"%, "+(e||t[3]||1)+")"}function s(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"hsla("+t[0]+", "+t[1]+"%, "+t[2]+"%, "+e+")"}function u(t,e,n){return Math.min(Math.max(e,t),n)}function d(t){var e=t.toString(16).toUpperCase();return e.length<2?"0"+e:e}var c=t(6);e.exports={getRgba:i,getHsla:a,getRgb:function(t){var e=i(t);return e&&e.slice(0,3)},getHsl:function(t){var e=a(t);return e&&e.slice(0,3)},getHwb:o,getAlpha:function(t){var e=i(t);return e?e[3]:(e=a(t))?e[3]:(e=o(t))?e[3]:void 0},hexString:function(t){return"#"+d(t[0])+d(t[1])+d(t[2])},rgbString:function(t,e){return e<1||t[3]&&t[3]<1?r(t,e):"rgb("+t[0]+", "+t[1]+", "+t[2]+")"},rgbaString:r,percentString:function(t,e){return e<1||t[3]&&t[3]<1?l(t,e):"rgb("+Math.round(t[0]/255*100)+"%, "+Math.round(t[1]/255*100)+"%, "+Math.round(t[2]/255*100)+"%)"},percentaString:l,hslString:function(t,e){return e<1||t[3]&&t[3]<1?s(t,e):"hsl("+t[0]+", "+t[1]+"%, "+t[2]+"%)"},hslaString:s,hwbString:function(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"hwb("+t[0]+", "+t[1]+"%, "+t[2]+"%"+(void 0!==e&&1!==e?", "+e:"")+")"},keyword:function(t){return h[t.slice(0,3)]}};var h={};for(var f in c)h[c[f]]=f},{6:6}],3:[function(t,e,n){var i=t(5),a=t(2),o=function(t){if(t instanceof o)return t;if(!(this instanceof o))return new o(t);this.valid=!1,this.values={rgb:[0,0,0],hsl:[0,0,0],hsv:[0,0,0],hwb:[0,0,0],cmyk:[0,0,0,0],alpha:1};var e;"string"==typeof t?(e=a.getRgba(t))?this.setValues("rgb",e):(e=a.getHsla(t))?this.setValues("hsl",e):(e=a.getHwb(t))&&this.setValues("hwb",e):"object"==typeof t&&(void 0!==(e=t).r||void 0!==e.red?this.setValues("rgb",e):void 0!==e.l||void 0!==e.lightness?this.setValues("hsl",e):void 0!==e.v||void 0!==e.value?this.setValues("hsv",e):void 0!==e.w||void 0!==e.whiteness?this.setValues("hwb",e):void 0===e.c&&void 0===e.cyan||this.setValues("cmyk",e))};o.prototype={isValid:function(){return this.valid},rgb:function(){return this.setSpace("rgb",arguments)},hsl:function(){return this.setSpace("hsl",arguments)},hsv:function(){return this.setSpace("hsv",arguments)},hwb:function(){return this.setSpace("hwb",arguments)},cmyk:function(){return this.setSpace("cmyk",arguments)},rgbArray:function(){return this.values.rgb},hslArray:function(){return this.values.hsl},hsvArray:function(){return this.values.hsv},hwbArray:function(){var t=this.values;return 1!==t.alpha?t.hwb.concat([t.alpha]):t.hwb},cmykArray:function(){return this.values.cmyk},rgbaArray:function(){var t=this.values;return t.rgb.concat([t.alpha])},hslaArray:function(){var t=this.values;return t.hsl.concat([t.alpha])},alpha:function(t){return void 0===t?this.values.alpha:(this.setValues("alpha",t),this)},red:function(t){return this.setChannel("rgb",0,t)},green:function(t){return this.setChannel("rgb",1,t)},blue:function(t){return this.setChannel("rgb",2,t)},hue:function(t){return t&&(t=(t%=360)<0?360+t:t),this.setChannel("hsl",0,t)},saturation:function(t){return this.setChannel("hsl",1,t)},lightness:function(t){return this.setChannel("hsl",2,t)},saturationv:function(t){return this.setChannel("hsv",1,t)},whiteness:function(t){return this.setChannel("hwb",1,t)},blackness:function(t){return this.setChannel("hwb",2,t)},value:function(t){return this.setChannel("hsv",2,t)},cyan:function(t){return this.setChannel("cmyk",0,t)},magenta:function(t){return this.setChannel("cmyk",1,t)},yellow:function(t){return this.setChannel("cmyk",2,t)},black:function(t){return this.setChannel("cmyk",3,t)},hexString:function(){return a.hexString(this.values.rgb)},rgbString:function(){return a.rgbString(this.values.rgb,this.values.alpha)},rgbaString:function(){return a.rgbaString(this.values.rgb,this.values.alpha)},percentString:function(){return a.percentString(this.values.rgb,this.values.alpha)},hslString:function(){return a.hslString(this.values.hsl,this.values.alpha)},hslaString:function(){return a.hslaString(this.values.hsl,this.values.alpha)},hwbString:function(){return a.hwbString(this.values.hwb,this.values.alpha)},keyword:function(){return a.keyword(this.values.rgb,this.values.alpha)},rgbNumber:function(){var t=this.values.rgb;return t[0]<<16|t[1]<<8|t[2]},luminosity:function(){for(var t=this.values.rgb,e=[],n=0;n<t.length;n++){var i=t[n]/255;e[n]=i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4)}return.2126*e[0]+.7152*e[1]+.0722*e[2]},contrast:function(t){var e=this.luminosity(),n=t.luminosity();return e>n?(e+.05)/(n+.05):(n+.05)/(e+.05)},level:function(t){var e=this.contrast(t);return e>=7.1?"AAA":e>=4.5?"AA":""},dark:function(){var t=this.values.rgb;return(299*t[0]+587*t[1]+114*t[2])/1e3<128},light:function(){return!this.dark()},negate:function(){for(var t=[],e=0;e<3;e++)t[e]=255-this.values.rgb[e];return this.setValues("rgb",t),this},lighten:function(t){var e=this.values.hsl;return e[2]+=e[2]*t,this.setValues("hsl",e),this},darken:function(t){var e=this.values.hsl;return e[2]-=e[2]*t,this.setValues("hsl",e),this},saturate:function(t){var e=this.values.hsl;return e[1]+=e[1]*t,this.setValues("hsl",e),this},desaturate:function(t){var e=this.values.hsl;return e[1]-=e[1]*t,this.setValues("hsl",e),this},whiten:function(t){var e=this.values.hwb;return e[1]+=e[1]*t,this.setValues("hwb",e),this},blacken:function(t){var e=this.values.hwb;return e[2]+=e[2]*t,this.setValues("hwb",e),this},greyscale:function(){var t=this.values.rgb,e=.3*t[0]+.59*t[1]+.11*t[2];return this.setValues("rgb",[e,e,e]),this},clearer:function(t){var e=this.values.alpha;return this.setValues("alpha",e-e*t),this},opaquer:function(t){var e=this.values.alpha;return this.setValues("alpha",e+e*t),this},rotate:function(t){var e=this.values.hsl,n=(e[0]+t)%360;return e[0]=n<0?360+n:n,this.setValues("hsl",e),this},mix:function(t,e){var n=this,i=t,a=void 0===e?.5:e,o=2*a-1,r=n.alpha()-i.alpha(),l=((o*r==-1?o:(o+r)/(1+o*r))+1)/2,s=1-l;return this.rgb(l*n.red()+s*i.red(),l*n.green()+s*i.green(),l*n.blue()+s*i.blue()).alpha(n.alpha()*a+i.alpha()*(1-a))},toJSON:function(){return this.rgb()},clone:function(){var t,e,n=new o,i=this.values,a=n.values;for(var r in i)i.hasOwnProperty(r)&&(t=i[r],"[object Array]"===(e={}.toString.call(t))?a[r]=t.slice(0):"[object Number]"===e?a[r]=t:console.error("unexpected color value:",t));return n}},o.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},o.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},o.prototype.getValues=function(t){for(var e=this.values,n={},i=0;i<t.length;i++)n[t.charAt(i)]=e[t][i];return 1!==e.alpha&&(n.a=e.alpha),n},o.prototype.setValues=function(t,e){var n,a=this.values,o=this.spaces,r=this.maxes,l=1;if(this.valid=!0,"alpha"===t)l=e;else if(e.length)a[t]=e.slice(0,t.length),l=e[t.length];else if(void 0!==e[t.charAt(0)]){for(n=0;n<t.length;n++)a[t][n]=e[t.charAt(n)];l=e.a}else if(void 0!==e[o[t][0]]){var s=o[t];for(n=0;n<t.length;n++)a[t][n]=e[s[n]];l=e.alpha}if(a.alpha=Math.max(0,Math.min(1,void 0===l?a.alpha:l)),"alpha"===t)return!1;var u;for(n=0;n<t.length;n++)u=Math.max(0,Math.min(r[t][n],a[t][n])),a[t][n]=Math.round(u);for(var d in o)d!==t&&(a[d]=i[t][d](a[t]));return!0},o.prototype.setSpace=function(t,e){var n=e[0];return void 0===n?this.getValues(t):("number"==typeof n&&(n=Array.prototype.slice.call(e)),this.setValues(t,n),this)},o.prototype.setChannel=function(t,e,n){var i=this.values[t];return void 0===n?i[e]:n===i[e]?this:(i[e]=n,this.setValues(t,i),this)},"undefined"!=typeof window&&(window.Color=o),e.exports=o},{2:2,5:5}],4:[function(t,e,n){function i(t){var e,n,i,a=t[0]/255,o=t[1]/255,r=t[2]/255,l=Math.min(a,o,r),s=Math.max(a,o,r),u=s-l;return s==l?e=0:a==s?e=(o-r)/u:o==s?e=2+(r-a)/u:r==s&&(e=4+(a-o)/u),(e=Math.min(60*e,360))<0&&(e+=360),i=(l+s)/2,n=s==l?0:i<=.5?u/(s+l):u/(2-s-l),[e,100*n,100*i]}function a(t){var e,n,i,a=t[0],o=t[1],r=t[2],l=Math.min(a,o,r),s=Math.max(a,o,r),u=s-l;return n=0==s?0:u/s*1e3/10,s==l?e=0:a==s?e=(o-r)/u:o==s?e=2+(r-a)/u:r==s&&(e=4+(a-o)/u),(e=Math.min(60*e,360))<0&&(e+=360),i=s/255*1e3/10,[e,n,i]}function o(t){var e=t[0],n=t[1],a=t[2];return[i(t)[0],100*(1/255*Math.min(e,Math.min(n,a))),100*(a=1-1/255*Math.max(e,Math.max(n,a)))]}function l(t){var e,n,i,a,o=t[0]/255,r=t[1]/255,l=t[2]/255;return a=Math.min(1-o,1-r,1-l),e=(1-o-a)/(1-a)||0,n=(1-r-a)/(1-a)||0,i=(1-l-a)/(1-a)||0,[100*e,100*n,100*i,100*a]}function s(t){return C[JSON.stringify(t)]}function u(t){var e=t[0]/255,n=t[1]/255,i=t[2]/255;return[100*(.4124*(e=e>.04045?Math.pow((e+.055)/1.055,2.4):e/12.92)+.3576*(n=n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92)+.1805*(i=i>.04045?Math.pow((i+.055)/1.055,2.4):i/12.92)),100*(.2126*e+.7152*n+.0722*i),100*(.0193*e+.1192*n+.9505*i)]}function d(t){var e,n,i,a=u(t),o=a[0],r=a[1],l=a[2];return o/=95.047,r/=100,l/=108.883,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,l=l>.008856?Math.pow(l,1/3):7.787*l+16/116,e=116*r-16,n=500*(o-r),i=200*(r-l),[e,n,i]}function c(t){var e,n,i,a,o,r=t[0]/360,l=t[1]/100,s=t[2]/100;if(0==l)return o=255*s,[o,o,o];e=2*s-(n=s<.5?s*(1+l):s+l-s*l),a=[0,0,0];for(var u=0;u<3;u++)(i=r+1/3*-(u-1))<0&&i++,i>1&&i--,o=6*i<1?e+6*(n-e)*i:2*i<1?n:3*i<2?e+(n-e)*(2/3-i)*6:e,a[u]=255*o;return a}function h(t){var e=t[0]/60,n=t[1]/100,i=t[2]/100,a=Math.floor(e)%6,o=e-Math.floor(e),r=255*i*(1-n),l=255*i*(1-n*o),s=255*i*(1-n*(1-o)),i=255*i;switch(a){case 0:return[i,s,r];case 1:return[l,i,r];case 2:return[r,i,s];case 3:return[r,l,i];case 4:return[s,r,i];case 5:return[i,r,l]}}function f(t){var e,n,i,a,o=t[0]/360,l=t[1]/100,s=t[2]/100,u=l+s;switch(u>1&&(l/=u,s/=u),e=Math.floor(6*o),n=1-s,i=6*o-e,0!=(1&e)&&(i=1-i),a=l+i*(n-l),e){default:case 6:case 0:r=n,g=a,b=l;break;case 1:r=a,g=n,b=l;break;case 2:r=l,g=n,b=a;break;case 3:r=l,g=a,b=n;break;case 4:r=a,g=l,b=n;break;case 5:r=n,g=l,b=a}return[255*r,255*g,255*b]}function p(t){var e,n,i,a=t[0]/100,o=t[1]/100,r=t[2]/100,l=t[3]/100;return e=1-Math.min(1,a*(1-l)+l),n=1-Math.min(1,o*(1-l)+l),i=1-Math.min(1,r*(1-l)+l),[255*e,255*n,255*i]}function v(t){var e,n,i,a=t[0]/100,o=t[1]/100,r=t[2]/100;return e=3.2406*a+-1.5372*o+-.4986*r,n=-.9689*a+1.8758*o+.0415*r,i=.0557*a+-.204*o+1.057*r,e=e>.0031308?1.055*Math.pow(e,1/2.4)-.055:e*=12.92,n=n>.0031308?1.055*Math.pow(n,1/2.4)-.055:n*=12.92,i=i>.0031308?1.055*Math.pow(i,1/2.4)-.055:i*=12.92,e=Math.min(Math.max(0,e),1),n=Math.min(Math.max(0,n),1),i=Math.min(Math.max(0,i),1),[255*e,255*n,255*i]}function m(t){var e,n,i,a=t[0],o=t[1],r=t[2];return a/=95.047,o/=100,r/=108.883,a=a>.008856?Math.pow(a,1/3):7.787*a+16/116,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,e=116*o-16,n=500*(a-o),i=200*(o-r),[e,n,i]}function x(t){var e,n,i,a,o=t[0],r=t[1],l=t[2];return o<=8?a=(n=100*o/903.3)/100*7.787+16/116:(n=100*Math.pow((o+16)/116,3),a=Math.pow(n/100,1/3)),e=e/95.047<=.008856?e=95.047*(r/500+a-16/116)/7.787:95.047*Math.pow(r/500+a,3),i=i/108.883<=.008859?i=108.883*(a-l/200-16/116)/7.787:108.883*Math.pow(a-l/200,3),[e,n,i]}function y(t){var e,n,i,a=t[0],o=t[1],r=t[2];return e=Math.atan2(r,o),(n=360*e/2/Math.PI)<0&&(n+=360),i=Math.sqrt(o*o+r*r),[a,i,n]}function k(t){return v(x(t))}function w(t){var e,n,i,a=t[0],o=t[1];return i=t[2]/360*2*Math.PI,e=o*Math.cos(i),n=o*Math.sin(i),[a,e,n]}function M(t){return S[t]}e.exports={rgb2hsl:i,rgb2hsv:a,rgb2hwb:o,rgb2cmyk:l,rgb2keyword:s,rgb2xyz:u,rgb2lab:d,rgb2lch:function(t){return y(d(t))},hsl2rgb:c,hsl2hsv:function(t){var e,n,i=t[0],a=t[1]/100,o=t[2]/100;return 0===o?[0,0,0]:(o*=2,a*=o<=1?o:2-o,n=(o+a)/2,e=2*a/(o+a),[i,100*e,100*n])},hsl2hwb:function(t){return o(c(t))},hsl2cmyk:function(t){return l(c(t))},hsl2keyword:function(t){return s(c(t))},hsv2rgb:h,hsv2hsl:function(t){var e,n,i=t[0],a=t[1]/100,o=t[2]/100;return n=(2-a)*o,e=a*o,e/=n<=1?n:2-n,e=e||0,n/=2,[i,100*e,100*n]},hsv2hwb:function(t){return o(h(t))},hsv2cmyk:function(t){return l(h(t))},hsv2keyword:function(t){return s(h(t))},hwb2rgb:f,hwb2hsl:function(t){return i(f(t))},hwb2hsv:function(t){return a(f(t))},hwb2cmyk:function(t){return l(f(t))},hwb2keyword:function(t){return s(f(t))},cmyk2rgb:p,cmyk2hsl:function(t){return i(p(t))},cmyk2hsv:function(t){return a(p(t))},cmyk2hwb:function(t){return o(p(t))},cmyk2keyword:function(t){return s(p(t))},keyword2rgb:M,keyword2hsl:function(t){return i(M(t))},keyword2hsv:function(t){return a(M(t))},keyword2hwb:function(t){return o(M(t))},keyword2cmyk:function(t){return l(M(t))},keyword2lab:function(t){return d(M(t))},keyword2xyz:function(t){return u(M(t))},xyz2rgb:v,xyz2lab:m,xyz2lch:function(t){return y(m(t))},lab2xyz:x,lab2rgb:k,lab2lch:y,lch2lab:w,lch2xyz:function(t){return x(w(t))},lch2rgb:function(t){return k(w(t))}};var S={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},C={};for(var _ in S)C[JSON.stringify(S[_])]=_},{}],5:[function(t,e,n){var i=t(4),a=function(){return new u};for(var o in i){a[o+"Raw"]=function(t){return function(e){return"number"==typeof e&&(e=Array.prototype.slice.call(arguments)),i[t](e)}}(o);var r=/(\w+)2(\w+)/.exec(o),l=r[1],s=r[2];(a[l]=a[l]||{})[s]=a[o]=function(t){return function(e){"number"==typeof e&&(e=Array.prototype.slice.call(arguments));var n=i[t](e);if("string"==typeof n||void 0===n)return n;for(var a=0;a<n.length;a++)n[a]=Math.round(n[a]);return n}}(o)}var u=function(){this.convs={}};u.prototype.routeSpace=function(t,e){var n=e[0];return void 0===n?this.getValues(t):("number"==typeof n&&(n=Array.prototype.slice.call(e)),this.setValues(t,n))},u.prototype.setValues=function(t,e){return this.space=t,this.convs={},this.convs[t]=e,this},u.prototype.getValues=function(t){var e=this.convs[t];if(!e){var n=this.space,i=this.convs[n];e=a[n][t](i),this.convs[t]=e}return e},["rgb","hsl","hsv","cmyk","keyword"].forEach(function(t){u.prototype[t]=function(e){return this.routeSpace(t,arguments)}}),e.exports=a},{4:4}],6:[function(t,e,n){"use strict";e.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}},{}],7:[function(t,e,n){var i=t(29)();i.helpers=t(45),t(27)(i),i.defaults=t(25),i.Element=t(26),i.elements=t(40),i.Interaction=t(28),i.platform=t(48),t(31)(i),t(22)(i),t(23)(i),t(24)(i),t(30)(i),t(33)(i),t(32)(i),t(35)(i),t(54)(i),t(52)(i),t(53)(i),t(55)(i),t(56)(i),t(57)(i),t(15)(i),t(16)(i),t(17)(i),t(18)(i),t(19)(i),t(20)(i),t(21)(i),t(8)(i),t(9)(i),t(10)(i),t(11)(i),t(12)(i),t(13)(i),t(14)(i);var a=[];a.push(t(49)(i),t(50)(i),t(51)(i)),i.plugins.register(a),i.platform.initialize(),e.exports=i,"undefined"!=typeof window&&(window.Chart=i),i.canvasHelpers=i.helpers.canvas},{10:10,11:11,12:12,13:13,14:14,15:15,16:16,17:17,18:18,19:19,20:20,21:21,22:22,23:23,24:24,25:25,26:26,27:27,28:28,29:29,30:30,31:31,32:32,33:33,35:35,40:40,45:45,48:48,49:49,50:50,51:51,52:52,53:53,54:54,55:55,56:56,57:57,8:8,9:9}],8:[function(t,e,n){"use strict";e.exports=function(t){t.Bar=function(e,n){return n.type="bar",new t(e,n)}}},{}],9:[function(t,e,n){"use strict";e.exports=function(t){t.Bubble=function(e,n){return n.type="bubble",new t(e,n)}}},{}],10:[function(t,e,n){"use strict";e.exports=function(t){t.Doughnut=function(e,n){return n.type="doughnut",new t(e,n)}}},{}],11:[function(t,e,n){"use strict";e.exports=function(t){t.Line=function(e,n){return n.type="line",new t(e,n)}}},{}],12:[function(t,e,n){"use strict";e.exports=function(t){t.PolarArea=function(e,n){return n.type="polarArea",new t(e,n)}}},{}],13:[function(t,e,n){"use strict";e.exports=function(t){t.Radar=function(e,n){return n.type="radar",new t(e,n)}}},{}],14:[function(t,e,n){"use strict";e.exports=function(t){t.Scatter=function(e,n){return n.type="scatter",new t(e,n)}}},{}],15:[function(t,e,n){"use strict";var i=t(25),a=t(40),o=t(45);i._set("bar",{hover:{mode:"label"},scales:{xAxes:[{type:"category",categoryPercentage:.8,barPercentage:.9,offset:!0,gridLines:{offsetGridLines:!0}}],yAxes:[{type:"linear"}]}}),i._set("horizontalBar",{hover:{mode:"index",axis:"y"},scales:{xAxes:[{type:"linear",position:"bottom"}],yAxes:[{position:"left",type:"category",categoryPercentage:.8,barPercentage:.9,offset:!0,gridLines:{offsetGridLines:!0}}]},elements:{rectangle:{borderSkipped:"left"}},tooltips:{callbacks:{title:function(t,e){var n="";return t.length>0&&(t[0].yLabel?n=t[0].yLabel:e.labels.length>0&&t[0].index<e.labels.length&&(n=e.labels[t[0].index])),n},label:function(t,e){return(e.datasets[t.datasetIndex].label||"")+": "+t.xLabel}},mode:"index",axis:"y"}}),e.exports=function(t){t.controllers.bar=t.DatasetController.extend({dataElementType:a.Rectangle,initialize:function(){var e,n=this;t.DatasetController.prototype.initialize.apply(n,arguments),(e=n.getMeta()).stack=n.getDataset().stack,e.bar=!0},update:function(t){var e,n,i=this,a=i.getMeta().data;for(i._ruler=i.getRuler(),e=0,n=a.length;e<n;++e)i.updateElement(a[e],e,t)},updateElement:function(t,e,n){var i=this,a=i.chart,r=i.getMeta(),l=i.getDataset(),s=t.custom||{},u=a.options.elements.rectangle;t._xScale=i.getScaleForId(r.xAxisID),t._yScale=i.getScaleForId(r.yAxisID),t._datasetIndex=i.index,t._index=e,t._model={datasetLabel:l.label,label:a.data.labels[e],borderSkipped:s.borderSkipped?s.borderSkipped:u.borderSkipped,backgroundColor:s.backgroundColor?s.backgroundColor:o.valueAtIndexOrDefault(l.backgroundColor,e,u.backgroundColor),borderColor:s.borderColor?s.borderColor:o.valueAtIndexOrDefault(l.borderColor,e,u.borderColor),borderWidth:s.borderWidth?s.borderWidth:o.valueAtIndexOrDefault(l.borderWidth,e,u.borderWidth)},i.updateElementGeometry(t,e,n),t.pivot()},updateElementGeometry:function(t,e,n){var i=this,a=t._model,o=i.getValueScale(),r=o.getBasePixel(),l=o.isHorizontal(),s=i._ruler||i.getRuler(),u=i.calculateBarValuePixels(i.index,e),d=i.calculateBarIndexPixels(i.index,e,s);a.horizontal=l,a.base=n?r:u.base,a.x=l?n?r:u.head:d.center,a.y=l?d.center:n?r:u.head,a.height=l?d.size:void 0,a.width=l?void 0:d.size},getValueScaleId:function(){return this.getMeta().yAxisID},getIndexScaleId:function(){return this.getMeta().xAxisID},getValueScale:function(){return this.getScaleForId(this.getValueScaleId())},getIndexScale:function(){return this.getScaleForId(this.getIndexScaleId())},getStackCount:function(t){var e,n,i=this,a=i.chart,o=i.getIndexScale().options.stacked,r=void 0===t?a.data.datasets.length:t+1,l=[];for(e=0;e<r;++e)(n=a.getDatasetMeta(e)).bar&&a.isDatasetVisible(e)&&(!1===o||!0===o&&-1===l.indexOf(n.stack)||void 0===o&&(void 0===n.stack||-1===l.indexOf(n.stack)))&&l.push(n.stack);return l.length},getStackIndex:function(t){return this.getStackCount(t)-1},getRuler:function(){var t,e,n=this,i=n.getIndexScale(),a=n.getStackCount(),o=n.index,r=[],l=i.isHorizontal(),s=l?i.left:i.top,u=s+(l?i.width:i.height);for(t=0,e=n.getMeta().data.length;t<e;++t)r.push(i.getPixelForValue(null,t,o));return{pixels:r,start:s,end:u,stackCount:a,scale:i}},calculateBarValuePixels:function(t,e){var n,i,a,o,r,l,s=this,u=s.chart,d=s.getMeta(),c=s.getValueScale(),h=u.data.datasets,f=c.getRightValue(h[t].data[e]),g=c.options.stacked,p=d.stack,v=0;if(g||void 0===g&&void 0!==p)for(n=0;n<t;++n)(i=u.getDatasetMeta(n)).bar&&i.stack===p&&i.controller.getValueScaleId()===c.id&&u.isDatasetVisible(n)&&(a=c.getRightValue(h[n].data[e]),(f<0&&a<0||f>=0&&a>0)&&(v+=a));return o=c.getPixelForValue(v),r=c.getPixelForValue(v+f),l=(r-o)/2,{size:l,base:o,head:r,center:r+l/2}},calculateBarIndexPixels:function(t,e,n){var i,a,r,l,s,u,d=this,c=n.scale.options,h=d.getStackIndex(t),f=n.pixels,g=f[e],p=f.length,v=n.start,m=n.end;return 1===p?(i=g>v?g-v:m-g,a=g<m?m-g:g-v):(e>0&&(i=(g-f[e-1])/2,e===p-1&&(a=i)),e<p-1&&(a=(f[e+1]-g)/2,0===e&&(i=a))),r=i*c.categoryPercentage,l=a*c.categoryPercentage,s=(r+l)/n.stackCount,u=s*c.barPercentage,u=Math.min(o.valueOrDefault(c.barThickness,u),o.valueOrDefault(c.maxBarThickness,1/0)),g-=r,g+=s*h,g+=(s-u)/2,{size:u,base:g,head:g+u,center:g+u/2}},draw:function(){var t=this,e=t.chart,n=t.getValueScale(),i=t.getMeta().data,a=t.getDataset(),r=i.length,l=0;for(o.canvas.clipArea(e.ctx,e.chartArea);l<r;++l)isNaN(n.getRightValue(a.data[l]))||i[l].draw();o.canvas.unclipArea(e.ctx)},setHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],n=t._index,i=t.custom||{},a=t._model;a.backgroundColor=i.hoverBackgroundColor?i.hoverBackgroundColor:o.valueAtIndexOrDefault(e.hoverBackgroundColor,n,o.getHoverColor(a.backgroundColor)),a.borderColor=i.hoverBorderColor?i.hoverBorderColor:o.valueAtIndexOrDefault(e.hoverBorderColor,n,o.getHoverColor(a.borderColor)),a.borderWidth=i.hoverBorderWidth?i.hoverBorderWidth:o.valueAtIndexOrDefault(e.hoverBorderWidth,n,a.borderWidth)},removeHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],n=t._index,i=t.custom||{},a=t._model,r=this.chart.options.elements.rectangle;a.backgroundColor=i.backgroundColor?i.backgroundColor:o.valueAtIndexOrDefault(e.backgroundColor,n,r.backgroundColor),a.borderColor=i.borderColor?i.borderColor:o.valueAtIndexOrDefault(e.borderColor,n,r.borderColor),a.borderWidth=i.borderWidth?i.borderWidth:o.valueAtIndexOrDefault(e.borderWidth,n,r.borderWidth)}}),t.controllers.horizontalBar=t.controllers.bar.extend({getValueScaleId:function(){return this.getMeta().xAxisID},getIndexScaleId:function(){return this.getMeta().yAxisID}})}},{25:25,40:40,45:45}],16:[function(t,e,n){"use strict";var i=t(25),a=t(40),o=t(45);i._set("bubble",{hover:{mode:"single"},scales:{xAxes:[{type:"linear",position:"bottom",id:"x-axis-0"}],yAxes:[{type:"linear",position:"left",id:"y-axis-0"}]},tooltips:{callbacks:{title:function(){return""},label:function(t,e){var n=e.datasets[t.datasetIndex].label||"",i=e.datasets[t.datasetIndex].data[t.index];return n+": ("+t.xLabel+", "+t.yLabel+", "+i.r+")"}}}}),e.exports=function(t){t.controllers.bubble=t.DatasetController.extend({dataElementType:a.Point,update:function(t){var e=this,n=e.getMeta().data;o.each(n,function(n,i){e.updateElement(n,i,t)})},updateElement:function(t,e,n){var i=this,a=i.getMeta(),o=t.custom||{},r=i.getScaleForId(a.xAxisID),l=i.getScaleForId(a.yAxisID),s=i._resolveElementOptions(t,e),u=i.getDataset().data[e],d=i.index,c=n?r.getPixelForDecimal(.5):r.getPixelForValue("object"==typeof u?u:NaN,e,d),h=n?l.getBasePixel():l.getPixelForValue(u,e,d);t._xScale=r,t._yScale=l,t._options=s,t._datasetIndex=d,t._index=e,t._model={backgroundColor:s.backgroundColor,borderColor:s.borderColor,borderWidth:s.borderWidth,hitRadius:s.hitRadius,pointStyle:s.pointStyle,radius:n?0:s.radius,skip:o.skip||isNaN(c)||isNaN(h),x:c,y:h},t.pivot()},setHoverStyle:function(t){var e=t._model,n=t._options;e.backgroundColor=o.valueOrDefault(n.hoverBackgroundColor,o.getHoverColor(n.backgroundColor)),e.borderColor=o.valueOrDefault(n.hoverBorderColor,o.getHoverColor(n.borderColor)),e.borderWidth=o.valueOrDefault(n.hoverBorderWidth,n.borderWidth),e.radius=n.radius+n.hoverRadius},removeHoverStyle:function(t){var e=t._model,n=t._options;e.backgroundColor=n.backgroundColor,e.borderColor=n.borderColor,e.borderWidth=n.borderWidth,e.radius=n.radius},_resolveElementOptions:function(t,e){var n,i,a,r=this,l=r.chart,s=l.data.datasets[r.index],u=t.custom||{},d=l.options.elements.point,c=o.options.resolve,h=s.data[e],f={},g={chart:l,dataIndex:e,dataset:s,datasetIndex:r.index},p=["backgroundColor","borderColor","borderWidth","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth","hoverRadius","hitRadius","pointStyle"];for(n=0,i=p.length;n<i;++n)f[a=p[n]]=c([u[a],s[a],d[a]],g,e);return f.radius=c([u.radius,h?h.r:void 0,s.radius,d.radius],g,e),f}})}},{25:25,40:40,45:45}],17:[function(t,e,n){"use strict";var i=t(25),a=t(40),o=t(45);i._set("doughnut",{animation:{animateRotate:!0,animateScale:!1},hover:{mode:"single"},legendCallback:function(t){var e=[];e.push('<ul class="'+t.id+'-legend">');var n=t.data,i=n.datasets,a=n.labels;if(i.length)for(var o=0;o<i[0].data.length;++o)e.push('<li><span style="background-color:'+i[0].backgroundColor[o]+'"></span>'),a[o]&&e.push(a[o]),e.push("</li>");return e.push("</ul>"),e.join("")},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map(function(n,i){var a=t.getDatasetMeta(0),r=e.datasets[0],l=a.data[i],s=l&&l.custom||{},u=o.valueAtIndexOrDefault,d=t.options.elements.arc;return{text:n,fillStyle:s.backgroundColor?s.backgroundColor:u(r.backgroundColor,i,d.backgroundColor),strokeStyle:s.borderColor?s.borderColor:u(r.borderColor,i,d.borderColor),lineWidth:s.borderWidth?s.borderWidth:u(r.borderWidth,i,d.borderWidth),hidden:isNaN(r.data[i])||a.data[i].hidden,index:i}}):[]}},onClick:function(t,e){var n,i,a,o=e.index,r=this.chart;for(n=0,i=(r.data.datasets||[]).length;n<i;++n)(a=r.getDatasetMeta(n)).data[o]&&(a.data[o].hidden=!a.data[o].hidden);r.update()}},cutoutPercentage:50,rotation:-.5*Math.PI,circumference:2*Math.PI,tooltips:{callbacks:{title:function(){return""},label:function(t,e){var n=e.labels[t.index],i=": "+e.datasets[t.datasetIndex].data[t.index];return o.isArray(n)?(n=n.slice())[0]+=i:n+=i,n}}}}),i._set("pie",o.clone(i.doughnut)),i._set("pie",{cutoutPercentage:0}),e.exports=function(t){t.controllers.doughnut=t.controllers.pie=t.DatasetController.extend({dataElementType:a.Arc,linkScales:o.noop,getRingIndex:function(t){for(var e=0,n=0;n<t;++n)this.chart.isDatasetVisible(n)&&++e;return e},update:function(t){var e=this,n=e.chart,i=n.chartArea,a=n.options,r=a.elements.arc,l=i.right-i.left-r.borderWidth,s=i.bottom-i.top-r.borderWidth,u=Math.min(l,s),d={x:0,y:0},c=e.getMeta(),h=a.cutoutPercentage,f=a.circumference;if(f<2*Math.PI){var g=a.rotation%(2*Math.PI),p=(g+=2*Math.PI*(g>=Math.PI?-1:g<-Math.PI?1:0))+f,v={x:Math.cos(g),y:Math.sin(g)},m={x:Math.cos(p),y:Math.sin(p)},b=g<=0&&p>=0||g<=2*Math.PI&&2*Math.PI<=p,x=g<=.5*Math.PI&&.5*Math.PI<=p||g<=2.5*Math.PI&&2.5*Math.PI<=p,y=g<=-Math.PI&&-Math.PI<=p||g<=Math.PI&&Math.PI<=p,k=g<=.5*-Math.PI&&.5*-Math.PI<=p||g<=1.5*Math.PI&&1.5*Math.PI<=p,w=h/100,M={x:y?-1:Math.min(v.x*(v.x<0?1:w),m.x*(m.x<0?1:w)),y:k?-1:Math.min(v.y*(v.y<0?1:w),m.y*(m.y<0?1:w))},S={x:b?1:Math.max(v.x*(v.x>0?1:w),m.x*(m.x>0?1:w)),y:x?1:Math.max(v.y*(v.y>0?1:w),m.y*(m.y>0?1:w))},C={width:.5*(S.x-M.x),height:.5*(S.y-M.y)};u=Math.min(l/C.width,s/C.height),d={x:-.5*(S.x+M.x),y:-.5*(S.y+M.y)}}n.borderWidth=e.getMaxBorderWidth(c.data),n.outerRadius=Math.max((u-n.borderWidth)/2,0),n.innerRadius=Math.max(h?n.outerRadius/100*h:0,0),n.radiusLength=(n.outerRadius-n.innerRadius)/n.getVisibleDatasetCount(),n.offsetX=d.x*n.outerRadius,n.offsetY=d.y*n.outerRadius,c.total=e.calculateTotal(),e.outerRadius=n.outerRadius-n.radiusLength*e.getRingIndex(e.index),e.innerRadius=Math.max(e.outerRadius-n.radiusLength,0),o.each(c.data,function(n,i){e.updateElement(n,i,t)})},updateElement:function(t,e,n){var i=this,a=i.chart,r=a.chartArea,l=a.options,s=l.animation,u=(r.left+r.right)/2,d=(r.top+r.bottom)/2,c=l.rotation,h=l.rotation,f=i.getDataset(),g=n&&s.animateRotate?0:t.hidden?0:i.calculateCircumference(f.data[e])*(l.circumference/(2*Math.PI)),p=n&&s.animateScale?0:i.innerRadius,v=n&&s.animateScale?0:i.outerRadius,m=o.valueAtIndexOrDefault;o.extend(t,{_datasetIndex:i.index,_index:e,_model:{x:u+a.offsetX,y:d+a.offsetY,startAngle:c,endAngle:h,circumference:g,outerRadius:v,innerRadius:p,label:m(f.label,e,a.data.labels[e])}});var b=t._model;this.removeHoverStyle(t),n&&s.animateRotate||(b.startAngle=0===e?l.rotation:i.getMeta().data[e-1]._model.endAngle,b.endAngle=b.startAngle+b.circumference),t.pivot()},removeHoverStyle:function(e){t.DatasetController.prototype.removeHoverStyle.call(this,e,this.chart.options.elements.arc)},calculateTotal:function(){var t,e=this.getDataset(),n=this.getMeta(),i=0;return o.each(n.data,function(n,a){t=e.data[a],isNaN(t)||n.hidden||(i+=Math.abs(t))}),i},calculateCircumference:function(t){var e=this.getMeta().total;return e>0&&!isNaN(t)?2*Math.PI*(t/e):0},getMaxBorderWidth:function(t){for(var e,n,i=0,a=this.index,o=t.length,r=0;r<o;r++)e=t[r]._model?t[r]._model.borderWidth:0,i=(n=t[r]._chart?t[r]._chart.config.data.datasets[a].hoverBorderWidth:0)>(i=e>i?e:i)?n:i;return i}})}},{25:25,40:40,45:45}],18:[function(t,e,n){"use strict";var i=t(25),a=t(40),o=t(45);i._set("line",{showLines:!0,spanGaps:!1,hover:{mode:"label"},scales:{xAxes:[{type:"category",id:"x-axis-0"}],yAxes:[{type:"linear",id:"y-axis-0"}]}}),e.exports=function(t){function e(t,e){return o.valueOrDefault(t.showLine,e.showLines)}t.controllers.line=t.DatasetController.extend({datasetElementType:a.Line,dataElementType:a.Point,update:function(t){var n,i,a,r=this,l=r.getMeta(),s=l.dataset,u=l.data||[],d=r.chart.options,c=d.elements.line,h=r.getScaleForId(l.yAxisID),f=r.getDataset(),g=e(f,d);for(g&&(a=s.custom||{},void 0!==f.tension&&void 0===f.lineTension&&(f.lineTension=f.tension),s._scale=h,s._datasetIndex=r.index,s._children=u,s._model={spanGaps:f.spanGaps?f.spanGaps:d.spanGaps,tension:a.tension?a.tension:o.valueOrDefault(f.lineTension,c.tension),backgroundColor:a.backgroundColor?a.backgroundColor:f.backgroundColor||c.backgroundColor,borderWidth:a.borderWidth?a.borderWidth:f.borderWidth||c.borderWidth,borderColor:a.borderColor?a.borderColor:f.borderColor||c.borderColor,borderCapStyle:a.borderCapStyle?a.borderCapStyle:f.borderCapStyle||c.borderCapStyle,borderDash:a.borderDash?a.borderDash:f.borderDash||c.borderDash,borderDashOffset:a.borderDashOffset?a.borderDashOffset:f.borderDashOffset||c.borderDashOffset,borderJoinStyle:a.borderJoinStyle?a.borderJoinStyle:f.borderJoinStyle||c.borderJoinStyle,fill:a.fill?a.fill:void 0!==f.fill?f.fill:c.fill,steppedLine:a.steppedLine?a.steppedLine:o.valueOrDefault(f.steppedLine,c.stepped),cubicInterpolationMode:a.cubicInterpolationMode?a.cubicInterpolationMode:o.valueOrDefault(f.cubicInterpolationMode,c.cubicInterpolationMode)},s.pivot()),n=0,i=u.length;n<i;++n)r.updateElement(u[n],n,t);for(g&&0!==s._model.tension&&r.updateBezierControlPoints(),n=0,i=u.length;n<i;++n)u[n].pivot()},getPointBackgroundColor:function(t,e){var n=this.chart.options.elements.point.backgroundColor,i=this.getDataset(),a=t.custom||{};return a.backgroundColor?n=a.backgroundColor:i.pointBackgroundColor?n=o.valueAtIndexOrDefault(i.pointBackgroundColor,e,n):i.backgroundColor&&(n=i.backgroundColor),n},getPointBorderColor:function(t,e){var n=this.chart.options.elements.point.borderColor,i=this.getDataset(),a=t.custom||{};return a.borderColor?n=a.borderColor:i.pointBorderColor?n=o.valueAtIndexOrDefault(i.pointBorderColor,e,n):i.borderColor&&(n=i.borderColor),n},getPointBorderWidth:function(t,e){var n=this.chart.options.elements.point.borderWidth,i=this.getDataset(),a=t.custom||{};return isNaN(a.borderWidth)?!isNaN(i.pointBorderWidth)||o.isArray(i.pointBorderWidth)?n=o.valueAtIndexOrDefault(i.pointBorderWidth,e,n):isNaN(i.borderWidth)||(n=i.borderWidth):n=a.borderWidth,n},updateElement:function(t,e,n){var i,a,r=this,l=r.getMeta(),s=t.custom||{},u=r.getDataset(),d=r.index,c=u.data[e],h=r.getScaleForId(l.yAxisID),f=r.getScaleForId(l.xAxisID),g=r.chart.options.elements.point;void 0!==u.radius&&void 0===u.pointRadius&&(u.pointRadius=u.radius),void 0!==u.hitRadius&&void 0===u.pointHitRadius&&(u.pointHitRadius=u.hitRadius),i=f.getPixelForValue("object"==typeof c?c:NaN,e,d),a=n?h.getBasePixel():r.calculatePointY(c,e,d),t._xScale=f,t._yScale=h,t._datasetIndex=d,t._index=e,t._model={x:i,y:a,skip:s.skip||isNaN(i)||isNaN(a),radius:s.radius||o.valueAtIndexOrDefault(u.pointRadius,e,g.radius),pointStyle:s.pointStyle||o.valueAtIndexOrDefault(u.pointStyle,e,g.pointStyle),backgroundColor:r.getPointBackgroundColor(t,e),borderColor:r.getPointBorderColor(t,e),borderWidth:r.getPointBorderWidth(t,e),tension:l.dataset._model?l.dataset._model.tension:0,steppedLine:!!l.dataset._model&&l.dataset._model.steppedLine,hitRadius:s.hitRadius||o.valueAtIndexOrDefault(u.pointHitRadius,e,g.hitRadius)}},calculatePointY:function(t,e,n){var i,a,o,r=this,l=r.chart,s=r.getMeta(),u=r.getScaleForId(s.yAxisID),d=0,c=0;if(u.options.stacked){for(i=0;i<n;i++)if(a=l.data.datasets[i],"line"===(o=l.getDatasetMeta(i)).type&&o.yAxisID===u.id&&l.isDatasetVisible(i)){var h=Number(u.getRightValue(a.data[e]));h<0?c+=h||0:d+=h||0}var f=Number(u.getRightValue(t));return f<0?u.getPixelForValue(c+f):u.getPixelForValue(d+f)}return u.getPixelForValue(t)},updateBezierControlPoints:function(){function t(t,e,n){return Math.max(Math.min(t,n),e)}var e,n,i,a,r=this,l=r.getMeta(),s=r.chart.chartArea,u=l.data||[];if(l.dataset._model.spanGaps&&(u=u.filter(function(t){return!t._model.skip})),"monotone"===l.dataset._model.cubicInterpolationMode)o.splineCurveMonotone(u);else for(e=0,n=u.length;e<n;++e)i=u[e]._model,a=o.splineCurve(o.previousItem(u,e)._model,i,o.nextItem(u,e)._model,l.dataset._model.tension),i.controlPointPreviousX=a.previous.x,i.controlPointPreviousY=a.previous.y,i.controlPointNextX=a.next.x,i.controlPointNextY=a.next.y;if(r.chart.options.elements.line.capBezierPoints)for(e=0,n=u.length;e<n;++e)(i=u[e]._model).controlPointPreviousX=t(i.controlPointPreviousX,s.left,s.right),i.controlPointPreviousY=t(i.controlPointPreviousY,s.top,s.bottom),i.controlPointNextX=t(i.controlPointNextX,s.left,s.right),i.controlPointNextY=t(i.controlPointNextY,s.top,s.bottom)},draw:function(){var t=this,n=t.chart,i=t.getMeta(),a=i.data||[],r=n.chartArea,l=a.length,s=0;for(o.canvas.clipArea(n.ctx,r),e(t.getDataset(),n.options)&&i.dataset.draw(),o.canvas.unclipArea(n.ctx);s<l;++s)a[s].draw(r)},setHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],n=t._index,i=t.custom||{},a=t._model;a.radius=i.hoverRadius||o.valueAtIndexOrDefault(e.pointHoverRadius,n,this.chart.options.elements.point.hoverRadius),a.backgroundColor=i.hoverBackgroundColor||o.valueAtIndexOrDefault(e.pointHoverBackgroundColor,n,o.getHoverColor(a.backgroundColor)),a.borderColor=i.hoverBorderColor||o.valueAtIndexOrDefault(e.pointHoverBorderColor,n,o.getHoverColor(a.borderColor)),a.borderWidth=i.hoverBorderWidth||o.valueAtIndexOrDefault(e.pointHoverBorderWidth,n,a.borderWidth)},removeHoverStyle:function(t){var e=this,n=e.chart.data.datasets[t._datasetIndex],i=t._index,a=t.custom||{},r=t._model;void 0!==n.radius&&void 0===n.pointRadius&&(n.pointRadius=n.radius),r.radius=a.radius||o.valueAtIndexOrDefault(n.pointRadius,i,e.chart.options.elements.point.radius),r.backgroundColor=e.getPointBackgroundColor(t,i),r.borderColor=e.getPointBorderColor(t,i),r.borderWidth=e.getPointBorderWidth(t,i)}})}},{25:25,40:40,45:45}],19:[function(t,e,n){"use strict";var i=t(25),a=t(40),o=t(45);i._set("polarArea",{scale:{type:"radialLinear",angleLines:{display:!1},gridLines:{circular:!0},pointLabels:{display:!1},ticks:{beginAtZero:!0}},animation:{animateRotate:!0,animateScale:!0},startAngle:-.5*Math.PI,legendCallback:function(t){var e=[];e.push('<ul class="'+t.id+'-legend">');var n=t.data,i=n.datasets,a=n.labels;if(i.length)for(var o=0;o<i[0].data.length;++o)e.push('<li><span style="background-color:'+i[0].backgroundColor[o]+'"></span>'),a[o]&&e.push(a[o]),e.push("</li>");return e.push("</ul>"),e.join("")},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map(function(n,i){var a=t.getDatasetMeta(0),r=e.datasets[0],l=a.data[i].custom||{},s=o.valueAtIndexOrDefault,u=t.options.elements.arc;return{text:n,fillStyle:l.backgroundColor?l.backgroundColor:s(r.backgroundColor,i,u.backgroundColor),strokeStyle:l.borderColor?l.borderColor:s(r.borderColor,i,u.borderColor),lineWidth:l.borderWidth?l.borderWidth:s(r.borderWidth,i,u.borderWidth),hidden:isNaN(r.data[i])||a.data[i].hidden,index:i}}):[]}},onClick:function(t,e){var n,i,a,o=e.index,r=this.chart;for(n=0,i=(r.data.datasets||[]).length;n<i;++n)(a=r.getDatasetMeta(n)).data[o].hidden=!a.data[o].hidden;r.update()}},tooltips:{callbacks:{title:function(){return""},label:function(t,e){return e.labels[t.index]+": "+t.yLabel}}}}),e.exports=function(t){t.controllers.polarArea=t.DatasetController.extend({dataElementType:a.Arc,linkScales:o.noop,update:function(t){var e=this,n=e.chart,i=n.chartArea,a=e.getMeta(),r=n.options,l=r.elements.arc,s=Math.min(i.right-i.left,i.bottom-i.top);n.outerRadius=Math.max((s-l.borderWidth/2)/2,0),n.innerRadius=Math.max(r.cutoutPercentage?n.outerRadius/100*r.cutoutPercentage:1,0),n.radiusLength=(n.outerRadius-n.innerRadius)/n.getVisibleDatasetCount(),e.outerRadius=n.outerRadius-n.radiusLength*e.index,e.innerRadius=e.outerRadius-n.radiusLength,a.count=e.countVisibleElements(),o.each(a.data,function(n,i){e.updateElement(n,i,t)})},updateElement:function(t,e,n){for(var i=this,a=i.chart,r=i.getDataset(),l=a.options,s=l.animation,u=a.scale,d=a.data.labels,c=i.calculateCircumference(r.data[e]),h=u.xCenter,f=u.yCenter,g=0,p=i.getMeta(),v=0;v<e;++v)isNaN(r.data[v])||p.data[v].hidden||++g;var m=l.startAngle,b=t.hidden?0:u.getDistanceFromCenterForValue(r.data[e]),x=m+c*g,y=x+(t.hidden?0:c),k=s.animateScale?0:u.getDistanceFromCenterForValue(r.data[e]);o.extend(t,{_datasetIndex:i.index,_index:e,_scale:u,_model:{x:h,y:f,innerRadius:0,outerRadius:n?k:b,startAngle:n&&s.animateRotate?m:x,endAngle:n&&s.animateRotate?m:y,label:o.valueAtIndexOrDefault(d,e,d[e])}}),i.removeHoverStyle(t),t.pivot()},removeHoverStyle:function(e){t.DatasetController.prototype.removeHoverStyle.call(this,e,this.chart.options.elements.arc)},countVisibleElements:function(){var t=this.getDataset(),e=this.getMeta(),n=0;return o.each(e.data,function(e,i){isNaN(t.data[i])||e.hidden||n++}),n},calculateCircumference:function(t){var e=this.getMeta().count;return e>0&&!isNaN(t)?2*Math.PI/e:0}})}},{25:25,40:40,45:45}],20:[function(t,e,n){"use strict";var i=t(25),a=t(40),o=t(45);i._set("radar",{scale:{type:"radialLinear"},elements:{line:{tension:0}}}),e.exports=function(t){t.controllers.radar=t.DatasetController.extend({datasetElementType:a.Line,dataElementType:a.Point,linkScales:o.noop,update:function(t){var e=this,n=e.getMeta(),i=n.dataset,a=n.data,r=i.custom||{},l=e.getDataset(),s=e.chart.options.elements.line,u=e.chart.scale;void 0!==l.tension&&void 0===l.lineTension&&(l.lineTension=l.tension),o.extend(n.dataset,{_datasetIndex:e.index,_scale:u,_children:a,_loop:!0,_model:{tension:r.tension?r.tension:o.valueOrDefault(l.lineTension,s.tension),backgroundColor:r.backgroundColor?r.backgroundColor:l.backgroundColor||s.backgroundColor,borderWidth:r.borderWidth?r.borderWidth:l.borderWidth||s.borderWidth,borderColor:r.borderColor?r.borderColor:l.borderColor||s.borderColor,fill:r.fill?r.fill:void 0!==l.fill?l.fill:s.fill,borderCapStyle:r.borderCapStyle?r.borderCapStyle:l.borderCapStyle||s.borderCapStyle,borderDash:r.borderDash?r.borderDash:l.borderDash||s.borderDash,borderDashOffset:r.borderDashOffset?r.borderDashOffset:l.borderDashOffset||s.borderDashOffset,borderJoinStyle:r.borderJoinStyle?r.borderJoinStyle:l.borderJoinStyle||s.borderJoinStyle}}),n.dataset.pivot(),o.each(a,function(n,i){e.updateElement(n,i,t)},e),e.updateBezierControlPoints()},updateElement:function(t,e,n){var i=this,a=t.custom||{},r=i.getDataset(),l=i.chart.scale,s=i.chart.options.elements.point,u=l.getPointPositionForValue(e,r.data[e]);void 0!==r.radius&&void 0===r.pointRadius&&(r.pointRadius=r.radius),void 0!==r.hitRadius&&void 0===r.pointHitRadius&&(r.pointHitRadius=r.hitRadius),o.extend(t,{_datasetIndex:i.index,_index:e,_scale:l,_model:{x:n?l.xCenter:u.x,y:n?l.yCenter:u.y,tension:a.tension?a.tension:o.valueOrDefault(r.lineTension,i.chart.options.elements.line.tension),radius:a.radius?a.radius:o.valueAtIndexOrDefault(r.pointRadius,e,s.radius),backgroundColor:a.backgroundColor?a.backgroundColor:o.valueAtIndexOrDefault(r.pointBackgroundColor,e,s.backgroundColor),borderColor:a.borderColor?a.borderColor:o.valueAtIndexOrDefault(r.pointBorderColor,e,s.borderColor),borderWidth:a.borderWidth?a.borderWidth:o.valueAtIndexOrDefault(r.pointBorderWidth,e,s.borderWidth),pointStyle:a.pointStyle?a.pointStyle:o.valueAtIndexOrDefault(r.pointStyle,e,s.pointStyle),hitRadius:a.hitRadius?a.hitRadius:o.valueAtIndexOrDefault(r.pointHitRadius,e,s.hitRadius)}}),t._model.skip=a.skip?a.skip:isNaN(t._model.x)||isNaN(t._model.y)},updateBezierControlPoints:function(){var t=this.chart.chartArea,e=this.getMeta();o.each(e.data,function(n,i){var a=n._model,r=o.splineCurve(o.previousItem(e.data,i,!0)._model,a,o.nextItem(e.data,i,!0)._model,a.tension);a.controlPointPreviousX=Math.max(Math.min(r.previous.x,t.right),t.left),a.controlPointPreviousY=Math.max(Math.min(r.previous.y,t.bottom),t.top),a.controlPointNextX=Math.max(Math.min(r.next.x,t.right),t.left),a.controlPointNextY=Math.max(Math.min(r.next.y,t.bottom),t.top),n.pivot()})},setHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],n=t.custom||{},i=t._index,a=t._model;a.radius=n.hoverRadius?n.hoverRadius:o.valueAtIndexOrDefault(e.pointHoverRadius,i,this.chart.options.elements.point.hoverRadius),a.backgroundColor=n.hoverBackgroundColor?n.hoverBackgroundColor:o.valueAtIndexOrDefault(e.pointHoverBackgroundColor,i,o.getHoverColor(a.backgroundColor)),a.borderColor=n.hoverBorderColor?n.hoverBorderColor:o.valueAtIndexOrDefault(e.pointHoverBorderColor,i,o.getHoverColor(a.borderColor)),a.borderWidth=n.hoverBorderWidth?n.hoverBorderWidth:o.valueAtIndexOrDefault(e.pointHoverBorderWidth,i,a.borderWidth)},removeHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],n=t.custom||{},i=t._index,a=t._model,r=this.chart.options.elements.point;a.radius=n.radius?n.radius:o.valueAtIndexOrDefault(e.pointRadius,i,r.radius),a.backgroundColor=n.backgroundColor?n.backgroundColor:o.valueAtIndexOrDefault(e.pointBackgroundColor,i,r.backgroundColor),a.borderColor=n.borderColor?n.borderColor:o.valueAtIndexOrDefault(e.pointBorderColor,i,r.borderColor),a.borderWidth=n.borderWidth?n.borderWidth:o.valueAtIndexOrDefault(e.pointBorderWidth,i,r.borderWidth)}})}},{25:25,40:40,45:45}],21:[function(t,e,n){"use strict";t(25)._set("scatter",{hover:{mode:"single"},scales:{xAxes:[{id:"x-axis-1",type:"linear",position:"bottom"}],yAxes:[{id:"y-axis-1",type:"linear",position:"left"}]},showLines:!1,tooltips:{callbacks:{title:function(){return""},label:function(t){return"("+t.xLabel+", "+t.yLabel+")"}}}}),e.exports=function(t){t.controllers.scatter=t.controllers.line}},{25:25}],22:[function(t,e,n){"use strict";var i=t(25),a=t(26),o=t(45);i._set("global",{animation:{duration:1e3,easing:"easeOutQuart",onProgress:o.noop,onComplete:o.noop}}),e.exports=function(t){t.Animation=a.extend({chart:null,currentStep:0,numSteps:60,easing:"",render:null,onAnimationProgress:null,onAnimationComplete:null}),t.animationService={frameDuration:17,animations:[],dropFrames:0,request:null,addAnimation:function(t,e,n,i){var a,o,r=this.animations;for(e.chart=t,i||(t.animating=!0),a=0,o=r.length;a<o;++a)if(r[a].chart===t)return void(r[a]=e);r.push(e),1===r.length&&this.requestAnimationFrame()},cancelAnimation:function(t){var e=o.findIndex(this.animations,function(e){return e.chart===t});-1!==e&&(this.animations.splice(e,1),t.animating=!1)},requestAnimationFrame:function(){var t=this;null===t.request&&(t.request=o.requestAnimFrame.call(window,function(){t.request=null,t.startDigest()}))},startDigest:function(){var t=this,e=Date.now(),n=0;t.dropFrames>1&&(n=Math.floor(t.dropFrames),t.dropFrames=t.dropFrames%1),t.advance(1+n);var i=Date.now();t.dropFrames+=(i-e)/t.frameDuration,t.animations.length>0&&t.requestAnimationFrame()},advance:function(t){for(var e,n,i=this.animations,a=0;a<i.length;)n=(e=i[a]).chart,e.currentStep=(e.currentStep||0)+t,e.currentStep=Math.min(e.currentStep,e.numSteps),o.callback(e.render,[n,e],n),o.callback(e.onAnimationProgress,[e],n),e.currentStep>=e.numSteps?(o.callback(e.onAnimationComplete,[e],n),n.animating=!1,i.splice(a,1)):++a}},Object.defineProperty(t.Animation.prototype,"animationObject",{get:function(){return this}}),Object.defineProperty(t.Animation.prototype,"chartInstance",{get:function(){return this.chart},set:function(t){this.chart=t}})}},{25:25,26:26,45:45}],23:[function(t,e,n){"use strict";var i=t(25),a=t(45),o=t(28),r=t(48);e.exports=function(t){function e(t){var e=(t=t||{}).data=t.data||{};return e.datasets=e.datasets||[],e.labels=e.labels||[],t.options=a.configMerge(i.global,i[t.type],t.options||{}),t}function n(t){var e=t.options;e.scale?t.scale.options=e.scale:e.scales&&e.scales.xAxes.concat(e.scales.yAxes).forEach(function(e){t.scales[e.id].options=e}),t.tooltip._options=e.tooltips}function l(t){return"top"===t||"bottom"===t}var s=t.plugins;t.types={},t.instances={},t.controllers={},a.extend(t.prototype,{construct:function(n,i){var o=this;i=e(i);var l=r.acquireContext(n,i),s=l&&l.canvas,u=s&&s.height,d=s&&s.width;o.id=a.uid(),o.ctx=l,o.canvas=s,o.config=i,o.width=d,o.height=u,o.aspectRatio=u?d/u:null,o.options=i.options,o._bufferedRender=!1,o.chart=o,o.controller=o,t.instances[o.id]=o,Object.defineProperty(o,"data",{get:function(){return o.config.data},set:function(t){o.config.data=t}}),l&&s?(o.initialize(),o.update()):console.error("Failed to create chart: can't acquire context from the given item")},initialize:function(){var t=this;return s.notify(t,"beforeInit"),a.retinaScale(t,t.options.devicePixelRatio),t.bindEvents(),t.options.responsive&&t.resize(!0),t.ensureScalesHaveIDs(),t.buildScales(),t.initToolTip(),s.notify(t,"afterInit"),t},clear:function(){return a.canvas.clear(this),this},stop:function(){return t.animationService.cancelAnimation(this),this},resize:function(t){var e=this,n=e.options,i=e.canvas,o=n.maintainAspectRatio&&e.aspectRatio||null,r=Math.max(0,Math.floor(a.getMaximumWidth(i))),l=Math.max(0,Math.floor(o?r/o:a.getMaximumHeight(i)));if((e.width!==r||e.height!==l)&&(i.width=e.width=r,i.height=e.height=l,i.style.width=r+"px",i.style.height=l+"px",a.retinaScale(e,n.devicePixelRatio),!t)){var u={width:r,height:l};s.notify(e,"resize",[u]),e.options.onResize&&e.options.onResize(e,u),e.stop(),e.update(e.options.responsiveAnimationDuration)}},ensureScalesHaveIDs:function(){var t=this.options,e=t.scales||{},n=t.scale;a.each(e.xAxes,function(t,e){t.id=t.id||"x-axis-"+e}),a.each(e.yAxes,function(t,e){t.id=t.id||"y-axis-"+e}),n&&(n.id=n.id||"scale")},buildScales:function(){var e=this,n=e.options,i=e.scales={},o=[];n.scales&&(o=o.concat((n.scales.xAxes||[]).map(function(t){return{options:t,dtype:"category",dposition:"bottom"}}),(n.scales.yAxes||[]).map(function(t){return{options:t,dtype:"linear",dposition:"left"}}))),n.scale&&o.push({options:n.scale,dtype:"radialLinear",isDefault:!0,dposition:"chartArea"}),a.each(o,function(n){var o=n.options,r=a.valueOrDefault(o.type,n.dtype),s=t.scaleService.getScaleConstructor(r);if(s){l(o.position)!==l(n.dposition)&&(o.position=n.dposition);var u=new s({id:o.id,options:o,ctx:e.ctx,chart:e});i[u.id]=u,u.mergeTicksOptions(),n.isDefault&&(e.scale=u)}}),t.scaleService.addScalesToLayout(this)},buildOrUpdateControllers:function(){var e=this,n=[],i=[];return a.each(e.data.datasets,function(a,o){var r=e.getDatasetMeta(o),l=a.type||e.config.type;if(r.type&&r.type!==l&&(e.destroyDatasetMeta(o),r=e.getDatasetMeta(o)),r.type=l,n.push(r.type),r.controller)r.controller.updateIndex(o);else{var s=t.controllers[r.type];if(void 0===s)throw new Error('"'+r.type+'" is not a chart type.');r.controller=new s(e,o),i.push(r.controller)}},e),i},resetElements:function(){var t=this;a.each(t.data.datasets,function(e,n){t.getDatasetMeta(n).controller.reset()},t)},reset:function(){this.resetElements(),this.tooltip.initialize()},update:function(t){var e=this;if(t&&"object"==typeof t||(t={duration:t,lazy:arguments[1]}),n(e),!1!==s.notify(e,"beforeUpdate")){e.tooltip._data=e.data;var i=e.buildOrUpdateControllers();a.each(e.data.datasets,function(t,n){e.getDatasetMeta(n).controller.buildOrUpdateElements()},e),e.updateLayout(),a.each(i,function(t){t.reset()}),e.updateDatasets(),e.tooltip.initialize(),e.lastActive=[],s.notify(e,"afterUpdate"),e._bufferedRender?e._bufferedRequest={duration:t.duration,easing:t.easing,lazy:t.lazy}:e.render(t)}},updateLayout:function(){var e=this;!1!==s.notify(e,"beforeLayout")&&(t.layoutService.update(this,this.width,this.height),s.notify(e,"afterScaleUpdate"),s.notify(e,"afterLayout"))},updateDatasets:function(){var t=this;if(!1!==s.notify(t,"beforeDatasetsUpdate")){for(var e=0,n=t.data.datasets.length;e<n;++e)t.updateDataset(e);s.notify(t,"afterDatasetsUpdate")}},updateDataset:function(t){var e=this,n=e.getDatasetMeta(t),i={meta:n,index:t};!1!==s.notify(e,"beforeDatasetUpdate",[i])&&(n.controller.update(),s.notify(e,"afterDatasetUpdate",[i]))},render:function(e){var n=this;e&&"object"==typeof e||(e={duration:e,lazy:arguments[1]});var i=e.duration,o=e.lazy;if(!1!==s.notify(n,"beforeRender")){var r=n.options.animation,l=function(t){s.notify(n,"afterRender"),a.callback(r&&r.onComplete,[t],n)};if(r&&(void 0!==i&&0!==i||void 0===i&&0!==r.duration)){var u=new t.Animation({numSteps:(i||r.duration)/16.66,easing:e.easing||r.easing,render:function(t,e){var n=a.easing.effects[e.easing],i=e.currentStep,o=i/e.numSteps;t.draw(n(o),o,i)},onAnimationProgress:r.onProgress,onAnimationComplete:l});t.animationService.addAnimation(n,u,i,o)}else n.draw(),l(new t.Animation({numSteps:0,chart:n}));return n}},draw:function(t){var e=this;e.clear(),a.isNullOrUndef(t)&&(t=1),e.transition(t),!1!==s.notify(e,"beforeDraw",[t])&&(a.each(e.boxes,function(t){t.draw(e.chartArea)},e),e.scale&&e.scale.draw(),e.drawDatasets(t),e._drawTooltip(t),s.notify(e,"afterDraw",[t]))},transition:function(t){for(var e=this,n=0,i=(e.data.datasets||[]).length;n<i;++n)e.isDatasetVisible(n)&&e.getDatasetMeta(n).controller.transition(t);e.tooltip.transition(t)},drawDatasets:function(t){var e=this;if(!1!==s.notify(e,"beforeDatasetsDraw",[t])){for(var n=(e.data.datasets||[]).length-1;n>=0;--n)e.isDatasetVisible(n)&&e.drawDataset(n,t);s.notify(e,"afterDatasetsDraw",[t])}},drawDataset:function(t,e){var n=this,i=n.getDatasetMeta(t),a={meta:i,index:t,easingValue:e};!1!==s.notify(n,"beforeDatasetDraw",[a])&&(i.controller.draw(e),s.notify(n,"afterDatasetDraw",[a]))},_drawTooltip:function(t){var e=this,n=e.tooltip,i={tooltip:n,easingValue:t};!1!==s.notify(e,"beforeTooltipDraw",[i])&&(n.draw(),s.notify(e,"afterTooltipDraw",[i]))},getElementAtEvent:function(t){return o.modes.single(this,t)},getElementsAtEvent:function(t){return o.modes.label(this,t,{intersect:!0})},getElementsAtXAxis:function(t){return o.modes["x-axis"](this,t,{intersect:!0})},getElementsAtEventForMode:function(t,e,n){var i=o.modes[e];return"function"==typeof i?i(this,t,n):[]},getDatasetAtEvent:function(t){return o.modes.dataset(this,t,{intersect:!0})},getDatasetMeta:function(t){var e=this,n=e.data.datasets[t];n._meta||(n._meta={});var i=n._meta[e.id];return i||(i=n._meta[e.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null}),i},getVisibleDatasetCount:function(){for(var t=0,e=0,n=this.data.datasets.length;e<n;++e)this.isDatasetVisible(e)&&t++;return t},isDatasetVisible:function(t){var e=this.getDatasetMeta(t);return"boolean"==typeof e.hidden?!e.hidden:!this.data.datasets[t].hidden},generateLegend:function(){return this.options.legendCallback(this)},destroyDatasetMeta:function(t){var e=this.id,n=this.data.datasets[t],i=n._meta&&n._meta[e];i&&(i.controller.destroy(),delete n._meta[e])},destroy:function(){var e,n,i=this,o=i.canvas;for(i.stop(),e=0,n=i.data.datasets.length;e<n;++e)i.destroyDatasetMeta(e);o&&(i.unbindEvents(),a.canvas.clear(i),r.releaseContext(i.ctx),i.canvas=null,i.ctx=null),s.notify(i,"destroy"),delete t.instances[i.id]},toBase64Image:function(){return this.canvas.toDataURL.apply(this.canvas,arguments)},initToolTip:function(){var e=this;e.tooltip=new t.Tooltip({_chart:e,_chartInstance:e,_data:e.data,_options:e.options.tooltips},e)},bindEvents:function(){var t=this,e=t._listeners={},n=function(){t.eventHandler.apply(t,arguments)};a.each(t.options.events,function(i){r.addEventListener(t,i,n),e[i]=n}),t.options.responsive&&(n=function(){t.resize()},r.addEventListener(t,"resize",n),e.resize=n)},unbindEvents:function(){var t=this,e=t._listeners;e&&(delete t._listeners,a.each(e,function(e,n){r.removeEventListener(t,n,e)}))},updateHoverStyle:function(t,e,n){var i,a,o,r=n?"setHoverStyle":"removeHoverStyle";for(a=0,o=t.length;a<o;++a)(i=t[a])&&this.getDatasetMeta(i._datasetIndex).controller[r](i)},eventHandler:function(t){var e=this,n=e.tooltip;if(!1!==s.notify(e,"beforeEvent",[t])){e._bufferedRender=!0,e._bufferedRequest=null;var i=e.handleEvent(t);i|=n&&n.handleEvent(t),s.notify(e,"afterEvent",[t]);var a=e._bufferedRequest;return a?e.render(a):i&&!e.animating&&(e.stop(),e.render(e.options.hover.animationDuration,!0)),e._bufferedRender=!1,e._bufferedRequest=null,e}},handleEvent:function(t){var e=this,n=e.options||{},i=n.hover,o=!1;return e.lastActive=e.lastActive||[],"mouseout"===t.type?e.active=[]:e.active=e.getElementsAtEventForMode(t,i.mode,i),a.callback(n.onHover||n.hover.onHover,[t.native,e.active],e),"mouseup"!==t.type&&"click"!==t.type||n.onClick&&n.onClick.call(e,t.native,e.active),e.lastActive.length&&e.updateHoverStyle(e.lastActive,i.mode,!1),e.active.length&&i.mode&&e.updateHoverStyle(e.active,i.mode,!0),o=!a.arrayEquals(e.active,e.lastActive),e.lastActive=e.active,o}}),t.Controller=t}},{25:25,28:28,45:45,48:48}],24:[function(t,e,n){"use strict";var i=t(45);e.exports=function(t){function e(t,e){t._chartjs?t._chartjs.listeners.push(e):(Object.defineProperty(t,"_chartjs",{configurable:!0,enumerable:!1,value:{listeners:[e]}}),a.forEach(function(e){var n="onData"+e.charAt(0).toUpperCase()+e.slice(1),a=t[e];Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value:function(){var e=Array.prototype.slice.call(arguments),o=a.apply(this,e);return i.each(t._chartjs.listeners,function(t){"function"==typeof t[n]&&t[n].apply(t,e)}),o}})}))}function n(t,e){var n=t._chartjs;if(n){var i=n.listeners,o=i.indexOf(e);-1!==o&&i.splice(o,1),i.length>0||(a.forEach(function(e){delete t[e]}),delete t._chartjs)}}var a=["push","pop","shift","splice","unshift"];t.DatasetController=function(t,e){this.initialize(t,e)},i.extend(t.DatasetController.prototype,{datasetElementType:null,dataElementType:null,initialize:function(t,e){var n=this;n.chart=t,n.index=e,n.linkScales(),n.addElements()},updateIndex:function(t){this.index=t},linkScales:function(){var t=this,e=t.getMeta(),n=t.getDataset();null===e.xAxisID&&(e.xAxisID=n.xAxisID||t.chart.options.scales.xAxes[0].id),null===e.yAxisID&&(e.yAxisID=n.yAxisID||t.chart.options.scales.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(t){return this.chart.scales[t]},reset:function(){this.update(!0)},destroy:function(){this._data&&n(this._data,this)},createMetaDataset:function(){var t=this,e=t.datasetElementType;return e&&new e({_chart:t.chart,_datasetIndex:t.index})},createMetaData:function(t){var e=this,n=e.dataElementType;return n&&new n({_chart:e.chart,_datasetIndex:e.index,_index:t})},addElements:function(){var t,e,n=this,i=n.getMeta(),a=n.getDataset().data||[],o=i.data;for(t=0,e=a.length;t<e;++t)o[t]=o[t]||n.createMetaData(t);i.dataset=i.dataset||n.createMetaDataset()},addElementAndReset:function(t){var e=this.createMetaData(t);this.getMeta().data.splice(t,0,e),this.updateElement(e,t,!0)},buildOrUpdateElements:function(){var t=this,i=t.getDataset(),a=i.data||(i.data=[]);t._data!==a&&(t._data&&n(t._data,t),e(a,t),t._data=a),t.resyncElements()},update:i.noop,transition:function(t){for(var e=this.getMeta(),n=e.data||[],i=n.length,a=0;a<i;++a)n[a].transition(t);e.dataset&&e.dataset.transition(t)},draw:function(){var t=this.getMeta(),e=t.data||[],n=e.length,i=0;for(t.dataset&&t.dataset.draw();i<n;++i)e[i].draw()},removeHoverStyle:function(t,e){var n=this.chart.data.datasets[t._datasetIndex],a=t._index,o=t.custom||{},r=i.valueAtIndexOrDefault,l=t._model;l.backgroundColor=o.backgroundColor?o.backgroundColor:r(n.backgroundColor,a,e.backgroundColor),l.borderColor=o.borderColor?o.borderColor:r(n.borderColor,a,e.borderColor),l.borderWidth=o.borderWidth?o.borderWidth:r(n.borderWidth,a,e.borderWidth)},setHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],n=t._index,a=t.custom||{},o=i.valueAtIndexOrDefault,r=i.getHoverColor,l=t._model;l.backgroundColor=a.hoverBackgroundColor?a.hoverBackgroundColor:o(e.hoverBackgroundColor,n,r(l.backgroundColor)),l.borderColor=a.hoverBorderColor?a.hoverBorderColor:o(e.hoverBorderColor,n,r(l.borderColor)),l.borderWidth=a.hoverBorderWidth?a.hoverBorderWidth:o(e.hoverBorderWidth,n,l.borderWidth)},resyncElements:function(){var t=this,e=t.getMeta(),n=t.getDataset().data,i=e.data.length,a=n.length;a<i?e.data.splice(a,i-a):a>i&&t.insertElements(i,a-i)},insertElements:function(t,e){for(var n=0;n<e;++n)this.addElementAndReset(t+n)},onDataPush:function(){this.insertElements(this.getDataset().data.length-1,arguments.length)},onDataPop:function(){this.getMeta().data.pop()},onDataShift:function(){this.getMeta().data.shift()},onDataSplice:function(t,e){this.getMeta().data.splice(t,e),this.insertElements(t,arguments.length-2)},onDataUnshift:function(){this.insertElements(0,arguments.length)}}),t.DatasetController.extend=i.inherits}},{45:45}],25:[function(t,e,n){"use strict";var i=t(45);e.exports={_set:function(t,e){return i.merge(this[t]||(this[t]={}),e)}}},{45:45}],26:[function(t,e,n){"use strict";function i(t,e,n,i){var o,r,l,s,u,d,c,h,f,g=Object.keys(n);for(o=0,r=g.length;o<r;++o)if(l=g[o],d=n[l],e.hasOwnProperty(l)||(e[l]=d),(s=e[l])!==d&&"_"!==l[0]){if(t.hasOwnProperty(l)||(t[l]=s),u=t[l],(c=typeof d)===typeof u)if("string"===c){if((h=a(u)).valid&&(f=a(d)).valid){e[l]=f.mix(h,i).rgbString();continue}}else if("number"===c&&isFinite(u)&&isFinite(d)){e[l]=u+(d-u)*i;continue}e[l]=d}}var a=t(3),o=t(45),r=function(t){o.extend(this,t),this.initialize.apply(this,arguments)};o.extend(r.prototype,{initialize:function(){this.hidden=!1},pivot:function(){var t=this;return t._view||(t._view=o.clone(t._model)),t._start={},t},transition:function(t){var e=this,n=e._model,a=e._start,o=e._view;return n&&1!==t?(o||(o=e._view={}),a||(a=e._start={}),i(a,o,n,t),e):(e._view=n,e._start=null,e)},tooltipPosition:function(){return{x:this._model.x,y:this._model.y}},hasValue:function(){return o.isNumber(this._model.x)&&o.isNumber(this._model.y)}}),r.extend=o.inherits,e.exports=r},{3:3,45:45}],27:[function(t,e,n){"use strict";var i=t(3),a=t(25),o=t(45);e.exports=function(t){function e(t,e,n){var i;return"string"==typeof t?(i=parseInt(t,10),-1!==t.indexOf("%")&&(i=i/100*e.parentNode[n])):i=t,i}function n(t){return void 0!==t&&null!==t&&"none"!==t}function r(t,i,a){var o=document.defaultView,r=t.parentNode,l=o.getComputedStyle(t)[i],s=o.getComputedStyle(r)[i],u=n(l),d=n(s),c=Number.POSITIVE_INFINITY;return u||d?Math.min(u?e(l,t,a):c,d?e(s,r,a):c):"none"}o.configMerge=function(){return o.merge(o.clone(arguments[0]),[].slice.call(arguments,1),{merger:function(e,n,i,a){var r=n[e]||{},l=i[e];"scales"===e?n[e]=o.scaleMerge(r,l):"scale"===e?n[e]=o.merge(r,[t.scaleService.getScaleDefaults(l.type),l]):o._merger(e,n,i,a)}})},o.scaleMerge=function(){return o.merge(o.clone(arguments[0]),[].slice.call(arguments,1),{merger:function(e,n,i,a){if("xAxes"===e||"yAxes"===e){var r,l,s,u=i[e].length;for(n[e]||(n[e]=[]),r=0;r<u;++r)s=i[e][r],l=o.valueOrDefault(s.type,"xAxes"===e?"category":"linear"),r>=n[e].length&&n[e].push({}),!n[e][r].type||s.type&&s.type!==n[e][r].type?o.merge(n[e][r],[t.scaleService.getScaleDefaults(l),s]):o.merge(n[e][r],s)}else o._merger(e,n,i,a)}})},o.where=function(t,e){if(o.isArray(t)&&Array.prototype.filter)return t.filter(e);var n=[];return o.each(t,function(t){e(t)&&n.push(t)}),n},o.findIndex=Array.prototype.findIndex?function(t,e,n){return t.findIndex(e,n)}:function(t,e,n){n=void 0===n?t:n;for(var i=0,a=t.length;i<a;++i)if(e.call(n,t[i],i,t))return i;return-1},o.findNextWhere=function(t,e,n){o.isNullOrUndef(n)&&(n=-1);for(var i=n+1;i<t.length;i++){var a=t[i];if(e(a))return a}},o.findPreviousWhere=function(t,e,n){o.isNullOrUndef(n)&&(n=t.length);for(var i=n-1;i>=0;i--){var a=t[i];if(e(a))return a}},o.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},o.almostEquals=function(t,e,n){return Math.abs(t-e)<n},o.almostWhole=function(t,e){var n=Math.round(t);return n-e<t&&n+e>t},o.max=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.max(t,e)},Number.NEGATIVE_INFINITY)},o.min=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.min(t,e)},Number.POSITIVE_INFINITY)},o.sign=Math.sign?function(t){return Math.sign(t)}:function(t){return 0==(t=+t)||isNaN(t)?t:t>0?1:-1},o.log10=Math.log10?function(t){return Math.log10(t)}:function(t){return Math.log(t)/Math.LN10},o.toRadians=function(t){return t*(Math.PI/180)},o.toDegrees=function(t){return t*(180/Math.PI)},o.getAngleFromPoint=function(t,e){var n=e.x-t.x,i=e.y-t.y,a=Math.sqrt(n*n+i*i),o=Math.atan2(i,n);return o<-.5*Math.PI&&(o+=2*Math.PI),{angle:o,distance:a}},o.distanceBetweenPoints=function(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))},o.aliasPixel=function(t){return t%2==0?0:.5},o.splineCurve=function(t,e,n,i){var a=t.skip?e:t,o=e,r=n.skip?e:n,l=Math.sqrt(Math.pow(o.x-a.x,2)+Math.pow(o.y-a.y,2)),s=Math.sqrt(Math.pow(r.x-o.x,2)+Math.pow(r.y-o.y,2)),u=l/(l+s),d=s/(l+s),c=i*(u=isNaN(u)?0:u),h=i*(d=isNaN(d)?0:d);return{previous:{x:o.x-c*(r.x-a.x),y:o.y-c*(r.y-a.y)},next:{x:o.x+h*(r.x-a.x),y:o.y+h*(r.y-a.y)}}},o.EPSILON=Number.EPSILON||1e-14,o.splineCurveMonotone=function(t){var e,n,i,a,r=(t||[]).map(function(t){return{model:t._model,deltaK:0,mK:0}}),l=r.length;for(e=0;e<l;++e)if(!(i=r[e]).model.skip){if(n=e>0?r[e-1]:null,(a=e<l-1?r[e+1]:null)&&!a.model.skip){var s=a.model.x-i.model.x;i.deltaK=0!==s?(a.model.y-i.model.y)/s:0}!n||n.model.skip?i.mK=i.deltaK:!a||a.model.skip?i.mK=n.deltaK:this.sign(n.deltaK)!==this.sign(i.deltaK)?i.mK=0:i.mK=(n.deltaK+i.deltaK)/2}var u,d,c,h;for(e=0;e<l-1;++e)i=r[e],a=r[e+1],i.model.skip||a.model.skip||(o.almostEquals(i.deltaK,0,this.EPSILON)?i.mK=a.mK=0:(u=i.mK/i.deltaK,d=a.mK/i.deltaK,(h=Math.pow(u,2)+Math.pow(d,2))<=9||(c=3/Math.sqrt(h),i.mK=u*c*i.deltaK,a.mK=d*c*i.deltaK)));var f;for(e=0;e<l;++e)(i=r[e]).model.skip||(n=e>0?r[e-1]:null,a=e<l-1?r[e+1]:null,n&&!n.model.skip&&(f=(i.model.x-n.model.x)/3,i.model.controlPointPreviousX=i.model.x-f,i.model.controlPointPreviousY=i.model.y-f*i.mK),a&&!a.model.skip&&(f=(a.model.x-i.model.x)/3,i.model.controlPointNextX=i.model.x+f,i.model.controlPointNextY=i.model.y+f*i.mK))},o.nextItem=function(t,e,n){return n?e>=t.length-1?t[0]:t[e+1]:e>=t.length-1?t[t.length-1]:t[e+1]},o.previousItem=function(t,e,n){return n?e<=0?t[t.length-1]:t[e-1]:e<=0?t[0]:t[e-1]},o.niceNum=function(t,e){var n=Math.floor(o.log10(t)),i=t/Math.pow(10,n);return(e?i<1.5?1:i<3?2:i<7?5:10:i<=1?1:i<=2?2:i<=5?5:10)*Math.pow(10,n)},o.requestAnimFrame="undefined"==typeof window?function(t){t()}:window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)},o.getRelativePosition=function(t,e){var n,i,a=t.originalEvent||t,r=t.currentTarget||t.srcElement,l=r.getBoundingClientRect(),s=a.touches;s&&s.length>0?(n=s[0].clientX,i=s[0].clientY):(n=a.clientX,i=a.clientY);var u=parseFloat(o.getStyle(r,"padding-left")),d=parseFloat(o.getStyle(r,"padding-top")),c=parseFloat(o.getStyle(r,"padding-right")),h=parseFloat(o.getStyle(r,"padding-bottom")),f=l.right-l.left-u-c,g=l.bottom-l.top-d-h;return n=Math.round((n-l.left-u)/f*r.width/e.currentDevicePixelRatio),i=Math.round((i-l.top-d)/g*r.height/e.currentDevicePixelRatio),{x:n,y:i}},o.getConstraintWidth=function(t){return r(t,"max-width","clientWidth")},o.getConstraintHeight=function(t){return r(t,"max-height","clientHeight")},o.getMaximumWidth=function(t){var e=t.parentNode;if(!e)return t.clientWidth;var n=parseInt(o.getStyle(e,"padding-left"),10),i=parseInt(o.getStyle(e,"padding-right"),10),a=e.clientWidth-n-i,r=o.getConstraintWidth(t);return isNaN(r)?a:Math.min(a,r)},o.getMaximumHeight=function(t){var e=t.parentNode;if(!e)return t.clientHeight;var n=parseInt(o.getStyle(e,"padding-top"),10),i=parseInt(o.getStyle(e,"padding-bottom"),10),a=e.clientHeight-n-i,r=o.getConstraintHeight(t);return isNaN(r)?a:Math.min(a,r)},o.getStyle=function(t,e){return t.currentStyle?t.currentStyle[e]:document.defaultView.getComputedStyle(t,null).getPropertyValue(e)},o.retinaScale=function(t,e){var n=t.currentDevicePixelRatio=e||window.devicePixelRatio||1;if(1!==n){var i=t.canvas,a=t.height,o=t.width;i.height=a*n,i.width=o*n,t.ctx.scale(n,n),i.style.height=a+"px",i.style.width=o+"px"}},o.fontString=function(t,e,n){return e+" "+t+"px "+n},o.longestText=function(t,e,n,i){var a=(i=i||{}).data=i.data||{},r=i.garbageCollect=i.garbageCollect||[];i.font!==e&&(a=i.data={},r=i.garbageCollect=[],i.font=e),t.font=e;var l=0;o.each(n,function(e){void 0!==e&&null!==e&&!0!==o.isArray(e)?l=o.measureText(t,a,r,l,e):o.isArray(e)&&o.each(e,function(e){void 0===e||null===e||o.isArray(e)||(l=o.measureText(t,a,r,l,e))})});var s=r.length/2;if(s>n.length){for(var u=0;u<s;u++)delete a[r[u]];r.splice(0,s)}return l},o.measureText=function(t,e,n,i,a){var o=e[a];return o||(o=e[a]=t.measureText(a).width,n.push(a)),o>i&&(i=o),i},o.numberOfLabelLines=function(t){var e=1;return o.each(t,function(t){o.isArray(t)&&t.length>e&&(e=t.length)}),e},o.color=i?function(t){return t instanceof CanvasGradient&&(t=a.global.defaultColor),i(t)}:function(t){return console.error("Color.js not found!"),t},o.getHoverColor=function(t){return t instanceof CanvasPattern?t:o.color(t).saturate(.5).darken(.1).rgbString()}}},{25:25,3:3,45:45}],28:[function(t,e,n){"use strict";function i(t,e){return t.native?{x:t.x,y:t.y}:u.getRelativePosition(t,e)}function a(t,e){var n,i,a,o,r;for(i=0,o=t.data.datasets.length;i<o;++i)if(t.isDatasetVisible(i))for(a=0,r=(n=t.getDatasetMeta(i)).data.length;a<r;++a){var l=n.data[a];l._view.skip||e(l)}}function o(t,e){var n=[];return a(t,function(t){t.inRange(e.x,e.y)&&n.push(t)}),n}function r(t,e,n,i){var o=Number.POSITIVE_INFINITY,r=[];return a(t,function(t){if(!n||t.inRange(e.x,e.y)){var a=t.getCenterPoint(),l=i(e,a);l<o?(r=[t],o=l):l===o&&r.push(t)}}),r}function l(t){var e=-1!==t.indexOf("x"),n=-1!==t.indexOf("y");return function(t,i){var a=e?Math.abs(t.x-i.x):0,o=n?Math.abs(t.y-i.y):0;return Math.sqrt(Math.pow(a,2)+Math.pow(o,2))}}function s(t,e,n){var a=i(e,t);n.axis=n.axis||"x";var s=l(n.axis),u=n.intersect?o(t,a):r(t,a,!1,s),d=[];return u.length?(t.data.datasets.forEach(function(e,n){if(t.isDatasetVisible(n)){var i=t.getDatasetMeta(n).data[u[0]._index];i&&!i._view.skip&&d.push(i)}}),d):[]}var u=t(45);e.exports={modes:{single:function(t,e){var n=i(e,t),o=[];return a(t,function(t){if(t.inRange(n.x,n.y))return o.push(t),o}),o.slice(0,1)},label:s,index:s,dataset:function(t,e,n){var a=i(e,t);n.axis=n.axis||"xy";var s=l(n.axis),u=n.intersect?o(t,a):r(t,a,!1,s);return u.length>0&&(u=t.getDatasetMeta(u[0]._datasetIndex).data),u},"x-axis":function(t,e){return s(t,e,{intersect:!1})},point:function(t,e){return o(t,i(e,t))},nearest:function(t,e,n){var a=i(e,t);n.axis=n.axis||"xy";var o=l(n.axis),s=r(t,a,n.intersect,o);return s.length>1&&s.sort(function(t,e){var n=t.getArea()-e.getArea();return 0===n&&(n=t._datasetIndex-e._datasetIndex),n}),s.slice(0,1)},x:function(t,e,n){var o=i(e,t),r=[],l=!1;return a(t,function(t){t.inXRange(o.x)&&r.push(t),t.inRange(o.x,o.y)&&(l=!0)}),n.intersect&&!l&&(r=[]),r},y:function(t,e,n){var o=i(e,t),r=[],l=!1;return a(t,function(t){t.inYRange(o.y)&&r.push(t),t.inRange(o.x,o.y)&&(l=!0)}),n.intersect&&!l&&(r=[]),r}}}},{45:45}],29:[function(t,e,n){"use strict";t(25)._set("global",{responsive:!0,responsiveAnimationDuration:0,maintainAspectRatio:!0,events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"nearest",intersect:!0,animationDuration:400},onClick:null,defaultColor:"rgba(0,0,0,0.1)",defaultFontColor:"#666",defaultFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",defaultFontSize:12,defaultFontStyle:"normal",showLines:!0,elements:{},layout:{padding:{top:0,right:0,bottom:0,left:0}}}),e.exports=function(){var t=function(t,e){return this.construct(t,e),this};return t.Chart=t,t}},{25:25}],30:[function(t,e,n){"use strict";var i=t(45);e.exports=function(t){function e(t,e){return i.where(t,function(t){return t.position===e})}function n(t,e){t.forEach(function(t,e){return t._tmpIndex_=e,t}),t.sort(function(t,n){var i=e?n:t,a=e?t:n;return i.weight===a.weight?i._tmpIndex_-a._tmpIndex_:i.weight-a.weight}),t.forEach(function(t){delete t._tmpIndex_})}t.layoutService={defaults:{},addBox:function(t,e){t.boxes||(t.boxes=[]),e.fullWidth=e.fullWidth||!1,e.position=e.position||"top",e.weight=e.weight||0,t.boxes.push(e)},removeBox:function(t,e){var n=t.boxes?t.boxes.indexOf(e):-1;-1!==n&&t.boxes.splice(n,1)},configure:function(t,e,n){for(var i,a=["fullWidth","position","weight"],o=a.length,r=0;r<o;++r)i=a[r],n.hasOwnProperty(i)&&(e[i]=n[i])},update:function(t,a,o){function r(t){var e=i.findNextWhere(_,function(e){return e.box===t});if(e)if(t.isHorizontal()){var n={left:Math.max(T,D),right:Math.max(F,I),top:0,bottom:0};t.update(t.fullWidth?x:S,y/2,n)}else t.update(e.minSize.width,C)}function l(t){t.isHorizontal()?(t.left=t.fullWidth?d:T,t.right=t.fullWidth?a-c:T+S,t.top=V,t.bottom=V+t.height,V=t.bottom):(t.left=N,t.right=N+t.width,t.top=O,t.bottom=O+C,N=t.right)}if(t){var s=t.options.layout||{},u=i.options.toPadding(s.padding),d=u.left,c=u.right,h=u.top,f=u.bottom,g=e(t.boxes,"left"),p=e(t.boxes,"right"),v=e(t.boxes,"top"),m=e(t.boxes,"bottom"),b=e(t.boxes,"chartArea");n(g,!0),n(p,!1),n(v,!0),n(m,!1);var x=a-d-c,y=o-h-f,k=y/2,w=(a-x/2)/(g.length+p.length),M=(o-k)/(v.length+m.length),S=x,C=y,_=[];i.each(g.concat(p,v,m),function(t){var e,n=t.isHorizontal();n?(e=t.update(t.fullWidth?x:S,M),C-=e.height):(e=t.update(w,k),S-=e.width),_.push({horizontal:n,minSize:e,box:t})});var D=0,I=0,P=0,A=0;i.each(v.concat(m),function(t){if(t.getPadding){var e=t.getPadding();D=Math.max(D,e.left),I=Math.max(I,e.right)}}),i.each(g.concat(p),function(t){if(t.getPadding){var e=t.getPadding();P=Math.max(P,e.top),A=Math.max(A,e.bottom)}});var T=d,F=c,O=h,R=f;i.each(g.concat(p),r),i.each(g,function(t){T+=t.width}),i.each(p,function(t){F+=t.width}),i.each(v.concat(m),r),i.each(v,function(t){O+=t.height}),i.each(m,function(t){R+=t.height}),i.each(g.concat(p),function(t){var e=i.findNextWhere(_,function(e){return e.box===t}),n={left:0,right:0,top:O,bottom:R};e&&t.update(e.minSize.width,C,n)}),T=d,F=c,O=h,R=f,i.each(g,function(t){T+=t.width}),i.each(p,function(t){F+=t.width}),i.each(v,function(t){O+=t.height}),i.each(m,function(t){R+=t.height});var L=Math.max(D-T,0);T+=L,F+=Math.max(I-F,0);var z=Math.max(P-O,0);O+=z,R+=Math.max(A-R,0);var B=o-O-R,W=a-T-F;W===S&&B===C||(i.each(g,function(t){t.height=B}),i.each(p,function(t){t.height=B}),i.each(v,function(t){t.fullWidth||(t.width=W)}),i.each(m,function(t){t.fullWidth||(t.width=W)}),C=B,S=W);var N=d+L,V=h+z;i.each(g.concat(v),l),N+=S,V+=C,i.each(p,l),i.each(m,l),t.chartArea={left:T,top:O,right:T+S,bottom:O+C},i.each(b,function(e){e.left=t.chartArea.left,e.top=t.chartArea.top,e.right=t.chartArea.right,e.bottom=t.chartArea.bottom,e.update(S,C)})}}}}},{45:45}],31:[function(t,e,n){"use strict";var i=t(25),a=t(26),o=t(45);i._set("global",{plugins:{}}),e.exports=function(t){t.plugins={_plugins:[],_cacheId:0,register:function(t){var e=this._plugins;[].concat(t).forEach(function(t){-1===e.indexOf(t)&&e.push(t)}),this._cacheId++},unregister:function(t){var e=this._plugins;[].concat(t).forEach(function(t){var n=e.indexOf(t);-1!==n&&e.splice(n,1)}),this._cacheId++},clear:function(){this._plugins=[],this._cacheId++},count:function(){return this._plugins.length},getAll:function(){return this._plugins},notify:function(t,e,n){var i,a,o,r,l,s=this.descriptors(t),u=s.length;for(i=0;i<u;++i)if(a=s[i],o=a.plugin,"function"==typeof(l=o[e])&&((r=[t].concat(n||[])).push(a.options),!1===l.apply(o,r)))return!1;return!0},descriptors:function(t){var e=t._plugins||(t._plugins={});if(e.id===this._cacheId)return e.descriptors;var n=[],a=[],r=t&&t.config||{},l=r.options&&r.options.plugins||{};return this._plugins.concat(r.plugins||[]).forEach(function(t){if(-1===n.indexOf(t)){var e=t.id,r=l[e];!1!==r&&(!0===r&&(r=o.clone(i.global.plugins[e])),n.push(t),a.push({plugin:t,options:r||{}}))}}),e.descriptors=a,e.id=this._cacheId,a}},t.pluginService=t.plugins,t.PluginBase=a.extend({})}},{25:25,26:26,45:45}],32:[function(t,e,n){"use strict";function i(t){var e,n,i=[];for(e=0,n=t.length;e<n;++e)i.push(t[e].label);return i}function a(t,e,n){var i=t.getPixelForTick(e);return n&&(i-=0===e?(t.getPixelForTick(1)-i)/2:(i-t.getPixelForTick(e-1))/2),i}var o=t(25),r=t(26),l=t(45),s=t(34);o._set("scale",{display:!0,position:"left",offset:!1,gridLines:{display:!0,color:"rgba(0, 0, 0, 0.1)",lineWidth:1,drawBorder:!0,drawOnChartArea:!0,drawTicks:!0,tickMarkLength:10,zeroLineWidth:1,zeroLineColor:"rgba(0,0,0,0.25)",zeroLineBorderDash:[],zeroLineBorderDashOffset:0,offsetGridLines:!1,borderDash:[],borderDashOffset:0},scaleLabel:{display:!1,labelString:"",lineHeight:1.2,padding:{top:4,bottom:4}},ticks:{beginAtZero:!1,minRotation:0,maxRotation:50,mirror:!1,padding:0,reverse:!1,display:!0,autoSkip:!0,autoSkipPadding:0,labelOffset:0,callback:s.formatters.values,minor:{},major:{}}}),e.exports=function(t){function e(t,e,n){return l.isArray(e)?l.longestText(t,n,e):t.measureText(e).width}function n(t){var e=l.valueOrDefault,n=o.global,i=e(t.fontSize,n.defaultFontSize),a=e(t.fontStyle,n.defaultFontStyle),r=e(t.fontFamily,n.defaultFontFamily);return{size:i,style:a,family:r,font:l.fontString(i,a,r)}}function s(t){return l.options.toLineHeight(l.valueOrDefault(t.lineHeight,1.2),l.valueOrDefault(t.fontSize,o.global.defaultFontSize))}t.Scale=r.extend({getPadding:function(){var t=this;return{left:t.paddingLeft||0,top:t.paddingTop||0,right:t.paddingRight||0,bottom:t.paddingBottom||0}},getTicks:function(){return this._ticks},mergeTicksOptions:function(){var t=this.options.ticks;!1===t.minor&&(t.minor={display:!1}),!1===t.major&&(t.major={display:!1});for(var e in t)"major"!==e&&"minor"!==e&&(void 0===t.minor[e]&&(t.minor[e]=t[e]),void 0===t.major[e]&&(t.major[e]=t[e]))},beforeUpdate:function(){l.callback(this.options.beforeUpdate,[this])},update:function(t,e,n){var i,a,o,r,s,u,d=this;for(d.beforeUpdate(),d.maxWidth=t,d.maxHeight=e,d.margins=l.extend({left:0,right:0,top:0,bottom:0},n),d.longestTextCache=d.longestTextCache||{},d.beforeSetDimensions(),d.setDimensions(),d.afterSetDimensions(),d.beforeDataLimits(),d.determineDataLimits(),d.afterDataLimits(),d.beforeBuildTicks(),s=d.buildTicks()||[],d.afterBuildTicks(),d.beforeTickToLabelConversion(),o=d.convertTicksToLabels(s)||d.ticks,d.afterTickToLabelConversion(),d.ticks=o,i=0,a=o.length;i<a;++i)r=o[i],(u=s[i])?u.label=r:s.push(u={label:r,major:!1});return d._ticks=s,d.beforeCalculateTickRotation(),d.calculateTickRotation(),d.afterCalculateTickRotation(),d.beforeFit(),d.fit(),d.afterFit(),d.afterUpdate(),d.minSize},afterUpdate:function(){l.callback(this.options.afterUpdate,[this])},beforeSetDimensions:function(){l.callback(this.options.beforeSetDimensions,[this])},setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0},afterSetDimensions:function(){l.callback(this.options.afterSetDimensions,[this])},beforeDataLimits:function(){l.callback(this.options.beforeDataLimits,[this])},determineDataLimits:l.noop,afterDataLimits:function(){l.callback(this.options.afterDataLimits,[this])},beforeBuildTicks:function(){l.callback(this.options.beforeBuildTicks,[this])},buildTicks:l.noop,afterBuildTicks:function(){l.callback(this.options.afterBuildTicks,[this])},beforeTickToLabelConversion:function(){l.callback(this.options.beforeTickToLabelConversion,[this])},convertTicksToLabels:function(){var t=this,e=t.options.ticks;t.ticks=t.ticks.map(e.userCallback||e.callback,this)},afterTickToLabelConversion:function(){l.callback(this.options.afterTickToLabelConversion,[this])},beforeCalculateTickRotation:function(){l.callback(this.options.beforeCalculateTickRotation,[this])},calculateTickRotation:function(){var t=this,e=t.ctx,a=t.options.ticks,o=i(t._ticks),r=n(a);e.font=r.font;var s=a.minRotation||0;if(o.length&&t.options.display&&t.isHorizontal())for(var u,d=l.longestText(e,r.font,o,t.longestTextCache),c=d,h=t.getPixelForTick(1)-t.getPixelForTick(0)-6;c>h&&s<a.maxRotation;){var f=l.toRadians(s);if(u=Math.cos(f),Math.sin(f)*d>t.maxHeight){s--;break}s++,c=u*d}t.labelRotation=s},afterCalculateTickRotation:function(){l.callback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){l.callback(this.options.beforeFit,[this])},fit:function(){var t=this,a=t.minSize={width:0,height:0},o=i(t._ticks),r=t.options,u=r.ticks,d=r.scaleLabel,c=r.gridLines,h=r.display,f=t.isHorizontal(),g=n(u),p=r.gridLines.tickMarkLength;if(a.width=f?t.isFullWidth()?t.maxWidth-t.margins.left-t.margins.right:t.maxWidth:h&&c.drawTicks?p:0,a.height=f?h&&c.drawTicks?p:0:t.maxHeight,d.display&&h){var v=s(d)+l.options.toPadding(d.padding).height;f?a.height+=v:a.width+=v}if(u.display&&h){var m=l.longestText(t.ctx,g.font,o,t.longestTextCache),b=l.numberOfLabelLines(o),x=.5*g.size,y=t.options.ticks.padding;if(f){t.longestLabelWidth=m;var k=l.toRadians(t.labelRotation),w=Math.cos(k),M=Math.sin(k)*m+g.size*b+x*(b-1)+x;a.height=Math.min(t.maxHeight,a.height+M+y),t.ctx.font=g.font;var S=e(t.ctx,o[0],g.font),C=e(t.ctx,o[o.length-1],g.font);0!==t.labelRotation?(t.paddingLeft="bottom"===r.position?w*S+3:w*x+3,t.paddingRight="bottom"===r.position?w*x+3:w*C+3):(t.paddingLeft=S/2+3,t.paddingRight=C/2+3)}else u.mirror?m=0:m+=y+x,a.width=Math.min(t.maxWidth,a.width+m),t.paddingTop=g.size/2,t.paddingBottom=g.size/2}t.handleMargins(),t.width=a.width,t.height=a.height},handleMargins:function(){var t=this;t.margins&&(t.paddingLeft=Math.max(t.paddingLeft-t.margins.left,0),t.paddingTop=Math.max(t.paddingTop-t.margins.top,0),t.paddingRight=Math.max(t.paddingRight-t.margins.right,0),t.paddingBottom=Math.max(t.paddingBottom-t.margins.bottom,0))},afterFit:function(){l.callback(this.options.afterFit,[this])},isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(t){if(l.isNullOrUndef(t))return NaN;if("number"==typeof t&&!isFinite(t))return NaN;if(t)if(this.isHorizontal()){if(void 0!==t.x)return this.getRightValue(t.x)}else if(void 0!==t.y)return this.getRightValue(t.y);return t},getLabelForIndex:l.noop,getPixelForValue:l.noop,getValueForPixel:l.noop,getPixelForTick:function(t){var e=this,n=e.options.offset;if(e.isHorizontal()){var i=(e.width-(e.paddingLeft+e.paddingRight))/Math.max(e._ticks.length-(n?0:1),1),a=i*t+e.paddingLeft;n&&(a+=i/2);var o=e.left+Math.round(a);return o+=e.isFullWidth()?e.margins.left:0}var r=e.height-(e.paddingTop+e.paddingBottom);return e.top+t*(r/(e._ticks.length-1))},getPixelForDecimal:function(t){var e=this;if(e.isHorizontal()){var n=(e.width-(e.paddingLeft+e.paddingRight))*t+e.paddingLeft,i=e.left+Math.round(n);return i+=e.isFullWidth()?e.margins.left:0}return e.top+t*e.height},getBasePixel:function(){return this.getPixelForValue(this.getBaseValue())},getBaseValue:function(){var t=this,e=t.min,n=t.max;return t.beginAtZero?0:e<0&&n<0?n:e>0&&n>0?e:0},_autoSkip:function(t){var e,n,i,a,o=this,r=o.isHorizontal(),s=o.options.ticks.minor,u=t.length,d=l.toRadians(o.labelRotation),c=Math.cos(d),h=o.longestLabelWidth*c,f=[];for(s.maxTicksLimit&&(a=s.maxTicksLimit),r&&(e=!1,(h+s.autoSkipPadding)*u>o.width-(o.paddingLeft+o.paddingRight)&&(e=1+Math.floor((h+s.autoSkipPadding)*u/(o.width-(o.paddingLeft+o.paddingRight)))),a&&u>a&&(e=Math.max(e,Math.floor(u/a)))),n=0;n<u;n++)i=t[n],(e>1&&n%e>0||n%e==0&&n+e>=u)&&n!==u-1&&delete i.label,f.push(i);return f},draw:function(t){var e=this,i=e.options;if(i.display){var r=e.ctx,u=o.global,d=i.ticks.minor,c=i.ticks.major||d,h=i.gridLines,f=i.scaleLabel,g=0!==e.labelRotation,p=e.isHorizontal(),v=d.autoSkip?e._autoSkip(e.getTicks()):e.getTicks(),m=l.valueOrDefault(d.fontColor,u.defaultFontColor),b=n(d),x=l.valueOrDefault(c.fontColor,u.defaultFontColor),y=n(c),k=h.drawTicks?h.tickMarkLength:0,w=l.valueOrDefault(f.fontColor,u.defaultFontColor),M=n(f),S=l.options.toPadding(f.padding),C=l.toRadians(e.labelRotation),_=[],D="right"===i.position?e.left:e.right-k,I="right"===i.position?e.left+k:e.right,P="bottom"===i.position?e.top:e.bottom-k,A="bottom"===i.position?e.top+k:e.bottom;if(l.each(v,function(n,o){if(!l.isNullOrUndef(n.label)){var r,s,c,f,m=n.label;o===e.zeroLineIndex&&i.offset===h.offsetGridLines?(r=h.zeroLineWidth,s=h.zeroLineColor,c=h.zeroLineBorderDash,f=h.zeroLineBorderDashOffset):(r=l.valueAtIndexOrDefault(h.lineWidth,o),s=l.valueAtIndexOrDefault(h.color,o),c=l.valueOrDefault(h.borderDash,u.borderDash),f=l.valueOrDefault(h.borderDashOffset,u.borderDashOffset));var b,x,y,w,M,S,T,F,O,R,L="middle",z="middle",B=d.padding;if(p){var W=k+B;"bottom"===i.position?(z=g?"middle":"top",L=g?"right":"center",R=e.top+W):(z=g?"middle":"bottom",L=g?"left":"center",R=e.bottom-W);var N=a(e,o,h.offsetGridLines&&v.length>1);N<e.left&&(s="rgba(0,0,0,0)"),N+=l.aliasPixel(r),O=e.getPixelForTick(o)+d.labelOffset,b=y=M=T=N,x=P,w=A,S=t.top,F=t.bottom}else{var V,E="left"===i.position;d.mirror?(L=E?"left":"right",V=B):(L=E?"right":"left",V=k+B),O=E?e.right-V:e.left+V;var H=a(e,o,h.offsetGridLines&&v.length>1);H<e.top&&(s="rgba(0,0,0,0)"),H+=l.aliasPixel(r),R=e.getPixelForTick(o)+d.labelOffset,b=D,y=I,M=t.left,T=t.right,x=w=S=F=H}_.push({tx1:b,ty1:x,tx2:y,ty2:w,x1:M,y1:S,x2:T,y2:F,labelX:O,labelY:R,glWidth:r,glColor:s,glBorderDash:c,glBorderDashOffset:f,rotation:-1*C,label:m,major:n.major,textBaseline:z,textAlign:L})}}),l.each(_,function(t){if(h.display&&(r.save(),r.lineWidth=t.glWidth,r.strokeStyle=t.glColor,r.setLineDash&&(r.setLineDash(t.glBorderDash),r.lineDashOffset=t.glBorderDashOffset),r.beginPath(),h.drawTicks&&(r.moveTo(t.tx1,t.ty1),r.lineTo(t.tx2,t.ty2)),h.drawOnChartArea&&(r.moveTo(t.x1,t.y1),r.lineTo(t.x2,t.y2)),r.stroke(),r.restore()),d.display){r.save(),r.translate(t.labelX,t.labelY),r.rotate(t.rotation),r.font=t.major?y.font:b.font,r.fillStyle=t.major?x:m,r.textBaseline=t.textBaseline,r.textAlign=t.textAlign;var e=t.label;if(l.isArray(e))for(var n=0,i=0;n<e.length;++n)r.fillText(""+e[n],0,i),i+=1.5*b.size;else r.fillText(e,0,0);r.restore()}}),f.display){var T,F,O=0,R=s(f)/2;if(p)T=e.left+(e.right-e.left)/2,F="bottom"===i.position?e.bottom-R-S.bottom:e.top+R+S.top;else{var L="left"===i.position;T=L?e.left+R+S.top:e.right-R-S.top,F=e.top+(e.bottom-e.top)/2,O=L?-.5*Math.PI:.5*Math.PI}r.save(),r.translate(T,F),r.rotate(O),r.textAlign="center",r.textBaseline="middle",r.fillStyle=w,r.font=M.font,r.fillText(f.labelString,0,0),r.restore()}if(h.drawBorder){r.lineWidth=l.valueAtIndexOrDefault(h.lineWidth,0),r.strokeStyle=l.valueAtIndexOrDefault(h.color,0);var z=e.left,B=e.right,W=e.top,N=e.bottom,V=l.aliasPixel(r.lineWidth);p?(W=N="top"===i.position?e.bottom:e.top,W+=V,N+=V):(z=B="left"===i.position?e.right:e.left,z+=V,B+=V),r.beginPath(),r.moveTo(z,W),r.lineTo(B,N),r.stroke()}}}})}},{25:25,26:26,34:34,45:45}],33:[function(t,e,n){"use strict";var i=t(25),a=t(45);e.exports=function(t){t.scaleService={constructors:{},defaults:{},registerScaleType:function(t,e,n){this.constructors[t]=e,this.defaults[t]=a.clone(n)},getScaleConstructor:function(t){return this.constructors.hasOwnProperty(t)?this.constructors[t]:void 0},getScaleDefaults:function(t){return this.defaults.hasOwnProperty(t)?a.merge({},[i.scale,this.defaults[t]]):{}},updateScaleDefaults:function(t,e){var n=this;n.defaults.hasOwnProperty(t)&&(n.defaults[t]=a.extend(n.defaults[t],e))},addScalesToLayout:function(e){a.each(e.scales,function(n){n.fullWidth=n.options.fullWidth,n.position=n.options.position,n.weight=n.options.weight,t.layoutService.addBox(e,n)})}}}},{25:25,45:45}],34:[function(t,e,n){"use strict";var i=t(45);e.exports={generators:{linear:function(t,e){var n,a=[];if(t.stepSize&&t.stepSize>0)n=t.stepSize;else{var o=i.niceNum(e.max-e.min,!1);n=i.niceNum(o/(t.maxTicks-1),!0)}var r=Math.floor(e.min/n)*n,l=Math.ceil(e.max/n)*n;t.min&&t.max&&t.stepSize&&i.almostWhole((t.max-t.min)/t.stepSize,n/1e3)&&(r=t.min,l=t.max);var s=(l-r)/n;s=i.almostEquals(s,Math.round(s),n/1e3)?Math.round(s):Math.ceil(s),a.push(void 0!==t.min?t.min:r);for(var u=1;u<s;++u)a.push(r+u*n);return a.push(void 0!==t.max?t.max:l),a},logarithmic:function(t,e){var n,a,o=[],r=i.valueOrDefault,l=r(t.min,Math.pow(10,Math.floor(i.log10(e.min)))),s=Math.floor(i.log10(e.max)),u=Math.ceil(e.max/Math.pow(10,s));0===l?(n=Math.floor(i.log10(e.minNotZero)),a=Math.floor(e.minNotZero/Math.pow(10,n)),o.push(l),l=a*Math.pow(10,n)):(n=Math.floor(i.log10(l)),a=Math.floor(l/Math.pow(10,n)));do{o.push(l),10===++a&&(a=1,++n),l=a*Math.pow(10,n)}while(n<s||n===s&&a<u);var d=r(t.max,l);return o.push(d),o}},formatters:{values:function(t){return i.isArray(t)?t:""+t},linear:function(t,e,n){var a=n.length>3?n[2]-n[1]:n[1]-n[0];Math.abs(a)>1&&t!==Math.floor(t)&&(a=t-Math.floor(t));var o=i.log10(Math.abs(a)),r="";if(0!==t){var l=-1*Math.floor(o);l=Math.max(Math.min(l,20),0),r=t.toFixed(l)}else r="0";return r},logarithmic:function(t,e,n){var a=t/Math.pow(10,Math.floor(i.log10(t)));return 0===t?"0":1===a||2===a||5===a||0===e||e===n.length-1?t.toExponential():""}}}},{45:45}],35:[function(t,e,n){"use strict";var i=t(25),a=t(26),o=t(45);i._set("global",{tooltips:{enabled:!0,custom:null,mode:"nearest",position:"average",intersect:!0,backgroundColor:"rgba(0,0,0,0.8)",titleFontStyle:"bold",titleSpacing:2,titleMarginBottom:6,titleFontColor:"#fff",titleAlign:"left",bodySpacing:2,bodyFontColor:"#fff",bodyAlign:"left",footerFontStyle:"bold",footerSpacing:2,footerMarginTop:6,footerFontColor:"#fff",footerAlign:"left",yPadding:6,xPadding:6,caretPadding:2,caretSize:5,cornerRadius:6,multiKeyBackground:"#fff",displayColors:!0,borderColor:"rgba(0,0,0,0)",borderWidth:0,callbacks:{beforeTitle:o.noop,title:function(t,e){var n="",i=e.labels,a=i?i.length:0;if(t.length>0){var o=t[0];o.xLabel?n=o.xLabel:a>0&&o.index<a&&(n=i[o.index])}return n},afterTitle:o.noop,beforeBody:o.noop,beforeLabel:o.noop,label:function(t,e){var n=e.datasets[t.datasetIndex].label||"";return n&&(n+=": "),n+=t.yLabel},labelColor:function(t,e){var n=e.getDatasetMeta(t.datasetIndex).data[t.index]._view;return{borderColor:n.borderColor,backgroundColor:n.backgroundColor}},labelTextColor:function(){return this._options.bodyFontColor},afterLabel:o.noop,afterBody:o.noop,beforeFooter:o.noop,footer:o.noop,afterFooter:o.noop}}}),e.exports=function(t){function e(t,e){var n=o.color(t);return n.alpha(e*n.alpha()).rgbaString()}function n(t,e){return e&&(o.isArray(e)?Array.prototype.push.apply(t,e):t.push(e)),t}function r(t){var e=t._xScale,n=t._yScale||t._scale,i=t._index,a=t._datasetIndex;return{xLabel:e?e.getLabelForIndex(i,a):"",yLabel:n?n.getLabelForIndex(i,a):"",index:i,datasetIndex:a,x:t._model.x,y:t._model.y}}function l(t){var e=i.global,n=o.valueOrDefault;return{xPadding:t.xPadding,yPadding:t.yPadding,xAlign:t.xAlign,yAlign:t.yAlign,bodyFontColor:t.bodyFontColor,_bodyFontFamily:n(t.bodyFontFamily,e.defaultFontFamily),_bodyFontStyle:n(t.bodyFontStyle,e.defaultFontStyle),_bodyAlign:t.bodyAlign,bodyFontSize:n(t.bodyFontSize,e.defaultFontSize),bodySpacing:t.bodySpacing,titleFontColor:t.titleFontColor,_titleFontFamily:n(t.titleFontFamily,e.defaultFontFamily),_titleFontStyle:n(t.titleFontStyle,e.defaultFontStyle),titleFontSize:n(t.titleFontSize,e.defaultFontSize),_titleAlign:t.titleAlign,titleSpacing:t.titleSpacing,titleMarginBottom:t.titleMarginBottom,footerFontColor:t.footerFontColor,_footerFontFamily:n(t.footerFontFamily,e.defaultFontFamily),_footerFontStyle:n(t.footerFontStyle,e.defaultFontStyle),footerFontSize:n(t.footerFontSize,e.defaultFontSize),_footerAlign:t.footerAlign,footerSpacing:t.footerSpacing,footerMarginTop:t.footerMarginTop,caretSize:t.caretSize,cornerRadius:t.cornerRadius,backgroundColor:t.backgroundColor,opacity:0,legendColorBackground:t.multiKeyBackground,displayColors:t.displayColors,borderColor:t.borderColor,borderWidth:t.borderWidth}}function s(t,e){var n=t._chart.ctx,i=2*e.yPadding,a=0,r=e.body,l=r.reduce(function(t,e){return t+e.before.length+e.lines.length+e.after.length},0);l+=e.beforeBody.length+e.afterBody.length;var s=e.title.length,u=e.footer.length,d=e.titleFontSize,c=e.bodyFontSize,h=e.footerFontSize;i+=s*d,i+=s?(s-1)*e.titleSpacing:0,i+=s?e.titleMarginBottom:0,i+=l*c,i+=l?(l-1)*e.bodySpacing:0,i+=u?e.footerMarginTop:0,i+=u*h,i+=u?(u-1)*e.footerSpacing:0;var f=0,g=function(t){a=Math.max(a,n.measureText(t).width+f)};return n.font=o.fontString(d,e._titleFontStyle,e._titleFontFamily),o.each(e.title,g),n.font=o.fontString(c,e._bodyFontStyle,e._bodyFontFamily),o.each(e.beforeBody.concat(e.afterBody),g),f=e.displayColors?c+2:0,o.each(r,function(t){o.each(t.before,g),o.each(t.lines,g),o.each(t.after,g)}),f=0,n.font=o.fontString(h,e._footerFontStyle,e._footerFontFamily),o.each(e.footer,g),a+=2*e.xPadding,{width:a,height:i}}function u(t,e){var n=t._model,i=t._chart,a=t._chart.chartArea,o="center",r="center";n.y<e.height?r="top":n.y>i.height-e.height&&(r="bottom");var l,s,u,d,c,h=(a.left+a.right)/2,f=(a.top+a.bottom)/2;"center"===r?(l=function(t){return t<=h},s=function(t){return t>h}):(l=function(t){return t<=e.width/2},s=function(t){return t>=i.width-e.width/2}),u=function(t){return t+e.width>i.width},d=function(t){return t-e.width<0},c=function(t){return t<=f?"top":"bottom"},l(n.x)?(o="left",u(n.x)&&(o="center",r=c(n.y))):s(n.x)&&(o="right",d(n.x)&&(o="center",r=c(n.y)));var g=t._options;return{xAlign:g.xAlign?g.xAlign:o,yAlign:g.yAlign?g.yAlign:r}}function d(t,e,n){var i=t.x,a=t.y,o=t.caretSize,r=t.caretPadding,l=t.cornerRadius,s=n.xAlign,u=n.yAlign,d=o+r,c=l+r;return"right"===s?i-=e.width:"center"===s&&(i-=e.width/2),"top"===u?a+=d:a-="bottom"===u?e.height+d:e.height/2,"center"===u?"left"===s?i+=d:"right"===s&&(i-=d):"left"===s?i-=c:"right"===s&&(i+=c),{x:i,y:a}}t.Tooltip=a.extend({initialize:function(){this._model=l(this._options),this._lastActive=[]},getTitle:function(){var t=this,e=t._options.callbacks,i=e.beforeTitle.apply(t,arguments),a=e.title.apply(t,arguments),o=e.afterTitle.apply(t,arguments),r=[];return r=n(r,i),r=n(r,a),r=n(r,o)},getBeforeBody:function(){var t=this._options.callbacks.beforeBody.apply(this,arguments);return o.isArray(t)?t:void 0!==t?[t]:[]},getBody:function(t,e){var i=this,a=i._options.callbacks,r=[];return o.each(t,function(t){var o={before:[],lines:[],after:[]};n(o.before,a.beforeLabel.call(i,t,e)),n(o.lines,a.label.call(i,t,e)),n(o.after,a.afterLabel.call(i,t,e)),r.push(o)}),r},getAfterBody:function(){var t=this._options.callbacks.afterBody.apply(this,arguments);return o.isArray(t)?t:void 0!==t?[t]:[]},getFooter:function(){var t=this,e=t._options.callbacks,i=e.beforeFooter.apply(t,arguments),a=e.footer.apply(t,arguments),o=e.afterFooter.apply(t,arguments),r=[];return r=n(r,i),r=n(r,a),r=n(r,o)},update:function(e){var n,i,a=this,c=a._options,h=a._model,f=a._model=l(c),g=a._active,p=a._data,v={xAlign:h.xAlign,yAlign:h.yAlign},m={x:h.x,y:h.y},b={width:h.width,height:h.height},x={x:h.caretX,y:h.caretY};if(g.length){f.opacity=1;var y=[],k=[];x=t.Tooltip.positioners[c.position].call(a,g,a._eventPosition);var w=[];for(n=0,i=g.length;n<i;++n)w.push(r(g[n]));c.filter&&(w=w.filter(function(t){return c.filter(t,p)})),c.itemSort&&(w=w.sort(function(t,e){return c.itemSort(t,e,p)})),o.each(w,function(t){y.push(c.callbacks.labelColor.call(a,t,a._chart)),k.push(c.callbacks.labelTextColor.call(a,t,a._chart))}),f.title=a.getTitle(w,p),f.beforeBody=a.getBeforeBody(w,p),f.body=a.getBody(w,p),f.afterBody=a.getAfterBody(w,p),f.footer=a.getFooter(w,p),f.x=Math.round(x.x),f.y=Math.round(x.y),f.caretPadding=c.caretPadding,f.labelColors=y,f.labelTextColors=k,f.dataPoints=w,m=d(f,b=s(this,f),v=u(this,b))}else f.opacity=0;return f.xAlign=v.xAlign,f.yAlign=v.yAlign,f.x=m.x,f.y=m.y,f.width=b.width,f.height=b.height,f.caretX=x.x,f.caretY=x.y,a._model=f,e&&c.custom&&c.custom.call(a,f),a},drawCaret:function(t,e){var n=this._chart.ctx,i=this._view,a=this.getCaretPosition(t,e,i);n.lineTo(a.x1,a.y1),n.lineTo(a.x2,a.y2),n.lineTo(a.x3,a.y3)},getCaretPosition:function(t,e,n){var i,a,o,r,l,s,u=n.caretSize,d=n.cornerRadius,c=n.xAlign,h=n.yAlign,f=t.x,g=t.y,p=e.width,v=e.height;if("center"===h)l=g+v/2,"left"===c?(a=(i=f)-u,o=i,r=l+u,s=l-u):(a=(i=f+p)+u,o=i,r=l-u,s=l+u);else if("left"===c?(i=(a=f+d+u)-u,o=a+u):"right"===c?(i=(a=f+p-d-u)-u,o=a+u):(i=(a=f+p/2)-u,o=a+u),"top"===h)l=(r=g)-u,s=r;else{l=(r=g+v)+u,s=r;var m=o;o=i,i=m}return{x1:i,x2:a,x3:o,y1:r,y2:l,y3:s}},drawTitle:function(t,n,i,a){var r=n.title;if(r.length){i.textAlign=n._titleAlign,i.textBaseline="top";var l=n.titleFontSize,s=n.titleSpacing;i.fillStyle=e(n.titleFontColor,a),i.font=o.fontString(l,n._titleFontStyle,n._titleFontFamily);var u,d;for(u=0,d=r.length;u<d;++u)i.fillText(r[u],t.x,t.y),t.y+=l+s,u+1===r.length&&(t.y+=n.titleMarginBottom-s)}},drawBody:function(t,n,i,a){var r=n.bodyFontSize,l=n.bodySpacing,s=n.body;i.textAlign=n._bodyAlign,i.textBaseline="top",i.font=o.fontString(r,n._bodyFontStyle,n._bodyFontFamily);var u=0,d=function(e){i.fillText(e,t.x+u,t.y),t.y+=r+l};i.fillStyle=e(n.bodyFontColor,a),o.each(n.beforeBody,d);var c=n.displayColors;u=c?r+2:0,o.each(s,function(l,s){var u=e(n.labelTextColors[s],a);i.fillStyle=u,o.each(l.before,d),o.each(l.lines,function(o){c&&(i.fillStyle=e(n.legendColorBackground,a),i.fillRect(t.x,t.y,r,r),i.lineWidth=1,i.strokeStyle=e(n.labelColors[s].borderColor,a),i.strokeRect(t.x,t.y,r,r),i.fillStyle=e(n.labelColors[s].backgroundColor,a),i.fillRect(t.x+1,t.y+1,r-2,r-2),i.fillStyle=u),d(o)}),o.each(l.after,d)}),u=0,o.each(n.afterBody,d),t.y-=l},drawFooter:function(t,n,i,a){var r=n.footer;r.length&&(t.y+=n.footerMarginTop,i.textAlign=n._footerAlign,i.textBaseline="top",i.fillStyle=e(n.footerFontColor,a),i.font=o.fontString(n.footerFontSize,n._footerFontStyle,n._footerFontFamily),o.each(r,function(e){i.fillText(e,t.x,t.y),t.y+=n.footerFontSize+n.footerSpacing}))},drawBackground:function(t,n,i,a,o){i.fillStyle=e(n.backgroundColor,o),i.strokeStyle=e(n.borderColor,o),i.lineWidth=n.borderWidth;var r=n.xAlign,l=n.yAlign,s=t.x,u=t.y,d=a.width,c=a.height,h=n.cornerRadius;i.beginPath(),i.moveTo(s+h,u),"top"===l&&this.drawCaret(t,a),i.lineTo(s+d-h,u),i.quadraticCurveTo(s+d,u,s+d,u+h),"center"===l&&"right"===r&&this.drawCaret(t,a),i.lineTo(s+d,u+c-h),i.quadraticCurveTo(s+d,u+c,s+d-h,u+c),"bottom"===l&&this.drawCaret(t,a),i.lineTo(s+h,u+c),i.quadraticCurveTo(s,u+c,s,u+c-h),"center"===l&&"left"===r&&this.drawCaret(t,a),i.lineTo(s,u+h),i.quadraticCurveTo(s,u,s+h,u),i.closePath(),i.fill(),n.borderWidth>0&&i.stroke()},draw:function(){var t=this._chart.ctx,e=this._view;if(0!==e.opacity){var n={width:e.width,height:e.height},i={x:e.x,y:e.y},a=Math.abs(e.opacity<.001)?0:e.opacity,o=e.title.length||e.beforeBody.length||e.body.length||e.afterBody.length||e.footer.length;this._options.enabled&&o&&(this.drawBackground(i,e,t,n,a),i.x+=e.xPadding,i.y+=e.yPadding,this.drawTitle(i,e,t,a),this.drawBody(i,e,t,a),this.drawFooter(i,e,t,a))}},handleEvent:function(t){var e=this,n=e._options,i=!1;if(e._lastActive=e._lastActive||[],"mouseout"===t.type?e._active=[]:e._active=e._chart.getElementsAtEventForMode(t,n.mode,n),!(i=!o.arrayEquals(e._active,e._lastActive)))return!1;if(e._lastActive=e._active,n.enabled||n.custom){e._eventPosition={x:t.x,y:t.y};var a=e._model;e.update(!0),e.pivot(),i|=a.x!==e._model.x||a.y!==e._model.y}return i}}),t.Tooltip.positioners={average:function(t){if(!t.length)return!1;var e,n,i=0,a=0,o=0;for(e=0,n=t.length;e<n;++e){var r=t[e];if(r&&r.hasValue()){var l=r.tooltipPosition();i+=l.x,a+=l.y,++o}}return{x:Math.round(i/o),y:Math.round(a/o)}},nearest:function(t,e){var n,i,a,r=e.x,l=e.y,s=Number.POSITIVE_INFINITY;for(n=0,i=t.length;n<i;++n){var u=t[n];if(u&&u.hasValue()){var d=u.getCenterPoint(),c=o.distanceBetweenPoints(e,d);c<s&&(s=c,a=u)}}if(a){var h=a.tooltipPosition();r=h.x,l=h.y}return{x:r,y:l}}}}},{25:25,26:26,45:45}],36:[function(t,e,n){"use strict";var i=t(25),a=t(26),o=t(45);i._set("global",{elements:{arc:{backgroundColor:i.global.defaultColor,borderColor:"#fff",borderWidth:2}}}),e.exports=a.extend({inLabelRange:function(t){var e=this._view;return!!e&&Math.pow(t-e.x,2)<Math.pow(e.radius+e.hoverRadius,2)},inRange:function(t,e){var n=this._view;if(n){for(var i=o.getAngleFromPoint(n,{x:t,y:e}),a=i.angle,r=i.distance,l=n.startAngle,s=n.endAngle;s<l;)s+=2*Math.PI;for(;a>s;)a-=2*Math.PI;for(;a<l;)a+=2*Math.PI;var u=a>=l&&a<=s,d=r>=n.innerRadius&&r<=n.outerRadius;return u&&d}return!1},getCenterPoint:function(){var t=this._view,e=(t.startAngle+t.endAngle)/2,n=(t.innerRadius+t.outerRadius)/2;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},getArea:function(){var t=this._view;return Math.PI*((t.endAngle-t.startAngle)/(2*Math.PI))*(Math.pow(t.outerRadius,2)-Math.pow(t.innerRadius,2))},tooltipPosition:function(){var t=this._view,e=t.startAngle+(t.endAngle-t.startAngle)/2,n=(t.outerRadius-t.innerRadius)/2+t.innerRadius;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},draw:function(){var t=this._chart.ctx,e=this._view,n=e.startAngle,i=e.endAngle;t.beginPath(),t.arc(e.x,e.y,e.outerRadius,n,i),t.arc(e.x,e.y,e.innerRadius,i,n,!0),t.closePath(),t.strokeStyle=e.borderColor,t.lineWidth=e.borderWidth,t.fillStyle=e.backgroundColor,t.fill(),t.lineJoin="bevel",e.borderWidth&&t.stroke()}})},{25:25,26:26,45:45}],37:[function(t,e,n){"use strict";var i=t(25),a=t(26),o=t(45),r=i.global;i._set("global",{elements:{line:{tension:.4,backgroundColor:r.defaultColor,borderWidth:3,borderColor:r.defaultColor,borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",capBezierPoints:!0,fill:!0}}}),e.exports=a.extend({draw:function(){var t,e,n,i,a=this,l=a._view,s=a._chart.ctx,u=l.spanGaps,d=a._children.slice(),c=r.elements.line,h=-1;for(a._loop&&d.length&&d.push(d[0]),s.save(),s.lineCap=l.borderCapStyle||c.borderCapStyle,s.setLineDash&&s.setLineDash(l.borderDash||c.borderDash),s.lineDashOffset=l.borderDashOffset||c.borderDashOffset,s.lineJoin=l.borderJoinStyle||c.borderJoinStyle,s.lineWidth=l.borderWidth||c.borderWidth,s.strokeStyle=l.borderColor||r.defaultColor,s.beginPath(),h=-1,t=0;t<d.length;++t)e=d[t],n=o.previousItem(d,t),i=e._view,0===t?i.skip||(s.moveTo(i.x,i.y),h=t):(n=-1===h?n:d[h],i.skip||(h!==t-1&&!u||-1===h?s.moveTo(i.x,i.y):o.canvas.lineTo(s,n._view,e._view),h=t));s.stroke(),s.restore()}})},{25:25,26:26,45:45}],38:[function(t,e,n){"use strict";function i(t){var e=this._view;return!!e&&Math.pow(t-e.x,2)<Math.pow(e.radius+e.hitRadius,2)}var a=t(25),o=t(26),r=t(45),l=a.global.defaultColor;a._set("global",{elements:{point:{radius:3,pointStyle:"circle",backgroundColor:l,borderColor:l,borderWidth:1,hitRadius:1,hoverRadius:4,hoverBorderWidth:1}}}),e.exports=o.extend({inRange:function(t,e){var n=this._view;return!!n&&Math.pow(t-n.x,2)+Math.pow(e-n.y,2)<Math.pow(n.hitRadius+n.radius,2)},inLabelRange:i,inXRange:i,inYRange:function(t){var e=this._view;return!!e&&Math.pow(t-e.y,2)<Math.pow(e.radius+e.hitRadius,2)},getCenterPoint:function(){var t=this._view;return{x:t.x,y:t.y}},getArea:function(){return Math.PI*Math.pow(this._view.radius,2)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y,padding:t.radius+t.borderWidth}},draw:function(t){var e=this._view,n=this._model,i=this._chart.ctx,o=e.pointStyle,s=e.radius,u=e.x,d=e.y,c=r.color,h=0;e.skip||(i.strokeStyle=e.borderColor||l,i.lineWidth=r.valueOrDefault(e.borderWidth,a.global.elements.point.borderWidth),i.fillStyle=e.backgroundColor||l,void 0!==t&&(n.x<t.left||1.01*t.right<n.x||n.y<t.top||1.01*t.bottom<n.y)&&(n.x<t.left?h=(u-n.x)/(t.left-n.x):1.01*t.right<n.x?h=(n.x-u)/(n.x-t.right):n.y<t.top?h=(d-n.y)/(t.top-n.y):1.01*t.bottom<n.y&&(h=(n.y-d)/(n.y-t.bottom)),h=Math.round(100*h)/100,i.strokeStyle=c(i.strokeStyle).alpha(h).rgbString(),i.fillStyle=c(i.fillStyle).alpha(h).rgbString()),r.canvas.drawPoint(i,o,s,u,d))}})},{25:25,26:26,45:45}],39:[function(t,e,n){"use strict";function i(t){return void 0!==t._view.width}function a(t){var e,n,a,o,r=t._view;if(i(t)){var l=r.width/2;e=r.x-l,n=r.x+l,a=Math.min(r.y,r.base),o=Math.max(r.y,r.base)}else{var s=r.height/2;e=Math.min(r.x,r.base),n=Math.max(r.x,r.base),a=r.y-s,o=r.y+s}return{left:e,top:a,right:n,bottom:o}}var o=t(25),r=t(26);o._set("global",{elements:{rectangle:{backgroundColor:o.global.defaultColor,borderColor:o.global.defaultColor,borderSkipped:"bottom",borderWidth:0}}}),e.exports=r.extend({draw:function(){function t(t){return m[(b+t)%4]}var e,n,i,a,o,r,l,s=this._chart.ctx,u=this._view,d=u.borderWidth;if(u.horizontal?(e=u.base,n=u.x,i=u.y-u.height/2,a=u.y+u.height/2,o=n>e?1:-1,r=1,l=u.borderSkipped||"left"):(e=u.x-u.width/2,n=u.x+u.width/2,i=u.y,o=1,r=(a=u.base)>i?1:-1,l=u.borderSkipped||"bottom"),d){var c=Math.min(Math.abs(e-n),Math.abs(i-a)),h=(d=d>c?c:d)/2,f=e+("left"!==l?h*o:0),g=n+("right"!==l?-h*o:0),p=i+("top"!==l?h*r:0),v=a+("bottom"!==l?-h*r:0);f!==g&&(i=p,a=v),p!==v&&(e=f,n=g)}s.beginPath(),s.fillStyle=u.backgroundColor,s.strokeStyle=u.borderColor,s.lineWidth=d;var m=[[e,a],[e,i],[n,i],[n,a]],b=["bottom","left","top","right"].indexOf(l,0);-1===b&&(b=0);var x=t(0);s.moveTo(x[0],x[1]);for(var y=1;y<4;y++)x=t(y),s.lineTo(x[0],x[1]);s.fill(),d&&s.stroke()},height:function(){var t=this._view;return t.base-t.y},inRange:function(t,e){var n=!1;if(this._view){var i=a(this);n=t>=i.left&&t<=i.right&&e>=i.top&&e<=i.bottom}return n},inLabelRange:function(t,e){var n=this;if(!n._view)return!1;var o=a(n);return i(n)?t>=o.left&&t<=o.right:e>=o.top&&e<=o.bottom},inXRange:function(t){var e=a(this);return t>=e.left&&t<=e.right},inYRange:function(t){var e=a(this);return t>=e.top&&t<=e.bottom},getCenterPoint:function(){var t,e,n=this._view;return i(this)?(t=n.x,e=(n.y+n.base)/2):(t=(n.x+n.base)/2,e=n.y),{x:t,y:e}},getArea:function(){var t=this._view;return t.width*Math.abs(t.y-t.base)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y}}})},{25:25,26:26}],40:[function(t,e,n){"use strict";e.exports={},e.exports.Arc=t(36),e.exports.Line=t(37),e.exports.Point=t(38),e.exports.Rectangle=t(39)},{36:36,37:37,38:38,39:39}],41:[function(t,e,n){"use strict";var i=t(42),n=e.exports={clear:function(t){t.ctx.clearRect(0,0,t.width,t.height)},roundedRect:function(t,e,n,i,a,o){if(o){var r=Math.min(o,i/2),l=Math.min(o,a/2);t.moveTo(e+r,n),t.lineTo(e+i-r,n),t.quadraticCurveTo(e+i,n,e+i,n+l),t.lineTo(e+i,n+a-l),t.quadraticCurveTo(e+i,n+a,e+i-r,n+a),t.lineTo(e+r,n+a),t.quadraticCurveTo(e,n+a,e,n+a-l),t.lineTo(e,n+l),t.quadraticCurveTo(e,n,e+r,n)}else t.rect(e,n,i,a)},drawPoint:function(t,e,n,i,a){var o,r,l,s,u,d;if(!e||"object"!=typeof e||"[object HTMLImageElement]"!==(o=e.toString())&&"[object HTMLCanvasElement]"!==o){if(!(isNaN(n)||n<=0)){switch(e){default:t.beginPath(),t.arc(i,a,n,0,2*Math.PI),t.closePath(),t.fill();break;case"triangle":t.beginPath(),u=(r=3*n/Math.sqrt(3))*Math.sqrt(3)/2,t.moveTo(i-r/2,a+u/3),t.lineTo(i+r/2,a+u/3),t.lineTo(i,a-2*u/3),t.closePath(),t.fill();break;case"rect":d=1/Math.SQRT2*n,t.beginPath(),t.fillRect(i-d,a-d,2*d,2*d),t.strokeRect(i-d,a-d,2*d,2*d);break;case"rectRounded":var c=n/Math.SQRT2,h=i-c,f=a-c,g=Math.SQRT2*n;t.beginPath(),this.roundedRect(t,h,f,g,g,n/2),t.closePath(),t.fill();break;case"rectRot":d=1/Math.SQRT2*n,t.beginPath(),t.moveTo(i-d,a),t.lineTo(i,a+d),t.lineTo(i+d,a),t.lineTo(i,a-d),t.closePath(),t.fill();break;case"cross":t.beginPath(),t.moveTo(i,a+n),t.lineTo(i,a-n),t.moveTo(i-n,a),t.lineTo(i+n,a),t.closePath();break;case"crossRot":t.beginPath(),l=Math.cos(Math.PI/4)*n,s=Math.sin(Math.PI/4)*n,t.moveTo(i-l,a-s),t.lineTo(i+l,a+s),t.moveTo(i-l,a+s),t.lineTo(i+l,a-s),t.closePath();break;case"star":t.beginPath(),t.moveTo(i,a+n),t.lineTo(i,a-n),t.moveTo(i-n,a),t.lineTo(i+n,a),l=Math.cos(Math.PI/4)*n,s=Math.sin(Math.PI/4)*n,t.moveTo(i-l,a-s),t.lineTo(i+l,a+s),t.moveTo(i-l,a+s),t.lineTo(i+l,a-s),t.closePath();break;case"line":t.beginPath(),t.moveTo(i-n,a),t.lineTo(i+n,a),t.closePath();break;case"dash":t.beginPath(),t.moveTo(i,a),t.lineTo(i+n,a),t.closePath()}t.stroke()}}else t.drawImage(e,i-e.width/2,a-e.height/2,e.width,e.height)},clipArea:function(t,e){t.save(),t.beginPath(),t.rect(e.left,e.top,e.right-e.left,e.bottom-e.top),t.clip()},unclipArea:function(t){t.restore()},lineTo:function(t,e,n,i){if(n.steppedLine)return"after"===n.steppedLine&&!i||"after"!==n.steppedLine&&i?t.lineTo(e.x,n.y):t.lineTo(n.x,e.y),void t.lineTo(n.x,n.y);n.tension?t.bezierCurveTo(i?e.controlPointPreviousX:e.controlPointNextX,i?e.controlPointPreviousY:e.controlPointNextY,i?n.controlPointNextX:n.controlPointPreviousX,i?n.controlPointNextY:n.controlPointPreviousY,n.x,n.y):t.lineTo(n.x,n.y)}};i.clear=n.clear,i.drawRoundedRectangle=function(t){t.beginPath(),n.roundedRect.apply(n,arguments),t.closePath()}},{42:42}],42:[function(t,e,n){"use strict";var i={noop:function(){},uid:function(){var t=0;return function(){return t++}}(),isNullOrUndef:function(t){return null===t||void 0===t},isArray:Array.isArray?Array.isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)},isObject:function(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)},valueOrDefault:function(t,e){return void 0===t?e:t},valueAtIndexOrDefault:function(t,e,n){return i.valueOrDefault(i.isArray(t)?t[e]:t,n)},callback:function(t,e,n){if(t&&"function"==typeof t.call)return t.apply(n,e)},each:function(t,e,n,a){var o,r,l;if(i.isArray(t))if(r=t.length,a)for(o=r-1;o>=0;o--)e.call(n,t[o],o);else for(o=0;o<r;o++)e.call(n,t[o],o);else if(i.isObject(t))for(r=(l=Object.keys(t)).length,o=0;o<r;o++)e.call(n,t[l[o]],l[o])},arrayEquals:function(t,e){var n,a,o,r;if(!t||!e||t.length!==e.length)return!1;for(n=0,a=t.length;n<a;++n)if(o=t[n],r=e[n],o instanceof Array&&r instanceof Array){if(!i.arrayEquals(o,r))return!1}else if(o!==r)return!1;return!0},clone:function(t){if(i.isArray(t))return t.map(i.clone);if(i.isObject(t)){for(var e={},n=Object.keys(t),a=n.length,o=0;o<a;++o)e[n[o]]=i.clone(t[n[o]]);return e}return t},_merger:function(t,e,n,a){var o=e[t],r=n[t];i.isObject(o)&&i.isObject(r)?i.merge(o,r,a):e[t]=i.clone(r)},_mergerIf:function(t,e,n){var a=e[t],o=n[t];i.isObject(a)&&i.isObject(o)?i.mergeIf(a,o):e.hasOwnProperty(t)||(e[t]=i.clone(o))},merge:function(t,e,n){var a,o,r,l,s,u=i.isArray(e)?e:[e],d=u.length;if(!i.isObject(t))return t;for(a=(n=n||{}).merger||i._merger,o=0;o<d;++o)if(e=u[o],i.isObject(e))for(s=0,l=(r=Object.keys(e)).length;s<l;++s)a(r[s],t,e,n);return t},mergeIf:function(t,e){return i.merge(t,e,{merger:i._mergerIf})},extend:function(t){for(var e=1,n=arguments.length;e<n;++e)i.each(arguments[e],function(e,n){t[n]=e});return t},inherits:function(t){var e=this,n=t&&t.hasOwnProperty("constructor")?t.constructor:function(){return e.apply(this,arguments)},a=function(){this.constructor=n};return a.prototype=e.prototype,n.prototype=new a,n.extend=i.inherits,t&&i.extend(n.prototype,t),n.__super__=e.prototype,n}};e.exports=i,i.callCallback=i.callback,i.indexOf=function(t,e,n){return Array.prototype.indexOf.call(t,e,n)},i.getValueOrDefault=i.valueOrDefault,i.getValueAtIndexOrDefault=i.valueAtIndexOrDefault},{}],43:[function(t,e,n){"use strict";var i=t(42),a={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return-t*(t-2)},easeInOutQuad:function(t){return(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1)},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return(t-=1)*t*t+1},easeInOutCubic:function(t){return(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return-((t-=1)*t*t*t-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},easeInQuint:function(t){return t*t*t*t*t},easeOutQuint:function(t){return(t-=1)*t*t*t*t+1},easeInOutQuint:function(t){return(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},easeInSine:function(t){return 1-Math.cos(t*(Math.PI/2))},easeOutSine:function(t){return Math.sin(t*(Math.PI/2))},easeInOutSine:function(t){return-.5*(Math.cos(Math.PI*t)-1)},easeInExpo:function(t){return 0===t?0:Math.pow(2,10*(t-1))},easeOutExpo:function(t){return 1===t?1:1-Math.pow(2,-10*t)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(2-Math.pow(2,-10*--t))},easeInCirc:function(t){return t>=1?t:-(Math.sqrt(1-t*t)-1)},easeOutCirc:function(t){return Math.sqrt(1-(t-=1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===t?1:(n||(n=.3),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),-i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n))},easeOutElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===t?1:(n||(n=.3),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),i*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/n)+1)},easeInOutElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:2==(t/=.5)?1:(n||(n=.45),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),t<1?i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*-.5:i*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*.5+1)},easeInBack:function(t){var e=1.70158;return t*t*((e+1)*t-e)},easeOutBack:function(t){var e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:function(t){return 1-a.easeOutBounce(1-t)},easeOutBounce:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},easeInOutBounce:function(t){return t<.5?.5*a.easeInBounce(2*t):.5*a.easeOutBounce(2*t-1)+.5}};e.exports={effects:a},i.easingEffects=a},{42:42}],44:[function(t,e,n){"use strict";var i=t(42);e.exports={toLineHeight:function(t,e){var n=(""+t).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/);if(!n||"normal"===n[1])return 1.2*e;switch(t=+n[2],n[3]){case"px":return t;case"%":t/=100}return e*t},toPadding:function(t){var e,n,a,o;return i.isObject(t)?(e=+t.top||0,n=+t.right||0,a=+t.bottom||0,o=+t.left||0):e=n=a=o=+t||0,{top:e,right:n,bottom:a,left:o,height:e+a,width:o+n}},resolve:function(t,e,n){var a,o,r;for(a=0,o=t.length;a<o;++a)if(void 0!==(r=t[a])&&(void 0!==e&&"function"==typeof r&&(r=r(e)),void 0!==n&&i.isArray(r)&&(r=r[n]),void 0!==r))return r}}},{42:42}],45:[function(t,e,n){"use strict";e.exports=t(42),e.exports.easing=t(43),e.exports.canvas=t(41),e.exports.options=t(44)},{41:41,42:42,43:43,44:44}],46:[function(t,e,n){e.exports={acquireContext:function(t){return t&&t.canvas&&(t=t.canvas),t&&t.getContext("2d")||null}}},{}],47:[function(t,e,n){"use strict";function i(t,e){var n=v.getStyle(t,e),i=n&&n.match(/^(\d+)(\.\d+)?px$/);return i?Number(i[1]):void 0}function a(t,e){var n=t.style,a=t.getAttribute("height"),o=t.getAttribute("width");if(t[m]={initial:{height:a,width:o,style:{display:n.display,height:n.height,width:n.width}}},n.display=n.display||"block",null===o||""===o){var r=i(t,"width");void 0!==r&&(t.width=r)}if(null===a||""===a)if(""===t.style.height)t.height=t.width/(e.options.aspectRatio||2);else{var l=i(t,"height");void 0!==r&&(t.height=l)}return t}function o(t,e,n){t.addEventListener(e,n,M)}function r(t,e,n){t.removeEventListener(e,n,M)}function l(t,e,n,i,a){return{type:t,chart:e,native:a||null,x:void 0!==n?n:null,y:void 0!==i?i:null}}function s(t,e){var n=w[t.type]||t.type,i=v.getRelativePosition(t,e);return l(n,e,i.x,i.y,t)}function u(t,e){var n=!1,i=[];return function(){i=Array.prototype.slice.call(arguments),e=e||this,n||(n=!0,v.requestAnimFrame.call(window,function(){n=!1,t.apply(e,i)}))}}function d(t){var e=document.createElement("div"),n=b+"size-monitor",i="position:absolute;left:0;top:0;right:0;bottom:0;overflow:hidden;pointer-events:none;visibility:hidden;z-index:-1;";e.style.cssText=i,e.className=n,e.innerHTML='<div class="'+n+'-expand" style="'+i+'"><div style="position:absolute;width:1000000px;height:1000000px;left:0;top:0"></div></div><div class="'+n+'-shrink" style="'+i+'"><div style="position:absolute;width:200%;height:200%;left:0; top:0"></div></div>';var a=e.childNodes[0],r=e.childNodes[1];e._reset=function(){a.scrollLeft=1e6,a.scrollTop=1e6,r.scrollLeft=1e6,r.scrollTop=1e6};var l=function(){e._reset(),t()};return o(a,"scroll",l.bind(a,"expand")),o(r,"scroll",l.bind(r,"shrink")),e}function c(t,e){var n=t[m]||(t[m]={}),i=n.renderProxy=function(t){t.animationName===y&&e()};v.each(k,function(e){o(t,e,i)}),n.reflow=!!t.offsetParent,t.classList.add(x)}function h(t){var e=t[m]||{},n=e.renderProxy;n&&(v.each(k,function(e){r(t,e,n)}),delete e.renderProxy),t.classList.remove(x)}function f(t,e,n){var i=t[m]||(t[m]={}),a=i.resizer=d(u(function(){if(i.resizer)return e(l("resize",n))}));c(t,function(){if(i.resizer){var e=t.parentNode;e&&e!==a.parentNode&&e.insertBefore(a,e.firstChild),a._reset()}})}function g(t){var e=t[m]||{},n=e.resizer;delete e.resizer,h(t),n&&n.parentNode&&n.parentNode.removeChild(n)}function p(t,e){var n=t._style||document.createElement("style");t._style||(t._style=n,e="/* Chart.js */\n"+e,n.setAttribute("type","text/css"),document.getElementsByTagName("head")[0].appendChild(n)),n.appendChild(document.createTextNode(e))}var v=t(45),m="$chartjs",b="chartjs-",x=b+"render-monitor",y=b+"render-animation",k=["animationstart","webkitAnimationStart"],w={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},M=!!function(){var t=!1;try{var e=Object.defineProperty({},"passive",{get:function(){t=!0}});window.addEventListener("e",null,e)}catch(t){}return t}()&&{passive:!0};e.exports={_enabled:"undefined"!=typeof window&&"undefined"!=typeof document,initialize:function(){var t="from{opacity:0.99}to{opacity:1}";p(this,"@-webkit-keyframes "+y+"{"+t+"}@keyframes "+y+"{"+t+"}."+x+"{-webkit-animation:"+y+" 0.001s;animation:"+y+" 0.001s;}")},acquireContext:function(t,e){"string"==typeof t?t=document.getElementById(t):t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas);var n=t&&t.getContext&&t.getContext("2d");return n&&n.canvas===t?(a(t,e),n):null},releaseContext:function(t){var e=t.canvas;if(e[m]){var n=e[m].initial;["height","width"].forEach(function(t){var i=n[t];v.isNullOrUndef(i)?e.removeAttribute(t):e.setAttribute(t,i)}),v.each(n.style||{},function(t,n){e.style[n]=t}),e.width=e.width,delete e[m]}},addEventListener:function(t,e,n){var i=t.canvas;if("resize"!==e){var a=n[m]||(n[m]={});o(i,e,(a.proxies||(a.proxies={}))[t.id+"_"+e]=function(e){n(s(e,t))})}else f(i,n,t)},removeEventListener:function(t,e,n){var i=t.canvas;if("resize"!==e){var a=((n[m]||{}).proxies||{})[t.id+"_"+e];a&&r(i,e,a)}else g(i)}},v.addEvent=o,v.removeEvent=r},{45:45}],48:[function(t,e,n){"use strict";var i=t(45),a=t(46),o=t(47),r=o._enabled?o:a;e.exports=i.extend({initialize:function(){},acquireContext:function(){},releaseContext:function(){},addEventListener:function(){},removeEventListener:function(){}},r)},{45:45,46:46,47:47}],49:[function(t,e,n){"use strict";var i=t(25),a=t(40),o=t(45);i._set("global",{plugins:{filler:{propagate:!0}}}),e.exports=function(){function t(t,e,n){var i,a=t._model||{},o=a.fill;if(void 0===o&&(o=!!a.backgroundColor),!1===o||null===o)return!1;if(!0===o)return"origin";if(i=parseFloat(o,10),isFinite(i)&&Math.floor(i)===i)return"-"!==o[0]&&"+"!==o[0]||(i=e+i),!(i===e||i<0||i>=n)&&i;switch(o){case"bottom":return"start";case"top":return"end";case"zero":return"origin";case"origin":case"start":case"end":return o;default:return!1}}function e(t){var e,n=t.el._model||{},i=t.el._scale||{},a=t.fill,o=null;if(isFinite(a))return null;if("start"===a?o=void 0===n.scaleBottom?i.bottom:n.scaleBottom:"end"===a?o=void 0===n.scaleTop?i.top:n.scaleTop:void 0!==n.scaleZero?o=n.scaleZero:i.getBasePosition?o=i.getBasePosition():i.getBasePixel&&(o=i.getBasePixel()),void 0!==o&&null!==o){if(void 0!==o.x&&void 0!==o.y)return o;if("number"==typeof o&&isFinite(o))return e=i.isHorizontal(),{x:e?o:null,y:e?null:o}}return null}function n(t,e,n){var i,a=t[e].fill,o=[e];if(!n)return a;for(;!1!==a&&-1===o.indexOf(a);){if(!isFinite(a))return a;if(!(i=t[a]))return!1;if(i.visible)return a;o.push(a),a=i.fill}return!1}function r(t){var e=t.fill,n="dataset";return!1===e?null:(isFinite(e)||(n="boundary"),d[n](t))}function l(t){return t&&!t.skip}function s(t,e,n,i,a){var r;if(i&&a){for(t.moveTo(e[0].x,e[0].y),r=1;r<i;++r)o.canvas.lineTo(t,e[r-1],e[r]);for(t.lineTo(n[a-1].x,n[a-1].y),r=a-1;r>0;--r)o.canvas.lineTo(t,n[r],n[r-1],!0)}}function u(t,e,n,i,a,o){var r,u,d,c,h,f,g,p=e.length,v=i.spanGaps,m=[],b=[],x=0,y=0;for(t.beginPath(),r=0,u=p+!!o;r<u;++r)h=n(c=e[d=r%p]._view,d,i),f=l(c),g=l(h),f&&g?(x=m.push(c),y=b.push(h)):x&&y&&(v?(f&&m.push(c),g&&b.push(h)):(s(t,m,b,x,y),x=y=0,m=[],b=[]));s(t,m,b,x,y),t.closePath(),t.fillStyle=a,t.fill()}var d={dataset:function(t){var e=t.fill,n=t.chart,i=n.getDatasetMeta(e),a=i&&n.isDatasetVisible(e)&&i.dataset._children||[],o=a.length||0;return o?function(t,e){return e<o&&a[e]._view||null}:null},boundary:function(t){var e=t.boundary,n=e?e.x:null,i=e?e.y:null;return function(t){return{x:null===n?t.x:n,y:null===i?t.y:i}}}};return{id:"filler",afterDatasetsUpdate:function(i,o){var l,s,u,d,c=(i.data.datasets||[]).length,h=o.propagate,f=[];for(s=0;s<c;++s)d=null,(u=(l=i.getDatasetMeta(s)).dataset)&&u._model&&u instanceof a.Line&&(d={visible:i.isDatasetVisible(s),fill:t(u,s,c),chart:i,el:u}),l.$filler=d,f.push(d);for(s=0;s<c;++s)(d=f[s])&&(d.fill=n(f,s,h),d.boundary=e(d),d.mapper=r(d))},beforeDatasetDraw:function(t,e){var n=e.meta.$filler;if(n){var a=t.ctx,r=n.el,l=r._view,s=r._children||[],d=n.mapper,c=l.backgroundColor||i.global.defaultColor;d&&c&&s.length&&(o.canvas.clipArea(a,t.chartArea),u(a,s,d,l,c,r._loop),o.canvas.unclipArea(a))}}}}},{25:25,40:40,45:45}],50:[function(t,e,n){"use strict";var i=t(25),a=t(26),o=t(45);i._set("global",{legend:{display:!0,position:"top",fullWidth:!0,reverse:!1,weight:1e3,onClick:function(t,e){var n=e.datasetIndex,i=this.chart,a=i.getDatasetMeta(n);a.hidden=null===a.hidden?!i.data.datasets[n].hidden:null,i.update()},onHover:null,labels:{boxWidth:40,padding:10,generateLabels:function(t){var e=t.data;return o.isArray(e.datasets)?e.datasets.map(function(e,n){return{text:e.label,fillStyle:o.isArray(e.backgroundColor)?e.backgroundColor[0]:e.backgroundColor,hidden:!t.isDatasetVisible(n),lineCap:e.borderCapStyle,lineDash:e.borderDash,lineDashOffset:e.borderDashOffset,lineJoin:e.borderJoinStyle,lineWidth:e.borderWidth,strokeStyle:e.borderColor,pointStyle:e.pointStyle,datasetIndex:n}},this):[]}}},legendCallback:function(t){var e=[];e.push('<ul class="'+t.id+'-legend">');for(var n=0;n<t.data.datasets.length;n++)e.push('<li><span style="background-color:'+t.data.datasets[n].backgroundColor+'"></span>'),t.data.datasets[n].label&&e.push(t.data.datasets[n].label),e.push("</li>");return e.push("</ul>"),e.join("")}}),e.exports=function(t){function e(t,e){return t.usePointStyle?e*Math.SQRT2:t.boxWidth}function n(e,n){var i=new t.Legend({ctx:e.ctx,options:n,chart:e});r.configure(e,i,n),r.addBox(e,i),e.legend=i}var r=t.layoutService,l=o.noop;return t.Legend=a.extend({initialize:function(t){o.extend(this,t),this.legendHitBoxes=[],this.doughnutMode=!1},beforeUpdate:l,update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:l,beforeSetDimensions:l,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:l,beforeBuildLabels:l,buildLabels:function(){var t=this,e=t.options.labels||{},n=o.callback(e.generateLabels,[t.chart],t)||[];e.filter&&(n=n.filter(function(n){return e.filter(n,t.chart.data)})),t.options.reverse&&n.reverse(),t.legendItems=n},afterBuildLabels:l,beforeFit:l,fit:function(){var t=this,n=t.options,a=n.labels,r=n.display,l=t.ctx,s=i.global,u=o.valueOrDefault,d=u(a.fontSize,s.defaultFontSize),c=u(a.fontStyle,s.defaultFontStyle),h=u(a.fontFamily,s.defaultFontFamily),f=o.fontString(d,c,h),g=t.legendHitBoxes=[],p=t.minSize,v=t.isHorizontal();if(v?(p.width=t.maxWidth,p.height=r?10:0):(p.width=r?10:0,p.height=t.maxHeight),r)if(l.font=f,v){var m=t.lineWidths=[0],b=t.legendItems.length?d+a.padding:0;l.textAlign="left",l.textBaseline="top",o.each(t.legendItems,function(n,i){var o=e(a,d)+d/2+l.measureText(n.text).width;m[m.length-1]+o+a.padding>=t.width&&(b+=d+a.padding,m[m.length]=t.left),g[i]={left:0,top:0,width:o,height:d},m[m.length-1]+=o+a.padding}),p.height+=b}else{var x=a.padding,y=t.columnWidths=[],k=a.padding,w=0,M=0,S=d+x;o.each(t.legendItems,function(t,n){var i=e(a,d)+d/2+l.measureText(t.text).width;M+S>p.height&&(k+=w+a.padding,y.push(w),w=0,M=0),w=Math.max(w,i),M+=S,g[n]={left:0,top:0,width:i,height:d}}),k+=w,y.push(w),p.width+=k}t.width=p.width,t.height=p.height},afterFit:l,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var t=this,n=t.options,a=n.labels,r=i.global,l=r.elements.line,s=t.width,u=t.lineWidths;if(n.display){var d,c=t.ctx,h=o.valueOrDefault,f=h(a.fontColor,r.defaultFontColor),g=h(a.fontSize,r.defaultFontSize),p=h(a.fontStyle,r.defaultFontStyle),v=h(a.fontFamily,r.defaultFontFamily),m=o.fontString(g,p,v);c.textAlign="left",c.textBaseline="middle",c.lineWidth=.5,c.strokeStyle=f,c.fillStyle=f,c.font=m;var b=e(a,g),x=t.legendHitBoxes,y=function(t,e,i){if(!(isNaN(b)||b<=0)){c.save(),c.fillStyle=h(i.fillStyle,r.defaultColor),c.lineCap=h(i.lineCap,l.borderCapStyle),c.lineDashOffset=h(i.lineDashOffset,l.borderDashOffset),c.lineJoin=h(i.lineJoin,l.borderJoinStyle),c.lineWidth=h(i.lineWidth,l.borderWidth),c.strokeStyle=h(i.strokeStyle,r.defaultColor);var a=0===h(i.lineWidth,l.borderWidth);if(c.setLineDash&&c.setLineDash(h(i.lineDash,l.borderDash)),n.labels&&n.labels.usePointStyle){var s=g*Math.SQRT2/2,u=s/Math.SQRT2,d=t+u,f=e+u;o.canvas.drawPoint(c,i.pointStyle,s,d,f)}else a||c.strokeRect(t,e,b,g),c.fillRect(t,e,b,g);c.restore()}},k=function(t,e,n,i){var a=g/2,o=b+a+t,r=e+a;c.fillText(n.text,o,r),n.hidden&&(c.beginPath(),c.lineWidth=2,c.moveTo(o,r),c.lineTo(o+i,r),c.stroke())},w=t.isHorizontal();d=w?{x:t.left+(s-u[0])/2,y:t.top+a.padding,line:0}:{x:t.left+a.padding,y:t.top+a.padding,line:0};var M=g+a.padding;o.each(t.legendItems,function(e,n){var i=c.measureText(e.text).width,o=b+g/2+i,r=d.x,l=d.y;w?r+o>=s&&(l=d.y+=M,d.line++,r=d.x=t.left+(s-u[d.line])/2):l+M>t.bottom&&(r=d.x=r+t.columnWidths[d.line]+a.padding,l=d.y=t.top+a.padding,d.line++),y(r,l,e),x[n].left=r,x[n].top=l,k(r,l,e,i),w?d.x+=o+a.padding:d.y+=M})}},handleEvent:function(t){var e=this,n=e.options,i="mouseup"===t.type?"click":t.type,a=!1;if("mousemove"===i){if(!n.onHover)return}else{if("click"!==i)return;if(!n.onClick)return}var o=t.x,r=t.y;if(o>=e.left&&o<=e.right&&r>=e.top&&r<=e.bottom)for(var l=e.legendHitBoxes,s=0;s<l.length;++s){var u=l[s];if(o>=u.left&&o<=u.left+u.width&&r>=u.top&&r<=u.top+u.height){if("click"===i){n.onClick.call(e,t.native,e.legendItems[s]),a=!0;break}if("mousemove"===i){n.onHover.call(e,t.native,e.legendItems[s]),a=!0;break}}}return a}}),{id:"legend",beforeInit:function(t){var e=t.options.legend;e&&n(t,e)},beforeUpdate:function(t){var e=t.options.legend,a=t.legend;e?(o.mergeIf(e,i.global.legend),a?(r.configure(t,a,e),a.options=e):n(t,e)):a&&(r.removeBox(t,a),delete t.legend)},afterEvent:function(t,e){var n=t.legend;n&&n.handleEvent(e)}}}},{25:25,26:26,45:45}],51:[function(t,e,n){"use strict";var i=t(25),a=t(26),o=t(45);i._set("global",{title:{display:!1,fontStyle:"bold",fullWidth:!0,lineHeight:1.2,padding:10,position:"top",text:"",weight:2e3}}),e.exports=function(t){function e(e,i){var a=new t.Title({ctx:e.ctx,options:i,chart:e});n.configure(e,a,i),n.addBox(e,a),e.titleBlock=a}var n=t.layoutService,r=o.noop;return t.Title=a.extend({initialize:function(t){var e=this;o.extend(e,t),e.legendHitBoxes=[]},beforeUpdate:r,update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:r,beforeSetDimensions:r,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:r,beforeBuildLabels:r,buildLabels:r,afterBuildLabels:r,beforeFit:r,fit:function(){var t=this,e=o.valueOrDefault,n=t.options,a=n.display,r=e(n.fontSize,i.global.defaultFontSize),l=t.minSize,s=o.isArray(n.text)?n.text.length:1,u=o.options.toLineHeight(n.lineHeight,r),d=a?s*u+2*n.padding:0;t.isHorizontal()?(l.width=t.maxWidth,l.height=d):(l.width=d,l.height=t.maxHeight),t.width=l.width,t.height=l.height},afterFit:r,isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},draw:function(){var t=this,e=t.ctx,n=o.valueOrDefault,a=t.options,r=i.global;if(a.display){var l,s,u,d=n(a.fontSize,r.defaultFontSize),c=n(a.fontStyle,r.defaultFontStyle),h=n(a.fontFamily,r.defaultFontFamily),f=o.fontString(d,c,h),g=o.options.toLineHeight(a.lineHeight,d),p=g/2+a.padding,v=0,m=t.top,b=t.left,x=t.bottom,y=t.right;e.fillStyle=n(a.fontColor,r.defaultFontColor),e.font=f,t.isHorizontal()?(s=b+(y-b)/2,u=m+p,l=y-b):(s="left"===a.position?b+p:y-p,u=m+(x-m)/2,l=x-m,v=Math.PI*("left"===a.position?-.5:.5)),e.save(),e.translate(s,u),e.rotate(v),e.textAlign="center",e.textBaseline="middle";var k=a.text;if(o.isArray(k))for(var w=0,M=0;M<k.length;++M)e.fillText(k[M],0,w,l),w+=g;else e.fillText(k,0,0,l);e.restore()}}}),{id:"title",beforeInit:function(t){var n=t.options.title;n&&e(t,n)},beforeUpdate:function(a){var r=a.options.title,l=a.titleBlock;r?(o.mergeIf(r,i.global.title),l?(n.configure(a,l,r),l.options=r):e(a,r)):l&&(t.layoutService.removeBox(a,l),delete a.titleBlock)}}}},{25:25,26:26,45:45}],52:[function(t,e,n){"use strict";e.exports=function(t){var e=t.Scale.extend({getLabels:function(){var t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels},determineDataLimits:function(){var t=this,e=t.getLabels();t.minIndex=0,t.maxIndex=e.length-1;var n;void 0!==t.options.ticks.min&&(n=e.indexOf(t.options.ticks.min),t.minIndex=-1!==n?n:t.minIndex),void 0!==t.options.ticks.max&&(n=e.indexOf(t.options.ticks.max),t.maxIndex=-1!==n?n:t.maxIndex),t.min=e[t.minIndex],t.max=e[t.maxIndex]},buildTicks:function(){var t=this,e=t.getLabels();t.ticks=0===t.minIndex&&t.maxIndex===e.length-1?e:e.slice(t.minIndex,t.maxIndex+1)},getLabelForIndex:function(t,e){var n=this,i=n.chart.data,a=n.isHorizontal();return i.yLabels&&!a?n.getRightValue(i.datasets[e].data[t]):n.ticks[t-n.minIndex]},getPixelForValue:function(t,e){var n,i=this,a=i.options.offset,o=Math.max(i.maxIndex+1-i.minIndex-(a?0:1),1);if(void 0!==t&&null!==t&&(n=i.isHorizontal()?t.x:t.y),void 0!==n||void 0!==t&&isNaN(e)){var r=i.getLabels();t=n||t;var l=r.indexOf(t);e=-1!==l?l:e}if(i.isHorizontal()){var s=i.width/o,u=s*(e-i.minIndex);return a&&(u+=s/2),i.left+Math.round(u)}var d=i.height/o,c=d*(e-i.minIndex);return a&&(c+=d/2),i.top+Math.round(c)},getPixelForTick:function(t){return this.getPixelForValue(this.ticks[t],t+this.minIndex,null)},getValueForPixel:function(t){var e=this,n=e.options.offset,i=Math.max(e._ticks.length-(n?0:1),1),a=e.isHorizontal(),o=(a?e.width:e.height)/i;return t-=a?e.left:e.top,n&&(t-=o/2),(t<=0?0:Math.round(t/o))+e.minIndex},getBasePixel:function(){return this.bottom}});t.scaleService.registerScaleType("category",e,{position:"bottom"})}},{}],53:[function(t,e,n){"use strict";var i=t(25),a=t(45),o=t(34);e.exports=function(t){var e={position:"left",ticks:{callback:o.formatters.linear}},n=t.LinearScaleBase.extend({determineDataLimits:function(){function t(t){return r?t.xAxisID===e.id:t.yAxisID===e.id}var e=this,n=e.options,i=e.chart,o=i.data.datasets,r=e.isHorizontal();e.min=null,e.max=null;var l=n.stacked;if(void 0===l&&a.each(o,function(e,n){if(!l){var a=i.getDatasetMeta(n);i.isDatasetVisible(n)&&t(a)&&void 0!==a.stack&&(l=!0)}}),n.stacked||l){var s={};a.each(o,function(o,r){var l=i.getDatasetMeta(r),u=[l.type,void 0===n.stacked&&void 0===l.stack?r:"",l.stack].join(".");void 0===s[u]&&(s[u]={positiveValues:[],negativeValues:[]});var d=s[u].positiveValues,c=s[u].negativeValues;i.isDatasetVisible(r)&&t(l)&&a.each(o.data,function(t,i){var a=+e.getRightValue(t);isNaN(a)||l.data[i].hidden||(d[i]=d[i]||0,c[i]=c[i]||0,n.relativePoints?d[i]=100:a<0?c[i]+=a:d[i]+=a)})}),a.each(s,function(t){var n=t.positiveValues.concat(t.negativeValues),i=a.min(n),o=a.max(n);e.min=null===e.min?i:Math.min(e.min,i),e.max=null===e.max?o:Math.max(e.max,o)})}else a.each(o,function(n,o){var r=i.getDatasetMeta(o);i.isDatasetVisible(o)&&t(r)&&a.each(n.data,function(t,n){var i=+e.getRightValue(t);isNaN(i)||r.data[n].hidden||(null===e.min?e.min=i:i<e.min&&(e.min=i),null===e.max?e.max=i:i>e.max&&(e.max=i))})});e.min=isFinite(e.min)&&!isNaN(e.min)?e.min:0,e.max=isFinite(e.max)&&!isNaN(e.max)?e.max:1,this.handleTickRangeOptions()},getTickLimit:function(){var t,e=this,n=e.options.ticks;if(e.isHorizontal())t=Math.min(n.maxTicksLimit?n.maxTicksLimit:11,Math.ceil(e.width/50));else{var o=a.valueOrDefault(n.fontSize,i.global.defaultFontSize);t=Math.min(n.maxTicksLimit?n.maxTicksLimit:11,Math.ceil(e.height/(2*o)))}return t},handleDirectionalChanges:function(){this.isHorizontal()||this.ticks.reverse()},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForValue:function(t){var e,n=this,i=n.start,a=+n.getRightValue(t),o=n.end-i;return n.isHorizontal()?(e=n.left+n.width/o*(a-i),Math.round(e)):(e=n.bottom-n.height/o*(a-i),Math.round(e))},getValueForPixel:function(t){var e=this,n=e.isHorizontal(),i=n?e.width:e.height,a=(n?t-e.left:e.bottom-t)/i;return e.start+(e.end-e.start)*a},getPixelForTick:function(t){return this.getPixelForValue(this.ticksAsNumbers[t])}});t.scaleService.registerScaleType("linear",n,e)}},{25:25,34:34,45:45}],54:[function(t,e,n){"use strict";var i=t(45),a=t(34);e.exports=function(t){var e=i.noop;t.LinearScaleBase=t.Scale.extend({getRightValue:function(e){return"string"==typeof e?+e:t.Scale.prototype.getRightValue.call(this,e)},handleTickRangeOptions:function(){var t=this,e=t.options.ticks;if(e.beginAtZero){var n=i.sign(t.min),a=i.sign(t.max);n<0&&a<0?t.max=0:n>0&&a>0&&(t.min=0)}var o=void 0!==e.min||void 0!==e.suggestedMin,r=void 0!==e.max||void 0!==e.suggestedMax;void 0!==e.min?t.min=e.min:void 0!==e.suggestedMin&&(null===t.min?t.min=e.suggestedMin:t.min=Math.min(t.min,e.suggestedMin)),void 0!==e.max?t.max=e.max:void 0!==e.suggestedMax&&(null===t.max?t.max=e.suggestedMax:t.max=Math.max(t.max,e.suggestedMax)),o!==r&&t.min>=t.max&&(o?t.max=t.min+1:t.min=t.max-1),t.min===t.max&&(t.max++,e.beginAtZero||t.min--)},getTickLimit:e,handleDirectionalChanges:e,buildTicks:function(){var t=this,e=t.options.ticks,n=t.getTickLimit(),o={maxTicks:n=Math.max(2,n),min:e.min,max:e.max,stepSize:i.valueOrDefault(e.fixedStepSize,e.stepSize)},r=t.ticks=a.generators.linear(o,t);t.handleDirectionalChanges(),t.max=i.max(r),t.min=i.min(r),e.reverse?(r.reverse(),t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max)},convertTicksToLabels:function(){var e=this;e.ticksAsNumbers=e.ticks.slice(),e.zeroLineIndex=e.ticks.indexOf(0),t.Scale.prototype.convertTicksToLabels.call(e)}})}},{34:34,45:45}],55:[function(t,e,n){"use strict";var i=t(45),a=t(34);e.exports=function(t){var e={position:"left",ticks:{callback:a.formatters.logarithmic}},n=t.Scale.extend({determineDataLimits:function(){function t(t){return s?t.xAxisID===e.id:t.yAxisID===e.id}var e=this,n=e.options,a=n.ticks,o=e.chart,r=o.data.datasets,l=i.valueOrDefault,s=e.isHorizontal();e.min=null,e.max=null,e.minNotZero=null;var u=n.stacked;if(void 0===u&&i.each(r,function(e,n){if(!u){var i=o.getDatasetMeta(n);o.isDatasetVisible(n)&&t(i)&&void 0!==i.stack&&(u=!0)}}),n.stacked||u){var d={};i.each(r,function(a,r){var l=o.getDatasetMeta(r),s=[l.type,void 0===n.stacked&&void 0===l.stack?r:"",l.stack].join(".");o.isDatasetVisible(r)&&t(l)&&(void 0===d[s]&&(d[s]=[]),i.each(a.data,function(t,i){var a=d[s],o=+e.getRightValue(t);isNaN(o)||l.data[i].hidden||(a[i]=a[i]||0,n.relativePoints?a[i]=100:a[i]+=o)}))}),i.each(d,function(t){var n=i.min(t),a=i.max(t);e.min=null===e.min?n:Math.min(e.min,n),e.max=null===e.max?a:Math.max(e.max,a)})}else i.each(r,function(n,a){var r=o.getDatasetMeta(a);o.isDatasetVisible(a)&&t(r)&&i.each(n.data,function(t,n){var i=+e.getRightValue(t);isNaN(i)||r.data[n].hidden||(null===e.min?e.min=i:i<e.min&&(e.min=i),null===e.max?e.max=i:i>e.max&&(e.max=i),0!==i&&(null===e.minNotZero||i<e.minNotZero)&&(e.minNotZero=i))})});e.min=l(a.min,e.min),e.max=l(a.max,e.max),e.min===e.max&&(0!==e.min&&null!==e.min?(e.min=Math.pow(10,Math.floor(i.log10(e.min))-1),e.max=Math.pow(10,Math.floor(i.log10(e.max))+1)):(e.min=1,e.max=10))},buildTicks:function(){var t=this,e=t.options.ticks,n={min:e.min,max:e.max},o=t.ticks=a.generators.logarithmic(n,t);t.isHorizontal()||o.reverse(),t.max=i.max(o),t.min=i.min(o),e.reverse?(o.reverse(),t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max)},convertTicksToLabels:function(){this.tickValues=this.ticks.slice(),t.Scale.prototype.convertTicksToLabels.call(this)},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForTick:function(t){return this.getPixelForValue(this.tickValues[t])},getPixelForValue:function(t){var e,n,a,o=this,r=o.start,l=+o.getRightValue(t),s=o.options.ticks;return o.isHorizontal()?(a=i.log10(o.end)-i.log10(r),0===l?n=o.left:(e=o.width,n=o.left+e/a*(i.log10(l)-i.log10(r)))):(e=o.height,0!==r||s.reverse?0===o.end&&s.reverse?(a=i.log10(o.start)-i.log10(o.minNotZero),n=l===o.end?o.top:l===o.minNotZero?o.top+.02*e:o.top+.02*e+.98*e/a*(i.log10(l)-i.log10(o.minNotZero))):0===l?n=s.reverse?o.top:o.bottom:(a=i.log10(o.end)-i.log10(r),e=o.height,n=o.bottom-e/a*(i.log10(l)-i.log10(r))):(a=i.log10(o.end)-i.log10(o.minNotZero),n=l===r?o.bottom:l===o.minNotZero?o.bottom-.02*e:o.bottom-.02*e-.98*e/a*(i.log10(l)-i.log10(o.minNotZero)))),n},getValueForPixel:function(t){var e,n,a=this,o=i.log10(a.end)-i.log10(a.start);return a.isHorizontal()?(n=a.width,e=a.start*Math.pow(10,(t-a.left)*o/n)):(n=a.height,e=Math.pow(10,(a.bottom-t)*o/n)/a.start),e}});t.scaleService.registerScaleType("logarithmic",n,e)}},{34:34,45:45}],56:[function(t,e,n){"use strict";var i=t(25),a=t(45),o=t(34);e.exports=function(t){function e(t){var e=t.options;return e.angleLines.display||e.pointLabels.display?t.chart.data.labels.length:0}function n(t){var e=t.options.pointLabels,n=a.valueOrDefault(e.fontSize,v.defaultFontSize),i=a.valueOrDefault(e.fontStyle,v.defaultFontStyle),o=a.valueOrDefault(e.fontFamily,v.defaultFontFamily);return{size:n,style:i,family:o,font:a.fontString(n,i,o)}}function r(t,e,n){return a.isArray(n)?{w:a.longestText(t,t.font,n),h:n.length*e+1.5*(n.length-1)*e}:{w:t.measureText(n).width,h:e}}function l(t,e,n,i,a){return t===i||t===a?{start:e-n/2,end:e+n/2}:t<i||t>a?{start:e-n-5,end:e}:{start:e,end:e+n+5}}function s(t){var i,o,s,u=n(t),d=Math.min(t.height/2,t.width/2),c={r:t.width,l:0,t:t.height,b:0},h={};t.ctx.font=u.font,t._pointLabelSizes=[];var f=e(t);for(i=0;i<f;i++){s=t.getPointPosition(i,d),o=r(t.ctx,u.size,t.pointLabels[i]||""),t._pointLabelSizes[i]=o;var g=t.getIndexAngle(i),p=a.toDegrees(g)%360,v=l(p,s.x,o.w,0,180),m=l(p,s.y,o.h,90,270);v.start<c.l&&(c.l=v.start,h.l=g),v.end>c.r&&(c.r=v.end,h.r=g),m.start<c.t&&(c.t=m.start,h.t=g),m.end>c.b&&(c.b=m.end,h.b=g)}t.setReductions(d,c,h)}function u(t){var e=Math.min(t.height/2,t.width/2);t.drawingArea=Math.round(e),t.setCenterPoint(0,0,0,0)}function d(t){return 0===t||180===t?"center":t<180?"left":"right"}function c(t,e,n,i){if(a.isArray(e))for(var o=n.y,r=1.5*i,l=0;l<e.length;++l)t.fillText(e[l],n.x,o),o+=r;else t.fillText(e,n.x,n.y)}function h(t,e,n){90===t||270===t?n.y-=e.h/2:(t>270||t<90)&&(n.y-=e.h)}function f(t){var i=t.ctx,o=a.valueOrDefault,r=t.options,l=r.angleLines,s=r.pointLabels;i.lineWidth=l.lineWidth,i.strokeStyle=l.color;var u=t.getDistanceFromCenterForValue(r.ticks.reverse?t.min:t.max),f=n(t);i.textBaseline="top";for(var g=e(t)-1;g>=0;g--){if(l.display){var p=t.getPointPosition(g,u);i.beginPath(),i.moveTo(t.xCenter,t.yCenter),i.lineTo(p.x,p.y),i.stroke(),i.closePath()}if(s.display){var m=t.getPointPosition(g,u+5),b=o(s.fontColor,v.defaultFontColor);i.font=f.font,i.fillStyle=b;var x=t.getIndexAngle(g),y=a.toDegrees(x);i.textAlign=d(y),h(y,t._pointLabelSizes[g],m),c(i,t.pointLabels[g]||"",m,f.size)}}}function g(t,n,i,o){var r=t.ctx;if(r.strokeStyle=a.valueAtIndexOrDefault(n.color,o-1),r.lineWidth=a.valueAtIndexOrDefault(n.lineWidth,o-1),t.options.gridLines.circular)r.beginPath(),r.arc(t.xCenter,t.yCenter,i,0,2*Math.PI),r.closePath(),r.stroke();else{var l=e(t);if(0===l)return;r.beginPath();var s=t.getPointPosition(0,i);r.moveTo(s.x,s.y);for(var u=1;u<l;u++)s=t.getPointPosition(u,i),r.lineTo(s.x,s.y);r.closePath(),r.stroke()}}function p(t){return a.isNumber(t)?t:0}var v=i.global,m={display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,color:"rgba(0, 0, 0, 0.1)",lineWidth:1},gridLines:{circular:!1},ticks:{showLabelBackdrop:!0,backdropColor:"rgba(255,255,255,0.75)",backdropPaddingY:2,backdropPaddingX:2,callback:o.formatters.linear},pointLabels:{display:!0,fontSize:10,callback:function(t){return t}}},b=t.LinearScaleBase.extend({setDimensions:function(){var t=this,e=t.options,n=e.ticks;t.width=t.maxWidth,t.height=t.maxHeight,t.xCenter=Math.round(t.width/2),t.yCenter=Math.round(t.height/2);var i=a.min([t.height,t.width]),o=a.valueOrDefault(n.fontSize,v.defaultFontSize);t.drawingArea=e.display?i/2-(o/2+n.backdropPaddingY):i/2},determineDataLimits:function(){var t=this,e=t.chart,n=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY;a.each(e.data.datasets,function(o,r){if(e.isDatasetVisible(r)){var l=e.getDatasetMeta(r);a.each(o.data,function(e,a){var o=+t.getRightValue(e);isNaN(o)||l.data[a].hidden||(n=Math.min(o,n),i=Math.max(o,i))})}}),t.min=n===Number.POSITIVE_INFINITY?0:n,t.max=i===Number.NEGATIVE_INFINITY?0:i,t.handleTickRangeOptions()},getTickLimit:function(){var t=this.options.ticks,e=a.valueOrDefault(t.fontSize,v.defaultFontSize);return Math.min(t.maxTicksLimit?t.maxTicksLimit:11,Math.ceil(this.drawingArea/(1.5*e)))},convertTicksToLabels:function(){var e=this;t.LinearScaleBase.prototype.convertTicksToLabels.call(e),e.pointLabels=e.chart.data.labels.map(e.options.pointLabels.callback,e)},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},fit:function(){this.options.pointLabels.display?s(this):u(this)},setReductions:function(t,e,n){var i=this,a=e.l/Math.sin(n.l),o=Math.max(e.r-i.width,0)/Math.sin(n.r),r=-e.t/Math.cos(n.t),l=-Math.max(e.b-i.height,0)/Math.cos(n.b);a=p(a),o=p(o),r=p(r),l=p(l),i.drawingArea=Math.min(Math.round(t-(a+o)/2),Math.round(t-(r+l)/2)),i.setCenterPoint(a,o,r,l)},setCenterPoint:function(t,e,n,i){var a=this,o=a.width-e-a.drawingArea,r=t+a.drawingArea,l=n+a.drawingArea,s=a.height-i-a.drawingArea;a.xCenter=Math.round((r+o)/2+a.left),a.yCenter=Math.round((l+s)/2+a.top)},getIndexAngle:function(t){return t*(2*Math.PI/e(this))+(this.chart.options&&this.chart.options.startAngle?this.chart.options.startAngle:0)*Math.PI*2/360},getDistanceFromCenterForValue:function(t){var e=this;if(null===t)return 0;var n=e.drawingArea/(e.max-e.min);return e.options.ticks.reverse?(e.max-t)*n:(t-e.min)*n},getPointPosition:function(t,e){var n=this,i=n.getIndexAngle(t)-Math.PI/2;return{x:Math.round(Math.cos(i)*e)+n.xCenter,y:Math.round(Math.sin(i)*e)+n.yCenter}},getPointPositionForValue:function(t,e){return this.getPointPosition(t,this.getDistanceFromCenterForValue(e))},getBasePosition:function(){var t=this,e=t.min,n=t.max;return t.getPointPositionForValue(0,t.beginAtZero?0:e<0&&n<0?n:e>0&&n>0?e:0)},draw:function(){var t=this,e=t.options,n=e.gridLines,i=e.ticks,o=a.valueOrDefault;if(e.display){var r=t.ctx,l=this.getIndexAngle(0),s=o(i.fontSize,v.defaultFontSize),u=o(i.fontStyle,v.defaultFontStyle),d=o(i.fontFamily,v.defaultFontFamily),c=a.fontString(s,u,d);a.each(t.ticks,function(e,a){if(a>0||i.reverse){var u=t.getDistanceFromCenterForValue(t.ticksAsNumbers[a]);if(n.display&&0!==a&&g(t,n,u,a),i.display){var d=o(i.fontColor,v.defaultFontColor);if(r.font=c,r.save(),r.translate(t.xCenter,t.yCenter),r.rotate(l),i.showLabelBackdrop){var h=r.measureText(e).width;r.fillStyle=i.backdropColor,r.fillRect(-h/2-i.backdropPaddingX,-u-s/2-i.backdropPaddingY,h+2*i.backdropPaddingX,s+2*i.backdropPaddingY)}r.textAlign="center",r.textBaseline="middle",r.fillStyle=d,r.fillText(e,0,-u),r.restore()}}}),(e.angleLines.display||e.pointLabels.display)&&f(t)}}});t.scaleService.registerScaleType("radialLinear",b,m)}},{25:25,34:34,45:45}],57:[function(t,e,n){"use strict";function i(t,e){return t-e}function a(t){var e,n,i,a={},o=[];for(e=0,n=t.length;e<n;++e)a[i=t[e]]||(a[i]=!0,o.push(i));return o}function o(t,e,n,i){if("linear"===i||!t.length)return[{time:e,pos:0},{time:n,pos:1}];var a,o,r,l,s,u=[],d=[e];for(a=0,o=t.length;a<o;++a)(l=t[a])>e&&l<n&&d.push(l);for(d.push(n),a=0,o=d.length;a<o;++a)s=d[a+1],r=d[a-1],l=d[a],void 0!==r&&void 0!==s&&Math.round((s+r)/2)===l||u.push({time:l,pos:a/(o-1)});return u}function r(t,e,n){for(var i,a,o,r=0,l=t.length-1;r>=0&&r<=l;){if(i=r+l>>1,a=t[i-1]||null,o=t[i],!a)return{lo:null,hi:o};if(o[e]<n)r=i+1;else{if(!(a[e]>n))return{lo:a,hi:o};l=i-1}}return{lo:o,hi:null}}function l(t,e,n,i){var a=r(t,e,n),o=a.lo?a.hi?a.lo:t[t.length-2]:t[0],l=a.lo?a.hi?a.hi:t[t.length-1]:t[1],s=l[e]-o[e],u=s?(n-o[e])/s:0,d=(l[i]-o[i])*u;return o[i]+d}function s(t,e){var n=e.parser,i=e.parser||e.format;return"function"==typeof n?n(t):"string"==typeof t&&"string"==typeof i?m(t,i):(t instanceof m||(t=m(t)),t.isValid()?t:"function"==typeof i?i(t):t)}function u(t,e){if(x.isNullOrUndef(t))return null;var n=e.options.time,i=s(e.getRightValue(t),n);return i.isValid()?(n.round&&i.startOf(n.round),i.valueOf()):null}function d(t,e,n,i){var a,o,r,l=e-t,s=w[n],u=s.size,d=s.steps;if(!d)return Math.ceil(l/((i||1)*u));for(a=0,o=d.length;a<o&&(r=d[a],!(Math.ceil(l/(u*r))<=i));++a);return r}function c(t,e,n,i){var a,o,r,l=M.length;for(a=M.indexOf(t);a<l-1;++a)if(o=w[M[a]],r=o.steps?o.steps[o.steps.length-1]:k,o.common&&Math.ceil((n-e)/(r*o.size))<=i)return M[a];return M[l-1]}function h(t,e,n,i){var a,o,r=m.duration(m(i).diff(m(n)));for(a=M.length-1;a>=M.indexOf(e);a--)if(o=M[a],w[o].common&&r.as(o)>=t.length)return o;return M[e?M.indexOf(e):0]}function f(t){for(var e=M.indexOf(t)+1,n=M.length;e<n;++e)if(w[M[e]].common)return M[e]}function g(t,e,n,i){var a,o=i.time,r=o.unit||c(o.minUnit,t,e,n),l=f(r),s=x.valueOrDefault(o.stepSize,o.unitStepSize),u="week"===r&&o.isoWeekday,h=i.ticks.major.enabled,g=w[r],p=m(t),v=m(e),b=[];for(s||(s=d(t,e,r,n)),u&&(p=p.isoWeekday(u),v=v.isoWeekday(u)),p=p.startOf(u?"day":r),(v=v.startOf(u?"day":r))<e&&v.add(1,r),a=m(p),h&&l&&!u&&!o.round&&(a.startOf(l),a.add(~~((p-a)/(g.size*s))*s,r));a<v;a.add(s,r))b.push(+a);return b.push(+a),b}function p(t,e,n,i,a){var o,r,s=0,u=0;return a.offset&&e.length&&(a.time.min||(o=e.length>1?e[1]:i,r=e[0],s=(l(t,"time",o,"pos")-l(t,"time",r,"pos"))/2),a.time.max||(o=e[e.length-1],r=e.length>1?e[e.length-2]:n,u=(l(t,"time",o,"pos")-l(t,"time",r,"pos"))/2)),{left:s,right:u}}function v(t,e){var n,i,a,o,r=[];for(n=0,i=t.length;n<i;++n)a=t[n],o=!!e&&a===+m(a).startOf(e),r.push({value:a,major:o});return r}var m=t(1);m="function"==typeof m?m:window.moment;var b=t(25),x=t(45),y=Number.MIN_SAFE_INTEGER||-9007199254740991,k=Number.MAX_SAFE_INTEGER||9007199254740991,w={millisecond:{common:!0,size:1,steps:[1,2,5,10,20,50,100,250,500]},second:{common:!0,size:1e3,steps:[1,2,5,10,30]},minute:{common:!0,size:6e4,steps:[1,2,5,10,30]},hour:{common:!0,size:36e5,steps:[1,2,3,6,12]},day:{common:!0,size:864e5,steps:[1,2,5]},week:{common:!1,size:6048e5,steps:[1,2,3,4]},month:{common:!0,size:2628e6,steps:[1,2,3]},quarter:{common:!1,size:7884e6,steps:[1,2,3,4]},year:{common:!0,size:3154e7}},M=Object.keys(w);e.exports=function(t){var e=t.Scale.extend({initialize:function(){if(!m)throw new Error("Chart.js - Moment.js could not be found! You must include it before Chart.js to use the time scale. Download at https://momentjs.com");this.mergeTicksOptions(),t.Scale.prototype.initialize.call(this)},update:function(){var e=this,n=e.options;return n.time&&n.time.format&&console.warn("options.time.format is deprecated and replaced by options.time.parser."),t.Scale.prototype.update.apply(e,arguments)},getRightValue:function(e){return e&&void 0!==e.t&&(e=e.t),t.Scale.prototype.getRightValue.call(this,e)},determineDataLimits:function(){var t,e,n,o,r,l,s=this,d=s.chart,c=s.options.time,h=k,f=y,g=[],p=[],v=[];for(t=0,n=d.data.labels.length;t<n;++t)v.push(u(d.data.labels[t],s));for(t=0,n=(d.data.datasets||[]).length;t<n;++t)if(d.isDatasetVisible(t))if(r=d.data.datasets[t].data,x.isObject(r[0]))for(p[t]=[],e=0,o=r.length;e<o;++e)l=u(r[e],s),g.push(l),p[t][e]=l;else g.push.apply(g,v),p[t]=v.slice(0);else p[t]=[];v.length&&(v=a(v).sort(i),h=Math.min(h,v[0]),f=Math.max(f,v[v.length-1])),g.length&&(g=a(g).sort(i),h=Math.min(h,g[0]),f=Math.max(f,g[g.length-1])),h=u(c.min,s)||h,f=u(c.max,s)||f,h=h===k?+m().startOf("day"):h,f=f===y?+m().endOf("day")+1:f,s.min=Math.min(h,f),s.max=Math.max(h+1,f),s._horizontal=s.isHorizontal(),s._table=[],s._timestamps={data:g,datasets:p,labels:v}},buildTicks:function(){var t,e,n,i=this,a=i.min,r=i.max,l=i.options,s=l.time,d=[],c=[];switch(l.ticks.source){case"data":d=i._timestamps.data;break;case"labels":d=i._timestamps.labels;break;case"auto":default:d=g(a,r,i.getLabelCapacity(a),l)}for("ticks"===l.bounds&&d.length&&(a=d[0],r=d[d.length-1]),a=u(s.min,i)||a,r=u(s.max,i)||r,t=0,e=d.length;t<e;++t)(n=d[t])>=a&&n<=r&&c.push(n);return i.min=a,i.max=r,i._unit=s.unit||h(c,s.minUnit,i.min,i.max),i._majorUnit=f(i._unit),i._table=o(i._timestamps.data,a,r,l.distribution),i._offsets=p(i._table,c,a,r,l),v(c,i._majorUnit)},getLabelForIndex:function(t,e){var n=this,i=n.chart.data,a=n.options.time,o=i.labels&&t<i.labels.length?i.labels[t]:"",r=i.datasets[e].data[t];return x.isObject(r)&&(o=n.getRightValue(r)),a.tooltipFormat&&(o=s(o,a).format(a.tooltipFormat)),o},tickFormatFunction:function(t,e,n,i){var a=this,o=a.options,r=t.valueOf(),l=o.time.displayFormats,s=l[a._unit],u=a._majorUnit,d=l[u],c=t.clone().startOf(u).valueOf(),h=o.ticks.major,f=h.enabled&&u&&d&&r===c,g=t.format(i||(f?d:s)),p=f?h:o.ticks.minor,v=x.valueOrDefault(p.callback,p.userCallback);return v?v(g,e,n):g},convertTicksToLabels:function(t){var e,n,i=[];for(e=0,n=t.length;e<n;++e)i.push(this.tickFormatFunction(m(t[e].value),e,t));return i},getPixelForOffset:function(t){var e=this,n=e._horizontal?e.width:e.height,i=e._horizontal?e.left:e.top,a=l(e._table,"time",t,"pos");return i+n*(e._offsets.left+a)/(e._offsets.left+1+e._offsets.right)},getPixelForValue:function(t,e,n){var i=this,a=null;if(void 0!==e&&void 0!==n&&(a=i._timestamps.datasets[n][e]),null===a&&(a=u(t,i)),null!==a)return i.getPixelForOffset(a)},getPixelForTick:function(t){var e=this.getTicks();return t>=0&&t<e.length?this.getPixelForOffset(e[t].value):null},getValueForPixel:function(t){var e=this,n=e._horizontal?e.width:e.height,i=e._horizontal?e.left:e.top,a=(n?(t-i)/n:0)*(e._offsets.left+1+e._offsets.left)-e._offsets.right,o=l(e._table,"pos",a,"time");return m(o)},getLabelWidth:function(t){var e=this,n=e.options.ticks,i=e.ctx.measureText(t).width,a=x.toRadians(n.maxRotation),o=Math.cos(a),r=Math.sin(a);return i*o+x.valueOrDefault(n.fontSize,b.global.defaultFontSize)*r},getLabelCapacity:function(t){var e=this,n=e.options.time.displayFormats.millisecond,i=e.tickFormatFunction(m(t),0,[],n),a=e.getLabelWidth(i),o=e.isHorizontal()?e.width:e.height;return Math.floor(o/a)}});t.scaleService.registerScaleType("time",e,{position:"bottom",distribution:"linear",bounds:"data",time:{parser:!1,format:!1,unit:!1,round:!1,displayFormat:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{millisecond:"h:mm:ss.SSS a",second:"h:mm:ss a",minute:"h:mm a",hour:"hA",day:"MMM D",week:"ll",month:"MMM YYYY",quarter:"[Q]Q - YYYY",year:"YYYY"}},ticks:{autoSkip:!1,source:"auto",major:{enabled:!1}}})}},{1:1,25:25,45:45}]},{},[7])(7)}); diff --git a/explorer/public/paper-dashboard/assets/js/plugins/perfect-scrollbar.jquery.min.js b/explorer/public/paper-dashboard/assets/js/plugins/perfect-scrollbar.jquery.min.js new file mode 100644 index 00000000000..108e72547ee --- /dev/null +++ b/explorer/public/paper-dashboard/assets/js/plugins/perfect-scrollbar.jquery.min.js @@ -0,0 +1,2 @@ +/* perfect-scrollbar v0.6.13 */ +!function t(e,n,r){function o(i,s){if(!n[i]){if(!e[i]){var a="function"==typeof require&&require;if(!s&&a)return a(i,!0);if(l)return l(i,!0);var c=new Error("Cannot find module '"+i+"'");throw c.code="MODULE_NOT_FOUND",c}var u=n[i]={exports:{}};e[i][0].call(u.exports,function(t){var n=e[i][1][t];return o(n?n:t)},u,u.exports,t,e,n,r)}return n[i].exports}for(var l="function"==typeof require&&require,i=0;i<r.length;i++)o(r[i]);return o}({1:[function(t,e,n){"use strict";function r(t){t.fn.perfectScrollbar=function(t){return this.each(function(){if("object"==typeof t||"undefined"==typeof t){var e=t;l.get(this)||o.initialize(this,e)}else{var n=t;"update"===n?o.update(this):"destroy"===n&&o.destroy(this)}})}}var o=t("../main"),l=t("../plugin/instances");if("function"==typeof define&&define.amd)define(["jquery"],r);else{var i=window.jQuery?window.jQuery:window.$;"undefined"!=typeof i&&r(i)}e.exports=r},{"../main":7,"../plugin/instances":18}],2:[function(t,e,n){"use strict";function r(t,e){var n=t.className.split(" ");n.indexOf(e)<0&&n.push(e),t.className=n.join(" ")}function o(t,e){var n=t.className.split(" "),r=n.indexOf(e);r>=0&&n.splice(r,1),t.className=n.join(" ")}n.add=function(t,e){t.classList?t.classList.add(e):r(t,e)},n.remove=function(t,e){t.classList?t.classList.remove(e):o(t,e)},n.list=function(t){return t.classList?Array.prototype.slice.apply(t.classList):t.className.split(" ")}},{}],3:[function(t,e,n){"use strict";function r(t,e){return window.getComputedStyle(t)[e]}function o(t,e,n){return"number"==typeof n&&(n=n.toString()+"px"),t.style[e]=n,t}function l(t,e){for(var n in e){var r=e[n];"number"==typeof r&&(r=r.toString()+"px"),t.style[n]=r}return t}var i={};i.e=function(t,e){var n=document.createElement(t);return n.className=e,n},i.appendTo=function(t,e){return e.appendChild(t),t},i.css=function(t,e,n){return"object"==typeof e?l(t,e):"undefined"==typeof n?r(t,e):o(t,e,n)},i.matches=function(t,e){return"undefined"!=typeof t.matches?t.matches(e):"undefined"!=typeof t.matchesSelector?t.matchesSelector(e):"undefined"!=typeof t.webkitMatchesSelector?t.webkitMatchesSelector(e):"undefined"!=typeof t.mozMatchesSelector?t.mozMatchesSelector(e):"undefined"!=typeof t.msMatchesSelector?t.msMatchesSelector(e):void 0},i.remove=function(t){"undefined"!=typeof t.remove?t.remove():t.parentNode&&t.parentNode.removeChild(t)},i.queryChildren=function(t,e){return Array.prototype.filter.call(t.childNodes,function(t){return i.matches(t,e)})},e.exports=i},{}],4:[function(t,e,n){"use strict";var r=function(t){this.element=t,this.events={}};r.prototype.bind=function(t,e){"undefined"==typeof this.events[t]&&(this.events[t]=[]),this.events[t].push(e),this.element.addEventListener(t,e,!1)},r.prototype.unbind=function(t,e){var n="undefined"!=typeof e;this.events[t]=this.events[t].filter(function(r){return!(!n||r===e)||(this.element.removeEventListener(t,r,!1),!1)},this)},r.prototype.unbindAll=function(){for(var t in this.events)this.unbind(t)};var o=function(){this.eventElements=[]};o.prototype.eventElement=function(t){var e=this.eventElements.filter(function(e){return e.element===t})[0];return"undefined"==typeof e&&(e=new r(t),this.eventElements.push(e)),e},o.prototype.bind=function(t,e,n){this.eventElement(t).bind(e,n)},o.prototype.unbind=function(t,e,n){this.eventElement(t).unbind(e,n)},o.prototype.unbindAll=function(){for(var t=0;t<this.eventElements.length;t++)this.eventElements[t].unbindAll()},o.prototype.once=function(t,e,n){var r=this.eventElement(t),o=function(t){r.unbind(e,o),n(t)};r.bind(e,o)},e.exports=o},{}],5:[function(t,e,n){"use strict";e.exports=function(){function t(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)}return function(){return t()+t()+"-"+t()+"-"+t()+"-"+t()+"-"+t()+t()+t()}}()},{}],6:[function(t,e,n){"use strict";var r=t("./class"),o=t("./dom"),l=n.toInt=function(t){return parseInt(t,10)||0},i=n.clone=function(t){if(t){if(t.constructor===Array)return t.map(i);if("object"==typeof t){var e={};for(var n in t)e[n]=i(t[n]);return e}return t}return null};n.extend=function(t,e){var n=i(t);for(var r in e)n[r]=i(e[r]);return n},n.isEditable=function(t){return o.matches(t,"input,[contenteditable]")||o.matches(t,"select,[contenteditable]")||o.matches(t,"textarea,[contenteditable]")||o.matches(t,"button,[contenteditable]")},n.removePsClasses=function(t){for(var e=r.list(t),n=0;n<e.length;n++){var o=e[n];0===o.indexOf("ps-")&&r.remove(t,o)}},n.outerWidth=function(t){return l(o.css(t,"width"))+l(o.css(t,"paddingLeft"))+l(o.css(t,"paddingRight"))+l(o.css(t,"borderLeftWidth"))+l(o.css(t,"borderRightWidth"))},n.startScrolling=function(t,e){r.add(t,"ps-in-scrolling"),"undefined"!=typeof e?r.add(t,"ps-"+e):(r.add(t,"ps-x"),r.add(t,"ps-y"))},n.stopScrolling=function(t,e){r.remove(t,"ps-in-scrolling"),"undefined"!=typeof e?r.remove(t,"ps-"+e):(r.remove(t,"ps-x"),r.remove(t,"ps-y"))},n.env={isWebKit:"WebkitAppearance"in document.documentElement.style,supportsTouch:"ontouchstart"in window||window.DocumentTouch&&document instanceof window.DocumentTouch,supportsIePointer:null!==window.navigator.msMaxTouchPoints}},{"./class":2,"./dom":3}],7:[function(t,e,n){"use strict";var r=t("./plugin/destroy"),o=t("./plugin/initialize"),l=t("./plugin/update");e.exports={initialize:o,update:l,destroy:r}},{"./plugin/destroy":9,"./plugin/initialize":17,"./plugin/update":21}],8:[function(t,e,n){"use strict";e.exports={handlers:["click-rail","drag-scrollbar","keyboard","wheel","touch"],maxScrollbarLength:null,minScrollbarLength:null,scrollXMarginOffset:0,scrollYMarginOffset:0,suppressScrollX:!1,suppressScrollY:!1,swipePropagation:!0,useBothWheelAxes:!1,wheelPropagation:!1,wheelSpeed:1,theme:"default"}},{}],9:[function(t,e,n){"use strict";var r=t("../lib/helper"),o=t("../lib/dom"),l=t("./instances");e.exports=function(t){var e=l.get(t);e&&(e.event.unbindAll(),o.remove(e.scrollbarX),o.remove(e.scrollbarY),o.remove(e.scrollbarXRail),o.remove(e.scrollbarYRail),r.removePsClasses(t),l.remove(t))}},{"../lib/dom":3,"../lib/helper":6,"./instances":18}],10:[function(t,e,n){"use strict";function r(t,e){function n(t){return t.getBoundingClientRect()}var r=function(t){t.stopPropagation()};e.event.bind(e.scrollbarY,"click",r),e.event.bind(e.scrollbarYRail,"click",function(r){var o=r.pageY-window.pageYOffset-n(e.scrollbarYRail).top,s=o>e.scrollbarYTop?1:-1;i(t,"top",t.scrollTop+s*e.containerHeight),l(t),r.stopPropagation()}),e.event.bind(e.scrollbarX,"click",r),e.event.bind(e.scrollbarXRail,"click",function(r){var o=r.pageX-window.pageXOffset-n(e.scrollbarXRail).left,s=o>e.scrollbarXLeft?1:-1;i(t,"left",t.scrollLeft+s*e.containerWidth),l(t),r.stopPropagation()})}var o=t("../instances"),l=t("../update-geometry"),i=t("../update-scroll");e.exports=function(t){var e=o.get(t);r(t,e)}},{"../instances":18,"../update-geometry":19,"../update-scroll":20}],11:[function(t,e,n){"use strict";function r(t,e){function n(n){var o=r+n*e.railXRatio,i=Math.max(0,e.scrollbarXRail.getBoundingClientRect().left)+e.railXRatio*(e.railXWidth-e.scrollbarXWidth);o<0?e.scrollbarXLeft=0:o>i?e.scrollbarXLeft=i:e.scrollbarXLeft=o;var s=l.toInt(e.scrollbarXLeft*(e.contentWidth-e.containerWidth)/(e.containerWidth-e.railXRatio*e.scrollbarXWidth))-e.negativeScrollAdjustment;c(t,"left",s)}var r=null,o=null,s=function(e){n(e.pageX-o),a(t),e.stopPropagation(),e.preventDefault()},u=function(){l.stopScrolling(t,"x"),e.event.unbind(e.ownerDocument,"mousemove",s)};e.event.bind(e.scrollbarX,"mousedown",function(n){o=n.pageX,r=l.toInt(i.css(e.scrollbarX,"left"))*e.railXRatio,l.startScrolling(t,"x"),e.event.bind(e.ownerDocument,"mousemove",s),e.event.once(e.ownerDocument,"mouseup",u),n.stopPropagation(),n.preventDefault()})}function o(t,e){function n(n){var o=r+n*e.railYRatio,i=Math.max(0,e.scrollbarYRail.getBoundingClientRect().top)+e.railYRatio*(e.railYHeight-e.scrollbarYHeight);o<0?e.scrollbarYTop=0:o>i?e.scrollbarYTop=i:e.scrollbarYTop=o;var s=l.toInt(e.scrollbarYTop*(e.contentHeight-e.containerHeight)/(e.containerHeight-e.railYRatio*e.scrollbarYHeight));c(t,"top",s)}var r=null,o=null,s=function(e){n(e.pageY-o),a(t),e.stopPropagation(),e.preventDefault()},u=function(){l.stopScrolling(t,"y"),e.event.unbind(e.ownerDocument,"mousemove",s)};e.event.bind(e.scrollbarY,"mousedown",function(n){o=n.pageY,r=l.toInt(i.css(e.scrollbarY,"top"))*e.railYRatio,l.startScrolling(t,"y"),e.event.bind(e.ownerDocument,"mousemove",s),e.event.once(e.ownerDocument,"mouseup",u),n.stopPropagation(),n.preventDefault()})}var l=t("../../lib/helper"),i=t("../../lib/dom"),s=t("../instances"),a=t("../update-geometry"),c=t("../update-scroll");e.exports=function(t){var e=s.get(t);r(t,e),o(t,e)}},{"../../lib/dom":3,"../../lib/helper":6,"../instances":18,"../update-geometry":19,"../update-scroll":20}],12:[function(t,e,n){"use strict";function r(t,e){function n(n,r){var o=t.scrollTop;if(0===n){if(!e.scrollbarYActive)return!1;if(0===o&&r>0||o>=e.contentHeight-e.containerHeight&&r<0)return!e.settings.wheelPropagation}var l=t.scrollLeft;if(0===r){if(!e.scrollbarXActive)return!1;if(0===l&&n<0||l>=e.contentWidth-e.containerWidth&&n>0)return!e.settings.wheelPropagation}return!0}var r=!1;e.event.bind(t,"mouseenter",function(){r=!0}),e.event.bind(t,"mouseleave",function(){r=!1});var i=!1;e.event.bind(e.ownerDocument,"keydown",function(c){if(!(c.isDefaultPrevented&&c.isDefaultPrevented()||c.defaultPrevented)){var u=l.matches(e.scrollbarX,":focus")||l.matches(e.scrollbarY,":focus");if(r||u){var d=document.activeElement?document.activeElement:e.ownerDocument.activeElement;if(d){if("IFRAME"===d.tagName)d=d.contentDocument.activeElement;else for(;d.shadowRoot;)d=d.shadowRoot.activeElement;if(o.isEditable(d))return}var p=0,f=0;switch(c.which){case 37:p=c.metaKey?-e.contentWidth:c.altKey?-e.containerWidth:-30;break;case 38:f=c.metaKey?e.contentHeight:c.altKey?e.containerHeight:30;break;case 39:p=c.metaKey?e.contentWidth:c.altKey?e.containerWidth:30;break;case 40:f=c.metaKey?-e.contentHeight:c.altKey?-e.containerHeight:-30;break;case 33:f=90;break;case 32:f=c.shiftKey?90:-90;break;case 34:f=-90;break;case 35:f=c.ctrlKey?-e.contentHeight:-e.containerHeight;break;case 36:f=c.ctrlKey?t.scrollTop:e.containerHeight;break;default:return}a(t,"top",t.scrollTop-f),a(t,"left",t.scrollLeft+p),s(t),i=n(p,f),i&&c.preventDefault()}}})}var o=t("../../lib/helper"),l=t("../../lib/dom"),i=t("../instances"),s=t("../update-geometry"),a=t("../update-scroll");e.exports=function(t){var e=i.get(t);r(t,e)}},{"../../lib/dom":3,"../../lib/helper":6,"../instances":18,"../update-geometry":19,"../update-scroll":20}],13:[function(t,e,n){"use strict";function r(t,e){function n(n,r){var o=t.scrollTop;if(0===n){if(!e.scrollbarYActive)return!1;if(0===o&&r>0||o>=e.contentHeight-e.containerHeight&&r<0)return!e.settings.wheelPropagation}var l=t.scrollLeft;if(0===r){if(!e.scrollbarXActive)return!1;if(0===l&&n<0||l>=e.contentWidth-e.containerWidth&&n>0)return!e.settings.wheelPropagation}return!0}function r(t){var e=t.deltaX,n=-1*t.deltaY;return"undefined"!=typeof e&&"undefined"!=typeof n||(e=-1*t.wheelDeltaX/6,n=t.wheelDeltaY/6),t.deltaMode&&1===t.deltaMode&&(e*=10,n*=10),e!==e&&n!==n&&(e=0,n=t.wheelDelta),t.shiftKey?[-n,-e]:[e,n]}function o(e,n){var r=t.querySelector("textarea:hover, select[multiple]:hover, .ps-child:hover");if(r){if(!window.getComputedStyle(r).overflow.match(/(scroll|auto)/))return!1;var o=r.scrollHeight-r.clientHeight;if(o>0&&!(0===r.scrollTop&&n>0||r.scrollTop===o&&n<0))return!0;var l=r.scrollLeft-r.clientWidth;if(l>0&&!(0===r.scrollLeft&&e<0||r.scrollLeft===l&&e>0))return!0}return!1}function s(s){var c=r(s),u=c[0],d=c[1];o(u,d)||(a=!1,e.settings.useBothWheelAxes?e.scrollbarYActive&&!e.scrollbarXActive?(d?i(t,"top",t.scrollTop-d*e.settings.wheelSpeed):i(t,"top",t.scrollTop+u*e.settings.wheelSpeed),a=!0):e.scrollbarXActive&&!e.scrollbarYActive&&(u?i(t,"left",t.scrollLeft+u*e.settings.wheelSpeed):i(t,"left",t.scrollLeft-d*e.settings.wheelSpeed),a=!0):(i(t,"top",t.scrollTop-d*e.settings.wheelSpeed),i(t,"left",t.scrollLeft+u*e.settings.wheelSpeed)),l(t),a=a||n(u,d),a&&(s.stopPropagation(),s.preventDefault()))}var a=!1;"undefined"!=typeof window.onwheel?e.event.bind(t,"wheel",s):"undefined"!=typeof window.onmousewheel&&e.event.bind(t,"mousewheel",s)}var o=t("../instances"),l=t("../update-geometry"),i=t("../update-scroll");e.exports=function(t){var e=o.get(t);r(t,e)}},{"../instances":18,"../update-geometry":19,"../update-scroll":20}],14:[function(t,e,n){"use strict";function r(t,e){e.event.bind(t,"scroll",function(){l(t)})}var o=t("../instances"),l=t("../update-geometry");e.exports=function(t){var e=o.get(t);r(t,e)}},{"../instances":18,"../update-geometry":19}],15:[function(t,e,n){"use strict";function r(t,e){function n(){var t=window.getSelection?window.getSelection():document.getSelection?document.getSelection():"";return 0===t.toString().length?null:t.getRangeAt(0).commonAncestorContainer}function r(){c||(c=setInterval(function(){return l.get(t)?(s(t,"top",t.scrollTop+u.top),s(t,"left",t.scrollLeft+u.left),void i(t)):void clearInterval(c)},50))}function a(){c&&(clearInterval(c),c=null),o.stopScrolling(t)}var c=null,u={top:0,left:0},d=!1;e.event.bind(e.ownerDocument,"selectionchange",function(){t.contains(n())?d=!0:(d=!1,a())}),e.event.bind(window,"mouseup",function(){d&&(d=!1,a())}),e.event.bind(window,"keyup",function(){d&&(d=!1,a())}),e.event.bind(window,"mousemove",function(e){if(d){var n={x:e.pageX,y:e.pageY},l={left:t.offsetLeft,right:t.offsetLeft+t.offsetWidth,top:t.offsetTop,bottom:t.offsetTop+t.offsetHeight};n.x<l.left+3?(u.left=-5,o.startScrolling(t,"x")):n.x>l.right-3?(u.left=5,o.startScrolling(t,"x")):u.left=0,n.y<l.top+3?(l.top+3-n.y<5?u.top=-5:u.top=-20,o.startScrolling(t,"y")):n.y>l.bottom-3?(n.y-l.bottom+3<5?u.top=5:u.top=20,o.startScrolling(t,"y")):u.top=0,0===u.top&&0===u.left?a():r()}})}var o=t("../../lib/helper"),l=t("../instances"),i=t("../update-geometry"),s=t("../update-scroll");e.exports=function(t){var e=l.get(t);r(t,e)}},{"../../lib/helper":6,"../instances":18,"../update-geometry":19,"../update-scroll":20}],16:[function(t,e,n){"use strict";function r(t,e,n,r){function o(n,r){var o=t.scrollTop,l=t.scrollLeft,i=Math.abs(n),s=Math.abs(r);if(s>i){if(r<0&&o===e.contentHeight-e.containerHeight||r>0&&0===o)return!e.settings.swipePropagation}else if(i>s&&(n<0&&l===e.contentWidth-e.containerWidth||n>0&&0===l))return!e.settings.swipePropagation;return!0}function a(e,n){s(t,"top",t.scrollTop-n),s(t,"left",t.scrollLeft-e),i(t)}function c(){w=!0}function u(){w=!1}function d(t){return t.targetTouches?t.targetTouches[0]:t}function p(t){return!(!t.targetTouches||1!==t.targetTouches.length)||!(!t.pointerType||"mouse"===t.pointerType||t.pointerType===t.MSPOINTER_TYPE_MOUSE)}function f(t){if(p(t)){Y=!0;var e=d(t);g.pageX=e.pageX,g.pageY=e.pageY,v=(new Date).getTime(),null!==y&&clearInterval(y),t.stopPropagation()}}function h(t){if(!Y&&e.settings.swipePropagation&&f(t),!w&&Y&&p(t)){var n=d(t),r={pageX:n.pageX,pageY:n.pageY},l=r.pageX-g.pageX,i=r.pageY-g.pageY;a(l,i),g=r;var s=(new Date).getTime(),c=s-v;c>0&&(m.x=l/c,m.y=i/c,v=s),o(l,i)&&(t.stopPropagation(),t.preventDefault())}}function b(){!w&&Y&&(Y=!1,clearInterval(y),y=setInterval(function(){return l.get(t)&&(m.x||m.y)?Math.abs(m.x)<.01&&Math.abs(m.y)<.01?void clearInterval(y):(a(30*m.x,30*m.y),m.x*=.8,void(m.y*=.8)):void clearInterval(y)},10))}var g={},v=0,m={},y=null,w=!1,Y=!1;n&&(e.event.bind(window,"touchstart",c),e.event.bind(window,"touchend",u),e.event.bind(t,"touchstart",f),e.event.bind(t,"touchmove",h),e.event.bind(t,"touchend",b)),r&&(window.PointerEvent?(e.event.bind(window,"pointerdown",c),e.event.bind(window,"pointerup",u),e.event.bind(t,"pointerdown",f),e.event.bind(t,"pointermove",h),e.event.bind(t,"pointerup",b)):window.MSPointerEvent&&(e.event.bind(window,"MSPointerDown",c),e.event.bind(window,"MSPointerUp",u),e.event.bind(t,"MSPointerDown",f),e.event.bind(t,"MSPointerMove",h),e.event.bind(t,"MSPointerUp",b)))}var o=t("../../lib/helper"),l=t("../instances"),i=t("../update-geometry"),s=t("../update-scroll");e.exports=function(t){if(o.env.supportsTouch||o.env.supportsIePointer){var e=l.get(t);r(t,e,o.env.supportsTouch,o.env.supportsIePointer)}}},{"../../lib/helper":6,"../instances":18,"../update-geometry":19,"../update-scroll":20}],17:[function(t,e,n){"use strict";var r=t("../lib/helper"),o=t("../lib/class"),l=t("./instances"),i=t("./update-geometry"),s={"click-rail":t("./handler/click-rail"),"drag-scrollbar":t("./handler/drag-scrollbar"),keyboard:t("./handler/keyboard"),wheel:t("./handler/mouse-wheel"),touch:t("./handler/touch"),selection:t("./handler/selection")},a=t("./handler/native-scroll");e.exports=function(t,e){e="object"==typeof e?e:{},o.add(t,"ps-container");var n=l.add(t);n.settings=r.extend(n.settings,e),o.add(t,"ps-theme-"+n.settings.theme),n.settings.handlers.forEach(function(e){s[e](t)}),a(t),i(t)}},{"../lib/class":2,"../lib/helper":6,"./handler/click-rail":10,"./handler/drag-scrollbar":11,"./handler/keyboard":12,"./handler/mouse-wheel":13,"./handler/native-scroll":14,"./handler/selection":15,"./handler/touch":16,"./instances":18,"./update-geometry":19}],18:[function(t,e,n){"use strict";function r(t){function e(){a.add(t,"ps-focus")}function n(){a.remove(t,"ps-focus")}var r=this;r.settings=s.clone(c),r.containerWidth=null,r.containerHeight=null,r.contentWidth=null,r.contentHeight=null,r.isRtl="rtl"===u.css(t,"direction"),r.isNegativeScroll=function(){var e=t.scrollLeft,n=null;return t.scrollLeft=-1,n=t.scrollLeft<0,t.scrollLeft=e,n}(),r.negativeScrollAdjustment=r.isNegativeScroll?t.scrollWidth-t.clientWidth:0,r.event=new d,r.ownerDocument=t.ownerDocument||document,r.scrollbarXRail=u.appendTo(u.e("div","ps-scrollbar-x-rail"),t),r.scrollbarX=u.appendTo(u.e("div","ps-scrollbar-x"),r.scrollbarXRail),r.scrollbarX.setAttribute("tabindex",0),r.event.bind(r.scrollbarX,"focus",e),r.event.bind(r.scrollbarX,"blur",n),r.scrollbarXActive=null,r.scrollbarXWidth=null,r.scrollbarXLeft=null,r.scrollbarXBottom=s.toInt(u.css(r.scrollbarXRail,"bottom")),r.isScrollbarXUsingBottom=r.scrollbarXBottom===r.scrollbarXBottom,r.scrollbarXTop=r.isScrollbarXUsingBottom?null:s.toInt(u.css(r.scrollbarXRail,"top")),r.railBorderXWidth=s.toInt(u.css(r.scrollbarXRail,"borderLeftWidth"))+s.toInt(u.css(r.scrollbarXRail,"borderRightWidth")),u.css(r.scrollbarXRail,"display","block"),r.railXMarginWidth=s.toInt(u.css(r.scrollbarXRail,"marginLeft"))+s.toInt(u.css(r.scrollbarXRail,"marginRight")),u.css(r.scrollbarXRail,"display",""),r.railXWidth=null,r.railXRatio=null,r.scrollbarYRail=u.appendTo(u.e("div","ps-scrollbar-y-rail"),t),r.scrollbarY=u.appendTo(u.e("div","ps-scrollbar-y"),r.scrollbarYRail),r.scrollbarY.setAttribute("tabindex",0),r.event.bind(r.scrollbarY,"focus",e),r.event.bind(r.scrollbarY,"blur",n),r.scrollbarYActive=null,r.scrollbarYHeight=null,r.scrollbarYTop=null,r.scrollbarYRight=s.toInt(u.css(r.scrollbarYRail,"right")),r.isScrollbarYUsingRight=r.scrollbarYRight===r.scrollbarYRight,r.scrollbarYLeft=r.isScrollbarYUsingRight?null:s.toInt(u.css(r.scrollbarYRail,"left")),r.scrollbarYOuterWidth=r.isRtl?s.outerWidth(r.scrollbarY):null,r.railBorderYWidth=s.toInt(u.css(r.scrollbarYRail,"borderTopWidth"))+s.toInt(u.css(r.scrollbarYRail,"borderBottomWidth")),u.css(r.scrollbarYRail,"display","block"),r.railYMarginHeight=s.toInt(u.css(r.scrollbarYRail,"marginTop"))+s.toInt(u.css(r.scrollbarYRail,"marginBottom")),u.css(r.scrollbarYRail,"display",""),r.railYHeight=null,r.railYRatio=null}function o(t){return t.getAttribute("data-ps-id")}function l(t,e){t.setAttribute("data-ps-id",e)}function i(t){t.removeAttribute("data-ps-id")}var s=t("../lib/helper"),a=t("../lib/class"),c=t("./default-setting"),u=t("../lib/dom"),d=t("../lib/event-manager"),p=t("../lib/guid"),f={};n.add=function(t){var e=p();return l(t,e),f[e]=new r(t),f[e]},n.remove=function(t){delete f[o(t)],i(t)},n.get=function(t){return f[o(t)]}},{"../lib/class":2,"../lib/dom":3,"../lib/event-manager":4,"../lib/guid":5,"../lib/helper":6,"./default-setting":8}],19:[function(t,e,n){"use strict";function r(t,e){return t.settings.minScrollbarLength&&(e=Math.max(e,t.settings.minScrollbarLength)),t.settings.maxScrollbarLength&&(e=Math.min(e,t.settings.maxScrollbarLength)),e}function o(t,e){var n={width:e.railXWidth};e.isRtl?n.left=e.negativeScrollAdjustment+t.scrollLeft+e.containerWidth-e.contentWidth:n.left=t.scrollLeft,e.isScrollbarXUsingBottom?n.bottom=e.scrollbarXBottom-t.scrollTop:n.top=e.scrollbarXTop+t.scrollTop,s.css(e.scrollbarXRail,n);var r={top:t.scrollTop,height:e.railYHeight};e.isScrollbarYUsingRight?e.isRtl?r.right=e.contentWidth-(e.negativeScrollAdjustment+t.scrollLeft)-e.scrollbarYRight-e.scrollbarYOuterWidth:r.right=e.scrollbarYRight-t.scrollLeft:e.isRtl?r.left=e.negativeScrollAdjustment+t.scrollLeft+2*e.containerWidth-e.contentWidth-e.scrollbarYLeft-e.scrollbarYOuterWidth:r.left=e.scrollbarYLeft+t.scrollLeft,s.css(e.scrollbarYRail,r),s.css(e.scrollbarX,{left:e.scrollbarXLeft,width:e.scrollbarXWidth-e.railBorderXWidth}),s.css(e.scrollbarY,{top:e.scrollbarYTop,height:e.scrollbarYHeight-e.railBorderYWidth})}var l=t("../lib/helper"),i=t("../lib/class"),s=t("../lib/dom"),a=t("./instances"),c=t("./update-scroll");e.exports=function(t){var e=a.get(t);e.containerWidth=t.clientWidth,e.containerHeight=t.clientHeight,e.contentWidth=t.scrollWidth,e.contentHeight=t.scrollHeight;var n;t.contains(e.scrollbarXRail)||(n=s.queryChildren(t,".ps-scrollbar-x-rail"),n.length>0&&n.forEach(function(t){s.remove(t)}),s.appendTo(e.scrollbarXRail,t)),t.contains(e.scrollbarYRail)||(n=s.queryChildren(t,".ps-scrollbar-y-rail"),n.length>0&&n.forEach(function(t){s.remove(t)}),s.appendTo(e.scrollbarYRail,t)),!e.settings.suppressScrollX&&e.containerWidth+e.settings.scrollXMarginOffset<e.contentWidth?(e.scrollbarXActive=!0,e.railXWidth=e.containerWidth-e.railXMarginWidth,e.railXRatio=e.containerWidth/e.railXWidth,e.scrollbarXWidth=r(e,l.toInt(e.railXWidth*e.containerWidth/e.contentWidth)),e.scrollbarXLeft=l.toInt((e.negativeScrollAdjustment+t.scrollLeft)*(e.railXWidth-e.scrollbarXWidth)/(e.contentWidth-e.containerWidth))):e.scrollbarXActive=!1,!e.settings.suppressScrollY&&e.containerHeight+e.settings.scrollYMarginOffset<e.contentHeight?(e.scrollbarYActive=!0,e.railYHeight=e.containerHeight-e.railYMarginHeight,e.railYRatio=e.containerHeight/e.railYHeight,e.scrollbarYHeight=r(e,l.toInt(e.railYHeight*e.containerHeight/e.contentHeight)),e.scrollbarYTop=l.toInt(t.scrollTop*(e.railYHeight-e.scrollbarYHeight)/(e.contentHeight-e.containerHeight))):e.scrollbarYActive=!1,e.scrollbarXLeft>=e.railXWidth-e.scrollbarXWidth&&(e.scrollbarXLeft=e.railXWidth-e.scrollbarXWidth),e.scrollbarYTop>=e.railYHeight-e.scrollbarYHeight&&(e.scrollbarYTop=e.railYHeight-e.scrollbarYHeight),o(t,e),e.scrollbarXActive?i.add(t,"ps-active-x"):(i.remove(t,"ps-active-x"),e.scrollbarXWidth=0,e.scrollbarXLeft=0,c(t,"left",0)),e.scrollbarYActive?i.add(t,"ps-active-y"):(i.remove(t,"ps-active-y"),e.scrollbarYHeight=0,e.scrollbarYTop=0,c(t,"top",0))}},{"../lib/class":2,"../lib/dom":3,"../lib/helper":6,"./instances":18,"./update-scroll":20}],20:[function(t,e,n){"use strict";var r,o,l=t("./instances"),i=function(t){var e=document.createEvent("Event");return e.initEvent(t,!0,!0),e};e.exports=function(t,e,n){if("undefined"==typeof t)throw"You must provide an element to the update-scroll function";if("undefined"==typeof e)throw"You must provide an axis to the update-scroll function";if("undefined"==typeof n)throw"You must provide a value to the update-scroll function";"top"===e&&n<=0&&(t.scrollTop=n=0,t.dispatchEvent(i("ps-y-reach-start"))),"left"===e&&n<=0&&(t.scrollLeft=n=0,t.dispatchEvent(i("ps-x-reach-start")));var s=l.get(t);"top"===e&&n>=s.contentHeight-s.containerHeight&&(n=s.contentHeight-s.containerHeight,n-t.scrollTop<=1?n=t.scrollTop:t.scrollTop=n,t.dispatchEvent(i("ps-y-reach-end"))),"left"===e&&n>=s.contentWidth-s.containerWidth&&(n=s.contentWidth-s.containerWidth,n-t.scrollLeft<=1?n=t.scrollLeft:t.scrollLeft=n,t.dispatchEvent(i("ps-x-reach-end"))),r||(r=t.scrollTop),o||(o=t.scrollLeft),"top"===e&&n<r&&t.dispatchEvent(i("ps-scroll-up")),"top"===e&&n>r&&t.dispatchEvent(i("ps-scroll-down")),"left"===e&&n<o&&t.dispatchEvent(i("ps-scroll-left")),"left"===e&&n>o&&t.dispatchEvent(i("ps-scroll-right")),"top"===e&&(t.scrollTop=r=n,t.dispatchEvent(i("ps-scroll-y"))),"left"===e&&(t.scrollLeft=o=n,t.dispatchEvent(i("ps-scroll-x")))}},{"./instances":18}],21:[function(t,e,n){"use strict";var r=t("../lib/helper"),o=t("../lib/dom"),l=t("./instances"),i=t("./update-geometry"),s=t("./update-scroll");e.exports=function(t){var e=l.get(t);e&&(e.negativeScrollAdjustment=e.isNegativeScroll?t.scrollWidth-t.clientWidth:0,o.css(e.scrollbarXRail,"display","block"),o.css(e.scrollbarYRail,"display","block"),e.railXMarginWidth=r.toInt(o.css(e.scrollbarXRail,"marginLeft"))+r.toInt(o.css(e.scrollbarXRail,"marginRight")),e.railYMarginHeight=r.toInt(o.css(e.scrollbarYRail,"marginTop"))+r.toInt(o.css(e.scrollbarYRail,"marginBottom")),o.css(e.scrollbarXRail,"display","none"),o.css(e.scrollbarYRail,"display","none"),i(t),s(t,"top",t.scrollTop),s(t,"left",t.scrollLeft),o.css(e.scrollbarXRail,"display",""),o.css(e.scrollbarYRail,"display",""))}},{"../lib/dom":3,"../lib/helper":6,"./instances":18,"./update-geometry":19,"./update-scroll":20}]},{},[1]); diff --git a/explorer/public/paper-dashboard/assets/scss/paper-dashboard.scss b/explorer/public/paper-dashboard/assets/scss/paper-dashboard.scss new file mode 100644 index 00000000000..ab381b65b8e --- /dev/null +++ b/explorer/public/paper-dashboard/assets/scss/paper-dashboard.scss @@ -0,0 +1,53 @@ +/*! + + ========================================================= + * Paper Dashboard 2 - v2.0.0 + ========================================================= + + * Product Page: https://www.creative-tim.com/product/paper-dashboard-2 + * Copyright 2018 Creative Tim (http://www.creative-tim.com) + + * Designed by www.invisionapp.com Coded by www.creative-tim.com + + ========================================================= + + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + + */ + +@import 'paper-dashboard/variables'; +@import 'paper-dashboard/mixins'; + +// Plugins CSS +@import "paper-dashboard/plugins/plugin-animate-bootstrap-notify"; +@import "paper-dashboard/plugins/plugin-perfect-scrollbar"; + +// Core CSS +@import "paper-dashboard/buttons"; +@import "paper-dashboard/inputs"; +@import "paper-dashboard/typography"; +@import "paper-dashboard/misc"; +@import "paper-dashboard/checkboxes-radio"; + + +// components +@import "paper-dashboard/navbar"; +@import "paper-dashboard/page-header"; +@import "paper-dashboard/dropdown"; +@import "paper-dashboard/alerts"; +@import "paper-dashboard/images"; +@import "paper-dashboard/nucleo-outline"; +@import "paper-dashboard/tables"; +@import "paper-dashboard/sidebar-and-main-panel"; +@import "paper-dashboard/footers"; +@import "paper-dashboard/fixed-plugin"; + +// cards +@import "paper-dashboard/cards"; +@import "paper-dashboard/cards/card-plain"; +@import "paper-dashboard/cards/card-chart"; +@import "paper-dashboard/cards/card-user"; +@import "paper-dashboard/cards/card-map"; +@import "paper-dashboard/cards/card-stats"; + +@import "paper-dashboard/responsive"; diff --git a/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_alerts.scss b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_alerts.scss new file mode 100644 index 00000000000..ec007ec87d1 --- /dev/null +++ b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_alerts.scss @@ -0,0 +1,74 @@ +.alert{ + border: 0; + border-radius: $border-radius-small; + color: $white-color; + padding-top: .9rem; + padding-bottom: .9rem; + position: relative; + + &.alert-success{ + background-color: lighten($success-color, 5%); + } + + &.alert-danger{ + background-color: lighten($danger-color, 5%); + } + + &.alert-warning{ + background-color: lighten($warning-color, 5%); + } + + &.alert-info{ + background-color: lighten($info-color, 5%); + } + + &.alert-primary{ + background-color: lighten($primary-color, 5%); + } + + .close{ + color: $white-color; + opacity: .9; + text-shadow: none; + line-height: 0; + outline: 0; + + i.fa, + i.nc-icon{ + font-size: 14px !important; + } + + &:hover, + &:focus { + opacity: 1; + } + } + + span[data-notify="icon"]{ + font-size: 27px; + display: block; + left: 19px; + position: absolute; + top: 50%; + margin-top: -11px; + } + + button.close{ + position: absolute; + right: 10px; + top: 50%; + margin-top: -13px; + width: 25px; + height: 25px; + padding: 3px; + } + + .close ~ span{ + display: block; + max-width: 89%; + } + + &.alert-with-icon{ + padding-left: 65px; + } +} diff --git a/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_animated-buttons.scss b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_animated-buttons.scss new file mode 100644 index 00000000000..a06602f3fa0 --- /dev/null +++ b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_animated-buttons.scss @@ -0,0 +1,71 @@ +//animations + +.icon-property{ + @include transition($slow-transition-time, $transition-bezier); + position: relative; + display: inline-block; +} + +#animated-buttons{ + .btn{ + i{ + position: relative; + top: 3px; + margin-top: -3px; + } + } +} + +.btn-rotate{ + i{ + @extend .icon-property; + } + + &:hover, + &:focus{ + i{ + @include rotate-53(); + } + } +} + +.btn-magnify{ + i{ + @extend .icon-property; + } + + &:hover, + &:focus{ + i{ + @include transform-scale(1.22); + } + } +} + +.btn-move-left{ + i{ + @extend .icon-property; + margin-right: 0; + } + + &:hover, + &:focus{ + i{ + @include transform-translate-x(-5px); + } + } +} + +.btn-move-right{ + i{ + @extend .icon-property; + margin-right: 0; + } + + &:hover, + &:focus{ + i{ + @include transform-translate-x(5px); + } + } +} diff --git a/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_buttons.scss b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_buttons.scss new file mode 100644 index 00000000000..59dd1506612 --- /dev/null +++ b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_buttons.scss @@ -0,0 +1,234 @@ +.btn, +.navbar .navbar-nav > a.btn{ + border-width: $border-thick; + font-weight: $font-weight-semi; + font-size: $font-size-small; + line-height: $line-height; + text-transform: uppercase; + border: none; + margin: 10px 1px; + border-radius: $border-radius-small; + padding: $padding-btn-vertical $padding-btn-horizontal; + cursor: pointer; + + @include btn-styles($default-color, $default-states-color); + @include transition($fast-transition-time, linear); + + &:hover, + &:focus{ + @include opacity(1); + outline: 0 !important; + } + &:active, + &.active, + .open > &.dropdown-toggle { + @include box-shadow(none); + outline: 0 !important; + } + + .badge{ + margin: 0; + } + + &.btn-icon { + // see above for color variations + height: $btn-icon-size-regular; + min-width: $btn-icon-size-regular; + width: $btn-icon-size-regular; + padding: 0; + font-size: $btn-icon-font-size-regular; + overflow: hidden; + position: relative; + line-height: normal; + + &.btn-simple{ + padding: 0; + } + + &.btn-sm{ + height: $btn-icon-size-small; + min-width: $btn-icon-size-small; + width: $btn-icon-size-small; + + .fa, + .far, + .fas, + .nc-icon{ + font-size: $btn-icon-font-size-small; + } + } + + &.btn-lg{ + height: $btn-icon-size-lg; + min-width: $btn-icon-size-lg; + width: $btn-icon-size-lg; + + .fa, + .far, + .fas, + .nc-icon{ + font-size: $btn-icon-font-size-lg; + } + } + + &:not(.btn-footer) .nc-icon, + &:not(.btn-footer) .fa, + &:not(.btn-footer) .far, + &:not(.btn-footer) .fas{ + position: absolute; + top: 50%; + left: 50%; + transform: translate(-12px, -12px); + line-height: 1.5626rem; + width: 24px; + } + + &.btn-neutral { + font-size: 20px; + } + } + + &:not(.btn-icon) .nc-icon{ + position: relative; + top: 1px; + } +} + +// Apply the mixin to the buttons +// .btn-default { @include btn-styles($default-color, $default-states-color); } +.btn-primary { @include btn-styles($primary-color, $primary-states-color); } +.btn-success { @include btn-styles($success-color, $success-states-color); } +.btn-info { @include btn-styles($info-color, $info-states-color); } +.btn-warning { @include btn-styles($warning-color, $warning-states-color); } +.btn-danger { @include btn-styles($danger-color, $danger-states-color); } +// .btn-neutral { @include btn-styles($white-color, $white-color); } + +.btn-outline-default { @include btn-outline-styles($default-color, $default-states-color); } +.btn-outline-primary { @include btn-outline-styles($primary-color, $primary-states-color); } +.btn-outline-success { @include btn-outline-styles($success-color, $success-states-color); } +.btn-outline-info { @include btn-outline-styles($info-color, $info-states-color); } +.btn-outline-warning { @include btn-outline-styles($warning-color, $warning-states-color); } +.btn-outline-danger { @include btn-outline-styles($danger-color, $danger-states-color); } +.btn-outline-neutral { @include btn-outline-styles($white-color, $default-states-color); + &:hover, + &:focus{ + color: $default-states-color; + background-color: $white-color; + } +} +.btn-neutral { + @include btn-styles($white-color, $white-color); + color: $default-color; + &:hover, + &:focus{ + color: $default-states-color; + } + + &.btn-border{ + &:hover, + &:focus{ + color: $default-color; + } + + &:active, + &.active, + .open > &.dropdown-toggle{ + background-color: $white-color; + color: $default-color; + } + } + + &.btn-link:active, + &.btn-link.active{ + background-color: transparent; + } +} + +.btn{ + &:disabled, + &[disabled], + &.disabled{ + @include opacity(.5); + pointer-events: none; + } +} +.btn-simple{ + border: $border; + border-color: $default-color; + padding: $padding-btn-vertical - 1 $padding-round-horizontal - 1; + background-color: $transparent-bg; +} + +.btn-simple, +.btn-link{ + &.disabled, + &:disabled, + &[disabled], + fieldset[disabled] & { + &, + &:hover, + &:focus, + &.focus, + &:active, + &.active { + background-color: $transparent-bg; + } + } +} + +.btn-link{ + border: $none; + padding: $padding-base-vertical $padding-base-horizontal; + background-color: $transparent-bg; +} + +.btn-lg{ + @include btn-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $border-radius-large); +} +.btn-sm{ + @include btn-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $border-radius-small); +} + +.btn-wd { + min-width: 140px; +} +.btn-group.select{ + width: 100%; +} +.btn-group.select .btn{ + text-align: left; +} +.btn-group.select .caret{ + position: absolute; + top: 50%; + margin-top: -1px; + right: 8px; +} +.btn-group { + .btn + .btn { + margin-left: -3px; + } + .btn { + &:focus { + background-color: $info-color !important; + } + } +} + + +.btn-round{ + border-width: $border-thin; + border-radius: $btn-round-radius; + padding-right: $padding-round-horizontal; + padding-left: $padding-round-horizontal; + + &.btn-simple{ + padding: $padding-btn-vertical - 1 $padding-round-horizontal - 1; + } +} + +.no-caret { + &.dropdown-toggle::after { + display: none; + } +} diff --git a/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_cards.scss b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_cards.scss new file mode 100644 index 00000000000..36a8b54dd69 --- /dev/null +++ b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_cards.scss @@ -0,0 +1,140 @@ +.card{ + border-radius: $border-radius-extreme; + box-shadow: 0 6px 10px -4px rgba(0, 0, 0, 0.15); + background-color: #FFFFFF; + color: $card-black-color; + margin-bottom: 20px; + position: relative; + border: 0 none; + + -webkit-transition: transform 300ms cubic-bezier(0.34, 2, 0.6, 1), box-shadow 200ms ease; + -moz-transition: transform 300ms cubic-bezier(0.34, 2, 0.6, 1), box-shadow 200ms ease; + -o-transition: transform 300ms cubic-bezier(0.34, 2, 0.6, 1), box-shadow 200ms ease; + -ms-transition: transform 300ms cubic-bezier(0.34, 2, 0.6, 1), box-shadow 200ms ease; + transition: transform 300ms cubic-bezier(0.34, 2, 0.6, 1), box-shadow 200ms ease; + + .card-body{ + padding: 15px 15px 10px 15px; + + &.table-full-width{ + padding-left: 0; + padding-right: 0; + } + } + + .card-header{ + &:not([data-background-color]){ + background-color: transparent; + } + padding: 15px 15px 0; + border: 0; + + .card-title{ + margin-top: 10px; + } + } + + .map{ + border-radius: $border-radius-small; + + &.map-big{ + height: 400px; + } + } + + &[data-background-color="orange"]{ + background-color: $primary-color; + + .card-header{ + background-color: $primary-color; + } + + .card-footer{ + .stats{ + color: $white-color; + } + } + } + + &[data-background-color="red"]{ + background-color: $danger-color; + } + + &[data-background-color="yellow"]{ + background-color: $warning-color; + } + + &[data-background-color="blue"]{ + background-color: $info-color; + } + + &[data-background-color="green"]{ + background-color: $success-color; + } + + .image{ + overflow: hidden; + height: 200px; + position: relative; + } + + .avatar{ + width: 30px; + height: 30px; + overflow: hidden; + border-radius: 50%; + margin-bottom: 15px; + } + + .numbers { + font-size: 2em; + } + + .big-title { + font-size: 12px; + text-align: center; + font-weight: 500; + padding-bottom: 15px; + } + + label{ + font-size: $font-size-small; + margin-bottom: 5px; + color: $dark-gray; + } + + .card-footer{ + background-color: transparent; + border: 0; + + + .stats{ + i{ + margin-right: 5px; + position: relative; + top: 0px; + color: $default-color; + } + } + + .btn{ + margin: 0; + } + } + + &.card-plain{ + background-color: transparent; + box-shadow: none; + border-radius: 0; + + + .card-body{ + padding-left: 5px; + padding-right: 5px; + } + + img{ + border-radius: $border-radius-extreme; + } + } +} diff --git a/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_checkboxes-radio.scss b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_checkboxes-radio.scss new file mode 100644 index 00000000000..a731ab033ef --- /dev/null +++ b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_checkboxes-radio.scss @@ -0,0 +1,142 @@ +.from-check, +.form-check-radio { + margin-bottom: 12px; + position: relative; +} + +.form-check { + padding-left: 0; + margin-bottom: .5rem; + + .form-check-label{ + display: inline-block; + position: relative; + cursor: pointer; + padding-left: 35px; + line-height: 26px; + margin-bottom: 0; + } + + .form-check-sign::before, + .form-check-sign::after { + content: " "; + display: inline-block; + position: absolute; + width: 24px; + height: 24px; + left: 0; + cursor: pointer; + border-radius: 6px; + top: 0; + background-color: #AAA7A4; + -webkit-transition: opacity 0.3s linear; + -moz-transition: opacity 0.3s linear; + -o-transition: opacity 0.3s linear; + -ms-transition: opacity 0.3s linear; + transition: opacity 0.3s linear; + } + .form-check-sign::after { + font-family: 'FontAwesome'; + content: "\f00c"; + top: -1px; + text-align: center; + font-size: 15px; + opacity: 0; + color: #FFF; + border: 0; + background-color: inherit; + } + &.disabled{ + .form-check-label{ + color: $dark-gray; + opacity: .5; + cursor: not-allowed; + } + } + +} + +.form-check.disabled .form-check-label, +.form-check.disabled .form-check-label { + +} + +.form-check input[type="checkbox"], +.form-check-radio input[type="radio"]{ + opacity: 0; + position: absolute; + visibility: hidden; +} +.form-check input[type="checkbox"]:checked + .form-check-sign::after{ + opacity: 1; +} + +.form-control input[type="checkbox"]:disabled + .form-check-sign::before, +.checkbox input[type="checkbox"]:disabled + .form-check-sign::after{ + cursor: not-allowed; +} + +.form-check .form-check-label input[type="checkbox"]:disabled + .form-check-sign, +.form-check-radio input[type="radio"]:disabled + .form-check-sign{ + pointer-events: none !important; +} + +.form-check-radio{ + margin-left: -3px; + + .form-check-label{ + padding-left: 2rem; + } + &.disabled{ + .form-check-label{ + color: $dark-gray; + opacity: .5; + cursor: not-allowed; + } + } +} + +.form-check-radio .form-check-sign::before{ + font-family: 'FontAwesome'; + content: "\f10c"; + font-size: 22px; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + display: inline-block; + position: absolute; + opacity: .50; + left: 5px; + top: -5px; +} + +.form-check-label input[type="checkbox"]:checked + .form-check-sign:before{ + background-color: #66615B; +} + +.form-check-radio input[type="radio"] + .form-check-sign:after, +.form-check-radio input[type="radio"] { + opacity: 0; + @include transition-opacity(0.3s, linear); + content:" "; + display: block; +} + +.form-check-radio input[type="radio"]:checked + .form-check-sign::after { + font-family: 'FontAwesome'; + content: "\f192"; + top: -5px; + position: absolute; + left: 5px; + opacity: 1; + font-size: 22px; +} + +.form-check-radio input[type="radio"]:checked + .form-check-sign::after{ + opacity: 1; +} + + +.form-check-radio input[type="radio"]:disabled + .form-check-sign::before, +.form-check-radio input[type="radio"]:disabled + .form-check-sign::after { + color: $dark-gray; +} diff --git a/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_dropdown.scss b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_dropdown.scss new file mode 100644 index 00000000000..a3edc925d46 --- /dev/null +++ b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_dropdown.scss @@ -0,0 +1,480 @@ +.dropdown, +.dropup, +.bootstrap-select{ + .dropdown-menu{ + display: block; + @include opacity(0); + @include box-shadow($dropdown-shadow); + visibility: hidden; + position: absolute; + transition: all 0.3s cubic-bezier(0.215, 0.61, 0.355, 1) 0s, opacity 0.3s ease 0s, height 0s linear 0.35s; + + &[x-placement="top-start"]{ + @include transform-translate-y-dropdown(0px); + + } + &[x-placement="bottom-start"]{ + @include transform-translate-y-dropdown(0px); + } + } + + &.show .dropdown-menu{ + @include opacity(1); + visibility: visible; + + &[x-placement="top-start"]{ + @include transform-translate-y-dropdown(-50px); + top: auto !important; + bottom: 0 !important; + + } + &[x-placement="bottom-start"]{ + @include transform-translate-y-dropdown(50px); + bottom: auto !important; + top: 0 !important; + } + } + +} + +.dropup .dropdown-menu, +.dropdown-btn .dropdown-menu{ + @include transform-translate-y-dropdown(0px); + top: auto !important; + bottom: 0 !important; + +} + +.dropup.show .dropdown-menu, +.dropdown-btn.show .dropdown-menu{ + opacity: 1; + visibility: visible; + + .dropdown-menu.inner{ + @include transform-translate-y(0px); + } +} + +.bootstrap-select.show{ + .dropdown-menu.show{ + &[x-placement="top-start"]{ + @include transform-translate-y-dropdown(-60px); + top: auto !important; + bottom: 0 !important; + } + + li:last-child { + a:hover{ + border-radius: 0 0 12px 12px; + } + } + } +} + +.bootstrap-select.dropup.show{ + &:before { + top: -1px !important; + } + + &:after { + top: -2px !important; + } +} +.dropdown-menu{ + background-color: $white-color; + border: 0 none; + border-radius: $border-radius-extreme; + margin-top: 10px; + padding: 0px; + + .divider{ + background-color: $medium-pale-bg; + margin: 0px; + } + + .dropdown-header{ + color: $dark-gray; + font-size: $font-size-small; + padding: $padding-dropdown-vertical $padding-dropdown-horizontal; + } + + .no-notification{ + color: #9A9A9A; + font-size: 1.2em; + padding: 30px 30px; + text-align: center; + } + + .dropdown-item{ + color: $font-color; + font-size: $font-size-base; + padding: 10px 45px 10px 15px; + clear: both; + white-space: nowrap; + width: 100%; + display: block; + + img{ + margin-top: -3px; + } + + } + .dropdown-item:focus{ + outline: 0 !important; + } + + .btn-group.select &{ + min-width: 100%; + } + + .dropdown-item:first-child{ + border-top-left-radius: $border-radius-extreme; + border-top-right-radius: $border-radius-extreme; + } + + .dropdown-item:last-child{ + border-bottom-left-radius: $border-radius-extreme; + border-bottom-right-radius: $border-radius-extreme; + } + + .select & .dropdown-item:first-child{ + border-radius: 0; + border-bottom: 0 none; + } + + .dropdown-item:hover, + .dropdown-item:focus{ + color: $white-color !important; + opacity: 1; + text-decoration: none; + + } + .dropdown-item:hover, + .dropdown-item:focus{ + background-color: $default-color; + } + + &.dropdown-primary .dropdown-item:hover, + &.dropdown-primary .dropdown-item:focus{ + background-color: $bg-primary; + } + &.dropdown-info .dropdown-item:hover, + &.dropdown-info .dropdown-item:focus{ + background-color: $bg-info; + } + &.dropdown-success .dropdown-item:hover, + &.dropdown-success .dropdown-item:focus{ + background-color: $bg-success; + } + &.dropdown-warning .dropdown-item:hover, + &.dropdown-warning .dropdown-item:focus{ + background-color: $bg-warning; + } + &.dropdown-danger .dropdown-item:hover, + &.dropdown-danger .dropdown-item:focus{ + background-color: $bg-danger; + } + +} +.dropdown-divider{ + margin: 0 !important; +} + +//fix bug for the select items in btn-group +.btn-group.select{ + // overflow: hidden; +} +.btn-group.select.open{ + overflow: visible; +} +.dropdown-menu-right{ + right: -2px; + left: auto; +} + +.navbar-nav .dropdown-menu:before, +.dropdown .dropdown-menu[x-placement="bottom-start"]:before, +.dropdown .dropdown-menu[x-placement="bottom-end"]:before, +.card.card-just-text .dropdown .dropdown-menu:before, +.card-just-text .dropdown .dropdown-menu:before, +.dropdown-btn .dropdown-menu:before{ + border-bottom: 11px solid $medium-pale-bg; + border-left: 11px solid rgba(0, 0, 0, 0); + border-right: 11px solid rgba(0, 0, 0, 0); + content: ""; + display: inline-block; + position: absolute; + right: 12px; + top: -12px; +} + +.navbar-nav .dropdown-menu:after, +.dropdown .dropdown-menu[x-placement="bottom-start"]:after, +.dropdown .dropdown-menu[x-placement="bottom-end"]:after, +.card.card-just-text .dropdown .dropdown-menu:after, +.card-just-text .dropdown .dropdown-menu:after, +.dropdown-btn .dropdown-menu:after{ + border-bottom: 11px solid $white-color; + border-left: 11px solid rgba(0, 0, 0, 0); + border-right: 11px solid rgba(0, 0, 0, 0); + content: ""; + display: inline-block; + position: absolute; + right: 12px; + top: -11px; +} + +.dropdown .dropdown-menu.dropdown-notification[x-placement="top-start"]:before, +.dropdown .dropdown-menu.dropdown-notification[x-placement="bottom-start"]:before{ + left: 30px !important; + right: auto; +} +.dropdown .dropdown-menu.dropdown-notification[x-placement="top-start"]:after, +.dropdown .dropdown-menu.dropdown-notification[x-placement="bottom-start"]:after{ + left: 30px !important; + right: auto; +} +// the style for opening dropdowns on mobile devices; for the desktop version check the _responsive.scss file +// code from _responsive.scss + +@media screen and (min-width: 768px){ + .navbar-form { + margin-top: 21px; + margin-bottom: 21px; + padding-left: 5px; + padding-right: 5px; + } + .navbar-search-form{ + display: none; + } + .navbar-nav .dropdown-item .dropdown-menu, + .dropdown .dropdown-menu, + .dropdown-btn .dropdown-menu{ + transform: translate3d(0px, -40px, 0px); + transition: all 0.3s cubic-bezier(0.215, 0.61, 0.355, 1) 0s, opacity 0.3s ease 0s, height 0s linear 0.35s; + } + .navbar-nav .dropdown-item.show .dropdown-menu, + .dropdown.show .dropdown-menu, + .dropdown-btn.show .dropdown-menu{ + transform: translate3d(0px, 0px, 0px); + visibility: visible !important; + } + .bootstrap-select .dropdown-menu{ + -webkit-transition: all 150ms linear; + -moz-transition: all 150ms linear; + -o-transition: all 150ms linear; + -ms-transition: all 150ms linear; + transition: all 150ms linear; + } + .bootstrap-datetimepicker-widget{ + visibility: visible !important; + } + + .bootstrap-select .show .dropdown-menu{ + transition: all 0.3s cubic-bezier(0.215, 0.61, 0.355, 1) 0s, opacity 0.3s ease 0s, height 0s linear 0.35s; + transform: translate3d(0px, 0px, 0px); + } + + .navbar-nav.navbar-right li .dropdown-menu:before, + .navbar-nav.navbar-right li .dropdown-menu:after{ + left: auto; + right: 12px; + } + + + .footer:not(.footer-big){ + nav ul{ + li:first-child{ + margin-left: 0; + } + } + } + +// no dragging the others navs in page + body > .navbar-collapse.collapse{ + display: none !important; + } +} + +.dropdown-sharing{ + .dropup-item{ + color: $font-color; + font-size: $font-size-base; + + .social-line{ + line-height: 28px; + padding: 10px 20px 5px 20px !important; + + [class*="icon-"]{ + font-size: 20px; + } + } + &:last-child{ + margin: 0 13px; + display: block; + } + .btn{ + margin: 10px; + } + } + + .dropup-item:hover, + .dropup-item:focus{ + .social-line, + .action-line{ + background-color: $white-color; + color: $font-color; + opacity: 1; + text-decoration: none; + } + } +} +.show .dropdown-sharing, +.show .dropdown-actions{ + margin-bottom: 1px; +} + +.dropdown-actions{ + .dropdown-item{ + margin: -15px 35px; + .action-line{ + padding: 5px 10px; + line-height: 24px; + font-weight: bold; + [class*="icon-"]{ + font-size: 24px; + } + .col-sm-9{ + line-height: 34px; + } + } + .link-danger{ + color: $danger-color; + &:hover, &:active, &:focus{ + color: $danger-color; + } + } + } + li:hover, + li:focus{ + a{ + color: $font-color; + opacity: 1; + text-decoration: none; + } + } + .action-line{ + .icon-simple{ + margin-left: -15px; + } + } +} +.dropdown .dropdown-menu[x-placement="top-start"]:before, +.dropdown .dropdown-menu[x-placement="top-end"]:before, +.dropup .dropdown-menu:before{ + border-top: 11px solid #DCD9D1; + border-left: 11px solid transparent; + border-right: 11px solid transparent; + content: ""; + display: inline-block; + position: absolute; + right: 12px; + bottom: -12px; +} + +.dropdown .dropdown-menu[x-placement="top-start"]:after, +.dropdown .dropdown-menu[x-placement="top-end"]:after, +.dropup .dropdown-menu:after{ + border-top: 11px solid #FFF; + border-left: 11px solid transparent; + border-right: 11px solid transparent; + content: ""; + display: inline-block; + position: absolute; + right: 12px; + bottom: -11px; +} + +.dropup, +.dropdown{ + .dropdown-toggle:after{ + margin-left: 0; + } +} + +.dropdown-notification{ + .dropdown-notification-list{ + .notification-item{ + border-bottom: 1px solid #F1EAE0; + font-size: 16px; + color: #66615b; + + .notification-text{ + padding-left: 40px; + position: relative; + min-width: 330px; + min-height: 70px; + white-space: normal; + + + .label{ + display: block; + position: absolute; + top: 50%; + margin-top: -12px; + left: 7px; + } + .message{ + font-size: 0.9em; + line-height: 0.7; + margin-left: 10px; + } + .time{ + color: #9A9A9A; + font-size: 0.7em; + margin-left: 10px; + } + } + .read-notification{ + font-size: 12px; + opacity: 0; + position: absolute; + right: 5px; + top: 50%; + margin-top: -12px; + } + &:hover{ + text-decoration: none; + + .notification-text{ + color: #66615b; + background-color: #F0EFEB !important; + } + .read-notification{ + opacity: 1 !important; + } + } + } + + } + .dropdown-footer{ + background-color: #E8E7E3; + border-radius: 0 0 8px 8px; + + .dropdown-footer-menu{ + list-style: outside none none; + padding: 0px 5px; + li{ + display: inline-block; + text-align: left; + padding: 0 10px; + + a{ + color: #9C9B99; + font-size: 0.9em; + line-height: 35px; + } + } + } + } +} diff --git a/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_fixed-plugin.scss b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_fixed-plugin.scss new file mode 100644 index 00000000000..e6b159a1bf9 --- /dev/null +++ b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_fixed-plugin.scss @@ -0,0 +1,342 @@ +.fixed-plugin{ + position: fixed; + right: 0; + width: 64px; + background: rgba(0,0,0,.3); + z-index: 1031; + border-radius: 8px 0 0 8px; + text-align: center; + top: 120px; + + li > a, + .badge{ + transition: all .34s; + -webkit-transition: all .34s; + -moz-transition: all .34s; + } + + .fa-cog{ + color: #FFFFFF; + padding: 10px; + border-radius: 0 0 6px 6px; + width: auto; + } + + .dropdown-menu{ + right: 80px; + left: auto !important; + top: -52px !important; + width: 290px; + border-radius: 10px; + padding: 0 10px; + } + + .dropdown .dropdown-menu .nc-icon{ + top: 2px; + right: 10px; + font-size: 14px; + } + + .dropdown-menu:after, + .dropdown-menu:before{ + right: 10px; + margin-left: auto; + left: auto; + } + + .fa-circle-thin{ + color: #FFFFFF; + } + + .active .fa-circle-thin{ + color: #00bbff; + } + + .dropdown-menu > .active > a, + .dropdown-menu > .active > a:hover, + .dropdown-menu > .active > a:focus{ + color: #777777; + text-align: center; + } + + img{ + border-radius: 0; + width: 100%; + height: 100px; + margin: 0 auto; + } + + .dropdown-menu li > a:hover, + .dropdown-menu li > a:focus{ + box-shadow: none; + } + + .badge{ + border: 3px solid #FFFFFF; + border-radius: 50%; + cursor: pointer; + display: inline-block; + height: 23px; + margin-right: 5px; + position: relative; + width: 23px; + + &.badge-light { + border: 1px solid $light-gray; + + &.active, + &:hover { + border: 3px solid #0bf; + } + } + } + + .badge.active, + .badge:hover{ + border-color: #00bbff; + } + + .badge-blue{ + background-color: $brand-info; + } + .badge-green{ + background-color: $brand-success; + } + .badge-orange{ + background-color: $brand-primary; + } + .badge-yellow{ + background-color: $brand-warning; + } + .badge-red{ + background-color: $brand-danger; + } + + h5{ + font-size: 14px; + margin: 10px; + } + + .dropdown-menu li{ + display: block; + padding: 15px 2px; + width: 25%; + float: left; + } + + li.adjustments-line, + li.header-title, + li.button-container{ + width: 100%; + height: 35px; + min-height: inherit; + } + + li.button-container{ + height: auto; + + div{ + margin-bottom: 5px; + } + } + + #sharrreTitle{ + text-align: center; + padding: 10px 0; + height: 50px; + } + + li.header-title{ + height: 30px; + line-height: 25px; + font-size: 12px; + font-weight: 600; + text-align: center; + text-transform: uppercase; + } + + .adjustments-line{ + p{ + float: left; + display: inline-block; + margin-bottom: 0; + font-size: 1em; + color: #3C4858; + } + + a{ + color: transparent; + + .badge-colors{ + position: relative; + top: -2px; + } + + a:hover, + a:focus{ + color: transparent; + } + } + + .togglebutton{ + text-align: center; + + .label-switch{ + position: relative; + left: -10px; + font-size: $font-size-mini; + color: $default-color; + + &.label-right{ + left: 10px; + } + } + + .toggle{ + margin-right: 0; + } + } + + .dropdown-menu > li.adjustments-line > a{ + padding-right: 0; + padding-left: 0; + border-bottom: 1px solid #ddd; + border-radius: 0; + margin: 0; + } + } + + + + .dropdown-menu{ + > li{ + & > a.img-holder{ + font-size: 16px; + text-align: center; + border-radius: 10px; + background-color: #FFF; + border: 3px solid #FFF; + padding-left: 0; + padding-right: 0; + opacity: 1; + cursor: pointer; + display: block; + max-height: 100px; + overflow: hidden; + padding: 0; + + img{ + margin-top: auto; + } + } + + a.switch-trigger:hover, + & > a.switch-trigger:focus{ + background-color: transparent; + } + + &:hover, + &:focus{ + > a.img-holder{ + border-color: rgba(0, 187, 255, 0.53);; + } + } + } + + > .active > a.img-holder, + > .active > a.img-holder{ + border-color: #00bbff; + background-color: #FFFFFF; + } + + } + + .btn-social{ + width: 50%; + display: block; + width: 48%; + float: left; + font-weight: 600; + } + + .btn-social{ + i{ + margin-right: 5px; + } + + &:first-child{ + margin-right: 2%; + } + } + + .dropdown{ + .dropdown-menu{ + transform-origin: 0 0; + + &:before{ + border-bottom: 16px solid rgba(0, 0, 0, 0); + border-left: 16px solid rgba(0,0,0,0.2); + border-top: 16px solid rgba(0,0,0,0); + right: -27px; + bottom: 425px; + } + + &:after{ + border-bottom: 16px solid rgba(0, 0, 0, 0); + border-left: 16px solid #FFFFFF; + border-top: 16px solid rgba(0,0,0,0); + right: -26px; + bottom: 425px; + } + + &:before, + &:after{ + content: ""; + display: inline-block; + position: absolute; + width: 16px; + transform: translateY(-50px); + -webkit-transform: translateY(-50px); + -moz-transform: translateY(-50px); + } + } + + &.show-dropdown .show{ + .dropdown-menu .show{ + transform: translate3d(0, -60px, 0)!important; + bottom: auto!important; + top: 0!important; + } + } + } + + .bootstrap-switch{ + margin:0; + } +} + +.fixed-plugin { + .show-dropdown { + .dropdown-menu[x-placement=bottom-start] { + @include transform-translate-y-fixed-plugin (-100px); + + &:before, + &:after { + top: 100px; + } + } + .dropdown-menu[x-placement=top-start] { + @include transform-translate-y-fixed-plugin (100px); + } + + &.show { + .dropdown-menu.show[x-placement=bottom-start] { + @include transform-translate-y-fixed-plugin (-60px); + } + + .dropdown-menu.show[x-placement=top-start] { + @include transform-translate-y-fixed-plugin (470px); + } + } + } +} diff --git a/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_footers.scss b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_footers.scss new file mode 100644 index 00000000000..59bd0355776 --- /dev/null +++ b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_footers.scss @@ -0,0 +1,46 @@ +.footer{ + padding: 24px 0; + + &.footer-default{ + background-color: #f2f2f2; + } + + nav{ + display: inline-block; + float: left; + padding-left: 0; + } + + ul{ + margin-bottom: 0; + padding: 0; + list-style: none; + + li{ + display: inline-block; + + a{ + color: inherit; + padding: $padding-base-vertical; + font-size: $font-size-small; + text-transform: uppercase; + text-decoration: none; + + &:hover{ + text-decoration: none; + } + } + } + } + + .copyright{ + font-size: $font-size-small; + line-height: 1.8; + } + + &:after{ + display: table; + clear: both; + content: " "; + } +} diff --git a/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_images.scss b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_images.scss new file mode 100644 index 00000000000..a689aa97ad8 --- /dev/null +++ b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_images.scss @@ -0,0 +1,7 @@ +img{ + max-width: 100%; + border-radius: $border-radius-small; +} +.img-raised{ + box-shadow: $box-shadow-raised; +} diff --git a/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_inputs.scss b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_inputs.scss new file mode 100644 index 00000000000..71a220a7af2 --- /dev/null +++ b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_inputs.scss @@ -0,0 +1,403 @@ +@include placeholder() { + color: $dark-gray; +}; + + +.form-control { + background-color: $white-color; + border: 1px solid $medium-gray; + border-radius: $border-radius-base; + color: $font-color; + line-height: normal; + font-size: $font-size-base; + @include transition-input-focus-color(); + @include box-shadow(none); + + + + &:focus{ + border: 1px solid $dark-gray; + @include box-shadow(none); + outline: 0 !important; + color: $default-color; + + & + .input-group-append .input-group-text, + & ~ .input-group-append .input-group-text, + & + .input-group-prepend .input-group-text, + & ~ .input-group-prepend .input-group-text{ + border: 1px solid #ccc; + border-left: none; + background-color: $transparent-bg; + } + } + + .has-success &, + .has-error &, + .has-success &:focus, + .has-error &:focus{ + @include box-shadow(none); + } + + .has-success &{ + border: 1px solid $table-line-color; + color: $font-color; + + &.form-control-success{ + padding-right: 2.5em !important; + } + } + .has-success &:focus{ + border: 1px solid $success-color; + color: $success-color; + } + .has-danger &{ + background-color: $danger-input-bg; + border: 1px solid $danger-color; + color: $danger-color; + + &.form-control-danger{ + padding-right: 2.5em !important; + } + } + .has-danger &:focus{ + background-color: $white-color; + border: 1px solid $danger-color; + } + + & + .form-control-feedback{ + border-radius: $border-radius-large; + font-size: $font-size-base; + margin-top: -7px; + position: absolute; + right: 10px; + top: 50%; + vertical-align: middle; + } + + .open &{ + border-radius: $border-radius-large $border-radius-large 0 0; + border-bottom-color: transparent; + } + + & + .input-group-append .input-group-text, + & + .input-group-prepend .input-group-text{ + background-color: $white-bg; + } +} + + +@include form-control-lg-padding($padding-large-vertical, $padding-input-horizontal); +@include input-base-padding($padding-input-vertical, $padding-input-horizontal); + +.input-group { + &.has-success { + .input-group-prepend, + .input-group-append { + .input-group-text { + border: 1px solid $table-line-color; + color: $font-color; + background-color: $white-color; + border-right: none; + } + } + } +} + +.form-group.no-border, +.input-group.no-border{ + .form-control, + .form-control + .input-group-prepend .input-group-text, + .form-control + .input-group-append .input-group-text{ + background-color: $opacity-gray-3; + border: medium none; + &:focus, + &:active, + &:active{ + border: medium none; + background-color: $opacity-gray-5; + } + } + + .form-control{ + &:focus{ + & + .input-group-prepend .input-group-text, + & + .input-group-append .input-group-text{ + background-color: $opacity-gray-5; + } + } + } + + .input-group-prepend .input-group-text, + .input-group-append .input-group-text{ + background-color: $opacity-gray-3; + border: none; + } +} + +.has-error{ + .form-control-feedback, .control-label{ + color: $danger-color; + } +} +.has-success{ + .form-control-feedback, .control-label{ + color: $success-color; + } +} + +.input-group.has-danger { + .input-group-prepend { + border-radius: $border-radius-base; + .input-group-text { + border: 1px solid $danger-color; + border-right: none; + } + } + .error { + display: block; + width: 100%; + color: $danger-color; + margin-top: 3px; + } +} + +.input-group.has-success { + .input-group-prepend { + border-radius: $border-radius-base; + .input-group-text { + // border: 1px solid $success-color; + border-right: none; + } + } +} + + +.input-group-focus{ + .input-group-prepend .input-group-text, + .input-group-append .input-group-text{ + background-color: $white-bg; + border-color: $dark-gray; + } + + &.no-border{ + .input-group-prepend .input-group-text, + .input-group-append .input-group-text{ + background-color: $opacity-gray-5; + } + } + + &.has-danger { + .input-group-append, + .input-group-prepend { + .input-group-text { + background-color: $danger-input-bg; + } + } + } + + &.has-success { + .input-group-append, + .input-group-prepend { + .input-group-text { + background-color: $success-input-bg; + border: 1px solid $success-color; + border-right: none; + } + } + } +} + +.input-group-append .input-group-text, +.input-group-prepend .input-group-text { + background-color: transparent; + border: 1px solid $light-gray; + color: $default-color; + border-top-right-radius: $border-radius-base; + border-bottom-right-radius: $border-radius-base; + + & i{ + opacity: .5; + } + + @include transition-input-focus-color(); + + .has-danger &{ + background-color: $danger-input-bg; + } + .has-success &{ + background-color: $success-input-bg; + } + .has-danger.input-group-focus &{ + background-color: $white-color; + color: $danger-color; + } + .has-success.input-group-focus &{ + background-color: $white-color; + color: $success-color; + } + .has-danger .form-control:focus + &{ + color: $danger-color; + } + .has-success .form-control:focus + &{ + color: $success-color; + } + + & + .form-control, + & ~ .form-control{ + @include input-size($padding-base-vertical - 1, $padding-base-horizontal); + padding-left: 18px; + } + + i{ + width: 17px; + } +} + +.input-group-append, +.input-group-prepend{ + margin: 0; +} + + +.input-group-append .input-group-text{ + border-left: none; +} +.input-group-prepend .input-group-text{ + border-right: none; +} + +.input-group, +.form-group{ + margin-bottom: 10px; + position: relative; + + .form-control-static{ + margin-top: 9px; + } + &.has-danger { + .error { + color: $danger-color; + } + } +} +.input-group[disabled]{ + .input-group-prepend .input-group-text, + .input-group-append .input-group-text{ + background-color: $light-gray; + } +} + +.input-group .form-control:not(:first-child):not(:last-child), .input-group-btn:not(:first-child):not(:last-child){ + border-radius: $border-radius-base; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + border-left: 0 none; +} + +.input-group .form-control:first-child, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) { + border-right: 0 none; +} +.input-group .form-control:last-child, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child) { + border-left: 0 none; +} +.form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { + background-color: $light-gray; + color: $default-color; + cursor: not-allowed; +} + +.input-group-btn .btn{ + border-width: $border-thin; + padding: $padding-btn-vertical $padding-base-horizontal; +} +.input-group-btn .btn-default:not(.btn-fill){ + border-color: $medium-gray; +} + +.input-group-btn:last-child > .btn{ + margin-left: 0; +} +textarea.form-control{ + max-width: 100%; + max-height: 80px; + padding: 10px 10px 0 0; + resize: none; + border: none; + border: 1px solid $light-gray; + border-radius: $border-radius-base; + line-height: 2; +} + +.has-success, +.has-danger{ + + &.form-group .form-control, + &.form-group.no-border .form-control{ + padding-right: $padding-input-horizontal + 21; + } +} + +.form.form-newsletter .form-group{ + float: left; + width: 78%; + margin-right: 2%; + margin-top: 9px; +} + +.input-group .input-group-btn{ + padding: 0 12px; +} + +// Input files - hide actual input - requires specific markup in the sample. +.form-group input[type=file] { + opacity: 0; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 100; +} + +.form-text{ + font-size: $font-size-small; +} + +.form-control-lg{ + padding: 0; + font-size: inherit; + line-height: 0; + border-radius: 0; +} + +.form-horizontal{ + .col-form-label, + .label-on-right{ + padding: 10px 5px 0 15px; + text-align: right; + max-width: 180px; + } + + .checkbox-radios{ + margin-bottom: 15px; + + .form-check:first-child{ + margin-top: 8px; + } + } + + .label-on-right{ + text-align: left; + padding: 10px 15px 0 5px; + } + + .form-check-inline{ + margin-top: 6px; + } +} diff --git a/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_misc.scss b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_misc.scss new file mode 100644 index 00000000000..dedfa1ca55e --- /dev/null +++ b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_misc.scss @@ -0,0 +1,150 @@ +body{ + color: $black-color; + font-size: $font-size-base; + font-family: $sans-serif-family; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; +} + +.main{ + position: relative; + background: $white-color; +} +/* Animations */ +.nav-pills .nav-link, +.navbar, +.nav-tabs .nav-link, +.sidebar .nav a, +.sidebar .nav a i, +.animation-transition-general, +.tag, +.tag [data-role="remove"], +.animation-transition-general{ + @include transition($general-transition-time, $transition-ease); +} + +//transition for dropdown caret +.dropdown-toggle:after, +.bootstrap-switch-label:before, +.caret{ + @include transition($fast-transition-time, $transition-ease); +} + +.dropdown-toggle[aria-expanded="true"]:after, +a[data-toggle="collapse"][aria-expanded="true"] .caret, +.card-collapse .card a[data-toggle="collapse"][aria-expanded="true"] i, +.card-collapse .card a[data-toggle="collapse"].expanded i{ + @include rotate-180(); +} + +.button-bar{ + display: block; + position: relative; + width: 22px; + height: 1px; + border-radius: 1px; + background: $white-bg; + + & + .button-bar{ + margin-top: 7px; + } + + &:nth-child(2){ + width: 17px; + } +} + +.caret{ + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-top: 4px solid\9; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} + +.pull-left{ + float: left; +} +.pull-right{ + float: right; +} + + +.offline-doc { + .navbar.navbar-transparent{ + padding-top: 25px; + border-bottom: none; + + .navbar-minimize { + display: none; + } + .navbar-brand, + .collapse .navbar-nav .nav-link { + color: $white-color !important; + } + } + .footer { + z-index: 3 !important; + } + .page-header{ + .container { + z-index: 3; + } + &:after { + background-color: rgba(0, 0, 0, 0.5); + content: ""; + display: block; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; + z-index: 2; + } + } +} + +.fixed-plugin { + .dropdown-menu li { + padding: 2px !important; + } +} + +// badge color + +.badge{ + &.badge-default{ + @include badge-color($default-color); + } + &.badge-primary{ + @include badge-color($primary-color); + } + &.badge-info{ + @include badge-color($info-color); + } + &.badge-success{ + @include badge-color($success-color); + } + &.badge-warning{ + @include badge-color($warning-color); + } + &.badge-danger{ + @include badge-color($danger-color); + } + &.badge-neutral{ + @include badge-color($white-color); + color: inherit; + } +} + +.card-user { + form { + .form-group { + margin-bottom: 20px; + } + } +} diff --git a/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_mixins.scss b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_mixins.scss new file mode 100644 index 00000000000..12f55c95b16 --- /dev/null +++ b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_mixins.scss @@ -0,0 +1,8 @@ +//Components +@import "mixins/buttons"; +@import "mixins/vendor-prefixes"; +@import "mixins/inputs"; +@import "mixins/page-header"; +@import "mixins/dropdown"; +@import "mixins/cards"; +@import "mixins/transparency"; diff --git a/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_navbar.scss b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_navbar.scss new file mode 100644 index 00000000000..f094e6fcc9f --- /dev/null +++ b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_navbar.scss @@ -0,0 +1,310 @@ +.navbar{ + padding-top: $navbar-padding-base; + padding-bottom: $navbar-padding-base; + min-height: 53px; + margin-bottom: 20px; + + a{ + vertical-align: middle; + + &:not(.btn):not(.dropdown-item){ + color: $white-color; + } + + &.dropdown-item{ + color: $default-color; + } + } + + + + &.bg-white{ + .input-group .form-control, + .input-group.no-border .form-control{ + color: $default-color; + + @include placeholder(){ + color: $default-color; + }; + } + .input-group-prepend .input-group-text i, + .input-group-append .input-group-text i{ + color: $default-color; + opacity: .5; + } + } + + .form-group, + .input-group{ + margin: 0; + margin-left: -3px; + margin-right: 5px; + + .form-group-addon, + .input-group-prepend .input-group-text, + .input-group-append .input-group-text{ + color: $default-color; + + i { + opacity: 1; + } + } + + &.no-border{ + .form-control{ + color: $default-color; + + @include placeholder(){ + color: $default-color; + }; + } + } + } + + p{ + display: inline-block; + margin: 0; + line-height: 1.8em; + font-size: 1em; + font-weight: 400; + } + + &.navbar-absolute{ + position: absolute; + width: 100%; + padding-top: 10px; + z-index: 1029; + } + + .documentation &{ + &.fixed-top{ + left: 0; + width: initial; + } + } + + .navbar-wrapper{ + display: inline-flex; + align-items: center; + + .navbar-minimize{ + padding-right: 10px; + + .btn{ + margin: 0; + } + } + + .navbar-toggle{ + .navbar-toggler{ + padding-left: 0; + } + + &:hover{ + & .navbar-toggler-bar.bar2{ + width: 22px; + } + } + } + } + + + + .navbar-nav{ + &.navbar-logo{ + position: absolute; + left: 0; + right: 0; + margin: 0 auto; + width: 49px; + top: -4px; + } + + .nav-link.btn{ + padding: $padding-btn-vertical $padding-btn-horizontal; + &.btn-lg{ + padding: $padding-large-vertical $padding-large-horizontal; + } + &.btn-sm{ + padding: $padding-small-vertical $padding-small-horizontal; + } + } + + .nav-link{ + text-transform: uppercase; + font-size: $font-size-mini; + padding: $padding-base-vertical $padding-base-horizontal; + line-height: $line-height-nav-link; + margin-right: 3px; + + i.fa + p, + i.nc-icon + p{ + margin-left: 3px; + } + + i.fa, + i.nc-icon{ + font-size: 18px; + position: relative; + top: 3px; + text-align: center; + width: 21px; + } + + i.nc-icon{ + top: 4px; + font-size: 16px; + } + + &.profile-photo{ + .profile-photo-small{ + width: 27px; + height: 27px; + } + } + + &.disabled{ + opacity: .5; + color: $white-color; + } + } + + .nav-item.active .nav-link:not(.btn), + .nav-item .nav-link:not(.btn):focus, + .nav-item .nav-link:not(.btn):hover, + .nav-item .nav-link:not(.btn):active{ + border-radius: $border-radius-small; + color: $default-color; + } + } + + .logo-container{ + width: 27px; + height: 27px; + overflow: hidden; + margin: 0 auto; + border-radius: 50%; + border: 1px solid transparent; + } + + .navbar-brand{ + text-transform: capitalize; + font-size: $font-size-large-navbar; + padding-top: $padding-base-vertical; + padding-bottom: $padding-base-vertical; + line-height: $line-height-nav-link; + } + + .navbar-toggler{ + width: 37px; + height: 27px; + vertical-align: middle; + outline: 0; + cursor: pointer; + + & .navbar-toggler-bar.navbar-kebab{ + width: 3px; + height: 3px; + border-radius: 50%; + margin: 0 auto; + } + } + + .button-dropdown{ + .navbar-toggler-bar:nth-child(2){ + width: 17px; + } + } + + &.navbar-transparent{ + background-color: $transparent-bg !important; + box-shadow: none; + border-bottom: 1px solid #ddd; + + a:not(.dropdown-item):not(.btn){ + color: $default-color; + + &.disabled{ + opacity: .5; + color: $default-color; + } + } + + .button-bar{ + background: $default-color; + } + + .nav-item .nav-link:not(.btn){ + color: $default-color; + } + .nav-item.active .nav-link:not(.btn), + .nav-item .nav-link:not(.btn):focus, + .nav-item .nav-link:not(.btn):hover, + .nav-item .nav-link:not(.btn):focus:hover, + .nav-item .nav-link:not(.btn):active { + color: $primary-color; + } + } + + &.bg-white { + a:not(.dropdown-item):not(.btn){ + color: $default-color; + + &.disabled{ + opacity: .5; + color: $default-color; + } + } + + .button-bar{ + background: $default-color; + } + + .nav-item.active .nav-link:not(.btn), + .nav-item .nav-link:not(.btn):focus, + .nav-item .nav-link:not(.btn):hover, + .nav-item .nav-link:not(.btn):active{ + color: $info-color; + } + + .logo-container{ + border: 1px solid $default-color; + } + } + + .navbar-collapse { + .nav-item { + a { + font-size: $font-size-base; + } + } + } +} + +.bg-default{ + background-color: $default-color !important; +} + +.bg-primary{ + background-color: $primary-color !important; +} + +.bg-info{ + background-color: $info-color !important; +} + +.bg-success{ + background-color: $success-color !important; +} + +.bg-danger{ + background-color: $danger-color !important; +} + +.bg-warning{ + background-color: $warning-color !important; +} + +.bg-white{ + background-color: $white-color !important; +} diff --git a/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_nucleo-outline.scss b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_nucleo-outline.scss new file mode 100644 index 00000000000..8548fcaa4a5 --- /dev/null +++ b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_nucleo-outline.scss @@ -0,0 +1,566 @@ +/*-------------------------------- + +nucleo-icons Web Font - built using nucleoapp.com +License - nucleoapp.com/license/ + +-------------------------------- */ +@font-face { + font-family: 'nucleo-icons'; + src: url('../fonts/nucleo-icons.eot'); + src: url('../fonts/nucleo-icons.eot') format('embedded-opentype'), url('../fonts/nucleo-icons.woff2') format('woff2'), url('../fonts/nucleo-icons.woff') format('woff'), url('../fonts/nucleo-icons.ttf') format('truetype'); + font-weight: normal; + font-style: normal; +} +/*------------------------ + base class definition +-------------------------*/ +.nc-icon { + display: inline-block; + font: normal normal normal 14px/1 'nucleo-icons'; + font-size: inherit; + speak: none; + text-transform: none; + /* Better Font Rendering */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +/*------------------------ + change icon size +-------------------------*/ +.nc-icon.lg { + font-size: 1.33333333em; + vertical-align: -16%; +} +.nc-icon.x2 { + font-size: 2em; +} +.nc-icon.x3 { + font-size: 3em; +} +/*---------------------------------- + add a square/circle background +-----------------------------------*/ +.nc-icon.square, +.nc-icon.circle { + padding: 0.33333333em; + vertical-align: -16%; + background-color: #eee; +} +.nc-icon.circle { + border-radius: 50%; +} +/*------------------------ + list icons +-------------------------*/ +.nc-icon-ul { + padding-left: 0; + margin-left: 2.14285714em; + list-style-type: none; +} +.nc-icon-ul > li { + position: relative; +} +.nc-icon-ul > li > .nc-icon { + position: absolute; + left: -1.57142857em; + top: 0.14285714em; + text-align: center; +} +.nc-icon-ul > li > .nc-icon.lg { + top: 0; + left: -1.35714286em; +} +.nc-icon-ul > li > .nc-icon.circle, +.nc-icon-ul > li > .nc-icon.square { + top: -0.19047619em; + left: -1.9047619em; +} +/*------------------------ + spinning icons +-------------------------*/ +.nc-icon.spin { + -webkit-animation: nc-icon-spin 2s infinite linear; + -moz-animation: nc-icon-spin 2s infinite linear; + animation: nc-icon-spin 2s infinite linear; +} +@-webkit-keyframes nc-icon-spin { + 0% { + -webkit-transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(360deg); + } +} +@-moz-keyframes nc-icon-spin { + 0% { + -moz-transform: rotate(0deg); + } + 100% { + -moz-transform: rotate(360deg); + } +} +@keyframes nc-icon-spin { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + -o-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -ms-transform: rotate(360deg); + -o-transform: rotate(360deg); + transform: rotate(360deg); + } +} +/*------------------------ + rotated/flipped icons +-------------------------*/ +.nc-icon.rotate-90 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); + -webkit-transform: rotate(90deg); + -moz-transform: rotate(90deg); + -ms-transform: rotate(90deg); + -o-transform: rotate(90deg); + transform: rotate(90deg); +} +.nc-icon.rotate-180 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + -webkit-transform: rotate(180deg); + -moz-transform: rotate(180deg); + -ms-transform: rotate(180deg); + -o-transform: rotate(180deg); + transform: rotate(180deg); +} +.nc-icon.rotate-270 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); + -webkit-transform: rotate(270deg); + -moz-transform: rotate(270deg); + -ms-transform: rotate(270deg); + -o-transform: rotate(270deg); + transform: rotate(270deg); +} +.nc-icon.flip-y { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0); + -webkit-transform: scale(-1, 1); + -moz-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + -o-transform: scale(-1, 1); + transform: scale(-1, 1); +} +.nc-icon.flip-x { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + -webkit-transform: scale(1, -1); + -moz-transform: scale(1, -1); + -ms-transform: scale(1, -1); + -o-transform: scale(1, -1); + transform: scale(1, -1); +} +/*------------------------ + font icons +-------------------------*/ + +.nc-air-baloon::before { + content: "\ea01"; +} + +.nc-album-2::before { + content: "\ea02"; +} + +.nc-alert-circle-i::before { + content: "\ea04"; +} + +.nc-align-center::before { + content: "\ea03"; +} + +.nc-align-left-2::before { + content: "\ea05"; +} + +.nc-ambulance::before { + content: "\ea06"; +} + +.nc-app::before { + content: "\ea07"; +} + +.nc-atom::before { + content: "\ea08"; +} + +.nc-badge::before { + content: "\ea09"; +} + +.nc-bag-16::before { + content: "\ea0a"; +} + +.nc-bank::before { + content: "\ea0b"; +} + +.nc-basket::before { + content: "\ea0c"; +} + +.nc-bell-55::before { + content: "\ea0d"; +} + +.nc-bold::before { + content: "\ea0e"; +} + +.nc-book-bookmark::before { + content: "\ea0f"; +} + +.nc-bookmark-2::before { + content: "\ea10"; +} + +.nc-box-2::before { + content: "\ea11"; +} + +.nc-box::before { + content: "\ea12"; +} + +.nc-briefcase-24::before { + content: "\ea13"; +} + +.nc-bulb-63::before { + content: "\ea14"; +} + +.nc-bullet-list-67::before { + content: "\ea15"; +} + +.nc-bus-front-12::before { + content: "\ea16"; +} + +.nc-button-pause::before { + content: "\ea17"; +} + +.nc-button-play::before { + content: "\ea18"; +} + +.nc-button-power::before { + content: "\ea19"; +} + +.nc-calendar-60::before { + content: "\ea1a"; +} + +.nc-camera-compact::before { + content: "\ea1b"; +} + +.nc-caps-small::before { + content: "\ea1c"; +} + +.nc-cart-simple::before { + content: "\ea1d"; +} + +.nc-chart-bar-32::before { + content: "\ea1e"; +} + +.nc-chart-pie-36::before { + content: "\ea1f"; +} + +.nc-chat-33::before { + content: "\ea20"; +} + +.nc-check-2::before { + content: "\ea21"; +} + +.nc-circle-10::before { + content: "\ea22"; +} + +.nc-cloud-download-93::before { + content: "\ea23"; +} + +.nc-cloud-upload-94::before { + content: "\ea24"; +} + +.nc-compass-05::before { + content: "\ea25"; +} + +.nc-controller-modern::before { + content: "\ea26"; +} + +.nc-credit-card::before { + content: "\ea27"; +} + +.nc-delivery-fast::before { + content: "\ea28"; +} + +.nc-diamond::before { + content: "\ea29"; +} + +.nc-email-85::before { + content: "\ea2a"; +} + +.nc-favourite-28::before { + content: "\ea2b"; +} + +.nc-glasses-2::before { + content: "\ea2c"; +} + +.nc-globe-2::before { + content: "\ea2d"; +} + +.nc-globe::before { + content: "\ea2e"; +} + +.nc-hat-3::before { + content: "\ea2f"; +} + +.nc-headphones::before { + content: "\ea30"; +} + +.nc-html5::before { + content: "\ea31"; +} + +.nc-image::before { + content: "\ea32"; +} + +.nc-istanbul::before { + content: "\ea33"; +} + +.nc-key-25::before { + content: "\ea34"; +} + +.nc-laptop::before { + content: "\ea35"; +} + +.nc-layout-11::before { + content: "\ea36"; +} + +.nc-lock-circle-open::before { + content: "\ea37"; +} + +.nc-map-big::before { + content: "\ea38"; +} + +.nc-minimal-down::before { + content: "\ea39"; +} + +.nc-minimal-left::before { + content: "\ea3a"; +} + +.nc-minimal-right::before { + content: "\ea3b"; +} + +.nc-minimal-up::before { + content: "\ea3c"; +} + +.nc-mobile::before { + content: "\ea3d"; +} + +.nc-money-coins::before { + content: "\ea3e"; +} + +.nc-note-03::before { + content: "\ea3f"; +} + +.nc-palette::before { + content: "\ea40"; +} + +.nc-paper::before { + content: "\ea41"; +} + +.nc-pin-3::before { + content: "\ea42"; +} + +.nc-planet::before { + content: "\ea43"; +} + +.nc-refresh-69::before { + content: "\ea44"; +} + +.nc-ruler-pencil::before { + content: "\ea45"; +} + +.nc-satisfied::before { + content: "\ea46"; +} + +.nc-scissors::before { + content: "\ea47"; +} + +.nc-send::before { + content: "\ea48"; +} + +.nc-settings-gear-65::before { + content: "\ea49"; +} + +.nc-settings::before { + content: "\ea4a"; +} + +.nc-share-66::before { + content: "\ea4b"; +} + +.nc-shop::before { + content: "\ea4c"; +} + +.nc-simple-add::before { + content: "\ea4d"; +} + +.nc-simple-delete::before { + content: "\ea4e"; +} + +.nc-simple-remove::before { + content: "\ea4f"; +} + +.nc-single-02::before { + content: "\ea50"; +} + +.nc-single-copy-04::before { + content: "\ea51"; +} + +.nc-sound-wave::before { + content: "\ea52"; +} + +.nc-spaceship::before { + content: "\ea53"; +} + +.nc-sun-fog-29::before { + content: "\ea54"; +} + +.nc-support-17::before { + content: "\ea55"; +} + +.nc-tablet-2::before { + content: "\ea56"; +} + +.nc-tag-content::before { + content: "\ea57"; +} + +.nc-tap-01::before { + content: "\ea58"; +} + +.nc-tie-bow::before { + content: "\ea59"; +} + +.nc-tile-56::before { + content: "\ea5a"; +} + +.nc-time-alarm::before { + content: "\ea5b"; +} + +.nc-touch-id::before { + content: "\ea5c"; +} + +.nc-trophy::before { + content: "\ea5d"; +} + +.nc-tv-2::before { + content: "\ea5e"; +} + +.nc-umbrella-13::before { + content: "\ea5f"; +} + +.nc-user-run::before { + content: "\ea60"; +} + +.nc-vector::before { + content: "\ea61"; +} + +.nc-watch-time::before { + content: "\ea62"; +} + +.nc-world-2::before { + content: "\ea63"; +} + +.nc-zoom-split::before { + content: "\ea64"; +} + + +/* all icon font classes list here */ diff --git a/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_page-header.scss b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_page-header.scss new file mode 100644 index 00000000000..d0538b41bb1 --- /dev/null +++ b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_page-header.scss @@ -0,0 +1,85 @@ +.page-header{ + min-height: 100vh; + max-height: 1000px; + padding: 0; + color: $white-color; + position: relative; + + .page-header-image{ + position: absolute; + background-size: cover; + background-position: center center; + width: 100%; + height: 100%; + z-index: -1; + } + + .content-center{ + position: absolute; + top: 50%; + left: 50%; + z-index: 2; + -ms-transform: translate(-50%, -50%); + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + text-align: center; + color: #FFFFFF; + padding: 0 15px; + width: 100%; + max-width: 880px; + + } + + footer{ + position: absolute; + bottom: 0; + width: 100%; + } + + .container{ + height: 100%; + z-index: 1; + } + + .category, + .description{ + color: $opacity-8; + } + + &.page-header-small{ + min-height: 60vh; + max-height: 440px; + } + + &.page-header-mini{ + min-height: 40vh; + max-height: 340px; + } + + .title{ + margin-bottom: 15px; + } + .title + h4{ + margin-top: 10px; + } + + &:after, + &:before{ + position: absolute; + z-index: 0; + width: 100%; + height: 100%; + display: block; + left: 0; + top: 0; + content: ""; + } + + &:before{ + background-color: rgba(0,0,0,.3); + } + + &[filter-color="orange"]{ + @include linear-gradient(rgba($black-color,.20), rgba(224, 23, 3, 0.6)); + } +} diff --git a/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_responsive.scss b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_responsive.scss new file mode 100644 index 00000000000..121cde3bb42 --- /dev/null +++ b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_responsive.scss @@ -0,0 +1,550 @@ +@media screen and (max-width: 991px){ + + .navbar { + padding: 0; + + &.navbar-absolute { + padding-top: 0; + } + + .navbar-brand { + font-size: 16px; + margin-right: 0; + } + } + + .profile-photo .profile-photo-small{ + margin-left: -2px; + } + + .button-dropdown{ + display: none; + } + + #minimizeSidebar{ + display: none; + } + + .navbar{ + .container-fluid{ + padding-right: 15px; + padding-left: 15px; + } + + .navbar-collapse{ + .input-group{ + margin: 0; + margin-top: 5px; + } + } + + .navbar-nav{ + .nav-item:first-child{ + margin-top: 10px; + } + .nav-item:not(:last-child){ + margin-bottom: 10px; + } + } + + .dropdown.show .dropdown-menu{ + display: block; + } + + .dropdown .dropdown-menu{ + display: none; + } + + .dropdown.show .dropdown-menu, + .dropdown .dropdown-menu{ + border: 0; + transition: none; + -webkit-box-shadow: none; + width: auto; + margin: 0px 1rem; + margin-top: 0px; + box-shadow: none; + position: static; + padding-left: 10px; + + &:before{ + display: none; + } + } + + .dropdown-menu .dropdown-item:focus, + .dropdown-menu .dropdown-item:hover{ + color: $white-color; + } + + &.bg-white .dropdown-menu .dropdown-item:focus, + &.bg-white .dropdown-menu .dropdown-item:hover{ + color: $default-color; + } + + .navbar-toggler-bar{ + display: block; + position: relative; + width: 22px; + height: 1px; + border-radius: 1px; + background: $default-color; + + & + .navbar-toggler-bar{ + margin-top: 7px; + } + + & + .navbar-toggler-bar.navbar-kebab{ + margin-top: 3px; + } + + &.bar2{ + width: 17px; + transition: width .2s linear; + } + } + + &.bg-white:not(.navbar-transparent) .navbar-toggler-bar{ + background-color: $default-color; + } + + & .toggled .navbar-toggler-bar{ + width: 24px; + + & + .navbar-toggler-bar{ + margin-top: 5px; + } + } + + } + + .wrapper{ + @include transition (0.50s, cubic-bezier(0.685, 0.0473, 0.346, 1)); + } + + .nav-open{ + .main-panel{ + right: 0; + @include transform-translate-x(260px); + } + + .sidebar{ + @include transform-translate-x(0px); + } + + body{ + position: relative; + overflow-x: hidden; + } + + .menu-on-right{ + .main-panel{ + @include transform-translate-x(-260px); + } + + .navbar-collapse, + .sidebar{ + @include transform-translate-x(0px); + } + + .navbar-translate{ + @include transform-translate-x(-300px); + } + + #bodyClick{ + right: 260px; + left: auto; + } + } + } + + .menu-on-right{ + .sidebar{ + left: auto; + right:0; + @include transform-translate-x(260px); + } + } + + .bar1, + .bar2, + .bar3 { + outline: 1px solid transparent; + } + .bar1 { + top: 0px; + @include bar-animation($topbar-back); + } + .bar2 { + opacity: 1; + } + .bar3 { + bottom: 0px; + @include bar-animation($bottombar-back); + } + .toggled .bar1 { + top: 6px; + @include bar-animation($topbar-x); + } + .toggled .bar2 { + opacity: 0; + } + .toggled .bar3 { + bottom: 6px; + @include bar-animation($bottombar-x); + } + + @include topbar-x-rotation(); + @include topbar-back-rotation(); + @include bottombar-x-rotation(); + @include bottombar-back-rotation(); + + @-webkit-keyframes fadeIn { + 0% {opacity: 0;} + 100% {opacity: 1;} + } + @-moz-keyframes fadeIn { + 0% {opacity: 0;} + 100% {opacity: 1;} + } + @keyframes fadeIn { + 0% {opacity: 0;} + 100% {opacity: 1;} + } + + #bodyClick{ + height: 100%; + width: 100%; + position: fixed; + opacity: 1; + top: 0; + right: 0; + left: 260px; + content: ""; + z-index: 9999; + overflow-x: hidden; + background-color: transparent; + @include transition (0.50s, cubic-bezier(0.685, 0.0473, 0.346, 1)); + } + + .footer{ + .copyright{ + text-align: right; + } + } + + .section-nucleo-icons .icons-container{ + margin-top: 65px; + } + + .navbar-nav{ + .nav-link{ + i.fa, + i.nc-icon{ + opacity: .5; + } + } + } + + .sidebar, + .bootstrap-navbar { + position: fixed; + display: block; + top: 0; + height: 100%; + width: 260px; + right: auto; + left: 0; + z-index: 1032; + visibility: visible; + overflow-y: visible; + padding: 0; + @include transition (0.50s, cubic-bezier(0.685, 0.0473, 0.346, 1)); + + @include transform-translate-x(-260px); + } + + + + .main-panel{ + width: 100%; + } + + .timeline{ + &:before{ + left: 5% !important; + } + + > li > .timeline-badge{ + left: 5% !important; + } + + > li > .timeline-panel{ + float: right !important; + width: 82% !important; + + &:before{ + border-left-width: 0 !important; + border-right-width: 15px !important; + left: -15px !important; + right: auto !important; + } + + &:after{ + border-left-width: 0 !important; + border-right-width: 14px !important; + left: -14px !important; + right: auto !important; + } + } + } + +} +@media (max-width: 991px) and (min-width: 768px){ + .nav-tabs-navigation.verical-navs { + padding: 0px 2px; + } +} + +@media screen and (min-width: 768px){ + .footer { + .footer-nav { + padding-left: 21px; + } + + .credits { + padding-right: 15px; + } + } +} + +@media screen and (min-width: 992px){ + .navbar-collapse{ + background: none !important; + } + + .navbar .navbar-toggle{ + display: none; + } + + .navbar-nav{ + .nav-link{ + &.profile-photo{ + padding: 0; + margin: 7px $padding-base-horizontal; + } + } + } + + .section-nucleo-icons .icons-container{ + margin: 0 0 0 auto; + } + + .dropdown-menu .dropdown-item{ + color: inherit; + } + + .footer{ + .copyright{ + float: right; + padding-right: 15px; + } + } + + .sidebar{ + .sidebar-wrapper{ + li.active{ + > a:not([data-toggle="collapse"]), + > [data-toggle="collapse"] + div .nav li { + &:before{ + border-right: 17px solid $medium-gray; + border-top: 17px solid transparent; + border-bottom: 17px solid transparent; + content: ""; + display: inline-block; + position: absolute; + right: -16px; + opacity: 1; + top: 7px; + transition: opacity 150ms ease-in; + } + + &:after{ + border-right: 17px solid $default-body-bg; + border-top: 17px solid transparent; + border-bottom: 17px solid transparent; + content: ""; + display: inline-block; + position: absolute; + right: -17px; + opacity: 1; + top: 7px; + transition: opacity 150ms ease-in; + } + } + >[data-toggle="collapse"] + div .nav li { + a{ + &:before, + &:after { + top: 0; + } + } + } + } + } + } + +} + +@media screen and (max-width: 768px){ + .card-stats [class*="col-"] .statistics::after { + display: none; + } + + .main-panel .content { + padding-left: 15px; + padding-right: 15px; + } + + .footer{ + nav{ + display: block; + margin-bottom: 5px; + float: none; + } + } + + .landing-page .section-story-overview .image-container:nth-child(2){ + margin-left: 0; + margin-bottom: 30px; + } + + .card { + .form-horizontal { + .col-md-3.col-form-label { + text-align: left; + } + } + } + +} + +@media screen and (max-width: 767px){ + .nav-tabs-navigation.verical-navs{ + padding: 0 28px; + } + + .typography-line { + padding-left: 23% !important; + + span { + width: 60px !important; + } + } + + .login-page, + .lock-page, + .register-page { + .navbar{ + padding: .5rem 1rem; + } + } + + .footer { + .footer-nav, + .credits { + margin: 0 auto !important; + } + + .footer-nav { + margin-bottom: 10px !important; + } + } + + .register-page { + .content { + padding-top: 5vh; + } + .footer { + position: relative; + } + .info-area.info-horizontal { + margin-top: 0; + } + } +} + +@media screen and (max-width: 374px){ + .login-page { + .content { + padding-top: 10vh; + } + } +} + +@media screen and (max-width: 413px){ + .fixed-plugin { + .dropdown.show-dropdown.show{ + .dropdown-menu.show { + width: 225px !important; + + &[x-placement=top-start] { + transform: translate3d(0,400px,0)!important; + } + + &:before, + &:after { + bottom: 360px !important; + } + } + } + } + +} + + +@media screen and (max-width: 576px){ + .navbar[class*='navbar-toggleable-'] .container{ + margin-left: 0; + margin-right: 0; + } + + .card-contributions .card-stats{ + flex-direction: column; + + .bootstrap-switch{ + margin-bottom: 15px; + } + } + + .footer{ + .copyright{ + text-align: center; + } + } + + .section-nucleo-icons{ + .icons-container{ + i{ + font-size: 30px; + + &:nth-child(6){ + font-size: 48px; + } + } + } + } + + .page-header{ + .container h6.category-absolute{ + width: 90%; + } + } + + .card-timeline .timeline { + .timeline-panel { + width: 38%; + padding: 15px; + } + } +} diff --git a/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_sidebar-and-main-panel.scss b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_sidebar-and-main-panel.scss new file mode 100644 index 00000000000..bffda0bcf42 --- /dev/null +++ b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_sidebar-and-main-panel.scss @@ -0,0 +1,361 @@ +.wrapper{ + position: relative; + top: 0; + height: 100vh; + + &.wrapper-full-page{ + min-height: 100vh; + height: auto; + } +} + +.sidebar, +.off-canvas-sidebar{ + position: fixed; + top: 0; + height: 100%; + bottom: 0; + width: 260px; + left: 0; + z-index: 1030; + border-right: 1px solid #ddd; + + .sidebar-wrapper{ + position: relative; + height: calc(100vh - 75px); + overflow: auto; + width: 260px; + z-index: 4; + padding-bottom: 100px; + + .dropdown .dropdown-backdrop{ + display: none !important; + } + + .navbar-form{ + border: none; + } + } + + .navbar-minimize{ + position: absolute; + right: 20px; + top: 2px; + opacity: 1; + + @extend .animation-transition-general; + } + .logo-tim{ + border-radius: 50%; + border: 1px solid #333; + display: block; + height: 61px; + width: 61px; + float: left; + overflow: hidden; + + img{ + width: 60px; + height: 60px; + } + } + + .nav{ + margin-top: 20px; + display: block; + + .caret{ + top: 14px; + position: absolute; + right: 10px; + } + + li{ + > a + div .nav li > a{ + margin-top: 7px; + } + + > a{ + margin: 10px 15px 0; + color: $white-color; + display: block; + text-decoration: none; + position: relative; + text-transform: uppercase; + cursor: pointer; + font-size: 12px; + padding: 10px 8px; + line-height: 30px; + opacity: .7; + } + + .nav > li > a{ + padding: 5px 8px; + } + + &.active > a, + &.active > a > i { + opacity: 1; + } + + &:hover:not(.active) > a, + &:focus:not(.active) > a { + opacity: 1; + } + } + + i{ + font-size: 24px; + float: left; + margin-right: 12px; + line-height: 30px; + width: 34px; + text-align: center; + color: $opacity-5; + position: relative; + } + + p { + margin-bottom: 0; + } + + .collapse, + .collapsing { + .nav { + margin-top: 0; + } + } + } + + .sidebar-background{ + position: absolute; + z-index: 1; + height: 100%; + width: 100%; + display: block; + top: 0; + left: 0; + background-size: cover; + background-position: center center; + + &:after{ + position: absolute; + z-index: 3; + width: 100%; + height: 100%; + content: ""; + display: block; + background: #FFFFFF; + opacity: 1; + } + } + + .logo{ + position: relative; + padding: 7px $padding-base-horizontal; + z-index: 4; + + a.logo-mini, + a.logo-normal{ + @extend .animation-transition-general; + } + + a.logo-mini{ + opacity: 1; + float: left; + width: 34px; + text-align: center; + margin-left: 10px; + margin-right: 12px; + } + + a.logo-normal{ + display: block; + opacity: 1; + padding: 11px 0 8px; + @include transform-translate-x(0px); + } + + &:after{ + content: ''; + position: absolute; + bottom: 0; + right: 15px; + height: 1px; + width: calc(100% - 30px); + background-color: $opacity-5; + + } + + p{ + float: left; + font-size: 20px; + margin: 10px 10px; + color: $white-color; + line-height: 20px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + } + + .simple-text{ + text-transform: uppercase; + padding: $padding-base-vertical 0; + display: block; + white-space: nowrap; + font-size: $font-size-large; + color: $white-color; + text-decoration: none; + font-weight: $font-weight-normal; + line-height: 30px; + overflow: hidden; + } + } + + .logo-tim{ + border-radius: 50%; + border: 1px solid #333; + display: block; + height: 61px; + width: 61px; + float: left; + overflow: hidden; + + img{ + width: 60px; + height: 60px; + } + } + + &:before, + &:after{ + display: block; + content: ""; + opacity: 1; + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + } + + &:after{ + @include icon-gradient($default-color); + z-index: 3; + } + + &[data-color="white"]{ + @include sidebar-color($white-color); + @include sidebar-text-color($default-color); + } + &[data-color="black"]{ + @include sidebar-color($dark-color); + } + + + // Active color changing + + &[data-active-color="primary"]{ + @include sidebar-active-color($primary-color); + } + &[data-active-color="info"]{ + @include sidebar-active-color($info-color); + } + &[data-active-color="success"]{ + @include sidebar-active-color($success-color); + } + &[data-active-color="warning"]{ + @include sidebar-active-color($warning-color); + } + &[data-active-color="danger"]{ + @include sidebar-active-color($danger-color); + } +} + +.visible-on-sidebar-regular{ + display: inline-block !important; +} +.visible-on-sidebar-mini{ + display: none !important; +} + +.off-canvas-sidebar{ + .nav { + > li > a, + > li > a:hover{ + color: $white-color; + } + + > li > a:focus{ + background: rgba(200, 200, 200, 0.2); + } + } +} + + +.main-panel{ + position: relative; + float: right; + width: $sidebar-width; + background-color: #f4f3ef;; + + + @include transition (0.50s, cubic-bezier(0.685, 0.0473, 0.346, 1)); + + > .content{ + padding: 0 30px 30px; + min-height: calc(100vh - 123px); + margin-top: 93px; + } + + > .navbar{ + margin-bottom: 0; + } + + + .header{ + margin-bottom: 50px; + } +} + + +.perfect-scrollbar-on{ + .sidebar, + .main-panel{ + height: 100%; + max-height: 100%; + } +} + +.panel-header { + height: 260px; + padding-top: 80px; + padding-bottom: 45px; + background: #141E30; /* fallback for old browsers */ + background: -webkit-gradient(linear, left top, right top, from(#0c2646), color-stop(60%, #204065), to(#2a5788)); + background: linear-gradient(to right, #0c2646 0%, #204065 60%, #2a5788 100%); + position: relative; + overflow: hidden; + + .header{ + .title{ + color: $white-color; + } + .category{ + max-width: 600px; + color: $opacity-5; + margin: 0 auto; + font-size: 13px; + + a{ + color: $white-color; + } + } + } +} + +.panel-header-sm{ + height: 135px; +} + +.panel-header-lg{ + height: 380px +} diff --git a/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_tables.scss b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_tables.scss new file mode 100644 index 00000000000..73855b14b2b --- /dev/null +++ b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_tables.scss @@ -0,0 +1,173 @@ +.table{ + + .img-wrapper{ + width: 40px; + height: 40px; + border-radius: 50%; + overflow: hidden; + margin: 0 auto; + } + + .img-row{ + max-width: 60px; + width: 60px; + } + + .form-check{ + margin: 0; + + & label .form-check-sign::before, + & label .form-check-sign::after{ + top: -17px; + left: 4px; + } + } + + .btn{ + margin: 0; + } + + small,.small{ + font-weight: 300; + } + + .card-tasks .card-body &{ + margin-bottom: 0; + + > thead > tr > th, + > tbody > tr > th, + > tfoot > tr > th, + > thead > tr > td, + > tbody > tr > td, + > tfoot > tr > td{ + padding-top: 0; + padding-bottom: 0; + } + } + + > thead > tr > th{ + font-size: 14px; + font-weight: $font-weight-bold; + padding-bottom: 0; + text-transform: uppercase; + border: 0; + } + + .radio, + .checkbox{ + margin-top: 0; + margin-bottom: 0; + padding: 0; + width: 15px; + + .icons{ + position: relative; + } + + label{ + &:after, + &:before{ + top: -17px; + left: -3px; + } + } + } + > thead > tr > th, + > tbody > tr > th, + > tfoot > tr > th, + > thead > tr > td, + > tbody > tr > td, + > tfoot > tr > td{ + padding: 12px 7px; + vertical-align: middle; + } + + .th-description{ + max-width: 150px; + } + .td-price{ + font-size: 26px; + font-weight: $font-weight-light; + margin-top: 5px; + position: relative; + top: 4px; + text-align: right; + } + .td-total{ + font-weight: $font-weight-bold; + font-size: $font-size-h5; + padding-top: 20px; + text-align: right; + } + + .td-actions .btn{ + margin: 0px; + } + + > tbody > tr{ + position: relative; + } +} + +.table-shopping{ + > thead > tr > th{ + font-size: $font-size-h6; + text-transform: uppercase; + } + > tbody > tr > td{ + font-size: $font-paragraph; + + b{ + display: block; + margin-bottom: 5px; + } + } + .td-name{ + font-weight: $font-weight-normal; + font-size: 1.5em; + small{ + color: $dark-gray; + font-size: 0.75em; + font-weight: $font-weight-light; + } + } + .td-number{ + font-weight: $font-weight-light; + font-size: $font-size-h4; + } + .td-name{ + min-width: 200px; + } + .td-number{ + text-align: right; + min-width: 170px; + + small{ + margin-right: 3px; + } + } + + .img-container{ + width: 120px; + max-height: 160px; + overflow: hidden; + display: block; + + img{ + width: 100%; + } + } +} + +.table-responsive{ + overflow: scroll; + padding-bottom: 10px; +} + +#tables .table-responsive{ + margin-bottom: 30px; +} + +.table-hover>tbody>tr:hover{ + background-color: #f5f5f5; +} diff --git a/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_typography.scss b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_typography.scss new file mode 100644 index 00000000000..23f3eee2bf2 --- /dev/null +++ b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_typography.scss @@ -0,0 +1,173 @@ +button, +input, +optgroup, +select, +textarea{ + font-family: $sans-serif-family; +} +h1,h2,h3,h4,h5,h6{ + font-weight: $font-weight-normal; +} + +a{ + color: $primary-color; + &:hover, + &:focus{ + color: $primary-color; + } +} +h1, .h1 { + font-size: $font-size-h1; + line-height: 1.15; + margin-bottom: $margin-base-vertical * 2; + + small{ + font-weight: $font-weight-bold; + text-transform: uppercase; + opacity: .8; + } +} +h2, .h2{ + font-size: $font-size-h2; + margin-bottom: $margin-base-vertical * 2; +} +h3, .h3{ + font-size: $font-size-h3; + margin-bottom: $margin-base-vertical * 2; + line-height: 1.4em; +} +h4, .h4{ + font-size: $font-size-h4; + line-height: 1.45em; + margin-top: $margin-base-vertical * 2; + margin-bottom: $margin-base-vertical; + + & + .category, + &.title + .category{ + margin-top: -10px; + } +} +h5, .h5 { + font-size: $font-size-h5; + line-height: 1.4em; + margin-bottom: 15px; +} +h6, .h6{ + font-size: $font-size-h6; + font-weight: $font-weight-bold; + text-transform: uppercase; +} +p{ + &.description{ + font-size: 1.14em; + } +} + +// i.fa{ +// font-size: 18px; +// position: relative; +// top: 1px; +// } + +.title{ + font-weight: $font-weight-bold; + + &.title-up{ + text-transform: uppercase; + + a{ + color: $black-color; + text-decoration: none; + } + } + & + .category{ + margin-top: -10px; + } +} + +.description, +.card-description, +.footer-big p, +.card .footer .stats{ + color: $dark-gray; + font-weight: $font-weight-light; +} +.category, +.card-category{ + text-transform: capitalize; + font-weight: $font-weight-normal; + color: $dark-gray; + font-size: $font-size-mini; +} + +.card-category{ + font-size: $font-size-h6; +} + +.text-primary, +a.text-primary:focus, a.text-primary:hover { + color: $brand-primary !important; +} +.text-info, +a.text-info:focus, a.text-info:hover { + color: $brand-info !important; +} +.text-success, +a.text-success:focus, a.text-success:hover { + color: $brand-success !important; +} +.text-warning, +a.text-warning:focus, a.text-warning:hover { + color: $brand-warning !important; +} +.text-danger, +a.text-danger:focus, a.text-danger:hover { + color: $brand-danger !important; +} + +.text-gray, +a.text-gray:focus, a.text-gray:hover{ + color: $light-gray !important; +} + + +.blockquote{ + border-left: none; + border: 1px solid $default-color; + padding: 20px; + font-size: $font-size-blockquote; + line-height: 1.8; + + small{ + color: $default-color; + font-size: $font-size-small; + text-transform: uppercase; + } + + &.blockquote-primary{ + border-color: $primary-color; + color: $primary-color; + + small{ + color: $primary-color; + } + } + + &.blockquote-danger{ + border-color: $danger-color; + color: $danger-color; + + small{ + color: $danger-color; + } + } + + &.blockquote-white{ + border-color: $opacity-8; + color: $white-color; + + small{ + color: $opacity-8; + } + } +} diff --git a/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_variables.scss b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_variables.scss new file mode 100644 index 00000000000..ecd1a5186e7 --- /dev/null +++ b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/_variables.scss @@ -0,0 +1,404 @@ +//== Buttons +// +//## For each of Bootstrap's buttons, define text, background and border color. + +$font-color: #66615b !default; +$fill-font-color: rgba(255, 255, 255, 0.8); +$font-family-sans-serif: 'Montserrat', "Helvetica", Arial, sans-serif; +$sans-serif-family: 'Montserrat', 'Helvetica Neue', Arial, sans-serif; + + +$none: 0 !default; +$border-thin: 1px !default; +$border-thick: 2px !default; + +$white-color: #FFFFFF !default; +$white-bg: #FFFFFF !default; +$orange-bg: #e95e38 !default; + +$smoke-bg: #F5F5F5 !default; +$light-black: #444 !default; + +$black-bg: rgba(30,30,30,.97) !default; + +$black-color: #2c2c2c !default; +$black-hr: #444444 !default; + +$hr-line: rgba(0,0,0, .1) !default; + +$light-gray: #E3E3E3 !default; +$medium-gray: #DDDDDD !default; +$dark-gray: #9A9A9A !default; + +$table-line-color: #ccc !default; +$muted-color: #a49e93 !default; + +$opacity-gray-3: rgba(222,222,222, .3) !default; +$opacity-gray-5: rgba(222,222,222, .5) !default; +$opacity-gray-8: rgba(222,222,222, .8) !default; + + +$opacity-5: rgba(255,255,255, .5) !default; +$opacity-8: rgba(255,255,255, .8) !default; + +$datepicker-color-days: rgba(255,255,255, .8) !default; +$datepicker-color-old-new-days: rgba(255,255,255, .4) !default; + + +$opacity-1: rgba(255,255,255, .1) !default; +$opacity-2: rgba(255,255,255, .2) !default; + +$transparent-bg: transparent !default; +$dark-background: #555555 !default; + +$gray-input-bg: #fffcf5 !default; +$danger-input-bg: #FFC0A4 !default; +$success-input-bg: #ABF3CB !default; +$other-medium-gray: #A49E93 !default; +$transparent-bg: transparent !default; + +$placeholder-gray: rgba(210, 210, 210, 1) !default; + +$default-color: #66615B !default; +$default-bg: #66615B !default; +$default-states-color: #403D39 !default; + +$smoke-bg: #F5F5F5 !default; +$pale-bg: #FFFCF5 !default; +$medium-pale-bg: #F1EAE0 !default; +$default-body-bg: #f4f3ef !default; + +$primary-color: #51cbce !default; +$primary-states-color: darken($primary-color, 10%) !default; + +$success-color: #6bd098 !default; +$success-states-color: darken($success-color, 10%) !default; + +$info-color: #51bcda !default; +$info-states-color: darken($info-color, 10%) !default; + +$warning-color: #fbc658 !default; +$warning-states-color: darken($warning-color, 10%) !default; + +$danger-color: #ef8157 !default; +$danger-states-color: darken($danger-color, 8%) !default; + +$link-disabled-color: #666666 !default; + +$purple-color: #c178c1 !default; +$purple-states-color: darken($purple-color, 8%) !default; + +$medium-pale-bg: #F1EAE0 !default; + +$brown-color: #dcb285 !default; +$default-color-opacity: rgba(182, 182, 182, .6) !default; +$primary-color-opacity: rgba(249, 99, 50, .3) !default; +$success-color-opacity: rgba(24, 206, 15, .3) !default; +$info-color-opacity: rgba(44, 168, 255, .3) !default; +$warning-color-opacity: rgba(255, 178, 54, .3) !default; +$danger-color-opacity: rgba(255, 54, 54, .3) !default; + +$new-blue: #1DC7EA; +$new-purple: #9368E9; +$new-red: #FB404B; +$new-green: #87CB16; +$new-orange: #FFA534; +$new-dark-blue: #1F77D0; +$new-black: #5e5e5e; + +$orange-color: #f96332 !default; +$color-red-error: rgb(185, 74, 72) !default; +$color-grey-arrow: rgba(204, 204, 204, 0.2) !default; + +$bg-nude: #FFFCF5 !default; +$bg-primary: lighten($primary-color, 7%) !default; +$bg-info: lighten($info-color, 7%) !default; +$bg-success: lighten($success-color, 7%) !default; +$bg-warning: lighten($warning-color, 7%) !default; +$bg-danger: lighten($danger-color, 7%) !default; +$bg-brown: lighten($brown-color, 7%) !default; +$bg-purple: lighten($purple-color, 7%) !default; + +// brand Colors +$brand-primary: $primary-color !default; +$brand-info: $info-color !default; +$brand-success: $success-color !default; +$brand-warning: $warning-color !default; +$brand-danger: $danger-color !default; +$brand-inverse: $black-color !default; + +$link-disabled-color: #666666 !default; +$dark-color: #212120 !default; +// light colors +$light-blue: rgba($primary-color, .2); +$light-azure: rgba($info-color, .2); +$light-green: rgba($success-color, .2); +$light-orange: rgba($warning-color, .2); +$light-red: rgba($danger-color, .2); + +// padding for links inside dropdown menu +$padding-dropdown-vertical: 10px !default; +$padding-dropdown-horizontal: 15px !default; + +$margin-large-vertical: 30px !default; +$margin-base-vertical: 15px !default; + +// border radius for buttons +$border-radius-none: 0px !default; +$border-radius-btn-small: 26px !default; +$border-radius-btn-base: 20px !default; +$border-radius-btn-large: 50px !default; + + +$margin-bottom: 0 0 10px 0 !default; +$border-radius-small: 3px !default; +$border-radius-base: 4px !default; +$border-radius-large: 6px !default; +$border-radius-x-large: 8px !default; +$border-radius-extreme: 12px !default; + +//variables used in cards +$card-black-color: #252422 !default; +$card-muted-color: #ccc5b9 !default; + +$card-background-blue: #b8d8d8 !default; +$card-font-blue: #506568 !default; +$card-subtitle-blue: #7a9e9f !default; + +$card-background-green: #d5e5a3 !default; +$card-font-green: #60773d !default; +$card-subtitle-green: #92ac56 !default; + +$card-background-yellow: #ffe28c !default; +$card-font-yellow: #b25825 !default; +$card-subtitle-yellow: #d88715 !default; + +$card-background-brown: #d6c1ab !default; +$card-font-brown: #75442e !default; +$card-subtitle-brown: #a47e65 !default; + +$card-background-purple: #baa9ba !default; +$card-font-purple: #3a283d !default; +$card-subtitle-purple: #5a283d !default; + +$card-background-orange: #ff8f5e !default; +$card-font-orange: #772510 !default; +$card-subtitle-orange: #e95e37 !default; + + + +//== Components +// + +$padding-input-vertical: 11px !default; +$padding-input-horizontal: 11px !default; + +$padding-btn-vertical: 11px !default; +$padding-btn-horizontal: 22px !default; + +$padding-base-vertical: .5rem !default; +$padding-base-horizontal: .7rem !default; + +$padding-round-horizontal: 23px !default; + +$padding-simple-vertical: 10px !default; +$padding-simple-horizontal: 17px !default; + +$padding-large-vertical: 15px !default; +$padding-large-horizontal: 48px !default; + +$padding-small-vertical: 5px !default; +$padding-small-horizontal: 15px !default; + +// $padding-xs-vertical: 1px !default; +// $padding-xs-horizontal: 5px !default; + +$padding-label-vertical: 2px !default; +$padding-label-horizontal: 12px !default; + +$margin-large-vertical: 30px !default; +$margin-base-vertical: 15px !default; + +$margin-base-horizontal: 15px !default; + +$margin-bottom: 10px !default; +$border: 1px solid !default; +$border-radius-extra-small: 0.125rem !default; +$border-radius-small: 0.1875rem !default; +$border-radius-large: 0.25rem !default; +$border-radius-extreme: 0.875rem !default; + +$border-radius-large-top: $border-radius-large $border-radius-large 0 0 !default; +$border-radius-large-bottom: 0 0 $border-radius-large $border-radius-large !default; + +$btn-round-radius: 30px !default; + +$height-base: 40px !default; + +$btn-icon-size: 3.5rem !default; +$btn-icon-size-regular: 2.375rem !default; +$btn-icon-font-size-regular: 0.9375rem !default; +$btn-icon-font-size-small: 0.6875rem !default; +$btn-icon-size-small: 1.875rem !default; +$btn-icon-font-size-lg: 1.325rem !default; +$btn-icon-size-lg: 3.6rem !default; + +$font-size-h1: 3.5em !default; // ~ 49px +$font-size-h2: 2.5em !default; // ~ 35px +$font-size-h3: 2em !default; // ~ 28px +$font-size-h4: 1.714em !default; // ~ 24px +$font-size-h5: 1.57em !default; // ~ 22px +$font-size-h6: 1em !default; // ~ 14px + +$font-paragraph: 1em !default; +$font-size-navbar: 1em !default; +$font-size-mini: 0.7142em !default; +$font-size-small: 0.8571em !default; +$font-size-base: 14px !default; +$font-size-large: 1rem !default; +$font-size-large-navbar: 20px !default; +$font-size-blockquote: 1.1em !default; // ~ 15px +$font-size-medium: 16px !default; +$font-size-xs: 12px !default; + +$font-weight-light: 300 !default; +$font-weight-normal: 400 !default; +$font-weight-semi: 600 !default; +$font-weight-bold: 700 !default; + +$line-height-general: 1.5 !default; +$line-height-nav-link: 1.625rem !default; +$btn-icon-line-height: 2.4em !default; +$line-height: 1.35em !default; +$line-height-lg: 54px !default; + + +$border-radius-top: 10px 10px 0 0 !default; +$border-radius-bottom: 0 0 10px 10px !default; + +$dropdown-shadow: 1px 2px 7px 1px rgba(0,0,0,.125); +$box-shadow-raised: 0px 10px 25px 0px rgba(0, 0, 0, 0.3); +$box-shadow: 0 2px 2px rgba(204, 197, 185, 0.5); +$sidebar-box-shadow: 0px 2px 22px 0 rgba(0, 0, 0,.20), 0px 2px 30px 0 rgba(0, 0, 0,.35); + +$general-transition-time: 300ms !default; + +$slow-transition-time: 370ms !default; +$dropdown-coordinates: 29px -50px !default; + +$fast-transition-time: 150ms !default; +$select-coordinates: 50% -40px !default; + +$transition-linear: linear !default; +$transition-bezier: cubic-bezier(0.34, 1.61, 0.7, 1) !default; +$transition-ease: ease 0s; + + +//$navbar-padding-a: 9px 13px; +$navbar-margin-a: 15px 0px; + +$padding-social-a: 10px 5px; + +$navbar-margin-a-btn: 15px 0px; +$navbar-margin-a-btn-round: 16px 0px; + +$navbar-padding-a-icons: 6px 15px; +$navbar-margin-a-icons: 6px 3px; + +$navbar-padding-base: 0.625rem; +//$navbar-margin-brand: 5px 0px; + +$navbar-margin-brand-icons: 12px auto; +$navbar-margin-btn: 15px 3px; + +$height-icon-sm: 32px; +$width-icon-sm: 32px; +$padding-icon-sm: 4px; +$border-radius-icon-sm: 7px; + +$height-icon-message: 40px; +$width-icon-message: 40px; + +$height-icon-message-sm: 20px; +$width-icon-message-sm: 20px; + +$white-navbar: rgba(#FFFFFF, .96); +$primary-navbar: rgba(#34ACDC, .98); +$info-navbar: rgba(#5BCAFF, .98); +$success-navbar: rgba(#4CD964, .98); +$warning-navbar: rgba(#FF9500, .98); +$danger-navbar: rgba(#FF4C40, .98); + +$topbar-x: topbar-x !default; +$topbar-back: topbar-back !default; +$bottombar-x: bottombar-x !default; +$bottombar-back: bottombar-back !default; + +//Nucleo Icons + +$nc-font-path: '../fonts' !default; +$nc-font-size-base: 14px !default; +$nc-css-prefix: nc !default; +$nc-background-color: #eee !default; +$nc-li-width: (30em / 14) !default; +$nc-padding-width: (1em/3) !default; + +// Social icons color +$social-twitter: #55acee !default; +$social-twitter-state-color: darken(#55acee, 5%) !default; + +$social-facebook: #3b5998 !default; +$social-facebook-state-color: darken(#3b5998, 5%) !default; + +$social-google: #dd4b39 !default; +$social-google-state-color: darken(#dd4b39, 5%) !default; + +$social-linkedin: #0077B5 !default; +$social-linkedin-state-color: darken(#0077B5, 5%) !default; + +// Sidebar variables +$sidebar-width: calc(100% - 260px) !default; +$sidebar-mini-width: calc(100% - 80px) !default; + + +// Social icons color +$social-twitter: #55acee !default; +$social-twitter-state-color: lighten(#55acee, 6%) !default; + +$social-facebook: #3b5998 !default; +$social-facebook-state-color: lighten(#3b5998, 6%) !default; + +$social-google: #dd4b39 !default; +$social-google-state-color: lighten(#dd4b39, 6%) !default; + +$social-linkedin: #0077B5 !default; +$social-linkedin-state-color: lighten(#0077B5, 6%) !default; + +$social-pinterest: #cc2127 !default; +$social-pinterest-state-color: lighten(#cc2127, 6%) !default; + +$social-dribbble: #ea4c89 !default; +$social-dribbble-state-color: lighten(#ea4c89, 6%) !default; + +$social-github: #333333 !default; +$social-github-state-color: lighten(#333333, 6%) !default; + +$social-youtube: #e52d27 !default; +$social-youtube-state-color: lighten(#e52d27, 6%) !default; + +$social-instagram: #125688 !default; +$social-instagram-state-color: lighten(#125688, 6%) !default; + +$social-reddit: #ff4500 !default; +$social-reddit-state-color: lighten(#ff4500, 6%) !default; + +$social-tumblr: #35465c !default; +$social-tumblr-state-color: lighten(#35465c, 6%) !default; + +$social-behance: #1769ff !default; +$social-behance-state-color: lighten(#1769ff, 6%) !default; + +// Placeholder text color +$input-color-placeholder: #999 !default; + +$zindex-select-dropdown: 1060 !default; // must be higher than a modal background (1050) diff --git a/explorer/public/paper-dashboard/assets/scss/paper-dashboard/cards/_card-chart.scss b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/cards/_card-chart.scss new file mode 100644 index 00000000000..ba19f1f2749 --- /dev/null +++ b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/cards/_card-chart.scss @@ -0,0 +1,48 @@ +.card-chart { + .card-header{ + .card-title{ + margin-top: 10px; + margin-bottom: 0; + } + .card-category{ + margin-bottom: 5px; + } + } + + .table{ + margin-bottom: 0; + + td{ + border-top: none; + border-bottom: 1px solid #e9ecef; + } + } + + .card-progress { + margin-top: 30px; + } + + .chart-area { + height: 190px; + width: calc(100% + 30px); + margin-left: -15px; + margin-right: -15px; + } + .card-footer { + margin-top: 15px; + + .stats{ + color: $dark-gray; + } + } + + .dropdown{ + position: absolute; + right: 20px; + top: 20px; + + .btn{ + margin: 0; + } + } +} diff --git a/explorer/public/paper-dashboard/assets/scss/paper-dashboard/cards/_card-map.scss b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/cards/_card-map.scss new file mode 100644 index 00000000000..961462546b8 --- /dev/null +++ b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/cards/_card-map.scss @@ -0,0 +1,3 @@ +.map{ + height: 500px; +} diff --git a/explorer/public/paper-dashboard/assets/scss/paper-dashboard/cards/_card-plain.scss b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/cards/_card-plain.scss new file mode 100644 index 00000000000..4290f26cf79 --- /dev/null +++ b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/cards/_card-plain.scss @@ -0,0 +1,17 @@ + +.card-plain{ + background: transparent; + box-shadow: none; + + .card-header, + .card-footer{ + margin-left: 0; + margin-right: 0; + background-color: transparent; + } + + &:not(.card-subcategories).card-body{ + padding-left: 0; + padding-right: 0; + } +} diff --git a/explorer/public/paper-dashboard/assets/scss/paper-dashboard/cards/_card-stats.scss b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/cards/_card-stats.scss new file mode 100644 index 00000000000..73d8d7c3018 --- /dev/null +++ b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/cards/_card-stats.scss @@ -0,0 +1,48 @@ +%card-stats{ + hr{ + margin: 5px 15px; + } +} + + +.card-stats{ + .card-body{ + padding: 15px 15px 0px; + + .numbers{ + text-align: right; + font-size: 2em; + + p{ + margin-bottom: 0; + } + .card-category { + color: $dark-gray; + font-size: 16px; + line-height: 1.4em; + } + } + } + .card-footer{ + padding: 0px 15px 15px; + + .stats{ + color: $dark-gray; + } + + hr{ + margin-top: 10px; + margin-bottom: 15px; + } + } + .icon-big { + font-size: 3em; + min-height: 64px; + + i{ + line-height: 59px; + } + } + + +} diff --git a/explorer/public/paper-dashboard/assets/scss/paper-dashboard/cards/_card-user.scss b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/cards/_card-user.scss new file mode 100644 index 00000000000..89c61741021 --- /dev/null +++ b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/cards/_card-user.scss @@ -0,0 +1,50 @@ +.card-user{ + .image{ + height: 130px; + + img { + border-radius: 12px; + } + } + + .author{ + text-align: center; + text-transform: none; + margin-top: -77px; + + a + p.description{ + margin-top: -7px; + } + } + + .avatar{ + width: 124px; + height: 124px; + border: 1px solid $white-color; + position: relative; + } + + .card-body{ + min-height: 240px; + } + + hr{ + margin: 5px 15px 15px; + } + + .card-body + .card-footer { + padding-top: 0; + } + + .card-footer { + h5 { + font-size: 1.25em; + margin-bottom: 0; + } + } + + .button-container{ + margin-bottom: 6px; + text-align: center; + } +} diff --git a/explorer/public/paper-dashboard/assets/scss/paper-dashboard/mixins/_buttons.scss b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/mixins/_buttons.scss new file mode 100644 index 00000000000..24e01dc9bdb --- /dev/null +++ b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/mixins/_buttons.scss @@ -0,0 +1,212 @@ +// Mixin for generating new styles +@mixin btn-styles($btn-color, $btn-states-color) { + background-color: $btn-color; + + &:hover, + &:focus, + &:active, + &.active, + &:active:focus, + &:active:hover, + &.active:focus, + &.active:hover, + .show > &.dropdown-toggle, + .show > &.dropdown-toggle:focus, + .show > &.dropdown-toggle:hover { + background-color: $btn-states-color !important; + color: $white-color !important; + box-shadow: none !important; + } + + &:not([data-action]):hover{ + box-shadow: none; + } + + &.disabled, + &:disabled, + &[disabled], + fieldset[disabled] & { + &, + &:hover, + &:focus, + &.focus, + &:active, + &.active { + background-color: $btn-color; + border-color: $btn-color; + } + } + + // btn-neutral style + @if $btn-color == $white-color{ + color: $primary-color; + + &.btn-danger{ + color: $danger-color; + + &:hover, + &:focus, + &:active, + &:active:focus{ + color: $danger-states-color !important; + } + } + + &.btn-info{ + color: $info-color !important; + + &:hover, + &:focus, + &:active, + &:active:focus{ + color: $info-states-color !important; + } + } + + &.btn-warning{ + color: $warning-color !important; + + &:hover, + &:focus, + &:active, + &:active:focus{ + color: $warning-states-color !important; + } + } + + &.btn-success{ + color: $success-color !important; + + &:hover, + &:focus, + &:active, + &:active:focus{ + color: $success-states-color !important; + } + } + + &.btn-default{ + color: $default-color !important; + + &:hover, + &:focus, + &:active, + &:active:focus{ + color: $default-states-color !important; + } + } + + &.active, + &:active, + &:active:focus, + &:active:hover, + &.active:focus, + &.active:hover, + .show > &.dropdown-toggle, + .show > &.dropdown-toggle:focus, + .show > &.dropdown-toggle:hover { + background-color: $white-color !important; + color: $primary-states-color !important; + box-shadow: none !important; + } + + &:hover, + &:focus{ + color: $primary-states-color !important; + + &:not(.nav-link){ + box-shadow: none; + } + + } + + } @else { + color: $white-color; + } + + &.btn-simple{ + color: $btn-color; + border-color: $btn-color; + + &:hover, + &:focus, + &:active{ + background-color: $transparent-bg; + color: $btn-states-color; + border-color: $btn-states-color; + box-shadow: none; + } + } + + &.btn-link{ + color: $btn-color; + + &:hover, + &:focus, + &:active, + &:active:focus { + background-color: $transparent-bg; + color: $btn-states-color; + text-decoration: none; + box-shadow: none; + } + } +} + +@mixin btn-outline-styles($btn-color, $btn-states-color){ + background: $transparent-bg; + border: 2px solid $btn-color !important; + color: $btn-color; + @include opacity(1); + + &:hover, + &:focus, + &:active, + &:focus:active, + &.active, + .open > &.dropdown-toggle { + background-color: $btn-color !important; + color: $fill-font-color !important; + border-color: $btn-color !important; + .caret{ + border-top-color: $fill-font-color !important; + } + } + + .caret{ + border-top-color: $white-color !important; + } + + &.disabled, + &:disabled, + &[disabled], + fieldset[disabled] & { + &, + &:hover, + &:focus, + &.focus, + &:active, + &.active { + background-color: $transparent-bg !important; + border-color: $btn-color !important; + } + } +} + +@mixin btn-size($padding-vertical, $padding-horizontal, $font-size, $border){ + font-size: $font-size; + border-radius: $border; + padding: $padding-vertical $padding-horizontal; + + &.btn-simple{ + padding: $padding-vertical - 1 $padding-horizontal - 1; + } + +} + +@mixin rotate-180(){ + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} diff --git a/explorer/public/paper-dashboard/assets/scss/paper-dashboard/mixins/_cards.scss b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/mixins/_cards.scss new file mode 100644 index 00000000000..5097789db1a --- /dev/null +++ b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/mixins/_cards.scss @@ -0,0 +1,4 @@ +@mixin icon-color($color) { + box-shadow: 0px 9px 30px -6px $color; + color: $color; +} diff --git a/explorer/public/paper-dashboard/assets/scss/paper-dashboard/mixins/_dropdown.scss b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/mixins/_dropdown.scss new file mode 100644 index 00000000000..638743ee328 --- /dev/null +++ b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/mixins/_dropdown.scss @@ -0,0 +1,24 @@ +@mixin dropdown-colors($brand-color, $dropdown-header-color, $dropdown-color, $background-color ) { + background-color: $brand-color; + + &:before{ + color: $brand-color; + } + + .dropdown-header:not([href]):not([tabindex]){ + color: $dropdown-header-color; + } + + .dropdown-item{ + color: $dropdown-color; + + &:hover, + &:focus{ + background-color: $background-color; + } + } + + .dropdown-divider{ + background-color: $background-color; + } +} diff --git a/explorer/public/paper-dashboard/assets/scss/paper-dashboard/mixins/_inputs.scss b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/mixins/_inputs.scss new file mode 100644 index 00000000000..36acfc32d35 --- /dev/null +++ b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/mixins/_inputs.scss @@ -0,0 +1,232 @@ +@mixin input-size($padding-vertical, $padding-horizontal){ + padding: $padding-vertical $padding-horizontal; +} + +@mixin form-control-placeholder($color, $opacity){ + .form-control::-moz-placeholder{ + color: $color; + @include opacity(1); + } + .form-control:-moz-placeholder{ + color: $color; + @include opacity(1); + } + .form-control::-webkit-input-placeholder{ + color: $color; + @include opacity(1); + } + .form-control:-ms-input-placeholder{ + color: $color; + @include opacity(1); + } +} + +@mixin placeholder() { + &::-moz-placeholder {@content; } // Firefox + &:-ms-input-placeholder {@content; } // Internet Explorer 10+ + &::-webkit-input-placeholder {@content; } // Safari and Chrome +} + +@mixin light-form(){ + border-radius: 0; + border:0; + padding: 0; + background-color: transparent; + +} + + +@mixin form-control-lg-padding($padding-vertical, $padding-horizontal) { + .form-group.no-border.form-control-lg, + .input-group.no-border.form-control-lg{ + .input-group-append .input-group-text{ + padding: $padding-vertical 0 $padding-vertical $padding-horizontal; + } + + .form-control{ + padding: $padding-vertical $padding-horizontal; + + & + .input-group-prepend .input-group-text, + & + .input-group-append .input-group-text{ + padding: $padding-vertical $padding-horizontal $padding-vertical 0; + } + } + } + + .form-group.form-control-lg, + .input-group.form-control-lg{ + .form-control{ + padding: $padding-vertical - 1 $padding-horizontal - 1; + + & + .input-group-prepend .input-group-text, + & + .input-group-append .input-group-text{ + padding: $padding-vertical - 1 $padding-horizontal - 1 $padding-vertical - 1 0; + } + } + + .input-group-prepend .input-group-text, + .input-group-append .input-group-text{ + padding: $padding-vertical - 1 0 $padding-vertical $padding-horizontal - 1; + + & + .form-control{ + padding: $padding-vertical $padding-horizontal - 1 $padding-vertical $padding-horizontal - 3; + } + } + } +} + + + +@mixin input-base-padding($padding-vertical, $padding-horizontal) { + .form-group.no-border, + .input-group.no-border{ + .form-control{ + padding: $padding-vertical $padding-horizontal; + + & + .input-group-prepend .input-group-text, + & + .input-group-append .input-group-text{ + padding: $padding-vertical $padding-horizontal $padding-vertical 0; + } + } + + .input-group-prepend .input-group-text, + .input-group-append .input-group-text{ + padding: $padding-vertical 0 $padding-vertical $padding-horizontal; + } + } + + .form-group, + .input-group{ + .form-control{ + padding: $padding-vertical - 1 $padding-horizontal - 1 $padding-vertical - 1 $padding-horizontal - 1; + + & + .input-group-prepend .input-group-text, + & + .input-group-append .input-group-text{ + padding: $padding-vertical - 1 $padding-horizontal - 1 $padding-vertical - 1 0; + } + } + + .input-group-prepend .input-group-text, + .input-group-append .input-group-text{ + padding: $padding-vertical - 1 0 $padding-vertical - 1 $padding-horizontal - 1; + + & + .form-control, + & ~ .form-control{ + padding:$padding-vertical - 1 $padding-horizontal $padding-vertical $padding-horizontal - 3; + } + } + } +} + + +//color1 = $opacity-5 +//color2 = $opacity-8 +//color3 = $white-color +//color4 = $transparent-bg +//color5 = $opacity-1 +//color6 = $opacity-2 + + +@mixin input-coloured-bg($color1, $color2, $color3, $color4, $color5, $color6) { + @include form-control-placeholder(darken($color2, 8%), 1); + + .form-control{ + border-color: $color1; + color: $color2; + + &:focus{ + border-color: $color3; + background-color: $color4; + color: $color3; + } + } + + .has-success, + .has-danger{ + &:after{ + color: $color3; + } + } + + .has-danger{ + .form-control{ + background-color: $color4; + } + } + + .input-group-prepend .input-group-text, + .input-group-append .input-group-text{ + background-color: $color4; + border-color: $color1; + color: $color2; + } + + .input-group-focus{ + .input-group-prepend .input-group-text, + .input-group-append .input-group-text{ + background-color: $color4; + border-color: $color3; + color: $color3; + } + } + + .form-group.no-border, + .input-group.no-border{ + .form-control{ + background-color: $color5; + color: $color2; + + &:focus, + &:active, + &:active{ + background-color: $color6; + color: $color3; + } + } + + .form-control + .input-group-prepend .input-group-text, + .form-control + .input-group-append .input-group-text{ + background-color: $color5; + + &:focus, + &:active, + &:active{ + background-color: $color6; + color: $color3; + } + } + + .form-control{ + &:focus{ + & + .input-group-prepend .input-group-text, + & + .input-group-append .input-group-text{ + background-color: $color6; + color: $color3; + } + } + } + + .input-group-prepend .input-group-text, + .input-group-append .input-group-text{ + background-color: $color5; + border: none; + color: $color2; + } + + &.input-group-focus{ + .input-group-prepend .input-group-text, + .input-group-append .input-group-text{ + background-color: $color6; + color: $color3; + } + } + } +} + +@mixin transition-input-focus-color() { + -webkit-transition: color 0.3s ease-in-out, border-color 0.3s ease-in-out, background-color 0.3s ease-in-out; + -moz-transition: color 0.3s ease-in-out, border-color 0.3s ease-in-out, background-color 0.3s ease-in-out; + -o-transition: color 0.3s ease-in-out, border-color 0.3s ease-in-out, background-color 0.3s ease-in-out; + -ms-transition: color 0.3s ease-in-out, border-color 0.3s ease-in-out, background-color 0.3s ease-in-out; + transition: color 0.3s ease-in-out, border-color 0.3s ease-in-out, background-color 0.3s ease-in-out; +} diff --git a/explorer/public/paper-dashboard/assets/scss/paper-dashboard/mixins/_page-header.scss b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/mixins/_page-header.scss new file mode 100644 index 00000000000..713dfd365c9 --- /dev/null +++ b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/mixins/_page-header.scss @@ -0,0 +1,7 @@ +@mixin linear-gradient($color1, $color2){ + background: $color1; /* For browsers that do not support gradients */ + background: -webkit-linear-gradient(90deg, $color1 , $color2); /* For Safari 5.1 to 6.0 */ + background: -o-linear-gradient(90deg, $color1, $color2); /* For Opera 11.1 to 12.0 */ + background: -moz-linear-gradient(90deg, $color1, $color2); /* For Firefox 3.6 to 15 */ + background: linear-gradient(0deg, $color1 , $color2); /* Standard syntax */ +} diff --git a/explorer/public/paper-dashboard/assets/scss/paper-dashboard/mixins/_transparency.scss b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/mixins/_transparency.scss new file mode 100644 index 00000000000..df088adfe91 --- /dev/null +++ b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/mixins/_transparency.scss @@ -0,0 +1,8 @@ +// Opacity + +@mixin opacity($opacity) { + opacity: $opacity; + // IE8 filter + $opacity-ie: ($opacity * 100); + filter: #{alpha(opacity=$opacity-ie)}; +} diff --git a/explorer/public/paper-dashboard/assets/scss/paper-dashboard/mixins/_vendor-prefixes.scss b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/mixins/_vendor-prefixes.scss new file mode 100644 index 00000000000..7c3e0d20455 --- /dev/null +++ b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/mixins/_vendor-prefixes.scss @@ -0,0 +1,228 @@ +@mixin box-shadow($shadow...) { + -webkit-box-shadow: $shadow; // iOS <4.3 & Android <4.1 + box-shadow: $shadow; +} + +@mixin transition($time, $type){ + -webkit-transition: all $time $type; + -moz-transition: all $time $type; + -o-transition: all $time $type; + -ms-transition: all $time $type; + transition: all $time $type; +} + + +@mixin sidebar-color($color){ + &:after{ + background: $color; + } +} + +@mixin bar-animation($type){ + -webkit-animation: $type 500ms linear 0s; + -moz-animation: $type 500ms linear 0s; + animation: $type 500ms 0s; + -webkit-animation-fill-mode: forwards; + -moz-animation-fill-mode: forwards; + animation-fill-mode: forwards; +} + +@mixin sidebar-active-color($font-color){ + .nav { + li { + &.active > a, + &.active > a i, + &.active > a[data-toggle="collapse"], + &.active > a[data-toggle="collapse"] i, + &.active > a[data-toggle="collapse"] ~ div > ul > li.active .sidebar-mini-icon, + &.active > a[data-toggle="collapse"] ~ div > ul > li.active > a { + color: $font-color; + opacity: 1; + } + } + } +} + +@mixin transition-opacity($time, $type){ + -webkit-transition: opacity $time $type; + -moz-transition: opacity $time $type; + -o-transition: opacity $time $type; + -ms-transition: opacity $time $type; + transition: opacity $time $type; +} + +@mixin transform-translate-y-dropdown($value) { + -webkit-transform: translate3d(-20px,$value,0) !important; + -moz-transform: translate3d(-20px,$value,0) !important; + -o-transform: translate3d(-20px,$value,0) !important; + -ms-transform: translate3d(-20px,$value,0) !important; + transform: translate3d(-20px,$value,0) !important; +} + +@mixin transform-translate-x($value){ + -webkit-transform: translate3d($value, 0, 0); + -moz-transform: translate3d($value, 0, 0); + -o-transform: translate3d($value, 0, 0); + -ms-transform: translate3d($value, 0, 0); + transform: translate3d($value, 0, 0); +} + +@mixin transform-translate-y($value){ + -webkit-transform: translate3d(0,$value,0) !important; + -moz-transform: translate3d(0,$value,0) !important; + -o-transform: translate3d(0,$value,0) !important; + -ms-transform: translate3d(0,$value,0) !important; + transform: translate3d(0,$value,0) !important; +} + +@mixin transform-translate-y-fixed-plugin($value){ + -webkit-transform: translate3d(0,$value,0) !important; + -moz-transform: translate3d(0,$value,0) !important; + -o-transform: translate3d(0,$value,0) !important; + -ms-transform: translate3d(0,$value,0) !important; + transform: translate3d(0,$value,0) !important; +} + +@mixin icon-gradient($color, $bottomColor: #000){ + background: $color; + background: -webkit-linear-gradient($color 0%, $bottomColor 80%); + background: -o-linear-gradient($color 0%, $bottomColor 80%); + background: -moz-linear-gradient($color 0%, $bottomColor 80%); + background: linear-gradient($color 0%, $bottomColor 80%); +} + +@mixin topbar-x-rotation(){ + @keyframes topbar-x { + 0% {top: 0px; transform: rotate(0deg); } + 45% {top: 6px; transform: rotate(145deg); } + 75% {transform: rotate(130deg); } + 100% {transform: rotate(135deg); } + } + @-webkit-keyframes topbar-x { + 0% {top: 0px; -webkit-transform: rotate(0deg); } + 45% {top: 6px; -webkit-transform: rotate(145deg); } + 75% {-webkit-transform: rotate(130deg); } + 100% { -webkit-transform: rotate(135deg); } + } + @-moz-keyframes topbar-x { + 0% {top: 0px; -moz-transform: rotate(0deg); } + 45% {top: 6px; -moz-transform: rotate(145deg); } + 75% {-moz-transform: rotate(130deg); } + 100% { -moz-transform: rotate(135deg); } + } +} + + +@mixin topbar-back-rotation(){ + @keyframes topbar-back { + 0% { top: 6px; transform: rotate(135deg); } + 45% { transform: rotate(-10deg); } + 75% { transform: rotate(5deg); } + 100% { top: 0px; transform: rotate(0); } + } + + @-webkit-keyframes topbar-back { + 0% { top: 6px; -webkit-transform: rotate(135deg); } + 45% { -webkit-transform: rotate(-10deg); } + 75% { -webkit-transform: rotate(5deg); } + 100% { top: 0px; -webkit-transform: rotate(0); } + } + + @-moz-keyframes topbar-back { + 0% { top: 6px; -moz-transform: rotate(135deg); } + 45% { -moz-transform: rotate(-10deg); } + 75% { -moz-transform: rotate(5deg); } + 100% { top: 0px; -moz-transform: rotate(0); } + } +} + +@mixin bottombar-x-rotation(){ + @keyframes bottombar-x { + 0% {bottom: 0px; transform: rotate(0deg);} + 45% {bottom: 6px; transform: rotate(-145deg);} + 75% {transform: rotate(-130deg);} + 100% {transform: rotate(-135deg);} + } + @-webkit-keyframes bottombar-x { + 0% {bottom: 0px; -webkit-transform: rotate(0deg);} + 45% {bottom: 6px; -webkit-transform: rotate(-145deg);} + 75% {-webkit-transform: rotate(-130deg);} + 100% {-webkit-transform: rotate(-135deg);} + } + @-moz-keyframes bottombar-x { + 0% {bottom: 0px; -moz-transform: rotate(0deg);} + 45% {bottom: 6px; -moz-transform: rotate(-145deg);} + 75% {-moz-transform: rotate(-130deg);} + 100% {-moz-transform: rotate(-135deg);} + } +} + +@mixin bottombar-back-rotation{ + @keyframes bottombar-back { + 0% { bottom: 6px;transform: rotate(-135deg);} + 45% { transform: rotate(10deg);} + 75% { transform: rotate(-5deg);} + 100% { bottom: 0px;transform: rotate(0);} + } + @-webkit-keyframes bottombar-back { + 0% {bottom: 6px;-webkit-transform: rotate(-135deg);} + 45% {-webkit-transform: rotate(10deg);} + 75% {-webkit-transform: rotate(-5deg);} + 100% {bottom: 0px;-webkit-transform: rotate(0);} + } + @-moz-keyframes bottombar-back { + 0% {bottom: 6px;-moz-transform: rotate(-135deg);} + 45% {-moz-transform: rotate(10deg);} + 75% {-moz-transform: rotate(-5deg);} + 100% {bottom: 0px;-moz-transform: rotate(0);} + } + +} + +@mixin sidebar-text-color($text-color){ + .nav { + li { + a, + a i, + a[data-toggle="collapse"], + a[data-toggle="collapse"] i, + a[data-toggle="collapse"] ~ div > ul > li .sidebar-mini-icon, + a[data-toggle="collapse"] ~ div > ul > li > a { + color: $text-color; + opacity: .7; + } + + &:hover:not(.active) > a, + &:focus:not(.active) > a { + opacity: 1; + } + } + } + + .logo { + .simple-text { + color: $text-color; + } + &:after { + background-color: $text-color; + opacity: .4; + } + } + + .user { + .info a span, + .nav .sidebar-mini-icon, + .nav .sidebar-normal { + color: $text-color !important; + } + &:after { + background-color: $text-color; + opacity: .4; + } + } +} + +@mixin badge-color($color) { + border-color: $color; + background-color: $color; +} diff --git a/explorer/public/paper-dashboard/assets/scss/paper-dashboard/plugins/_plugin-animate-bootstrap-notify.scss b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/plugins/_plugin-animate-bootstrap-notify.scss new file mode 100644 index 00000000000..387d1521ff7 --- /dev/null +++ b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/plugins/_plugin-animate-bootstrap-notify.scss @@ -0,0 +1,227 @@ + + + + + + + + + + + + + + + + +// This file was modified by Creative Tim to keep only the animation that we need for Bootstrap Notify + + + + + + + + + + + + + + + +@charset "UTF-8"; + +/*! +Animate.css - http://daneden.me/animate +Licensed under the MIT license - http://opensource.org/licenses/MIT + +Copyright (c) 2015 Daniel Eden +*/ + +.animated { + -webkit-animation-duration: 1s; + animation-duration: 1s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} + +.animated.infinite { + -webkit-animation-iteration-count: infinite; + animation-iteration-count: infinite; +} + +.animated.hinge { + -webkit-animation-duration: 2s; + animation-duration: 2s; +} + +.animated.bounceIn, +.animated.bounceOut { + -webkit-animation-duration: .75s; + animation-duration: .75s; +} + +.animated.flipOutX, +.animated.flipOutY { + -webkit-animation-duration: .75s; + animation-duration: .75s; +} + +@-webkit-keyframes shake { + from, to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 10%, 30%, 50%, 70%, 90% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + } + + 20%, 40%, 60%, 80% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0); + } +} + +@keyframes shake { + from, to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 10%, 30%, 50%, 70%, 90% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + } + + 20%, 40%, 60%, 80% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0); + } +} + +.shake { + -webkit-animation-name: shake; + animation-name: shake; +} + + + +@-webkit-keyframes fadeInDown { + from { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInDown { + from { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInDown { + -webkit-animation-name: fadeInDown; + animation-name: fadeInDown; +} + + +@-webkit-keyframes fadeOut { + from { + opacity: 1; + } + + to { + opacity: 0; + } +} + +@keyframes fadeOut { + from { + opacity: 1; + } + + to { + opacity: 0; + } +} + +.fadeOut { + -webkit-animation-name: fadeOut; + animation-name: fadeOut; +} + +@-webkit-keyframes fadeOutDown { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +@keyframes fadeOutDown { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +.fadeOutDown { + -webkit-animation-name: fadeOutDown; + animation-name: fadeOutDown; +} + +@-webkit-keyframes fadeOutUp { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +@keyframes fadeOutUp { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +.fadeOutUp { + -webkit-animation-name: fadeOutUp; + animation-name: fadeOutUp; +} diff --git a/explorer/public/paper-dashboard/assets/scss/paper-dashboard/plugins/_plugin-perfect-scrollbar.scss b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/plugins/_plugin-perfect-scrollbar.scss new file mode 100644 index 00000000000..dbae094635c --- /dev/null +++ b/explorer/public/paper-dashboard/assets/scss/paper-dashboard/plugins/_plugin-perfect-scrollbar.scss @@ -0,0 +1,113 @@ +/* perfect-scrollbar v0.6.13 */ +.ps-container { + -ms-touch-action: auto; + touch-action: auto; + overflow: hidden !important; + -ms-overflow-style: none; } + @supports (-ms-overflow-style: none) { + .ps-container { + overflow: auto !important; } } + @media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .ps-container { + overflow: auto !important; } } + .ps-container.ps-active-x > .ps-scrollbar-x-rail, + .ps-container.ps-active-y > .ps-scrollbar-y-rail { + display: block; + background-color: transparent; } + .ps-container.ps-in-scrolling.ps-x > .ps-scrollbar-x-rail { + background-color: #eee; + opacity: 0.9; } + .ps-container.ps-in-scrolling.ps-x > .ps-scrollbar-x-rail > .ps-scrollbar-x { + background-color: #999; + height: 11px; } + .ps-container.ps-in-scrolling.ps-y > .ps-scrollbar-y-rail { + background-color: #eee; + opacity: 0.9; } + .ps-container.ps-in-scrolling.ps-y > .ps-scrollbar-y-rail > .ps-scrollbar-y { + background-color: #999; + width: 11px; } + .ps-container > .ps-scrollbar-x-rail { + display: none; + position: absolute; + /* please don't change 'position' */ + opacity: 0; + -webkit-transition: background-color .2s linear, opacity .2s linear; + -o-transition: background-color .2s linear, opacity .2s linear; + -moz-transition: background-color .2s linear, opacity .2s linear; + transition: background-color .2s linear, opacity .2s linear; + bottom: 0px; + /* there must be 'bottom' for ps-scrollbar-x-rail */ + height: 15px; } + .ps-container > .ps-scrollbar-x-rail > .ps-scrollbar-x { + position: absolute; + /* please don't change 'position' */ + background-color: #aaa; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-transition: background-color .2s linear, height .2s linear, width .2s ease-in-out, -webkit-border-radius .2s ease-in-out; + transition: background-color .2s linear, height .2s linear, width .2s ease-in-out, -webkit-border-radius .2s ease-in-out; + -o-transition: background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out; + -moz-transition: background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out, -moz-border-radius .2s ease-in-out; + transition: background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out; + transition: background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out, -webkit-border-radius .2s ease-in-out, -moz-border-radius .2s ease-in-out; + bottom: 2px; + /* there must be 'bottom' for ps-scrollbar-x */ + height: 6px; } + .ps-container > .ps-scrollbar-x-rail:hover > .ps-scrollbar-x, .ps-container > .ps-scrollbar-x-rail:active > .ps-scrollbar-x { + height: 11px; } + .ps-container > .ps-scrollbar-y-rail { + display: none; + position: absolute; + /* please don't change 'position' */ + opacity: 0; + -webkit-transition: background-color .2s linear, opacity .2s linear; + -o-transition: background-color .2s linear, opacity .2s linear; + -moz-transition: background-color .2s linear, opacity .2s linear; + transition: background-color .2s linear, opacity .2s linear; + right: 0; + /* there must be 'right' for ps-scrollbar-y-rail */ + width: 15px; } + .ps-container > .ps-scrollbar-y-rail > .ps-scrollbar-y { + position: absolute; + /* please don't change 'position' */ + background-color: #aaa; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-transition: background-color .2s linear, height .2s linear, width .2s ease-in-out, -webkit-border-radius .2s ease-in-out; + transition: background-color .2s linear, height .2s linear, width .2s ease-in-out, -webkit-border-radius .2s ease-in-out; + -o-transition: background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out; + -moz-transition: background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out, -moz-border-radius .2s ease-in-out; + transition: background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out; + transition: background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out, -webkit-border-radius .2s ease-in-out, -moz-border-radius .2s ease-in-out; + right: 2px; + /* there must be 'right' for ps-scrollbar-y */ + width: 6px; } + .ps-container > .ps-scrollbar-y-rail:hover > .ps-scrollbar-y, .ps-container > .ps-scrollbar-y-rail:active > .ps-scrollbar-y { + width: 11px; } + .ps-container:hover.ps-in-scrolling.ps-x > .ps-scrollbar-x-rail { + background-color: #eee; + opacity: 0.9; } + .ps-container:hover.ps-in-scrolling.ps-x > .ps-scrollbar-x-rail > .ps-scrollbar-x { + background-color: #999; + height: 11px; } + .ps-container:hover.ps-in-scrolling.ps-y > .ps-scrollbar-y-rail { + background-color: #eee; + opacity: 0.9; } + .ps-container:hover.ps-in-scrolling.ps-y > .ps-scrollbar-y-rail > .ps-scrollbar-y { + background-color: #999; + width: 11px; } + .ps-container:hover > .ps-scrollbar-x-rail, + .ps-container:hover > .ps-scrollbar-y-rail { + opacity: 0.6; } + .ps-container:hover > .ps-scrollbar-x-rail:hover { + background-color: #eee; + opacity: 0.9; } + .ps-container:hover > .ps-scrollbar-x-rail:hover > .ps-scrollbar-x { + background-color: #999; } + .ps-container:hover > .ps-scrollbar-y-rail:hover { + background-color: #eee; + opacity: 0.9; } + .ps-container:hover > .ps-scrollbar-y-rail:hover > .ps-scrollbar-y { + background-color: #999; } diff --git a/explorer/public/paper-dashboard/docs/documentation.html b/explorer/public/paper-dashboard/docs/documentation.html new file mode 100644 index 00000000000..582032f8da4 --- /dev/null +++ b/explorer/public/paper-dashboard/docs/documentation.html @@ -0,0 +1,130 @@ +<!-- +========================================================= + Paper Dashboard 2 - v2.0.0 +========================================================= + + Product Page: https://www.creative-tim.com/product/paper-dashboard-2 + Copyright 2019 Creative Tim (https://www.creative-tim.com) + Licensed under MIT (https://github.com/creativetimofficial/paper-dashboard/blob/master/LICENSE) + + Coded by Creative Tim + +========================================================= + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. --> + + + +<!DOCTYPE html> +<html lang="en"> + +<head> + <meta charset="utf-8" /> + <link rel="apple-touch-icon" sizes="76x76" href="../assets/img/apple-icon.png"> + <link rel="icon" type="image/png" href="../assets/img/favicon.png"> + <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> + <title> + Components Documentation - Paper Dashboard 2 by Creative Tim + </title> + <meta content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0, shrink-to-fit=no' name='viewport' /> + <!-- Fonts and icons --> + <link href="https://fonts.googleapis.com/css?family=Montserrat:400,700,200" rel="stylesheet" /> + <link href="https://maxcdn.bootstrapcdn.com/font-awesome/latest/css/font-awesome.min.css" rel="stylesheet"> + <!-- CSS Files --> + <link href="../assets/css/bootstrap.min.css" rel="stylesheet" /> + <link href="../assets/css/paper-dashboard.css?v=2.0.0" rel="stylesheet" /> + <!-- CSS Just for demo purpose, don't include it in your project --> + <link href="../assets/demo/demo.css" rel="stylesheet" /> +</head> + +<body class="offline-doc"> + <!-- Navbar --> + <nav class="navbar navbar-expand-lg navbar-absolute fixed-top navbar-transparent"> + <div class="container"> + <div class="navbar-wrapper"> + <div class="navbar-toggle"> + <button type="button" class="navbar-toggler"> + <span class="navbar-toggler-bar bar1"></span> + <span class="navbar-toggler-bar bar2"></span> + <span class="navbar-toggler-bar bar3"></span> + </button> + </div> + <a class="navbar-brand" href="#pablo">Paper Dashboard 2</a> + </div> + <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navigation" aria-controls="navigation-index" aria-expanded="false" aria-label="Toggle navigation"> + <span class="navbar-toggler-bar navbar-kebab"></span> + <span class="navbar-toggler-bar navbar-kebab"></span> + <span class="navbar-toggler-bar navbar-kebab"></span> + </button> + <div class="collapse navbar-collapse justify-content-end" id="navigation"> + <ul class="navbar-nav"> + <li class="nav-item"> + <a class="nav-link" href="https://github.com/creativetimofficial/paper-dashboard/issues" target="_blank"> + Have an issue? + </a> + </li> + </ul> + </div> + </div> + </nav> + <!-- End Navbar --> + <div class="page-header clear-filter"> + <div class="page-header-image" style="background-image: url('../assets/img/jan-sendereks.jpg');"></div> + <div class="container text-center"> + <div class="col-md-8 ml-auto mr-auto"> + <div class="brand"> + <h1 class="title"> + Paper Dashboard 2 + </h1> + <h3 class="description">Documentation v2.0.0</h3> + <br/> + <a href="https://creativetimofficial.github.io/paper-dashboard/docs/1.0/getting-started/introduction.html" class="btn btn-primary btn-round btn-lg">View documentation</a> + </div> + </div> + </div> + </div> + <footer class="footer footer-black footer-white "> + <div class="container-fluid"> + <div class="row"> + <nav class="footer-nav"> + <ul> + <li> + <a href="https://www.creative-tim.com" target="_blank">Creative Tim</a> + </li> + <li> + <a href="http://blog.creative-tim.com/" target="_blank">Blog</a> + </li> + <li> + <a href="https://www.creative-tim.com/license" target="_blank">Licenses</a> + </li> + </ul> + </nav> + <div class="credits ml-auto"> + <span class="copyright"> + © + <script> + document.write(new Date().getFullYear()) + </script>, made with <i class="fa fa-heart heart"></i> by Creative Tim + </span> + </div> + </div> + </div> + </footer> + <!-- Core JS Files --> + <script src="../assets/js/core/jquery.min.js"></script> + <script src="../assets/js/core/popper.min.js"></script> + <script src="../assets/js/core/bootstrap.min.js"></script> + <script src="../assets/js/plugins/perfect-scrollbar.jquery.min.js"></script> + <!-- Google Maps Plugin --> + <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_KEY_HERE"></script> + <!-- Chart JS --> + <script src="../assets/js/plugins/chartjs.min.js"></script> + <!-- Notifications Plugin --> + <script src="../assets/js/plugins/bootstrap-notify.js"></script> + <!-- Control Center for Now Ui Dashboard: parallax effects, scripts for the example pages etc --> + <script src="../assets/js/paper-dashboard.min.js?v=2.0.0" type="text/javascript"></script> + <!-- Paper Dashboard DEMO methods, don't include it in your project! --> + <script src="../assets/demo/demo.js"></script> +</body> + +</html> diff --git a/explorer/public/paper-dashboard/examples/dashboard.html b/explorer/public/paper-dashboard/examples/dashboard.html new file mode 100644 index 00000000000..c2efeac9c80 --- /dev/null +++ b/explorer/public/paper-dashboard/examples/dashboard.html @@ -0,0 +1,408 @@ +<!-- +========================================================= + Paper Dashboard 2 - v2.0.0 +========================================================= + + Product Page: https://www.creative-tim.com/product/paper-dashboard-2 + Copyright 2019 Creative Tim (https://www.creative-tim.com) + Licensed under MIT (https://github.com/creativetimofficial/paper-dashboard/blob/master/LICENSE) + + Coded by Creative Tim + +========================================================= + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. --> + + + +<!DOCTYPE html> +<html lang="en"> + +<head> + <meta charset="utf-8" /> + <link rel="apple-touch-icon" sizes="76x76" href="../assets/img/apple-icon.png"> + <link rel="icon" type="image/png" href="../assets/img/favicon.png"> + <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> + <title> + Paper Dashboard 2 by Creative Tim + </title> + <meta content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0, shrink-to-fit=no' name='viewport' /> + <!-- Fonts and icons --> + <link href="https://fonts.googleapis.com/css?family=Montserrat:400,700,200" rel="stylesheet" /> + <link href="https://maxcdn.bootstrapcdn.com/font-awesome/latest/css/font-awesome.min.css" rel="stylesheet"> + <!-- CSS Files --> + <link href="../assets/css/bootstrap.min.css" rel="stylesheet" /> + <link href="../assets/css/paper-dashboard.css?v=2.0.0" rel="stylesheet" /> + <!-- CSS Just for demo purpose, don't include it in your project --> + <link href="../assets/demo/demo.css" rel="stylesheet" /> +</head> + +<body class=""> + <div class="wrapper "> + <div class="sidebar" data-color="white" data-active-color="danger"> + <!-- + Tip 1: You can change the color of the sidebar using: data-color="blue | green | orange | red | yellow" + --> + <div class="logo"> + <a href="http://www.creative-tim.com" class="simple-text logo-mini"> + <div class="logo-image-small"> + <img src="../assets/img/logo-small.png"> + </div> + </a> + <a href="http://www.creative-tim.com" class="simple-text logo-normal"> + Creative Tim + <!-- <div class="logo-image-big"> + <img src="../assets/img/logo-big.png"> + </div> --> + </a> + </div> + <div class="sidebar-wrapper"> + <ul class="nav"> + <li class="active "> + <a href="./dashboard.html"> + <i class="nc-icon nc-bank"></i> + <p>Dashboard</p> + </a> + </li> + <li> + <a href="./icons.html"> + <i class="nc-icon nc-diamond"></i> + <p>Icons</p> + </a> + </li> + <li> + <a href="./map.html"> + <i class="nc-icon nc-pin-3"></i> + <p>Maps</p> + </a> + </li> + <li> + <a href="./notifications.html"> + <i class="nc-icon nc-bell-55"></i> + <p>Notifications</p> + </a> + </li> + <li> + <a href="./user.html"> + <i class="nc-icon nc-single-02"></i> + <p>User Profile</p> + </a> + </li> + <li> + <a href="./tables.html"> + <i class="nc-icon nc-tile-56"></i> + <p>Table List</p> + </a> + </li> + <li> + <a href="./typography.html"> + <i class="nc-icon nc-caps-small"></i> + <p>Typography</p> + </a> + </li> + <li class="active-pro"> + <a href="./upgrade.html"> + <i class="nc-icon nc-spaceship"></i> + <p>Upgrade to PRO</p> + </a> + </li> + </ul> + </div> + </div> + <div class="main-panel"> + <!-- Navbar --> + <nav class="navbar navbar-expand-lg navbar-absolute fixed-top navbar-transparent"> + <div class="container-fluid"> + <div class="navbar-wrapper"> + <div class="navbar-toggle"> + <button type="button" class="navbar-toggler"> + <span class="navbar-toggler-bar bar1"></span> + <span class="navbar-toggler-bar bar2"></span> + <span class="navbar-toggler-bar bar3"></span> + </button> + </div> + <a class="navbar-brand" href="#pablo">Paper Dashboard 2</a> + </div> + <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navigation" aria-controls="navigation-index" aria-expanded="false" aria-label="Toggle navigation"> + <span class="navbar-toggler-bar navbar-kebab"></span> + <span class="navbar-toggler-bar navbar-kebab"></span> + <span class="navbar-toggler-bar navbar-kebab"></span> + </button> + <div class="collapse navbar-collapse justify-content-end" id="navigation"> + <form> + <div class="input-group no-border"> + <input type="text" value="" class="form-control" placeholder="Search..."> + <div class="input-group-append"> + <div class="input-group-text"> + <i class="nc-icon nc-zoom-split"></i> + </div> + </div> + </div> + </form> + <ul class="navbar-nav"> + <li class="nav-item"> + <a class="nav-link btn-magnify" href="#pablo"> + <i class="nc-icon nc-layout-11"></i> + <p> + <span class="d-lg-none d-md-block">Stats</span> + </p> + </a> + </li> + <li class="nav-item btn-rotate dropdown"> + <a class="nav-link dropdown-toggle" href="http://example.com" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> + <i class="nc-icon nc-bell-55"></i> + <p> + <span class="d-lg-none d-md-block">Some Actions</span> + </p> + </a> + <div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdownMenuLink"> + <a class="dropdown-item" href="#">Action</a> + <a class="dropdown-item" href="#">Another action</a> + <a class="dropdown-item" href="#">Something else here</a> + </div> + </li> + <li class="nav-item"> + <a class="nav-link btn-rotate" href="#pablo"> + <i class="nc-icon nc-settings-gear-65"></i> + <p> + <span class="d-lg-none d-md-block">Account</span> + </p> + </a> + </li> + </ul> + </div> + </div> + </nav> + <!-- End Navbar --> + <!-- <div class="panel-header panel-header-lg"> + + <canvas id="bigDashboardChart"></canvas> + + +</div> --> + <div class="content"> + <div class="row"> + <div class="col-lg-3 col-md-6 col-sm-6"> + <div class="card card-stats"> + <div class="card-body "> + <div class="row"> + <div class="col-5 col-md-4"> + <div class="icon-big text-center icon-warning"> + <i class="nc-icon nc-globe text-warning"></i> + </div> + </div> + <div class="col-7 col-md-8"> + <div class="numbers"> + <p class="card-category">Capacity</p> + <p class="card-title">150GB + <p> + </div> + </div> + </div> + </div> + <div class="card-footer "> + <hr> + <div class="stats"> + <i class="fa fa-refresh"></i> Update Now + </div> + </div> + </div> + </div> + <div class="col-lg-3 col-md-6 col-sm-6"> + <div class="card card-stats"> + <div class="card-body "> + <div class="row"> + <div class="col-5 col-md-4"> + <div class="icon-big text-center icon-warning"> + <i class="nc-icon nc-money-coins text-success"></i> + </div> + </div> + <div class="col-7 col-md-8"> + <div class="numbers"> + <p class="card-category">Revenue</p> + <p class="card-title">$ 1,345 + <p> + </div> + </div> + </div> + </div> + <div class="card-footer "> + <hr> + <div class="stats"> + <i class="fa fa-calendar-o"></i> Last day + </div> + </div> + </div> + </div> + <div class="col-lg-3 col-md-6 col-sm-6"> + <div class="card card-stats"> + <div class="card-body "> + <div class="row"> + <div class="col-5 col-md-4"> + <div class="icon-big text-center icon-warning"> + <i class="nc-icon nc-vector text-danger"></i> + </div> + </div> + <div class="col-7 col-md-8"> + <div class="numbers"> + <p class="card-category">Errors</p> + <p class="card-title">23 + <p> + </div> + </div> + </div> + </div> + <div class="card-footer "> + <hr> + <div class="stats"> + <i class="fa fa-clock-o"></i> In the last hour + </div> + </div> + </div> + </div> + <div class="col-lg-3 col-md-6 col-sm-6"> + <div class="card card-stats"> + <div class="card-body "> + <div class="row"> + <div class="col-5 col-md-4"> + <div class="icon-big text-center icon-warning"> + <i class="nc-icon nc-favourite-28 text-primary"></i> + </div> + </div> + <div class="col-7 col-md-8"> + <div class="numbers"> + <p class="card-category">Followers</p> + <p class="card-title">+45K + <p> + </div> + </div> + </div> + </div> + <div class="card-footer "> + <hr> + <div class="stats"> + <i class="fa fa-refresh"></i> Update now + </div> + </div> + </div> + </div> + </div> + <div class="row"> + <div class="col-md-12"> + <div class="card "> + <div class="card-header "> + <h5 class="card-title">Users Behavior</h5> + <p class="card-category">24 Hours performance</p> + </div> + <div class="card-body "> + <canvas id=chartHours width="400" height="100"></canvas> + </div> + <div class="card-footer "> + <hr> + <div class="stats"> + <i class="fa fa-history"></i> Updated 3 minutes ago + </div> + </div> + </div> + </div> + </div> + <div class="row"> + <div class="col-md-4"> + <div class="card "> + <div class="card-header "> + <h5 class="card-title">Email Statistics</h5> + <p class="card-category">Last Campaign Performance</p> + </div> + <div class="card-body "> + <canvas id="chartEmail"></canvas> + </div> + <div class="card-footer "> + <div class="legend"> + <i class="fa fa-circle text-primary"></i> Opened + <i class="fa fa-circle text-warning"></i> Read + <i class="fa fa-circle text-danger"></i> Deleted + <i class="fa fa-circle text-gray"></i> Unopened + </div> + <hr> + <div class="stats"> + <i class="fa fa-calendar"></i> Number of emails sent + </div> + </div> + </div> + </div> + <div class="col-md-8"> + <div class="card card-chart"> + <div class="card-header"> + <h5 class="card-title">NASDAQ: AAPL</h5> + <p class="card-category">Line Chart with Points</p> + </div> + <div class="card-body"> + <canvas id="speedChart" width="400" height="100"></canvas> + </div> + <div class="card-footer"> + <div class="chart-legend"> + <i class="fa fa-circle text-info"></i> Tesla Model S + <i class="fa fa-circle text-warning"></i> BMW 5 Series + </div> + <hr/> + <div class="card-stats"> + <i class="fa fa-check"></i> Data information certified + </div> + </div> + </div> + </div> + </div> + </div> + <footer class="footer footer-black footer-white "> + <div class="container-fluid"> + <div class="row"> + <nav class="footer-nav"> + <ul> + <li> + <a href="https://www.creative-tim.com" target="_blank">Creative Tim</a> + </li> + <li> + <a href="http://blog.creative-tim.com/" target="_blank">Blog</a> + </li> + <li> + <a href="https://www.creative-tim.com/license" target="_blank">Licenses</a> + </li> + </ul> + </nav> + <div class="credits ml-auto"> + <span class="copyright"> + © + <script> + document.write(new Date().getFullYear()) + </script>, made with <i class="fa fa-heart heart"></i> by Creative Tim + </span> + </div> + </div> + </div> + </footer> + </div> + </div> + <!-- Core JS Files --> + <script src="../assets/js/core/jquery.min.js"></script> + <script src="../assets/js/core/popper.min.js"></script> + <script src="../assets/js/core/bootstrap.min.js"></script> + <script src="../assets/js/plugins/perfect-scrollbar.jquery.min.js"></script> + <!-- Google Maps Plugin --> + <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_KEY_HERE"></script> + <!-- Chart JS --> + <script src="../assets/js/plugins/chartjs.min.js"></script> + <!-- Notifications Plugin --> + <script src="../assets/js/plugins/bootstrap-notify.js"></script> + <!-- Control Center for Now Ui Dashboard: parallax effects, scripts for the example pages etc --> + <script src="../assets/js/paper-dashboard.min.js?v=2.0.0" type="text/javascript"></script> + <!-- Paper Dashboard DEMO methods, don't include it in your project! --> + <script src="../assets/demo/demo.js"></script> + <script> + $(document).ready(function() { + // Javascript method's body can be found in assets/assets-for-demo/js/demo.js + demo.initChartsPages(); + }); + </script> +</body> + +</html> diff --git a/explorer/public/paper-dashboard/examples/icons.html b/explorer/public/paper-dashboard/examples/icons.html new file mode 100644 index 00000000000..cd6d0523d91 --- /dev/null +++ b/explorer/public/paper-dashboard/examples/icons.html @@ -0,0 +1,696 @@ +<!-- +========================================================= + Paper Dashboard 2 - v2.0.0 +========================================================= + + Product Page: https://www.creative-tim.com/product/paper-dashboard-2 + Copyright 2019 Creative Tim (https://www.creative-tim.com) + Licensed under MIT (https://github.com/creativetimofficial/paper-dashboard/blob/master/LICENSE) + + Coded by Creative Tim + +========================================================= + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. --> + + + +<!DOCTYPE html> +<html lang="en"> + +<head> + <meta charset="utf-8" /> + <link rel="apple-touch-icon" sizes="76x76" href="../assets/img/apple-icon.png"> + <link rel="icon" type="image/png" href="../assets/img/favicon.png"> + <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> + <title> + Paper Dashboard 2 by Creative Tim + </title> + <meta content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0, shrink-to-fit=no' name='viewport' /> + <!-- Fonts and icons --> + <link href="https://fonts.googleapis.com/css?family=Montserrat:400,700,200" rel="stylesheet" /> + <link href="https://maxcdn.bootstrapcdn.com/font-awesome/latest/css/font-awesome.min.css" rel="stylesheet"> + <!-- CSS Files --> + <link href="../assets/css/bootstrap.min.css" rel="stylesheet" /> + <link href="../assets/css/paper-dashboard.css?v=2.0.0" rel="stylesheet" /> + <!-- CSS Just for demo purpose, don't include it in your project --> + <link href="../assets/demo/demo.css" rel="stylesheet" /> +</head> + +<body class=""> + <div class="wrapper "> + <div class="sidebar" data-color="white" data-active-color="danger"> + <!-- + Tip 1: You can change the color of the sidebar using: data-color="blue | green | orange | red | yellow" + --> + <div class="logo"> + <a href="http://www.creative-tim.com" class="simple-text logo-mini"> + <div class="logo-image-small"> + <img src="../assets/img/logo-small.png"> + </div> + </a> + <a href="http://www.creative-tim.com" class="simple-text logo-normal"> + Creative Tim + <!-- <div class="logo-image-big"> + <img src="../assets/img/logo-big.png"> + </div> --> + </a> + </div> + <div class="sidebar-wrapper"> + <ul class="nav"> + <li> + <a href="./dashboard.html"> + <i class="nc-icon nc-bank"></i> + <p>Dashboard</p> + </a> + </li> + <li class="active "> + <a href="./icons.html"> + <i class="nc-icon nc-diamond"></i> + <p>Icons</p> + </a> + </li> + <li> + <a href="./map.html"> + <i class="nc-icon nc-pin-3"></i> + <p>Maps</p> + </a> + </li> + <li> + <a href="./notifications.html"> + <i class="nc-icon nc-bell-55"></i> + <p>Notifications</p> + </a> + </li> + <li> + <a href="./user.html"> + <i class="nc-icon nc-single-02"></i> + <p>User Profile</p> + </a> + </li> + <li> + <a href="./tables.html"> + <i class="nc-icon nc-tile-56"></i> + <p>Table List</p> + </a> + </li> + <li> + <a href="./typography.html"> + <i class="nc-icon nc-caps-small"></i> + <p>Typography</p> + </a> + </li> + <li class="active-pro"> + <a href="./upgrade.html"> + <i class="nc-icon nc-spaceship"></i> + <p>Upgrade to PRO</p> + </a> + </li> + </ul> + </div> + </div> + <div class="main-panel"> + <!-- Navbar --> + <nav class="navbar navbar-expand-lg navbar-absolute fixed-top navbar-transparent"> + <div class="container-fluid"> + <div class="navbar-wrapper"> + <div class="navbar-toggle"> + <button type="button" class="navbar-toggler"> + <span class="navbar-toggler-bar bar1"></span> + <span class="navbar-toggler-bar bar2"></span> + <span class="navbar-toggler-bar bar3"></span> + </button> + </div> + <a class="navbar-brand" href="#pablo">Paper Dashboard 2</a> + </div> + <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navigation" aria-controls="navigation-index" aria-expanded="false" aria-label="Toggle navigation"> + <span class="navbar-toggler-bar navbar-kebab"></span> + <span class="navbar-toggler-bar navbar-kebab"></span> + <span class="navbar-toggler-bar navbar-kebab"></span> + </button> + <div class="collapse navbar-collapse justify-content-end" id="navigation"> + <form> + <div class="input-group no-border"> + <input type="text" value="" class="form-control" placeholder="Search..."> + <div class="input-group-append"> + <div class="input-group-text"> + <i class="nc-icon nc-zoom-split"></i> + </div> + </div> + </div> + </form> + <ul class="navbar-nav"> + <li class="nav-item"> + <a class="nav-link btn-magnify" href="#pablo"> + <i class="nc-icon nc-layout-11"></i> + <p> + <span class="d-lg-none d-md-block">Stats</span> + </p> + </a> + </li> + <li class="nav-item btn-rotate dropdown"> + <a class="nav-link dropdown-toggle" href="http://example.com" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> + <i class="nc-icon nc-bell-55"></i> + <p> + <span class="d-lg-none d-md-block">Some Actions</span> + </p> + </a> + <div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdownMenuLink"> + <a class="dropdown-item" href="#">Action</a> + <a class="dropdown-item" href="#">Another action</a> + <a class="dropdown-item" href="#">Something else here</a> + </div> + </li> + <li class="nav-item"> + <a class="nav-link btn-rotate" href="#pablo"> + <i class="nc-icon nc-settings-gear-65"></i> + <p> + <span class="d-lg-none d-md-block">Account</span> + </p> + </a> + </li> + </ul> + </div> + </div> + </nav> + <!-- End Navbar --> + <!-- <div class="panel-header panel-header-sm"> + + +</div> --> + <div class="content"> + <div class="row"> + <div class="col-md-12"> + <div class="card demo-icons"> + <div class="card-header"> + <h5 class="card-title">100 Awesome Nucleo Icons</h5> + <p class="card-category">Handcrafted by our friends from + <a href="https://nucleoapp.com/?ref=1712">NucleoApp</a> + </p> + </div> + <div class="card-body all-icons"> + <div id="icons-wrapper"> + <section> + <ul> + <li> + <i class="nc-icon nc-air-baloon"></i> + <p>nc-air-baloon</p> + </li> + <li> + <i class="nc-icon nc-album-2"></i> + <p>nc-album-2</p> + </li> + <li> + <i class="nc-icon nc-alert-circle-i"></i> + <p>nc-alert-circle-i</p> + </li> + <li> + <i class="nc-icon nc-align-center"></i> + <p>nc-align-center</p> + </li> + <li> + <i class="nc-icon nc-align-left-2"></i> + <p>nc-align-left-2</p> + </li> + <li> + <i class="nc-icon nc-ambulance"></i> + <p>nc-ambulance</p> + </li> + <li> + <i class="nc-icon nc-app"></i> + <p>nc-app</p> + </li> + <li> + <i class="nc-icon nc-atom"></i> + <p>nc-atom</p> + </li> + <li> + <i class="nc-icon nc-badge"></i> + <p>nc-badge</p> + </li> + <li> + <i class="nc-icon nc-bag-16"></i> + <p>nc-bag-16</p> + </li> + <li> + <i class="nc-icon nc-bank"></i> + <p>nc-bank</p> + </li> + <li> + <i class="nc-icon nc-basket"></i> + <p>nc-basket</p> + </li> + <li> + <i class="nc-icon nc-bell-55"></i> + <p>nc-bell-55</p> + </li> + <li> + <i class="nc-icon nc-bold"></i> + <p>nc-bold</p> + </li> + <li> + <i class="nc-icon nc-book-bookmark"></i> + <p>nc-book-bookmark</p> + </li> + <li> + <i class="nc-icon nc-bookmark-2"></i> + <p>nc-bookmark-2</p> + </li> + <li> + <i class="nc-icon nc-box-2"></i> + <p>nc-box-2</p> + </li> + <li> + <i class="nc-icon nc-box"></i> + <p>nc-box</p> + </li> + <li> + <i class="nc-icon nc-briefcase-24"></i> + <p>nc-briefcase-24</p> + </li> + <li> + <i class="nc-icon nc-bulb-63"></i> + <p>nc-bulb-63</p> + </li> + <li> + <i class="nc-icon nc-bullet-list-67"></i> + <p>nc-bullet-list-67</p> + </li> + <li> + <i class="nc-icon nc-bus-front-12"></i> + <p>nc-bus-front-12</p> + </li> + <li> + <i class="nc-icon nc-button-pause"></i> + <p>nc-button-pause</p> + </li> + <li> + <i class="nc-icon nc-button-play"></i> + <p>nc-button-play</p> + </li> + <li> + <i class="nc-icon nc-button-power"></i> + <p>nc-button-power</p> + </li> + <li> + <i class="nc-icon nc-calendar-60"></i> + <p>nc-calendar-60</p> + </li> + <li> + <i class="nc-icon nc-camera-compact"></i> + <p>nc-camera-compact</p> + </li> + <li> + <i class="nc-icon nc-caps-small"></i> + <p>nc-caps-small</p> + </li> + <li> + <i class="nc-icon nc-cart-simple"></i> + <p>nc-cart-simple</p> + </li> + <li> + <i class="nc-icon nc-chart-bar-32"></i> + <p>nc-chart-bar-32</p> + </li> + <li> + <i class="nc-icon nc-chart-pie-36"></i> + <p>nc-chart-pie-36</p> + </li> + <li> + <i class="nc-icon nc-chat-33"></i> + <p>nc-chat-33</p> + </li> + <li> + <i class="nc-icon nc-check-2"></i> + <p>nc-check-2</p> + </li> + <li> + <i class="nc-icon nc-circle-10"></i> + <p>nc-circle-10</p> + </li> + <li> + <i class="nc-icon nc-cloud-download-93"></i> + <p>nc-cloud-download-93</p> + </li> + <li> + <i class="nc-icon nc-cloud-upload-94"></i> + <p>nc-cloud-upload-94</p> + </li> + <li> + <i class="nc-icon nc-compass-05"></i> + <p>nc-compass-05</p> + </li> + <li> + <i class="nc-icon nc-controller-modern"></i> + <p>nc-controller-modern</p> + </li> + <li> + <i class="nc-icon nc-credit-card"></i> + <p>nc-credit-card</p> + </li> + <li> + <i class="nc-icon nc-delivery-fast"></i> + <p>nc-delivery-fast</p> + </li> + <li> + <i class="nc-icon nc-diamond"></i> + <p>nc-diamond</p> + </li> + <li> + <i class="nc-icon nc-email-85"></i> + <p>nc-email-85</p> + </li> + <li> + <i class="nc-icon nc-favourite-28"></i> + <p>nc-favourite-28</p> + </li> + <li> + <i class="nc-icon nc-glasses-2"></i> + <p>nc-glasses-2</p> + </li> + <li> + <i class="nc-icon nc-globe-2"></i> + <p>nc-globe-2</p> + </li> + <li> + <i class="nc-icon nc-globe"></i> + <p>nc-globe</p> + </li> + <li> + <i class="nc-icon nc-hat-3"></i> + <p>nc-hat-3</p> + </li> + <li> + <i class="nc-icon nc-headphones"></i> + <p>nc-headphones</p> + </li> + <li> + <i class="nc-icon nc-html5"></i> + <p>nc-html5</p> + </li> + <li> + <i class="nc-icon nc-image"></i> + <p>nc-image</p> + </li> + <li> + <i class="nc-icon nc-istanbul"></i> + <p>nc-istanbul</p> + </li> + <li> + <i class="nc-icon nc-key-25"></i> + <p>nc-key-25</p> + </li> + <li> + <i class="nc-icon nc-laptop"></i> + <p>nc-laptop</p> + </li> + <li> + <i class="nc-icon nc-layout-11"></i> + <p>nc-layout-11</p> + </li> + <li> + <i class="nc-icon nc-lock-circle-open"></i> + <p>nc-lock-circle-open</p> + </li> + <li> + <i class="nc-icon nc-map-big"></i> + <p>nc-map-big</p> + </li> + <li> + <i class="nc-icon nc-minimal-down"></i> + <p>nc-minimal-down</p> + </li> + <li> + <i class="nc-icon nc-minimal-left"></i> + <p>nc-minimal-left</p> + </li> + <li> + <i class="nc-icon nc-minimal-right"></i> + <p>nc-minimal-right</p> + </li> + <li> + <i class="nc-icon nc-minimal-up"></i> + <p>nc-minimal-up</p> + </li> + <li> + <i class="nc-icon nc-mobile"></i> + <p>nc-mobile</p> + </li> + <li> + <i class="nc-icon nc-money-coins"></i> + <p>nc-money-coins</p> + </li> + <li> + <i class="nc-icon nc-note-03"></i> + <p>nc-note-03</p> + </li> + <li> + <i class="nc-icon nc-palette"></i> + <p>nc-palette</p> + </li> + <li> + <i class="nc-icon nc-paper"></i> + <p>nc-paper</p> + </li> + <li> + <i class="nc-icon nc-pin-3"></i> + <p>nc-pin-3</p> + </li> + <li> + <i class="nc-icon nc-planet"></i> + <p>nc-planet</p> + </li> + <li> + <i class="nc-icon nc-refresh-69"></i> + <p>nc-refresh-69</p> + </li> + <li> + <i class="nc-icon nc-ruler-pencil"></i> + <p>nc-ruler-pencil</p> + </li> + <li> + <i class="nc-icon nc-satisfied"></i> + <p>nc-satisfied</p> + </li> + <li> + <i class="nc-icon nc-scissors"></i> + <p>nc-scissors</p> + </li> + <li> + <i class="nc-icon nc-send"></i> + <p>nc-send</p> + </li> + <li> + <i class="nc-icon nc-settings-gear-65"></i> + <p>nc-settings-gear-65</p> + </li> + <li> + <i class="nc-icon nc-settings"></i> + <p>nc-settings</p> + </li> + <li> + <i class="nc-icon nc-share-66"></i> + <p>nc-share-66</p> + </li> + <li> + <i class="nc-icon nc-shop"></i> + <p>nc-shop</p> + </li> + <li> + <i class="nc-icon nc-simple-add"></i> + <p>nc-simple-add</p> + </li> + <li> + <i class="nc-icon nc-simple-delete"></i> + <p>nc-simple-delete</p> + </li> + <li> + <i class="nc-icon nc-simple-remove"></i> + <p>nc-simple-remove</p> + </li> + <li> + <i class="nc-icon nc-single-02"></i> + <p>nc-single-02</p> + </li> + <li> + <i class="nc-icon nc-single-copy-04"></i> + <p>nc-single-copy-04</p> + </li> + <li> + <i class="nc-icon nc-sound-wave"></i> + <p>nc-sound-wave</p> + </li> + <li> + <i class="nc-icon nc-spaceship"></i> + <p>nc-spaceship</p> + </li> + <li> + <i class="nc-icon nc-sun-fog-29"></i> + <p>nc-sun-fog-29</p> + </li> + <li> + <i class="nc-icon nc-support-17"></i> + <p>nc-support-17</p> + </li> + <li> + <i class="nc-icon nc-tablet-2"></i> + <p>nc-tablet-2</p> + </li> + <li> + <i class="nc-icon nc-tag-content"></i> + <p>nc-tag-content</p> + </li> + <li> + <i class="nc-icon nc-tap-01"></i> + <p>nc-tap-01</p> + </li> + <li> + <i class="nc-icon nc-tie-bow"></i> + <p>nc-tie-bow</p> + </li> + <li> + <i class="nc-icon nc-tile-56"></i> + <p>nc-tile-56</p> + </li> + <li> + <i class="nc-icon nc-time-alarm"></i> + <p>nc-time-alarm</p> + </li> + <li> + <i class="nc-icon nc-touch-id"></i> + <p>nc-touch-id</p> + </li> + <li> + <i class="nc-icon nc-trophy"></i> + <p>nc-trophy</p> + </li> + <li> + <i class="nc-icon nc-tv-2"></i> + <p>nc-tv-2</p> + </li> + <li> + <i class="nc-icon nc-umbrella-13"></i> + <p>nc-umbrella-13</p> + </li> + <li> + <i class="nc-icon nc-user-run"></i> + <p>nc-user-run</p> + </li> + <li> + <i class="nc-icon nc-vector"></i> + <p>nc-vector</p> + </li> + <li> + <i class="nc-icon nc-watch-time"></i> + <p>nc-watch-time</p> + </li> + <li> + <i class="nc-icon nc-world-2"></i> + <p>nc-world-2</p> + </li> + <li> + <i class="nc-icon nc-zoom-split"></i> + <p>nc-zoom-split</p> + </li> + <!-- list of icons here with the proper class--> + </ul> + </section> + </div> + </div> + </div> + </div> + </div> + </div> + <footer class="footer footer-black footer-white "> + <div class="container-fluid"> + <div class="row"> + <nav class="footer-nav"> + <ul> + <li> + <a href="https://www.creative-tim.com" target="_blank">Creative Tim</a> + </li> + <li> + <a href="http://blog.creative-tim.com/" target="_blank">Blog</a> + </li> + <li> + <a href="https://www.creative-tim.com/license" target="_blank">Licenses</a> + </li> + </ul> + </nav> + <div class="credits ml-auto"> + <span class="copyright"> + © + <script> + document.write(new Date().getFullYear()) + </script>, made with <i class="fa fa-heart heart"></i> by Creative Tim + </span> + </div> + </div> + </div> + </footer> + </div> + </div> + <!-- Core JS Files --> + <script src="../assets/js/core/jquery.min.js"></script> + <script src="../assets/js/core/popper.min.js"></script> + <script src="../assets/js/core/bootstrap.min.js"></script> + <script src="../assets/js/plugins/perfect-scrollbar.jquery.min.js"></script> + <!-- Google Maps Plugin --> + <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_KEY_HERE"></script> + <!-- Chart JS --> + <script src="../assets/js/plugins/chartjs.min.js"></script> + <!-- Notifications Plugin --> + <script src="../assets/js/plugins/bootstrap-notify.js"></script> + <!-- Control Center for Now Ui Dashboard: parallax effects, scripts for the example pages etc --> + <script src="../assets/js/paper-dashboard.min.js?v=2.0.0" type="text/javascript"></script> + <!-- Paper Dashboard DEMO methods, don't include it in your project! --> + <script src="../assets/demo/demo.js"></script> + <script> + function SelectText(element) { + var doc = document, + text = element, + range, selection; + if (doc.body.createTextRange) { + range = document.body.createTextRange(); + range.moveToElementText(text); + range.select(); + } else if (window.getSelection) { + selection = window.getSelection(); + range = document.createRange(); + range.selectNodeContents(text); + selection.removeAllRanges(); + selection.addRange(range); + } + } + window.onload = function() { + var iconsWrapper = document.getElementById('icons-wrapper'), + listItems = iconsWrapper.getElementsByTagName('li'); + for (var i = 0; i < listItems.length; i++) { + listItems[i].onclick = function fun(event) { + var selectedTagName = event.target.tagName.toLowerCase(); + if (selectedTagName == 'p' || selectedTagName == 'em') { + SelectText(event.target); + } else if (selectedTagName == 'input') { + event.target.setSelectionRange(0, event.target.value.length); + } + } + + var beforeContentChar = window.getComputedStyle(listItems[i].getElementsByTagName('i')[0], '::before').getPropertyValue('content').replace(/'/g, "").replace(/"/g, ""), + beforeContent = beforeContentChar.charCodeAt(0).toString(16); + var beforeContentElement = document.createElement("em"); + beforeContentElement.textContent = "\\" + beforeContent; + listItems[i].appendChild(beforeContentElement); + + //create input element to copy/paste chart + var charCharac = document.createElement('input'); + charCharac.setAttribute('type', 'text'); + charCharac.setAttribute('maxlength', '1'); + charCharac.setAttribute('readonly', 'true'); + charCharac.setAttribute('value', beforeContentChar); + listItems[i].appendChild(charCharac); + } + } + </script> +</body> + +</html> diff --git a/explorer/public/paper-dashboard/examples/map.html b/explorer/public/paper-dashboard/examples/map.html new file mode 100644 index 00000000000..a9b220586ef --- /dev/null +++ b/explorer/public/paper-dashboard/examples/map.html @@ -0,0 +1,246 @@ +<!-- +========================================================= + Paper Dashboard 2 - v2.0.0 +========================================================= + + Product Page: https://www.creative-tim.com/product/paper-dashboard-2 + Copyright 2019 Creative Tim (https://www.creative-tim.com) + Licensed under MIT (https://github.com/creativetimofficial/paper-dashboard/blob/master/LICENSE) + + Coded by Creative Tim + +========================================================= + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. --> + + + +<!DOCTYPE html> +<html lang="en"> + +<head> + <meta charset="utf-8" /> + <link rel="apple-touch-icon" sizes="76x76" href="../assets/img/apple-icon.png"> + <link rel="icon" type="image/png" href="../assets/img/favicon.png"> + <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> + <title> + Paper Dashboard 2 by Creative Tim + </title> + <meta content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0, shrink-to-fit=no' name='viewport' /> + <!-- Fonts and icons --> + <link href="https://fonts.googleapis.com/css?family=Montserrat:400,700,200" rel="stylesheet" /> + <link href="https://maxcdn.bootstrapcdn.com/font-awesome/latest/css/font-awesome.min.css" rel="stylesheet"> + <!-- CSS Files --> + <link href="../assets/css/bootstrap.min.css" rel="stylesheet" /> + <link href="../assets/css/paper-dashboard.css?v=2.0.0" rel="stylesheet" /> + <!-- CSS Just for demo purpose, don't include it in your project --> + <link href="../assets/demo/demo.css" rel="stylesheet" /> +</head> + +<body class=""> + <div class="wrapper "> + <div class="sidebar" data-color="white" data-active-color="danger"> + <!-- + Tip 1: You can change the color of the sidebar using: data-color="blue | green | orange | red | yellow" + --> + <div class="logo"> + <a href="http://www.creative-tim.com" class="simple-text logo-mini"> + <div class="logo-image-small"> + <img src="../assets/img/logo-small.png"> + </div> + </a> + <a href="http://www.creative-tim.com" class="simple-text logo-normal"> + Creative Tim + <!-- <div class="logo-image-big"> + <img src="../assets/img/logo-big.png"> + </div> --> + </a> + </div> + <div class="sidebar-wrapper"> + <ul class="nav"> + <li> + <a href="./dashboard.html"> + <i class="nc-icon nc-bank"></i> + <p>Dashboard</p> + </a> + </li> + <li> + <a href="./icons.html"> + <i class="nc-icon nc-diamond"></i> + <p>Icons</p> + </a> + </li> + <li class="active "> + <a href="./map.html"> + <i class="nc-icon nc-pin-3"></i> + <p>Maps</p> + </a> + </li> + <li> + <a href="./notifications.html"> + <i class="nc-icon nc-bell-55"></i> + <p>Notifications</p> + </a> + </li> + <li> + <a href="./user.html"> + <i class="nc-icon nc-single-02"></i> + <p>User Profile</p> + </a> + </li> + <li> + <a href="./tables.html"> + <i class="nc-icon nc-tile-56"></i> + <p>Table List</p> + </a> + </li> + <li> + <a href="./typography.html"> + <i class="nc-icon nc-caps-small"></i> + <p>Typography</p> + </a> + </li> + <li class="active-pro"> + <a href="./upgrade.html"> + <i class="nc-icon nc-spaceship"></i> + <p>Upgrade to PRO</p> + </a> + </li> + </ul> + </div> + </div> + <div class="main-panel"> + <!-- Navbar --> + <nav class="navbar navbar-expand-lg navbar-absolute fixed-top navbar-transparent"> + <div class="container-fluid"> + <div class="navbar-wrapper"> + <div class="navbar-toggle"> + <button type="button" class="navbar-toggler"> + <span class="navbar-toggler-bar bar1"></span> + <span class="navbar-toggler-bar bar2"></span> + <span class="navbar-toggler-bar bar3"></span> + </button> + </div> + <a class="navbar-brand" href="#pablo">Paper Dashboard 2</a> + </div> + <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navigation" aria-controls="navigation-index" aria-expanded="false" aria-label="Toggle navigation"> + <span class="navbar-toggler-bar navbar-kebab"></span> + <span class="navbar-toggler-bar navbar-kebab"></span> + <span class="navbar-toggler-bar navbar-kebab"></span> + </button> + <div class="collapse navbar-collapse justify-content-end" id="navigation"> + <form> + <div class="input-group no-border"> + <input type="text" value="" class="form-control" placeholder="Search..."> + <div class="input-group-append"> + <div class="input-group-text"> + <i class="nc-icon nc-zoom-split"></i> + </div> + </div> + </div> + </form> + <ul class="navbar-nav"> + <li class="nav-item"> + <a class="nav-link btn-magnify" href="#pablo"> + <i class="nc-icon nc-layout-11"></i> + <p> + <span class="d-lg-none d-md-block">Stats</span> + </p> + </a> + </li> + <li class="nav-item btn-rotate dropdown"> + <a class="nav-link dropdown-toggle" href="http://example.com" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> + <i class="nc-icon nc-bell-55"></i> + <p> + <span class="d-lg-none d-md-block">Some Actions</span> + </p> + </a> + <div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdownMenuLink"> + <a class="dropdown-item" href="#">Action</a> + <a class="dropdown-item" href="#">Another action</a> + <a class="dropdown-item" href="#">Something else here</a> + </div> + </li> + <li class="nav-item"> + <a class="nav-link btn-rotate" href="#pablo"> + <i class="nc-icon nc-settings-gear-65"></i> + <p> + <span class="d-lg-none d-md-block">Account</span> + </p> + </a> + </li> + </ul> + </div> + </div> + </nav> + <!-- End Navbar --> + <!-- <div class="panel-header panel-header-sm"> + + +</div> --> + <div class="content"> + <div class="row"> + <div class="col-md-12"> + <div class="card "> + <div class="card-header "> + Google Maps + </div> + <div class="card-body "> + <div id="map" class="map"></div> + </div> + </div> + </div> + </div> + </div> + <footer class="footer footer-black footer-white "> + <div class="container-fluid"> + <div class="row"> + <nav class="footer-nav"> + <ul> + <li> + <a href="https://www.creative-tim.com" target="_blank">Creative Tim</a> + </li> + <li> + <a href="http://blog.creative-tim.com/" target="_blank">Blog</a> + </li> + <li> + <a href="https://www.creative-tim.com/license" target="_blank">Licenses</a> + </li> + </ul> + </nav> + <div class="credits ml-auto"> + <span class="copyright"> + © + <script> + document.write(new Date().getFullYear()) + </script>, made with <i class="fa fa-heart heart"></i> by Creative Tim + </span> + </div> + </div> + </div> + </footer> + </div> + </div> + <!-- Core JS Files --> + <script src="../assets/js/core/jquery.min.js"></script> + <script src="../assets/js/core/popper.min.js"></script> + <script src="../assets/js/core/bootstrap.min.js"></script> + <script src="../assets/js/plugins/perfect-scrollbar.jquery.min.js"></script> + <!-- Google Maps Plugin --> + <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_KEY_HERE"></script> + <!-- Chart JS --> + <script src="../assets/js/plugins/chartjs.min.js"></script> + <!-- Notifications Plugin --> + <script src="../assets/js/plugins/bootstrap-notify.js"></script> + <!-- Control Center for Now Ui Dashboard: parallax effects, scripts for the example pages etc --> + <script src="../assets/js/paper-dashboard.min.js?v=2.0.0" type="text/javascript"></script> + <!-- Paper Dashboard DEMO methods, don't include it in your project! --> + <script src="../assets/demo/demo.js"></script> + <script> + $(document).ready(function() { + demo.initGoogleMaps(); + }); + </script> +</body> + +</html> diff --git a/explorer/public/paper-dashboard/examples/notifications.html b/explorer/public/paper-dashboard/examples/notifications.html new file mode 100644 index 00000000000..782f131a605 --- /dev/null +++ b/explorer/public/paper-dashboard/examples/notifications.html @@ -0,0 +1,375 @@ +<!-- +========================================================= + Paper Dashboard 2 - v2.0.0 +========================================================= + + Product Page: https://www.creative-tim.com/product/paper-dashboard-2 + Copyright 2019 Creative Tim (https://www.creative-tim.com) + Licensed under MIT (https://github.com/creativetimofficial/paper-dashboard/blob/master/LICENSE) + + Coded by Creative Tim + +========================================================= + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. --> + + + +<!DOCTYPE html> +<html lang="en"> + +<head> + <meta charset="utf-8" /> + <link rel="apple-touch-icon" sizes="76x76" href="../assets/img/apple-icon.png"> + <link rel="icon" type="image/png" href="../assets/img/favicon.png"> + <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> + <title> + Paper Dashboard 2 by Creative Tim + </title> + <meta content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0, shrink-to-fit=no' name='viewport' /> + <!-- Fonts and icons --> + <link href="https://fonts.googleapis.com/css?family=Montserrat:400,700,200" rel="stylesheet" /> + <link href="https://maxcdn.bootstrapcdn.com/font-awesome/latest/css/font-awesome.min.css" rel="stylesheet"> + <!-- CSS Files --> + <link href="../assets/css/bootstrap.min.css" rel="stylesheet" /> + <link href="../assets/css/paper-dashboard.css?v=2.0.0" rel="stylesheet" /> + <!-- CSS Just for demo purpose, don't include it in your project --> + <link href="../assets/demo/demo.css" rel="stylesheet" /> +</head> + +<body class=""> + <div class="wrapper "> + <div class="sidebar" data-color="white" data-active-color="danger"> + <!-- + Tip 1: You can change the color of the sidebar using: data-color="blue | green | orange | red | yellow" + --> + <div class="logo"> + <a href="http://www.creative-tim.com" class="simple-text logo-mini"> + <div class="logo-image-small"> + <img src="../assets/img/logo-small.png"> + </div> + </a> + <a href="http://www.creative-tim.com" class="simple-text logo-normal"> + Creative Tim + <!-- <div class="logo-image-big"> + <img src="../assets/img/logo-big.png"> + </div> --> + </a> + </div> + <div class="sidebar-wrapper"> + <ul class="nav"> + <li> + <a href="./dashboard.html"> + <i class="nc-icon nc-bank"></i> + <p>Dashboard</p> + </a> + </li> + <li> + <a href="./icons.html"> + <i class="nc-icon nc-diamond"></i> + <p>Icons</p> + </a> + </li> + <li> + <a href="./map.html"> + <i class="nc-icon nc-pin-3"></i> + <p>Maps</p> + </a> + </li> + <li class="active "> + <a href="./notifications.html"> + <i class="nc-icon nc-bell-55"></i> + <p>Notifications</p> + </a> + </li> + <li> + <a href="./user.html"> + <i class="nc-icon nc-single-02"></i> + <p>User Profile</p> + </a> + </li> + <li> + <a href="./tables.html"> + <i class="nc-icon nc-tile-56"></i> + <p>Table List</p> + </a> + </li> + <li> + <a href="./typography.html"> + <i class="nc-icon nc-caps-small"></i> + <p>Typography</p> + </a> + </li> + <li class="active-pro"> + <a href="./upgrade.html"> + <i class="nc-icon nc-spaceship"></i> + <p>Upgrade to PRO</p> + </a> + </li> + </ul> + </div> + </div> + <div class="main-panel"> + <!-- Navbar --> + <nav class="navbar navbar-expand-lg navbar-absolute fixed-top navbar-transparent"> + <div class="container-fluid"> + <div class="navbar-wrapper"> + <div class="navbar-toggle"> + <button type="button" class="navbar-toggler"> + <span class="navbar-toggler-bar bar1"></span> + <span class="navbar-toggler-bar bar2"></span> + <span class="navbar-toggler-bar bar3"></span> + </button> + </div> + <a class="navbar-brand" href="#pablo">Paper Dashboard 2</a> + </div> + <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navigation" aria-controls="navigation-index" aria-expanded="false" aria-label="Toggle navigation"> + <span class="navbar-toggler-bar navbar-kebab"></span> + <span class="navbar-toggler-bar navbar-kebab"></span> + <span class="navbar-toggler-bar navbar-kebab"></span> + </button> + <div class="collapse navbar-collapse justify-content-end" id="navigation"> + <form> + <div class="input-group no-border"> + <input type="text" value="" class="form-control" placeholder="Search..."> + <div class="input-group-append"> + <div class="input-group-text"> + <i class="nc-icon nc-zoom-split"></i> + </div> + </div> + </div> + </form> + <ul class="navbar-nav"> + <li class="nav-item"> + <a class="nav-link btn-magnify" href="#pablo"> + <i class="nc-icon nc-layout-11"></i> + <p> + <span class="d-lg-none d-md-block">Stats</span> + </p> + </a> + </li> + <li class="nav-item btn-rotate dropdown"> + <a class="nav-link dropdown-toggle" href="http://example.com" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> + <i class="nc-icon nc-bell-55"></i> + <p> + <span class="d-lg-none d-md-block">Some Actions</span> + </p> + </a> + <div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdownMenuLink"> + <a class="dropdown-item" href="#">Action</a> + <a class="dropdown-item" href="#">Another action</a> + <a class="dropdown-item" href="#">Something else here</a> + </div> + </li> + <li class="nav-item"> + <a class="nav-link btn-rotate" href="#pablo"> + <i class="nc-icon nc-settings-gear-65"></i> + <p> + <span class="d-lg-none d-md-block">Account</span> + </p> + </a> + </li> + </ul> + </div> + </div> + </nav> + <!-- End Navbar --> + <!-- <div class="panel-header"> + + + <div class="header text-center"> + <h2 class="title">Notifications</h2> + <p class="category">Handcrafted by our friend <a target="_blank" href="https://github.com/mouse0270">Robert McIntosh</a>. Please checkout the <a href="http://bootstrap-notify.remabledesigns.com/" target="_blank">full documentation.</a></p> + </div> + +</div> --> + <div class="content"> + <div class="row"> + <div class="col-md-12"> + <div class="card"> + <div class="card-header"> + <h5 class="card-title">Notifications</h5> + <p class="card-category">Handcrafted by our friend + <a target="_blank" href="https://github.com/mouse0270">Robert McIntosh</a>. Please checkout the + <a href="http://bootstrap-notify.remabledesigns.com/" target="_blank">full documentation.</a> + </p> + </div> + <div class="card-body"> + <div class="row"> + <div class="col-md-6"> + <div class="card card-plain"> + <div class="card-header"> + <h5 class="card-title">Notifications Style</h5> + </div> + <div class="card-body"> + <div class="alert alert-info"> + <span>This is a plain notification</span> + </div> + <div class="alert alert-info alert-dismissible fade show"> + <button type="button" aria-hidden="true" class="close" data-dismiss="alert" aria-label="Close"> + <i class="nc-icon nc-simple-remove"></i> + </button> + <span>This is a notification with close button.</span> + </div> + <div class="alert alert-info alert-with-icon alert-dismissible fade show" data-notify="container"> + <button type="button" aria-hidden="true" class="close" data-dismiss="alert" aria-label="Close"> + <i class="nc-icon nc-simple-remove"></i> + </button> + <span data-notify="icon" class="nc-icon nc-bell-55"></span> + <span data-notify="message">This is a notification with close button and icon.</span> + </div> + <div class="alert alert-info alert-with-icon alert-dismissible fade show" data-notify="container"> + <button type="button" aria-hidden="true" class="close" data-dismiss="alert" aria-label="Close"> + <i class="nc-icon nc-simple-remove"></i> + </button> + <span data-notify="icon" class="nc-icon nc-chart-pie-36"></span> + <span data-notify="message">This is a notification with close button and icon and have many lines. You can see that the icon and the close button are always vertically aligned. This is a beautiful notification. So you don't have to worry about the style.</span> + </div> + </div> + </div> + </div> + <div class="col-md-6"> + <div class="card card-plain"> + <div class="card-header"> + <h5 class="card-title">Notification states</h5> + </div> + <div class="card-body"> + <div class="alert alert-primary alert-dismissible fade show"> + <button type="button" aria-hidden="true" class="close" data-dismiss="alert" aria-label="Close"> + <i class="nc-icon nc-simple-remove"></i> + </button> + <span> + <b> Primary - </b> This is a regular notification made with ".alert-primary"</span> + </div> + <div class="alert alert-info alert-dismissible fade show"> + <button type="button" aria-hidden="true" class="close" data-dismiss="alert" aria-label="Close"> + <i class="nc-icon nc-simple-remove"></i> + </button> + <span> + <b> Info - </b> This is a regular notification made with ".alert-info"</span> + </div> + <div class="alert alert-success alert-dismissible fade show"> + <button type="button" aria-hidden="true" class="close" data-dismiss="alert" aria-label="Close"> + <i class="nc-icon nc-simple-remove"></i> + </button> + <span> + <b> Success - </b> This is a regular notification made with ".alert-success"</span> + </div> + <div class="alert alert-warning alert-dismissible fade show"> + <button type="button" aria-hidden="true" class="close" data-dismiss="alert" aria-label="Close"> + <i class="nc-icon nc-simple-remove"></i> + </button> + <span> + <b> Warning - </b> This is a regular notification made with ".alert-warning"</span> + </div> + <div class="alert alert-danger alert-dismissible fade show"> + <button type="button" aria-hidden="true" class="close" data-dismiss="alert" aria-label="Close"> + <i class="nc-icon nc-simple-remove"></i> + </button> + <span> + <b> Danger - </b> This is a regular notification made with ".alert-danger"</span> + </div> + </div> + </div> + </div> + </div> + </div> + </div> + </div> + </div> + <div class="row"> + <div class="col-md-12"> + <div class="card"> + <div class="card-body"> + <div class="places-buttons"> + <div class="row"> + <div class="col-md-6 ml-auto mr-auto text-center"> + <h4 class="card-title"> + Notifications Places + <p class="category">Click to view notifications</p> + </h4> + </div> + </div> + <div class="row"> + <div class="col-lg-8 ml-auto mr-auto"> + <div class="row"> + <div class="col-md-4"> + <button class="btn btn-primary btn-block" onclick="demo.showNotification('top','left')">Top Left</button> + </div> + <div class="col-md-4"> + <button class="btn btn-primary btn-block" onclick="demo.showNotification('top','center')">Top Center</button> + </div> + <div class="col-md-4"> + <button class="btn btn-primary btn-block" onclick="demo.showNotification('top','right')">Top Right</button> + </div> + </div> + </div> + </div> + <div class="row"> + <div class="col-lg-8 ml-auto mr-auto"> + <div class="row"> + <div class="col-md-4"> + <button class="btn btn-primary btn-block" onclick="demo.showNotification('bottom','left')">Bottom Left</button> + </div> + <div class="col-md-4"> + <button class="btn btn-primary btn-block" onclick="demo.showNotification('bottom','center')">Bottom Center</button> + </div> + <div class="col-md-4"> + <button class="btn btn-primary btn-block" onclick="demo.showNotification('bottom','right')">Bottom Right</button> + </div> + </div> + </div> + </div> + </div> + </div> + </div> + </div> + </div> + </div> + <footer class="footer footer-black footer-white "> + <div class="container-fluid"> + <div class="row"> + <nav class="footer-nav"> + <ul> + <li> + <a href="https://www.creative-tim.com" target="_blank">Creative Tim</a> + </li> + <li> + <a href="http://blog.creative-tim.com/" target="_blank">Blog</a> + </li> + <li> + <a href="https://www.creative-tim.com/license" target="_blank">Licenses</a> + </li> + </ul> + </nav> + <div class="credits ml-auto"> + <span class="copyright"> + © + <script> + document.write(new Date().getFullYear()) + </script>, made with <i class="fa fa-heart heart"></i> by Creative Tim + </span> + </div> + </div> + </div> + </footer> + </div> + </div> + <!-- Core JS Files --> + <script src="../assets/js/core/jquery.min.js"></script> + <script src="../assets/js/core/popper.min.js"></script> + <script src="../assets/js/core/bootstrap.min.js"></script> + <script src="../assets/js/plugins/perfect-scrollbar.jquery.min.js"></script> + <!-- Google Maps Plugin --> + <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_KEY_HERE"></script> + <!-- Chart JS --> + <script src="../assets/js/plugins/chartjs.min.js"></script> + <!-- Notifications Plugin --> + <script src="../assets/js/plugins/bootstrap-notify.js"></script> + <!-- Control Center for Now Ui Dashboard: parallax effects, scripts for the example pages etc --> + <script src="../assets/js/paper-dashboard.min.js?v=2.0.0" type="text/javascript"></script> + <!-- Paper Dashboard DEMO methods, don't include it in your project! --> + <script src="../assets/demo/demo.js"></script> +</body> + +</html> diff --git a/explorer/public/paper-dashboard/examples/tables.html b/explorer/public/paper-dashboard/examples/tables.html new file mode 100644 index 00000000000..5fa158d0e52 --- /dev/null +++ b/explorer/public/paper-dashboard/examples/tables.html @@ -0,0 +1,486 @@ +<!-- +========================================================= + Paper Dashboard 2 - v2.0.0 +========================================================= + + Product Page: https://www.creative-tim.com/product/paper-dashboard-2 + Copyright 2019 Creative Tim (https://www.creative-tim.com) + Licensed under MIT (https://github.com/creativetimofficial/paper-dashboard/blob/master/LICENSE) + + Coded by Creative Tim + +========================================================= + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. --> + + + +<!DOCTYPE html> +<html lang="en"> + +<head> + <meta charset="utf-8" /> + <link rel="apple-touch-icon" sizes="76x76" href="../assets/img/apple-icon.png"> + <link rel="icon" type="image/png" href="../assets/img/favicon.png"> + <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> + <title> + Paper Dashboard 2 by Creative Tim + </title> + <meta content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0, shrink-to-fit=no' name='viewport' /> + <!-- Fonts and icons --> + <link href="https://fonts.googleapis.com/css?family=Montserrat:400,700,200" rel="stylesheet" /> + <link href="https://maxcdn.bootstrapcdn.com/font-awesome/latest/css/font-awesome.min.css" rel="stylesheet"> + <!-- CSS Files --> + <link href="../assets/css/bootstrap.min.css" rel="stylesheet" /> + <link href="../assets/css/paper-dashboard.css?v=2.0.0" rel="stylesheet" /> + <!-- CSS Just for demo purpose, don't include it in your project --> + <link href="../assets/demo/demo.css" rel="stylesheet" /> +</head> + +<body class=""> + <div class="wrapper "> + <div class="sidebar" data-color="white" data-active-color="danger"> + <!-- + Tip 1: You can change the color of the sidebar using: data-color="blue | green | orange | red | yellow" + --> + <div class="logo"> + <a href="http://www.creative-tim.com" class="simple-text logo-mini"> + <div class="logo-image-small"> + <img src="../assets/img/logo-small.png"> + </div> + </a> + <a href="http://www.creative-tim.com" class="simple-text logo-normal"> + Creative Tim + <!-- <div class="logo-image-big"> + <img src="../assets/img/logo-big.png"> + </div> --> + </a> + </div> + <div class="sidebar-wrapper"> + <ul class="nav"> + <li> + <a href="./dashboard.html"> + <i class="nc-icon nc-bank"></i> + <p>Dashboard</p> + </a> + </li> + <li> + <a href="./icons.html"> + <i class="nc-icon nc-diamond"></i> + <p>Icons</p> + </a> + </li> + <li> + <a href="./map.html"> + <i class="nc-icon nc-pin-3"></i> + <p>Maps</p> + </a> + </li> + <li> + <a href="./notifications.html"> + <i class="nc-icon nc-bell-55"></i> + <p>Notifications</p> + </a> + </li> + <li> + <a href="./user.html"> + <i class="nc-icon nc-single-02"></i> + <p>User Profile</p> + </a> + </li> + <li class="active "> + <a href="./tables.html"> + <i class="nc-icon nc-tile-56"></i> + <p>Table List</p> + </a> + </li> + <li> + <a href="./typography.html"> + <i class="nc-icon nc-caps-small"></i> + <p>Typography</p> + </a> + </li> + <li class="active-pro"> + <a href="./upgrade.html"> + <i class="nc-icon nc-spaceship"></i> + <p>Upgrade to PRO</p> + </a> + </li> + </ul> + </div> + </div> + <div class="main-panel"> + <!-- Navbar --> + <nav class="navbar navbar-expand-lg navbar-absolute fixed-top navbar-transparent"> + <div class="container-fluid"> + <div class="navbar-wrapper"> + <div class="navbar-toggle"> + <button type="button" class="navbar-toggler"> + <span class="navbar-toggler-bar bar1"></span> + <span class="navbar-toggler-bar bar2"></span> + <span class="navbar-toggler-bar bar3"></span> + </button> + </div> + <a class="navbar-brand" href="#pablo">Paper Dashboard 2</a> + </div> + <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navigation" aria-controls="navigation-index" aria-expanded="false" aria-label="Toggle navigation"> + <span class="navbar-toggler-bar navbar-kebab"></span> + <span class="navbar-toggler-bar navbar-kebab"></span> + <span class="navbar-toggler-bar navbar-kebab"></span> + </button> + <div class="collapse navbar-collapse justify-content-end" id="navigation"> + <form> + <div class="input-group no-border"> + <input type="text" value="" class="form-control" placeholder="Search..."> + <div class="input-group-append"> + <div class="input-group-text"> + <i class="nc-icon nc-zoom-split"></i> + </div> + </div> + </div> + </form> + <ul class="navbar-nav"> + <li class="nav-item"> + <a class="nav-link btn-magnify" href="#pablo"> + <i class="nc-icon nc-layout-11"></i> + <p> + <span class="d-lg-none d-md-block">Stats</span> + </p> + </a> + </li> + <li class="nav-item btn-rotate dropdown"> + <a class="nav-link dropdown-toggle" href="http://example.com" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> + <i class="nc-icon nc-bell-55"></i> + <p> + <span class="d-lg-none d-md-block">Some Actions</span> + </p> + </a> + <div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdownMenuLink"> + <a class="dropdown-item" href="#">Action</a> + <a class="dropdown-item" href="#">Another action</a> + <a class="dropdown-item" href="#">Something else here</a> + </div> + </li> + <li class="nav-item"> + <a class="nav-link btn-rotate" href="#pablo"> + <i class="nc-icon nc-settings-gear-65"></i> + <p> + <span class="d-lg-none d-md-block">Account</span> + </p> + </a> + </li> + </ul> + </div> + </div> + </nav> + <!-- End Navbar --> + <!-- <div class="panel-header panel-header-sm"> + + +</div> --> + <div class="content"> + <div class="row"> + <div class="col-md-12"> + <div class="card"> + <div class="card-header"> + <h4 class="card-title"> Simple Table</h4> + </div> + <div class="card-body"> + <div class="table-responsive"> + <table class="table"> + <thead class=" text-primary"> + <th> + Name + </th> + <th> + Country + </th> + <th> + City + </th> + <th class="text-right"> + Salary + </th> + </thead> + <tbody> + <tr> + <td> + Dakota Rice + </td> + <td> + Niger + </td> + <td> + Oud-Turnhout + </td> + <td class="text-right"> + $36,738 + </td> + </tr> + <tr> + <td> + Minerva Hooper + </td> + <td> + Curaçao + </td> + <td> + Sinaai-Waas + </td> + <td class="text-right"> + $23,789 + </td> + </tr> + <tr> + <td> + Sage Rodriguez + </td> + <td> + Netherlands + </td> + <td> + Baileux + </td> + <td class="text-right"> + $56,142 + </td> + </tr> + <tr> + <td> + Philip Chaney + </td> + <td> + Korea, South + </td> + <td> + Overland Park + </td> + <td class="text-right"> + $38,735 + </td> + </tr> + <tr> + <td> + Doris Greene + </td> + <td> + Malawi + </td> + <td> + Feldkirchen in Kärnten + </td> + <td class="text-right"> + $63,542 + </td> + </tr> + <tr> + <td> + Mason Porter + </td> + <td> + Chile + </td> + <td> + Gloucester + </td> + <td class="text-right"> + $78,615 + </td> + </tr> + <tr> + <td> + Jon Porter + </td> + <td> + Portugal + </td> + <td> + Gloucester + </td> + <td class="text-right"> + $98,615 + </td> + </tr> + </tbody> + </table> + </div> + </div> + </div> + </div> + <div class="col-md-12"> + <div class="card card-plain"> + <div class="card-header"> + <h4 class="card-title"> Table on Plain Background</h4> + <p class="card-category"> Here is a subtitle for this table</p> + </div> + <div class="card-body"> + <div class="table-responsive"> + <table class="table"> + <thead class=" text-primary"> + <th> + Name + </th> + <th> + Country + </th> + <th> + City + </th> + <th class="text-right"> + Salary + </th> + </thead> + <tbody> + <tr> + <td> + Dakota Rice + </td> + <td> + Niger + </td> + <td> + Oud-Turnhout + </td> + <td class="text-right"> + $36,738 + </td> + </tr> + <tr> + <td> + Minerva Hooper + </td> + <td> + Curaçao + </td> + <td> + Sinaai-Waas + </td> + <td class="text-right"> + $23,789 + </td> + </tr> + <tr> + <td> + Sage Rodriguez + </td> + <td> + Netherlands + </td> + <td> + Baileux + </td> + <td class="text-right"> + $56,142 + </td> + </tr> + <tr> + <td> + Philip Chaney + </td> + <td> + Korea, South + </td> + <td> + Overland Park + </td> + <td class="text-right"> + $38,735 + </td> + </tr> + <tr> + <td> + Doris Greene + </td> + <td> + Malawi + </td> + <td> + Feldkirchen in Kärnten + </td> + <td class="text-right"> + $63,542 + </td> + </tr> + <tr> + <td> + Mason Porter + </td> + <td> + Chile + </td> + <td> + Gloucester + </td> + <td class="text-right"> + $78,615 + </td> + </tr> + <tr> + <td> + Jon Porter + </td> + <td> + Portugal + </td> + <td> + Gloucester + </td> + <td class="text-right"> + $98,615 + </td> + </tr> + </tbody> + </table> + </div> + </div> + </div> + </div> + </div> + </div> + <footer class="footer footer-black footer-white "> + <div class="container-fluid"> + <div class="row"> + <nav class="footer-nav"> + <ul> + <li> + <a href="https://www.creative-tim.com" target="_blank">Creative Tim</a> + </li> + <li> + <a href="http://blog.creative-tim.com/" target="_blank">Blog</a> + </li> + <li> + <a href="https://www.creative-tim.com/license" target="_blank">Licenses</a> + </li> + </ul> + </nav> + <div class="credits ml-auto"> + <span class="copyright"> + © + <script> + document.write(new Date().getFullYear()) + </script>, made with <i class="fa fa-heart heart"></i> by Creative Tim + </span> + </div> + </div> + </div> + </footer> + </div> + </div> + <!-- Core JS Files --> + <script src="../assets/js/core/jquery.min.js"></script> + <script src="../assets/js/core/popper.min.js"></script> + <script src="../assets/js/core/bootstrap.min.js"></script> + <script src="../assets/js/plugins/perfect-scrollbar.jquery.min.js"></script> + <!-- Google Maps Plugin --> + <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_KEY_HERE"></script> + <!-- Chart JS --> + <script src="../assets/js/plugins/chartjs.min.js"></script> + <!-- Notifications Plugin --> + <script src="../assets/js/plugins/bootstrap-notify.js"></script> + <!-- Control Center for Now Ui Dashboard: parallax effects, scripts for the example pages etc --> + <script src="../assets/js/paper-dashboard.min.js?v=2.0.0" type="text/javascript"></script> + <!-- Paper Dashboard DEMO methods, don't include it in your project! --> + <script src="../assets/demo/demo.js"></script> +</body> + +</html> diff --git a/explorer/public/paper-dashboard/examples/typography.html b/explorer/public/paper-dashboard/examples/typography.html new file mode 100644 index 00000000000..7551beda64d --- /dev/null +++ b/explorer/public/paper-dashboard/examples/typography.html @@ -0,0 +1,324 @@ +<!-- +========================================================= + Paper Dashboard 2 - v2.0.0 +========================================================= + + Product Page: https://www.creative-tim.com/product/paper-dashboard-2 + Copyright 2019 Creative Tim (https://www.creative-tim.com) + Licensed under MIT (https://github.com/creativetimofficial/paper-dashboard/blob/master/LICENSE) + + Coded by Creative Tim + +========================================================= + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. --> + + + +<!DOCTYPE html> +<html lang="en"> + +<head> + <meta charset="utf-8" /> + <link rel="apple-touch-icon" sizes="76x76" href="../assets/img/apple-icon.png"> + <link rel="icon" type="image/png" href="../assets/img/favicon.png"> + <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> + <title> + Paper Dashboard 2 by Creative Tim + </title> + <meta content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0, shrink-to-fit=no' name='viewport' /> + <!-- Fonts and icons --> + <link href="https://fonts.googleapis.com/css?family=Montserrat:400,700,200" rel="stylesheet" /> + <link href="https://maxcdn.bootstrapcdn.com/font-awesome/latest/css/font-awesome.min.css" rel="stylesheet"> + <!-- CSS Files --> + <link href="../assets/css/bootstrap.min.css" rel="stylesheet" /> + <link href="../assets/css/paper-dashboard.css?v=2.0.0" rel="stylesheet" /> + <!-- CSS Just for demo purpose, don't include it in your project --> + <link href="../assets/demo/demo.css" rel="stylesheet" /> +</head> + +<body class=""> + <div class="wrapper "> + <div class="sidebar" data-color="white" data-active-color="danger"> + <!-- + Tip 1: You can change the color of the sidebar using: data-color="blue | green | orange | red | yellow" + --> + <div class="logo"> + <a href="http://www.creative-tim.com" class="simple-text logo-mini"> + <div class="logo-image-small"> + <img src="../assets/img/logo-small.png"> + </div> + </a> + <a href="http://www.creative-tim.com" class="simple-text logo-normal"> + Creative Tim + <!-- <div class="logo-image-big"> + <img src="../assets/img/logo-big.png"> + </div> --> + </a> + </div> + <div class="sidebar-wrapper"> + <ul class="nav"> + <li> + <a href="./dashboard.html"> + <i class="nc-icon nc-bank"></i> + <p>Dashboard</p> + </a> + </li> + <li> + <a href="./icons.html"> + <i class="nc-icon nc-diamond"></i> + <p>Icons</p> + </a> + </li> + <li> + <a href="./map.html"> + <i class="nc-icon nc-pin-3"></i> + <p>Maps</p> + </a> + </li> + <li> + <a href="./notifications.html"> + <i class="nc-icon nc-bell-55"></i> + <p>Notifications</p> + </a> + </li> + <li> + <a href="./user.html"> + <i class="nc-icon nc-single-02"></i> + <p>User Profile</p> + </a> + </li> + <li> + <a href="./tables.html"> + <i class="nc-icon nc-tile-56"></i> + <p>Table List</p> + </a> + </li> + <li class="active "> + <a href="./typography.html"> + <i class="nc-icon nc-caps-small"></i> + <p>Typography</p> + </a> + </li> + <li class="active-pro"> + <a href="./upgrade.html"> + <i class="nc-icon nc-spaceship"></i> + <p>Upgrade to PRO</p> + </a> + </li> + </ul> + </div> + </div> + <div class="main-panel"> + <!-- Navbar --> + <nav class="navbar navbar-expand-lg navbar-absolute fixed-top navbar-transparent"> + <div class="container-fluid"> + <div class="navbar-wrapper"> + <div class="navbar-toggle"> + <button type="button" class="navbar-toggler"> + <span class="navbar-toggler-bar bar1"></span> + <span class="navbar-toggler-bar bar2"></span> + <span class="navbar-toggler-bar bar3"></span> + </button> + </div> + <a class="navbar-brand" href="#pablo">Paper Dashboard 2</a> + </div> + <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navigation" aria-controls="navigation-index" aria-expanded="false" aria-label="Toggle navigation"> + <span class="navbar-toggler-bar navbar-kebab"></span> + <span class="navbar-toggler-bar navbar-kebab"></span> + <span class="navbar-toggler-bar navbar-kebab"></span> + </button> + <div class="collapse navbar-collapse justify-content-end" id="navigation"> + <form> + <div class="input-group no-border"> + <input type="text" value="" class="form-control" placeholder="Search..."> + <div class="input-group-append"> + <div class="input-group-text"> + <i class="nc-icon nc-zoom-split"></i> + </div> + </div> + </div> + </form> + <ul class="navbar-nav"> + <li class="nav-item"> + <a class="nav-link btn-magnify" href="#pablo"> + <i class="nc-icon nc-layout-11"></i> + <p> + <span class="d-lg-none d-md-block">Stats</span> + </p> + </a> + </li> + <li class="nav-item btn-rotate dropdown"> + <a class="nav-link dropdown-toggle" href="http://example.com" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> + <i class="nc-icon nc-bell-55"></i> + <p> + <span class="d-lg-none d-md-block">Some Actions</span> + </p> + </a> + <div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdownMenuLink"> + <a class="dropdown-item" href="#">Action</a> + <a class="dropdown-item" href="#">Another action</a> + <a class="dropdown-item" href="#">Something else here</a> + </div> + </li> + <li class="nav-item"> + <a class="nav-link btn-rotate" href="#pablo"> + <i class="nc-icon nc-settings-gear-65"></i> + <p> + <span class="d-lg-none d-md-block">Account</span> + </p> + </a> + </li> + </ul> + </div> + </div> + </nav> + <!-- End Navbar --> + <!-- <div class="panel-header panel-header-sm"> + + +</div> --> + <div class="content"> + <div class="row"> + <div class="col-md-12"> + <div class="card"> + <div class="card-header"> + <h5 class="title">Paper Table Heading</h5> + <p class="category">Created using Montserrat Font Family</p> + </div> + <div class="card-body"> + <div class="typography-line"> + <h1> + <span>Header 1</span>The Life of Paper Dashboard </h1> + </div> + <div class="typography-line"> + <h2> + <span>Header 2</span>The Life of Paper Dashboard </h2> + </div> + <div class="typography-line"> + <h3> + <span>Header 3</span>The Life of Paper Dashboard </h3> + </div> + <div class="typography-line"> + <h4> + <span>Header 4</span>The Life of Paper Dashboard </h4> + </div> + <div class="typography-line"> + <h5> + <span>Header 5</span>The Life of Paper Dashboard </h5> + </div> + <div class="typography-line"> + <h6> + <span>Header 6</span>The Life of Paper Dashboard </h6> + </div> + <div class="typography-line"> + <p> + <span>Paragraph</span> + I will be the leader of a company that ends up being worth billions of dollars, because I got the answers. I understand culture. I am the nucleus. I think that’s a responsibility that I have, to push possibilities, to show people, this is the level that things could be at. + </p> + </div> + <div class="typography-line"> + <span>Quote</span> + <blockquote> + <p class="blockquote blockquote-primary"> + "I will be the leader of a company that ends up being worth billions of dollars, because I got the answers. I understand culture. I am the nucleus. I think that’s a responsibility that I have, to push possibilities, to show people, this is the level that things could be at." + <br> + <br> + <small> + - Noaa + </small> + </p> + </blockquote> + </div> + <div class="typography-line"> + <span>Muted Text</span> + <p class="text-muted"> + I will be the leader of a company that ends up being worth billions of dollars, because I got the answers... + </p> + </div> + <div class="typography-line"> + <span>Primary Text</span> + <p class="text-primary"> + I will be the leader of a company that ends up being worth billions of dollars, because I got the answers...</p> + </div> + <div class="typography-line"> + <span>Info Text</span> + <p class="text-info"> + I will be the leader of a company that ends up being worth billions of dollars, because I got the answers... </p> + </div> + <div class="typography-line"> + <span>Success Text</span> + <p class="text-success"> + I will be the leader of a company that ends up being worth billions of dollars, because I got the answers... </p> + </div> + <div class="typography-line"> + <span>Warning Text</span> + <p class="text-warning"> + I will be the leader of a company that ends up being worth billions of dollars, because I got the answers... + </p> + </div> + <div class="typography-line"> + <span>Danger Text</span> + <p class="text-danger"> + I will be the leader of a company that ends up being worth billions of dollars, because I got the answers... </p> + </div> + <div class="typography-line"> + <h2> + <span>Small Tag</span> + Header with small subtitle + <br> + <small>Use "small" tag for the headers</small> + </h2> + </div> + </div> + </div> + </div> + </div> + </div> + <footer class="footer footer-black footer-white "> + <div class="container-fluid"> + <div class="row"> + <nav class="footer-nav"> + <ul> + <li> + <a href="https://www.creative-tim.com" target="_blank">Creative Tim</a> + </li> + <li> + <a href="http://blog.creative-tim.com/" target="_blank">Blog</a> + </li> + <li> + <a href="https://www.creative-tim.com/license" target="_blank">Licenses</a> + </li> + </ul> + </nav> + <div class="credits ml-auto"> + <span class="copyright"> + © + <script> + document.write(new Date().getFullYear()) + </script>, made with <i class="fa fa-heart heart"></i> by Creative Tim + </span> + </div> + </div> + </div> + </footer> + </div> + </div> + <!-- Core JS Files --> + <script src="../assets/js/core/jquery.min.js"></script> + <script src="../assets/js/core/popper.min.js"></script> + <script src="../assets/js/core/bootstrap.min.js"></script> + <script src="../assets/js/plugins/perfect-scrollbar.jquery.min.js"></script> + <!-- Google Maps Plugin --> + <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_KEY_HERE"></script> + <!-- Chart JS --> + <script src="../assets/js/plugins/chartjs.min.js"></script> + <!-- Notifications Plugin --> + <script src="../assets/js/plugins/bootstrap-notify.js"></script> + <!-- Control Center for Now Ui Dashboard: parallax effects, scripts for the example pages etc --> + <script src="../assets/js/paper-dashboard.min.js?v=2.0.0" type="text/javascript"></script> + <!-- Paper Dashboard DEMO methods, don't include it in your project! --> + <script src="../assets/demo/demo.js"></script> +</body> + +</html> diff --git a/explorer/public/paper-dashboard/examples/upgrade.html b/explorer/public/paper-dashboard/examples/upgrade.html new file mode 100644 index 00000000000..301a87f554d --- /dev/null +++ b/explorer/public/paper-dashboard/examples/upgrade.html @@ -0,0 +1,301 @@ +<!-- +========================================================= + Paper Dashboard 2 - v2.0.0 +========================================================= + + Product Page: https://www.creative-tim.com/product/paper-dashboard-2 + Copyright 2019 Creative Tim (https://www.creative-tim.com) + Licensed under MIT (https://github.com/creativetimofficial/paper-dashboard/blob/master/LICENSE) + + Coded by Creative Tim + +========================================================= + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. --> + + + +<!DOCTYPE html> +<html lang="en"> + +<head> + <meta charset="utf-8" /> + <link rel="apple-touch-icon" sizes="76x76" href="../assets/img/apple-icon.png"> + <link rel="icon" type="image/png" href="../assets/img/favicon.png"> + <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> + <title> + Paper Dashboard 2 by Creative Tim + </title> + <meta content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0, shrink-to-fit=no' name='viewport' /> + <!-- Fonts and icons --> + <link href="https://fonts.googleapis.com/css?family=Montserrat:400,700,200" rel="stylesheet" /> + <link href="https://maxcdn.bootstrapcdn.com/font-awesome/latest/css/font-awesome.min.css" rel="stylesheet"> + <!-- CSS Files --> + <link href="../assets/css/bootstrap.min.css" rel="stylesheet" /> + <link href="../assets/css/paper-dashboard.css?v=2.0.0" rel="stylesheet" /> + <!-- CSS Just for demo purpose, don't include it in your project --> + <link href="../assets/demo/demo.css" rel="stylesheet" /> +</head> + +<body class=""> + <div class="wrapper "> + <div class="sidebar" data-color="white" data-active-color="danger"> + <!-- + Tip 1: You can change the color of the sidebar using: data-color="blue | green | orange | red | yellow" + --> + <div class="logo"> + <a href="http://www.creative-tim.com" class="simple-text logo-mini"> + <div class="logo-image-small"> + <img src="../assets/img/logo-small.png"> + </div> + </a> + <a href="http://www.creative-tim.com" class="simple-text logo-normal"> + Creative Tim + <!-- <div class="logo-image-big"> + <img src="../assets/img/logo-big.png"> + </div> --> + </a> + </div> + <div class="sidebar-wrapper"> + <ul class="nav"> + <li> + <a href="./dashboard.html"> + <i class="nc-icon nc-bank"></i> + <p>Dashboard</p> + </a> + </li> + <li> + <a href="./icons.html"> + <i class="nc-icon nc-diamond"></i> + <p>Icons</p> + </a> + </li> + <li> + <a href="./map.html"> + <i class="nc-icon nc-pin-3"></i> + <p>Maps</p> + </a> + </li> + <li> + <a href="./notifications.html"> + <i class="nc-icon nc-bell-55"></i> + <p>Notifications</p> + </a> + </li> + <li> + <a href="./user.html"> + <i class="nc-icon nc-single-02"></i> + <p>User Profile</p> + </a> + </li> + <li> + <a href="./tables.html"> + <i class="nc-icon nc-tile-56"></i> + <p>Table List</p> + </a> + </li> + <li> + <a href="./typography.html"> + <i class="nc-icon nc-caps-small"></i> + <p>Typography</p> + </a> + </li> + <li class="active active-pro " class="active-pro"> + <a href="./upgrade.html"> + <i class="nc-icon nc-spaceship"></i> + <p>Upgrade to PRO</p> + </a> + </li> + </ul> + </div> + </div> + <div class="main-panel"> + <!-- Navbar --> + <nav class="navbar navbar-expand-lg navbar-absolute fixed-top navbar-transparent"> + <div class="container-fluid"> + <div class="navbar-wrapper"> + <div class="navbar-toggle"> + <button type="button" class="navbar-toggler"> + <span class="navbar-toggler-bar bar1"></span> + <span class="navbar-toggler-bar bar2"></span> + <span class="navbar-toggler-bar bar3"></span> + </button> + </div> + <a class="navbar-brand" href="#pablo">Paper Dashboard 2</a> + </div> + <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navigation" aria-controls="navigation-index" aria-expanded="false" aria-label="Toggle navigation"> + <span class="navbar-toggler-bar navbar-kebab"></span> + <span class="navbar-toggler-bar navbar-kebab"></span> + <span class="navbar-toggler-bar navbar-kebab"></span> + </button> + <div class="collapse navbar-collapse justify-content-end" id="navigation"> + <form> + <div class="input-group no-border"> + <input type="text" value="" class="form-control" placeholder="Search..."> + <div class="input-group-append"> + <div class="input-group-text"> + <i class="nc-icon nc-zoom-split"></i> + </div> + </div> + </div> + </form> + <ul class="navbar-nav"> + <li class="nav-item"> + <a class="nav-link btn-magnify" href="#pablo"> + <i class="nc-icon nc-layout-11"></i> + <p> + <span class="d-lg-none d-md-block">Stats</span> + </p> + </a> + </li> + <li class="nav-item btn-rotate dropdown"> + <a class="nav-link dropdown-toggle" href="http://example.com" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> + <i class="nc-icon nc-bell-55"></i> + <p> + <span class="d-lg-none d-md-block">Some Actions</span> + </p> + </a> + <div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdownMenuLink"> + <a class="dropdown-item" href="#">Action</a> + <a class="dropdown-item" href="#">Another action</a> + <a class="dropdown-item" href="#">Something else here</a> + </div> + </li> + <li class="nav-item"> + <a class="nav-link btn-rotate" href="#pablo"> + <i class="nc-icon nc-settings-gear-65"></i> + <p> + <span class="d-lg-none d-md-block">Account</span> + </p> + </a> + </li> + </ul> + </div> + </div> + </nav> + <!-- End Navbar --> + <!-- <div class="panel-header panel-header-sm"> + + +</div> --> + <div class="content"> + <div class="row"> + <div class="col-md-8 ml-auto mr-auto"> + <div class="card card-upgrade"> + <div class="card-header text-center"> + <h4 class="card-title">Paper Dashboard PRO</h3> + <p class="card-category">Are you looking for more components? Please check our Premium Version of Paper Dashboard PRO.</p> + </div> + <div class="card-body"> + <div class="table-responsive table-upgrade"> + <table class="table"> + <thead> + <th></th> + <th class="text-center">Free</th> + <th class="text-center">PRO</th> + </thead> + <tbody> + <tr> + <td>Components</td> + <td class="text-center">16</td> + <td class="text-center">160</td> + </tr> + <tr> + <td>Plugins</td> + <td class="text-center">4</td> + <td class="text-center">13</td> + </tr> + <tr> + <td>Example Pages</td> + <td class="text-center">7</td> + <td class="text-center">27</td> + </tr> + <tr> + <td>Login, Register, Pricing, Lock Pages</td> + <td class="text-center"><i class="nc-icon nc-simple-remove text-danger"></i></td> + <td class="text-center"><i class="nc-icon nc-check-2 text-success"></i></td> + </tr> + <tr> + <td>DataTables, VectorMap, SweetAlert, Wizard, jQueryValidation, FullCalendar etc...</td> + <td class="text-center"><i class="nc-icon nc-simple-remove text-danger"></i></td> + <td class="text-center"><i class="nc-icon nc-check-2 text-success"></i></td> + </tr> + <tr> + <td>Mini Sidebar</td> + <td class="text-center"><i class="nc-icon nc-simple-remove text-danger"></i></td> + <td class="text-center"><i class="nc-icon nc-check-2 text-success"></i></td> + </tr> + <tr> + <td>Premium Support</td> + <td class="text-center"><i class="nc-icon nc-simple-remove text-danger"></i></td> + <td class="text-center"><i class="nc-icon nc-check-2 text-success"></i></td> + </tr> + <tr> + <td></td> + <td class="text-center">Free</td> + <td class="text-center">Just $39</td> + </tr> + <tr> + <td class="text-center"></td> + <td class="text-center"> + <a href="#" class="btn btn-round btn-default disabled">Current Version</a> + </td> + <td class="text-center"> + <a target="_blank" href="https://www.creative-tim.com/product/paper-dashboard-2-pro?ref=pd-free-upgrade-live" class="btn btn-round btn-primary">Upgrade to PRO</a> + </td> + </tr> + </tbody> + </table> + </div> + </div> + </div> + </div> + </div> + </div> + <footer class="footer footer-black footer-white "> + <div class="container-fluid"> + <div class="row"> + <nav class="footer-nav"> + <ul> + <li> + <a href="https://www.creative-tim.com" target="_blank">Creative Tim</a> + </li> + <li> + <a href="http://blog.creative-tim.com/" target="_blank">Blog</a> + </li> + <li> + <a href="https://www.creative-tim.com/license" target="_blank">Licenses</a> + </li> + </ul> + </nav> + <div class="credits ml-auto"> + <span class="copyright"> + © + <script> + document.write(new Date().getFullYear()) + </script>, made with <i class="fa fa-heart heart"></i> by Creative Tim + </span> + </div> + </div> + </div> + </footer> + </div> + </div> + <!-- Core JS Files --> + <script src="../assets/js/core/jquery.min.js"></script> + <script src="../assets/js/core/popper.min.js"></script> + <script src="../assets/js/core/bootstrap.min.js"></script> + <script src="../assets/js/plugins/perfect-scrollbar.jquery.min.js"></script> + <!-- Google Maps Plugin --> + <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_KEY_HERE"></script> + <!-- Chart JS --> + <script src="../assets/js/plugins/chartjs.min.js"></script> + <!-- Notifications Plugin --> + <script src="../assets/js/plugins/bootstrap-notify.js"></script> + <!-- Control Center for Now Ui Dashboard: parallax effects, scripts for the example pages etc --> + <script src="../assets/js/paper-dashboard.min.js?v=2.0.0" type="text/javascript"></script> + <!-- Paper Dashboard DEMO methods, don't include it in your project! --> + <script src="../assets/demo/demo.js"></script> +</body> + +</html> diff --git a/explorer/public/paper-dashboard/examples/user.html b/explorer/public/paper-dashboard/examples/user.html new file mode 100644 index 00000000000..3bb734be2e5 --- /dev/null +++ b/explorer/public/paper-dashboard/examples/user.html @@ -0,0 +1,431 @@ +<!-- +========================================================= + Paper Dashboard 2 - v2.0.0 +========================================================= + + Product Page: https://www.creative-tim.com/product/paper-dashboard-2 + Copyright 2019 Creative Tim (https://www.creative-tim.com) + Licensed under MIT (https://github.com/creativetimofficial/paper-dashboard/blob/master/LICENSE) + + Coded by Creative Tim + +========================================================= + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. --> + + + +<!DOCTYPE html> +<html lang="en"> + +<head> + <meta charset="utf-8" /> + <link rel="apple-touch-icon" sizes="76x76" href="../assets/img/apple-icon.png"> + <link rel="icon" type="image/png" href="../assets/img/favicon.png"> + <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> + <title> + Paper Dashboard 2 by Creative Tim + </title> + <meta content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0, shrink-to-fit=no' name='viewport' /> + <!-- Fonts and icons --> + <link href="https://fonts.googleapis.com/css?family=Montserrat:400,700,200" rel="stylesheet" /> + <link href="https://maxcdn.bootstrapcdn.com/font-awesome/latest/css/font-awesome.min.css" rel="stylesheet"> + <!-- CSS Files --> + <link href="../assets/css/bootstrap.min.css" rel="stylesheet" /> + <link href="../assets/css/paper-dashboard.css?v=2.0.0" rel="stylesheet" /> + <!-- CSS Just for demo purpose, don't include it in your project --> + <link href="../assets/demo/demo.css" rel="stylesheet" /> +</head> + +<body class=""> + <div class="wrapper "> + <div class="sidebar" data-color="white" data-active-color="danger"> + <!-- + Tip 1: You can change the color of the sidebar using: data-color="blue | green | orange | red | yellow" + --> + <div class="logo"> + <a href="http://www.creative-tim.com" class="simple-text logo-mini"> + <div class="logo-image-small"> + <img src="../assets/img/logo-small.png"> + </div> + </a> + <a href="http://www.creative-tim.com" class="simple-text logo-normal"> + Creative Tim + <!-- <div class="logo-image-big"> + <img src="../assets/img/logo-big.png"> + </div> --> + </a> + </div> + <div class="sidebar-wrapper"> + <ul class="nav"> + <li> + <a href="./dashboard.html"> + <i class="nc-icon nc-bank"></i> + <p>Dashboard</p> + </a> + </li> + <li> + <a href="./icons.html"> + <i class="nc-icon nc-diamond"></i> + <p>Icons</p> + </a> + </li> + <li> + <a href="./map.html"> + <i class="nc-icon nc-pin-3"></i> + <p>Maps</p> + </a> + </li> + <li> + <a href="./notifications.html"> + <i class="nc-icon nc-bell-55"></i> + <p>Notifications</p> + </a> + </li> + <li class="active "> + <a href="./user.html"> + <i class="nc-icon nc-single-02"></i> + <p>User Profile</p> + </a> + </li> + <li> + <a href="./tables.html"> + <i class="nc-icon nc-tile-56"></i> + <p>Table List</p> + </a> + </li> + <li> + <a href="./typography.html"> + <i class="nc-icon nc-caps-small"></i> + <p>Typography</p> + </a> + </li> + <li class="active-pro"> + <a href="./upgrade.html"> + <i class="nc-icon nc-spaceship"></i> + <p>Upgrade to PRO</p> + </a> + </li> + </ul> + </div> + </div> + <div class="main-panel"> + <!-- Navbar --> + <nav class="navbar navbar-expand-lg navbar-absolute fixed-top navbar-transparent"> + <div class="container-fluid"> + <div class="navbar-wrapper"> + <div class="navbar-toggle"> + <button type="button" class="navbar-toggler"> + <span class="navbar-toggler-bar bar1"></span> + <span class="navbar-toggler-bar bar2"></span> + <span class="navbar-toggler-bar bar3"></span> + </button> + </div> + <a class="navbar-brand" href="#pablo">Paper Dashboard 2</a> + </div> + <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navigation" aria-controls="navigation-index" aria-expanded="false" aria-label="Toggle navigation"> + <span class="navbar-toggler-bar navbar-kebab"></span> + <span class="navbar-toggler-bar navbar-kebab"></span> + <span class="navbar-toggler-bar navbar-kebab"></span> + </button> + <div class="collapse navbar-collapse justify-content-end" id="navigation"> + <form> + <div class="input-group no-border"> + <input type="text" value="" class="form-control" placeholder="Search..."> + <div class="input-group-append"> + <div class="input-group-text"> + <i class="nc-icon nc-zoom-split"></i> + </div> + </div> + </div> + </form> + <ul class="navbar-nav"> + <li class="nav-item"> + <a class="nav-link btn-magnify" href="#pablo"> + <i class="nc-icon nc-layout-11"></i> + <p> + <span class="d-lg-none d-md-block">Stats</span> + </p> + </a> + </li> + <li class="nav-item btn-rotate dropdown"> + <a class="nav-link dropdown-toggle" href="http://example.com" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> + <i class="nc-icon nc-bell-55"></i> + <p> + <span class="d-lg-none d-md-block">Some Actions</span> + </p> + </a> + <div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdownMenuLink"> + <a class="dropdown-item" href="#">Action</a> + <a class="dropdown-item" href="#">Another action</a> + <a class="dropdown-item" href="#">Something else here</a> + </div> + </li> + <li class="nav-item"> + <a class="nav-link btn-rotate" href="#pablo"> + <i class="nc-icon nc-settings-gear-65"></i> + <p> + <span class="d-lg-none d-md-block">Account</span> + </p> + </a> + </li> + </ul> + </div> + </div> + </nav> + <!-- End Navbar --> + <!-- <div class="panel-header panel-header-sm"> + + +</div> --> + <div class="content"> + <div class="row"> + <div class="col-md-4"> + <div class="card card-user"> + <div class="image"> + <img src="../assets/img/damir-bosnjak.jpg" alt="..."> + </div> + <div class="card-body"> + <div class="author"> + <a href="#"> + <img class="avatar border-gray" src="../assets/img/mike.jpg" alt="..."> + <h5 class="title">Chet Faker</h5> + </a> + <p class="description"> + @chetfaker + </p> + </div> + <p class="description text-center"> + "I like the way you work it + <br> No diggity + <br> I wanna bag it up" + </p> + </div> + <div class="card-footer"> + <hr> + <div class="button-container"> + <div class="row"> + <div class="col-lg-3 col-md-6 col-6 ml-auto"> + <h5>12 + <br> + <small>Files</small> + </h5> + </div> + <div class="col-lg-4 col-md-6 col-6 ml-auto mr-auto"> + <h5>2GB + <br> + <small>Used</small> + </h5> + </div> + <div class="col-lg-3 mr-auto"> + <h5>24,6$ + <br> + <small>Spent</small> + </h5> + </div> + </div> + </div> + </div> + </div> + <div class="card"> + <div class="card-header"> + <h4 class="card-title">Team Members</h4> + </div> + <div class="card-body"> + <ul class="list-unstyled team-members"> + <li> + <div class="row"> + <div class="col-md-2 col-2"> + <div class="avatar"> + <img src="../assets/img/faces/ayo-ogunseinde-2.jpg" alt="Circle Image" class="img-circle img-no-padding img-responsive"> + </div> + </div> + <div class="col-md-7 col-7"> + DJ Khaled + <br /> + <span class="text-muted"> + <small>Offline</small> + </span> + </div> + <div class="col-md-3 col-3 text-right"> + <btn class="btn btn-sm btn-outline-success btn-round btn-icon"><i class="fa fa-envelope"></i></btn> + </div> + </div> + </li> + <li> + <div class="row"> + <div class="col-md-2 col-2"> + <div class="avatar"> + <img src="../assets/img/faces/joe-gardner-2.jpg" alt="Circle Image" class="img-circle img-no-padding img-responsive"> + </div> + </div> + <div class="col-md-7 col-7"> + Creative Tim + <br /> + <span class="text-success"> + <small>Available</small> + </span> + </div> + <div class="col-md-3 col-3 text-right"> + <btn class="btn btn-sm btn-outline-success btn-round btn-icon"><i class="fa fa-envelope"></i></btn> + </div> + </div> + </li> + <li> + <div class="row"> + <div class="col-md-2 col-2"> + <div class="avatar"> + <img src="../assets/img/faces/clem-onojeghuo-2.jpg" alt="Circle Image" class="img-circle img-no-padding img-responsive"> + </div> + </div> + <div class="col-ms-7 col-7"> + Flume + <br /> + <span class="text-danger"> + <small>Busy</small> + </span> + </div> + <div class="col-md-3 col-3 text-right"> + <btn class="btn btn-sm btn-outline-success btn-round btn-icon"><i class="fa fa-envelope"></i></btn> + </div> + </div> + </li> + </ul> + </div> + </div> + </div> + <div class="col-md-8"> + <div class="card card-user"> + <div class="card-header"> + <h5 class="card-title">Edit Profile</h5> + </div> + <div class="card-body"> + <form> + <div class="row"> + <div class="col-md-5 pr-1"> + <div class="form-group"> + <label>Company (disabled)</label> + <input type="text" class="form-control" disabled="" placeholder="Company" value="Creative Code Inc."> + </div> + </div> + <div class="col-md-3 px-1"> + <div class="form-group"> + <label>Username</label> + <input type="text" class="form-control" placeholder="Username" value="michael23"> + </div> + </div> + <div class="col-md-4 pl-1"> + <div class="form-group"> + <label for="exampleInputEmail1">Email address</label> + <input type="email" class="form-control" placeholder="Email"> + </div> + </div> + </div> + <div class="row"> + <div class="col-md-6 pr-1"> + <div class="form-group"> + <label>First Name</label> + <input type="text" class="form-control" placeholder="Company" value="Chet"> + </div> + </div> + <div class="col-md-6 pl-1"> + <div class="form-group"> + <label>Last Name</label> + <input type="text" class="form-control" placeholder="Last Name" value="Faker"> + </div> + </div> + </div> + <div class="row"> + <div class="col-md-12"> + <div class="form-group"> + <label>Address</label> + <input type="text" class="form-control" placeholder="Home Address" value="Melbourne, Australia"> + </div> + </div> + </div> + <div class="row"> + <div class="col-md-4 pr-1"> + <div class="form-group"> + <label>City</label> + <input type="text" class="form-control" placeholder="City" value="Melbourne"> + </div> + </div> + <div class="col-md-4 px-1"> + <div class="form-group"> + <label>Country</label> + <input type="text" class="form-control" placeholder="Country" value="Australia"> + </div> + </div> + <div class="col-md-4 pl-1"> + <div class="form-group"> + <label>Postal Code</label> + <input type="number" class="form-control" placeholder="ZIP Code"> + </div> + </div> + </div> + <div class="row"> + <div class="col-md-12"> + <div class="form-group"> + <label>About Me</label> + <textarea class="form-control textarea">Oh so, your weak rhyme You doubt I'll bother, reading into it</textarea> + </div> + </div> + </div> + <div class="row"> + <div class="update ml-auto mr-auto"> + <button type="submit" class="btn btn-primary btn-round">Update Profile</button> + </div> + </div> + </form> + </div> + </div> + </div> + </div> + </div> + <footer class="footer footer-black footer-white "> + <div class="container-fluid"> + <div class="row"> + <nav class="footer-nav"> + <ul> + <li> + <a href="https://www.creative-tim.com" target="_blank">Creative Tim</a> + </li> + <li> + <a href="http://blog.creative-tim.com/" target="_blank">Blog</a> + </li> + <li> + <a href="https://www.creative-tim.com/license" target="_blank">Licenses</a> + </li> + </ul> + </nav> + <div class="credits ml-auto"> + <span class="copyright"> + © + <script> + document.write(new Date().getFullYear()) + </script>, made with <i class="fa fa-heart heart"></i> by Creative Tim + </span> + </div> + </div> + </div> + </footer> + </div> + </div> + <!-- Core JS Files --> + <script src="../assets/js/core/jquery.min.js"></script> + <script src="../assets/js/core/popper.min.js"></script> + <script src="../assets/js/core/bootstrap.min.js"></script> + <script src="../assets/js/plugins/perfect-scrollbar.jquery.min.js"></script> + <!-- Google Maps Plugin --> + <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_KEY_HERE"></script> + <!-- Chart JS --> + <script src="../assets/js/plugins/chartjs.min.js"></script> + <!-- Notifications Plugin --> + <script src="../assets/js/plugins/bootstrap-notify.js"></script> + <!-- Control Center for Now Ui Dashboard: parallax effects, scripts for the example pages etc --> + <script src="../assets/js/paper-dashboard.min.js?v=2.0.0" type="text/javascript"></script> + <!-- Paper Dashboard DEMO methods, don't include it in your project! --> + <script src="../assets/demo/demo.js"></script> +</body> + +</html> diff --git a/explorer/public/paper-dashboard/gulpfile.js b/explorer/public/paper-dashboard/gulpfile.js new file mode 100644 index 00000000000..96205b006f6 --- /dev/null +++ b/explorer/public/paper-dashboard/gulpfile.js @@ -0,0 +1,34 @@ +var gulp = require('gulp'); +var path = require('path'); +var sass = require('gulp-sass'); +var autoprefixer = require('gulp-autoprefixer'); +var sourcemaps = require('gulp-sourcemaps'); +var open = require('gulp-open'); + +var Paths = { + HERE: './', + DIST: 'dist/', + CSS: './assets/css/', + SCSS_TOOLKIT_SOURCES: './assets/scss/paper-dashboard.scss', + SCSS: './assets/scss/**/**' +}; + +gulp.task('compile-scss', function() { + return gulp.src(Paths.SCSS_TOOLKIT_SOURCES) + .pipe(sourcemaps.init()) + .pipe(sass().on('error', sass.logError)) + .pipe(autoprefixer()) + .pipe(sourcemaps.write(Paths.HERE)) + .pipe(gulp.dest(Paths.CSS)); +}); + +gulp.task('watch', function() { + gulp.watch(Paths.SCSS, ['compile-scss']); +}); + +gulp.task('open', function() { + gulp.src('examples/dashboard.html') + .pipe(open()); +}); + +gulp.task('open-app', ['open', 'watch']); \ No newline at end of file diff --git a/explorer/public/paper-dashboard/nucleo-icons.html b/explorer/public/paper-dashboard/nucleo-icons.html new file mode 100644 index 00000000000..53ab2fef46d --- /dev/null +++ b/explorer/public/paper-dashboard/nucleo-icons.html @@ -0,0 +1,1139 @@ +<!doctype html> +<html lang="en"> + +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <link rel="stylesheet" href="./assets/css/now-ui-dashboard.css"> + <link rel="shortcut icon" href="./assets/img/favicon.png"> + <title>Nucleo Outline Web Font</title> + <script src="https://code.jquery.com/jquery-3.2.1.min.js" integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" crossorigin="anonymous"></script> + <style media="screen"> + /* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) + */ + + html, + body, + div, + span, + applet, + object, + iframe, + h1, + h2, + h3, + h4, + h5, + h6, + p, + blockquote, + pre, + a, + abbr, + acronym, + address, + big, + cite, + code, + del, + dfn, + em, + img, + ins, + kbd, + q, + s, + samp, + small, + strike, + strong, + sub, + sup, + tt, + var, + b, + u, + i, + center, + dl, + dt, + dd, + ol, + ul, + li, + fieldset, + form, + label, + legend, + table, + caption, + tbody, + tfoot, + thead, + tr, + th, + td, + article, + aside, + canvas, + details, + embed, + figure, + figcaption, + footer, + header, + hgroup, + menu, + nav, + output, + ruby, + section, + summary, + time, + mark, + audio, + video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; + } + + /* HTML5 display-role reset for older browsers */ + + article, + aside, + details, + figcaption, + figure, + footer, + header, + hgroup, + menu, + nav, + section, + main { + display: block; + } + + body { + line-height: 1; + } + + ol, + ul { + list-style: none; + } + + blockquote, + q { + quotes: none; + } + + blockquote:before, + blockquote:after, + q:before, + q:after { + content: ''; + content: none; + } + + table { + border-collapse: collapse; + border-spacing: 0; + } + + + + /* -------------------------------- + + Nucleo Outline Web Font - nucleoapp.com/ + License - nucleoapp.com/license/ + Created using IcoMoon - icomoon.io + + -------------------------------- */ + + /* -------------------------------- + + Primary style + + -------------------------------- */ + + *, + *::after, + *::before { + box-sizing: border-box; + } + + html { + font-size: 62.5%; + } + + body { + font-size: 1.6rem; + font-family: sans-serif; + color: #333333; + background: #efefef url("assets/img/nucleo-logo.svg") no-repeat center top; + } + + a { + color: #766acf; + text-decoration: none; + } + + /* -------------------------------- + + Main components + + -------------------------------- */ + + header { + text-align: center; + padding: 120px 0 0; + } + + header h1 { + font-size: 2rem; + } + + header p { + font-size: 1.4rem; + margin-top: .6em; + } + + header a:hover { + text-decoration: underline; + } + + section { + width: 90%; + max-width: 1200px; + margin: 50px auto; + } + + section h2 { + border-bottom: 1px solid #e2e2e2; + padding: 0 0 1em .2em; + margin-bottom: 1em; + } + + ul::after { + clear: both; + content: ""; + display: table; + } + + ul li { + width: 25%; + float: left; + padding: 16px 0; + text-align: center; + border-radius: .25em; + -webkit-transition: background 0.2s; + -moz-transition: background 0.2s; + transition: background 0.2s; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + overflow: hidden; + } + + ul li:hover { + background: #dbdbdb; + } + + ul p, + ul em, + ul input { + display: inline-block; + font-size: 1rem; + color: #999999; + -webkit-user-select: auto; + -moz-user-select: auto; + -ms-user-select: auto; + user-select: auto; + white-space: nowrap; + width: 100%; + overflow: hidden; + text-overflow: ellipsis; + cursor: pointer; + } + + ul p { + padding: 10px; + margin-top: 10px; + } + + ul p::selection, + ul em::selection { + background: #766acf; + color: #efefef; + } + + ul em { + margin-bottom: 8px; + } + + ul em::before { + content: '['; + } + + ul em::after { + content: ']'; + } + + ul input { + text-align: center; + background: transparent; + border: none; + box-shadow: none; + outline: none; + } + + @media only screen and (min-width: 768px) { + ul li { + width: 20%; + float: left; + } + } + + @media only screen and (min-width: 1024px) { + ul li { + width: 12.5%; + float: left; + padding: 32px 0; + } + } + + /* -------------------------------- + + Smart fixed navigation + + -------------------------------- */ + + #cd-nav ul { + /* mobile first */ + position: fixed; + width: 90%; + max-width: 400px; + max-height: 90%; + right: 5%; + bottom: 5%; + border-radius: 0.25em; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); + background: white; + visibility: hidden; + /* remove overflow:hidden if you want to create a drop-down menu - but then remember to fix/eliminate the list items animation */ + overflow: hidden; + overflow-y: auto; + z-index: 1; + /* Force Hardware Acceleration in WebKit */ + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-transform: scale(0); + -moz-transform: scale(0); + -ms-transform: scale(0); + -o-transform: scale(0); + transform: scale(0); + -webkit-transform-origin: 100% 100%; + -moz-transform-origin: 100% 100%; + -ms-transform-origin: 100% 100%; + -o-transform-origin: 100% 100%; + transform-origin: 100% 100%; + -webkit-transition: -webkit-transform 0.3s, visibility 0s 0.3s; + -moz-transition: -moz-transform 0.3s, visibility 0s 0.3s; + transition: transform 0.3s, visibility 0s 0.3s; + } + + #cd-nav ul li { + /* Force Hardware Acceleration in WebKit */ + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + display: block; + width: 100%; + padding: 0; + text-align: left; + } + + #cd-nav ul li:hover { + background-color: #FFF; + } + + #cd-nav ul.is-visible { + visibility: visible; + -webkit-transform: scale(1); + -moz-transform: scale(1); + -ms-transform: scale(1); + -o-transform: scale(1); + transform: scale(1); + -webkit-transition: -webkit-transform 0.3s, visibility 0s 0s; + -moz-transition: -moz-transform 0.3s, visibility 0s 0s; + transition: transform 0.3s, visibility 0s 0s; + } + + #cd-nav li a { + display: block; + padding: 1em; + font-size: 1.2rem; + border-bottom: 1px solid #eff2f6; + } + + #cd-nav li a:hover { + color: #333333; + } + + #cd-nav li:last-child a { + border-bottom: none; + } + + .cd-nav-trigger { + position: fixed; + bottom: 5%; + right: 5%; + width: 44px; + height: 44px; + background: white; + border-radius: 0.25em; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); + /* image replacement */ + overflow: hidden; + text-indent: 100%; + white-space: nowrap; + z-index: 2; + } + + .cd-nav-trigger span { + /* the span element is used to create the menu icon */ + position: absolute; + display: block; + width: 20px; + height: 2px; + background: #333333; + top: 50%; + margin-top: -1px; + left: 50%; + margin-left: -10px; + -webkit-transition: background 0.3s; + -moz-transition: background 0.3s; + transition: background 0.3s; + } + + .cd-nav-trigger span::before, + .cd-nav-trigger span::after { + content: ''; + position: absolute; + left: 0; + background: inherit; + width: 100%; + height: 100%; + /* Force Hardware Acceleration in WebKit */ + -webkit-transform: translateZ(0); + -moz-transform: translateZ(0); + -ms-transform: translateZ(0); + -o-transform: translateZ(0); + transform: translateZ(0); + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-transition: -webkit-transform 0.3s, background 0s; + -moz-transition: -moz-transform 0.3s, background 0s; + transition: transform 0.3s, background 0s; + } + + .cd-nav-trigger span::before { + top: -6px; + -webkit-transform: rotate(0); + -moz-transform: rotate(0); + -ms-transform: rotate(0); + -o-transform: rotate(0); + transform: rotate(0); + } + + .cd-nav-trigger span::after { + bottom: -6px; + -webkit-transform: rotate(0); + -moz-transform: rotate(0); + -ms-transform: rotate(0); + -o-transform: rotate(0); + transform: rotate(0); + } + + .cd-nav-trigger.menu-is-open { + box-shadow: none; + } + + .cd-nav-trigger.menu-is-open span { + background: rgba(232, 74, 100, 0); + } + + .cd-nav-trigger.menu-is-open span::before, + .cd-nav-trigger.menu-is-open span::after { + background: #333333; + } + + .cd-nav-trigger.menu-is-open span::before { + top: 0; + -webkit-transform: rotate(135deg); + -moz-transform: rotate(135deg); + -ms-transform: rotate(135deg); + -o-transform: rotate(135deg); + transform: rotate(135deg); + } + + .cd-nav-trigger.menu-is-open span::after { + bottom: 0; + -webkit-transform: rotate(225deg); + -moz-transform: rotate(225deg); + -ms-transform: rotate(225deg); + -o-transform: rotate(225deg); + transform: rotate(225deg); + } + + .now-ui-icons { + display: inline-block; + font: normal normal normal 32px/1 'Nucleo Outline'; + speak: none; + text-transform: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } + </style> +</head> + +<body> + <header> + <h1>Nucleo Outline Web Font v2.9</h1> + <p> + <a href="https://nucleoapp.com/?ref=creativetim">nucleoapp.com</a> + </p> + </header> + <div id="cd-nav"> + <a id="cd-nav-trigger" href="#0" class="cd-nav-trigger">Menu + <span></span> + </a> + <nav> + <ul id="cd-main-nav"> + <li> + <a href="#arrows">Arrows</a> + </li> + <li> + <a href="#business">Business & Finance</a> + </li> + <li> + <a href="#clothes">Clothes & Accessories</a> + </li> + <li> + <a href="#design">Design & Development</a> + </li> + <li> + <a href="#emoticons">Emoticons</a> + </li> + <li> + <a href="#files">Files & Folders</a> + </li> + <li> + <a href="#medical">Healthcare & Medical</a> + </li> + <li> + <a href="#loaders">Loaders</a> + </li> + <li> + <a href="#maps">Maps & Location</a> + </li> + <li> + <a href="#media">Media</a> + </li> + <li> + <a href="#objects">Objects</a> + </li> + <li> + <a href="#school">School & Education</a> + </li> + <li> + <a href="#shopping">Shopping</a> + </li> + <li> + <a href="#sport">Sport</a> + </li> + <li> + <a href="#technology">Technology</a> + </li> + <li> + <a href="#text">Text Editing</a> + </li> + <li> + <a href="#gestures">Touch Gestures</a> + </li> + <li> + <a href="#transportation">Transportation</a> + </li> + <li> + <a href="#travel">Travel</a> + </li> + <li> + <a href="#interface">User Interface</a> + </li> + <li> + <a href="#users">Users</a> + </li> + </ul> + </nav> + </div> + <div id="icons-wrapper"> + <section id="arrows"> + <h2>Arrows</h2> + <ul> + <li> + <i class="now-ui-icons arrows-1_cloud-download-93"></i> + <p>arrows-1_cloud-download-93</p> + </li> + <li> + <i class="now-ui-icons arrows-1_cloud-upload-94"></i> + <p>arrows-1_cloud-upload-94</p> + </li> + <li> + <i class="now-ui-icons arrows-1_minimal-down"></i> + <p>arrows-1_minimal-down</p> + </li> + <li> + <i class="now-ui-icons arrows-1_minimal-left"></i> + <p>arrows-1_minimal-left</p> + </li> + <li> + <i class="now-ui-icons arrows-1_minimal-right"></i> + <p>arrows-1_minimal-right</p> + </li> + <li> + <i class="now-ui-icons arrows-1_minimal-up"></i> + <p>arrows-1_minimal-up</p> + </li> + <li> + <i class="now-ui-icons arrows-1_refresh-69"></i> + <p>arrows-1_refresh-69</p> + </li> + <li> + <i class="now-ui-icons arrows-1_share-66"></i> + <p>arrows-1_share-66</p> + </li> + </ul> + </section> + <section id="business"> + <h2>Business & Finance</h2> + <ul> + <li> + <i class="now-ui-icons business_badge"></i> + <p>business_badge</p> + </li> + <li> + <i class="now-ui-icons business_bank"></i> + <p>business_bank</p> + </li> + <li> + <i class="now-ui-icons business_briefcase-24"></i> + <p>business_briefcase-24</p> + </li> + <li> + <i class="now-ui-icons business_bulb-63"></i> + <p>business_bulb-63</p> + </li> + <li> + <i class="now-ui-icons business_chart-bar-32"></i> + <p>business_chart-bar-32</p> + </li> + <li> + <i class="now-ui-icons business_chart-pie-36"></i> + <p>business_chart-pie-36</p> + </li> + <li> + <i class="now-ui-icons business_globe"></i> + <p>business_globe</p> + </li> + <li> + <i class="now-ui-icons business_money-coins"></i> + <p>business_money-coins</p> + </li> + </ul> + </section> + <section id="clothes"> + <h2>Clothes & Accessories</h2> + <ul> + <li> + <i class="now-ui-icons clothes_tie-bow"></i> + <p>clothes_tie-bow</p> + </li> + </ul> + </section> + <section id="design"> + <h2>Design & Development</h2> + <ul> + <li> + <i class="now-ui-icons design_app"></i> + <p>design_app</p> + </li> + <li> + <i class="now-ui-icons design_bullet-list-67"></i> + <p>design_bullet-list-67</p> + </li> + <li> + <i class="now-ui-icons design_image"></i> + <p>design_image</p> + </li> + <li> + <i class="now-ui-icons design_palette"></i> + <p>design_palette</p> + </li> + <li> + <i class="now-ui-icons design_scissors"></i> + <p>design_scissors</p> + </li> + <li> + <i class="now-ui-icons design_vector"></i> + <p>design_vector</p> + </li> + <li> + <i class="now-ui-icons design-2_html5"></i> + <p>design-2_html5</p> + </li> + <li> + <i class="now-ui-icons design-2_ruler-pencil"></i> + <p>design-2_ruler-pencil</p> + </li> + </ul> + </section> + <section id="emoticons"> + <h2>Emoticons</h2> + <ul> + <li> + <i class="now-ui-icons emoticons_satisfied"></i> + <p>emoticons_satisfied</p> + </li> + </ul> + </section> + <section id="files"> + <h2>Files & Folders</h2> + <ul> + <li> + <i class="now-ui-icons files_box"></i> + <p>files_box</p> + </li> + <li> + <i class="now-ui-icons files_paper"></i> + <p>files_paper</p> + </li> + <li> + <i class="now-ui-icons files_single-copy-04"></i> + <p>files_single-copy-04</p> + </li> + </ul> + </section> + <section id="medical"> + <h2>Healthcare & Medical</h2> + <ul> + <li> + <i class="now-ui-icons health_ambulance"></i> + <p>health_ambulance</p> + </li> + </ul> + </section> + <section id="loaders"> + <h2>Loaders</h2> + <ul> + <li> + <i class="now-ui-icons loader_gear spin"></i> + <p>loader_gear</p> + </li> + <li> + <i class="now-ui-icons loader_refresh spin"></i> + <p>loader_refresh</p> + </li> + </ul> + </section> + <section id="maps"> + <h2>Maps & Location</h2> + <ul> + <li> + <i class="now-ui-icons location_bookmark"></i> + <p>location_bookmark</p> + </li> + <li> + <i class="now-ui-icons location_compass-05"></i> + <p>location_compass-05</p> + </li> + <li> + <i class="now-ui-icons location_map-big"></i> + <p>location_map-big</p> + </li> + <li> + <i class="now-ui-icons location_pin"></i> + <p>location_pin</p> + </li> + <li> + <i class="now-ui-icons location_world"></i> + <p>location_world</p> + </li> + </ul> + </section> + <section id="media"> + <h2>Media</h2> + <ul> + <li> + <i class="now-ui-icons media-1_album"></i> + <p>media-1_album</p> + </li> + <li> + <i class="now-ui-icons media-1_button-pause"></i> + <p>media-1_button-pause</p> + </li> + <li> + <i class="now-ui-icons media-1_button-play"></i> + <p>media-1_button-play</p> + </li> + <li> + <i class="now-ui-icons media-1_button-power"></i> + <p>media-1_button-power</p> + </li> + <li> + <i class="now-ui-icons media-1_camera-compact"></i> + <p>media-1_camera-compact</p> + </li> + <li> + <i class="now-ui-icons media-2_note-03"></i> + <p>media-2_note-03</p> + </li> + <li> + <i class="now-ui-icons media-2_sound-wave"></i> + <p>media-2_sound-wave</p> + </li> + </ul> + </section> + <section id="objects"> + <h2>Objects</h2> + <ul> + <li> + <i class="now-ui-icons objects_diamond"></i> + <p>objects_diamond</p> + </li> + <li> + <i class="now-ui-icons objects_globe"></i> + <p>objects_globe</p> + </li> + <li> + <i class="now-ui-icons objects_key-25"></i> + <p>objects_key-25</p> + </li> + <li> + <i class="now-ui-icons objects_planet"></i> + <p>objects_planet</p> + </li> + <li> + <i class="now-ui-icons objects_spaceship"></i> + <p>objects_spaceship</p> + </li> + <li> + <i class="now-ui-icons objects_support-17"></i> + <p>objects_support-17</p> + </li> + <li> + <i class="now-ui-icons objects_umbrella-13"></i> + <p>objects_umbrella-13</p> + </li> + </ul> + </section> + <section id="school"> + <h2>School & Education</h2> + <ul> + <li> + <i class="now-ui-icons education_agenda-bookmark"></i> + <p>education_agenda-bookmark</p> + </li> + <li> + <i class="now-ui-icons education_atom"></i> + <p>education_atom</p> + </li> + <li> + <i class="now-ui-icons education_glasses"></i> + <p>education_glasses</p> + </li> + <li> + <i class="now-ui-icons education_hat"></i> + <p>education_hat</p> + </li> + <li> + <i class="now-ui-icons education_paper"></i> + <p>education_paper</p> + </li> + </ul> + </section> + <section id="shopping"> + <h2>Shopping</h2> + <ul> + <li> + <i class="now-ui-icons shopping_bag-16"></i> + <p>shopping_bag-16</p> + </li> + <li> + <i class="now-ui-icons shopping_basket"></i> + <p>shopping_basket</p> + </li> + <li> + <i class="now-ui-icons shopping_box"></i> + <p>shopping_box</p> + </li> + <li> + <i class="now-ui-icons shopping_cart-simple"></i> + <p>shopping_cart-simple</p> + </li> + <li> + <i class="now-ui-icons shopping_credit-card"></i> + <p>shopping_credit-card</p> + </li> + <li> + <i class="now-ui-icons shopping_delivery-fast"></i> + <p>shopping_delivery-fast</p> + </li> + <li> + <i class="now-ui-icons shopping_shop"></i> + <p>shopping_shop</p> + </li> + <li> + <i class="now-ui-icons shopping_tag-content"></i> + <p>shopping_tag-content</p> + </li> + </ul> + </section> + <section id="sport"> + <h2>Sport</h2> + <ul> + <li> + <i class="now-ui-icons sport_trophy"></i> + <p>sport_trophy</p> + </li> + <li> + <i class="now-ui-icons sport_user-run"></i> + <p>sport_user-run</p> + </li> + </ul> + </section> + <section id="technology"> + <h2>Technology</h2> + <ul> + <li> + <i class="now-ui-icons tech_controller-modern"></i> + <p>tech_controller-modern</p> + </li> + <li> + <i class="now-ui-icons tech_headphones"></i> + <p>tech_headphones</p> + </li> + <li> + <i class="now-ui-icons tech_laptop"></i> + <p>tech_laptop</p> + </li> + <li> + <i class="now-ui-icons tech_mobile"></i> + <p>tech_mobile</p> + </li> + <li> + <i class="now-ui-icons tech_tablet"></i> + <p>tech_tablet</p> + </li> + <li> + <i class="now-ui-icons tech_tv"></i> + <p>tech_tv</p> + </li> + <li> + <i class="now-ui-icons tech_watch-time"></i> + <p>tech_watch-time</p> + </li> + </ul> + </section> + <section id="text"> + <h2>Text Editing</h2> + <ul> + <li> + <i class="now-ui-icons text_align-center"></i> + <p>text_align-center</p> + </li> + <li> + <i class="now-ui-icons text_align-left"></i> + <p>text_align-left</p> + </li> + <li> + <i class="now-ui-icons text_bold"></i> + <p>text_bold</p> + </li> + <li> + <i class="now-ui-icons text_caps-small"></i> + <p>text_caps-small</p> + </li> + </ul> + </section> + <section id="gestures"> + <h2>Touch Gestures</h2> + <ul> + <li> + <i class="now-ui-icons gestures_tap-01"></i> + <p>gestures_tap-01</p> + </li> + </ul> + </section> + <section id="transportation"> + <h2>Transportation</h2> + <ul> + <li> + <i class="now-ui-icons transportation_air-baloon"></i> + <p>transportation_air-baloon</p> + </li> + <li> + <i class="now-ui-icons transportation_bus-front-12"></i> + <p>transportation_bus-front-12</p> + </li> + </ul> + </section> + <section id="travel"> + <h2>Travel</h2> + <ul> + <li> + <i class="now-ui-icons travel_info"></i> + <p>travel_info</p> + </li> + <li> + <i class="now-ui-icons travel_istanbul"></i> + <p>travel_istanbul</p> + </li> + </ul> + </section> + <section id="interface"> + <h2>User Interface</h2> + <ul> + <li> + <i class="now-ui-icons ui-1_bell-53"></i> + <p>ui-1_bell-53</p> + </li> + <li> + <i class="now-ui-icons ui-1_calendar-60"></i> + <p>ui-1_calendar-60</p> + </li> + <li> + <i class="now-ui-icons ui-1_check"></i> + <p>ui-1_check</p> + </li> + <li> + <i class="now-ui-icons ui-1_lock-circle-open"></i> + <p>ui-1_lock-circle-open</p> + </li> + <li> + <i class="now-ui-icons ui-1_send"></i> + <p>ui-1_send</p> + </li> + <li> + <i class="now-ui-icons ui-1_settings-gear-63"></i> + <p>ui-1_settings-gear-63</p> + </li> + <li> + <i class="now-ui-icons ui-1_simple-add"></i> + <p>ui-1_simple-add</p> + </li> + <li> + <i class="now-ui-icons ui-1_simple-delete"></i> + <p>ui-1_simple-delete</p> + </li> + <li> + <i class="now-ui-icons ui-1_simple-remove"></i> + <p>ui-1_simple-remove</p> + </li> + <li> + <i class="now-ui-icons ui-1_zoom-bold"></i> + <p>ui-1_zoom-bold</p> + </li> + <li> + <i class="now-ui-icons ui-2_chat-round"></i> + <p>ui-2_chat-round</p> + </li> + <li> + <i class="now-ui-icons ui-2_favourite-28"></i> + <p>ui-2_favourite-28</p> + </li> + <li> + <i class="now-ui-icons ui-2_like"></i> + <p>ui-2_like</p> + </li> + <li> + <i class="now-ui-icons ui-2_settings-90"></i> + <p>ui-2_settings-90</p> + </li> + <li> + <i class="now-ui-icons ui-2_time-alarm"></i> + <p>ui-2_time-alarm</p> + </li> + <li> + <i class="now-ui-icons ui-1_email-85"></i> + <p>ui-1_email-85</p> + </li> + </ul> + </section> + <section id="users"> + <h2>Users</h2> + <ul> + <li> + <i class="now-ui-icons users_circle-08"></i> + <p>users_circle-08</p> + </li> + <li> + <i class="now-ui-icons users_single-02"></i> + <p>users_single-02</p> + </li> + </ul> + </section> + </div> + <script> + function SelectText(element) { + var doc = document, + text = element, + range, selection; + if (doc.body.createTextRange) { + range = document.body.createTextRange(); + range.moveToElementText(text); + range.select(); + } else if (window.getSelection) { + selection = window.getSelection(); + range = document.createRange(); + range.selectNodeContents(text); + selection.removeAllRanges(); + selection.addRange(range); + } + } + + function hasClass(ele, cls) { + return !!ele.getAttribute('class').match(new RegExp('(\\s|^)' + cls + '(\\s|$)')); + } + + window.onload = function() { + var trigger = document.getElementById('cd-nav-trigger'), + menu = document.getElementById('cd-main-nav'), + menuItems = menu.getElementsByTagName('li'); + trigger.onclick = function toggleMenu() { + if (hasClass(trigger, 'menu-is-open')) { + trigger.setAttribute('class', 'cd-nav-trigger'); + menu.setAttribute('class', ''); + } else { + trigger.setAttribute('class', 'cd-nav-trigger menu-is-open'); + menu.setAttribute('class', 'is-visible'); + } + } + + for (var i = 0; i < menuItems.length; i++) { + menuItems[i].onclick = function closeMenu() { + trigger.setAttribute('class', 'cd-nav-trigger'); + menu.setAttribute('class', ''); + } + } + } + </script> +</body> + +</html> \ No newline at end of file diff --git a/explorer/public/paper-dashboard/package.json b/explorer/public/paper-dashboard/package.json new file mode 100644 index 00000000000..7d83faf0ce5 --- /dev/null +++ b/explorer/public/paper-dashboard/package.json @@ -0,0 +1,17 @@ +{ + "name": "paper-dashboard-2", + "description": "Bootstrap 4 Paper Design", + "version": "2.0.0", + "homepage": "http://creative-tim.com/product/paper-dashboard-2", + "author": "Creative Tim", + "license": "Creative Tim License <www.creative-tim.com/license>", + "devDependencies": { + "gulp": "^3.9.1", + "gulp-autoprefixer": "^5.0.0", + "gulp-clean": "^0.4.0", + "gulp-install": "^1.1.0", + "gulp-sass": "^4.0.1", + "gulp-sourcemaps": "^2.6.4", + "gulp-open": "^3.0.1" + } +} diff --git a/explorer/src/jobs/mixmining.rs b/explorer/src/jobs/mixmining.rs new file mode 100644 index 00000000000..e55917c2c37 --- /dev/null +++ b/explorer/src/jobs/mixmining.rs @@ -0,0 +1,21 @@ +use crate::utils::file; +use reqwest::Error; + +const RELATIVE_PATH: &str = "api/mixmining/fullreport"; + +pub async fn renew_periodically(validator_base_url: &str) -> Result<(), Error> { + let url = format!("{}/{}", validator_base_url, RELATIVE_PATH); + + let topology_json = reqwest::get(&url).await?.text().await?; + + let save_path = std::env::current_exe() + .expect("Failed to evaluate current exe path") + .parent() + .expect("the binary itself has no parent path?!") + .join("public") + .join("downloads") + .join("mixmining.json"); + + file::save(topology_json, save_path); + Ok(()) +} diff --git a/explorer/src/jobs/mod.rs b/explorer/src/jobs/mod.rs new file mode 100644 index 00000000000..d0fbbd6e293 --- /dev/null +++ b/explorer/src/jobs/mod.rs @@ -0,0 +1,20 @@ +use log::*; +use tokio::time::{self, Duration}; + +mod mixmining; +mod topology; + +pub async fn start(validator_base_url: &str) { + let mut timer = time::interval(Duration::from_secs(10)); + loop { + timer.tick().await; + + if let Err(err) = topology::renew_periodically(validator_base_url).await { + warn!("Error refreshing topology: {}", err) + }; + + if let Err(err) = mixmining::renew_periodically(validator_base_url).await { + warn!("Error refreshing mixmining report: {}", err) + }; + } +} diff --git a/explorer/src/jobs/topology.rs b/explorer/src/jobs/topology.rs new file mode 100644 index 00000000000..5d1f175a4e5 --- /dev/null +++ b/explorer/src/jobs/topology.rs @@ -0,0 +1,21 @@ +use crate::utils::file; +use reqwest::Error; + +const RELATIVE_PATH: &str = "api/mixmining/topology"; + +pub async fn renew_periodically(validator_base_url: &str) -> Result<(), Error> { + let url = format!("{}/{}", validator_base_url, RELATIVE_PATH); + + let topology_json = reqwest::get(&url).await?.text().await?; + + let save_path = std::env::current_exe() + .expect("Failed to evaluate current exe path") + .parent() + .expect("the binary itself has no parent path?!") + .join("public") + .join("downloads") + .join("topology.json"); + + file::save(topology_json, save_path); + Ok(()) +} diff --git a/explorer/src/main.rs b/explorer/src/main.rs new file mode 100644 index 00000000000..1fdfb9e2344 --- /dev/null +++ b/explorer/src/main.rs @@ -0,0 +1,79 @@ +#![feature(proc_macro_hygiene, decl_macro)] + +#[macro_use] +extern crate rocket; + +use clap::{App, Arg, ArgMatches}; +use rocket_contrib::serve::StaticFiles; +use tokio::sync::broadcast; + +mod jobs; +mod utils; +mod websockets; + +// this specifies number of messages that can be held by the channel, not number of the clients. +const BROADCAST_CAPACITY: usize = 10; +const VALIDATOR_ARG: &str = "validator"; +const METRICS_ARG: &str = "metrics"; + +fn parse_args<'a>() -> ArgMatches<'a> { + App::new("Nym Explorer") + .author("Nymtech") + .arg( + Arg::with_name(VALIDATOR_ARG) + .long(VALIDATOR_ARG) + .help("REST endpoint of the validator that explorer will use to periodically grab topology and node status.") + .takes_value(true) + ) + .arg( + Arg::with_name(METRICS_ARG) + .long(METRICS_ARG) + .help("websocket endpoint of the metrics server explorer will subscribe to and broadcast to its clients") + .takes_value(true) + ) + .get_matches() +} + +#[get("/")] +fn index() -> &'static str { + "Later we will chop this up into multiple routes, but for now we'll just use StaticFiles. Leaving this here as a pointer for the future." +} + +#[tokio::main] +async fn main() { + let matches = parse_args(); + let validator_base_url = matches + .value_of(VALIDATOR_ARG) + .unwrap_or_else(|| "http://testnet-validator1.nymtech.net:8081"); + let metrics_websocket_url = matches + .value_of(METRICS_ARG) + .unwrap_or_else(|| "wss://testnet-metrics.nymtech.net/ws") + .to_owned(); + + let public_path = std::env::current_exe() + .expect("Failed to evaluate current exe path") + .parent() + .expect("the binary itself has no parent path?!") + .join("public"); + + tokio::task::spawn_blocking(|| { + rocket::ignite() + .mount("/", StaticFiles::from(public_path)) + .launch() + }); + + let (sender, _) = broadcast::channel(BROADCAST_CAPACITY); + // the only reason for cloning the sender is that because more receivers can only be created + // out of senders + let sender_clone = sender.clone(); + + tokio::spawn(async move { + websockets::subscribe(&*metrics_websocket_url, sender).await; + }); + + tokio::spawn(async move { + websockets::listen(1648, sender_clone).await; + }); + + jobs::start(validator_base_url).await; +} diff --git a/explorer/src/utils/file.rs b/explorer/src/utils/file.rs new file mode 100644 index 00000000000..929880b2932 --- /dev/null +++ b/explorer/src/utils/file.rs @@ -0,0 +1,16 @@ +use std::{fs::File, io::Write, path::Path}; + +pub fn save<P: AsRef<Path>>(text: String, path: P) { + let path = path.as_ref(); + let display = path.display(); + + let mut file = match File::create(path) { + Err(why) => panic!("couldn't open {}: {}", display, why), + Ok(file) => file, + }; + + match file.write_all(text.as_bytes()) { + Err(why) => panic!("couldn't write to {}: {}", display, why), + Ok(_) => (), + } +} diff --git a/explorer/src/utils/mod.rs b/explorer/src/utils/mod.rs new file mode 100644 index 00000000000..1943c3c6d53 --- /dev/null +++ b/explorer/src/utils/mod.rs @@ -0,0 +1 @@ +pub(crate) mod file; diff --git a/explorer/src/websockets/client.rs b/explorer/src/websockets/client.rs new file mode 100644 index 00000000000..b258afc6bcc --- /dev/null +++ b/explorer/src/websockets/client.rs @@ -0,0 +1,66 @@ +use log::*; +use tokio::net::TcpStream; +use tokio::stream::StreamExt; +use tokio::sync::broadcast; +use tokio_native_tls::TlsStream; +use tokio_tungstenite::tungstenite::{Error as WsError, Message}; +use tokio_tungstenite::WebSocketStream; +use tokio_tungstenite::{connect_async, stream::Stream}; + +pub(crate) type WsItem = Result<Message, WsError>; + +/// A websocket client which subscribes to the metrics centrally collected by the metrics server. +/// All metrics messages get copied out to this dashboard instance's clients. +pub(crate) struct MetricsWebsocketClient { + metrics_upstream: WebSocketStream<Stream<TcpStream, TlsStream<TcpStream>>>, + broadcaster: broadcast::Sender<Message>, +} + +impl MetricsWebsocketClient { + /// Connect to the upstream metrics server + pub(crate) async fn connect( + metrics_address: &str, + broadcaster: broadcast::Sender<Message>, + ) -> Result<MetricsWebsocketClient, WebsocketError> { + let ws_stream = match connect_async(metrics_address).await { + Ok((ws_stream, _)) => ws_stream, + Err(e) => return Err(WebsocketError::NetworkError(e)), + }; + + info!("Subscribed to metrics websocket at {}", metrics_address); + + Ok(MetricsWebsocketClient { + metrics_upstream: ws_stream, + broadcaster, + }) + } + + /// When the metrics server sends a message, it should be copied out to the server and distributed + /// to all connected clients. + fn on_message(&self, item: WsItem) { + let ws_message = match item { + Ok(message) => message, + Err(err) => { + error!("failed to obtain valid websocket message - {}", err); + return; + } + }; + + match self.broadcaster.send(ws_message) { + Ok(received) => info!("broadcasted websocket metrics data to {} clients", received), + Err(_) => info!("no clients are currently subscribed"), + } + } + + pub(crate) async fn run(&mut self) { + while let Some(incoming) = self.metrics_upstream.next().await { + self.on_message(incoming) + } + info!("Our metrics server subscriber is finished!") + } +} + +#[derive(Debug)] +pub enum WebsocketError { + NetworkError(WsError), +} diff --git a/explorer/src/websockets/mod.rs b/explorer/src/websockets/mod.rs new file mode 100644 index 00000000000..4f633622db2 --- /dev/null +++ b/explorer/src/websockets/mod.rs @@ -0,0 +1,28 @@ +use client::MetricsWebsocketClient; +use log::*; +use server::DashboardWebsocketServer; +use tokio::sync::broadcast; +use tokio_tungstenite::tungstenite::Message; + +pub(crate) mod client; +mod server; + +pub async fn subscribe(metrics_socket: &str, sender: broadcast::Sender<Message>) { + let mut ws_client = match MetricsWebsocketClient::connect(metrics_socket, sender).await { + Ok(client) => client, + Err(e) => { + error!("metrics websocket failed to connect: {:?}", e); + std::process::exit(1) + } + }; + + ws_client.run().await; +} + +pub async fn listen(port: u16, sender: broadcast::Sender<Message>) { + let server = DashboardWebsocketServer::new(port, sender); + if let Err(err) = server.start().await { + error!("failed to start dashboard websocket server! - {:?}", err); + std::process::exit(1) + } +} diff --git a/explorer/src/websockets/server.rs b/explorer/src/websockets/server.rs new file mode 100644 index 00000000000..9b66c4545a1 --- /dev/null +++ b/explorer/src/websockets/server.rs @@ -0,0 +1,66 @@ +use futures_util::{SinkExt, StreamExt}; +use log::*; +use std::{io::Error as IoError, net::SocketAddr}; +use tokio::net::{TcpListener, TcpStream}; +use tokio::sync::broadcast; +use tokio_tungstenite::accept_async; +use tokio_tungstenite::tungstenite::Message; + +pub struct DashboardWebsocketServer { + sender: broadcast::Sender<Message>, + addr: String, +} + +impl DashboardWebsocketServer { + pub fn new(port: u16, sender: broadcast::Sender<Message>) -> DashboardWebsocketServer { + let addr = format!("[::]:{}", port); + DashboardWebsocketServer { addr, sender } + } + + pub async fn start(self) -> Result<(), IoError> { + let try_socket = TcpListener::bind(&self.addr).await; + + let mut listener = try_socket?; + info!("starting to listen on {}", self.addr); + while let Ok((stream, addr)) = listener.accept().await { + tokio::spawn(Self::handle_connection( + stream, + addr, + self.sender.subscribe(), + )); + } + + Ok(()) + } + + async fn handle_connection( + stream: TcpStream, + addr: SocketAddr, + mut receiver: broadcast::Receiver<Message>, + ) { + let mut ws_stream = match accept_async(stream).await { + Ok(ws_stream) => ws_stream, + Err(err) => { + warn!( + "error while performing the websocket handshake with {} - {:?}", + addr, err + ); + return; + } + }; + + info!("client connected from {}", addr); + while let Some(message) = receiver.next().await { + let message = message.expect("the websocket broadcaster is dead!"); + if let Err(err) = ws_stream.send(message).await { + warn!( + "failed to send subscribed message back to client ({}) - {}", + addr, err + ); + return; + } else { + info!("sent message to {}", addr) + } + } + } +} diff --git a/gateway/Cargo.toml b/gateway/Cargo.toml index 62662050911..3de9f972f5b 100644 --- a/gateway/Cargo.toml +++ b/gateway/Cargo.toml @@ -1,7 +1,6 @@ [package] -build = "build.rs" name = "nym-gateway" -version = "0.8.1" +version = "0.9.0" authors = ["Dave Hrycyszyn <futurechimp@users.noreply.github.com>", "Jędrzej Stuczyński <andrew@nymtech.net>"] edition = "2018" @@ -10,32 +9,31 @@ edition = "2018" [dependencies] clap = "2.33.0" dirs = "2.0.2" +# using 4.0.0 release candidate as it's faster than 3.X and more importantly it resolves edge cases deadlocks +dashmap = "4.0.0-rc6" dotenv = "0.15.0" futures = "0.3" +humantime-serde = "1.0.1" log = "0.4" pretty_env_logger = "0.3" -rand = "0.7.2" +rand = "0.7" serde = { version = "1.0.104", features = ["derive"] } sled = "0.31" tokio = { version = "0.2", features = ["full"] } tokio-util = { version = "0.3.1", features = ["codec"] } -tokio-tungstenite = "0.11.0" +tokio-tungstenite = "0.11" # internal config = { path = "../common/config" } crypto = { path = "../common/crypto" } -directory-client = { path = "../common/client-libs/directory-client" } gateway-requests = { path = "gateway-requests" } mixnet-client = { path = "../common/client-libs/mixnet-client" } +mixnode-common = { path = "../common/mixnode-common" } nymsphinx = { path = "../common/nymsphinx" } pemstore = { path = "../common/pemstore" } +validator-client = { path = "../common/client-libs/validator-client" } +version-checker = { path = "../common/version-checker" } [dependencies.tungstenite] -version = "0.10.0" +version = "0.11" default-features = false - -[build-dependencies] -built = "0.4.3" - -[dev-dependencies] -tempfile = "3.1.0" \ No newline at end of file diff --git a/gateway/build.rs b/gateway/build.rs deleted file mode 100644 index 56d753472cf..00000000000 --- a/gateway/build.rs +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -use built; - -fn main() { - built::write_built_file().expect("Failed to acquire build-time information"); -} diff --git a/gateway/gateway-requests/src/types.rs b/gateway/gateway-requests/src/types.rs index 31e78d4f2ca..27f895fb3a0 100644 --- a/gateway/gateway-requests/src/types.rs +++ b/gateway/gateway-requests/src/types.rs @@ -19,10 +19,11 @@ use crate::GatewayMacSize; use crypto::generic_array::typenum::Unsigned; use crypto::hmac::recompute_keyed_hmac_and_verify_tag; use crypto::symmetric::stream_cipher; -use nymsphinx::addressing::nodes::{NymNodeRoutingAddress, NymNodeRoutingAddressError}; +use nymsphinx::addressing::nodes::NymNodeRoutingAddressError; +use nymsphinx::forwarding::packet::{MixPacket, MixPacketFormattingError}; use nymsphinx::params::packet_sizes::PacketSize; use nymsphinx::params::{GatewayEncryptionAlgorithm, GatewayIntegrityHmacAlgorithm}; -use nymsphinx::{DestinationAddressBytes, SphinxPacket}; +use nymsphinx::DestinationAddressBytes; use serde::{Deserialize, Serialize}; use std::{ convert::{TryFrom, TryInto}, @@ -73,10 +74,10 @@ pub enum GatewayRequestsError { RequestOfInvalidSize(usize), MalformedSphinxPacket, MalformedEncryption, + InvalidPacketMode, + InvalidMixPacket(MixPacketFormattingError), } -// to use it as `std::error::Error`, and we don't want to just derive is because we want -// the message to convey meanings of the usize tuple in RequestOfInvalidSize. impl fmt::Display for GatewayRequestsError { fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> { use GatewayRequestsError::*; @@ -92,6 +93,8 @@ impl fmt::Display for GatewayRequestsError { ), MalformedSphinxPacket => write!(f, "received sphinx packet was malformed"), MalformedEncryption => write!(f, "the received encrypted data was malformed"), + InvalidPacketMode => write!(f, "provided packet mode is invalid"), + InvalidMixPacket(err) => write!(f, "provided mix packet was malformed - {}", err) } } } @@ -102,6 +105,12 @@ impl From<NymNodeRoutingAddressError> for GatewayRequestsError { } } +impl From<MixPacketFormattingError> for GatewayRequestsError { + fn from(err: MixPacketFormattingError) -> Self { + GatewayRequestsError::InvalidMixPacket(err) + } +} + #[derive(Serialize, Deserialize, Debug)] #[serde(tag = "type", rename_all = "camelCase")] pub enum ClientControlRequest { @@ -172,10 +181,7 @@ impl ServerResponse { } pub fn is_error(&self) -> bool { - match self { - ServerResponse::Error { .. } => true, - _ => false, - } + matches!(self, ServerResponse::Error { .. }) } pub fn implies_successful_authentication(&self) -> bool { @@ -205,10 +211,7 @@ impl TryFrom<String> for ServerResponse { } pub enum BinaryRequest { - ForwardSphinx { - address: NymNodeRoutingAddress, - sphinx_packet: SphinxPacket, - }, + ForwardSphinx(MixPacket), } // Right now the only valid `BinaryRequest` is a request to forward a sphinx packet. @@ -249,40 +252,15 @@ impl BinaryRequest { ); // right now there's only a single option possible which significantly simplifies the logic - // if we decided to allow for more 'binary' messages, the API wouldn't need to change - let address = NymNodeRoutingAddress::try_from_bytes(&message_bytes_mut)?; - let addr_offset = address.bytes_min_len(); - - let sphinx_packet_data = &message_bytes_mut[addr_offset..]; - let packet_size = sphinx_packet_data.len(); - if PacketSize::get_type(packet_size).is_err() { - // TODO: should this allow AckPacket sizes? - - Err(GatewayRequestsError::RequestOfInvalidSize(packet_size)) - } else { - let sphinx_packet = match SphinxPacket::from_bytes(sphinx_packet_data) { - Ok(packet) => packet, - Err(_) => return Err(GatewayRequestsError::MalformedSphinxPacket), - }; - - Ok(BinaryRequest::ForwardSphinx { - address, - sphinx_packet, - }) - } + // if we decided to allow for more 'binary' messages, the API wouldn't need to change. + let mix_packet = MixPacket::try_from_bytes(message_bytes_mut)?; + Ok(BinaryRequest::ForwardSphinx(mix_packet)) } pub fn into_encrypted_tagged_bytes(self, shared_key: &SharedKeys) -> Vec<u8> { match self { - BinaryRequest::ForwardSphinx { - address, - sphinx_packet, - } => { - let forwarding_data: Vec<_> = address - .as_bytes() - .into_iter() - .chain(sphinx_packet.to_bytes().into_iter()) - .collect(); + BinaryRequest::ForwardSphinx(mix_packet) => { + let forwarding_data = mix_packet.into_bytes(); // TODO: it could be theoretically slightly more efficient if the data wasn't taken // by reference because then it makes a copy for encryption rather than do it in place @@ -292,14 +270,8 @@ impl BinaryRequest { } // TODO: this will be encrypted, etc. - pub fn new_forward_request( - address: NymNodeRoutingAddress, - sphinx_packet: SphinxPacket, - ) -> BinaryRequest { - BinaryRequest::ForwardSphinx { - address, - sphinx_packet, - } + pub fn new_forward_request(mix_packet: MixPacket) -> BinaryRequest { + BinaryRequest::ForwardSphinx(mix_packet) } pub fn into_ws_message(self, shared_key: &SharedKeys) -> Message { diff --git a/gateway/src/built_info.rs b/gateway/src/built_info.rs deleted file mode 100644 index 38b46d59e64..00000000000 --- a/gateway/src/built_info.rs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -// The file has been placed there by the build script. -include!(concat!(env!("OUT_DIR"), "/built.rs")); diff --git a/gateway/src/commands/init.rs b/gateway/src/commands/init.rs index 7e469cc116a..e6ca156fe19 100644 --- a/gateway/src/commands/init.rs +++ b/gateway/src/commands/init.rs @@ -14,6 +14,7 @@ use crate::commands::override_config; use crate::config::persistence::pathfinder::GatewayPathfinder; +use crate::config::Config; use clap::{App, Arg, ArgMatches}; use config::NymConfig; use crypto::asymmetric::{encryption, identity}; @@ -97,51 +98,59 @@ pub fn command_args<'a, 'b>() -> clap::App<'a, 'b> { .takes_value(true) ) .arg( - Arg::with_name("directory") - .long("directory") - .help("Address of the directory server the node is sending presence data to") + Arg::with_name("validator") + .long("validator") + .help("REST endpoint of the validator the node is registering presence with") + .takes_value(true), + ) + .arg( + Arg::with_name("incentives-address") + .long("incentives-address") + .help("Optional, if participating in the incentives program, payment address") .takes_value(true), ) -} - -fn show_incentives_url() { - println!("\n##### NOTE #####"); - println!( - "\nIf you would like to join our testnet incentives program, please visit https://nymtech.net/incentives" - ); - println!("\n\n"); } pub fn execute(matches: &ArgMatches) { let id = matches.value_of("id").unwrap(); println!("Initialising gateway {}...", id); - let mut config = crate::config::Config::new(id); + let already_init = if Config::default_config_file_path(id).exists() { + println!("Gateway \"{}\" was already initialised before! Config information will be overwritten (but keys will be kept)!", id); + true + } else { + false + }; + + let mut config = Config::new(id); config = override_config(config, matches); - let identity_keys = identity::KeyPair::new(); - let sphinx_keys = encryption::KeyPair::new(); - let pathfinder = GatewayPathfinder::new_from_config(&config); - pemstore::store_keypair( - &sphinx_keys, - &pemstore::KeyPairPath::new( - pathfinder.private_encryption_key().to_owned(), - pathfinder.public_encryption_key().to_owned(), - ), - ) - .expect("Failed to save sphinx keys"); + // if gateway was already initialised, don't generate new keys + if !already_init { + let identity_keys = identity::KeyPair::new(); + let sphinx_keys = encryption::KeyPair::new(); + let pathfinder = GatewayPathfinder::new_from_config(&config); + pemstore::store_keypair( + &sphinx_keys, + &pemstore::KeyPairPath::new( + pathfinder.private_encryption_key().to_owned(), + pathfinder.public_encryption_key().to_owned(), + ), + ) + .expect("Failed to save sphinx keys"); - pemstore::store_keypair( - &identity_keys, - &pemstore::KeyPairPath::new( - pathfinder.private_identity_key().to_owned(), - pathfinder.public_identity_key().to_owned(), - ), - ) - .expect("Failed to save identity keys"); + pemstore::store_keypair( + &identity_keys, + &pemstore::KeyPairPath::new( + pathfinder.private_identity_key().to_owned(), + pathfinder.public_identity_key().to_owned(), + ), + ) + .expect("Failed to save identity keys"); - println!("Saved identity and mixnet sphinx keypairs"); + println!("Saved identity and mixnet sphinx keypairs"); + } let config_save_location = config.get_config_file_save_location(); config @@ -150,6 +159,4 @@ pub fn execute(matches: &ArgMatches) { println!("Saved configuration file to {:?}", config_save_location); println!("Gateway configuration completed.\n\n\n"); - - show_incentives_url(); } diff --git a/gateway/src/commands/mod.rs b/gateway/src/commands/mod.rs index 4a8c3eeff81..88cf63087e4 100644 --- a/gateway/src/commands/mod.rs +++ b/gateway/src/commands/mod.rs @@ -15,8 +15,9 @@ use crate::config::Config; use clap::ArgMatches; -pub mod init; -pub mod run; +pub(crate) mod init; +pub(crate) mod run; +pub(crate) mod upgrade; pub(crate) fn override_config(mut config: Config, matches: &ArgMatches) -> Config { let mut was_mix_host_overridden = false; @@ -85,8 +86,8 @@ pub(crate) fn override_config(mut config: Config, matches: &ArgMatches) -> Confi config = config.with_clients_announce_port(clients_announce_port.unwrap()); } - if let Some(directory) = matches.value_of("directory") { - config = config.with_custom_directory(directory); + if let Some(validator) = matches.value_of("validator") { + config = config.with_custom_validator(validator); } if let Some(inboxes_dir) = matches.value_of("inboxes") { @@ -101,5 +102,9 @@ pub(crate) fn override_config(mut config: Config, matches: &ArgMatches) -> Confi config = config.with_location(location); } + if let Some(incentives_address) = matches.value_of("incentives-address") { + config = config.with_incentives_address(incentives_address); + } + config } diff --git a/gateway/src/commands/run.rs b/gateway/src/commands/run.rs index 5f8aa5dd5a6..9e7a73ff10d 100644 --- a/gateway/src/commands/run.rs +++ b/gateway/src/commands/run.rs @@ -19,6 +19,8 @@ use crate::node::Gateway; use clap::{App, Arg, ArgMatches}; use config::NymConfig; use crypto::asymmetric::{encryption, identity}; +use log::*; +use version_checker::is_minor_version_compatible; pub fn command_args<'a, 'b>() -> clap::App<'a, 'b> { App::new("run") @@ -104,9 +106,9 @@ pub fn command_args<'a, 'b>() -> clap::App<'a, 'b> { .takes_value(true) ) .arg( - Arg::with_name("directory") - .long("directory") - .help("Address of the directory server the gateway is sending presence data to") + Arg::with_name("validator") + .long("validator") + .help("REST endpoint of the validator the node is registering presence with") .takes_value(true), ) } @@ -152,17 +154,45 @@ fn load_identity_keys(pathfinder: &GatewayPathfinder) -> identity::KeyPair { identity_keypair } +// this only checks compatibility between config the binary. It does not take into consideration +// network version. It might do so in the future. +fn version_check(cfg: &Config) -> bool { + let binary_version = env!("CARGO_PKG_VERSION"); + let config_version = cfg.get_version(); + if binary_version != config_version { + warn!("The mixnode binary has different version than what is specified in config file! {} and {}", binary_version, config_version); + if is_minor_version_compatible(binary_version, config_version) { + info!("but they are still semver compatible. However, consider running the `upgrade` command"); + true + } else { + error!("and they are semver incompatible! - please run the `upgrade` command before attempting `run` again"); + false + } + } else { + true + } +} + pub fn execute(matches: &ArgMatches) { let id = matches.value_of("id").unwrap(); println!("Starting gateway {}...", id); - let mut config = - Config::load_from_file(matches.value_of("config").map(|path| path.into()), Some(id)) - .expect("Failed to load config file"); + let mut config = match Config::load_from_file(id) { + Ok(cfg) => cfg, + Err(err) => { + error!("Failed to load config for {}. Are you sure you have run `init` before? (Error was: {})", id, err); + return; + } + }; config = override_config(config, matches); + if !version_check(&config) { + error!("failed the local version check"); + return; + } + let pathfinder = GatewayPathfinder::new_from_config(&config); let sphinx_keypair = load_sphinx_keys(&pathfinder); let identity = load_identity_keys(&pathfinder); @@ -178,8 +208,8 @@ pub fn execute(matches: &ArgMatches) { } println!( - "Directory server [presence]: {}", - config.get_presence_directory_server() + "Validator REST endpoint: {}", + config.get_validator_rest_endpoint() ); println!( diff --git a/gateway/src/commands/upgrade.rs b/gateway/src/commands/upgrade.rs new file mode 100644 index 00000000000..9b5b11bf600 --- /dev/null +++ b/gateway/src/commands/upgrade.rs @@ -0,0 +1,192 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +use crate::config::DEFAULT_VALIDATOR_REST_ENDPOINT; +use crate::config::{Config, MISSING_VALUE}; +use clap::{App, Arg, ArgMatches}; +use config::NymConfig; +use std::fmt::Display; +use std::process; +use version_checker::{parse_version, Version}; + +fn print_start_upgrade<D1: Display, D2: Display>(from: D1, to: D2) { + println!( + "\n==================\nTrying to upgrade gateway from {} to {} ...", + from, to + ); +} + +fn print_failed_upgrade<D1: Display, D2: Display>(from: D1, to: D2) { + eprintln!( + "Upgrade from {} to {} failed!\n==================\n", + from, to + ); +} + +fn print_successful_upgrade<D1: Display, D2: Display>(from: D1, to: D2) { + println!( + "Upgrade from {} to {} was successful!\n==================\n", + from, to + ); +} + +fn pre_090_upgrade(from: &str, config: Config, matches: &ArgMatches) -> Config { + // this is not extracted to separate function as you only have to manually pass version + // if upgrading from pre090 version + let from = match from.strip_prefix("v") { + Some(stripped) => stripped, + None => from, + }; + + let from = match from.strip_prefix("V") { + Some(stripped) => stripped, + None => from, + }; + + let from_version = parse_version(from).expect("invalid version provided!"); + if from_version.major == 0 && from_version.minor < 8 { + // technically this could be implemented, but is there any point in that? + eprintln!("upgrading node from before v0.8.0 is not supported. Please run `init` with new binary instead"); + process::exit(1) + } + + if (from_version.major == 0 && from_version.minor >= 9) || from_version.major >= 1 { + eprintln!("self reported version is higher than 0.9.0. Those releases should have already contained version numbers in config! Make sure you provided correct version"); + process::exit(1) + } + + // note: current is guaranteed to not have any `build` information suffix (nor pre-release + // information), as this was asserted at the beginning of this command) + // + // upgrade to current (if it's a 0.9.X) or try to upgrade to 0.9.0 as an intermediate + // step in future upgrades (so, for example, we might go 0.8.0 -> 0.9.0 -> 0.10.0) + // this way we don't need to have all the crazy paths on how to upgrade from any version to any + // other version. We just upgrade one minor version at a time. + let current = Version::parse(env!("CARGO_PKG_VERSION")).unwrap(); + let to_version = if current.major == 0 && current.minor == 9 { + current + } else { + Version::new(0, 9, 0) + }; + + print_start_upgrade(&from_version, &to_version); + + if config.get_validator_rest_endpoint() != MISSING_VALUE { + eprintln!("existing config seems to have specified new validator rest endpoint which was only introduced in 0.9.0! Can't perform upgrade."); + print_failed_upgrade(&from_version, &to_version); + process::exit(1); + } + + println!( + "Setting validator REST endpoint to to {}", + DEFAULT_VALIDATOR_REST_ENDPOINT + ); + + let mut upgraded_config = config + .with_custom_version(to_version.to_string().as_ref()) + .with_custom_validator(DEFAULT_VALIDATOR_REST_ENDPOINT); + + if let Some(incentives_address) = matches.value_of("incentives address") { + upgraded_config = upgraded_config.with_incentives_address(incentives_address); + println!("Setting incentives address to {}", incentives_address); + } + + upgraded_config.save_to_file(None).unwrap_or_else(|err| { + eprintln!("failed to overwrite config file! - {:?}", err); + print_failed_upgrade(&from_version, &to_version); + process::exit(1); + }); + + print_successful_upgrade(from_version, to_version); + + upgraded_config +} + +pub fn command_args<'a, 'b>() -> App<'a, 'b> { + App::new("upgrade").about("Try to upgrade the gateway") + .arg( + Arg::with_name("id") + .long("id") + .help("Id of the nym-gateway we want to upgrade") + .takes_value(true) + .required(true), + ) + // the rest of arguments depend on the upgrade path + .arg(Arg::with_name("current version") + .long("current-version") + .help("REQUIRED FOR PRE-0.9.0 UPGRADES. Specifies current version of the configuration file to help to determine a valid upgrade path. Valid formats include '0.8.1', 'v0.8.1' or 'V0.8.1'") + .takes_value(true) + ) + .arg(Arg::with_name("incentives address") + .long("incentives-address") + .help("Optional, if participating in the incentives program, payment address") + .takes_value(true) + ) +} + +pub fn execute(matches: &ArgMatches) { + let current = Version::parse(env!("CARGO_PKG_VERSION")).unwrap(); + + // technically this is not a correct way of checking it as a released version might contain valid build identifiers + // however, we are not using them ourselves at the moment and hence it should be fine. + // if we change our mind, we could easily tweak this code + if current.is_prerelease() || !current.build.is_empty() { + eprintln!( + "Trying to upgrade to a non-released version {}. This is not supported!", + current + ); + process::exit(1) + } + + let id = matches.value_of("id").unwrap(); + + let mut existing_config = Config::load_from_file(id).unwrap_or_else(|err| { + eprintln!("failed to load existing config file! - {:?}", err); + process::exit(1) + }); + + // versions fields were added in 0.9.0 + if existing_config.get_version() == MISSING_VALUE { + let self_reported_version = matches.value_of("current version").unwrap_or_else(|| { + eprintln!( + "trying to upgrade from pre v0.9.0 without providing current system version!" + ); + process::exit(1) + }); + + // upgrades up to 0.9.0 + existing_config = pre_090_upgrade(self_reported_version, existing_config, &matches); + } + + let config_version = Version::parse(existing_config.get_version()).unwrap_or_else(|err| { + eprintln!("failed to parse node version! - {:?}", err); + process::exit(1) + }); + + if config_version.is_prerelease() || !config_version.build.is_empty() { + eprintln!( + "Trying to upgrade to from non-released version {}. This is not supported!", + current + ); + process::exit(1) + } + + // here be upgrade path to 0.10.0 and beyond based on version number from config + if config_version == current { + println!("You're using the most recent version!"); + } else { + eprintln!("Cannot perform upgrade from {} to {}. Please let the developers know about this issue!", config_version, current); + process::exit(1) + } +} diff --git a/gateway/src/config/mod.rs b/gateway/src/config/mod.rs index adab45a2146..8f652ea8c51 100644 --- a/gateway/src/config/mod.rs +++ b/gateway/src/config/mod.rs @@ -15,26 +15,34 @@ use crate::config::template::config_template; use config::NymConfig; use log::*; -use serde::{Deserialize, Serialize}; +use serde::{ + de::{self, IntoDeserializer, Visitor}, + Deserialize, Deserializer, Serialize, +}; use std::net::{IpAddr, SocketAddr}; use std::path::PathBuf; use std::str::FromStr; -use std::time; +use std::time::Duration; pub mod persistence; mod template; +pub(crate) const MISSING_VALUE: &str = "MISSING VALUE"; + // 'GATEWAY' const DEFAULT_MIX_LISTENING_PORT: u16 = 1789; const DEFAULT_CLIENT_LISTENING_PORT: u16 = 9000; -const DEFAULT_DIRECTORY_SERVER: &str = "https://directory.nymtech.net"; +pub(crate) const DEFAULT_VALIDATOR_REST_ENDPOINT: &str = + "http://testnet-validator1.nymtech.net:8081"; // 'DEBUG' // where applicable, the below are defined in milliseconds -const DEFAULT_PRESENCE_SENDING_DELAY: u64 = 10_000; // 10s -const DEFAULT_PACKET_FORWARDING_INITIAL_BACKOFF: u64 = 10_000; // 10s -const DEFAULT_PACKET_FORWARDING_MAXIMUM_BACKOFF: u64 = 300_000; // 5min -const DEFAULT_INITIAL_CONNECTION_TIMEOUT: u64 = 1_500; // 1.5s +const DEFAULT_PRESENCE_SENDING_DELAY: Duration = Duration::from_millis(10_000); +const DEFAULT_PACKET_FORWARDING_INITIAL_BACKOFF: Duration = Duration::from_millis(10_000); +const DEFAULT_PACKET_FORWARDING_MAXIMUM_BACKOFF: Duration = Duration::from_millis(300_000); +const DEFAULT_INITIAL_CONNECTION_TIMEOUT: Duration = Duration::from_millis(1_500); +const DEFAULT_CACHE_ENTRY_TTL: Duration = Duration::from_millis(30_000); +const DEFAULT_MAXIMUM_RECONNECTION_ATTEMPTS: u32 = 20; const DEFAULT_STORED_MESSAGE_FILENAME_LENGTH: u16 = 16; const DEFAULT_MESSAGE_RETRIEVAL_LIMIT: u16 = 5; @@ -59,10 +67,6 @@ impl NymConfig for Config { config_template() } - fn config_file_name() -> String { - "config.toml".to_string() - } - fn default_root_directory() -> PathBuf { dirs::home_dir() .expect("Failed to evaluate $HOME value") @@ -89,6 +93,69 @@ impl NymConfig for Config { } } +// custom function is defined to deserialize based on whether field contains a pre 0.9.0 +// u64 interpreted as milliseconds or proper duration introduced in 0.9.0 +// +// TODO: when we get to refactoring down the line, this code can just be removed +// and all Duration fields could just have #[serde(with = "humantime_serde")] instead +// reason for that is that we don't expect anyone to be upgrading from pre 0.9.0 when we have, +// for argument sake, 0.11.0 out +fn deserialize_duration<'de, D>(deserializer: D) -> Result<Duration, D::Error> +where + D: Deserializer<'de>, +{ + struct DurationVisitor; + + impl<'de> Visitor<'de> for DurationVisitor { + type Value = Duration; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("u64 or a duration") + } + + fn visit_i64<E>(self, value: i64) -> Result<Duration, E> + where + E: de::Error, + { + self.visit_u64(value as u64) + } + + fn visit_u64<E>(self, value: u64) -> Result<Duration, E> + where + E: de::Error, + { + Ok(Duration::from_millis(Deserialize::deserialize( + value.into_deserializer(), + )?)) + } + + fn visit_str<E>(self, value: &str) -> Result<Duration, E> + where + E: de::Error, + { + humantime_serde::deserialize(value.into_deserializer()) + } + } + + deserializer.deserialize_any(DurationVisitor) +} + +fn deserialize_option_string<'de, D>(deserializer: D) -> Result<Option<String>, D::Error> +where + D: Deserializer<'de>, +{ + let s = String::deserialize(deserializer)?; + if s.is_empty() { + Ok(None) + } else { + Ok(Some(s)) + } +} + +pub fn missing_string_value() -> String { + MISSING_VALUE.to_string() +} + impl Config { pub fn new<S: Into<String>>(id: S) -> Self { Config::default().with_id(id) @@ -135,8 +202,8 @@ impl Config { self } - pub fn with_custom_directory<S: Into<String>>(mut self, directory_server: S) -> Self { - self.gateway.presence_directory_server = directory_server.into(); + pub fn with_custom_validator<S: Into<String>>(mut self, validator: S) -> Self { + self.gateway.validator_rest_url = validator.into(); self } @@ -321,6 +388,16 @@ impl Config { self } + pub fn with_custom_version(mut self, version: &str) -> Self { + self.gateway.version = version.to_string(); + self + } + + pub fn with_incentives_address<S: Into<String>>(mut self, incentives_address: S) -> Self { + self.gateway.incentives_address = Some(incentives_address.into()); + self + } + // getters pub fn get_config_file_save_location(&self) -> PathBuf { self.config_directory().join(Self::config_file_name()) @@ -346,12 +423,8 @@ impl Config { self.gateway.public_sphinx_key_file.clone() } - pub fn get_presence_directory_server(&self) -> String { - self.gateway.presence_directory_server.clone() - } - - pub fn get_presence_sending_delay(&self) -> time::Duration { - time::Duration::from_millis(self.debug.presence_sending_delay) + pub fn get_validator_rest_endpoint(&self) -> String { + self.gateway.validator_rest_url.clone() } pub fn get_mix_listening_address(&self) -> SocketAddr { @@ -378,16 +451,20 @@ impl Config { self.clients_endpoint.ledger_path.clone() } - pub fn get_packet_forwarding_initial_backoff(&self) -> time::Duration { - time::Duration::from_millis(self.debug.packet_forwarding_initial_backoff) + pub fn get_packet_forwarding_initial_backoff(&self) -> Duration { + self.debug.packet_forwarding_initial_backoff } - pub fn get_packet_forwarding_maximum_backoff(&self) -> time::Duration { - time::Duration::from_millis(self.debug.packet_forwarding_maximum_backoff) + pub fn get_packet_forwarding_maximum_backoff(&self) -> Duration { + self.debug.packet_forwarding_maximum_backoff } - pub fn get_initial_connection_timeout(&self) -> time::Duration { - time::Duration::from_millis(self.debug.initial_connection_timeout) + pub fn get_initial_connection_timeout(&self) -> Duration { + self.debug.initial_connection_timeout + } + + pub fn get_packet_forwarding_max_reconnections(&self) -> u32 { + self.debug.maximum_reconnection_attempts } pub fn get_message_retrieval_limit(&self) -> u16 { @@ -397,11 +474,26 @@ impl Config { pub fn get_stored_messages_filename_length(&self) -> u16 { self.debug.stored_messages_filename_length } + + pub fn get_cache_entry_ttl(&self) -> Duration { + self.debug.cache_entry_ttl + } + + pub fn get_version(&self) -> &str { + &self.gateway.version + } + + pub fn get_incentives_address(&self) -> Option<String> { + self.gateway.incentives_address.clone() + } } #[derive(Debug, Deserialize, PartialEq, Serialize)] -#[serde(deny_unknown_fields)] pub struct Gateway { + /// Version of the gateway for which this configuration was created. + #[serde(default = "missing_string_value")] + version: String, + /// ID specifies the human readable ID of this particular gateway. id: String, @@ -423,29 +515,34 @@ pub struct Gateway { /// Path to file containing public sphinx key. public_sphinx_key_file: PathBuf, - /// Directory server to which the server will be reporting their presence data. - presence_directory_server: String, + /// Validator server to which the node will be reporting their presence data. + #[serde(default = "missing_string_value")] + validator_rest_url: String, /// nym_home_directory specifies absolute path to the home nym gateways directory. /// It is expected to use default value and hence .toml file should not redefine this field. nym_root_directory: PathBuf, + + /// Optional, if participating in the incentives program, payment address. + #[serde(deserialize_with = "deserialize_option_string", default)] + incentives_address: Option<String>, } impl Gateway { fn default_private_sphinx_key_file(id: &str) -> PathBuf { - Config::default_data_directory(Some(id)).join("private_sphinx.pem") + Config::default_data_directory(id).join("private_sphinx.pem") } fn default_public_sphinx_key_file(id: &str) -> PathBuf { - Config::default_data_directory(Some(id)).join("public_sphinx.pem") + Config::default_data_directory(id).join("public_sphinx.pem") } fn default_private_identity_key_file(id: &str) -> PathBuf { - Config::default_data_directory(Some(id)).join("private_identity.pem") + Config::default_data_directory(id).join("private_identity.pem") } fn default_public_identity_key_file(id: &str) -> PathBuf { - Config::default_data_directory(Some(id)).join("public_identity.pem") + Config::default_data_directory(id).join("public_identity.pem") } fn default_location() -> String { @@ -456,14 +553,16 @@ impl Gateway { impl Default for Gateway { fn default() -> Self { Gateway { + version: env!("CARGO_PKG_VERSION").to_string(), id: "".to_string(), location: Self::default_location(), private_identity_key_file: Default::default(), public_identity_key_file: Default::default(), private_sphinx_key_file: Default::default(), public_sphinx_key_file: Default::default(), - presence_directory_server: DEFAULT_DIRECTORY_SERVER.to_string(), + validator_rest_url: DEFAULT_VALIDATOR_REST_ENDPOINT.to_string(), nym_root_directory: Config::default_root_directory(), + incentives_address: None, } } } @@ -520,11 +619,11 @@ pub struct ClientsEndpoint { impl ClientsEndpoint { fn default_inboxes_directory(id: &str) -> PathBuf { - Config::default_data_directory(Some(id)).join("inboxes") + Config::default_data_directory(id).join("inboxes") } fn default_ledger_path(id: &str) -> PathBuf { - Config::default_data_directory(Some(id)).join("client_ledger.sled") + Config::default_data_directory(id).join("client_ledger.sled") } } @@ -556,20 +655,37 @@ impl Default for Logging { pub struct Debug { /// Initial value of an exponential backoff to reconnect to dropped TCP connection when /// forwarding sphinx packets. - /// The provided value is interpreted as milliseconds. - packet_forwarding_initial_backoff: u64, + #[serde( + deserialize_with = "deserialize_duration", + serialize_with = "humantime_serde::serialize" + )] + packet_forwarding_initial_backoff: Duration, /// Maximum value of an exponential backoff to reconnect to dropped TCP connection when /// forwarding sphinx packets. - /// The provided value is interpreted as milliseconds. - packet_forwarding_maximum_backoff: u64, + #[serde( + deserialize_with = "deserialize_duration", + serialize_with = "humantime_serde::serialize" + )] + packet_forwarding_maximum_backoff: Duration, /// Timeout for establishing initial connection when trying to forward a sphinx packet. - /// The provider value is interpreted as milliseconds. - initial_connection_timeout: u64, + #[serde( + deserialize_with = "deserialize_duration", + serialize_with = "humantime_serde::serialize" + )] + initial_connection_timeout: Duration, /// Delay between each subsequent presence data being sent. - presence_sending_delay: u64, + #[serde( + deserialize_with = "deserialize_duration", + serialize_with = "humantime_serde::serialize" + )] + presence_sending_delay: Duration, + + /// Maximum number of retries node is going to attempt to re-establish existing connection + /// to another node when forwarding sphinx packets. + maximum_reconnection_attempts: u32, /// Length of filenames for new client messages. stored_messages_filename_length: u16, @@ -578,6 +694,13 @@ pub struct Debug { /// if there are no real messages, dummy ones are create to always return /// `message_retrieval_limit` total messages message_retrieval_limit: u16, + + /// Duration for which a cached vpn processing result is going to get stored for. + #[serde( + deserialize_with = "deserialize_duration", + serialize_with = "humantime_serde::serialize" + )] + cache_entry_ttl: Duration, } impl Default for Debug { @@ -587,28 +710,10 @@ impl Default for Debug { packet_forwarding_maximum_backoff: DEFAULT_PACKET_FORWARDING_MAXIMUM_BACKOFF, initial_connection_timeout: DEFAULT_INITIAL_CONNECTION_TIMEOUT, presence_sending_delay: DEFAULT_PRESENCE_SENDING_DELAY, + maximum_reconnection_attempts: DEFAULT_MAXIMUM_RECONNECTION_ATTEMPTS, stored_messages_filename_length: DEFAULT_STORED_MESSAGE_FILENAME_LENGTH, message_retrieval_limit: DEFAULT_MESSAGE_RETRIEVAL_LIMIT, + cache_entry_ttl: DEFAULT_CACHE_ENTRY_TTL, } } } - -#[cfg(test)] -mod gateway_config { - use super::*; - - #[test] - fn after_saving_default_config_the_loaded_one_is_identical() { - // need to figure out how to do something similar but without touching the disk - // or the file system at all... - let temp_location = tempfile::tempdir().unwrap().path().join("config.toml"); - let default_config = Config::default().with_id("foomp".to_string()); - default_config - .save_to_file(Some(temp_location.clone())) - .unwrap(); - - let loaded_config = Config::load_from_file(Some(temp_location), None).unwrap(); - - assert_eq!(default_config, loaded_config); - } -} diff --git a/gateway/src/config/template.rs b/gateway/src/config/template.rs index 55e2c230a0f..a66b5ef7823 100644 --- a/gateway/src/config/template.rs +++ b/gateway/src/config/template.rs @@ -24,6 +24,9 @@ pub(crate) fn config_template() -> &'static str { ##### main base mixnode config options ##### [gateway] +# Version of the gateway for which this configuration was created. +version = '{{ gateway.version }}' + # Human readable ID of this particular gateway. id = '{{ gateway.id }}' @@ -45,8 +48,11 @@ private_sphinx_key_file = '{{ gateway.private_sphinx_key_file }}' # Path to file containing public sphinx key. public_sphinx_key_file = '{{ gateway.public_sphinx_key_file }}' -# Directory server to which the server will be reporting their presence data. -presence_directory_server = '{{ gateway.presence_directory_server }}' +# Optional, if participating in the incentives program, payment address. +incentives_address = '{{ gateway.incentives_address }}' + +# Validator server to which the node will be reporting their presence data. +validator_rest_url = '{{ gateway.validator_rest_url }}' # nym_home_directory specifies absolute path to the home nym gateway directory. # It is expected to use default value and hence .toml file should not redefine this field. diff --git a/gateway/src/main.rs b/gateway/src/main.rs index c921aaa1003..e9bdf864436 100644 --- a/gateway/src/main.rs +++ b/gateway/src/main.rs @@ -14,7 +14,6 @@ use clap::{App, ArgMatches}; -pub mod built_info; mod commands; mod config; mod node; @@ -25,11 +24,12 @@ fn main() { println!("{}", banner()); let arg_matches = App::new("Nym Mixnet Gateway") - .version(built_info::PKG_VERSION) + .version(env!("CARGO_PKG_VERSION")) .author("Nymtech") .about("Implementation of the Nym Mixnet Gateway") .subcommand(commands::init::command_args()) .subcommand(commands::run::command_args()) + .subcommand(commands::upgrade::command_args()) .get_matches(); execute(arg_matches); @@ -39,6 +39,7 @@ fn execute(matches: ArgMatches) { match matches.subcommand() { ("init", Some(m)) => commands::init::execute(m), ("run", Some(m)) => commands::run::execute(m), + ("upgrade", Some(m)) => commands::upgrade::execute(m), _ => println!("{}", usage()), } } @@ -60,7 +61,7 @@ fn banner() -> String { (gateway - version {:}) "#, - built_info::PKG_VERSION + env!("CARGO_PKG_VERSION") ) } diff --git a/gateway/src/node/client_handling/clients_handler.rs b/gateway/src/node/client_handling/clients_handler.rs index d39cd40bff8..689736dd160 100644 --- a/gateway/src/node/client_handling/clients_handler.rs +++ b/gateway/src/node/client_handling/clients_handler.rs @@ -114,7 +114,7 @@ impl ClientsHandler { // NOTE: THIS IGNORES MESSAGE RETRIEVAL LIMIT AND TAKES EVERYTHING! let all_stored_messages = match self .clients_inbox_storage - .retrieve_all_client_messages(client_address.clone()) + .retrieve_all_client_messages(client_address) .await { Ok(msgs) => msgs, @@ -173,7 +173,7 @@ impl ClientsHandler { if self .clients_ledger - .insert_shared_key(derived_shared_key, address.clone()) + .insert_shared_key(derived_shared_key, address) .unwrap() .is_some() { @@ -181,11 +181,7 @@ impl ClientsHandler { "Client {:?} was already registered before!", address.to_base58_string() ) - } else if let Err(e) = self - .clients_inbox_storage - .create_storage_dir(address.clone()) - .await - { + } else if let Err(e) = self.clients_inbox_storage.create_storage_dir(address).await { error!("We failed to create inbox directory for the client -{:?}\nReverting stored shared key...", e); // we must revert our changes if this operation failed self.clients_ledger.remove_shared_key(&address).unwrap(); diff --git a/gateway/src/node/client_handling/websocket/connection_handler.rs b/gateway/src/node/client_handling/websocket/connection_handler.rs index 8adde3292a4..70d472c6110 100644 --- a/gateway/src/node/client_handling/websocket/connection_handler.rs +++ b/gateway/src/node/client_handling/websocket/connection_handler.rs @@ -18,7 +18,6 @@ use crate::node::client_handling::clients_handler::{ use crate::node::client_handling::websocket::message_receiver::{ MixMessageReceiver, MixMessageSender, }; -use crate::node::mixnet_handling::sender::OutboundMixMessageSender; use crypto::asymmetric::identity; use futures::{ channel::{mpsc, oneshot}, @@ -31,6 +30,7 @@ use gateway_requests::registration::handshake::{gateway_handshake, SharedKeys, D use gateway_requests::types::{BinaryRequest, ClientControlRequest, ServerResponse}; use gateway_requests::BinaryResponse; use log::*; +use mixnet_client::forwarder::MixForwardingSender; use nymsphinx::DestinationAddressBytes; use std::convert::TryFrom; use std::sync::Arc; @@ -54,10 +54,7 @@ enum SocketStream<S> { impl<S> SocketStream<S> { fn is_websocket(&self) -> bool { - match self { - SocketStream::UpgradedWebSocket(_) => true, - _ => false, - } + matches!(self, SocketStream::UpgradedWebSocket(_)) } } @@ -65,7 +62,7 @@ pub(crate) struct Handle<S> { remote_address: Option<DestinationAddressBytes>, shared_key: Option<SharedKeys>, clients_handler_sender: ClientsHandlerRequestSender, - outbound_mix_sender: OutboundMixMessageSender, + outbound_mix_sender: MixForwardingSender, socket_connection: SocketStream<S>, local_identity: Arc<identity::KeyPair>, @@ -77,7 +74,7 @@ impl<S> Handle<S> { pub(crate) fn new( conn: S, clients_handler_sender: ClientsHandlerRequestSender, - outbound_mix_sender: OutboundMixMessageSender, + outbound_mix_sender: MixForwardingSender, local_identity: Arc<identity::KeyPair>, ) -> Self { Handle { @@ -194,7 +191,7 @@ impl<S> Handle<S> { // announced hence we do not need to send 'disconnect' message if let Some(addr) = self.remote_address.as_ref() { self.clients_handler_sender - .unbounded_send(ClientsHandlerRequest::Disconnect(addr.clone())) + .unbounded_send(ClientsHandlerRequest::Disconnect(*addr)) .unwrap(); } } @@ -212,14 +209,8 @@ impl<S> Handle<S> { Err(e) => ServerResponse::new_error(e.to_string()), Ok(request) => match request { // currently only a single type exists - BinaryRequest::ForwardSphinx { - address, - sphinx_packet, - } => { - // we know data has correct size (but nothing else besides of it) - self.outbound_mix_sender - .unbounded_send((address, sphinx_packet)) - .unwrap(); + BinaryRequest::ForwardSphinx(mix_packet) => { + self.outbound_mix_sender.unbounded_send(mix_packet).unwrap(); ServerResponse::Send { status: true } } }, @@ -260,7 +251,7 @@ impl<S> Handle<S> { let (res_sender, res_receiver) = oneshot::channel(); let clients_handler_request = ClientsHandlerRequest::Authenticate( - address.clone(), + address, encrypted_address, iv, mix_sender, @@ -326,7 +317,7 @@ impl<S> Handle<S> { let (res_sender, res_receiver) = oneshot::channel(); let clients_handler_request = ClientsHandlerRequest::Register( - remote_address.clone(), + remote_address, derived_shared_key.clone(), mix_sender, res_sender, diff --git a/gateway/src/node/client_handling/websocket/listener.rs b/gateway/src/node/client_handling/websocket/listener.rs index e3acdbd9b4d..2c353c0c828 100644 --- a/gateway/src/node/client_handling/websocket/listener.rs +++ b/gateway/src/node/client_handling/websocket/listener.rs @@ -14,9 +14,9 @@ use crate::node::client_handling::clients_handler::ClientsHandlerRequestSender; use crate::node::client_handling::websocket::connection_handler::Handle; -use crate::node::mixnet_handling::sender::OutboundMixMessageSender; use crypto::asymmetric::identity; use log::*; +use mixnet_client::forwarder::MixForwardingSender; use std::net::SocketAddr; use std::sync::Arc; use tokio::task::JoinHandle; @@ -37,7 +37,7 @@ impl Listener { pub(crate) async fn run( &mut self, clients_handler_sender: ClientsHandlerRequestSender, - outbound_mix_sender: OutboundMixMessageSender, + outbound_mix_sender: MixForwardingSender, ) { info!("Starting websocket listener at {}", self.address); let mut tcp_listener = tokio::net::TcpListener::bind(self.address) @@ -66,7 +66,7 @@ impl Listener { pub(crate) fn start( mut self, clients_handler_sender: ClientsHandlerRequestSender, - outbound_mix_sender: OutboundMixMessageSender, + outbound_mix_sender: MixForwardingSender, ) -> JoinHandle<()> { tokio::spawn(async move { self.run(clients_handler_sender, outbound_mix_sender).await }) } diff --git a/gateway/src/node/mixnet_handling/mod.rs b/gateway/src/node/mixnet_handling/mod.rs index c4d03e42fad..b6644453927 100644 --- a/gateway/src/node/mixnet_handling/mod.rs +++ b/gateway/src/node/mixnet_handling/mod.rs @@ -13,7 +13,6 @@ // limitations under the License. pub(crate) mod receiver; -pub(crate) mod sender; pub(crate) use receiver::listener::Listener; pub(crate) use receiver::packet_processing::PacketProcessor; diff --git a/gateway/src/node/mixnet_handling/receiver/connection_handler.rs b/gateway/src/node/mixnet_handling/receiver/connection_handler.rs index 3389e774adb..d31ad53e052 100644 --- a/gateway/src/node/mixnet_handling/receiver/connection_handler.rs +++ b/gateway/src/node/mixnet_handling/receiver/connection_handler.rs @@ -12,64 +12,240 @@ // See the License for the specific language governing permissions and // limitations under the License. +use crate::node::client_handling::clients_handler::{ + ClientsHandlerRequest, ClientsHandlerRequestSender, ClientsHandlerResponse, +}; +use crate::node::client_handling::websocket::message_receiver::MixMessageSender; use crate::node::mixnet_handling::receiver::packet_processing::PacketProcessor; +use crate::node::storage::inboxes::{ClientStorage, StoreData}; +use dashmap::DashMap; +use futures::channel::oneshot; use log::*; -use nymsphinx::framing::SphinxCodec; -use nymsphinx::SphinxPacket; +use mixnet_client::forwarder::MixForwardingSender; +use mixnode_common::cached_packet_processor::processor::ProcessedFinalHop; +use nymsphinx::forwarding::packet::MixPacket; +use nymsphinx::framing::codec::SphinxCodec; +use nymsphinx::framing::packet::FramedSphinxPacket; +use nymsphinx::DestinationAddressBytes; use std::net::SocketAddr; +use std::sync::Arc; +use tokio::net::TcpStream; use tokio::prelude::*; use tokio::stream::StreamExt; use tokio_util::codec::Framed; -pub(crate) struct Handle<S: AsyncRead + AsyncWrite + Unpin> { - peer_address: SocketAddr, - framed_connection: Framed<S, SphinxCodec>, +pub(crate) struct ConnectionHandler { packet_processor: PacketProcessor, + + // TODO: method for cache invalidation so that we wouldn't keep all stale channel references + // we could use our friend DelayQueue. Alternatively we could periodically check for if the + // channels are closed. + available_socket_senders_cache: DashMap<DestinationAddressBytes, MixMessageSender>, + client_store: ClientStorage, + clients_handler_sender: ClientsHandlerRequestSender, + ack_sender: MixForwardingSender, } -impl<S> Handle<S> -where - S: AsyncRead + AsyncWrite + Unpin + 'static, -{ - // for time being we assume handle is always constructed from raw socket. - // if we decide we want to change it, that's not too difficult +impl ConnectionHandler { pub(crate) fn new( - peer_address: SocketAddr, - conn: S, packet_processor: PacketProcessor, + clients_handler_sender: ClientsHandlerRequestSender, + client_store: ClientStorage, + + ack_sender: MixForwardingSender, ) -> Self { - // we expect only to receive sphinx packets on this socket, so let's frame it here - let framed = Framed::new(conn, SphinxCodec); - Handle { - peer_address, - framed_connection: framed, + ConnectionHandler { packet_processor, + available_socket_senders_cache: DashMap::new(), + client_store, + clients_handler_sender, + ack_sender, + } + } + + pub(crate) fn clone_without_cache(&self) -> Self { + // TODO: should this be even cloned? + let senders_cache = DashMap::with_capacity(self.available_socket_senders_cache.capacity()); + for element_guard in self.available_socket_senders_cache.iter() { + let (k, v) = element_guard.pair(); + // TODO: this will be made redundant once there's some cache invalidator mechanism here + if !v.is_closed() { + senders_cache.insert(*k, v.clone()); + } + } + + ConnectionHandler { + packet_processor: self.packet_processor.clone_without_key_cache(), + available_socket_senders_cache: senders_cache, + client_store: self.client_store.clone(), + clients_handler_sender: self.clients_handler_sender.clone(), + ack_sender: self.ack_sender.clone(), + } + } + + fn try_push_message_to_client( + &self, + sender_channel: Option<MixMessageSender>, + message: Vec<u8>, + ) -> Result<(), Vec<u8>> { + match sender_channel { + None => Err(message), + Some(sender_channel) => { + sender_channel + .unbounded_send(vec![message]) + // right now it's a "simpler" case here as we're only ever sending 1 message + // at the time, but the channel itself could accept arbitrary many messages at once + .map_err(|try_send_err| try_send_err.into_inner().pop().unwrap()) + } + } + } + + fn remove_stale_client_sender(&self, client_address: &DestinationAddressBytes) { + if !self.available_socket_senders_cache.remove(client_address) { + warn!( + "Tried to remove stale entry for non-existent client sender: {}", + client_address + ) + } + } + + async fn try_to_obtain_client_ws_message_sender( + &self, + client_address: DestinationAddressBytes, + ) -> Option<MixMessageSender> { + let mut should_remove_stale = false; + if let Some(sender_ref) = self.available_socket_senders_cache.get(&client_address) { + let sender = sender_ref.value(); + if !sender.is_closed() { + return Some(sender.clone()); + } else { + should_remove_stale = true; + } + } + + // we want to do it outside the immutable borrow into the map + if should_remove_stale { + self.remove_stale_client_sender(&client_address) } + + // if we got here it means that either we have no sender channel for this client or it's closed + // so we must refresh it from the source, i.e. ClientsHandler + let (res_sender, res_receiver) = oneshot::channel(); + let clients_handler_request = ClientsHandlerRequest::IsOnline(client_address, res_sender); + self.clients_handler_sender + .unbounded_send(clients_handler_request) + .unwrap(); // the receiver MUST BE alive + + let client_sender = match res_receiver.await.unwrap() { + ClientsHandlerResponse::IsOnline(client_sender) => client_sender, + _ => panic!("received response to wrong query!"), // again, this should NEVER happen + }?; + + // finally update the cache + if self + .available_socket_senders_cache + .insert(client_address, client_sender.clone()) + { + // this warning is harmless, but I want to see if it's realistically for it to even occur + warn!("Other thread already updated cache for client sender!") + } + + Some(client_sender) } - async fn process_received_packet( - sphinx_packet: SphinxPacket, - mut packet_processor: PacketProcessor, - ) { - match packet_processor.process_sphinx_packet(sphinx_packet).await { - Ok(_) => trace!("successfully processed [and forwarded/stored] a final hop packet"), - Err(e) => debug!("We failed to process received sphinx packet - {:?}", e), + pub(crate) async fn store_processed_packet_payload( + &self, + client_address: DestinationAddressBytes, + message: Vec<u8>, + ) -> io::Result<()> { + debug!( + "Storing received message for {} on the disk...", + client_address + ); + + let store_data = StoreData::new(client_address, message); + self.client_store.store_processed_data(store_data).await + } + + fn forward_ack(&self, forward_ack: Option<MixPacket>, client_address: DestinationAddressBytes) { + if let Some(forward_ack) = forward_ack { + trace!( + "Sending ack from packet for {} to {}", + client_address, + forward_ack.next_hop() + ); + + self.ack_sender.unbounded_send(forward_ack).unwrap(); } } - pub(crate) async fn start_handling(&mut self) { - while let Some(sphinx_packet) = self.framed_connection.next().await { - match sphinx_packet { - Ok(sphinx_packet) => { - // rather important TODO: - // we *really* need a worker pool here, because if we receive too many packets, - // we will spawn too many tasks and starve CPU due to context switching. - // (because presumably tokio has some concept of context switching in its - // scheduler) - tokio::spawn(Self::process_received_packet( - sphinx_packet, - self.packet_processor.clone(), - )); + async fn handle_processed_packet(&self, processed_final_hop: ProcessedFinalHop) { + let client_address = processed_final_hop.destination; + let message = processed_final_hop.message; + let forward_ack = processed_final_hop.forward_ack; + + let client_sender = self + .try_to_obtain_client_ws_message_sender(client_address) + .await; + + // we failed to push message directly to the client - it's probably offline. + // we should store it on the disk instead. + match self.try_push_message_to_client(client_sender, message) { + Err(unsent_plaintext) => match self + .store_processed_packet_payload(client_address, unsent_plaintext) + .await + { + Err(err) => error!("Failed to store client data - {}", err), + Ok(_) => trace!("Stored packet for {}", client_address), + }, + Ok(_) => trace!("Pushed received packet to {}", client_address), + } + + // if we managed to either push message directly to the [online] client or store it at + // its inbox, it means that it must exist at this gateway, hence we can send the + // received ack back into the network + self.forward_ack(forward_ack, client_address); + } + + async fn handle_received_packet(self: Arc<Self>, framed_sphinx_packet: FramedSphinxPacket) { + // + // TODO: here be replay attack detection - it will require similar key cache to the one in + // packet processor for vpn packets, + // question: can it also be per connection vs global? + // + + let processed_final_hop = match self + .packet_processor + .process_received(framed_sphinx_packet) + .await + { + Err(e) => { + debug!("We failed to process received sphinx packet - {:?}", e); + return; + } + Ok(processed_final_hop) => processed_final_hop, + }; + + self.handle_processed_packet(processed_final_hop).await + } + + pub(crate) async fn handle_connection(self, conn: TcpStream, remote: SocketAddr) { + debug!("Starting connection handler for {:?}", remote); + let this = Arc::new(self); + let mut framed_conn = Framed::new(conn, SphinxCodec); + while let Some(framed_sphinx_packet) = framed_conn.next().await { + match framed_sphinx_packet { + Ok(framed_sphinx_packet) => { + // TODO: benchmark spawning tokio task with full processing vs just processing it + // synchronously (without delaying inside of course, + // delay could be moved to a per-connection DelayQueue. The delay queue future + // could automatically just forward packet that is done being delayed) + // under higher load in single and multi-threaded situation. + // + // My gut feeling is saying that we might get some nice performance boost + // if we introduced the change + let this = Arc::clone(&this); + tokio::spawn(this.handle_received_packet(framed_sphinx_packet)); } Err(err) => { error!( @@ -80,6 +256,10 @@ where } } } - info!("Closing connection from {:?}", self.peer_address); + + info!( + "Closing connection from {:?}", + framed_conn.into_inner().peer_addr() + ); } } diff --git a/gateway/src/node/mixnet_handling/receiver/listener.rs b/gateway/src/node/mixnet_handling/receiver/listener.rs index 9532a37af5a..36002e6fca0 100644 --- a/gateway/src/node/mixnet_handling/receiver/listener.rs +++ b/gateway/src/node/mixnet_handling/receiver/listener.rs @@ -12,9 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::node::mixnet_handling::receiver::{ - connection_handler::Handle, packet_processing::PacketProcessor, -}; +use crate::node::mixnet_handling::receiver::connection_handler::ConnectionHandler; use log::*; use std::net::SocketAddr; use tokio::task::JoinHandle; @@ -23,12 +21,13 @@ pub(crate) struct Listener { address: SocketAddr, } +// TODO: this file is nearly identical to the one in mixnode impl Listener { pub(crate) fn new(address: SocketAddr) -> Self { Listener { address } } - pub(crate) async fn run(&mut self, packet_processor: PacketProcessor) { + pub(crate) async fn run(&mut self, connection_handler: ConnectionHandler) { info!("Starting mixnet listener at {}", self.address); let mut tcp_listener = tokio::net::TcpListener::bind(self.address) .await @@ -37,16 +36,17 @@ impl Listener { loop { match tcp_listener.accept().await { Ok((socket, remote_addr)) => { - trace!("received a socket connection from {}", remote_addr); - let mut handle = Handle::new(remote_addr, socket, packet_processor.clone()); - tokio::spawn(async move { handle.start_handling().await }); + let handler = connection_handler.clone_without_cache(); + tokio::spawn(handler.handle_connection(socket, remote_addr)); } Err(e) => warn!("failed to get client: {:?}", e), } } } - pub(crate) fn start(mut self, packet_processor: PacketProcessor) -> JoinHandle<()> { - tokio::spawn(async move { self.run(packet_processor).await }) + pub(crate) fn start(mut self, connection_handler: ConnectionHandler) -> JoinHandle<()> { + info!("Running mix listener on {:?}", self.address.to_string()); + + tokio::spawn(async move { self.run(connection_handler).await }) } } diff --git a/gateway/src/node/mixnet_handling/receiver/packet_processing.rs b/gateway/src/node/mixnet_handling/receiver/packet_processing.rs index bc87c08e72f..3cb19bce213 100644 --- a/gateway/src/node/mixnet_handling/receiver/packet_processing.rs +++ b/gateway/src/node/mixnet_handling/receiver/packet_processing.rs @@ -12,285 +12,56 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::node::client_handling::clients_handler::{ - ClientsHandlerRequest, ClientsHandlerRequestSender, ClientsHandlerResponse, -}; -use crate::node::client_handling::websocket::message_receiver::MixMessageSender; -use crate::node::mixnet_handling::sender::OutboundMixMessageSender; -use crate::node::storage::inboxes::{ClientStorage, StoreData}; use crypto::asymmetric::encryption; -use futures::channel::oneshot; -use futures::lock::Mutex; -use log::*; -use nymsphinx::acknowledgements::surb_ack::{SURBAck, SURBAckRecoveryError}; -use nymsphinx::params::packet_sizes::PacketSize; -use nymsphinx::{DestinationAddressBytes, Error as SphinxError, ProcessedPacket, SphinxPacket}; - -use std::collections::HashMap; -use std::io; -use std::sync::Arc; +use mixnode_common::cached_packet_processor::error::MixProcessingError; +pub use mixnode_common::cached_packet_processor::processor::MixProcessingResult; +use mixnode_common::cached_packet_processor::processor::{ + CachedPacketProcessor, ProcessedFinalHop, +}; +use nymsphinx::framing::packet::FramedSphinxPacket; +use tokio::time::Duration; #[derive(Debug)] -pub enum MixProcessingError { - ReceivedForwardHopError, - UnsupportedSphinxPacketSize(usize), - SphinxProcessingError(SphinxError), - IncorrectlyFormattedSURBAck(SURBAckRecoveryError), - IOError(io::Error), -} - -impl From<SphinxError> for MixProcessingError { - // for time being just have a single error instance for all possible results of SphinxError - fn from(err: SphinxError) -> Self { - use MixProcessingError::*; - - SphinxProcessingError(err) - } +pub enum GatewayProcessingError { + PacketProcessingError(MixProcessingError), + ForwardHopReceivedError, } -impl From<io::Error> for MixProcessingError { - fn from(e: io::Error) -> Self { - use MixProcessingError::*; +impl From<MixProcessingError> for GatewayProcessingError { + fn from(e: MixProcessingError) -> Self { + use GatewayProcessingError::*; - IOError(e) - } -} - -impl From<SURBAckRecoveryError> for MixProcessingError { - fn from(err: SURBAckRecoveryError) -> Self { - use MixProcessingError::*; - - IncorrectlyFormattedSURBAck(err) + PacketProcessingError(e) } } // PacketProcessor contains all data required to correctly unwrap and store sphinx packets -#[derive(Clone)] pub struct PacketProcessor { - encryption_keys: Arc<encryption::KeyPair>, - // TODO: later investigate some concurrent hashmap solutions or perhaps RWLocks. - // Right now Mutex is the simplest and fastest to implement approach - available_socket_senders_cache: Arc<Mutex<HashMap<DestinationAddressBytes, MixMessageSender>>>, - client_store: ClientStorage, - clients_handler_sender: ClientsHandlerRequestSender, - ack_sender: OutboundMixMessageSender, + inner_processor: CachedPacketProcessor, } impl PacketProcessor { - pub(crate) fn new( - encryption_keys: Arc<encryption::KeyPair>, - clients_handler_sender: ClientsHandlerRequestSender, - client_store: ClientStorage, - ack_sender: OutboundMixMessageSender, - ) -> Self { + pub(crate) fn new(encryption_key: &encryption::PrivateKey, cache_entry_ttl: Duration) -> Self { PacketProcessor { - available_socket_senders_cache: Arc::new(Mutex::new(HashMap::new())), - clients_handler_sender, - client_store, - encryption_keys, - ack_sender, - } - } - - fn try_push_message_to_client( - &self, - sender_channel: Option<MixMessageSender>, - message: Vec<u8>, - ) -> Result<(), Vec<u8>> { - match sender_channel { - None => Err(message), - Some(sender_channel) => { - sender_channel - .unbounded_send(vec![message]) - // right now it's a "simpler" case here as we're only ever sending 1 message - // at the time, but the channel itself could accept arbitrary many messages at once - .map_err(|try_send_err| try_send_err.into_inner().pop().unwrap()) - } + inner_processor: CachedPacketProcessor::new(encryption_key.into(), cache_entry_ttl), } } - async fn try_to_obtain_client_ws_message_sender( - &mut self, - client_address: DestinationAddressBytes, - ) -> Option<MixMessageSender> { - let mut cache_guard = self.available_socket_senders_cache.lock().await; - - if let Some(sender) = cache_guard.get(&client_address) { - if !sender.is_closed() { - return Some(sender.clone()); - } else { - cache_guard.remove(&client_address); - } - } - - // do not block other readers to the cache while we are doing some blocking work here - drop(cache_guard); - - // if we got here it means that either we have no sender channel for this client or it's closed - // so we must refresh it from the source, i.e. ClientsHandler - let (res_sender, res_receiver) = oneshot::channel(); - let clients_handler_request = - ClientsHandlerRequest::IsOnline(client_address.clone(), res_sender); - self.clients_handler_sender - .unbounded_send(clients_handler_request) - .unwrap(); // the receiver MUST BE alive - - let client_sender = match res_receiver.await.unwrap() { - ClientsHandlerResponse::IsOnline(client_sender) => client_sender, - _ => panic!("received response to wrong query!"), // again, this should NEVER happen - }; - - client_sender.as_ref()?; - - let client_sender = client_sender.unwrap(); - // finally re-acquire the lock to update the cache - let mut cache_guard = self.available_socket_senders_cache.lock().await; - cache_guard.insert(client_address, client_sender.clone()); - - Some(client_sender) - } - - pub(crate) async fn store_processed_packet_payload( - &self, - client_address: DestinationAddressBytes, - message: Vec<u8>, - ) -> io::Result<()> { - debug!( - "Storing received packet for {:?} on the disk...", - client_address.to_base58_string() - ); - // we are temporarily ignoring and not storing obvious loop cover traffic messages to - // not cause our sfw-provider to run out of disk space too quickly. - // Eventually this is going to get removed and be replaced by a quota system described in: - // https://github.com/nymtech/nym/issues/137 - - // JS: I think this would never get called anyway, because if loop cover messages are sent - // it means client is online and hence all his messages should be pushed directly to him? - if nymsphinx::cover::is_cover(&message) { - debug!("Received a loop cover message - not going to store it"); - return Ok(()); + pub(crate) fn clone_without_key_cache(&self) -> Self { + PacketProcessor { + inner_processor: self.inner_processor.clone_without_cache(), } - - let store_data = StoreData::new(client_address, message); - self.client_store.store_processed_data(store_data).await } - pub(crate) fn unwrap_sphinx_packet( + pub(crate) async fn process_received( &self, - packet: SphinxPacket, - ) -> Result<(DestinationAddressBytes, Vec<u8>), MixProcessingError> { - match packet.process(&self.encryption_keys.as_ref().private_key().into()) { - Ok(ProcessedPacket::ProcessedPacketForwardHop(_, _, _)) => { - warn!("Received a forward hop message - those are not implemented for gateways"); - Err(MixProcessingError::ReceivedForwardHopError) - } - Ok(ProcessedPacket::ProcessedPacketFinalHop(client_address, _surb_id, payload)) => { - // in our current design, we do not care about the 'surb_id' in the header - // as it will always be empty anyway - let message = payload.recover_plaintext()?; - Ok((client_address, message)) - } - Err(e) => { - warn!("Failed to unwrap Sphinx packet: {:?}", e); - Err(MixProcessingError::SphinxProcessingError(e)) + received: FramedSphinxPacket, + ) -> Result<ProcessedFinalHop, GatewayProcessingError> { + match self.inner_processor.process_received(received).await? { + MixProcessingResult::ForwardHop(..) => { + Err(GatewayProcessingError::ForwardHopReceivedError) } + MixProcessingResult::FinalHop(processed_final) => Ok(processed_final), } } - - fn split_plaintext_into_ack_and_message( - &self, - mut extracted_plaintext: Vec<u8>, - ) -> (Vec<u8>, Vec<u8>) { - if extracted_plaintext.len() < SURBAck::len() { - // TODO: - // TODO: - // this is mostly for dev purposes to see if we receive something we did not mean to send - // but in an actual system, what should we do? abandon the whole packet? - // store client's data regardless? - // I'm going to leave this question open for until I've implemented reply SURBs - // as they will change the communication between client and gateway so this - // if statement might no longer make any sense - panic!("received packet without an ack"); - } - - let plaintext = extracted_plaintext.split_off(SURBAck::len()); - let ack_data = extracted_plaintext; - (ack_data, plaintext) - } - - pub(crate) async fn process_sphinx_packet( - &mut self, - sphinx_packet: SphinxPacket, - ) -> Result<(), MixProcessingError> { - // see if what we got now is an ack or normal packet - let packet_len = sphinx_packet.len(); - // TODO: micro-optimisations: - // 1. don't even try to unwrap the packet if it's not one of `PacketSize` variants - // 2. if client_address doesn't exist at this gateway, don't do any other work here - // (as stupid as this sounds, there's currently no easy way of directly checking if the - // client exists here) - let (client_address, plaintext) = self.unwrap_sphinx_packet(sphinx_packet)?; - let (routable_ack, plaintext) = match packet_len { - n if n == PacketSize::ACKPacket.size() => { - trace!("received an ack packet!"); - (None, plaintext) - } - n if n == PacketSize::RegularPacket.size() - || n == PacketSize::ExtendedPacket.size() => - { - trace!("received a normal packet!"); - let (ack_data, plaintext) = self.split_plaintext_into_ack_and_message(plaintext); - let (ack_first_hop, ack_packet) = SURBAck::try_recover_first_hop_packet(&ack_data)?; - (Some((ack_first_hop, ack_packet)), plaintext) - } - n => return Err(MixProcessingError::UnsupportedSphinxPacketSize(n)), - }; - - let client_sender = self - .try_to_obtain_client_ws_message_sender(client_address.clone()) - .await; - - if let Err(unsent_plaintext) = self.try_push_message_to_client(client_sender, plaintext) { - // means we failed to push message directly to the client (it might be offline) - // but we don't want to store an ack message for him - he won't be able to decode - // it anyway. - // TODO: after keybase discussion we *might* want to store them after all - if routable_ack.is_none() { - trace!("Received an ack for offline client - won't try storing it"); - return Ok(()); - } - - if let Err(io_err) = self - .store_processed_packet_payload(client_address.clone(), unsent_plaintext) - .await - { - return Err(io_err.into()); - } else { - trace!( - "Managed to store packet for {:?} on the disk", - client_address.to_base58_string() - ); - } - } else { - trace!( - "Managed to push received packet for {:?} to websocket connection!", - client_address.to_base58_string() - ); - } - - // if we managed to either push message directly to the [online] client or store it at - // it's inbox, it means that it must exist at this gateway, hence we can send the - // received ack back into the network - if let Some((ack_first_hop, ack_packet)) = routable_ack { - trace!( - "Sending an ack back into the network. The first hop is {:?}", - ack_first_hop - ); - self.ack_sender - .unbounded_send((ack_first_hop, ack_packet)) - .unwrap(); - } - - Ok(()) - } } diff --git a/gateway/src/node/mixnet_handling/sender/mod.rs b/gateway/src/node/mixnet_handling/sender/mod.rs deleted file mode 100644 index 5bed92ef734..00000000000 --- a/gateway/src/node/mixnet_handling/sender/mod.rs +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -// TODO: code is nearly identical to mixnode::node::packet_forwarding -> perhaps it should be put to common? - -use futures::channel::mpsc; -use futures::StreamExt; -use log::*; -use nymsphinx::{addressing::nodes::NymNodeRoutingAddress, SphinxPacket}; -use std::time::Duration; -use tokio::task::JoinHandle; - -pub(crate) type OutboundMixMessageSender = - mpsc::UnboundedSender<(NymNodeRoutingAddress, SphinxPacket)>; -pub(crate) type OutboundMixMessageReceiver = - mpsc::UnboundedReceiver<(NymNodeRoutingAddress, SphinxPacket)>; - -pub(crate) struct PacketForwarder { - mixnet_client: mixnet_client::Client, - conn_tx: OutboundMixMessageSender, - conn_rx: OutboundMixMessageReceiver, -} - -impl PacketForwarder { - pub(crate) fn new( - initial_reconnection_backoff: Duration, - maximum_reconnection_backoff: Duration, - initial_connection_timeout: Duration, - ) -> PacketForwarder { - let tcp_client_config = mixnet_client::Config::new( - initial_reconnection_backoff, - maximum_reconnection_backoff, - initial_connection_timeout, - ); - - let (conn_tx, conn_rx) = mpsc::unbounded(); - - PacketForwarder { - mixnet_client: mixnet_client::Client::new(tcp_client_config), - conn_tx, - conn_rx, - } - } - - pub(crate) fn start(mut self) -> (JoinHandle<()>, OutboundMixMessageSender) { - let sender_channel = self.conn_tx.clone(); - ( - tokio::spawn(async move { - while let Some((address, packet)) = self.conn_rx.next().await { - trace!("Going to forward packet to {:?}", address); - // as a mix node we don't care about responses, we just want to fire packets - // as quickly as possible - self.mixnet_client - .send(address, packet, false) - .await - .unwrap(); - // if we're not waiting for response, we MUST get an Ok - } - }), - sender_channel, - ) - } -} diff --git a/gateway/src/node/mod.rs b/gateway/src/node/mod.rs index e0a2dc3fa55..c0e2a459ad6 100644 --- a/gateway/src/node/mod.rs +++ b/gateway/src/node/mod.rs @@ -15,11 +15,11 @@ use crate::config::Config; use crate::node::client_handling::clients_handler::{ClientsHandler, ClientsHandlerRequestSender}; use crate::node::client_handling::websocket; -use crate::node::mixnet_handling::sender::{OutboundMixMessageSender, PacketForwarder}; +use crate::node::mixnet_handling::receiver::connection_handler::ConnectionHandler; use crate::node::storage::{inboxes, ClientLedger}; use crypto::asymmetric::{encryption, identity}; -use directory_client::DirectoryClient; use log::*; +use mixnet_client::forwarder::{MixForwardingSender, PacketForwarder}; use std::sync::Arc; use tokio::runtime::Runtime; @@ -65,24 +65,30 @@ impl Gateway { fn start_mix_socket_listener( &self, clients_handler_sender: ClientsHandlerRequestSender, - ack_sender: OutboundMixMessageSender, + ack_sender: MixForwardingSender, ) { info!("Starting mix socket listener..."); let packet_processor = mixnet_handling::PacketProcessor::new( - Arc::clone(&self.encryption_keys), + self.encryption_keys.private_key(), + self.config.get_cache_entry_ttl(), + ); + + let connection_handler = ConnectionHandler::new( + packet_processor, clients_handler_sender, self.client_inbox_storage.clone(), ack_sender, ); - mixnet_handling::Listener::new(self.config.get_mix_listening_address()) - .start(packet_processor); + let listener = mixnet_handling::Listener::new(self.config.get_mix_listening_address()); + + listener.start(connection_handler); } fn start_client_websocket_listener( &self, - forwarding_channel: OutboundMixMessageSender, + forwarding_channel: MixForwardingSender, clients_handler_sender: ClientsHandlerRequestSender, ) { info!("Starting client [web]socket listener..."); @@ -94,16 +100,18 @@ impl Gateway { .start(clients_handler_sender, forwarding_channel); } - fn start_packet_forwarder(&self) -> OutboundMixMessageSender { + fn start_packet_forwarder(&self) -> MixForwardingSender { info!("Starting mix packet forwarder..."); - let (_, forwarding_channel) = PacketForwarder::new( + let (mut packet_forwarder, packet_sender) = PacketForwarder::new( self.config.get_packet_forwarding_initial_backoff(), self.config.get_packet_forwarding_maximum_backoff(), self.config.get_initial_connection_timeout(), - ) - .start(); - forwarding_channel + self.config.get_packet_forwarding_max_reconnections(), + ); + + tokio::spawn(async move { packet_forwarder.run().await }); + packet_sender } fn start_clients_handler(&self) -> ClientsHandlerRequestSender { @@ -116,20 +124,6 @@ impl Gateway { clients_handler_sender } - fn start_presence_notifier(&self) { - info!("Starting presence notifier..."); - let notifier_config = presence::NotifierConfig::new( - self.config.get_location(), - self.config.get_presence_directory_server(), - self.config.get_mix_announce_address(), - self.config.get_clients_announce_address(), - self.identity.public_key().to_base58_string(), - self.encryption_keys.public_key().to_base58_string(), - self.config.get_presence_sending_delay(), - ); - presence::Notifier::new(notifier_config).start(); - } - async fn wait_for_interrupt(&self) { if let Err(e) = tokio::signal::ctrl_c().await { error!( @@ -140,26 +134,35 @@ impl Gateway { println!( "Received SIGINT - the gateway will terminate now (threads are not YET nicely stopped)" ); + if let Err(err) = presence::unregister_with_validator( + self.config.get_validator_rest_endpoint(), + self.identity.public_key().to_base58_string(), + ) + .await + { + error!("failed to unregister with validator... - {:?}", err) + } } async fn check_if_same_ip_gateway_exists(&self) -> Option<String> { let announced_mix_host = self.config.get_mix_announce_address(); let announced_clients_host = self.config.get_clients_announce_address(); - let directory_client_cfg = - directory_client::Config::new(self.config.get_presence_directory_server()); - let topology = directory_client::Client::new(directory_client_cfg) + let validator_client_config = + validator_client::Config::new(self.config.get_validator_rest_endpoint()); + let validator_client = validator_client::Client::new(validator_client_config); + let topology = validator_client .get_topology() .await - .expect("Failed to retrieve network topology"); + .expect("failed to grab network topology"); - let existing_gateways = topology.gateway_nodes; + let existing_gateways = topology.gateways; existing_gateways .iter() .find(|node| { - node.mixnet_listener == announced_mix_host - || node.client_listener == announced_clients_host + node.mixnet_listener() == announced_mix_host + || node.clients_listener() == announced_clients_host }) - .map(|node| node.identity_key.clone()) + .map(|node| node.identity()) } // Rather than starting all futures with explicit `&Handle` argument, let's see how it works @@ -167,19 +170,35 @@ impl Gateway { // Basically more or less equivalent of using #[tokio::main] attribute. pub fn run(&mut self) { info!("Starting nym gateway!"); + let mut runtime = Runtime::new().unwrap(); runtime.block_on(async { - - if let Some(duplicate_gateway_key) = self.check_if_same_ip_gateway_exists().await { - error!( - "Our announce-host is identical to an existing node's announce-host! (its key is {:?}", - duplicate_gateway_key - ); - return; + if let Some(duplicate_node_key) = self.check_if_same_ip_gateway_exists().await { + if duplicate_node_key == self.identity.public_key().to_base58_string() { + warn!("We seem to have not unregistered after going offline - there's a node with identical identity and announce-host as us registered.") + } else { + error!( + "Our announce-host is identical to an existing node's announce-host! (its key is {:?}", + duplicate_node_key + ); + return; + } } - + if let Err(err) = presence::register_with_validator( + self.config.get_validator_rest_endpoint(), + self.config.get_mix_announce_address(), + self.config.get_clients_announce_address(), + self.identity.public_key().to_base58_string(), + self.encryption_keys.public_key().to_base58_string(), + self.config.get_version().to_string(), + self.config.get_location(), + self.config.get_incentives_address() + ).await { + error!("failed to register with the validator - {:?}", err); + return + } let mix_forwarding_channel = self.start_packet_forwarder(); let clients_handler_sender = self.start_clients_handler(); @@ -187,8 +206,6 @@ impl Gateway { self.start_mix_socket_listener(clients_handler_sender.clone(), mix_forwarding_channel.clone()); self.start_client_websocket_listener(mix_forwarding_channel, clients_handler_sender); - self.start_presence_notifier(); - info!("Finished nym gateway startup procedure - it should now be able to receive mix and client traffic!"); self.wait_for_interrupt().await diff --git a/gateway/src/node/presence.rs b/gateway/src/node/presence.rs new file mode 100644 index 00000000000..6b67222a88b --- /dev/null +++ b/gateway/src/node/presence.rs @@ -0,0 +1,54 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +use validator_client::models::gateway::GatewayRegistrationInfo; +use validator_client::ValidatorClientError; + +// there's no point in keeping the validator client persistently as it might be literally hours or days +// before it's used again +pub(crate) async fn register_with_validator( + validator_endpoint: String, + mix_host: String, + clients_host: String, + identity_key: String, + sphinx_key: String, + version: String, + location: String, + incentives_address: Option<String>, +) -> Result<(), ValidatorClientError> { + let config = validator_client::Config::new(validator_endpoint); + let validator_client = validator_client::Client::new(config); + + let registration_info = GatewayRegistrationInfo::new( + mix_host, + clients_host, + identity_key, + sphinx_key, + version, + location, + incentives_address, + ); + + validator_client.register_gateway(registration_info).await +} + +pub(crate) async fn unregister_with_validator( + validator_endpoint: String, + identity_key: String, +) -> Result<(), ValidatorClientError> { + let config = validator_client::Config::new(validator_endpoint); + let validator_client = validator_client::Client::new(config); + + validator_client.unregister_node(&identity_key).await +} diff --git a/gateway/src/node/presence/mod.rs b/gateway/src/node/presence/mod.rs deleted file mode 100644 index 7a6e32a453c..00000000000 --- a/gateway/src/node/presence/mod.rs +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -use crate::built_info; -use directory_client::presence::gateways::GatewayPresence; -use directory_client::DirectoryClient; -use log::{error, trace}; -use std::time::Duration; -use tokio::task::JoinHandle; - -pub(crate) struct NotifierConfig { - location: String, - directory_server: String, - mix_announce_host: String, - clients_announce_host: String, - identity_string: String, - sphinx_key_string: String, - sending_delay: Duration, -} - -impl NotifierConfig { - pub(crate) fn new( - location: String, - directory_server: String, - mix_announce_host: String, - clients_announce_host: String, - identity_string: String, - sphinx_key_string: String, - sending_delay: Duration, - ) -> Self { - NotifierConfig { - location, - directory_server, - mix_announce_host, - clients_announce_host, - identity_string, - sphinx_key_string, - sending_delay, - } - } -} - -pub(crate) struct Notifier { - location: String, - net_client: directory_client::Client, - sending_delay: Duration, - client_listener: String, - mixnet_listener: String, - identity: String, - sphinx_key: String, -} - -impl Notifier { - pub(crate) fn new(config: NotifierConfig) -> Notifier { - let directory_client_cfg = directory_client::Config { - base_url: config.directory_server, - }; - let net_client = directory_client::Client::new(directory_client_cfg); - - Notifier { - net_client, - location: config.location, - client_listener: config.clients_announce_host, - mixnet_listener: config.mix_announce_host, - identity: config.identity_string, - sphinx_key: config.sphinx_key_string, - sending_delay: config.sending_delay, - } - } - - async fn make_presence(&self) -> GatewayPresence { - GatewayPresence { - location: self.location.clone(), - client_listener: self.client_listener.clone(), - mixnet_listener: self.mixnet_listener.clone(), - identity_key: self.identity.clone(), - sphinx_key: self.sphinx_key.clone(), - last_seen: 0, - version: built_info::PKG_VERSION.to_string(), - } - } - - async fn notify(&self, presence: GatewayPresence) { - match self.net_client.post_gateway_presence(presence).await { - Err(err) => error!("failed to send presence - {:?}", err), - Ok(_) => trace!("sent presence information"), - } - } - - pub fn start(self) -> JoinHandle<()> { - tokio::spawn(async move { - loop { - // set the deadline in the future - let sending_delay = tokio::time::delay_for(self.sending_delay); - let presence = self.make_presence().await; - self.notify(presence).await; - // wait for however much is left - sending_delay.await; - } - }) - } -} diff --git a/mixnode/Cargo.lock b/mixnode/Cargo.lock deleted file mode 100644 index 8e2c586d7a0..00000000000 --- a/mixnode/Cargo.lock +++ /dev/null @@ -1,2371 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -[[package]] -name = "adler32" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "aes-ctr" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "aes-soft 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "aesni 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ctr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "stream-cipher 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "aes-soft" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "aesni" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "stream-cipher 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "aho-corasick" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "ansi_term" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "arc-swap" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "arrayref" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "arrayvec" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "atty" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "autocfg" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "backtrace" -version = "0.3.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "backtrace-sys 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "backtrace-sys" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "base64" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "base64" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "bitflags" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "blake2" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crypto-mac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "blake2b_simd" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "constant_time_eq 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "block-buffer" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "block-padding 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "block-cipher-trait" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "block-padding" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "built" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "git2 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", - "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "toml 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "byte-tools" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "byteorder" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "bytes" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "bytes" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "c2-chacha" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "cc" -version = "1.0.47" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "jobserver 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "cfg-if" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "chacha" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "keystream 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "chrono" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "clap" -version = "2.33.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "clear_on_drop" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "cloudabi" -version = "0.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "constant_time_eq" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "cookie" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "cookie_store" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cookie 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "publicsuffix 1.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "try_from 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "core-foundation" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "core-foundation-sys" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "crc32fast" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "crossbeam-deque" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crossbeam-epoch 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memoffset 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "crossbeam-queue" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "crossbeam-utils" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "crossbeam-utils" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "crypto-mac" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "ctr" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "stream-cipher 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "curve25519-dalek" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.2.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "digest" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "dirs" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "dirs-sys 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "dirs-sys" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_users 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "dtoa" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "either" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "encoding_rs" -version = "0.8.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "error-chain" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "failure" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "backtrace 0.3.40 (registry+https://github.com/rust-lang/crates.io-index)", - "failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "failure_derive" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "fake-simd" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "flate2" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", - "miniz_oxide 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "fnv" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "fuchsia-cprng" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "fuchsia-zircon" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "fuchsia-zircon-sys" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "futures" -version = "0.1.29" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "futures" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "futures-channel 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-executor 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-io 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-sink 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-task 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "futures-channel" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-sink 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "futures-core" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "futures-cpupool" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "futures-executor" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-task 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "futures-io" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "futures-macro" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "futures-sink" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "futures-task" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "futures-util" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "futures-channel 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-io 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-macro 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-sink 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-task 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-nested 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "generic-array" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "getrandom" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", - "wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "git2" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", - "libgit2-sys 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "url 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "h2" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "indexmap 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "string 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "hermit-abi" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "hex" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "hkdf" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "hmac" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crypto-mac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "http" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "http-body" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-buf 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "httparse" -version = "1.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "hyper" -version = "0.12.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "h2 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "http-body 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-buf 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-threadpool 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", - "want 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "hyper-tls" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.12.35 (registry+https://github.com/rust-lang/crates.io-index)", - "native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "idna" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-normalization 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "idna" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-normalization 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "indexmap" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "input_buffer" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "iovec" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "itoa" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "jobserver" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "kernel32-sys" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "keystream" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "libc" -version = "0.2.65" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "libgit2-sys" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", - "libz-sys 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "libz-sys" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", - "vcpkg 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "lioness" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "blake2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "chacha 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "keystream 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "lock_api" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "log" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "matches" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "maybe-uninit" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "memchr" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "memoffset" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "mime" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "mime_guess" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "mime 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", - "unicase 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "miniz_oxide" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "mio" -version = "0.6.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "mio-named-pipes" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", - "miow 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "mio-uds" -version = "0.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "miow" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "miow" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "socket2 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "native-tls" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl 0.10.26 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.53 (registry+https://github.com/rust-lang/crates.io-index)", - "schannel 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", - "security-framework 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "security-framework-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "net2" -version = "0.2.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "num-integer" -version = "0.1.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "num-traits" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "num_cpus" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "hermit-abi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "nym-client" -version = "0.2.0" -dependencies = [ - "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "built 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "dirs 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hex 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "pem 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_distr 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "reqwest 0.9.24 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", - "sfw-provider-requests 0.1.0", - "sphinx 0.1.0", - "tokio 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-tungstenite 0.10.0 (git+https://github.com/dbcfd/tokio-tungstenite?rev=6dc2018cbfe8fe7ddd75ff977343086503135b38)", - "tungstenite 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "nym-mixnode" -version = "0.2.0" -dependencies = [ - "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "built 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "nym-client 0.2.0", - "sphinx 0.1.0", - "tokio 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "opaque-debug" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "openssl" -version = "0.10.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.53 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "openssl-probe" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "openssl-sys" -version = "0.9.53" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", - "vcpkg 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "parking_lot" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lock_api 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot_core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "parking_lot_core" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "pem" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "percent-encoding" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "percent-encoding" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "pin-project" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "pin-project-internal 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "pin-project-internal" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "pin-project-lite" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "pin-utils" -version = "0.1.0-alpha.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "pkg-config" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "ppv-lite86" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "proc-macro-hack" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "proc-macro-nested" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "proc-macro2" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "publicsuffix" -version = "1.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", - "idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "url 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "quote" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand_chacha" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand_chacha" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "c2-chacha 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand_core" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand_core" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand_distr" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand_hc" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand_isaac" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand_jitter" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand_os" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand_pcg" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand_xorshift" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rdrand" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "redox_syscall" -version = "0.1.56" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "redox_users" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", - "rust-argon2 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "regex" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "aho-corasick 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "regex-syntax" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "remove_dir_all" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "reqwest" -version = "0.9.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "cookie 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cookie_store 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "encoding_rs 0.8.20 (registry+https://github.com/rust-lang/crates.io-index)", - "flate2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.12.35 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper-tls 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "mime 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", - "mime_guess 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_urlencoded 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-threadpool 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "uuid 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", - "winreg 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rust-argon2" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", - "blake2b_simd 0.5.9 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "rustc_version" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "ryu" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "schannel" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "scopeguard" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "security-framework" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "core-foundation 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", - "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", - "security-framework-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "security-framework-sys" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "semver" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "serde" -version = "1.0.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "serde_derive" -version = "1.0.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "serde_json" -version = "1.0.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", - "ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "serde_urlencoded" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "dtoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", - "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "sfw-provider-requests" -version = "0.1.0" -dependencies = [ - "sphinx 0.1.0", -] - -[[package]] -name = "sha-1" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "sha2" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "signal-hook-registry" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "arc-swap 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "slab" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "smallvec" -version = "0.6.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "smallvec" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "socket2" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "sphinx" -version = "0.1.0" -dependencies = [ - "aes-ctr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "blake2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "chacha 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "hkdf 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "lioness 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_distr 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stream-cipher" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "string" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "strsim" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "subtle" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "subtle" -version = "2.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "syn" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "synstructure" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tempfile" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", - "remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "textwrap" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "thread_local" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "time" -version = "0.1.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-threadpool 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", - "mio-named-pipes 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-project-lite 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "signal-hook-registry 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-macros 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-buf" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-current-thread" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-executor" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-io" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-macros" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-reactor" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-sync 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-sync" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-tcp" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-threadpool" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-timer" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.10.0" -source = "git+https://github.com/dbcfd/tokio-tungstenite?rev=6dc2018cbfe8fe7ddd75ff977343086503135b38#6dc2018cbfe8fe7ddd75ff977343086503135b38" -dependencies = [ - "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-project 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tungstenite 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "toml" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "try-lock" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "try_from" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tungstenite" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "input_buffer 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "url 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "utf-8 0.7.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "typenum" -version = "1.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "unicase" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "unicode-normalization" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "unicode-width" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "unicode-xid" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "url" -version = "1.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "url" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "utf-8" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "uuid" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "vcpkg" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "vec_map" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "version_check" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "version_check" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "want" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "wasi" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "winapi" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "winapi" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "winapi-build" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "winreg" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "ws2_32-sys" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[metadata] -"checksum adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5d2e7343e7fc9de883d1b0341e0b13970f764c14101234857d2ddafa1cb1cac2" -"checksum aes-ctr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d2e5b0458ea3beae0d1d8c0f3946564f8e10f90646cf78c06b4351052058d1ee" -"checksum aes-soft 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cfd7e7ae3f9a1fb5c03b389fc6bb9a51400d0c13053f0dca698c832bfd893a0d" -"checksum aesni 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f70a6b5f971e473091ab7cfb5ffac6cde81666c4556751d8d5620ead8abf100" -"checksum aho-corasick 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "58fb5e95d83b38284460a5fda7d6470aa0b8844d283a0b614b8535e880800d2d" -"checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" -"checksum arc-swap 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d7b8a9123b8027467bce0099fe556c628a53c8d83df0507084c31e9ba2e39aff" -"checksum arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0d382e583f07208808f6b1249e60848879ba3543f57c32277bf52d69c2f0f0ee" -"checksum arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8" -"checksum atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "1803c647a3ec87095e7ae7acfca019e98de5ec9a7d01343f611cf3152ed71a90" -"checksum autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" -"checksum backtrace 0.3.40 (registry+https://github.com/rust-lang/crates.io-index)" = "924c76597f0d9ca25d762c25a4d369d51267536465dc5064bdf0eb073ed477ea" -"checksum backtrace-sys 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6575f128516de27e3ce99689419835fce9643a9b215a14d2b5b685be018491" -"checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" -"checksum base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7" -"checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" -"checksum blake2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "94cb07b0da6a73955f8fb85d24c466778e70cda767a568229b104f0264089330" -"checksum blake2b_simd 0.5.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b83b7baab1e671718d78204225800d6b170e648188ac7dc992e9d6bddf87d0c0" -"checksum block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" -"checksum block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1c924d49bd09e7c06003acda26cd9742e796e34282ec6c1189404dee0c1f4774" -"checksum block-padding 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" -"checksum built 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3d2315cfb416f86e05360edc950b1d7d25ecfb00f7f8eba60dbd7882a0f2e944" -"checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" -"checksum byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5" -"checksum bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" -"checksum bytes 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1c85319f157e4e26c703678e68e26ab71a46c0199286fa670b21cc9fec13d895" -"checksum c2-chacha 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "214238caa1bf3a496ec3392968969cab8549f96ff30652c9e56885329315f6bb" -"checksum cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)" = "aa87058dce70a3ff5621797f1506cb837edd02ac4c0ae642b4542dce802908b8" -"checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" -"checksum chacha 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddf3c081b5fba1e5615640aae998e0fbd10c24cbd897ee39ed754a77601a4862" -"checksum chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "31850b4a4d6bae316f7a09e691c944c28299298837edc0a03f755618c23cbc01" -"checksum clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9" -"checksum clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "97276801e127ffb46b66ce23f35cc96bd454fa311294bced4bbace7baa8b1d17" -"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -"checksum constant_time_eq 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "995a44c877f9212528ccc74b21a232f66ad69001e40ede5bcee2ac9ef2657120" -"checksum cookie 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "888604f00b3db336d2af898ec3c1d5d0ddf5e6d462220f2ededc33a87ac4bbd5" -"checksum cookie_store 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "46750b3f362965f197996c4448e4a0935e791bf7d6631bfce9ee0af3d24c919c" -"checksum core-foundation 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "25b9e03f145fd4f2bf705e07b900cd41fc636598fe5dc452fd0db1441c3f496d" -"checksum core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e7ca8a5221364ef15ce201e8ed2f609fc312682a8f4e0e3d4aa5879764e0fa3b" -"checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" -"checksum crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3aa945d63861bfe624b55d153a39684da1e8c0bc8fba932f7ee3a3c16cea3ca" -"checksum crossbeam-epoch 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5064ebdbf05ce3cb95e45c8b086f72263f4166b29b97f6baff7ef7fe047b55ac" -"checksum crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7c979cd6cfe72335896575c6b5688da489e420d36a27a0b9eb0c73db574b4a4b" -"checksum crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6" -"checksum crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ce446db02cdc3165b94ae73111e570793400d0794e46125cc4056c81cbb039f4" -"checksum crypto-mac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5" -"checksum ctr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "022cd691704491df67d25d006fe8eca083098253c4d43516c2206479c58c6736" -"checksum curve25519-dalek 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8b7dcd30ba50cdf88b55b033456138b7c0ac4afdc436d82e1b79f370f24cc66d" -"checksum digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" -"checksum dirs 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "13aea89a5c93364a98e9b37b2fa237effbb694d5cfe01c5b70941f7eb087d5e3" -"checksum dirs-sys 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "afa0b23de8fd801745c471deffa6e12d248f962c9fd4b4c33787b055599bde7b" -"checksum dtoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ea57b42383d091c85abcc2706240b94ab2a8fa1fc81c10ff23c4de06e2a90b5e" -"checksum either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3" -"checksum encoding_rs 0.8.20 (registry+https://github.com/rust-lang/crates.io-index)" = "87240518927716f79692c2ed85bfe6e98196d18c6401ec75355760233a7e12e9" -"checksum error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3ab49e9dcb602294bc42f9a7dfc9bc6e936fca4418ea300dbfb84fe16de0b7d9" -"checksum failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "f8273f13c977665c5db7eb2b99ae520952fe5ac831ae4cd09d80c4c7042b5ed9" -"checksum failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0bc225b78e0391e4b8683440bf2e63c2deeeb2ce5189eab46e2b68c6d3725d08" -"checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" -"checksum flate2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6bd6d6f4752952feb71363cffc9ebac9411b75b87c6ab6058c40c8900cf43c0f" -"checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" -"checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -"checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" -"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" -"checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" -"checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" -"checksum futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)" = "1b980f2816d6ee8673b6517b52cb0e808a180efc92e5c19d02cdda79066703ef" -"checksum futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b6f16056ecbb57525ff698bb955162d0cd03bee84e6241c27ff75c08d8ca5987" -"checksum futures-channel 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fcae98ca17d102fd8a3603727b9259fcf7fa4239b603d2142926189bc8999b86" -"checksum futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "79564c427afefab1dfb3298535b21eda083ef7935b4f0ecbfcb121f0aec10866" -"checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" -"checksum futures-executor 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1e274736563f686a837a0568b478bdabfeaec2dca794b5649b04e2fe1627c231" -"checksum futures-io 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e676577d229e70952ab25f3945795ba5b16d63ca794ca9d2c860e5595d20b5ff" -"checksum futures-macro 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "52e7c56c15537adb4f76d0b7a76ad131cb4d2f4f32d3b0bcabcbe1c7c5e87764" -"checksum futures-sink 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "171be33efae63c2d59e6dbba34186fe0d6394fb378069a76dfd80fdcffd43c16" -"checksum futures-task 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0bae52d6b29cf440e298856fec3965ee6fa71b06aa7495178615953fd669e5f9" -"checksum futures-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c0d66274fb76985d3c62c886d1da7ac4c0903a8c9f754e8fe0f35a6a6cc39e76" -"checksum generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" -"checksum getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "e7db7ca94ed4cd01190ceee0d8a8052f08a247aa1b469a7f68c6a3b71afcf407" -"checksum git2 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7c1af51ea8a906616af45a4ce78eacf25860f7a13ae7bf8a814693f0f4037a26" -"checksum h2 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)" = "a5b34c246847f938a410a03c5458c7fee2274436675e76d8b903c08efc29c462" -"checksum hermit-abi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "307c3c9f937f38e3534b1d6447ecf090cafcc9744e4a6360e8b037b2cf5af120" -"checksum hex 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "023b39be39e3a2da62a94feb433e91e8bcd37676fbc8bea371daf52b7a769a3e" -"checksum hkdf 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3fa08a006102488bd9cd5b8013aabe84955cf5ae22e304c2caf655b633aefae3" -"checksum hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5dcb5e64cda4c23119ab41ba960d1e170a774c8e4b9d9e6a9bc18aabf5e59695" -"checksum http 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)" = "d6ccf5ede3a895d8856620237b2f02972c1bbc78d2965ad7fe8838d4a0ed41f0" -"checksum http-body 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6741c859c1b2463a423a1dbce98d418e6c3c3fc720fb0d45528657320920292d" -"checksum httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9" -"checksum hyper 0.12.35 (registry+https://github.com/rust-lang/crates.io-index)" = "9dbe6ed1438e1f8ad955a4701e9a944938e9519f6888d12d8558b645e247d5f6" -"checksum hyper-tls 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3a800d6aa50af4b5850b2b0f659625ce9504df908e9733b635720483be26174f" -"checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" -"checksum idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9" -"checksum indexmap 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712d7b3ea5827fcb9d4fda14bf4da5f136f0db2ae9c8f4bd4e2d1c6fde4e6db2" -"checksum input_buffer 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8e1b822cc844905551931d6f81608ed5f50a79c1078a4e2b4d42dbc7c1eedfbf" -"checksum iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" -"checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f" -"checksum jobserver 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "f2b1d42ef453b30b7387e113da1c83ab1605d90c5b4e0eb8e96d016ed3b8c160" -"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" -"checksum keystream 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c33070833c9ee02266356de0c43f723152bd38bd96ddf52c82b3af10c9138b28" -"checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -"checksum libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)" = "1a31a0627fdf1f6a39ec0dd577e101440b7db22672c0901fe00a9a6fbb5c24e8" -"checksum libgit2-sys 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4870c781f6063efb83150cd22c1ddf6ecf58531419e7570cdcced46970f64a16" -"checksum libz-sys 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "2eb5e43362e38e2bca2fd5f5134c4d4564a23a5c28e9b95411652021a8675ebe" -"checksum lioness 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4ae926706ba42c425c9457121178330d75e273df2e82e28b758faf3de3a9acb9" -"checksum lock_api 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e57b3997725d2b60dbec1297f6c2e2957cc383db1cebd6be812163f969c7d586" -"checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" -"checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" -"checksum maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" -"checksum memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "88579771288728879b57485cc7d6b07d648c9f0141eb955f8ab7f9d45394468e" -"checksum memoffset 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "75189eb85871ea5c2e2c15abbdd541185f63b408415e5051f5cac122d8c774b9" -"checksum mime 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "dd1d63acd1b78403cc0c325605908475dd9b9a3acbf65ed8bcab97e27014afcf" -"checksum mime_guess 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1a0ed03949aef72dbdf3116a383d7b38b4768e6f960528cd6a6044aa9ed68599" -"checksum miniz_oxide 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6f3f74f726ae935c3f514300cc6773a0c9492abc5e972d42ba0c0ebb88757625" -"checksum mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)" = "302dec22bcf6bae6dfb69c647187f4b4d0fb6f535521f7bc022430ce8e12008f" -"checksum mio-named-pipes 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "f5e374eff525ce1c5b7687c4cef63943e7686524a387933ad27ca7ec43779cb3" -"checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125" -"checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" -"checksum miow 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "396aa0f2003d7df8395cb93e09871561ccc3e785f0acb369170e8cc74ddf9226" -"checksum native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4b2df1a4c22fd44a62147fd8f13dd0f95c9d8ca7b2610299b2a2f9cf8964274e" -"checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" -"checksum num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "b85e541ef8255f6cf42bbfe4ef361305c6c135d10919ecc26126c4e5ae94bc09" -"checksum num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c81ffc11c212fa327657cb19dd85eb7419e163b5b076bede2bdb5c974c07e4" -"checksum num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)" = "76dac5ed2a876980778b8b85f75a71b6cbf0db0b1232ee12f826bccb00d09d72" -"checksum opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" -"checksum openssl 0.10.26 (registry+https://github.com/rust-lang/crates.io-index)" = "3a3cc5799d98e1088141b8e01ff760112bbd9f19d850c124500566ca6901a585" -"checksum openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" -"checksum openssl-sys 0.9.53 (registry+https://github.com/rust-lang/crates.io-index)" = "465d16ae7fc0e313318f7de5cecf57b2fbe7511fd213978b457e1c96ff46736f" -"checksum parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252" -"checksum parking_lot_core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b876b1b9e7ac6e1a74a6da34d25c42e17e8862aa409cbbbdcfc8d86c6f3bc62b" -"checksum pem 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a1581760c757a756a41f0ee3ff01256227bdf64cb752839779b95ffb01c59793" -"checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" -"checksum percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" -"checksum pin-project 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "94b90146c7216e4cb534069fb91366de4ea0ea353105ee45ed297e2d1619e469" -"checksum pin-project-internal 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "44ca92f893f0656d3cba8158dd0f2b99b94de256a4a54e870bd6922fcc6c8355" -"checksum pin-project-lite 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f0af6cbca0e6e3ce8692ee19fb8d734b641899e07b68eb73e9bbbd32f1703991" -"checksum pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5894c618ce612a3fa23881b152b608bafb8c56cfc22f434a3ba3120b40f7b587" -"checksum pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)" = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677" -"checksum ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b" -"checksum proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)" = "ecd45702f76d6d3c75a80564378ae228a85f0b59d2f3ed43c91b4a69eb2ebfc5" -"checksum proc-macro-nested 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "369a6ed065f249a159e06c45752c780bda2fb53c995718f9e484d08daa9eb42e" -"checksum proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9c9e470a8dc4aeae2dee2f335e8f533e2d4b347e1434e5671afc49b054592f27" -"checksum publicsuffix 1.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3bbaa49075179162b49acac1c6aa45fb4dafb5f13cf6794276d77bc7fd95757b" -"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe" -"checksum rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" -"checksum rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3ae1b169243eaf61759b8475a998f0a385e42042370f3a7dbaf35246eacc8412" -"checksum rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" -"checksum rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "03a2a90da8c7523f554344f921aa97283eadf6ac484a6d2a7d0212fa7f8d6853" -"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" -"checksum rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" -"checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -"checksum rand_distr 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "96977acbdd3a6576fb1d27391900035bf3863d4a16422973a409b488cf29ffb2" -"checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" -"checksum rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -"checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" -"checksum rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" -"checksum rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" -"checksum rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" -"checksum rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" -"checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" -"checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" -"checksum redox_users 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4ecedbca3bf205f8d8f5c2b44d83cd0690e39ee84b951ed649e9f1841132b66d" -"checksum regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dc220bd33bdce8f093101afe22a037b8eb0e5af33592e6a9caafff0d4cb81cbd" -"checksum regex-syntax 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "11a7e20d1cce64ef2fed88b66d347f88bd9babb82845b2b858f3edbf59a4f716" -"checksum remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e" -"checksum reqwest 0.9.24 (registry+https://github.com/rust-lang/crates.io-index)" = "f88643aea3c1343c804950d7bf983bd2067f5ab59db6d613a08e05572f2714ab" -"checksum rust-argon2 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4ca4eaef519b494d1f2848fc602d18816fed808a981aedf4f1f00ceb7c9d32cf" -"checksum rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783" -"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -"checksum ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfa8506c1de11c9c4e4c38863ccbe02a305c8188e85a05a784c9e11e1c3910c8" -"checksum schannel 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "87f550b06b6cba9c8b8be3ee73f391990116bf527450d2556e9b9ce263b9a021" -"checksum scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d" -"checksum security-framework 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8ef2429d7cefe5fd28bd1d2ed41c944547d4ff84776f5935b456da44593a16df" -"checksum security-framework-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e31493fc37615debb8c5090a7aeb4a9730bc61e77ab10b9af59f1a202284f895" -"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" -"checksum serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "414115f25f818d7dfccec8ee535d76949ae78584fc4f79a6f45a904bf8ab4449" -"checksum serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "128f9e303a5a29922045a830221b8f78ec74a5f544944f3d5984f8ec3895ef64" -"checksum serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)" = "48c575e0cc52bdd09b47f330f646cf59afc586e9c4e3ccd6fc1f625b8ea1dad7" -"checksum serde_urlencoded 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "642dd69105886af2efd227f75a520ec9b44a820d65bc133a9131f7d229fd165a" -"checksum sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "23962131a91661d643c98940b20fcaffe62d776a823247be80a48fcb8b6fce68" -"checksum sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b4d8bfd0e469f417657573d8451fb33d16cfe0989359b93baf3a1ffc639543d" -"checksum signal-hook-registry 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94f478ede9f64724c5d173d7bb56099ec3e2d9fc2774aac65d34b8b890405f41" -"checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" -"checksum smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "f7b0758c52e15a8b5e3691eae6cc559f08eee9406e548a4477ba4e67770a82b6" -"checksum smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4ecf3b85f68e8abaa7555aa5abdb1153079387e60b718283d732f03897fcfc86" -"checksum socket2 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)" = "e8b74de517221a2cb01a53349cf54182acdc31a074727d3079068448c0676d85" -"checksum stream-cipher 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8131256a5896cabcf5eb04f4d6dacbe1aefda854b0d9896e09cb58829ec5638c" -"checksum string 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d24114bfcceb867ca7f71a0d3fe45d45619ec47a6fbfa98cb14e14250bfa5d6d" -"checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" -"checksum subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" -"checksum subtle 2.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7c65d530b10ccaeac294f349038a597e435b18fb456aadd0840a623f83b9e941" -"checksum syn 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)" = "661641ea2aa15845cddeb97dad000d22070bb5c1fb456b96c1cba883ec691e92" -"checksum synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "67656ea1dc1b41b1451851562ea232ec2e5a80242139f7e679ceccfb5d61f545" -"checksum tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" -"checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" -"checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" -"checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" -"checksum tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)" = "5a09c0b5bb588872ab2f09afa13ee6e9dac11e10a0ec9e8e3ba39a5a5d530af6" -"checksum tokio 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "beeef686ef92a222de07e089f455d9f8478bbba9651718f9e4b276babe829082" -"checksum tokio-buf 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8fb220f46c53859a4b7ec083e41dec9778ff0b1851c0942b211edb89e0ccdc46" -"checksum tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "d16217cad7f1b840c5a97dfb3c43b0c871fef423a6e8d2118c604e843662a443" -"checksum tokio-executor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "ca6df436c42b0c3330a82d855d2ef017cd793090ad550a6bc2184f4b933532ab" -"checksum tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "5090db468dad16e1a7a54c8c67280c5e4b544f3d3e018f0b913b400261f85926" -"checksum tokio-macros 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d5795a71419535c6dcecc9b6ca95bdd3c2d6142f7e8343d7beb9923f129aa87e" -"checksum tokio-reactor 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "6732fe6b53c8d11178dcb77ac6d9682af27fc6d4cb87789449152e5377377146" -"checksum tokio-sync 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "d06554cce1ae4a50f42fba8023918afa931413aded705b560e29600ccf7c6d76" -"checksum tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1d14b10654be682ac43efee27401d792507e30fd8d26389e1da3b185de2e4119" -"checksum tokio-threadpool 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "f0c32ffea4827978e9aa392d2f743d973c1dfa3730a2ed3f22ce1e6984da848c" -"checksum tokio-timer 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)" = "1739638e364e558128461fc1ad84d997702c8e31c2e6b18fb99842268199e827" -"checksum tokio-tungstenite 0.10.0 (git+https://github.com/dbcfd/tokio-tungstenite?rev=6dc2018cbfe8fe7ddd75ff977343086503135b38)" = "<none>" -"checksum toml 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "01d1404644c8b12b16bfcffa4322403a91a451584daaaa7c28d3152e6cbc98cf" -"checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" -"checksum try_from 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "283d3b89e1368717881a9d51dad843cc435380d8109c9e47d38780a324698d8b" -"checksum tungstenite 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8a0c2bd5aeb7dcd2bb32e472c8872759308495e5eccc942e929a513cd8d36110" -"checksum typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6d2783fe2d6b8c1101136184eb41be8b1ad379e4657050b8aaff0c79ee7575f9" -"checksum unicase 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" -"checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" -"checksum unicode-normalization 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "b561e267b2326bb4cebfc0ef9e68355c7abe6c6f522aeac2f5bf95d56c59bdcf" -"checksum unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479" -"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" -"checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" -"checksum url 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "75b414f6c464c879d7f9babf951f23bc3743fb7313c081b2e6ca719067ea9d61" -"checksum utf-8 0.7.5 (registry+https://github.com/rust-lang/crates.io-index)" = "05e42f7c18b8f902290b009cde6d651262f956c98bc51bca4cd1d511c9cd85c7" -"checksum uuid 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "90dbc611eb48397705a6b0f6e917da23ae517e4d127123d2cf7674206627d32a" -"checksum vcpkg 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3fc439f2794e98976c88a2a2dafce96b930fe8010b0a256b3c2199a773933168" -"checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" -"checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" -"checksum version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "078775d0255232fb988e6fccf26ddc9d1ac274299aaedcedce21c6f72cc533ce" -"checksum want 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b6395efa4784b027708f7451087e647ec73cc74f5d9bc2e418404248d679a230" -"checksum wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b89c3ce4ce14bdc6fb6beaf9ec7928ca331de5df7e5ea278375642a2f478570d" -"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" -"checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" -"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" -"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" -"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -"checksum winreg 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b2986deb581c4fe11b621998a5e53361efe6b48a151178d0cd9eeffa4dc6acc9" -"checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" diff --git a/mixnode/Cargo.toml b/mixnode/Cargo.toml index 3cc19b0b270..d65fa0cad03 100644 --- a/mixnode/Cargo.toml +++ b/mixnode/Cargo.toml @@ -1,7 +1,6 @@ [package] -build = "build.rs" name = "nym-mixnode" -version = "0.8.1" +version = "0.9.0" authors = ["Dave Hrycyszyn <futurechimp@users.noreply.github.com>", "Jędrzej Stuczyński <andrew@nymtech.net>"] edition = "2018" @@ -14,6 +13,7 @@ curve25519-dalek = "2.0.0" dirs = "2.0.2" dotenv = "0.15.0" futures = "0.3.1" +humantime-serde = "1.0.1" log = "0.4" pretty_env_logger = "0.3" serde = { version = "1.0.104", features = ["derive"] } @@ -21,16 +21,13 @@ tokio = { version = "0.2", features = ["full"] } tokio-util = { version = "0.3.1", features = ["codec"] } ## internal -config = {path = "../common/config"} -crypto = {path = "../common/crypto"} -directory-client = { path = "../common/client-libs/directory-client" } +config = { path = "../common/config" } +crypto = { path = "../common/crypto" } +metrics-client = { path = "../common/client-libs/metrics-client" } mixnet-client = { path = "../common/client-libs/mixnet-client" } -nymsphinx = {path = "../common/nymsphinx" } -pemstore = {path = "../common/pemstore"} -topology = {path = "../common/topology"} - -[build-dependencies] -built = "0.4.3" - -[dev-dependencies] -tempfile = "3.1.0" \ No newline at end of file +mixnode-common = { path = "../common/mixnode-common" } +nymsphinx = { path = "../common/nymsphinx" } +pemstore = { path = "../common/pemstore" } +topology = { path = "../common/topology" } +validator-client = { path = "../common/client-libs/validator-client" } +version-checker = { path = "../common/version-checker" } diff --git a/mixnode/build.rs b/mixnode/build.rs deleted file mode 100644 index 56d753472cf..00000000000 --- a/mixnode/build.rs +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -use built; - -fn main() { - built::write_built_file().expect("Failed to acquire build-time information"); -} diff --git a/mixnode/src/built_info.rs b/mixnode/src/built_info.rs deleted file mode 100644 index 38b46d59e64..00000000000 --- a/mixnode/src/built_info.rs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -// The file has been placed there by the build script. -include!(concat!(env!("OUT_DIR"), "/built.rs")); diff --git a/mixnode/src/commands/init.rs b/mixnode/src/commands/init.rs index 09421e8c170..e178ee8f91a 100644 --- a/mixnode/src/commands/init.rs +++ b/mixnode/src/commands/init.rs @@ -14,13 +14,12 @@ use crate::commands::override_config; use crate::config::persistence::pathfinder::MixNodePathfinder; +use crate::config::Config; use clap::{App, Arg, ArgMatches}; use config::NymConfig; -use crypto::asymmetric::encryption; -use directory_client::DirectoryClient; +use crypto::asymmetric::{encryption, identity}; use log::*; use nymsphinx::params::DEFAULT_NUM_MIX_HOPS; -use std::convert::TryInto; use tokio::runtime::Runtime; use topology::NymTopology; @@ -72,22 +71,26 @@ pub fn command_args<'a, 'b>() -> clap::App<'a, 'b> { .takes_value(true), ) .arg( - Arg::with_name("directory") - .long("directory") - .help("Address of the directory server the node is sending presence and metrics to") + Arg::with_name("validator") + .long("validator") + .help("REST endpoint of the validator the node is registering presence with") + .takes_value(true), + ) + .arg( + Arg::with_name("metrics-server") + .long("metrics-server") + .help("Server to which the node is sending all metrics data") + .takes_value(true), + ) + .arg( + Arg::with_name("incentives-address") + .long("incentives-address") + .help("Optional, if participating in the incentives program, payment address") .takes_value(true), ) } -fn show_incentives_url() { - println!("\n##### NOTE #####"); - println!( - "\nIf you would like to join our testnet incentives program, please visit https://nymtech.net/incentives" - ); - println!("\n\n"); -} - -async fn choose_layer(matches: &ArgMatches<'_>, directory_server: String) -> u64 { +async fn choose_layer(matches: &ArgMatches<'_>, validator_server: String) -> u64 { let max_layer = DEFAULT_NUM_MIX_HOPS; if let Some(layer) = matches.value_of("layer").map(|layer| layer.parse::<u64>()) { if let Err(err) = layer { @@ -100,14 +103,13 @@ async fn choose_layer(matches: &ArgMatches<'_>, directory_server: String) -> u64 } } - let directory_client_config = directory_client::Config::new(directory_server); - let directory_client = directory_client::Client::new(directory_client_config); - let topology: NymTopology = directory_client + let validator_client_config = validator_client::Config::new(validator_server); + let validator_client = validator_client::Client::new(validator_client_config); + let topology: NymTopology = validator_client .get_topology() .await .expect("failed to obtain initial network topology!") - .try_into() - .unwrap(); + .into(); let mut lowest_layer = (0, usize::max_value()); @@ -134,31 +136,53 @@ pub fn execute(matches: &ArgMatches) { rt.block_on(async { let id = matches.value_of("id").unwrap(); println!("Initialising mixnode {}...", id); - let mut config = crate::config::Config::new(id); + + let already_init = if Config::default_config_file_path(id).exists() { + println!("Mixnode \"{}\" was already initialised before! Config information will be overwritten (but keys will be kept)!", id); + true + } else { + false + }; + + let mut config = Config::new(id); config = override_config(config, matches); - let layer = choose_layer(matches, config.get_presence_directory_server()).await; + let layer = choose_layer(matches, config.get_validator_rest_endpoint()).await; // TODO: I really don't like how we override config and are presumably done with it // only to change it here config = config.with_layer(layer); debug!("Choosing layer {}", config.get_layer()); - let sphinx_keys = encryption::KeyPair::new(); - let pathfinder = MixNodePathfinder::new_from_config(&config); - pemstore::store_keypair( - &sphinx_keys, - &pemstore::KeyPairPath::new( - pathfinder.private_encryption_key().to_owned(), - pathfinder.public_encryption_key().to_owned(), - ), - ) - .expect("Failed to save sphinx keys"); - println!("Saved mixnet sphinx keypair"); + // if node was already initialised, don't generate new keys + if !already_init { + let identity_keys = identity::KeyPair::new(); + let sphinx_keys = encryption::KeyPair::new(); + let pathfinder = MixNodePathfinder::new_from_config(&config); + pemstore::store_keypair( + &identity_keys, + &pemstore::KeyPairPath::new( + pathfinder.private_identity_key().to_owned(), + pathfinder.public_identity_key().to_owned(), + ), + ) + .expect("Failed to save identity keys"); + + pemstore::store_keypair( + &sphinx_keys, + &pemstore::KeyPairPath::new( + pathfinder.private_encryption_key().to_owned(), + pathfinder.public_encryption_key().to_owned(), + ), + ) + .expect("Failed to save sphinx keys"); + + println!("Saved mixnet identity and sphinx keypairs"); + } + let config_save_location = config.get_config_file_save_location(); config .save_to_file(None) .expect("Failed to save the config file"); println!("Saved configuration file to {:?}", config_save_location); println!("Mixnode configuration completed.\n\n\n"); - show_incentives_url(); }) } diff --git a/mixnode/src/commands/mod.rs b/mixnode/src/commands/mod.rs index d22c1215e11..d170240fb31 100644 --- a/mixnode/src/commands/mod.rs +++ b/mixnode/src/commands/mod.rs @@ -16,8 +16,9 @@ use crate::config::Config; use clap::ArgMatches; use nymsphinx::params::DEFAULT_NUM_MIX_HOPS; -pub mod init; -pub mod run; +pub(crate) mod init; +pub(crate) mod run; +pub(crate) mod upgrade; pub(crate) fn override_config(mut config: Config, matches: &ArgMatches) -> Config { let max_layer = DEFAULT_NUM_MIX_HOPS; @@ -46,8 +47,12 @@ pub(crate) fn override_config(mut config: Config, matches: &ArgMatches) -> Confi config = config.with_listening_port(port.unwrap()); } - if let Some(directory) = matches.value_of("directory") { - config = config.with_custom_directory(directory); + if let Some(validator) = matches.value_of("validator") { + config = config.with_custom_validator(validator); + } + + if let Some(metrics_server) = matches.value_of("metrics-server") { + config = config.with_custom_metrics_server(metrics_server); } if let Some(announce_host) = matches.value_of("announce-host") { @@ -72,5 +77,9 @@ pub(crate) fn override_config(mut config: Config, matches: &ArgMatches) -> Confi config = config.with_location(location); } + if let Some(incentives_address) = matches.value_of("incentives-address") { + config = config.with_incentives_address(incentives_address); + } + config } diff --git a/mixnode/src/commands/run.rs b/mixnode/src/commands/run.rs index 54e58b45d9c..b31324f2aeb 100644 --- a/mixnode/src/commands/run.rs +++ b/mixnode/src/commands/run.rs @@ -17,7 +17,9 @@ use crate::config::{persistence::pathfinder::MixNodePathfinder, Config}; use crate::node::MixNode; use clap::{App, Arg, ArgMatches}; use config::NymConfig; -use crypto::asymmetric::encryption; +use crypto::asymmetric::{encryption, identity}; +use log::*; +use version_checker::is_minor_version_compatible; pub fn command_args<'a, 'b>() -> App<'a, 'b> { App::new("run") @@ -36,12 +38,6 @@ pub fn command_args<'a, 'b>() -> App<'a, 'b> { .help("Optional geographical location of this node") .takes_value(true), ) - .arg( - Arg::with_name("config") - .long("config") - .help("Custom path to the nym-mixnode configuration file") - .takes_value(true), - ) .arg( Arg::with_name("layer") .long("layer") @@ -73,9 +69,15 @@ pub fn command_args<'a, 'b>() -> App<'a, 'b> { .takes_value(true), ) .arg( - Arg::with_name("directory") - .long("directory") - .help("Address of the directory server the node is sending presence and metrics to") + Arg::with_name("validator") + .long("validator") + .help("REST endpoint of the validator the node is registering presence with") + .takes_value(true), + ) + .arg( + Arg::with_name("metrics-server") + .long("metrics-server") + .help("Server to which the node is sending all metrics data") .takes_value(true), ) } @@ -95,6 +97,19 @@ fn special_addresses() -> Vec<&'static str> { vec!["localhost", "127.0.0.1", "0.0.0.0", "::1", "[::1]"] } +fn load_identity_keys(pathfinder: &MixNodePathfinder) -> identity::KeyPair { + let identity_keypair: identity::KeyPair = pemstore::load_keypair(&pemstore::KeyPairPath::new( + pathfinder.private_identity_key().to_owned(), + pathfinder.public_identity_key().to_owned(), + )) + .expect("Failed to read stored identity key files"); + println!( + "Public identity key: {}\n", + identity_keypair.public_key().to_base58_string() + ); + identity_keypair +} + fn load_sphinx_keys(pathfinder: &MixNodePathfinder) -> encryption::KeyPair { let sphinx_keypair: encryption::KeyPair = pemstore::load_keypair(&pemstore::KeyPairPath::new( pathfinder.private_encryption_key().to_owned(), @@ -108,18 +123,47 @@ fn load_sphinx_keys(pathfinder: &MixNodePathfinder) -> encryption::KeyPair { sphinx_keypair } +// this only checks compatibility between config the binary. It does not take into consideration +// network version. It might do so in the future. +fn version_check(cfg: &Config) -> bool { + let binary_version = env!("CARGO_PKG_VERSION"); + let config_version = cfg.get_version(); + if binary_version != config_version { + warn!("The mixnode binary has different version than what is specified in config file! {} and {}", binary_version, config_version); + if is_minor_version_compatible(binary_version, config_version) { + info!("but they are still semver compatible. However, consider running the `upgrade` command"); + true + } else { + error!("and they are semver incompatible! - please run the `upgrade` command before attempting `run` again"); + false + } + } else { + true + } +} + pub fn execute(matches: &ArgMatches) { let id = matches.value_of("id").unwrap(); println!("Starting mixnode {}...", id); - let mut config = - Config::load_from_file(matches.value_of("config").map(|path| path.into()), Some(id)) - .expect("Failed to load config file"); + let mut config = match Config::load_from_file(id) { + Ok(cfg) => cfg, + Err(err) => { + error!("Failed to load config for {}. Are you sure you have run `init` before? (Error was: {})", id, err); + return; + } + }; config = override_config(config, matches); + if !version_check(&config) { + error!("failed the local version check"); + return; + } + let pathfinder = MixNodePathfinder::new_from_config(&config); + let identity_keypair = load_identity_keys(&pathfinder); let sphinx_keypair = load_sphinx_keys(&pathfinder); let listening_ip_string = config.get_listening_address().ip().to_string(); @@ -129,11 +173,11 @@ pub fn execute(matches: &ArgMatches) { println!( "Directory server [presence]: {}", - config.get_presence_directory_server() + config.get_validator_rest_endpoint() ); println!( "Directory server [metrics]: {}", - config.get_metrics_directory_server() + config.get_metrics_server() ); println!( @@ -145,5 +189,5 @@ pub fn execute(matches: &ArgMatches) { config.get_announce_address() ); - MixNode::new(config, sphinx_keypair).run(); + MixNode::new(config, identity_keypair, sphinx_keypair).run(); } diff --git a/mixnode/src/commands/upgrade.rs b/mixnode/src/commands/upgrade.rs new file mode 100644 index 00000000000..af8856865c4 --- /dev/null +++ b/mixnode/src/commands/upgrade.rs @@ -0,0 +1,228 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +use crate::config::{ + missing_string_value, Config, DEFAULT_METRICS_SERVER, DEFAULT_VALIDATOR_REST_ENDPOINT, +}; +use clap::{App, Arg, ArgMatches}; +use config::NymConfig; +use crypto::asymmetric::identity; +use std::fmt::Display; +use std::path::PathBuf; +use std::process; +use version_checker::{parse_version, Version}; + +fn print_start_upgrade<D1: Display, D2: Display>(from: D1, to: D2) { + println!( + "\n==================\nTrying to upgrade mixnode from {} to {} ...", + from, to + ); +} + +fn print_failed_upgrade<D1: Display, D2: Display>(from: D1, to: D2) { + eprintln!( + "Upgrade from {} to {} failed!\n==================\n", + from, to + ); +} + +fn print_successful_upgrade<D1: Display, D2: Display>(from: D1, to: D2) { + println!( + "Upgrade from {} to {} was successful!\n==================\n", + from, to + ); +} + +fn pre_090_upgrade(from: &str, config: Config, matches: &ArgMatches) -> Config { + // note: current is guaranteed to not have any `build` information suffix (nor pre-release + // information), as this was asserted at the beginning of this command) + // + // upgrade to current (if it's a 0.9.X) or try to upgrade to 0.9.0 as an intermediate + // step in future upgrades (so, for example, we might go 0.8.0 -> 0.9.0 -> 0.10.0) + // this way we don't need to have all the crazy paths on how to upgrade from any version to any + // other version. We just upgrade one minor version at a time. + let current = Version::parse(env!("CARGO_PKG_VERSION")).unwrap(); + let to_version = if current.major == 0 && current.minor == 9 { + current + } else { + Version::new(0, 9, 0) + }; + + print_start_upgrade(&from, &to_version); + + // this is not extracted to separate function as you only have to manually pass version + // if upgrading from pre090 version + let from = match from.strip_prefix("v") { + Some(stripped) => stripped, + None => from, + }; + + let from = match from.strip_prefix("V") { + Some(stripped) => stripped, + None => from, + }; + + let from_version = parse_version(from).expect("invalid version provided!"); + if from_version.major == 0 && from_version.minor < 8 { + // technically this could be implemented, but is there any point in that? + eprintln!("upgrading node from before v0.8.0 is not supported. Please run `init` with new binary instead"); + print_failed_upgrade(&from_version, &to_version); + process::exit(1) + } + + if (from_version.major == 0 && from_version.minor >= 9) || from_version.major >= 1 { + eprintln!("self reported version is higher than 0.9.0. Those releases should have already contained version numbers in config! Make sure you provided correct version"); + print_failed_upgrade(&from_version, &to_version); + process::exit(1) + } + + if config.get_private_identity_key_file() != missing_string_value::<PathBuf>() + || config.get_public_identity_key_file() != missing_string_value::<PathBuf>() + { + eprintln!("existing config seems to have specified identity keys which were only introduced in 0.9.0! Can't perform upgrade."); + print_failed_upgrade(&from_version, &to_version); + process::exit(1); + } + + if config.get_metrics_server() != missing_string_value::<String>() { + eprintln!("existing config seems to have specified new metrics-server endpoint which was only introduced in 0.9.0! Can't perform upgrade."); + print_failed_upgrade(&from_version, &to_version); + process::exit(1); + } + + if config.get_validator_rest_endpoint() != missing_string_value::<String>() { + eprintln!("existing config seems to have specified new validator rest endpoint which was only introduced in 0.9.0! Can't perform upgrade."); + print_failed_upgrade(&from_version, &to_version); + process::exit(1); + } + + let mut upgraded_config = config + .with_custom_version(to_version.to_string().as_ref()) + .with_custom_metrics_server(DEFAULT_METRICS_SERVER) + .with_custom_validator(DEFAULT_VALIDATOR_REST_ENDPOINT); + + if let Some(incentives_address) = matches.value_of("incentives address") { + upgraded_config = upgraded_config.with_incentives_address(incentives_address); + println!("Setting incentives address to {}", incentives_address); + } + + println!("Setting metrics server to {}", DEFAULT_METRICS_SERVER); + println!( + "Setting validator REST endpoint to to {}", + DEFAULT_VALIDATOR_REST_ENDPOINT + ); + + println!("Generating new identity..."); + let identity_keys = identity::KeyPair::new(); + upgraded_config.set_default_identity_keypair_paths(); + + if let Err(err) = pemstore::store_keypair( + &identity_keys, + &pemstore::KeyPairPath::new( + upgraded_config.get_private_identity_key_file(), + upgraded_config.get_public_identity_key_file(), + ), + ) { + eprintln!("Failed to save new identity key files! - {}", err); + process::exit(1); + } + + upgraded_config.save_to_file(None).unwrap_or_else(|err| { + eprintln!("failed to overwrite config file! - {:?}", err); + print_failed_upgrade(&from_version, &to_version); + process::exit(1); + }); + + print_successful_upgrade(from_version, to_version); + + upgraded_config +} + +pub fn command_args<'a, 'b>() -> App<'a, 'b> { + App::new("upgrade").about("Try to upgrade the mixnode") + .arg( + Arg::with_name("id") + .long("id") + .help("Id of the nym-mixnode we want to upgrade") + .takes_value(true) + .required(true), + ) + // the rest of arguments depend on the upgrade path + .arg(Arg::with_name("current version") + .long("current-version") + .help("REQUIRED FOR PRE-0.9.0 UPGRADES. Specifies current version of the configuration file to help to determine a valid upgrade path. Valid formats include '0.8.1', 'v0.8.1' or 'V0.8.1'") + .takes_value(true) + ) + .arg(Arg::with_name("incentives address") + .long("incentives-address") + .help("Optional, if participating in the incentives program, payment address") + .takes_value(true) + ) +} + +pub fn execute(matches: &ArgMatches) { + let current = Version::parse(env!("CARGO_PKG_VERSION")).unwrap(); + + // technically this is not a correct way of checking it as a released version might contain valid build identifiers + // however, we are not using them ourselves at the moment and hence it should be fine. + // if we change our mind, we could easily tweak this code + if current.is_prerelease() || !current.build.is_empty() { + eprintln!( + "Trying to upgrade to a non-released version {}. This is not supported!", + current + ); + process::exit(1) + } + + let id = matches.value_of("id").unwrap(); + + let mut existing_config = Config::load_from_file(id).unwrap_or_else(|err| { + eprintln!("failed to load existing config file! - {:?}", err); + process::exit(1) + }); + + // versions fields were added in 0.9.0 + if existing_config.get_version() == missing_string_value::<String>() { + let self_reported_version = matches.value_of("current version").unwrap_or_else(|| { + eprintln!( + "trying to upgrade from pre v0.9.0 without providing current system version!" + ); + process::exit(1) + }); + + // upgrades up to 0.9.0 + existing_config = pre_090_upgrade(self_reported_version, existing_config, &matches); + } + + let config_version = Version::parse(existing_config.get_version()).unwrap_or_else(|err| { + eprintln!("failed to parse node version! - {:?}", err); + process::exit(1) + }); + + if config_version.is_prerelease() || !config_version.build.is_empty() { + eprintln!( + "Trying to upgrade to from non-released version {}. This is not supported!", + current + ); + process::exit(1) + } + + // here be upgrade path to 0.10.0 and beyond based on version number from config + if config_version == current { + println!("You're using the most recent version!"); + } else { + eprintln!("Cannot perform upgrade from {} to {}. Please let the developers know about this issue!", config_version, current); + process::exit(1) + } +} diff --git a/mixnode/src/config/mod.rs b/mixnode/src/config/mod.rs index e98206bf1e0..8ea27681f2b 100644 --- a/mixnode/src/config/mod.rs +++ b/mixnode/src/config/mod.rs @@ -15,27 +15,33 @@ use crate::config::template::config_template; use config::NymConfig; use log::*; -use serde::{Deserialize, Serialize}; +use serde::{ + de::{self, IntoDeserializer, Visitor}, + Deserialize, Deserializer, Serialize, +}; use std::net::{IpAddr, SocketAddr}; use std::path::PathBuf; use std::str::FromStr; -use std::time; +use std::time::Duration; pub mod persistence; mod template; +pub(crate) const MISSING_VALUE: &str = "MISSING VALUE"; + // 'MIXNODE' const DEFAULT_LISTENING_PORT: u16 = 1789; -const DEFAULT_DIRECTORY_SERVER: &str = "https://directory.nymtech.net"; +pub(crate) const DEFAULT_VALIDATOR_REST_ENDPOINT: &str = + "http://testnet-validator1.nymtech.net:8081"; +pub(crate) const DEFAULT_METRICS_SERVER: &str = "http://testnet-metrics.nymtech.net:8080"; // 'DEBUG' -// where applicable, the below are defined in milliseconds -const DEFAULT_PRESENCE_SENDING_DELAY: u64 = 10_000; // 10s -const DEFAULT_METRICS_SENDING_DELAY: u64 = 5_000; // 10s -const DEFAULT_METRICS_RUNNING_STATS_LOGGING_DELAY: u64 = 60_000; // 1min -const DEFAULT_PACKET_FORWARDING_INITIAL_BACKOFF: u64 = 10_000; // 10s -const DEFAULT_PACKET_FORWARDING_MAXIMUM_BACKOFF: u64 = 300_000; // 5min -const DEFAULT_INITIAL_CONNECTION_TIMEOUT: u64 = 1_500; // 1.5s +const DEFAULT_METRICS_RUNNING_STATS_LOGGING_DELAY: Duration = Duration::from_millis(60_000); +const DEFAULT_PACKET_FORWARDING_INITIAL_BACKOFF: Duration = Duration::from_millis(10_000); +const DEFAULT_PACKET_FORWARDING_MAXIMUM_BACKOFF: Duration = Duration::from_millis(300_000); +const DEFAULT_INITIAL_CONNECTION_TIMEOUT: Duration = Duration::from_millis(1_500); +const DEFAULT_CACHE_ENTRY_TTL: Duration = Duration::from_millis(30_000); +const DEFAULT_MAXIMUM_RECONNECTION_ATTEMPTS: u32 = 20; #[derive(Debug, Default, Deserialize, PartialEq, Serialize)] #[serde(deny_unknown_fields)] @@ -53,10 +59,6 @@ impl NymConfig for Config { config_template() } - fn config_file_name() -> String { - "config.toml".to_string() - } - fn default_root_directory() -> PathBuf { dirs::home_dir() .expect("Failed to evaluate $HOME value") @@ -83,6 +85,69 @@ impl NymConfig for Config { } } +// custom function is defined to deserialize based on whether field contains a pre 0.9.0 +// u64 interpreted as milliseconds or proper duration introduced in 0.9.0 +// +// TODO: when we get to refactoring down the line, this code can just be removed +// and all Duration fields could just have #[serde(with = "humantime_serde")] instead +// reason for that is that we don't expect anyone to be upgrading from pre 0.9.0 when we have, +// for argument sake, 0.11.0 out +fn deserialize_duration<'de, D>(deserializer: D) -> Result<Duration, D::Error> +where + D: Deserializer<'de>, +{ + struct DurationVisitor; + + impl<'de> Visitor<'de> for DurationVisitor { + type Value = Duration; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("u64 or a duration") + } + + fn visit_i64<E>(self, value: i64) -> Result<Duration, E> + where + E: de::Error, + { + self.visit_u64(value as u64) + } + + fn visit_u64<E>(self, value: u64) -> Result<Duration, E> + where + E: de::Error, + { + Ok(Duration::from_millis(Deserialize::deserialize( + value.into_deserializer(), + )?)) + } + + fn visit_str<E>(self, value: &str) -> Result<Duration, E> + where + E: de::Error, + { + humantime_serde::deserialize(value.into_deserializer()) + } + } + + deserializer.deserialize_any(DurationVisitor) +} + +fn deserialize_option_string<'de, D>(deserializer: D) -> Result<Option<String>, D::Error> +where + D: Deserializer<'de>, +{ + let s = String::deserialize(deserializer)?; + if s.is_empty() { + Ok(None) + } else { + Ok(Some(s)) + } +} + +pub fn missing_string_value<T: From<String>>() -> T { + MISSING_VALUE.to_string().into() +} + impl Config { pub fn new<S: Into<String>>(id: S) -> Self { Config::default().with_id(id) @@ -91,6 +156,20 @@ impl Config { // builder methods pub fn with_id<S: Into<String>>(mut self, id: S) -> Self { let id = id.into(); + if self + .mixnode + .private_identity_key_file + .as_os_str() + .is_empty() + { + self.mixnode.private_identity_key_file = + self::MixNode::default_private_identity_key_file(&id); + } + if self.mixnode.public_identity_key_file.as_os_str().is_empty() { + self.mixnode.public_identity_key_file = + self::MixNode::default_public_identity_key_file(&id); + } + if self.mixnode.private_sphinx_key_file.as_os_str().is_empty() { self.mixnode.private_sphinx_key_file = self::MixNode::default_private_sphinx_key_file(&id); @@ -99,6 +178,7 @@ impl Config { self.mixnode.public_sphinx_key_file = self::MixNode::default_public_sphinx_key_file(&id); } + self.mixnode.id = id; self } @@ -113,12 +193,13 @@ impl Config { self } - // if you want to use distinct servers for metrics and presence - // you need to do so in the config.toml file. - pub fn with_custom_directory<S: Into<String>>(mut self, directory_server: S) -> Self { - let directory_server_string = directory_server.into(); - self.mixnode.presence_directory_server = directory_server_string.clone(); - self.mixnode.metrics_directory_server = directory_server_string; + pub fn with_custom_validator<S: Into<String>>(mut self, validator: S) -> Self { + self.mixnode.validator_rest_url = validator.into(); + self + } + + pub fn with_custom_metrics_server<S: Into<String>>(mut self, server: S) -> Self { + self.mixnode.metrics_server_url = server.into(); self } @@ -197,6 +278,16 @@ impl Config { self } + pub fn with_custom_version(mut self, version: &str) -> Self { + self.mixnode.version = version.to_string(); + self + } + + pub fn with_incentives_address<S: Into<String>>(mut self, incentives_address: S) -> Self { + self.mixnode.incentives_address = Some(incentives_address.into()); + self + } + // getters pub fn get_config_file_save_location(&self) -> PathBuf { self.config_directory().join(Self::config_file_name()) @@ -206,32 +297,32 @@ impl Config { self.mixnode.location.clone() } - pub fn get_private_sphinx_key_file(&self) -> PathBuf { - self.mixnode.private_sphinx_key_file.clone() + pub fn get_private_identity_key_file(&self) -> PathBuf { + self.mixnode.private_identity_key_file.clone() } - pub fn get_public_sphinx_key_file(&self) -> PathBuf { - self.mixnode.public_sphinx_key_file.clone() + pub fn get_public_identity_key_file(&self) -> PathBuf { + self.mixnode.public_identity_key_file.clone() } - pub fn get_presence_directory_server(&self) -> String { - self.mixnode.presence_directory_server.clone() + pub fn get_private_sphinx_key_file(&self) -> PathBuf { + self.mixnode.private_sphinx_key_file.clone() } - pub fn get_presence_sending_delay(&self) -> time::Duration { - time::Duration::from_millis(self.debug.presence_sending_delay) + pub fn get_public_sphinx_key_file(&self) -> PathBuf { + self.mixnode.public_sphinx_key_file.clone() } - pub fn get_metrics_directory_server(&self) -> String { - self.mixnode.metrics_directory_server.clone() + pub fn get_validator_rest_endpoint(&self) -> String { + self.mixnode.validator_rest_url.clone() } - pub fn get_metrics_sending_delay(&self) -> time::Duration { - time::Duration::from_millis(self.debug.metrics_sending_delay) + pub fn get_metrics_server(&self) -> String { + self.mixnode.metrics_server_url.clone() } - pub fn get_metrics_running_stats_logging_delay(&self) -> time::Duration { - time::Duration::from_millis(self.debug.metrics_running_stats_logging_delay) + pub fn get_metrics_running_stats_logging_delay(&self) -> Duration { + self.debug.metrics_running_stats_logging_delay } pub fn get_layer(&self) -> u64 { @@ -246,22 +337,49 @@ impl Config { self.mixnode.announce_address.clone() } - pub fn get_packet_forwarding_initial_backoff(&self) -> time::Duration { - time::Duration::from_millis(self.debug.packet_forwarding_initial_backoff) + pub fn get_packet_forwarding_initial_backoff(&self) -> Duration { + self.debug.packet_forwarding_initial_backoff + } + + pub fn get_packet_forwarding_maximum_backoff(&self) -> Duration { + self.debug.packet_forwarding_maximum_backoff + } + + pub fn get_initial_connection_timeout(&self) -> Duration { + self.debug.initial_connection_timeout + } + + pub fn get_packet_forwarding_max_reconnections(&self) -> u32 { + self.debug.maximum_reconnection_attempts + } + + pub fn get_cache_entry_ttl(&self) -> Duration { + self.debug.cache_entry_ttl + } + + pub fn get_version(&self) -> &str { + &self.mixnode.version } - pub fn get_packet_forwarding_maximum_backoff(&self) -> time::Duration { - time::Duration::from_millis(self.debug.packet_forwarding_maximum_backoff) + pub fn get_incentives_address(&self) -> Option<String> { + self.mixnode.incentives_address.clone() } - pub fn get_initial_connection_timeout(&self) -> time::Duration { - time::Duration::from_millis(self.debug.initial_connection_timeout) + // upgrade-specific + pub(crate) fn set_default_identity_keypair_paths(&mut self) { + self.mixnode.private_identity_key_file = + self::MixNode::default_private_identity_key_file(&self.mixnode.id); + self.mixnode.public_identity_key_file = + self::MixNode::default_public_identity_key_file(&self.mixnode.id); } } #[derive(Debug, Deserialize, PartialEq, Serialize)] -#[serde(deny_unknown_fields)] pub struct MixNode { + /// Version of the mixnode for which this configuration was created. + #[serde(default = "missing_string_value")] + version: String, + /// ID specifies the human readable ID of this particular mixnode. id: String, @@ -277,7 +395,7 @@ pub struct MixNode { /// Socket address to which this mixnode will bind to and will be listening for packets. listening_address: SocketAddr, - /// Optional address announced to the directory server for the clients to connect to. + /// Optional address announced to the validator for the clients to connect to. /// It is useful, say, in NAT scenarios or wanting to more easily update actual IP address /// later on by using name resolvable with a DNS query, such as `nymtech.net:8080`. /// Additionally a custom port can be provided, so both `nymtech.net:8080` and `nymtech.net` @@ -285,32 +403,52 @@ pub struct MixNode { /// `listening_address`. announce_address: String, + /// Path to file containing private identity key. + #[serde(default = "missing_string_value")] + private_identity_key_file: PathBuf, + + /// Path to file containing public identity key. + #[serde(default = "missing_string_value")] + public_identity_key_file: PathBuf, + /// Path to file containing private sphinx key. private_sphinx_key_file: PathBuf, /// Path to file containing public sphinx key. public_sphinx_key_file: PathBuf, - // The idea of additional 'directory servers' is to let mixes report their presence - // and metrics to separate places - /// Directory server to which the server will be reporting their presence data. - presence_directory_server: String, + /// Validator server to which the node will be reporting their presence data. + #[serde(default = "missing_string_value")] + validator_rest_url: String, - /// Directory server to which the server will be reporting their metrics data. - metrics_directory_server: String, + /// Metrics server to which the node will be reporting their metrics data. + #[serde(default = "missing_string_value")] + metrics_server_url: String, /// nym_home_directory specifies absolute path to the home nym MixNodes directory. /// It is expected to use default value and hence .toml file should not redefine this field. nym_root_directory: PathBuf, + + /// Optional, if participating in the incentives program, payment address. + #[serde(deserialize_with = "deserialize_option_string", default)] + incentives_address: Option<String>, } impl MixNode { + fn default_private_identity_key_file(id: &str) -> PathBuf { + Config::default_data_directory(id).join("private_identity.pem") + } + + fn default_public_identity_key_file(id: &str) -> PathBuf { + Config::default_data_directory(id).join("public_identity.pem") + } + fn default_private_sphinx_key_file(id: &str) -> PathBuf { - Config::default_data_directory(Some(id)).join("private_sphinx.pem") + Config::default_data_directory(id).join("private_sphinx.pem") } fn default_public_sphinx_key_file(id: &str) -> PathBuf { - Config::default_data_directory(Some(id)).join("public_sphinx.pem") + Config::default_data_directory(id).join("public_sphinx.pem") } fn default_location() -> String { @@ -321,6 +459,7 @@ impl MixNode { impl Default for MixNode { fn default() -> Self { MixNode { + version: env!("CARGO_PKG_VERSION").to_string(), id: "".to_string(), location: Self::default_location(), layer: 0, @@ -328,11 +467,14 @@ impl Default for MixNode { .parse() .unwrap(), announce_address: format!("127.0.0.1:{}", DEFAULT_LISTENING_PORT), + private_identity_key_file: Default::default(), + public_identity_key_file: Default::default(), private_sphinx_key_file: Default::default(), public_sphinx_key_file: Default::default(), - presence_directory_server: DEFAULT_DIRECTORY_SERVER.to_string(), - metrics_directory_server: DEFAULT_DIRECTORY_SERVER.to_string(), + validator_rest_url: DEFAULT_VALIDATOR_REST_ENDPOINT.to_string(), + metrics_server_url: DEFAULT_METRICS_SERVER.to_string(), nym_root_directory: Config::default_root_directory(), + incentives_address: None, } } } @@ -350,62 +492,57 @@ impl Default for Logging { #[derive(Debug, Deserialize, PartialEq, Serialize)] #[serde(default, deny_unknown_fields)] pub struct Debug { - /// Delay between each subsequent presence data being sent. - /// The provided value is interpreted as milliseconds. - presence_sending_delay: u64, - - /// Delay between each subsequent metrics data being sent. - /// The provided value is interpreted as milliseconds. - metrics_sending_delay: u64, - /// Delay between each subsequent running metrics statistics being logged. - /// The provided value is interpreted as milliseconds. - metrics_running_stats_logging_delay: u64, + #[serde( + deserialize_with = "deserialize_duration", + serialize_with = "humantime_serde::serialize" + )] + metrics_running_stats_logging_delay: Duration, /// Initial value of an exponential backoff to reconnect to dropped TCP connection when /// forwarding sphinx packets. - /// The provided value is interpreted as milliseconds. - packet_forwarding_initial_backoff: u64, + #[serde( + deserialize_with = "deserialize_duration", + serialize_with = "humantime_serde::serialize" + )] + packet_forwarding_initial_backoff: Duration, /// Maximum value of an exponential backoff to reconnect to dropped TCP connection when /// forwarding sphinx packets. - /// The provided value is interpreted as milliseconds. - packet_forwarding_maximum_backoff: u64, + #[serde( + deserialize_with = "deserialize_duration", + serialize_with = "humantime_serde::serialize" + )] + packet_forwarding_maximum_backoff: Duration, /// Timeout for establishing initial connection when trying to forward a sphinx packet. - /// The provider value is interpreted as milliseconds. - initial_connection_timeout: u64, + #[serde( + deserialize_with = "deserialize_duration", + serialize_with = "humantime_serde::serialize" + )] + initial_connection_timeout: Duration, + + /// Maximum number of retries node is going to attempt to re-establish existing connection + /// to another node when forwarding sphinx packets. + maximum_reconnection_attempts: u32, + + /// Duration for which a cached vpn processing result is going to get stored for. + #[serde( + deserialize_with = "deserialize_duration", + serialize_with = "humantime_serde::serialize" + )] + cache_entry_ttl: Duration, } impl Default for Debug { fn default() -> Self { Debug { - presence_sending_delay: DEFAULT_PRESENCE_SENDING_DELAY, - metrics_sending_delay: DEFAULT_METRICS_SENDING_DELAY, metrics_running_stats_logging_delay: DEFAULT_METRICS_RUNNING_STATS_LOGGING_DELAY, packet_forwarding_initial_backoff: DEFAULT_PACKET_FORWARDING_INITIAL_BACKOFF, packet_forwarding_maximum_backoff: DEFAULT_PACKET_FORWARDING_MAXIMUM_BACKOFF, initial_connection_timeout: DEFAULT_INITIAL_CONNECTION_TIMEOUT, + maximum_reconnection_attempts: DEFAULT_MAXIMUM_RECONNECTION_ATTEMPTS, + cache_entry_ttl: DEFAULT_CACHE_ENTRY_TTL, } } } - -#[cfg(test)] -mod mixnode_config { - use super::*; - - #[test] - fn after_saving_default_config_the_loaded_one_is_identical() { - // need to figure out how to do something similar but without touching the disk - // or the file system at all... - let temp_location = tempfile::tempdir().unwrap().path().join("config.toml"); - let default_config = Config::default().with_id("foomp".to_string()); - default_config - .save_to_file(Some(temp_location.clone())) - .unwrap(); - - let loaded_config = Config::load_from_file(Some(temp_location), None).unwrap(); - - assert_eq!(default_config, loaded_config); - } -} diff --git a/mixnode/src/config/persistence/pathfinder.rs b/mixnode/src/config/persistence/pathfinder.rs index 3d944c952f3..ba9214b7a88 100644 --- a/mixnode/src/config/persistence/pathfinder.rs +++ b/mixnode/src/config/persistence/pathfinder.rs @@ -17,7 +17,8 @@ use std::path::{Path, PathBuf}; #[derive(Debug)] pub struct MixNodePathfinder { - config_dir: PathBuf, + identity_private_key: PathBuf, + identity_public_key: PathBuf, private_sphinx_key: PathBuf, public_sphinx_key: PathBuf, } @@ -25,12 +26,21 @@ pub struct MixNodePathfinder { impl MixNodePathfinder { pub fn new_from_config(config: &Config) -> Self { MixNodePathfinder { - config_dir: config.get_config_file_save_location(), + identity_private_key: config.get_private_identity_key_file(), + identity_public_key: config.get_public_identity_key_file(), private_sphinx_key: config.get_private_sphinx_key_file(), public_sphinx_key: config.get_public_sphinx_key_file(), } } + pub fn private_identity_key(&self) -> &Path { + &self.identity_private_key + } + + pub fn public_identity_key(&self) -> &Path { + &self.identity_public_key + } + pub fn private_encryption_key(&self) -> &Path { &self.private_sphinx_key } diff --git a/mixnode/src/config/template.rs b/mixnode/src/config/template.rs index 3dbce83b0b1..15b480a1690 100644 --- a/mixnode/src/config/template.rs +++ b/mixnode/src/config/template.rs @@ -24,6 +24,9 @@ pub(crate) fn config_template() -> &'static str { ##### main base mixnode config options ##### [mixnode] +# Version of the mixnode for which this configuration was created. +version = '{{ mixnode.version }}' + # Human readable ID of this particular mixnode. id = '{{ mixnode.id }}' @@ -39,12 +42,21 @@ layer = {{ mixnode.layer }} # Socket address to which this mixnode will bind to and will be listening for packets. listening_address = '{{ mixnode.listening_address }}' +# Path to file containing private identity key. +private_identity_key_file = '{{ mixnode.private_identity_key_file }}' + +# Path to file containing public identity key. +public_identity_key_file = '{{ mixnode.public_identity_key_file }}' + # Path to file containing private identity key. private_sphinx_key_file = '{{ mixnode.private_sphinx_key_file }}' # Path to file containing public sphinx key. public_sphinx_key_file = '{{ mixnode.public_sphinx_key_file }}' +# Optional, if participating in the incentives program, payment address. +incentives_address = '{{ mixnode.incentives_address }}' + ##### additional mixnode config options ##### # Optional address announced to the directory server for the clients to connect to. @@ -55,11 +67,11 @@ public_sphinx_key_file = '{{ mixnode.public_sphinx_key_file }}' # `listening_address`. announce_address = '{{ mixnode.announce_address }}' -# Directory server to which the server will be reporting their presence data. -presence_directory_server = '{{ mixnode.presence_directory_server }}' +# Validator server to which the node will be reporting their presence data. +validator_rest_url = '{{ mixnode.validator_rest_url }}' -# Directory server to which the server will be reporting their metrics data. -metrics_directory_server = '{{ mixnode.metrics_directory_server }}' +# Metrics server to which the node will be reporting their metrics data. +metrics_server_url = '{{ mixnode.metrics_server_url }}' ##### advanced configuration options ##### diff --git a/mixnode/src/main.rs b/mixnode/src/main.rs index 1907aaa6415..31373f6fe71 100644 --- a/mixnode/src/main.rs +++ b/mixnode/src/main.rs @@ -14,7 +14,6 @@ use clap::{App, ArgMatches}; -pub mod built_info; mod commands; mod config; mod node; @@ -25,11 +24,12 @@ fn main() { println!("{}", banner()); let arg_matches = App::new("Nym Mixnode") - .version(built_info::PKG_VERSION) + .version(env!("CARGO_PKG_VERSION")) .author("Nymtech") .about("Implementation of the Loopix-based Mixnode") .subcommand(commands::init::command_args()) .subcommand(commands::run::command_args()) + .subcommand(commands::upgrade::command_args()) .get_matches(); execute(arg_matches); @@ -39,6 +39,7 @@ fn execute(matches: ArgMatches) { match matches.subcommand() { ("init", Some(m)) => commands::init::execute(m), ("run", Some(m)) => commands::run::execute(m), + ("upgrade", Some(m)) => commands::upgrade::execute(m), _ => println!("{}", usage()), } } @@ -60,7 +61,7 @@ fn banner() -> String { (mixnode - version {:}) "#, - built_info::PKG_VERSION + env!("CARGO_PKG_VERSION") ) } diff --git a/mixnode/src/node/listener.rs b/mixnode/src/node/listener.rs deleted file mode 100644 index 7fec60304ea..00000000000 --- a/mixnode/src/node/listener.rs +++ /dev/null @@ -1,112 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -use crate::node::packet_processing::{MixProcessingResult, PacketProcessor}; -use futures::channel::mpsc; -use log::*; -use nymsphinx::framing::SphinxCodec; -use nymsphinx::{addressing::nodes::NymNodeRoutingAddress, SphinxPacket}; -use std::io; -use std::net::SocketAddr; -use tokio::runtime::Handle; -use tokio::stream::StreamExt; -use tokio::task::JoinHandle; -use tokio_util::codec::Framed; - -async fn process_received_packet( - sphinx_packet: SphinxPacket, - packet_processor: PacketProcessor, - forwarding_channel: mpsc::UnboundedSender<(NymNodeRoutingAddress, SphinxPacket)>, -) { - // all processing incl. delay was done, the only thing left is to forward it - match packet_processor.process_sphinx_packet(sphinx_packet).await { - Err(e) => debug!("We failed to process received sphinx packet - {:?}", e), - Ok(res) => match res { - MixProcessingResult::ForwardHop(hop_address, forward_packet) => { - // send our data to tcp client for forwarding. If forwarding fails, then it fails, - // it's not like we can do anything about it - // - // in unbounded_send() failed it means that the receiver channel was disconnected - // and hence something weird must have happened without a way of recovering - forwarding_channel - .unbounded_send((hop_address, forward_packet)) - .unwrap(); - packet_processor.report_sent(hop_address); - } - MixProcessingResult::LoopMessage => { - warn!("Somehow processed a loop cover message that we haven't implemented yet!") - } - }, - } -} - -async fn process_socket_connection( - socket: tokio::net::TcpStream, - packet_processor: PacketProcessor, - forwarding_channel: mpsc::UnboundedSender<(NymNodeRoutingAddress, SphinxPacket)>, -) { - let mut framed = Framed::new(socket, SphinxCodec); - while let Some(sphinx_packet) = framed.next().await { - match sphinx_packet { - Ok(sphinx_packet) => { - // we *really* need a worker pool here, because if we receive too many packets, - // we will spawn too many tasks and starve CPU due to context switching. - // (because presumably tokio has some concept of context switching in its - // scheduler) - tokio::spawn(process_received_packet( - sphinx_packet, - packet_processor.clone(), - forwarding_channel.clone(), - )); - } - Err(err) => { - error!( - "The socket connection got corrupted with error: {:?}. Closing the socket", - err - ); - return; - } - } - } - info!( - "Closing connection from {:?}", - framed.into_inner().peer_addr() - ); -} - -pub(crate) fn run_socket_listener( - handle: &Handle, - addr: SocketAddr, - packet_processor: PacketProcessor, - forwarding_channel: mpsc::UnboundedSender<(NymNodeRoutingAddress, SphinxPacket)>, -) -> JoinHandle<io::Result<()>> { - let handle_clone = handle.clone(); - handle.spawn(async move { - let mut listener = tokio::net::TcpListener::bind(addr).await?; - loop { - let (socket, _) = listener.accept().await?; - - let thread_packet_processor = packet_processor.clone(); - let forwarding_channel_clone = forwarding_channel.clone(); - handle_clone.spawn(async move { - process_socket_connection( - socket, - thread_packet_processor, - forwarding_channel_clone, - ) - .await; - }); - } - }) -} diff --git a/mixnode/src/node/listener/connection_handler/mod.rs b/mixnode/src/node/listener/connection_handler/mod.rs new file mode 100644 index 00000000000..6f931f52bc2 --- /dev/null +++ b/mixnode/src/node/listener/connection_handler/mod.rs @@ -0,0 +1,123 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +use crate::node::listener::connection_handler::packet_processing::{ + MixProcessingResult, PacketProcessor, +}; +use log::*; +use mixnet_client::forwarder::MixForwardingSender; +use nymsphinx::forwarding::packet::MixPacket; +use nymsphinx::framing::codec::SphinxCodec; +use nymsphinx::framing::packet::FramedSphinxPacket; +use std::net::SocketAddr; +use std::sync::Arc; +use tokio::net::TcpStream; +use tokio::stream::StreamExt; +use tokio_util::codec::Framed; + +pub(crate) mod packet_processing; + +pub(crate) struct ConnectionHandler { + packet_processor: PacketProcessor, + forwarding_channel: MixForwardingSender, +} + +impl ConnectionHandler { + pub(crate) fn new( + packet_processor: PacketProcessor, + forwarding_channel: MixForwardingSender, + ) -> Self { + ConnectionHandler { + packet_processor, + forwarding_channel, + } + } + + pub(crate) fn clone_without_cache(&self) -> Self { + ConnectionHandler { + packet_processor: self.packet_processor.clone_without_cache(), + forwarding_channel: self.forwarding_channel.clone(), + } + } + + fn forward_packet(&self, mix_packet: MixPacket) { + let routing_address = mix_packet.next_hop(); + // send our data to tcp client for forwarding. If forwarding fails, then it fails, + // it's not like we can do anything about it + // + // in unbounded_send() failed it means that the receiver channel was disconnected + // and hence something weird must have happened without a way of recovering + self.forwarding_channel.unbounded_send(mix_packet).unwrap(); + self.packet_processor.report_sent(routing_address); + } + + async fn handle_received_packet(self: Arc<Self>, framed_sphinx_packet: FramedSphinxPacket) { + // + // TODO: here be replay attack detection - it will require similar key cache to the one in + // packet processor for vpn packets, + // question: can it also be per connection vs global? + // + + // all processing including delaying, key caching, etc. was done, the only thing left is to forward it + match self + .packet_processor + .process_received(framed_sphinx_packet) + .await + { + Err(e) => debug!("We failed to process received sphinx packet - {:?}", e), + Ok(res) => match res { + MixProcessingResult::ForwardHop(forward_packet) => { + self.forward_packet(forward_packet) + } + MixProcessingResult::FinalHop(..) => { + warn!("Somehow processed a loop cover message that we haven't implemented yet!") + } + }, + } + } + + pub(crate) async fn handle_connection(self, conn: TcpStream, remote: SocketAddr) { + debug!("Starting connection handler for {:?}", remote); + let this = Arc::new(self); + let mut framed_conn = Framed::new(conn, SphinxCodec); + while let Some(framed_sphinx_packet) = framed_conn.next().await { + match framed_sphinx_packet { + Ok(framed_sphinx_packet) => { + // TODO: benchmark spawning tokio task with full processing vs just processing it + // synchronously (without delaying inside of course, + // delay could be moved to a per-connection DelayQueue. The delay queue future + // could automatically just forward packet that is done being delayed) + // under higher load in single and multi-threaded situation. + // + // My gut feeling is saying that we might get some nice performance boost + // if we introduced the change + let this = Arc::clone(&this); + tokio::spawn(this.handle_received_packet(framed_sphinx_packet)); + } + Err(err) => { + error!( + "The socket connection got corrupted with error: {:?}. Closing the socket", + err + ); + return; + } + } + } + + info!( + "Closing connection from {:?}", + framed_conn.into_inner().peer_addr() + ); + } +} diff --git a/mixnode/src/node/listener/connection_handler/packet_processing.rs b/mixnode/src/node/listener/connection_handler/packet_processing.rs new file mode 100644 index 00000000000..ab006a3b35a --- /dev/null +++ b/mixnode/src/node/listener/connection_handler/packet_processing.rs @@ -0,0 +1,60 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +use crate::node::metrics; +use crypto::asymmetric::encryption; +use mixnode_common::cached_packet_processor::error::MixProcessingError; +use mixnode_common::cached_packet_processor::processor::CachedPacketProcessor; +pub use mixnode_common::cached_packet_processor::processor::MixProcessingResult; +use nymsphinx::addressing::nodes::NymNodeRoutingAddress; +use nymsphinx::framing::packet::FramedSphinxPacket; +use tokio::time::Duration; + +// PacketProcessor contains all data required to correctly unwrap and forward sphinx packets +pub struct PacketProcessor { + inner_processor: CachedPacketProcessor, + metrics_reporter: metrics::MetricsReporter, +} + +impl PacketProcessor { + pub(crate) fn new( + encryption_key: &encryption::PrivateKey, + metrics_reporter: metrics::MetricsReporter, + cache_entry_ttl: Duration, + ) -> Self { + PacketProcessor { + inner_processor: CachedPacketProcessor::new(encryption_key.into(), cache_entry_ttl), + metrics_reporter, + } + } + + pub(crate) fn clone_without_cache(&self) -> Self { + PacketProcessor { + inner_processor: self.inner_processor.clone_without_cache(), + metrics_reporter: self.metrics_reporter.clone(), + } + } + + pub(crate) fn report_sent(&self, address: NymNodeRoutingAddress) { + self.metrics_reporter.report_sent(address.to_string()) + } + + pub(crate) async fn process_received( + &self, + received: FramedSphinxPacket, + ) -> Result<MixProcessingResult, MixProcessingError> { + self.metrics_reporter.report_received(); + self.inner_processor.process_received(received).await + } +} diff --git a/mixnode/src/node/listener/mod.rs b/mixnode/src/node/listener/mod.rs new file mode 100644 index 00000000000..cc3ca62a554 --- /dev/null +++ b/mixnode/src/node/listener/mod.rs @@ -0,0 +1,52 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +use crate::node::listener::connection_handler::ConnectionHandler; +use log::*; +use std::net::SocketAddr; +use tokio::net::TcpListener; +use tokio::task::JoinHandle; + +pub(crate) mod connection_handler; + +pub(crate) struct Listener { + address: SocketAddr, +} + +impl Listener { + pub(crate) fn new(address: SocketAddr) -> Self { + Listener { address } + } + + async fn run(&mut self, connection_handler: ConnectionHandler) { + let mut listener = TcpListener::bind(self.address) + .await + .expect("Failed to create TCP listener"); + loop { + match listener.accept().await { + Ok((socket, remote_addr)) => { + let handler = connection_handler.clone_without_cache(); + tokio::spawn(handler.handle_connection(socket, remote_addr)); + } + Err(err) => warn!("Failed to accept incoming connection - {:?}", err), + } + } + } + + pub(crate) fn start(mut self, connection_handler: ConnectionHandler) -> JoinHandle<()> { + info!("Running mix listener on {:?}", self.address.to_string()); + + tokio::spawn(async move { self.run(connection_handler).await }) + } +} diff --git a/mixnode/src/node/metrics.rs b/mixnode/src/node/metrics.rs index 1ce93157031..8392966d173 100644 --- a/mixnode/src/node/metrics.rs +++ b/mixnode/src/node/metrics.rs @@ -12,18 +12,18 @@ // See the License for the specific language governing permissions and // limitations under the License. -use directory_client::metrics::MixMetric; -use directory_client::DirectoryClient; use futures::channel::mpsc; use futures::lock::Mutex; use futures::StreamExt; use log::*; +use metrics_client::models::metrics::MixMetric; use std::collections::HashMap; use std::sync::Arc; use std::time::{Duration, SystemTime}; -use tokio::runtime::Handle; use tokio::task::JoinHandle; +const METRICS_FAILURE_BACKOFF: Duration = Duration::from_secs(30); + type SentMetricsMap = HashMap<String, u64>; pub(crate) enum MetricEvent { @@ -88,8 +88,8 @@ impl MetricsReceiver { } } - fn start(mut self, handle: &Handle) -> JoinHandle<()> { - handle.spawn(async move { + fn start(mut self) -> JoinHandle<()> { + tokio::spawn(async move { while let Some(metrics_data) = self.metrics_rx.next().await { match metrics_data { MetricEvent::Received => self.metrics.increment_received_metrics().await, @@ -104,44 +104,41 @@ impl MetricsReceiver { struct MetricsSender { metrics: MixMetrics, - directory_client: directory_client::Client, + metrics_client: metrics_client::Client, pub_key_str: String, - sending_delay: Duration, metrics_informer: MetricsInformer, } impl MetricsSender { fn new( metrics: MixMetrics, - directory_server: String, + metrics_server: String, pub_key_str: String, - sending_delay: Duration, running_logging_delay: Duration, ) -> Self { MetricsSender { metrics, - directory_client: directory_client::Client::new(directory_client::Config::new( - directory_server, + metrics_client: metrics_client::Client::new(metrics_client::Config::new( + metrics_server, )), pub_key_str, - sending_delay, metrics_informer: MetricsInformer::new(running_logging_delay), } } - fn start(mut self, handle: &Handle) -> JoinHandle<()> { - handle.spawn(async move { + fn start(mut self) -> JoinHandle<()> { + tokio::spawn(async move { loop { - // set the deadline in the future - let sending_delay = tokio::time::delay_for(self.sending_delay); + // // set the deadline in the future + // let sending_delay = tokio::time::delay_for(self.sending_delay); let (received, sent) = self.metrics.acquire_and_reset_metrics().await; self.metrics_informer.update_running_stats(received, &sent); self.metrics_informer.log_report_stats(received, &sent); self.metrics_informer.try_log_running_stats(); - match self - .directory_client + let sending_delay = match self + .metrics_client .post_mix_metrics(MixMetric { pub_key: self.pub_key_str.clone(), received, @@ -149,9 +146,15 @@ impl MetricsSender { }) .await { - Err(err) => error!("failed to send metrics - {:?}", err), - Ok(_) => debug!("sent metrics information"), - } + Err(err) => { + error!("failed to send metrics - {:?}", err); + tokio::time::delay_for(METRICS_FAILURE_BACKOFF) + } + Ok(new_interval) => { + debug!("sent metrics information"); + tokio::time::delay_for(Duration::from_secs(new_interval.next_report_in)) + } + }; // wait for however much is left sending_delay.await; @@ -263,7 +266,6 @@ impl MetricsController { pub(crate) fn new( directory_server: String, pub_key_str: String, - sending_delay: Duration, running_stats_logging_delay: Duration, ) -> Self { let (metrics_tx, metrics_rx) = mpsc::unbounded(); @@ -274,7 +276,6 @@ impl MetricsController { shared_metrics.clone(), directory_server, pub_key_str, - sending_delay, running_stats_logging_delay, ), receiver: MetricsReceiver::new(shared_metrics, metrics_rx), @@ -283,10 +284,10 @@ impl MetricsController { } // reporter is how node is going to be accessing the metrics data - pub(crate) fn start(self, handle: &Handle) -> MetricsReporter { + pub(crate) fn start(self) -> MetricsReporter { // TODO: should we do anything with JoinHandle(s) returned by start methods? - self.receiver.start(handle); - self.sender.start(handle); + self.receiver.start(); + self.sender.start(); self.reporter } } diff --git a/mixnode/src/node/mod.rs b/mixnode/src/node/mod.rs index ae7e5e1d055..eeea18553c5 100644 --- a/mixnode/src/node/mod.rs +++ b/mixnode/src/node/mod.rs @@ -13,135 +13,158 @@ // limitations under the License. use crate::config::Config; -use crate::node::packet_processing::PacketProcessor; -use crypto::asymmetric::encryption; -use directory_client::DirectoryClient; -use futures::channel::mpsc; +use crate::node::listener::connection_handler::packet_processing::PacketProcessor; +use crate::node::listener::connection_handler::ConnectionHandler; +use crate::node::listener::Listener; +use crypto::asymmetric::{encryption, identity}; use log::*; -use nymsphinx::{addressing::nodes::NymNodeRoutingAddress, SphinxPacket}; +use mixnet_client::forwarder::{MixForwardingSender, PacketForwarder}; +use std::sync::Arc; use tokio::runtime::Runtime; mod listener; mod metrics; -mod packet_forwarding; -pub(crate) mod packet_processing; mod presence; // the MixNode will live for whole duration of this program pub struct MixNode { - runtime: Runtime, config: Config, - sphinx_keypair: encryption::KeyPair, + identity_keypair: Arc<identity::KeyPair>, + sphinx_keypair: Arc<encryption::KeyPair>, } impl MixNode { - pub fn new(config: Config, sphinx_keypair: encryption::KeyPair) -> Self { + pub fn new( + config: Config, + identity_keypair: identity::KeyPair, + sphinx_keypair: encryption::KeyPair, + ) -> Self { MixNode { - runtime: Runtime::new().unwrap(), config, - sphinx_keypair, + identity_keypair: Arc::new(identity_keypair), + sphinx_keypair: Arc::new(sphinx_keypair), } } - fn start_presence_notifier(&self) { - info!("Starting presence notifier..."); - let notifier_config = presence::NotifierConfig::new( - self.config.get_location(), - self.config.get_presence_directory_server(), - self.config.get_announce_address(), - self.sphinx_keypair.public_key().to_base58_string(), - self.config.get_layer(), - self.config.get_presence_sending_delay(), - ); - presence::Notifier::new(notifier_config).start(self.runtime.handle()); - } - fn start_metrics_reporter(&self) -> metrics::MetricsReporter { info!("Starting metrics reporter..."); metrics::MetricsController::new( - self.config.get_metrics_directory_server(), - self.sphinx_keypair.public_key().to_base58_string(), - self.config.get_metrics_sending_delay(), + self.config.get_metrics_server(), + self.identity_keypair.public_key().to_base58_string(), self.config.get_metrics_running_stats_logging_delay(), ) - .start(self.runtime.handle()) + .start() } fn start_socket_listener( &self, metrics_reporter: metrics::MetricsReporter, - forwarding_channel: mpsc::UnboundedSender<(NymNodeRoutingAddress, SphinxPacket)>, + forwarding_channel: MixForwardingSender, ) { info!("Starting socket listener..."); - // this is the only location where our private key is going to be copied - // it will be held in memory owned by `MixNode` and inside an Arc of `PacketProcessor` - let packet_processor = - PacketProcessor::new(self.sphinx_keypair.private_key().clone(), metrics_reporter); - - listener::run_socket_listener( - self.runtime.handle(), - self.config.get_listening_address(), - packet_processor, - forwarding_channel, + + let packet_processor = PacketProcessor::new( + self.sphinx_keypair.private_key(), + metrics_reporter, + self.config.get_cache_entry_ttl(), ); + + let connection_handler = ConnectionHandler::new(packet_processor, forwarding_channel); + + let listener = Listener::new(self.config.get_listening_address()); + + listener.start(connection_handler); } - fn start_packet_forwarder( - &mut self, - ) -> mpsc::UnboundedSender<(NymNodeRoutingAddress, SphinxPacket)> { + fn start_packet_forwarder(&mut self) -> MixForwardingSender { info!("Starting packet forwarder..."); - self.runtime - .enter(|| { - packet_forwarding::PacketForwarder::new( - self.config.get_packet_forwarding_initial_backoff(), - self.config.get_packet_forwarding_maximum_backoff(), - self.config.get_initial_connection_timeout(), - ) - }) - .start(self.runtime.handle()) + + let (mut packet_forwarder, packet_sender) = PacketForwarder::new( + self.config.get_packet_forwarding_initial_backoff(), + self.config.get_packet_forwarding_maximum_backoff(), + self.config.get_initial_connection_timeout(), + self.config.get_packet_forwarding_max_reconnections(), + ); + + tokio::spawn(async move { packet_forwarder.run().await }); + packet_sender } - fn check_if_same_ip_node_exists(&mut self) -> Option<String> { - let directory_client_config = - directory_client::Config::new(self.config.get_presence_directory_server()); - let directory_client = directory_client::Client::new(directory_client_config); - let topology = self - .runtime - .block_on(directory_client.get_topology()) - .ok()?; + async fn check_if_same_ip_node_exists(&mut self) -> Option<String> { + let validator_client_config = + validator_client::Config::new(self.config.get_validator_rest_endpoint()); + let validator_client = validator_client::Client::new(validator_client_config); + let topology = validator_client + .get_topology() + .await + .expect("failed to grab network topology"); let existing_mixes_presence = topology.mix_nodes; existing_mixes_presence .iter() - .find(|node| node.host == self.config.get_announce_address()) - .map(|node| node.pub_key.clone()) + .find(|node| node.mix_host() == self.config.get_announce_address()) + .map(|node| node.identity()) } - pub fn run(&mut self) { - info!("Starting nym mixnode"); - - if let Some(duplicate_node_key) = self.check_if_same_ip_node_exists() { - error!( - "Our announce-host is identical to an existing node's announce-host! (its key is {:?}", - duplicate_node_key - ); - return; - } - let forwarding_channel = self.start_packet_forwarder(); - let metrics_reporter = self.start_metrics_reporter(); - self.start_socket_listener(metrics_reporter, forwarding_channel); - self.start_presence_notifier(); - - info!("Finished nym mixnode startup procedure - it should now be able to receive mix traffic!"); - - if let Err(e) = self.runtime.block_on(tokio::signal::ctrl_c()) { + async fn wait_for_interrupt(&self) { + if let Err(e) = tokio::signal::ctrl_c().await { error!( "There was an error while capturing SIGINT - {:?}. We will terminate regardless", e ); } - println!( "Received SIGINT - the mixnode will terminate now (threads are not YET nicely stopped)" ); + info!("Trying to unregister with the validator..."); + if let Err(err) = presence::unregister_with_validator( + self.config.get_validator_rest_endpoint(), + self.identity_keypair.public_key().to_base58_string(), + ) + .await + { + error!("failed to unregister with validator... - {:?}", err) + } + } + + pub fn run(&mut self) { + info!("Starting nym mixnode"); + + let mut runtime = Runtime::new().unwrap(); + + runtime.block_on(async { + if let Some(duplicate_node_key) = self.check_if_same_ip_node_exists().await { + if duplicate_node_key == self.identity_keypair.public_key().to_base58_string() { + warn!("We seem to have not unregistered after going offline - there's a node with identical identity and announce-host as us registered.") + } else { + error!( + "Our announce-host is identical to an existing node's announce-host! (its key is {:?}", + duplicate_node_key + ); + return; + } + } + + if let Err(err) = presence::register_with_validator( + self.config.get_validator_rest_endpoint(), + self.config.get_announce_address(), + self.identity_keypair.public_key().to_base58_string(), + self.sphinx_keypair.public_key().to_base58_string(), + self.config.get_version().to_string(), + self.config.get_location(), + self.config.get_layer(), + self.config.get_incentives_address(), + ).await { + error!("failed to register with the validator - {:?}", err); + return + } + + let forwarding_channel = self.start_packet_forwarder(); + let metrics_reporter = self.start_metrics_reporter(); + self.start_socket_listener(metrics_reporter, forwarding_channel); + + info!("Finished nym mixnode startup procedure - it should now be able to receive mix traffic!"); + + self.wait_for_interrupt().await + }) } } diff --git a/mixnode/src/node/packet_forwarding.rs b/mixnode/src/node/packet_forwarding.rs deleted file mode 100644 index 29a112d442f..00000000000 --- a/mixnode/src/node/packet_forwarding.rs +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -use futures::channel::mpsc; -use futures::StreamExt; -use log::*; -use nymsphinx::{addressing::nodes::NymNodeRoutingAddress, SphinxPacket}; -use std::time::Duration; -use tokio::runtime::Handle; - -pub(crate) struct PacketForwarder { - tcp_client: mixnet_client::Client, - conn_tx: mpsc::UnboundedSender<(NymNodeRoutingAddress, SphinxPacket)>, - conn_rx: mpsc::UnboundedReceiver<(NymNodeRoutingAddress, SphinxPacket)>, -} - -impl PacketForwarder { - pub(crate) fn new( - initial_reconnection_backoff: Duration, - maximum_reconnection_backoff: Duration, - initial_connection_timeout: Duration, - ) -> PacketForwarder { - let tcp_client_config = mixnet_client::Config::new( - initial_reconnection_backoff, - maximum_reconnection_backoff, - initial_connection_timeout, - ); - - let (conn_tx, conn_rx) = mpsc::unbounded(); - - PacketForwarder { - tcp_client: mixnet_client::Client::new(tcp_client_config), - conn_tx, - conn_rx, - } - } - - pub(crate) fn start( - mut self, - handle: &Handle, - ) -> mpsc::UnboundedSender<(NymNodeRoutingAddress, SphinxPacket)> { - // TODO: what to do with the lost JoinHandle? - let sender_channel = self.conn_tx.clone(); - handle.spawn(async move { - while let Some((address, packet)) = self.conn_rx.next().await { - trace!("Going to forward packet to {:?}", address); - // as a mix node we don't care about responses, we just want to fire packets - // as quickly as possible - self.tcp_client.send(address, packet, false).await.unwrap(); // if we're not waiting for response, we MUST get an Ok - } - }); - sender_channel - } -} diff --git a/mixnode/src/node/packet_processing.rs b/mixnode/src/node/packet_processing.rs deleted file mode 100644 index f0756482180..00000000000 --- a/mixnode/src/node/packet_processing.rs +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -use crate::node::metrics; -use crypto::asymmetric::encryption; -use log::*; -use nymsphinx::addressing::nodes::{NymNodeRoutingAddress, NymNodeRoutingAddressError}; -use nymsphinx::{ - Delay as SphinxDelay, Error as SphinxError, NodeAddressBytes, ProcessedPacket, SphinxPacket, -}; -use std::convert::TryFrom; -use std::sync::Arc; - -#[derive(Debug)] -pub enum MixProcessingError { - ReceivedFinalHopError, - SphinxProcessingError(SphinxError), - InvalidHopAddress, -} - -pub enum MixProcessingResult { - ForwardHop(NymNodeRoutingAddress, SphinxPacket), - #[allow(dead_code)] - LoopMessage, -} - -impl From<SphinxError> for MixProcessingError { - // for time being just have a single error instance for all possible results of SphinxError - fn from(err: SphinxError) -> Self { - use MixProcessingError::*; - - SphinxProcessingError(err) - } -} - -impl From<NymNodeRoutingAddressError> for MixProcessingError { - fn from(_: NymNodeRoutingAddressError) -> Self { - use MixProcessingError::*; - - InvalidHopAddress - } -} - -// PacketProcessor contains all data required to correctly unwrap and forward sphinx packets -#[derive(Clone)] -pub struct PacketProcessor { - secret_key: Arc<encryption::PrivateKey>, - metrics_reporter: metrics::MetricsReporter, -} - -impl PacketProcessor { - pub(crate) fn new( - secret_key: encryption::PrivateKey, - metrics_reporter: metrics::MetricsReporter, - ) -> Self { - PacketProcessor { - secret_key: Arc::new(secret_key), - metrics_reporter, - } - } - - pub(crate) fn report_sent(&self, addr: NymNodeRoutingAddress) { - self.metrics_reporter.report_sent(addr.to_string()) - } - - async fn process_forward_hop( - &self, - packet: SphinxPacket, - forward_address: NodeAddressBytes, - delay: SphinxDelay, - ) -> Result<MixProcessingResult, MixProcessingError> { - let next_hop_address = NymNodeRoutingAddress::try_from(forward_address)?; - - // Delay packet for as long as required - tokio::time::delay_for(delay.to_duration()).await; - - Ok(MixProcessingResult::ForwardHop(next_hop_address, packet)) - } - - pub(crate) async fn process_sphinx_packet( - &self, - packet: SphinxPacket, - ) -> Result<MixProcessingResult, MixProcessingError> { - // we received something resembling a sphinx packet, report it! - self.metrics_reporter.report_received(); - match packet.process(&self.secret_key.as_ref().into()) { - Ok(ProcessedPacket::ProcessedPacketForwardHop(packet, address, delay)) => { - self.process_forward_hop(packet, address, delay).await - } - Ok(ProcessedPacket::ProcessedPacketFinalHop(_, _, _)) => { - warn!("Received a loop cover message that we haven't implemented yet!"); - Err(MixProcessingError::ReceivedFinalHopError) - } - Err(e) => { - warn!("Failed to unwrap Sphinx packet: {:?}", e); - Err(MixProcessingError::SphinxProcessingError(e)) - } - } - } -} - -// TODO: the test that definitely needs to be written is as follows: -// we are stuck trying to write to mix A, can we still forward just fine to mix B? diff --git a/mixnode/src/node/presence.rs b/mixnode/src/node/presence.rs index e31abd06ab6..a7d0f62eb83 100644 --- a/mixnode/src/node/presence.rs +++ b/mixnode/src/node/presence.rs @@ -12,90 +12,43 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::built_info; -use directory_client::presence::mixnodes::MixNodePresence; -use directory_client::DirectoryClient; -use log::{error, trace}; -use std::time::Duration; -use tokio::runtime::Handle; -use tokio::task::JoinHandle; +use validator_client::models::mixnode::MixRegistrationInfo; +use validator_client::ValidatorClientError; -pub(crate) struct NotifierConfig { +// there's no point in keeping the validator client persistently as it might be literally hours or days +// before it's used again +pub(crate) async fn register_with_validator( + validator_endpoint: String, + mix_host: String, + identity_key: String, + sphinx_key: String, + version: String, location: String, - directory_server: String, - announce_host: String, - pub_key_string: String, layer: u64, - sending_delay: Duration, -} + incentives_address: Option<String>, +) -> Result<(), ValidatorClientError> { + let config = validator_client::Config::new(validator_endpoint); + let validator_client = validator_client::Client::new(config); -impl NotifierConfig { - pub(crate) fn new( - location: String, - directory_server: String, - announce_host: String, - pub_key_string: String, - layer: u64, - sending_delay: Duration, - ) -> Self { - NotifierConfig { - location, - directory_server, - announce_host, - pub_key_string, - layer, - sending_delay, - } - } -} + let registration_info = MixRegistrationInfo::new( + mix_host, + identity_key, + sphinx_key, + version, + location, + layer, + incentives_address, + ); -pub(crate) struct Notifier { - net_client: directory_client::Client, - presence: MixNodePresence, - sending_delay: Duration, + validator_client.register_mix(registration_info).await } -impl Notifier { - pub(crate) fn new(config: NotifierConfig) -> Notifier { - let directory_client_cfg = directory_client::Config { - base_url: config.directory_server, - }; - let net_client = directory_client::Client::new(directory_client_cfg); - let presence = MixNodePresence { - location: config.location, - host: config.announce_host, - pub_key: config.pub_key_string, - layer: config.layer, - last_seen: 0, - version: built_info::PKG_VERSION.to_string(), - }; - Notifier { - net_client, - presence, - sending_delay: config.sending_delay, - } - } - - async fn notify(&self) { - match self - .net_client - .post_mixnode_presence(self.presence.clone()) - .await - { - Err(err) => error!("failed to send presence - {:?}", err), - Ok(_) => trace!("sent presence information"), - } - } +pub(crate) async fn unregister_with_validator( + validator_endpoint: String, + identity_key: String, +) -> Result<(), ValidatorClientError> { + let config = validator_client::Config::new(validator_endpoint); + let validator_client = validator_client::Client::new(config); - pub fn start(self, handle: &Handle) -> JoinHandle<()> { - handle.spawn(async move { - loop { - // set the deadline in the future - let sending_delay = tokio::time::delay_for(self.sending_delay); - self.notify().await; - // wait for however much is left - sending_delay.await; - } - }) - } + validator_client.unregister_node(&identity_key).await } diff --git a/network-monitor/Cargo.toml b/network-monitor/Cargo.toml new file mode 100644 index 00000000000..8b162cc4045 --- /dev/null +++ b/network-monitor/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "nym-network-monitor" +version = "0.9.0" +authors = ["Dave Hrycyszyn <futurechimp@users.noreply.github.com>", "Jędrzej Stuczyński <andrew@nymtech.net>"] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +clap = "2.33.0" +dotenv = "0.15.0" +futures = "0.3" +log = "0.4" +pretty_env_logger = "0.3" +rand = "0.7" +serde = "1.0" +serde_json = "1.0" +tokio = { version = "0.2", features = ["signal", "rt-threaded", "macros"] } + +## internal +crypto = { path = "../common/crypto" } +gateway-client = { path = "../common/client-libs/gateway-client" } +nymsphinx = { path = "../common/nymsphinx" } +topology = { path = "../common/topology" } +validator-client = { path = "../common/client-libs/validator-client" } +version-checker = { path = "../common/version-checker" } + +[dev-dependencies] diff --git a/network-monitor/src/chunker.rs b/network-monitor/src/chunker.rs new file mode 100644 index 00000000000..3a22a893b78 --- /dev/null +++ b/network-monitor/src/chunker.rs @@ -0,0 +1,74 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +use crate::{DefRng, DEFAULT_RNG}; +use nymsphinx::forwarding::packet::MixPacket; +use nymsphinx::params::PacketMode; +use nymsphinx::{ + acknowledgements::AckKey, addressing::clients::Recipient, preparer::MessagePreparer, +}; +use std::time::Duration; +use topology::NymTopology; + +const DEFAULT_AVERAGE_PACKET_DELAY: Duration = Duration::from_millis(200); +const DEFAULT_AVERAGE_ACK_DELAY: Duration = Duration::from_millis(200); + +pub(crate) struct Chunker { + rng: DefRng, + me: Recipient, + message_preparer: MessagePreparer<DefRng>, +} + +impl Chunker { + pub(crate) fn new(me: Recipient) -> Self { + Chunker { + rng: DEFAULT_RNG, + me, + message_preparer: MessagePreparer::new( + DEFAULT_RNG, + me, + DEFAULT_AVERAGE_PACKET_DELAY, + DEFAULT_AVERAGE_ACK_DELAY, + PacketMode::Mix, + None, + ), + } + } + + pub(crate) async fn prepare_messages( + &mut self, + message: Vec<u8>, + topology: &NymTopology, + ) -> Vec<MixPacket> { + let ack_key: AckKey = AckKey::new(&mut self.rng); + + let (split_message, _reply_keys) = self + .message_preparer + .prepare_and_split_message(message, false, &topology) + .expect("failed to split the message"); + + let mut mix_packets = Vec::with_capacity(split_message.len()); + for message_chunk in split_message { + // don't bother with acks etc. for time being + let prepared_fragment = self + .message_preparer + .prepare_chunk_for_sending(message_chunk, &topology, &ack_key, &self.me) + .await + .unwrap(); + + mix_packets.push(prepared_fragment.mix_packet); + } + mix_packets + } +} diff --git a/network-monitor/src/main.rs b/network-monitor/src/main.rs new file mode 100644 index 00000000000..9bc6dc0be15 --- /dev/null +++ b/network-monitor/src/main.rs @@ -0,0 +1,277 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +use crate::monitor::MixnetReceiver; +use crate::run_info::{TestRunUpdateReceiver, TestRunUpdateSender}; +use crate::tested_network::good_topology::parse_topology_file; +use crate::tested_network::TestedNetwork; +use clap::{App, Arg, ArgMatches}; +use crypto::asymmetric::{encryption, identity}; +use futures::channel::mpsc; +use gateway_client::GatewayClient; +use log::*; +use monitor::{AckSender, MixnetSender, Monitor}; +use notifications::Notifier; +use nymsphinx::addressing::clients::Recipient; +use packet_sender::PacketSender; +use rand::rngs::OsRng; +use std::sync::Arc; +use std::time; +use topology::{gateway, NymTopology}; + +mod chunker; +mod monitor; +mod notifications; +mod packet_sender; +mod run_info; +mod test_packet; +mod tested_network; + +pub(crate) type DefRng = OsRng; +pub(crate) const DEFAULT_RNG: DefRng = OsRng; + +const V4_TOPOLOGY_ARG: &str = "v4-topology-filepath"; +const V6_TOPOLOGY_ARG: &str = "v6-topology-filepath"; +const VALIDATOR_ARG: &str = "validator"; +const DETAILED_REPORT_ARG: &str = "detailed-report"; + +fn parse_args<'a>() -> ArgMatches<'a> { + App::new("Nym Network Monitor") + .author("Nymtech") + .arg( + Arg::with_name(V4_TOPOLOGY_ARG) + .help("location of .json file containing IPv4 'good' network topology") + .takes_value(true) + .required(true), + ) + .arg( + Arg::with_name(V6_TOPOLOGY_ARG) + .help("location of .json file containing IPv6 'good' network topology") + .takes_value(true) + .required(true), + ) + .arg( + Arg::with_name(VALIDATOR_ARG) + .help("REST endpoint of the validator the monitor will grab nodes to test") + .takes_value(true) + .required(true), + ) + .arg( + Arg::with_name(DETAILED_REPORT_ARG) + .help("specifies whether a detailed report should be printed after each run"), + ) + .get_matches() +} + +#[tokio::main] +async fn main() { + println!("Network monitor starting..."); + dotenv::dotenv().ok(); + let matches = parse_args(); + let v4_topology_path = matches.value_of(V4_TOPOLOGY_ARG).unwrap(); + let v6_topology_path = matches.value_of(V6_TOPOLOGY_ARG).unwrap(); + + let v4_topology = parse_topology_file(v4_topology_path); + let v6_topology = parse_topology_file(v6_topology_path); + + let validator_rest_uri = matches.value_of(VALIDATOR_ARG).unwrap(); + let detailed_report = matches.is_present(DETAILED_REPORT_ARG); + + check_if_up_to_date(&v4_topology, &v6_topology); + setup_logging(); + + println!("* validator server: {}", validator_rest_uri); + + // TODO: THIS MUST BE UPDATED!! + // TODO: THIS MUST BE UPDATED!! + // TODO: THIS MUST BE UPDATED!! + warn!("using v4 gateway for both topologies!"); + let gateway = v4_topology.gateways()[0].clone(); + + // TODO: this might change if it turns out we need both v4 and v6 gateway clients + println!("* gateway: {}", gateway.identity_key.to_base58_string()); + + // Channels for task communication + let (ack_sender, _ack_receiver) = mpsc::unbounded(); + let (mixnet_sender, mixnet_receiver) = mpsc::unbounded(); + let (test_run_sender, test_run_receiver) = mpsc::unbounded(); + + // Generate a new set of identity keys. These are ephemeral, and change on each run. + // JS: do they? or rather should they? + let identity_keypair = identity::KeyPair::new(); + let encryption_keypair = encryption::KeyPair::new(); + + // We need our own address as a Recipient so we can send ourselves test packets + let self_address = Recipient::new( + *identity_keypair.public_key(), + *encryption_keypair.public_key(), + gateway.identity_key, + ); + + let validator_client = new_validator_client(validator_rest_uri); + + let mut network_monitor = Monitor::new(); + + let notifier = new_notifier( + encryption_keypair, + Arc::clone(&validator_client), + mixnet_receiver, + test_run_receiver, + detailed_report, + ); + + let gateway_client = new_gateway_client(gateway, identity_keypair, ack_sender, mixnet_sender); + let tested_network = new_tested_network(gateway_client, v4_topology, v6_topology).await; + + let packet_sender = new_packet_sender( + validator_client, + tested_network, + self_address, + test_run_sender, + ); + + network_monitor.run(notifier, packet_sender).await; +} + +async fn new_tested_network( + gateway_client: GatewayClient, + good_v4_topology: NymTopology, + good_v6_topology: NymTopology, +) -> TestedNetwork { + // TODO: possibly change that if it turns out we need two clients (v4 and v6) + let mut tested_network = + TestedNetwork::new_good(gateway_client, good_v4_topology, good_v6_topology); + tested_network.start_gateway_client().await; + tested_network +} + +fn new_packet_sender( + validator_client: Arc<validator_client::Client>, + tested_network: TestedNetwork, + self_address: Recipient, + test_run_sender: TestRunUpdateSender, +) -> PacketSender { + PacketSender::new( + validator_client, + tested_network, + self_address, + test_run_sender, + ) +} + +/// Construct a new gateway client. +pub fn new_gateway_client( + gateway: gateway::Node, + identity_keypair: identity::KeyPair, + ack_sender: AckSender, + mixnet_messages_sender: MixnetSender, +) -> GatewayClient { + let timeout = time::Duration::from_millis(500); + let identity_arc = Arc::new(identity_keypair); + + gateway_client::GatewayClient::new( + gateway.client_listener, + identity_arc, + gateway.identity_key, + None, + mixnet_messages_sender, + ack_sender, + timeout, + ) +} + +fn new_validator_client(validator_rest_uri: &str) -> Arc<validator_client::Client> { + let config = validator_client::Config::new(validator_rest_uri.to_string()); + Arc::new(validator_client::Client::new(config)) +} + +fn new_notifier( + encryption_keypair: encryption::KeyPair, + validator_client: Arc<validator_client::Client>, + mixnet_receiver: MixnetReceiver, + test_run_receiver: TestRunUpdateReceiver, + with_detailed_report: bool, +) -> Notifier { + Notifier::new( + mixnet_receiver, + encryption_keypair, + validator_client, + test_run_receiver, + with_detailed_report, + ) +} + +fn setup_logging() { + let mut log_builder = pretty_env_logger::formatted_timed_builder(); + if let Ok(s) = ::std::env::var("RUST_LOG") { + log_builder.parse_filters(&s); + } else { + // default to 'Info' + log_builder.filter(None, log::LevelFilter::Info); + } + + log_builder + .filter_module("hyper", log::LevelFilter::Warn) + .filter_module("tokio_reactor", log::LevelFilter::Warn) + .filter_module("reqwest", log::LevelFilter::Warn) + .filter_module("mio", log::LevelFilter::Warn) + .filter_module("want", log::LevelFilter::Warn) + .filter_module("sled", log::LevelFilter::Warn) + .filter_module("tungstenite", log::LevelFilter::Warn) + .filter_module("tokio_tungstenite", log::LevelFilter::Warn) + .init(); +} + +fn check_if_up_to_date(v4_topology: &NymTopology, v6_topology: &NymTopology) { + let monitor_version = env!("CARGO_PKG_VERSION"); + for (_, layer_mixes) in v4_topology.mixes().iter() { + for mix in layer_mixes.iter() { + if !version_checker::is_minor_version_compatible(monitor_version, &*mix.version) { + panic!( + "Our good topology is not compatible with monitor! Mix runs {}, we have {}", + mix.version, monitor_version + ) + } + } + } + + for gateway in v4_topology.gateways().iter() { + if !version_checker::is_minor_version_compatible(monitor_version, &*gateway.version) { + panic!( + "Our good topology is not compatible with monitor! Gateway runs {}, we have {}", + gateway.version, monitor_version + ) + } + } + + for (_, layer_mixes) in v6_topology.mixes().iter() { + for mix in layer_mixes.iter() { + if !version_checker::is_minor_version_compatible(monitor_version, &*mix.version) { + panic!( + "Our good topology is not compatible with monitor! Mix runs {}, we have {}", + mix.version, monitor_version + ) + } + } + } + + for gateway in v6_topology.gateways().iter() { + if !version_checker::is_minor_version_compatible(monitor_version, &*gateway.version) { + panic!( + "Our good topology is not compatible with monitor! Gateway runs {}, we have {}", + gateway.version, monitor_version + ) + } + } +} diff --git a/network-monitor/src/monitor.rs b/network-monitor/src/monitor.rs new file mode 100644 index 00000000000..1586e685346 --- /dev/null +++ b/network-monitor/src/monitor.rs @@ -0,0 +1,65 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +use crate::{notifications::Notifier, packet_sender::PacketSender}; +use futures::channel::mpsc::{UnboundedReceiver, UnboundedSender}; +use log::*; +use tokio::time::{self, Duration}; + +pub(crate) type MixnetReceiver = UnboundedReceiver<Vec<Vec<u8>>>; +pub(crate) type MixnetSender = UnboundedSender<Vec<Vec<u8>>>; +pub(crate) type AckSender = UnboundedSender<Vec<Vec<u8>>>; + +pub(crate) const MONITOR_RUN_INTERVAL: Duration = Duration::from_secs(60); +pub(crate) const NOTIFIER_DELIVERY_TIMEOUT: Duration = Duration::from_secs(20); + +pub struct Monitor; + +impl Monitor { + pub fn new() -> Monitor { + Monitor {} + } + + pub(crate) async fn run(&mut self, mut notifier: Notifier, mut packet_sender: PacketSender) { + println!("Network monitor running - note: 'good' nodes are hardcoded."); + println!("-----------------------------------------------------------"); + tokio::spawn(async move { + notifier.run().await; + }); + + tokio::spawn(async move { + let mut interval = time::interval(MONITOR_RUN_INTERVAL); + loop { + interval.tick().await; + info!(target: "Monitor", "Starting test run"); + + if let Err(err) = packet_sender.run_test().await { + error!("Test run failed! - {:?}", err); + } + } + }); + + self.wait_for_interrupt().await + } + + async fn wait_for_interrupt(&self) { + if let Err(e) = tokio::signal::ctrl_c().await { + error!( + "There was an error while capturing SIGINT - {:?}. We will terminate regardless", + e + ); + } + println!("Received SIGINT - the network monitor will terminate now"); + } +} diff --git a/network-monitor/src/notifications/mod.rs b/network-monitor/src/notifications/mod.rs new file mode 100644 index 00000000000..6539eae5c41 --- /dev/null +++ b/network-monitor/src/notifications/mod.rs @@ -0,0 +1,155 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +use super::monitor::MixnetReceiver; +use crate::monitor::NOTIFIER_DELIVERY_TIMEOUT; +use crate::notifications::test_run::TestRun; +use crate::notifications::test_timeout::TestTimeout; +use crate::run_info::{RunInfo, TestRunUpdate, TestRunUpdateReceiver}; +use crypto::asymmetric::encryption::KeyPair; +use futures::StreamExt; +use log::*; +use nymsphinx::receiver::MessageReceiver; +use std::sync::Arc; +use validator_client::models::mixmining::BatchMixStatus; +use validator_client::ValidatorClientError; + +mod test_run; +mod test_timeout; + +#[derive(Debug)] +enum NotifierError { + ValidatorError(ValidatorClientError), + MalformedPacketReceived, + NonTestPacketReceived, +} + +pub(crate) struct Notifier { + client_encryption_keypair: KeyPair, + message_receiver: MessageReceiver, + mixnet_receiver: MixnetReceiver, + validator_client: Arc<validator_client::Client>, + test_run_receiver: TestRunUpdateReceiver, + test_run_nonce: u64, + current_test_run: TestRun, + test_timeout: TestTimeout, +} + +impl Notifier { + pub(crate) fn new( + mixnet_receiver: MixnetReceiver, + client_encryption_keypair: KeyPair, + validator_client: Arc<validator_client::Client>, + test_run_receiver: TestRunUpdateReceiver, + with_detailed_report: bool, + ) -> Notifier { + let message_receiver = MessageReceiver::new(); + let mut current_test_run = TestRun::new(0).with_report(); + if with_detailed_report { + current_test_run = current_test_run.with_detailed_report(); + } + Notifier { + client_encryption_keypair, + message_receiver, + mixnet_receiver, + validator_client, + test_run_receiver, + test_run_nonce: 0, + current_test_run, + test_timeout: TestTimeout::new(), + } + } + + async fn on_run_start(&mut self, run_info: RunInfo) { + self.test_run_nonce += 1; + + self.current_test_run.refresh(self.test_run_nonce); + self.current_test_run.start_run(run_info); + } + + async fn on_run_end(&mut self) { + let batch_status = self.current_test_run.finish_run(); + if let Err(err) = self.notify_validator(batch_status).await { + warn!("Failed to send batch status to validator - {:?}", err) + } + } + + fn on_sending_over(&mut self, nonce: u64) { + assert_eq!(nonce, self.test_run_nonce); + self.test_timeout.start(NOTIFIER_DELIVERY_TIMEOUT); + } + + async fn on_test_run_update(&mut self, run_update: TestRunUpdate) { + match run_update { + TestRunUpdate::StartSending(run_info) => self.on_run_start(run_info).await, + TestRunUpdate::DoneSending(nonce) => self.on_sending_over(nonce), + } + } + + fn on_mix_messages(&mut self, messages: Vec<Vec<u8>>) { + for message in messages { + if let Err(err) = self.on_message(message) { + error!(target: "Mix receiver", "failed to process received mix packet - {:?}", err) + } + } + } + + pub(crate) async fn run(&mut self) { + debug!("Started MixnetListener"); + loop { + tokio::select! { + mix_messages = &mut self.mixnet_receiver.next() => { + self.on_mix_messages(mix_messages.expect("mix channel has failed!")); + }, + run_update = &mut self.test_run_receiver.next() => { + self.on_test_run_update(run_update.expect("packet sender has died!")).await; + } + _ = &mut self.test_timeout => { + self.on_run_end().await; + self.test_timeout.clear(); + } + } + } + } + + fn on_message(&mut self, message: Vec<u8>) -> Result<(), NotifierError> { + let encrypted_bytes = self + .message_receiver + .recover_plaintext(self.client_encryption_keypair.private_key(), message) + .map_err(|_| NotifierError::MalformedPacketReceived)?; + let fragment = self + .message_receiver + .recover_fragment(&encrypted_bytes) + .map_err(|_| NotifierError::MalformedPacketReceived)?; + let (recovered, _) = self + .message_receiver + .insert_new_fragment(fragment) + .map_err(|_| NotifierError::MalformedPacketReceived)? + .ok_or_else(|| NotifierError::NonTestPacketReceived)?; // if it's a test packet it MUST BE reconstructed with single fragment + + let all_received = self.current_test_run.received_packet(recovered.message); + if all_received { + self.test_timeout.fire(); + } + Ok(()) + } + + async fn notify_validator(&self, status: BatchMixStatus) -> Result<(), NotifierError> { + self.validator_client + .post_batch_mixmining_status(status) + .await + .map_err(NotifierError::ValidatorError)?; + Ok(()) + } +} diff --git a/network-monitor/src/notifications/test_run.rs b/network-monitor/src/notifications/test_run.rs new file mode 100644 index 00000000000..c6dd1c717df --- /dev/null +++ b/network-monitor/src/notifications/test_run.rs @@ -0,0 +1,286 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +use crate::run_info::RunInfo; +use crate::test_packet::TestPacket; +use log::*; +use std::collections::{HashMap, HashSet}; +use std::mem; +use validator_client::models::mixmining::{BatchMixStatus, MixStatus}; + +pub(super) struct TestRun { + print_report: bool, + print_detailed_report: bool, + test_report: TestReport, + + run_nonce: u64, + expected_run_packets: HashSet<TestPacket>, + received_packets: Vec<TestPacket>, +} + +#[derive(Default)] +struct NodeResult { + ip_v4_compatible: bool, + ip_v6_compatible: bool, +} + +#[derive(Default)] +struct TestReport { + total_sent: usize, + total_received: usize, + malformed: Vec<String>, + outdated: Vec<(String, String)>, + + // below are only populated if we're going to be printing the report + only_ipv4_compatible: Vec<String>, // can't speak v6, but can speak v4 + only_ipv6_compatible: Vec<String>, // can't speak v4, but can speak v6 + completely_unroutable: Vec<String>, // can't speak either v4 or v6 + fully_working: Vec<String>, +} + +impl TestReport { + fn print(&self, detailed: bool) { + info!(target: "Test Report", "Sent total of {} packets", self.total_sent); + info!(target: "Test Report", "Received total of {} packets", self.total_received); + info!(target: "Test Report", "{} nodes are malformed", self.malformed.len()); + info!(target: "Test Report", "{} nodes are outdated", self.outdated.len()); + info!(target: "Test Report", "{} nodes speak ONLY IPv4 (NO IPv6 connectivity)", self.only_ipv4_compatible.len()); + info!(target: "Test Report", "{} nodes speak ONLY IPv6 (NO IPv4 connectivity)", self.only_ipv6_compatible.len()); + info!(target: "Test Report", "{} nodes are totally unroutable!", self.completely_unroutable.len()); + info!(target: "Test Report", "{} nodes work fine!", self.fully_working.len()); + + if detailed { + info!(target: "Detailed report", "full summary:"); + for malformed in self.malformed.iter() { + info!(target: "Malformed node", "{}", malformed) + } + for outdated in self.outdated.iter() { + info!(target: "Outdated node", "{} (runs v{})", outdated.0, outdated.1) + } + for v4_node in self.only_ipv4_compatible.iter() { + info!(target: "IPv4-only node", "{}", v4_node) + } + + for v6_node in self.only_ipv6_compatible.iter() { + info!(target: "IPv6-only node", "{}", v6_node) + } + + for unroutable in self.completely_unroutable.iter() { + info!(target: "Unroutable node", "{}", unroutable) + } + + for working in self.fully_working.iter() { + info!(target: "Fully working node", "{}", working) + } + } + } +} + +impl TestRun { + pub(super) fn new(run_nonce: u64) -> Self { + TestRun { + print_report: false, + print_detailed_report: false, + test_report: Default::default(), + run_nonce, + expected_run_packets: Default::default(), + received_packets: vec![], + } + } + + pub(super) fn with_report(mut self) -> Self { + self.print_report = true; + self + } + + pub(super) fn with_detailed_report(mut self) -> Self { + self.print_report = true; + self.print_detailed_report = true; + self + } + + pub(super) fn refresh(&mut self, new_nonce: u64) { + self.test_report = Default::default(); + self.run_nonce = new_nonce; + self.expected_run_packets = Default::default(); + self.received_packets = Default::default(); + } + + fn down_status(&self, pub_key: String) -> Vec<MixStatus> { + let v4_status = MixStatus { + pub_key: pub_key.clone(), + ip_version: "4".to_string(), + up: false, + }; + + let v6_status = MixStatus { + pub_key, + ip_version: "6".to_string(), + up: false, + }; + + let mut vec = Vec::with_capacity(2); + vec.push(v4_status); + vec.push(v6_status); + vec + } + + /// Update state of self based on the received `RunInfo` + pub(super) fn start_run(&mut self, run_info: RunInfo) { + if run_info.nonce != self.run_nonce { + error!( + "Received unexpected test run info! Got {}, expected: {}", + self.run_nonce, run_info.nonce + ); + return; + } + + // notify about malformed nodes: + for malformed_mix in run_info.malformed_mixes { + debug!( + target: "test-run", + "{} is malformed", malformed_mix.clone() + ); + self.test_report.malformed.push(malformed_mix); + } + + for old_mix in run_info.incompatible_mixes { + debug!( + target: "test-run", + "{} is outdated! It's on {} version", + old_mix.0.clone(), + old_mix.1 + ); + self.test_report.outdated.push(old_mix); + } + + self.test_report.total_sent = run_info.test_packets.len(); + + // store information about packets that are currently being sent + self.expected_run_packets + .reserve(run_info.test_packets.len()); + for test_packet in run_info.test_packets { + self.expected_run_packets.insert(test_packet); + } + } + + pub(super) fn received_packet(&mut self, message: Vec<u8>) -> bool { + let test_packet = match TestPacket::try_from_bytes(&message) { + Ok(packet) => packet, + Err(err) => { + warn!("Invalid test packet received - {:?}", err); + return false; + } + }; + + if test_packet.nonce() == self.run_nonce { + self.received_packets.push(test_packet); + } else { + warn!( + "Received test packet for different test run! (Got {}, expected {})", + test_packet.nonce(), + self.run_nonce + ); + } + + self.received_packets.len() == self.expected_run_packets.len() + } + + fn produce_summary(&self) -> HashMap<String, NodeResult> { + // contains map of all (seemingly valid) nodes and whether they speak ipv4/ipv6 + let mut summary: HashMap<String, NodeResult> = HashMap::new(); + + // update based on data we actually get + for received_status in self.received_packets.iter() { + let entry = summary.entry(received_status.pub_key_string()).or_default(); + if received_status.ip_version().is_v4() { + entry.ip_v4_compatible = true + } else { + entry.ip_v6_compatible = true + } + } + + // and then insert entries we didn't get but should have + for expected in self.expected_run_packets.iter() { + summary.entry(expected.pub_key_string()).or_default(); + } + + summary + } + + fn finalize_report(&mut self) { + let mut fully_working = Vec::new(); + let mut only_v4_compatible = Vec::new(); + let mut only_v6_compatible = Vec::new(); + let mut unroutable_nodes = Vec::new(); + + let summary = self.produce_summary(); + for (node, result) in summary.into_iter() { + if result.ip_v4_compatible && result.ip_v6_compatible { + fully_working.push(node) + } else if result.ip_v4_compatible { + only_v4_compatible.push(node) + } else if result.ip_v6_compatible { + only_v6_compatible.push(node) + } else { + unroutable_nodes.push(node) + } + } + + self.test_report.fully_working = fully_working; + self.test_report.only_ipv4_compatible = only_v4_compatible; + self.test_report.only_ipv6_compatible = only_v6_compatible; + self.test_report.completely_unroutable = unroutable_nodes; + } + + pub(super) fn finish_run(&mut self) -> BatchMixStatus { + self.test_report.total_received = self.received_packets.len(); + + if self.print_report { + self.finalize_report(); + self.test_report.print(self.print_detailed_report); + } + + let mut mix_status = Vec::with_capacity( + 2 * (self.test_report.malformed.len() + self.test_report.outdated.len()) + + self.expected_run_packets.len(), + ); + + // firstly we know all malformed and outdated nodes are definitely down - we haven't sent + // any test packets for those + for malformed in self.test_report.malformed.iter() { + let mut down_status = self.down_status(malformed.clone()); + mix_status.append(&mut down_status); + } + for outdated in self.test_report.outdated.iter() { + let mut down_status = self.down_status(outdated.0.clone()); + mix_status.append(&mut down_status); + } + + let mut undelivered = mem::replace(&mut self.expected_run_packets, HashSet::new()); + + // then create status for packets we actually received + for received in mem::replace(&mut self.received_packets, Vec::new()) { + undelivered.remove(&received); + mix_status.push(received.into_up_mixstatus()) + } + + // and finally create status for packets we sent but never received + for undelivered_packet in undelivered.into_iter() { + mix_status.push(undelivered_packet.into_down_mixstatus()) + } + + BatchMixStatus { status: mix_status } + } +} diff --git a/network-monitor/src/notifications/test_timeout.rs b/network-monitor/src/notifications/test_timeout.rs new file mode 100644 index 00000000000..655d2accf4e --- /dev/null +++ b/network-monitor/src/notifications/test_timeout.rs @@ -0,0 +1,57 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +use log::*; +use std::future::Future; +use std::pin::Pin; +use std::task::{Context, Poll}; +use tokio::time::{delay_for, Delay, Duration, Instant}; + +pub(super) struct TestTimeout { + delay: Option<Delay>, +} + +impl TestTimeout { + pub(super) fn new() -> Self { + TestTimeout { delay: None } + } + + pub(super) fn start(&mut self, duration: Duration) { + self.delay = Some(delay_for(duration)) + } + + pub(super) fn clear(&mut self) { + self.delay = None + } + + /// Forces self to fire regardless of internal Delay state + pub(super) fn fire(&mut self) { + match self.delay.as_mut() { + None => error!("Tried to fire non-existent delay!"), + // just set the next delay to 0 so it will be polled immediately and be already elapsed + Some(delay) => delay.reset(Instant::now()), + } + } +} + +impl Future for TestTimeout { + type Output = <Delay as Future>::Output; + + fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> { + match self.delay.as_mut() { + None => Poll::Pending, + Some(delay) => Pin::new(delay).poll(cx), + } + } +} diff --git a/network-monitor/src/packet_sender.rs b/network-monitor/src/packet_sender.rs new file mode 100644 index 00000000000..3a24f48e7b2 --- /dev/null +++ b/network-monitor/src/packet_sender.rs @@ -0,0 +1,199 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +use crate::chunker::Chunker; +use crate::run_info::{RunInfo, TestRunUpdate, TestRunUpdateSender}; +use crate::test_packet::{IpVersion, TestPacket}; +use crate::tested_network::{TestMix, TestedNetwork}; +use gateway_client::error::GatewayClientError; +use log::*; +use nymsphinx::addressing::clients::Recipient; +use nymsphinx::forwarding::packet::MixPacket; +use std::convert::TryInto; +use std::sync::Arc; +use topology::mix; +use validator_client::models::mixnode::RegisteredMix; +use validator_client::ValidatorClientError; + +#[derive(Debug)] +pub(crate) enum PacketSenderError { + ValidatorError(ValidatorClientError), + GatewayError(GatewayClientError), +} + +impl From<GatewayClientError> for PacketSenderError { + fn from(err: GatewayClientError) -> Self { + PacketSenderError::GatewayError(err) + } +} + +pub struct PacketSender { + chunker: Chunker, + validator_client: Arc<validator_client::Client>, + tested_network: TestedNetwork, + test_run_sender: TestRunUpdateSender, + nonce: u64, +} + +impl PacketSender { + pub(crate) fn new( + validator_client: Arc<validator_client::Client>, + tested_network: TestedNetwork, + self_address: Recipient, + test_run_sender: TestRunUpdateSender, + ) -> Self { + PacketSender { + chunker: Chunker::new(self_address), + validator_client, + tested_network, + test_run_sender, + nonce: 0, + } + } + + fn make_test_mix(&self, mix: RegisteredMix) -> TestMix { + // the reason for that conversion is that I want to operate on concrete types + // rather than on "String" everywhere and also this way we remove obviously wrong + // mixnodes where somebody is sending bullshit presence data. + let mix_id = mix.identity(); + let mix: Result<mix::Node, _> = mix.try_into(); + match mix { + Err(err) => { + error!("mix {} is malformed - {:?}", mix_id, err); + TestMix::MalformedMix(mix_id) + } + Ok(mix) => { + if version_checker::is_minor_version_compatible( + &mix.version, + self.tested_network.system_version(), + ) { + let v4_test_packet = + TestPacket::new(mix.identity_key, IpVersion::V4, self.nonce); + let v6_test_packet = + TestPacket::new(mix.identity_key, IpVersion::V6, self.nonce); + + TestMix::ValidMix(mix, [v4_test_packet, v6_test_packet]) + } else { + TestMix::IncompatibleMix(mix) + } + } + } + } + + async fn get_test_mixes(&self) -> Result<Vec<TestMix>, PacketSenderError> { + Ok(self + .validator_client + .get_topology() + .await + .map_err(PacketSenderError::ValidatorError)? + .mix_nodes + .into_iter() + .map(|mix| self.make_test_mix(mix)) + .collect()) + } + + fn prepare_run_info(&self, test_mixes: &[TestMix]) -> RunInfo { + let num_valid = test_mixes.iter().filter(|mix| mix.is_valid()).count(); + let mut test_packets = Vec::with_capacity(num_valid * 2); + let mut malformed_mixes = Vec::new(); + let mut incompatible_mixes = Vec::new(); + + for test_mix in test_mixes { + match test_mix { + TestMix::ValidMix(.., mix_test_packets) => { + test_packets.push(mix_test_packets[0]); + test_packets.push(mix_test_packets[1]); + } + TestMix::MalformedMix(pub_key) => malformed_mixes.push(pub_key.clone()), + TestMix::IncompatibleMix(mix) => incompatible_mixes + .push((mix.identity_key.to_base58_string(), mix.version.clone())), + } + } + RunInfo { + nonce: self.nonce, + test_packets, + malformed_mixes, + incompatible_mixes, + } + } + + async fn prepare_node_mix_packets( + &mut self, + mixnode: mix::Node, + test_packets: [TestPacket; 2], + ) -> Vec<MixPacket> { + let mut packets = Vec::with_capacity(2); + for test_packet in test_packets.iter() { + let topology_to_test = self + .tested_network + .substitute_node(mixnode.clone(), test_packet.ip_version()); + let mix_message = test_packet.to_bytes(); + let mut mix_packet = self + .chunker + .prepare_messages(mix_message, &topology_to_test) + .await; + debug_assert_eq!(mix_packet.len(), 1); + packets.push(mix_packet.pop().unwrap()); + } + packets + } + + async fn prepare_mix_packets(&mut self, test_mixes: Vec<TestMix>) -> Vec<MixPacket> { + let num_valid = test_mixes.iter().filter(|mix| mix.is_valid()).count(); + let mut mix_packets = Vec::with_capacity(num_valid); + + for test_mix in test_mixes { + match test_mix { + TestMix::ValidMix(mixnode, test_packets) => { + let mut node_mix_packets = + self.prepare_node_mix_packets(mixnode, test_packets).await; + mix_packets.append(&mut node_mix_packets); + } + _ => continue, + } + } + mix_packets + } + + async fn send_messages( + &mut self, + mix_packets: Vec<MixPacket>, + ) -> Result<(), PacketSenderError> { + self.tested_network.send_messages(mix_packets).await?; + Ok(()) + } + + pub(crate) async fn run_test(&mut self) -> Result<(), PacketSenderError> { + self.nonce += 1; + + let test_mixes = self.get_test_mixes().await?; + info!(target: "Monitor", "Going to test {} mixes", test_mixes.len()); + let run_info = self.prepare_run_info(&test_mixes); + let mix_packets = self.prepare_mix_packets(test_mixes).await; + + // inform notifier that we're about to start the test + self.test_run_sender + .unbounded_send(TestRunUpdate::StartSending(run_info)) + .expect("notifier has crashed!"); + + self.send_messages(mix_packets).await?; + + // inform the notifier we're done sending (so that it should start its timeout) + self.test_run_sender + .unbounded_send(TestRunUpdate::DoneSending(self.nonce)) + .expect("notifier has crashed!"); + + Ok(()) + } +} diff --git a/common/topology/src/coco.rs b/network-monitor/src/run_info.rs similarity index 54% rename from common/topology/src/coco.rs rename to network-monitor/src/run_info.rs index ebf214d30ea..4fbe4630064 100644 --- a/common/topology/src/coco.rs +++ b/network-monitor/src/run_info.rs @@ -12,20 +12,20 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::filter; -use crypto::asymmetric::identity; +use crate::test_packet::TestPacket; +use futures::channel::mpsc::{UnboundedReceiver, UnboundedSender}; -#[derive(Debug, Clone)] -pub struct Node { - pub location: String, - pub host: String, - pub pub_key: identity::PublicKey, - pub last_seen: u64, - pub version: String, +pub(crate) type TestRunUpdateSender = UnboundedSender<TestRunUpdate>; +pub(crate) type TestRunUpdateReceiver = UnboundedReceiver<TestRunUpdate>; + +pub(crate) struct RunInfo { + pub nonce: u64, + pub test_packets: Vec<TestPacket>, + pub malformed_mixes: Vec<String>, + pub incompatible_mixes: Vec<(String, String)>, } -impl filter::Versioned for Node { - fn version(&self) -> String { - self.version.clone() - } +pub(crate) enum TestRunUpdate { + StartSending(RunInfo), + DoneSending(u64), } diff --git a/network-monitor/src/test_packet.rs b/network-monitor/src/test_packet.rs new file mode 100644 index 00000000000..977330dd782 --- /dev/null +++ b/network-monitor/src/test_packet.rs @@ -0,0 +1,173 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +use crypto::asymmetric::{encryption, identity}; +use std::convert::{TryFrom, TryInto}; +use std::fmt::{self, Display, Formatter}; +use std::hash::{Hash, Hasher}; +use std::mem; +use validator_client::models::mixmining::MixStatus; + +#[derive(Debug)] +pub(crate) enum TestPacketError { + IncompletePacket, + InvalidIpVersion, + InvalidNodeKey, +} + +impl From<identity::KeyRecoveryError> for TestPacketError { + fn from(_: identity::KeyRecoveryError) -> Self { + TestPacketError::InvalidNodeKey + } +} + +#[repr(u8)] +#[derive(PartialEq, Eq, Hash, Copy, Clone, Debug)] +pub(crate) enum IpVersion { + V4 = 4, + V6 = 6, +} + +impl TryFrom<u8> for IpVersion { + type Error = TestPacketError; + + fn try_from(value: u8) -> Result<Self, Self::Error> { + match value { + _ if value == (Self::V4 as u8) => Ok(Self::V4), + _ if value == (Self::V6 as u8) => Ok(Self::V6), + _ => Err(TestPacketError::InvalidIpVersion), + } + } +} + +impl IpVersion { + pub(crate) fn is_v4(&self) -> bool { + *self == IpVersion::V4 + } +} + +impl Into<String> for IpVersion { + fn into(self) -> String { + format!("{}", self) + } +} + +impl Display for IpVersion { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + write!(f, "{}", *self as u8) + } +} + +#[derive(Eq, Copy, Clone, Debug)] +pub(crate) struct TestPacket { + ip_version: IpVersion, + nonce: u64, + pub_key: identity::PublicKey, +} + +impl Display for TestPacket { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + write!( + f, + "TestPacket {{ ip: {}, pub_key: {}, nonce: {} }}", + self.ip_version, + self.pub_key.to_base58_string(), + self.nonce + ) + } +} + +impl Hash for TestPacket { + fn hash<H: Hasher>(&self, state: &mut H) { + self.ip_version.hash(state); + self.nonce.hash(state); + self.pub_key.to_bytes().hash(state); + } +} + +impl PartialEq for TestPacket { + fn eq(&self, other: &Self) -> bool { + self.ip_version == other.ip_version + && self.nonce == other.nonce + && self.pub_key.to_bytes() == other.pub_key.to_bytes() + } +} + +impl TestPacket { + pub(crate) fn new(pub_key: identity::PublicKey, ip_version: IpVersion, nonce: u64) -> Self { + TestPacket { + pub_key, + ip_version, + nonce, + } + } + + pub(crate) fn nonce(&self) -> u64 { + self.nonce + } + + pub(crate) fn ip_version(&self) -> IpVersion { + self.ip_version + } + + pub(crate) fn pub_key_string(&self) -> String { + self.pub_key.to_base58_string() + } + + pub(crate) fn to_bytes(&self) -> Vec<u8> { + self.nonce + .to_be_bytes() + .iter() + .cloned() + .chain(std::iter::once(self.ip_version as u8)) + .chain(self.pub_key.to_bytes().iter().cloned()) + .collect() + } + + pub(crate) fn try_from_bytes(b: &[u8]) -> Result<Self, TestPacketError> { + // nonce size + let n = mem::size_of::<u64>(); + + if b.len() != n + 1 + encryption::PUBLIC_KEY_SIZE { + return Err(TestPacketError::IncompletePacket); + } + + // this unwrap can't fail as we've already checked for the size + let nonce = u64::from_be_bytes(b[0..n].try_into().unwrap()); + let ip_version = IpVersion::try_from(b[n])?; + let pub_key = identity::PublicKey::from_bytes(&b[n + 1..])?; + + Ok(TestPacket { + ip_version, + nonce, + pub_key, + }) + } + + pub(crate) fn into_up_mixstatus(self) -> MixStatus { + MixStatus { + pub_key: self.pub_key.to_base58_string(), + ip_version: self.ip_version.into(), + up: true, + } + } + + pub(crate) fn into_down_mixstatus(self) -> MixStatus { + MixStatus { + pub_key: self.pub_key.to_base58_string(), + ip_version: self.ip_version.into(), + up: false, + } + } +} diff --git a/network-monitor/src/tested_network/good_topology.rs b/network-monitor/src/tested_network/good_topology.rs new file mode 100644 index 00000000000..bcbcb44f823 --- /dev/null +++ b/network-monitor/src/tested_network/good_topology.rs @@ -0,0 +1,33 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +use std::fs; +use topology::NymTopology; +use validator_client::models::topology::Topology; + +pub(crate) fn parse_topology_file(file_path: &str) -> NymTopology { + let file_content = + fs::read_to_string(file_path).expect("specified topology file does not exist"); + let validator_topology = serde_json::from_str::<Topology>(&file_content) + .expect("topology in specified file is malformed"); + let nym_topology: NymTopology = validator_topology.into(); + if nym_topology.mixes().len() != 3 { + panic!("topology has different than 3 number of layers") + } + if nym_topology.gateways().is_empty() { + panic!("topology does not include a gateway") + } + + nym_topology +} diff --git a/network-monitor/src/tested_network/mod.rs b/network-monitor/src/tested_network/mod.rs new file mode 100644 index 00000000000..5f2722a34d5 --- /dev/null +++ b/network-monitor/src/tested_network/mod.rs @@ -0,0 +1,86 @@ +// Copyright 2020 Nym Technologies SA +// +// 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. + +use crate::test_packet::{IpVersion, TestPacket}; +use gateway_client::error::GatewayClientError; +use gateway_client::GatewayClient; +use nymsphinx::forwarding::packet::MixPacket; +use topology::{mix, NymTopology}; + +pub(crate) mod good_topology; + +pub(crate) enum TestMix { + ValidMix(mix::Node, [TestPacket; 2]), + IncompatibleMix(mix::Node), + MalformedMix(String), +} + +impl TestMix { + pub(crate) fn is_valid(&self) -> bool { + matches!(self, TestMix::ValidMix(..)) + } +} + +pub(crate) struct TestedNetwork { + system_version: String, + gateway_client: GatewayClient, + good_v4_topology: NymTopology, + good_v6_topology: NymTopology, +} + +impl TestedNetwork { + pub(crate) fn new_good( + gateway_client: GatewayClient, + good_v4_topology: NymTopology, + good_v6_topology: NymTopology, + ) -> Self { + TestedNetwork { + system_version: good_v4_topology.mixes()[&1][0].version.clone(), + gateway_client, + good_v4_topology, + good_v6_topology, + } + } + + pub(crate) fn system_version(&self) -> &str { + &self.system_version + } + + pub(crate) async fn start_gateway_client(&mut self) { + self.gateway_client + .authenticate_and_start() + .await + .expect("Couldn't authenticate with gateway node."); + } + + pub(crate) async fn send_messages( + &mut self, + mix_packets: Vec<MixPacket>, + ) -> Result<(), GatewayClientError> { + self.gateway_client + .batch_send_mix_packets(mix_packets) + .await?; + Ok(()) + } + + pub(crate) fn substitute_node(&self, node: mix::Node, ip_version: IpVersion) -> NymTopology { + let mut good_topology = match ip_version { + IpVersion::V4 => self.good_v4_topology.clone(), + IpVersion::V6 => self.good_v6_topology.clone(), + }; + + good_topology.set_mixes_in_layer(node.layer as u8, vec![node]); + good_topology + } +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000000..48e341a0954 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3 @@ +{ + "lockfileVersion": 1 +} diff --git a/scripts/generate_changelog.sh b/scripts/generate_changelog.sh index 18e3806df45..f2efef64bec 100755 --- a/scripts/generate_changelog.sh +++ b/scripts/generate_changelog.sh @@ -1,3 +1,4 @@ +#!/bin/bash # Copyright 2020 Nym # @@ -13,7 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -#!/bin/bash # set CHANGELOG_GITHUB_TOKEN in your .bashrc file # For each version, you can add a release summary with text, images, gif animations, etc, and show new features and notes clearly to the user. This is done using GitHub metadata. diff --git a/scripts/systemd/nym-mixnode.service b/scripts/systemd/nym-mixnode.service index 2d76cb9e8e4..aa0a883d1f5 100644 --- a/scripts/systemd/nym-mixnode.service +++ b/scripts/systemd/nym-mixnode.service @@ -43,6 +43,7 @@ User=nym Group=nym ExecStart=/home/nym/nym-mixnode_linux_x86_64 run --id iamboss Restart=on-abort +KillSignal=SIGINT [Install] WantedBy=multi-user.target diff --git a/service-providers/sphinx-socks/Cargo.toml b/service-providers/network-requester/Cargo.toml similarity index 94% rename from service-providers/sphinx-socks/Cargo.toml rename to service-providers/network-requester/Cargo.toml index 2a03293dfba..cbb40db5439 100644 --- a/service-providers/sphinx-socks/Cargo.toml +++ b/service-providers/network-requester/Cargo.toml @@ -1,6 +1,6 @@ [package] -name = "sphinx-socks" -version = "0.8.1" +name = "nym-network-requester" +version = "0.9.0" authors = ["Dave Hrycyszyn <futurechimp@users.noreply.github.com>", "Jędrzej Stuczyński <andrew@nymtech.net>"] edition = "2018" diff --git a/service-providers/sphinx-socks/allowed.list.sample b/service-providers/network-requester/allowed.list.sample similarity index 80% rename from service-providers/sphinx-socks/allowed.list.sample rename to service-providers/network-requester/allowed.list.sample index bbfd80bcc18..2c2197899c6 100644 --- a/service-providers/sphinx-socks/allowed.list.sample +++ b/service-providers/network-requester/allowed.list.sample @@ -1,9 +1,11 @@ blockstream.info +greenaddress.it +electrum.org qtornado.com aranguren.org hsmiths.com not.fyi cluelessperson.com bauerj.eu -electrum.org -greenaddress.it +keybaseapi.com +amazonaws.com diff --git a/service-providers/sphinx-socks/src/allowed_hosts.rs b/service-providers/network-requester/src/allowed_hosts.rs similarity index 89% rename from service-providers/sphinx-socks/src/allowed_hosts.rs rename to service-providers/network-requester/src/allowed_hosts.rs index 51e79083584..076074fb14b 100644 --- a/service-providers/sphinx-socks/src/allowed_hosts.rs +++ b/service-providers/network-requester/src/allowed_hosts.rs @@ -54,7 +54,7 @@ impl OutboundRequestFilter { match self.get_domain_root(&trimmed) { Some(domain_root) => { if self.allowed_hosts.contains(&domain_root) { - return true; + true } else { // not in allowed list but it's a domain log::warn!( @@ -62,21 +62,20 @@ impl OutboundRequestFilter { &domain_root ); self.unknown_hosts.maybe_add(&domain_root); - return false; // domain is unknown + false // domain is unknown } } None => { - return false; // the host was either an IP or nonsense. For this release, we'll ignore it. + false // the host was either an IP or nonsense. For this release, we'll ignore it. } - }; + } } fn trim_port(host: &str) -> String { - let mut tmp: Vec<&str> = host.split(":").collect(); + let mut tmp: Vec<&str> = host.split(':').collect(); if tmp.len() > 1 { tmp.pop(); // get rid of last element (port) - let out = tmp.join(":"); //rejoin - out + tmp.join(":") //rejoin } else { host.to_string() } @@ -86,12 +85,12 @@ impl OutboundRequestFilter { fn get_domain_root(&self, host: &str) -> Option<String> { match self.domain_list.parse_domain(host) { Ok(d) => match d.root() { - Some(root) => return Some(root.to_string()), - None => return None, // no domain root matches + Some(root) => Some(root.to_string()), + None => None, // no domain root matches }, Err(_) => { log::warn!("Error parsing domain: {:?}", host); - return None; // domain couldn't be parsed + None // domain couldn't be parsed } } } @@ -108,10 +107,8 @@ impl HostsStore { /// Constructs a new HostsStore pub(crate) fn new(base_dir: PathBuf, filename: PathBuf) -> HostsStore { let storefile = HostsStore::setup_storefile(base_dir, filename); - let hosts = HostsStore::load_from_storefile(&storefile).expect(&format!( - "Could not load hosts from storefile at {:?}", - storefile - )); + let hosts = HostsStore::load_from_storefile(&storefile) + .unwrap_or_else(|_| panic!("Could not load hosts from storefile at {:?}", storefile)); HostsStore { storefile, hosts } } @@ -153,11 +150,9 @@ impl HostsStore { } fn setup_storefile(base_dir: PathBuf, filename: PathBuf) -> PathBuf { - let dirpath = base_dir.join("service-providers").join("sphinx-socks"); - fs::create_dir_all(&dirpath).expect(&format!( - "could not create storage directory at {:?}", - dirpath - )); + let dirpath = base_dir.join("service-providers").join("network-requester"); + fs::create_dir_all(&dirpath) + .unwrap_or_else(|_| panic!("could not create storage directory at {:?}", dirpath)); let storefile = dirpath.join(filename); let exists = std::path::Path::new(&storefile).exists(); if !exists { @@ -208,7 +203,7 @@ mod tests { let allowed_filename = PathBuf::from(format!("allowed-{}.list", random_string())); let unknown_filename = PathBuf::from(&format!("unknown-{}.list", random_string())); let allowed = HostsStore::new(base_dir.clone(), allowed_filename); - let unknown = HostsStore::new(base_dir.clone(), unknown_filename); + let unknown = HostsStore::new(base_dir, unknown_filename); OutboundRequestFilter::new(allowed, unknown) } @@ -270,7 +265,7 @@ mod tests { let allowed_filename = PathBuf::from(format!("allowed-{}.list", random_string())); let unknown_filename = PathBuf::from(&format!("unknown-{}.list", random_string())); let allowed = HostsStore::new(base_dir.clone(), allowed_filename); - let unknown = HostsStore::new(base_dir.clone(), unknown_filename); + let unknown = HostsStore::new(base_dir, unknown_filename); OutboundRequestFilter::new(allowed, unknown) } @@ -301,8 +296,8 @@ mod tests { let (_, base_dir2, unknown_filename) = create_test_storefile(); HostsStore::append(&allowed_storefile, "nymtech.net"); - let allowed = HostsStore::new(base_dir1, allowed_filename.to_path_buf()); - let unknown = HostsStore::new(base_dir2, unknown_filename.to_path_buf()); + let allowed = HostsStore::new(base_dir1, allowed_filename); + let unknown = HostsStore::new(base_dir2, unknown_filename); OutboundRequestFilter::new(allowed, unknown) } #[test] @@ -348,11 +343,9 @@ mod tests { fn create_test_storefile() -> (PathBuf, PathBuf, PathBuf) { let base_dir = test_base_dir(); let filename = PathBuf::from(format!("hosts-store-{}.list", random_string())); - let dirpath = base_dir.join("service-providers").join("sphinx-socks"); - fs::create_dir_all(&dirpath).expect(&format!( - "could not create storage directory at {:?}", - dirpath - )); + let dirpath = base_dir.join("service-providers").join("network-requester"); + fs::create_dir_all(&dirpath) + .unwrap_or_else(|_| panic!("could not create storage directory at {:?}", dirpath)); let storefile = dirpath.join(&filename); File::create(&storefile).unwrap(); (storefile, base_dir, filename) diff --git a/service-providers/sphinx-socks/src/connection.rs b/service-providers/network-requester/src/connection.rs similarity index 77% rename from service-providers/sphinx-socks/src/connection.rs rename to service-providers/network-requester/src/connection.rs index 36b7ba40e96..ef442f4157e 100644 --- a/service-providers/sphinx-socks/src/connection.rs +++ b/service-providers/network-requester/src/connection.rs @@ -1,7 +1,5 @@ use futures::channel::mpsc; -use log::*; use nymsphinx::addressing::clients::Recipient; -use ordered_buffer::OrderedMessageSender; use proxy_helpers::connection_controller::ConnectionReceiver; use proxy_helpers::proxy_runner::ProxyRunner; use socks5_requests::{ConnectionId, RemoteAddress, Response}; @@ -23,18 +21,9 @@ impl Connection { pub(crate) async fn new( id: ConnectionId, address: RemoteAddress, - initial_data: &[u8], return_address: Recipient, ) -> io::Result<Self> { - let mut conn = TcpStream::connect(&address).await?; - - // write the initial data to the connection before continuing - info!( - "Sending initial {} bytes to {}", - initial_data.len(), - address - ); - conn.write_all(initial_data).await?; + let conn = TcpStream::connect(&address).await?; Ok(Connection { id, @@ -50,15 +39,16 @@ impl Connection { mix_sender: mpsc::UnboundedSender<(Response, Recipient)>, ) { let stream = self.conn.take().unwrap(); - let message_sender = OrderedMessageSender::new(); + let remote_source_address = "???".to_string(); // we don't know ip address of requester let connection_id = self.id; let recipient = self.return_address; let (stream, _) = ProxyRunner::new( stream, + self.address.clone(), + remote_source_address, mix_receiver, mix_sender, connection_id, - message_sender, ) .run(move |conn_id, read_data, socket_closed| { (Response::new(conn_id, read_data, socket_closed), recipient) diff --git a/service-providers/network-requester/src/core.rs b/service-providers/network-requester/src/core.rs new file mode 100644 index 00000000000..18de5875447 --- /dev/null +++ b/service-providers/network-requester/src/core.rs @@ -0,0 +1,276 @@ +use crate::allowed_hosts::{HostsStore, OutboundRequestFilter}; +use crate::connection::Connection; +use crate::websocket; +use futures::channel::mpsc; +use futures::stream::{SplitSink, SplitStream}; +use futures::{SinkExt, StreamExt}; +use log::*; +use nymsphinx::addressing::clients::Recipient; +use nymsphinx::receiver::ReconstructedMessage; +use proxy_helpers::connection_controller::{Controller, ControllerCommand, ControllerSender}; +use socks5_requests::{ConnectionId, Request, Response}; +use std::path::PathBuf; +use std::sync::atomic::{AtomicUsize, Ordering}; +use tokio::net::TcpStream; +use tokio_tungstenite::tungstenite::protocol::Message; +use tokio_tungstenite::WebSocketStream; +use websocket::WebsocketConnectionError; +use websocket_requests::{requests::ClientRequest, responses::ServerResponse}; + +// Since it's an atomic, it's safe to be kept static and shared across threads +static ACTIVE_PROXIES: AtomicUsize = AtomicUsize::new(0); + +pub struct ServiceProvider { + listening_address: String, + outbound_request_filter: OutboundRequestFilter, + open_proxy: bool, +} + +impl ServiceProvider { + pub fn new(listening_address: String, open_proxy: bool) -> ServiceProvider { + let allowed_hosts = HostsStore::new( + HostsStore::default_base_dir(), + PathBuf::from("allowed.list"), + ); + + let unknown_hosts = HostsStore::new( + HostsStore::default_base_dir(), + PathBuf::from("unknown.list"), + ); + let outbound_request_filter = OutboundRequestFilter::new(allowed_hosts, unknown_hosts); + ServiceProvider { + listening_address, + outbound_request_filter, + open_proxy, + } + } + + /// Listens for any messages from `mix_reader` that should be written back to the mix network + /// via the `websocket_writer`. + async fn mixnet_response_listener( + mut websocket_writer: SplitSink<WebSocketStream<TcpStream>, Message>, + mut mix_reader: mpsc::UnboundedReceiver<(Response, Recipient)>, + ) { + // TODO: wire SURBs in here once they're available + while let Some((response, return_address)) = mix_reader.next().await { + // make 'request' to native-websocket client + let response_message = ClientRequest::Send { + recipient: return_address, + message: response.into_bytes(), + with_reply_surb: false, + }; + + let message = Message::Binary(response_message.serialize()); + websocket_writer.send(message).await.unwrap(); + } + } + + async fn read_websocket_message( + websocket_reader: &mut SplitStream<WebSocketStream<TcpStream>>, + ) -> Option<ReconstructedMessage> { + while let Some(msg) = websocket_reader.next().await { + let data = msg + .expect("we failed to read from the websocket!") + .into_data(); + + // try to recover the actual message from the mix network... + let deserialized_message = match ServerResponse::deserialize(&data) { + Ok(deserialized) => deserialized, + Err(err) => { + error!( + "Failed to deserialize received websocket message! - {}", + err + ); + continue; + } + }; + + let received = match deserialized_message { + ServerResponse::Received(received) => received, + ServerResponse::Error(err) => { + panic!("received error from native client! - {}", err) + } + _ => unimplemented!("probably should never be reached?"), + }; + return Some(received); + } + None + } + + async fn start_proxy( + conn_id: ConnectionId, + remote_addr: String, + return_address: Recipient, + controller_sender: ControllerSender, + mix_input_sender: mpsc::UnboundedSender<(Response, Recipient)>, + ) { + let mut conn = match Connection::new(conn_id, remote_addr.clone(), return_address).await { + Ok(conn) => conn, + Err(err) => { + error!( + "error while connecting to {:?} ! - {:?}", + remote_addr.clone(), + err + ); + return; + } + }; + + // Connect implies it's a fresh connection - register it with our controller + let (mix_sender, mix_receiver) = mpsc::unbounded(); + controller_sender + .unbounded_send(ControllerCommand::Insert(conn_id, mix_sender)) + .unwrap(); + + let old_count = ACTIVE_PROXIES.fetch_add(1, Ordering::SeqCst); + info!( + "Starting proxy for {} (currently there are {} proxies being handled)", + remote_addr, + old_count + 1 + ); + + // run the proxy on the connection + conn.run_proxy(mix_receiver, mix_input_sender).await; + + // proxy is done - remove the access channel from the controller + controller_sender + .unbounded_send(ControllerCommand::Remove(conn_id)) + .unwrap(); + + let old_count = ACTIVE_PROXIES.fetch_sub(1, Ordering::SeqCst); + info!( + "Proxy for {} is finished (currently there are {} proxies being handled)", + remote_addr, + old_count - 1 + ); + } + + fn handle_proxy_connect( + &mut self, + controller_sender: &mut ControllerSender, + mix_input_sender: &mpsc::UnboundedSender<(Response, Recipient)>, + conn_id: ConnectionId, + remote_addr: String, + return_address: Recipient, + ) { + if !self.open_proxy && !self.outbound_request_filter.check(&remote_addr) { + log::info!("Domain {:?} failed filter check", remote_addr); + return; + } + + let controller_sender_clone = controller_sender.clone(); + let mix_input_sender_clone = mix_input_sender.clone(); + + // and start the proxy for this connection + tokio::spawn(async move { + Self::start_proxy( + conn_id, + remote_addr, + return_address, + controller_sender_clone, + mix_input_sender_clone, + ) + .await + }); + } + + fn handle_proxy_send( + &self, + controller_sender: &mut ControllerSender, + conn_id: ConnectionId, + data: Vec<u8>, + closed: bool, + ) { + controller_sender + .unbounded_send(ControllerCommand::Send(conn_id, data, closed)) + .unwrap() + } + + fn handle_proxy_request( + &mut self, + raw_request: &[u8], + controller_sender: &mut ControllerSender, + mix_input_sender: &mpsc::UnboundedSender<(Response, Recipient)>, + ) { + // try to treat each received mix message as a service provider request + let deserialized_request = match Request::try_from_bytes(&raw_request) { + Ok(request) => request, + Err(err) => { + error!("Failed to deserialized received request! - {}", err); + return; + } + }; + + match deserialized_request { + Request::Connect { + conn_id, + remote_addr, + return_address, + } => self.handle_proxy_connect( + controller_sender, + mix_input_sender, + conn_id, + remote_addr, + return_address, + ), + Request::Send(conn_id, data, closed) => { + self.handle_proxy_send(controller_sender, conn_id, data, closed) + } + } + } + + /// Start all subsystems + pub async fn run(&mut self) { + let websocket_stream = self.connect_websocket(&self.listening_address).await; + + // split the websocket so that we could read and write from separate threads + let (websocket_writer, mut websocket_reader) = websocket_stream.split(); + + // channels responsible for managing messages that are to be sent to the mix network. The receiver is + // going to be used by `mixnet_response_listener` + let (mix_input_sender, mix_input_receiver) = mpsc::unbounded::<(Response, Recipient)>(); + + // controller for managing all active connections + let (mut active_connections_controller, mut controller_sender) = Controller::new(); + tokio::spawn(async move { + active_connections_controller.run().await; + }); + + // start the listener for mix messages + tokio::spawn(async move { + Self::mixnet_response_listener(websocket_writer, mix_input_receiver).await; + }); + + println!("\nAll systems go. Press CTRL-C to stop the server."); + + // for each incoming message from the websocket... (which in 99.99% cases is going to be a mix message) + loop { + let received = match Self::read_websocket_message(&mut websocket_reader).await { + Some(msg) => msg, + None => { + error!("The websocket stream has finished!"); + return; + } + }; + + let raw_message = received.message; + // TODO: here be potential SURB (i.e. received.reply_SURB) + + self.handle_proxy_request(&raw_message, &mut controller_sender, &mix_input_sender) + } + } + + // Make the websocket connection so we can receive incoming Mixnet messages. + async fn connect_websocket(&self, uri: &str) -> WebSocketStream<TcpStream> { + let ws_stream = match websocket::Connection::new(uri).connect().await { + Ok(ws_stream) => { + info!("* connected to local websocket server at {}", uri); + ws_stream + } + Err(WebsocketConnectionError::ConnectionNotEstablished) => { + panic!("Error: websocket connection attempt failed, is the Nym client running?") + } + }; + ws_stream + } +} diff --git a/service-providers/sphinx-socks/src/main.rs b/service-providers/network-requester/src/main.rs similarity index 50% rename from service-providers/sphinx-socks/src/main.rs rename to service-providers/network-requester/src/main.rs index 3082577fcb3..75f74570658 100644 --- a/service-providers/sphinx-socks/src/main.rs +++ b/service-providers/network-requester/src/main.rs @@ -1,14 +1,36 @@ +use clap::{App, Arg, ArgMatches}; + mod allowed_hosts; mod connection; mod core; mod websocket; +const OPEN_PROXY_ARG: &str = "open-proxy"; + +fn parse_args<'a>() -> ArgMatches<'a> { + App::new("Nym Network Requester") + .author("Nymtech") + .arg( + Arg::with_name(OPEN_PROXY_ARG) + .help("specifies whether this network requester should run in 'open-proxy' mode") + .long(OPEN_PROXY_ARG) + .short("o"), + ) + .get_matches() +} + #[tokio::main] async fn main() { setup_logging(); + let matches = parse_args(); + let open_proxy = matches.is_present(OPEN_PROXY_ARG); + if open_proxy { + println!("\n\nYOU HAVE STARTED IN 'OPEN PROXY' MODE. ANYONE WITH YOUR CLIENT ADDRESS CAN MAKE REQUESTS FROM YOUR MACHINE. PLEASE QUIT IF YOU DON'T UNDERSTAND WHAT YOU'RE DOING.\n\n"); + } + let uri = "ws://localhost:1977"; println!("Starting socks5 service provider:"); - let mut server = core::ServiceProvider::new(uri.into()); + let mut server = core::ServiceProvider::new(uri.into(), open_proxy); server.run().await; } diff --git a/service-providers/sphinx-socks/src/websocket.rs b/service-providers/network-requester/src/websocket.rs similarity index 100% rename from service-providers/sphinx-socks/src/websocket.rs rename to service-providers/network-requester/src/websocket.rs diff --git a/service-providers/sphinx-socks/src/core.rs b/service-providers/sphinx-socks/src/core.rs deleted file mode 100644 index ec9fb69be88..00000000000 --- a/service-providers/sphinx-socks/src/core.rs +++ /dev/null @@ -1,205 +0,0 @@ -use crate::allowed_hosts::{HostsStore, OutboundRequestFilter}; -use crate::connection::Connection; -use crate::websocket; -use futures::channel::mpsc; -use futures::stream::SplitSink; -use futures::{SinkExt, StreamExt}; -use log::*; -use nymsphinx::addressing::clients::Recipient; -use ordered_buffer::OrderedMessageBuffer; -use proxy_helpers::connection_controller::{Controller, ControllerCommand}; -use socks5_requests::{Request, Response}; -use std::path::PathBuf; -use tokio::net::TcpStream; -use tokio_tungstenite::tungstenite::protocol::Message; -use tokio_tungstenite::WebSocketStream; -use websocket::WebsocketConnectionError; -use websocket_requests::{requests::ClientRequest, responses::ServerResponse}; - -pub struct ServiceProvider { - listening_address: String, - outbound_request_filter: OutboundRequestFilter, -} - -impl ServiceProvider { - pub fn new(listening_address: String) -> ServiceProvider { - let allowed_hosts = HostsStore::new( - HostsStore::default_base_dir(), - PathBuf::from("allowed.list"), - ); - - let unknown_hosts = HostsStore::new( - HostsStore::default_base_dir(), - PathBuf::from("unknown.list"), - ); - let outbound_request_filter = OutboundRequestFilter::new(allowed_hosts, unknown_hosts); - ServiceProvider { - listening_address, - outbound_request_filter, - } - } - - /// Listens for any messages from `mix_reader` that should be written back to the mix network - /// via the `websocket_writer`. - async fn mixnet_response_listener( - mut websocket_writer: SplitSink<WebSocketStream<TcpStream>, Message>, - mut mix_reader: mpsc::UnboundedReceiver<(Response, Recipient)>, - ) { - // TODO: wire SURBs in here once they're available - while let Some((response, return_address)) = mix_reader.next().await { - // make 'request' to native-websocket client - let response_message = ClientRequest::Send { - recipient: return_address, - message: response.into_bytes(), - with_reply_surb: false, - }; - - let message = Message::Binary(response_message.serialize()); - websocket_writer.send(message).await.unwrap(); - } - } - - /// Start all subsystems - pub async fn run(&mut self) { - let websocket_stream = self.connect_websocket(&self.listening_address).await; - - // split the websocket so that we could read and write from separate threads - let (websocket_writer, mut websocket_reader) = websocket_stream.split(); - - // channels responsible for managing messages that are to be sent to the mix network. The receiver is - // going to be used by `mixnet_response_listener` - let (mix_input_sender, mix_input_receiver) = mpsc::unbounded::<(Response, Recipient)>(); - - // controller for managing all active connections - let (mut active_connections_controller, controller_sender) = Controller::new(); - tokio::spawn(async move { - active_connections_controller.run().await; - }); - - // start the listener for mix messages - tokio::spawn(async move { - Self::mixnet_response_listener(websocket_writer, mix_input_receiver).await; - }); - - println!("\nAll systems go. Press CTRL-C to stop the server."); - - // for each incoming message from the websocket... (which in 99.99% cases is going to be a mix message) - while let Some(msg) = websocket_reader.next().await { - let data = msg - .expect("we failed to read from the websocket!") - .into_data(); - - // try to recover the actual message from the mix network... - let deserialized_message = match ServerResponse::deserialize(&data) { - Ok(deserialized) => deserialized, - Err(err) => { - error!( - "Failed to deserialize received websocket message! - {}", - err - ); - continue; - } - }; - - let received = match deserialized_message { - ServerResponse::Received(received) => received, - ServerResponse::Error(err) => { - panic!("received error from native client! - {}", err) - } - _ => unimplemented!("probably should never be reached?"), - }; - - let raw_message = received.message; - // TODO: here be potential SURB (i.e. received.reply_SURB) - - // try to treat each received mix message as a service provider request - let deserialized_request = match Request::try_from_bytes(&raw_message) { - Ok(request) => request, - Err(err) => { - error!("Failed to deserialized received request! - {}", err); - continue; - } - }; - - match deserialized_request { - Request::Connect { - conn_id, - remote_addr, - message, - return_address, - } => { - if !self.outbound_request_filter.check(&remote_addr) { - log::info!("Domain {:?} failed filter check", remote_addr); - continue; - } - - let controller_sender_clone = controller_sender.clone(); - let mut ordered_buffer = OrderedMessageBuffer::new(); - ordered_buffer.write(message); - let init_data = ordered_buffer - .read() - .expect("we received connect request but it wasn't sequence 0!"); - - // and start the proxy for this connection - let mix_input_sender_clone = mix_input_sender.clone(); - tokio::spawn(async move { - let mut conn = match Connection::new( - conn_id, - remote_addr.clone(), - &init_data, - return_address, - ) - .await - { - Ok(conn) => conn, - Err(err) => { - error!( - "error while connecting to {:?} ! - {:?}", - remote_addr.clone(), - err - ); - return; - } - }; - - // Connect implies it's a fresh connection - register it with our controller - let (mix_sender, mix_receiver) = mpsc::unbounded(); - controller_sender_clone - .unbounded_send(ControllerCommand::Insert( - conn_id, - mix_sender, - ordered_buffer, - )) - .unwrap(); - - info!("Starting proxy for {}", remote_addr.clone()); - conn.run_proxy(mix_receiver, mix_input_sender_clone).await; - // proxy is done - remove the access channel from the controller - controller_sender_clone - .unbounded_send(ControllerCommand::Remove(conn_id)) - .unwrap(); - info!("Proxy for {} is finished", remote_addr); - }); - } - // on send just tell the controller to send that data to the correct connection - Request::Send(conn_id, data, closed) => controller_sender - .unbounded_send(ControllerCommand::Send(conn_id, data, closed)) - .unwrap(), - } - } - } - - // Make the websocket connection so we can receive incoming Mixnet messages. - async fn connect_websocket(&self, uri: &str) -> WebSocketStream<TcpStream> { - let ws_stream = match websocket::Connection::new(uri).connect().await { - Ok(ws_stream) => { - info!("* connected to local websocket server at {}", uri); - ws_stream - } - Err(WebsocketConnectionError::ConnectionNotEstablished) => { - panic!("Error: websocket connection attempt failed, is the Nym client running?") - } - }; - return ws_stream; - } -} diff --git a/validator/Cargo.toml b/validator/Cargo.toml deleted file mode 100644 index 7d5829c00c4..00000000000 --- a/validator/Cargo.toml +++ /dev/null @@ -1,33 +0,0 @@ -[package] -build = "build.rs" -name = "nym-validator" -version = "0.8.1" -authors = ["Dave Hrycyszyn <futurechimp@users.noreply.github.com>", "Jedrzej Stuczynski <andrew@nymtech.net>"] -edition = "2018" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -abci = "0.6.4" -bodyparser = "0.8.0" -byteorder = "1.3.2" -clap = "2.33.0" -dirs = "2.0.2" -dotenv = "0.15.0" -futures = "0.3.1" -iron = "0.6.1" -log = "0.4" -pretty_env_logger = "0.3" -router = "0.6.0" -serde = "1.0.104" -serde_json = "1.0.48" -tokio = { version = "0.2", features = ["full"] } - -## internal -config = { path = "../common/config" } - -[build-dependencies] -built = "0.4.3" - -[dev-dependencies] -tempfile = "3.1.0" \ No newline at end of file diff --git a/validator/README.md b/validator/README.md deleted file mode 100644 index 47b90bec59d..00000000000 --- a/validator/README.md +++ /dev/null @@ -1,21 +0,0 @@ -Nym Validator -============= - -The Nym Validator has several jobs: - -* use Tendermint (v0.33.0) to maintain a total global ordering of incoming transactions -* rewards + stake slashing based quality of service measurements for mixnet nodes (aka "mixmining") -* generate Coconut credentials and ensure they're not double spent -* maintain a decentralized directory of all Nym nodes that have staked into the system - -Some of these functions may be moved away to their own node types in the future, for example to increase scalability or performance. At the moment, we'd like to keep deployments simple, so they're all in the validator node. - -Running the validator on your local machine -------------------------------------------- - -1. Download and install [Tendermint 0.32.7](https://github.com/tendermint/tendermint/releases/tag/v0.32.7) -2. `tendermint init` sets up Tendermint for use -3. `tendermint node` runs Tendermint. You'll get errors until you run the Nym validator, this is normal :). -4. `cp sample-configs/validator-config.toml.sample sample-configs/validator-config.toml` -5. `cargo run -- run --config ../sample-configs/validator-config.toml` builds the Nym Validator and runs it - diff --git a/validator/build.rs b/validator/build.rs deleted file mode 100644 index 56d753472cf..00000000000 --- a/validator/build.rs +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -use built; - -fn main() { - built::write_built_file().expect("Failed to acquire build-time information"); -} diff --git a/validator/diesel.toml b/validator/diesel.toml deleted file mode 100644 index 92267c829f2..00000000000 --- a/validator/diesel.toml +++ /dev/null @@ -1,5 +0,0 @@ -# For documentation on how to configure this file, -# see diesel.rs/guides/configuring-diesel-cli - -[print_schema] -file = "src/schema.rs" diff --git a/validator/src/built_info.rs b/validator/src/built_info.rs deleted file mode 100644 index 38b46d59e64..00000000000 --- a/validator/src/built_info.rs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -// The file has been placed there by the build script. -include!(concat!(env!("OUT_DIR"), "/built.rs")); diff --git a/validator/src/commands/init.rs b/validator/src/commands/init.rs deleted file mode 100644 index d3efa040644..00000000000 --- a/validator/src/commands/init.rs +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -use crate::commands::override_config; -use clap::{App, Arg, ArgMatches}; -use config::NymConfig; - -pub fn command_args<'a, 'b>() -> clap::App<'a, 'b> { - App::new("init") - .about("Initialise the validator") - .arg( - Arg::with_name("id") - .long("id") - .help("Id of the nym-validator we want to create config for.") - .takes_value(true) - .required(true), - ) - .arg( - Arg::with_name("location") - .long("location") - .help("Optional geographical location of this node") - .takes_value(true), - ) - .arg( - Arg::with_name("directory") - .long("directory") - .help("Address of the directory server the validator is sending presence to and uses for mix mining") - .takes_value(true), - ) -} - -pub fn execute(matches: &ArgMatches) { - let id = matches.value_of("id").unwrap(); - println!("Initialising validator {}...", id); - - let mut config = crate::config::Config::new(id); - - config = override_config(config, matches); - - let config_save_location = config.get_config_file_save_location(); - config - .save_to_file(None) - .expect("Failed to save the config file"); - println!("Saved configuration file to {:?}", config_save_location); - - println!("Validator configuration completed.\n\n\n") -} diff --git a/validator/src/commands/mod.rs b/validator/src/commands/mod.rs deleted file mode 100644 index 01b11b3a470..00000000000 --- a/validator/src/commands/mod.rs +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -use crate::config::Config; -use clap::ArgMatches; - -pub mod init; -pub mod run; - -pub(crate) fn override_config(mut config: Config, matches: &ArgMatches) -> Config { - if let Some(directory) = matches.value_of("directory") { - config = config.with_custom_directory(directory); - } - - if let Some(location) = matches.value_of("location") { - config = config.with_location(location); - } - - config -} diff --git a/validator/src/commands/run.rs b/validator/src/commands/run.rs deleted file mode 100644 index cc636163e3c..00000000000 --- a/validator/src/commands/run.rs +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -// Commenting config out temporarily, we'll undoubtedly need it back soon. -// use crate::commands::override_config; -// use crate::config::Config; -// use config::NymConfig; -use crate::validator::Validator; -use clap::{App, Arg, ArgMatches}; - -pub fn command_args<'a, 'b>() -> clap::App<'a, 'b> { - App::new("run") - .about("Starts the validator") - .arg( - Arg::with_name("id") - .long("id") - .help("Id of the nym-validator we want to run") - .takes_value(true) - .required(true), - ) - // the rest of arguments are optional, they are used to override settings in config file - .arg( - Arg::with_name("location") - .long("location") - .help("Optional geographical location of this node") - .takes_value(true), - ) - .arg( - Arg::with_name("config") - .long("config") - .help("Custom path to the nym-validator configuration file") - .takes_value(true), - ) - .arg( - Arg::with_name("directory") - .long("directory") - .help("Address of the directory server the validator is sending presence to and uses for mix mining") - .takes_value(true), - ) -} - -pub fn execute(matches: &ArgMatches) { - let id = matches.value_of("id").unwrap(); - - println!("Starting validator {}...", id); - - // let mut config = - // Config::load_from_file(matches.value_of("config").map(|path| path.into()), Some(id)) - // .expect("Failed to load config file"); - - // config = override_config(config, matches); - - let validator = Validator::new(); - validator.start() -} diff --git a/validator/src/config/mod.rs b/validator/src/config/mod.rs deleted file mode 100644 index 1bd21771ea3..00000000000 --- a/validator/src/config/mod.rs +++ /dev/null @@ -1,263 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -use crate::config::template::config_template; -use config::NymConfig; -use serde::{Deserialize, Serialize}; -use std::path::PathBuf; -use std::time; - -mod template; - -// where applicable, the below are defined in milliseconds -const DEFAULT_DIRECTORY_SERVER: &str = "https://directory.nymtech.net"; - -// 'MIXMINING' -const DEFAULT_MIX_MINING_DELAY: u64 = 10_000; -const DEFAULT_MIX_MINING_RESOLUTION_TIMEOUT: u64 = 5_000; -const DEFAULT_MIX_MINING_CONNECTION_TIMEOUT: u64 = 1_500; - -const DEFAULT_NUMBER_OF_MIX_MINING_TEST_PACKETS: u64 = 2; - -// 'DEBUG' -const DEFAULT_PRESENCE_SENDING_DELAY: u64 = 3000; - -#[derive(Debug, Default, Deserialize, PartialEq, Serialize)] -#[serde(deny_unknown_fields)] -pub struct Config { - validator: Validator, - - mix_mining: MixMining, - - tendermint: Tendermint, - - #[serde(default)] - logging: Logging, - #[serde(default)] - debug: Debug, -} - -impl NymConfig for Config { - fn template() -> &'static str { - config_template() - } - - fn config_file_name() -> String { - "config.toml".to_string() - } - - fn default_root_directory() -> PathBuf { - dirs::home_dir() - .expect("Failed to evaluate $HOME value") - .join(".nym") - .join("validators") - } - - fn root_directory(&self) -> PathBuf { - self.validator.nym_root_directory.clone() - } - - fn config_directory(&self) -> PathBuf { - self.validator - .nym_root_directory - .join(&self.validator.id) - .join("config") - } - - fn data_directory(&self) -> PathBuf { - self.validator - .nym_root_directory - .join(&self.validator.id) - .join("data") - } -} - -impl Config { - pub fn new<S: Into<String>>(id: S) -> Self { - Config::default().with_id(id) - } - - // builder methods - pub fn with_id<S: Into<String>>(mut self, id: S) -> Self { - let id = id.into(); - - // calls to any defaults requiring id (see: client, mixnode, provider): - - self.validator.id = id; - self - } - - pub fn with_custom_directory<S: Into<String>>(mut self, directory_server: S) -> Self { - let directory_server_string = directory_server.into(); - self.debug.presence_directory_server = directory_server_string.clone(); - self.mix_mining.directory_server = directory_server_string; - self - } - - pub fn with_location<S: Into<String>>(mut self, location: S) -> Self { - self.validator.location = location.into(); - self - } - - // getters - pub fn get_config_file_save_location(&self) -> PathBuf { - self.config_directory().join(Self::config_file_name()) - } - - #[allow(dead_code)] - pub fn get_location(&self) -> String { - self.validator.location.clone() - } - - // dead_code until validator actually sends the presence data - #[allow(dead_code)] - pub fn get_presence_directory_server(&self) -> String { - self.debug.presence_directory_server.clone() - } - - #[allow(dead_code)] - pub fn get_presence_sending_delay(&self) -> time::Duration { - time::Duration::from_millis(self.debug.presence_sending_delay) - } -} - -#[derive(Debug, Deserialize, PartialEq, Serialize)] -#[serde(deny_unknown_fields)] -pub struct Validator { - /// ID specifies the human readable ID of this particular validator. - id: String, - - /// Completely optional value specifying geographical location of this particular node. - /// Currently it's used entirely for debug purposes, as there are no mechanisms implemented - /// to verify correctness of the information provided. However, feel free to fill in - /// this field with as much accuracy as you wish to share. - location: String, - - /// nym_home_directory specifies absolute path to the home nym MixNodes directory. - /// It is expected to use default value and hence .toml file should not redefine this field. - nym_root_directory: PathBuf, -} - -impl Validator { - fn default_location() -> String { - "unknown".into() - } -} - -impl Default for Validator { - fn default() -> Self { - Validator { - id: "".to_string(), - location: Self::default_location(), - nym_root_directory: Config::default_root_directory(), - } - } -} - -#[derive(Debug, Deserialize, PartialEq, Serialize)] -#[serde(deny_unknown_fields)] -pub struct MixMining { - /// Directory server from which the validator will obtain initial topology. - directory_server: String, - - /// The uniform delay every which validator are running their mix-mining procedure. - /// The provided value is interpreted as milliseconds. - run_delay: u64, - - /// During the mix-mining process, test packets are sent through various network - /// paths. This timeout determines waiting period until it is decided that the packet - /// did not reach its destination. - /// The provided value is interpreted as milliseconds. - resolution_timeout: u64, - - /// Timeout for trying to establish connection to node endpoints. - /// The provided value is interpreted as milliseconds. - connection_timeout: u64, - - /// How many packets should be sent through each path during the mix-mining procedure. - number_of_test_packets: u64, -} - -impl Default for MixMining { - fn default() -> Self { - MixMining { - directory_server: "https://directory.nymtech.net".to_string(), - run_delay: DEFAULT_MIX_MINING_DELAY, - resolution_timeout: DEFAULT_MIX_MINING_RESOLUTION_TIMEOUT, - number_of_test_packets: DEFAULT_NUMBER_OF_MIX_MINING_TEST_PACKETS, - connection_timeout: DEFAULT_MIX_MINING_CONNECTION_TIMEOUT, - } - } -} - -#[derive(Debug, Deserialize, PartialEq, Serialize)] -#[serde(deny_unknown_fields)] -pub struct Tendermint {} - -impl Default for Tendermint { - fn default() -> Self { - Tendermint {} - } -} - -#[derive(Debug, Deserialize, PartialEq, Serialize)] -#[serde(deny_unknown_fields)] -pub struct Logging {} - -impl Default for Logging { - fn default() -> Self { - Logging {} - } -} - -#[derive(Debug, Deserialize, PartialEq, Serialize)] -#[serde(default, deny_unknown_fields)] -pub struct Debug { - /// Directory server to which the server will be reporting their presence data. - presence_directory_server: String, - - /// Delay between each subsequent presence data being sent. - presence_sending_delay: u64, -} - -impl Debug {} - -impl Default for Debug { - fn default() -> Self { - Debug { - presence_directory_server: DEFAULT_DIRECTORY_SERVER.to_string(), - presence_sending_delay: DEFAULT_PRESENCE_SENDING_DELAY, - } - } -} - -#[cfg(test)] -mod validator_config { - use super::*; - - #[test] - fn after_saving_default_config_the_loaded_one_is_identical() { - // need to figure out how to do something similar but without touching the disk - // or the file system at all... - let temp_location = tempfile::tempdir().unwrap().path().join("config.toml"); - let default_config = Config::default().with_id("foomp".to_string()); - default_config - .save_to_file(Some(temp_location.clone())) - .unwrap(); - - let loaded_config = Config::load_from_file(Some(temp_location), None).unwrap(); - - assert_eq!(default_config, loaded_config); - } -} diff --git a/validator/src/config/template.rs b/validator/src/config/template.rs deleted file mode 100644 index 7525dc7a8cd..00000000000 --- a/validator/src/config/template.rs +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -pub(crate) fn config_template() -> &'static str { - // While using normal toml marshalling would have been way simpler with less overhead, - // I think it's useful to have comments attached to the saved config file to explain behaviour of - // particular fields. - // Note: any changes to the template must be reflected in the appropriate structs in mod.rs. - r#" -# This is a TOML config file. -# For more information, see https://github.com/toml-lang/toml - -##### main base mixnode config options ##### - -[validator] -# Human readable ID of this particular validator. -id = '{{ validator.id }}' - -# Completely optional value specifying geographical location of this particular node. -# Currently it's used entirely for debug purposes, as there are no mechanisms implemented -# to verify correctness of the information provided. However, feel free to fill in -# this field with as much accuracy as you wish to share. -location = '{{ validator.location }}' - -##### advanced configuration options ##### - -# nym_home_directory specifies absolute path to the home nym validators directory. -# It is expected to use default value and hence .toml file should not redefine this field. -nym_root_directory = '{{ validator.nym_root_directory }}' - - -##### mix mining config options ##### - -[mix_mining] - -# Directory server from which the validator will obtain initial topology. -directory_server = '{{ mix_mining.directory_server }}' - -# The uniform delay every which validator are running their mix-mining procedure. -# The provided value is interpreted as milliseconds. -run_delay = {{ mix_mining.run_delay }} - -# During the mix-mining process, test packets are sent through various network -# paths. This timeout determines waiting period until it is decided that the packet -# did not reach its destination. -# The provided value is interpreted as milliseconds. -resolution_timeout = {{ mix_mining.resolution_timeout }} - -# Timeout for trying to establish connection to node endpoints. -# The provided value is interpreted as milliseconds. -connection_timeout = {{ mix_mining.connection_timeout }} - -# How many packets should be sent through each path during the mix-mining procedure. -number_of_test_packets = {{ mix_mining.number_of_test_packets }} - - -##### tendermint config options ##### - -[tendermint] - - - -##### logging configuration options ##### - -[logging] - -# TODO - -"# -} diff --git a/validator/src/main.rs b/validator/src/main.rs deleted file mode 100644 index 4ce74cc1690..00000000000 --- a/validator/src/main.rs +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -use clap::{App, ArgMatches}; - -pub mod built_info; -mod commands; -mod config; -mod network; -mod services; -mod validator; - -fn main() { - dotenv::dotenv().ok(); - setup_logging(); - println!("{}", banner()); - - let arg_matches = App::new("Nym Validator") - .version(built_info::PKG_VERSION) - .author("Nymtech") - .about("Implementation of Nym Validator") - .subcommand(commands::init::command_args()) - .subcommand(commands::run::command_args()) - .get_matches(); - - execute(arg_matches); -} - -fn execute(matches: ArgMatches) { - match matches.subcommand() { - ("init", Some(m)) => commands::init::execute(m), - ("run", Some(m)) => commands::run::execute(m), - _ => println!("{}", usage()), - } -} - -fn usage() -> &'static str { - "usage: --help to see available options.\n\n" -} - -fn banner() -> String { - format!( - r#" - - _ __ _ _ _ __ ___ - | '_ \| | | | '_ \ _ \ - | | | | |_| | | | | | | - |_| |_|\__, |_| |_| |_| - |___/ - - (validator - version {:}) - - "#, - built_info::PKG_VERSION - ) -} - -fn setup_logging() { - let mut log_builder = pretty_env_logger::formatted_timed_builder(); - if let Ok(s) = ::std::env::var("RUST_LOG") { - log_builder.parse_filters(&s); - } else { - // default to 'Info' - log_builder.filter(None, log::LevelFilter::Info); - } - - log_builder - .filter_module("hyper", log::LevelFilter::Warn) - .filter_module("tokio_reactor", log::LevelFilter::Warn) - .filter_module("reqwest", log::LevelFilter::Warn) - .filter_module("mio", log::LevelFilter::Warn) - .filter_module("want", log::LevelFilter::Warn) - .init(); -} diff --git a/validator/src/network/mod.rs b/validator/src/network/mod.rs deleted file mode 100644 index 1084c25e7aa..00000000000 --- a/validator/src/network/mod.rs +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -//! The `network` module provides interfaces to external systems via network -//! connectivity. -//! -pub mod rest; -pub mod tendermint; diff --git a/validator/src/network/rest/capacity/mod.rs b/validator/src/network/rest/capacity/mod.rs deleted file mode 100644 index 68130234012..00000000000 --- a/validator/src/network/rest/capacity/mod.rs +++ /dev/null @@ -1,59 +0,0 @@ -use serde::{Deserialize, Serialize}; - -use super::*; -use bodyparser::Struct; -use iron::mime::Mime; -use iron::status; -use iron::Handler; - -/// Holds data for a capacity update (json) -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct Capacity { - value: usize, -} - -pub struct Update { - service: Arc<Mutex<mixmining::Service>>, -} - -impl Update { - pub fn new(service: Arc<Mutex<mixmining::Service>>) -> Update { - Update { service } - } -} - -impl Handler for Update { - fn handle(&self, req: &mut Request) -> IronResult<Response> { - let json_parse = req.get::<Struct<Capacity>>(); - - match json_parse { - Ok(capacity) => { - let capacity = capacity.expect("Unexpected JSON parsing problem").value; - self.service.lock().unwrap().set_capacity(capacity); - Ok(Response::with(status::Created)) - } - Err(err) => Ok(Response::with((status::BadRequest, err.detail))), - } - } -} - -pub struct Get { - service: Arc<Mutex<mixmining::Service>>, -} - -impl Get { - pub fn new(service: Arc<Mutex<mixmining::Service>>) -> Get { - Get { service } - } -} - -impl Handler for Get { - fn handle(&self, _: &mut Request) -> IronResult<Response> { - let content_type = "application/json".parse::<Mime>().unwrap(); - let value = self.service.lock().unwrap().capacity(); - let c = Capacity { value }; - let json = serde_json::to_string(&c).unwrap(); - Ok(Response::with((content_type, status::Ok, json))) - } -} diff --git a/validator/src/network/rest/mod.rs b/validator/src/network/rest/mod.rs deleted file mode 100644 index 4b991caf00b..00000000000 --- a/validator/src/network/rest/mod.rs +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. -use crate::services::mixmining; -use iron::prelude::*; -use presence::mixnode; -use presence::topology; -use router::Router; -use std::sync::{Arc, Mutex}; - -mod capacity; -mod presence; -mod staking; - -pub struct Api { - mixmining_service: Arc<Mutex<mixmining::Service>>, -} - -impl Api { - pub fn new(mixmining_service: mixmining::Service) -> Api { - let service = Arc::new(Mutex::new(mixmining_service)); - Api { - mixmining_service: service, - } - } - - /// Run the REST API. - pub async fn run(self) { - let port = 3000; // TODO: make this configurable - let address = format!("localhost:{}", port); - println!("* starting REST API on http://{}", address); - - let router = self.setup_router(); - - Iron::new(router).http(address).unwrap(); - } - - /// Tie together URL route paths with handler functions. - fn setup_router(self) -> Router { - // define a Router to hold our routes - let mut router = Router::new(); - - // set up handlers - let capacity_update = capacity::Update::new(Arc::clone(&self.mixmining_service)); - let capacity_get = capacity::Get::new(Arc::clone(&self.mixmining_service)); - let presence_mixnode_create = - mixnode::CreatePresence::new(Arc::clone(&self.mixmining_service)); - let topology_get = topology::GetTopology::new(Arc::clone(&self.mixmining_service)); - - // tie routes to handlers - router.get("/capacity", capacity_get, "capacity_get"); - router.post("/capacity", capacity_update, "capacity_update"); - router.get("/topology", topology_get, "topology_get"); - router.post( - "/presence/mixnodes", - presence_mixnode_create, - "presence_mixnodes_post", - ); - - router - } -} diff --git a/validator/src/network/rest/models/presence.rs b/validator/src/network/rest/models/presence.rs deleted file mode 100644 index a2a781a236a..00000000000 --- a/validator/src/network/rest/models/presence.rs +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -use serde::{Deserialize, Serialize}; - -// Topology shows us the current state of the overall Nym network -#[derive(Serialize, Deserialize, Debug)] -pub struct Topology { - pub validators: Vec<Validator>, - pub mix_nodes: Vec<MixNode>, - pub service_providers: Vec<ServiceProvider>, -} - -#[derive(Serialize, Deserialize, Debug)] -pub struct Validator { - host: String, - public_key: String, - version: String, - last_seen: u64, - location: String, -} - -#[derive(Serialize, Deserialize, Debug)] -pub struct MixNode { - host: String, - public_key: String, - version: String, - last_seen: u64, - location: String, -} - -#[derive(Serialize, Deserialize, Debug)] -pub struct ServiceProvider { - host: String, - public_key: String, - version: String, - last_seen: u64, - location: String, -} diff --git a/validator/src/network/rest/presence/conversions.rs b/validator/src/network/rest/presence/conversions.rs deleted file mode 100644 index eae70296cf8..00000000000 --- a/validator/src/network/rest/presence/conversions.rs +++ /dev/null @@ -1,135 +0,0 @@ -use super::models::Timestamp; -use crate::network::rest::presence::models::Mixnode as RestMixnode; -use crate::network::rest::presence::models::Topology as RestTopology; -use crate::services::mixmining::models::Mixnode as ServiceMixnode; -use crate::services::mixmining::models::Topology as ServiceTopology; -use std::convert::From; - -impl ServiceMixnode { - pub fn from_rest_mixnode_with_timestamp( - rest_mix: RestMixnode, - timestamp: Timestamp, - ) -> ServiceMixnode { - ServiceMixnode { - host: rest_mix.host, - last_seen: timestamp.into(), - location: rest_mix.location, - public_key: rest_mix.public_key, - stake: 0, - version: rest_mix.version, - } - } -} - -impl From<ServiceMixnode> for RestMixnode { - fn from(value: ServiceMixnode) -> RestMixnode { - RestMixnode { - host: value.host, - location: value.location, - public_key: value.public_key, - version: value.version, - } - } -} - -impl ServiceTopology { - #[cfg(test)] // un-testify this when you need it for real code, this kills warning - pub fn from_rest_topology_with_timestamp( - rest_topology: RestTopology, - timestamp: Timestamp, - ) -> ServiceTopology { - let mut converted_mixnodes: Vec<ServiceMixnode> = Vec::new(); - for mixnode in rest_topology.mixnodes { - converted_mixnodes.push(ServiceMixnode::from_rest_mixnode_with_timestamp( - mixnode, timestamp, - )); - } - ServiceTopology { - mixnodes: converted_mixnodes.to_vec(), - service_providers: vec![], // add these when conversions exist - validators: vec![], // add these when conversions exist - } - } -} - -impl From<ServiceTopology> for RestTopology { - fn from(value: ServiceTopology) -> RestTopology { - let mut converted_mixnodes: Vec<RestMixnode> = Vec::new(); - for mixnode in value.mixnodes { - converted_mixnodes.push(mixnode.into()); - } - RestTopology { - mixnodes: converted_mixnodes.to_vec(), - service_providers: vec![], // add these when conversions exist - validators: vec![], // add these when conversions exist - } - } -} - -#[cfg(test)] -mod test_presence_conversions_for_mixmining_service { - fn rest_mixnode_fixture() -> RestMixnode { - RestMixnode { - host: "foo.org".to_owned(), - public_key: "abc".to_owned(), - location: "London".to_owned(), - version: "1.0.0".to_owned(), - } - } - - fn service_mixnode_fixture() -> ServiceMixnode { - ServiceMixnode { - host: "foo.org".to_owned(), - public_key: "abc".to_owned(), - last_seen: 1234, - location: "London".to_owned(), - stake: 0, - version: "1.0.0".to_owned(), - } - } - - use super::*; - - #[test] - fn test_building_service_mixnode_from_rest_mixnode() { - let rest_mixnode = rest_mixnode_fixture(); - let timestamp = Timestamp::default(); - let service_mixnode = - ServiceMixnode::from_rest_mixnode_with_timestamp(rest_mixnode.clone(), timestamp); - assert_eq!(service_mixnode.host, rest_mixnode.host); - assert_eq!(service_mixnode.public_key, rest_mixnode.public_key); - assert_eq!(service_mixnode.location, rest_mixnode.location); - assert_eq!(service_mixnode.stake, 0); - assert_eq!(service_mixnode.version, rest_mixnode.version); - // I'm not going to test the last_seen timestamp as I can't be bothered - // setting up a fake clock right now. - // The behaviour is: it should set time to SystemTime::now(). - } - - #[test] - fn test_building_rest_mixnode_from_service_mixnode() { - let service_mixnode = service_mixnode_fixture(); - let rest_mixnode = RestMixnode::from(service_mixnode.clone()); - assert_eq!(rest_mixnode.host, service_mixnode.host); - assert_eq!(rest_mixnode.public_key, service_mixnode.public_key); - assert_eq!(rest_mixnode.location, service_mixnode.location); - assert_eq!(rest_mixnode.version, service_mixnode.version); - } - - #[test] - fn test_building_service_topology_from_rest_topology() { - let rest_mixnode = rest_mixnode_fixture(); - let rest_topology = RestTopology { - mixnodes: vec![rest_mixnode.clone()], - service_providers: vec![], - validators: vec![], - }; - - let timestamp = Timestamp::default(); - let service_topology = - ServiceTopology::from_rest_topology_with_timestamp(rest_topology, timestamp); - let service_mixnode = - ServiceMixnode::from_rest_mixnode_with_timestamp(rest_mixnode, timestamp); - assert_eq!(service_mixnode, service_topology.mixnodes[0]); - } -} diff --git a/validator/src/network/rest/presence/mixnode.rs b/validator/src/network/rest/presence/mixnode.rs deleted file mode 100644 index aa57f6d2faf..00000000000 --- a/validator/src/network/rest/presence/mixnode.rs +++ /dev/null @@ -1,38 +0,0 @@ -use super::*; -use crate::network::rest::presence::models::Mixnode as PresenceMixnode; -use crate::services::mixmining::models::Mixnode as ServiceMixnode; -use bodyparser::Struct; -use iron::status; -use iron::Handler; -use models::Timestamp; - -pub struct CreatePresence { - service: Arc<Mutex<mixmining::Service>>, -} - -impl CreatePresence { - pub fn new(service: Arc<Mutex<mixmining::Service>>) -> CreatePresence { - CreatePresence { service } - } -} - -impl Handler for CreatePresence { - fn handle(&self, req: &mut Request) -> IronResult<Response> { - let json_parse = req.get::<Struct<PresenceMixnode>>(); - - match json_parse { - Ok(mixnode) => { - let mixnode = mixnode.expect("Unexpected JSON parsing problem"); - self.service - .lock() - .unwrap() - .add(ServiceMixnode::from_rest_mixnode_with_timestamp( - mixnode, - Timestamp::default(), - )); - Ok(Response::with(status::Created)) - } - Err(err) => Ok(Response::with((status::BadRequest, err.detail))), - } - } -} diff --git a/validator/src/network/rest/presence/mod.rs b/validator/src/network/rest/presence/mod.rs deleted file mode 100644 index 108d75277ea..00000000000 --- a/validator/src/network/rest/presence/mod.rs +++ /dev/null @@ -1,6 +0,0 @@ -use super::*; - -mod conversions; -pub mod mixnode; -mod models; -pub mod topology; diff --git a/validator/src/network/rest/presence/models.rs b/validator/src/network/rest/presence/models.rs deleted file mode 100644 index b4efde28086..00000000000 --- a/validator/src/network/rest/presence/models.rs +++ /dev/null @@ -1,66 +0,0 @@ -use serde::{Deserialize, Serialize}; -use std::time::{SystemTime, UNIX_EPOCH}; - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct Mixnode { - pub host: String, - pub public_key: String, - pub version: String, - pub location: String, -} - -#[derive(Serialize, Deserialize, Debug, PartialEq)] -#[serde(rename_all = "camelCase")] -pub struct ServiceProvider { - host: String, - public_key: String, - version: String, - last_seen: u64, - location: String, -} - -/// Topology shows us the current state of the overall Nym network -#[derive(Serialize, Deserialize, Debug, PartialEq)] -#[serde(rename_all = "camelCase")] -pub struct Topology { - pub mixnodes: Vec<Mixnode>, - pub service_providers: Vec<ServiceProvider>, - pub validators: Vec<Validator>, -} - -#[derive(Serialize, Deserialize, Debug, PartialEq)] -#[serde(rename_all = "camelCase")] -pub struct Validator { - host: String, - public_key: String, - version: String, - last_seen: u64, - location: String, -} - -#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy, PartialOrd, Ord)] -pub struct Timestamp(u64); - -impl Default for Timestamp { - fn default() -> Timestamp { - Timestamp( - SystemTime::now() - .duration_since(UNIX_EPOCH) - .unwrap() - .as_millis() as u64, - ) - } -} - -impl From<u64> for Timestamp { - fn from(v: u64) -> Timestamp { - Timestamp(v) - } -} - -impl Into<u64> for Timestamp { - fn into(self) -> u64 { - self.0 - } -} diff --git a/validator/src/network/rest/presence/topology.rs b/validator/src/network/rest/presence/topology.rs deleted file mode 100644 index 46517c62f70..00000000000 --- a/validator/src/network/rest/presence/topology.rs +++ /dev/null @@ -1,23 +0,0 @@ -use super::*; -use iron::status; -use iron::Handler; - -pub struct GetTopology { - service: Arc<Mutex<mixmining::Service>>, -} - -impl GetTopology { - pub fn new(service: Arc<Mutex<mixmining::Service>>) -> GetTopology { - GetTopology { service } - } -} - -impl Handler for GetTopology { - fn handle(&self, _req: &mut Request) -> IronResult<Response> { - println!("Getting topology!..."); - let service_topology = self.service.lock().unwrap().topology(); - let topology = models::Topology::from(service_topology); - let response = serde_json::to_string_pretty(&topology).unwrap(); - Ok(Response::with((status::Ok, response))) - } -} diff --git a/validator/src/network/rest/routes/topology.rs b/validator/src/network/rest/routes/topology.rs deleted file mode 100644 index d2783cbfc70..00000000000 --- a/validator/src/network/rest/routes/topology.rs +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -use super::*; -use crate::network::rest::models::presence::{MixNode, ServiceProvider, Topology, Validator}; - -pub fn get(_req: &mut Request) -> IronResult<Response> { - let topology = Topology { - mix_nodes: Vec::<MixNode>::new(), - service_providers: Vec::<ServiceProvider>::new(), - validators: Vec::<Validator>::new(), - }; - let response = serde_json::to_string_pretty(&topology).unwrap(); - Ok(Response::with((status::Ok, response))) -} diff --git a/validator/src/network/rest/staking/mod.rs b/validator/src/network/rest/staking/mod.rs deleted file mode 100644 index b4780ebde8d..00000000000 --- a/validator/src/network/rest/staking/mod.rs +++ /dev/null @@ -1 +0,0 @@ -// pub struct StakeUpdate {} diff --git a/validator/src/network/tendermint/mod.rs b/validator/src/network/tendermint/mod.rs deleted file mode 100644 index 140a8153be6..00000000000 --- a/validator/src/network/tendermint/mod.rs +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -use abci::*; -use byteorder::{BigEndian, ByteOrder}; - -// Convert incoming tx network data to the proper BigEndian size. txs.len() > 8 will return 0 -fn convert_tx(tx: &[u8]) -> u64 { - if tx.len() < 8 { - let pad = 8 - tx.len(); - let mut x = vec![0; pad]; - x.extend_from_slice(tx); - return BigEndian::read_u64(x.as_slice()); - } - BigEndian::read_u64(tx) -} - -pub struct Abci { - count: u64, -} - -impl Abci { - pub fn new() -> Abci { - Abci { count: 0 } - } - - pub async fn run(self) { - println!("* starting Tendermint abci"); - abci::run_local(self); - } -} - -impl abci::Application for Abci { - // Validate transactions. Rule: Transactions must be incremental: 1,2,3,4... - fn check_tx(&mut self, req: &RequestCheckTx) -> ResponseCheckTx { - // Get the Tx [u8] and convert to u64 - let c = convert_tx(req.get_tx()); - let mut response = ResponseCheckTx::new(); - - // Validation logic - if c != self.count + 1 { - response.set_code(1); - response.set_log(String::from("Count must be incremental!")); - return response; - } - - // Update state to keep state correct for next check_tx call - self.count = c; - response - } - - fn deliver_tx(&mut self, req: &RequestDeliverTx) -> ResponseDeliverTx { - // Get the Tx [u8] - let c = convert_tx(req.get_tx()); - // Update state - self.count = c; - // Return default code 0 == bueno - ResponseDeliverTx::new() - } - - fn commit(&mut self, _req: &RequestCommit) -> ResponseCommit { - // Create the response - let mut response = ResponseCommit::new(); - // Convert count to bits - let mut buf = [0; 8]; - BigEndian::write_u64(&mut buf, self.count); - // Set data so last state is included in the block - response.set_data(buf.to_vec()); - response - } -} diff --git a/validator/src/schema.rs b/validator/src/schema.rs deleted file mode 100644 index 8b137891791..00000000000 --- a/validator/src/schema.rs +++ /dev/null @@ -1 +0,0 @@ - diff --git a/validator/src/services/mixmining/db.rs b/validator/src/services/mixmining/db.rs deleted file mode 100644 index c53a2e19f0b..00000000000 --- a/validator/src/services/mixmining/db.rs +++ /dev/null @@ -1,105 +0,0 @@ -use super::Mixnode; - -/// A (currently RAM-based) data store to keep tabs on which nodes have what -/// stake assigned to them. -#[derive(Clone, Debug, PartialEq)] -pub struct MixminingDb { - mixnodes: Vec<Mixnode>, - capacity: usize, -} - -impl MixminingDb { - pub fn new() -> MixminingDb { - let mixnodes = Vec::<Mixnode>::new(); - MixminingDb { - capacity: 6, - mixnodes, - } - } - - pub fn add(&mut self, mixnode: Mixnode) { - self.mixnodes.push(mixnode); - } - - pub fn get_mixnodes(&self) -> &Vec<Mixnode> { - &self.mixnodes - } - - pub fn set_capacity(&mut self, capacity: usize) { - self.capacity = capacity; - } - - pub fn capacity(&self) -> usize { - self.capacity - } -} - -#[cfg(test)] -mod capacity { - use super::*; - - #[test] - fn starts_at_6() { - let db = MixminingDb::new(); - assert_eq!(6, db.capacity()); - } - - #[test] - fn setting_and_getting_work() { - let mut db = MixminingDb::new(); - db.set_capacity(1); - assert_eq!(1, db.capacity()); - } -} - -#[cfg(test)] -mod adding_and_retrieving_mixnodes { - use super::*; - - #[test] - fn add_and_retrieve_one_works() { - let node = fake_mixnode("London, UK"); - let mut db = MixminingDb::new(); - - db.add(node.clone()); - - assert_eq!(&node, db.get_mixnodes().first().unwrap()); - } - - #[test] - fn add_and_retrieve_two_works() { - let node1 = fake_mixnode("London, UK"); - let node2 = fake_mixnode("Neuchatel"); - let mut db = MixminingDb::new(); - - db.add(node1.clone()); - db.add(node2.clone()); - - assert_eq!(node1, db.get_mixnodes()[0]); - assert_eq!(node2, db.get_mixnodes()[1]); - } - - #[test] - fn starts_empty() { - let db = MixminingDb::new(); - assert_eq!(0, db.mixnodes.len()); - } - - #[test] - fn calling_list_when_empty_returns_empty_vec() { - let db = MixminingDb::new(); - let empty: Vec<Mixnode> = vec![]; - assert_eq!(&empty, db.get_mixnodes()); - } - - fn fake_mixnode(location: &str) -> Mixnode { - Mixnode { - host: String::from("foo.com"), - last_seen: 123, - location: String::from(location), - public_key: String::from("abc123"), - stake: 8, - version: String::from("1.0"), - } - } -} diff --git a/validator/src/services/mixmining/mod.rs b/validator/src/services/mixmining/mod.rs deleted file mode 100644 index 42af4c865fd..00000000000 --- a/validator/src/services/mixmining/mod.rs +++ /dev/null @@ -1,176 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -use db::MixminingDb; -use models::*; - -pub mod db; -pub mod models; -mod tests; - -pub struct Service { - db: MixminingDb, -} - -/// The mixmining::Service provides logic for updating and slashing mixnode -/// stake, retrieving lists of mixnodes based on stake, and adding/removing -/// mixnodes from the active set. It monitors mixnodes and rewards or slashes -/// based on the observed quality of service provided by a given mixnode. -/// -/// Mixing and staking interact. Mixnodes first need to announce -/// their presence to the validators. -/// -/// The mixnode then goes into the stack of available mixnodes. -/// -/// However, it's not necessarily going to start actively mixing traffic. -/// That depends on how much stake is riding on it, and how much capacity the -/// network requires right now. We depend on the wisdom of stakers to put their -/// money on trustworthy mixnodes. -/// -/// The active set of mixnodes will be able to expand or contract based on capacity. -/// For now, we simply take the top <capacity> nodes available, ordered by -/// <node.stake desc>. -/// -/// A lot is going to need to change here. Commented code is here mainly to -/// quickly sketch out the guts of the mixmining and staking service. This is not the basis -/// of our real staking system quite yet - it's a way to start getting the system -/// to function with all the different node types to start talking to each other, -/// and will be dramatically reworked over the next few months. -impl Service { - pub fn new(db: MixminingDb) -> Service { - Service { db } - } - - // Add a mixnode so that it becomes part of the possible mixnode set. - pub fn add(&mut self, mixnode: Mixnode) { - self.db.add(mixnode); - } - - pub fn topology(&self) -> Topology { - let mixnodes = self.db.get_mixnodes(); - let service_providers: Vec<ServiceProvider> = vec![]; - let validators: Vec<Validator> = vec![]; - Topology::new(mixnodes.to_vec(), service_providers, validators) - } - - pub fn set_capacity(&mut self, capacity: usize) { - self.db.set_capacity(capacity); - } - - /// A fake capacity, so we can take the top n mixnodes based on stake - pub fn capacity(&self) -> usize { - self.db.capacity() - } - - /* - - /// Update (or create) a given mixnode stake, identified by the mixnode's public key - fn update(&self, public_key: &str, amount: u64) { - // retrieve the given Mixnode from the database and update its stake - } - - /// For now, we have no notion of measuring capacity. For now just use capacity(). - fn active_mixnodes(&self) -> Vec<Mixnode> { - Vec::<Mixnode>::new() - // hit the database - } - - - /// Remove a mixnode from the active set in a way that does not impact its stake. - /// In a more built-out system, this method would mean: - /// "mixnode x has done its job well and requested to leave, so it can be removed - /// at the end of an epoch." - fn remove(&self, public_key: &str) { - // free locked up stake back to originating stakeholder - // remove the mixnode from the database - } - - /// Add the given amount of stake to the given Mixnode. Presumably it has done - /// its job well. - fn reward(&self, public_key: &str, amount: u64) {} - - /// Slash a mixnode's stake based on bad performance or detected malign intent. - fn slash(&self, public_key: &str, amount: u64) { - // transfer slashed stake amount to reserve fund - // retrieve the mixnode from the database, and decrement its stake amount - // by the amount given. - } - - /// Slash a mixnode's stake and immediately remove it from the mixnode set. - fn slash_remove(&self, public_key: String, amount: u64) { - // call slash (the method, not the guitarist) - // remove the mixnode from the database - } - */ -} - -#[cfg(test)] -mod mixnodes { - use super::*; - - #[test] - fn adding_and_retrieving_works() { - let mock_db = MixminingDb::new(); - let mut service = Service::new(mock_db); - let node1 = tests::fake_mixnode("London, UK"); - - service.add(node1.clone()); - let nodes = service.topology().mixnodes; - assert_eq!(1, nodes.len()); - assert_eq!(node1.clone(), nodes[0]); - let node2 = tests::fake_mixnode("Neuchatel"); - - service.add(node2.clone()); - let nodes = service.topology().mixnodes; - assert_eq!(2, nodes.len()); - assert_eq!(node1, nodes[0]); - assert_eq!(node2, nodes[1]); - } -} - -#[cfg(test)] -mod constructor { - use super::*; - - #[test] - fn sets_database() { - let db = db::MixminingDb::new(); - let service = Service::new(db.clone()); - - assert_eq!(db, service.db); - } -} - -#[cfg(test)] -mod capacity { - use super::*; - - #[test] - fn setting_capacity_sends_correct_value_to_datastore() { - let mock_db = db::MixminingDb::new(); - let mut service = Service::new(mock_db); - - service.set_capacity(3); - - assert_eq!(3, service.capacity()); - } - - #[test] - fn getting_capacity_works() { - let mut mock_db = db::MixminingDb::new(); - mock_db.set_capacity(3); - let service = Service::new(mock_db); - assert_eq!(3, service.capacity()); - } -} diff --git a/validator/src/services/mixmining/models.rs b/validator/src/services/mixmining/models.rs deleted file mode 100644 index bff8702ed78..00000000000 --- a/validator/src/services/mixmining/models.rs +++ /dev/null @@ -1,51 +0,0 @@ -use serde::{Deserialize, Serialize}; - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -pub struct Mixnode { - pub host: String, - pub public_key: String, - pub last_seen: u64, - pub location: String, - pub stake: u64, - pub version: String, -} - -#[derive(Serialize, Deserialize, Debug)] -pub struct ServiceProvider { - host: String, - public_key: String, - version: String, - last_seen: u64, - location: String, -} - -/// Topology shows us the current state of the overall Nym network -#[derive(Serialize, Deserialize, Debug)] -pub struct Topology { - pub mixnodes: Vec<Mixnode>, - pub service_providers: Vec<ServiceProvider>, - pub validators: Vec<Validator>, -} - -impl Topology { - pub fn new( - mixnodes: Vec<Mixnode>, - service_providers: Vec<ServiceProvider>, - validators: Vec<Validator>, - ) -> Topology { - Topology { - mixnodes, - service_providers, - validators, - } - } -} - -#[derive(Serialize, Deserialize, Debug)] -pub struct Validator { - host: String, - public_key: String, - version: String, - last_seen: u64, - location: String, -} diff --git a/validator/src/services/mixmining/tests/mod.rs b/validator/src/services/mixmining/tests/mod.rs deleted file mode 100644 index fac930f9022..00000000000 --- a/validator/src/services/mixmining/tests/mod.rs +++ /dev/null @@ -1,11 +0,0 @@ -#[cfg(test)] -pub fn fake_mixnode(location: &str) -> super::Mixnode { - super::Mixnode { - host: String::from("foo.com"), - last_seen: 123, - location: String::from(location), - public_key: String::from("abc123"), - stake: 8, - version: String::from("1.0"), - } -} diff --git a/validator/src/validator.rs b/validator/src/validator.rs deleted file mode 100644 index 195a6ae9db3..00000000000 --- a/validator/src/validator.rs +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2020 Nym Technologies SA -// -// 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. - -// use crate::config::Config; -use crate::network::rest; -use crate::network::tendermint; -use crate::services::mixmining; -use tokio::runtime::Runtime; - -pub struct Validator { - // when you re-introduce keys, check which ones you want: - // MixIdentityKeyPair (like 'nym-client' ) <- probably that one (after maybe renaming to just identity::KeyPair) - // encryption::KeyPair (like 'nym-mixnode' or 'sfw-provider') - tendermint_abci: tendermint::Abci, - rest_api: rest::Api, -} - -impl Validator { - pub fn new() -> Self { - let mixmining_db = mixmining::db::MixminingDb::new(); - let mixmining_service = mixmining::Service::new(mixmining_db); - - let rest_api = rest::Api::new(mixmining_service); - - Validator { - rest_api, - - // perhaps you might want to pass &config to the constructor - // there to get the config.tendermint (assuming you create appropriate fields + getters) - tendermint_abci: tendermint::Abci::new(), - } - } - - // TODO: Fix Tendermint startup here, see https://github.com/nymtech/nym/issues/147 - pub fn start(self) { - let mut rt = Runtime::new().unwrap(); - rt.spawn(self.rest_api.run()); - rt.spawn(self.tendermint_abci.run()); - - // TODO: this message is going to come out of order (if at all), as spawns are async, see issue above - println!("Validator startup complete."); - rt.block_on(blocker()); - } -} - -pub async fn blocker() {} // once Tendermint unblocks us, make this block forever.