diff --git a/_design-forces/08-portability.md b/_design-forces/08-portability.md index 2fb1c824..0c0175c1 100644 --- a/_design-forces/08-portability.md +++ b/_design-forces/08-portability.md @@ -89,9 +89,9 @@ In case of using compiled programming languages, software libraries and executab * **Build system generators**, which automatically generate _build files_ from human-written configuration files. Popular examples of those tools are the [GNU Build System](https://en.wikipedia.org/wiki/GNU_Build_System) (also known as Autotools), [CMake](https://cmake.org) and [SCons](https://scons.org). * **Build automation tools**, which automatically build executable programs and libraries from the source code with the aid of _build files_ that contains _rules_ describing targets, components and dependencies. Example are [GNU Make](https://www.gnu.org/software/make/), Unix’s [make](https://pubs.opengroup.org/onlinepubs/9699919799/utilities/make.html), [Ninja](https://ninja-build.org) and [others](https://en.wikipedia.org/wiki/List_of_build_automation_software). * **Compilers**, which are programs that convert instructions into a machine-code or lower-level form so that they can be read and executed by a computer. In general, it is desirable to be able to build the source code with different compilers, since  it improves the overall quality of code by providing different checks and alerts. Examples of compilers are: - * the [GNU Compiler Collection](https://gcc.gnu.org), which provides front ends for C (```gcc```), C++ (```g++```), Fortran (```gfortran```), Java (```gcj```) and other languages; - * the [LLVM](https://llvm.org) project, which provides front-ends for C / Objective-C (```clang```) and C++ (```clang++```), while other external projects allow the compilation of Ruby, Python, Haskell, Java, D, PHP, Pure, Lua, and a number of other languages. - * Those included in [Microsoft Visual Studio](https://www.visualstudio.com/), such as the Microsoft C++ Compiler (MSVC) provided by [Microsoft Visual C++](https://en.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B); ```vbc.exe```, the Visual Basic .NET compiler; and ```csc.exe```, the C# compiler, among others; + * the [GNU Compiler Collection](https://gcc.gnu.org), which provides front ends for C (`gcc`), C++ (`g++`), Fortran (`gfortran`), Java (`gcj`) and other languages; + * the [LLVM](https://llvm.org) project, which provides front-ends for C / Objective-C (`clang`) and C++ (`clang++`), while other external projects allow the compilation of Ruby, Python, Haskell, Java, D, PHP, Pure, Lua, and a number of other languages. + * Those included in [Microsoft Visual Studio](https://www.visualstudio.com/), such as the Microsoft C++ Compiler (MSVC) provided by [Microsoft Visual C++](https://en.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B); `vbc.exe`, the Visual Basic .NET compiler; and `csc.exe`, the C# compiler, among others; * [other compilers](https://en.wikipedia.org/wiki/List_of_compilers). * In case of targeting embedded platforms, it is desirable the availability of cross-compilers, which are compilers capable of creating executable code for a platform other than the one on which the compiler is running. Examples are GCC and the .NET Framework compiler. diff --git a/_docs/02-overview.md b/_docs/02-overview.md index 40f9c37a..1e3a04c9 100644 --- a/_docs/02-overview.md +++ b/_docs/02-overview.md @@ -88,6 +88,7 @@ int main(int argc, char** argv) return 0; } ``` +{: class="nocopy"} GNSS-SDR's `main` method processes the command line flags, if any, provided by the user, and initializes the logging library. Then, it records the starting time and instantiates a smart pointer to a `ControlThread` object. Its constructor reads the configuration file, creates a control queue and creates a flow graph according to the configuration. Then, the program's main method calls the `run()` method of the instantiated object, an action that connects the flow graph and starts running it. After that, and until a `stop` message generated by some processing block is received, it reads control messages sent by the receiver's modules through a safe-thread queue and processes them. Finally, when a `stop` message is actually received, the main method reports the execution time, does some clean up and exits the program. The destructor of the `ControlThread` object, which deallocates memory, is automatically executed at the end of the method. diff --git a/_docs/04-control-plane.md b/_docs/04-control-plane.md index 479d61ee..74480538 100644 --- a/_docs/04-control-plane.md +++ b/_docs/04-control-plane.md @@ -47,6 +47,7 @@ related to _SignalSource_ should look like this: SignalSource.parameter1=value1 SignalSource.parameter2=value2 ``` +{: class="nocopy"} The name of these parameters can be anything but one reserved word: `implementation`. This parameter indicates in its value the name of the class that has to be instantiated by the factory @@ -69,9 +70,10 @@ SignalConditioner.implementation=Pass_Through ; THIS IS ANOTHER COMMENT In this way, a full GNSS receiver can be uniquely defined in one text file in INI format. -```bash +```console $ gnss-sdr --config_file=/path/to/my_receiver.conf ``` +{: class="nocopy"} GNSS-SDR allows the user to define a custom GNSS receiver, including its architecture (number of bands, channels per band and targeted signal) and the specific algorithms and parameters for each of the processing blocks through a single configuration file (a simple text file in [INI](https://en.wikipedia.org/wiki/INI_file) format). Thus, **each configuration file defines a different GNSS receiver**. Some examples of such files are available at [gnss-sdr/conf](https://github.com/gnss-sdr/gnss-sdr/tree/master/conf). {: .notice--info} @@ -98,8 +100,6 @@ _A Factory encapsulates the complexity of the instantiation of processing blocks This scheme is known as the [Factory Method](https://en.wikipedia.org/wiki/Factory_method_pattern) design pattern[^Fernandez10]. As shown in the figure above, this pattern encapsulates the processes involved in the creation of objects by defining an interface for creating an object, but letting subclasses decide which class to instantiate. - - ## The GNSS Flow Graph The [`GNSSFlowgraph`](https://github.com/gnss-sdr/gnss-sdr/blob/master/src/core/receiver/gnss_flowgraph.h) class is responsible for preparing the graph of blocks according to the configuration, running it, modifying it during run-time and stopping it. @@ -138,12 +138,14 @@ As we saw in the [Overview]({{ "/docs/overview/" | relative_url }}), the `main` ```cpp auto control_thread = std::make_unique(); ``` +{: class="nocopy"} The constructor of this objects reads the commandline flag provided by the user when executing the receiver which points to the text file containing the configuration, as shown above: -```bash +```console $ gnss-sdr --config_file=/path/to/my_receiver.conf ``` +{: class="nocopy"} Then, when the `run()` method of the `control_thread` object is called, a member of class [`GNSSFlowgraph`](https://github.com/gnss-sdr/gnss-sdr/blob/master/src/core/receiver/gnss_flowgraph.h) connects the flow graph, starts the flow of data from sources to sinks, and keeps processing messages from a control queue until the receiver stops. @@ -174,6 +176,7 @@ int ControlThread::run() return 0; } ``` +{: class="nocopy"} Hence, the object of class [`GNSSFlowgraph`](https://github.com/gnss-sdr/gnss-sdr/blob/master/src/core/receiver/gnss_flowgraph.h) will parse the configuration file and will ask the Block Factory for the corresponding [_Signal Source_]({{ "/docs/sp-blocks/signal-source/" | relative_url }}), [_Signal Conditioner_]({{ "/docs/sp-blocks/signal-conditioner/" | relative_url }}), [_Channels_]({{ "/docs/sp-blocks/channels/" | relative_url }}) (each one with its own [_Acquisition_]({{ "/docs/sp-blocks/acquisition/" | relative_url }}), [_Tracking_]({{ "/docs/sp-blocks/tracking/" | relative_url }}) and [_Telemetry Decoder_]({{ "/docs/sp-blocks/telemetry-decoder/" | relative_url }})), one [_Observables_]({{ "/docs/sp-blocks/observables/" | relative_url }}) block (collecting the processing results from all Channels), and a [_PVT_]({{ "/docs/sp-blocks/pvt/" | relative_url }}) block (acting as a signal sink): diff --git a/_geniuss-place/02-contribute.md b/_geniuss-place/02-contribute.md index a7334e4a..279495bc 100644 --- a/_geniuss-place/02-contribute.md +++ b/_geniuss-place/02-contribute.md @@ -81,19 +81,19 @@ The required software can be installed through [RubyGems](https://rubygems.org/) Install [Jekyll](https://jekyllrb.com/): -```bash +```console $ sudo gem install jekyll ``` More information at [Jekyll's installation page](https://jekyllrb.com/docs/installation/). Then, install [Bundler](https://bundler.io/), a tool for managing the required dependencies: -```bash +```console $ sudo gem install bundler ``` Clone your forked repository of this website and install the required dependencies: -```bash +```console $ git clone https://github.com/YOUR_USERNAME/geniuss-place/ $ cd geniuss-place $ bundler install @@ -101,13 +101,13 @@ $ bundler install After all gems are installed, the following command will deploy the website and run a local server at http://127.0.0.1:4000/ -```bash +```console $ bundle exec jekyll serve -w --config _config.yml,_config.dev.yml ``` You should see something as: -``` +```console Configuration file: _config.yml Configuration file: _config.dev.yml Source: /path_to_cloned_repo/geniuss-place @@ -120,13 +120,14 @@ Configuration file: _config.dev.yml Server address: http://127.0.0.1:4000/ Server running... press ctrl-c to stop. ``` +{: class="nocopy"} Just point your browser to that [local direction](http://127.0.0.1:4000/) in order to enjoy this website without the need of Internet connection. Some features such as comments might not work. {% capture protip %} **Pro Tip**: if you want to modify JavaScript (under `assets/js`), you will need to install [Node.js](https://nodejs.org/en/), `cd` to the root of your project, and run `$ npm install` to get all the dependencies. If all gone well, then running `npm run build:js` will compress/concatenate `_main.js` and all plugin scripts into `main.min.js`. Thus, upon a change on JavaScript content, run: -```bash +```console $ npm run build:js ``` diff --git a/_geniuss-place/03-coding-style.md b/_geniuss-place/03-coding-style.md index bf5fe330..1d347902 100644 --- a/_geniuss-place/03-coding-style.md +++ b/_geniuss-place/03-coding-style.md @@ -56,6 +56,7 @@ Variables are named using lower-case letters and words are separated using under fft_size my_variable_name ``` +{: class="nocopy"} ### Naming rules for files Files are named using lower-case letters and words are separated using under-score. Abbreviations, when used in file names, are also written in lower-case letters. Source files are named using `.cc` suffix, whereas header files end with `.h` extension. Examples: @@ -64,6 +65,7 @@ Files are named using lower-case letters and words are separated using under-sco my_file.h my_file.cc ``` +{: class="nocopy"} ### Naming rules for functions Function names are named using lower-case letters and words are separated using under-score. Abbreviations, when used in function names, are also written in lower-case letters. This rule applies both to stand-alone functions as well as to member functions of classes. Example: @@ -71,6 +73,7 @@ Function names are named using lower-case letters and words are separated using ```cpp do_something( with, these, parameters ); ``` +{: class="nocopy"} When function calls get too long, you will have to split them up in several lines. Align the following lines with the previous ones so the structure becomes obvious, and go to the next line after the comma. @@ -85,6 +88,7 @@ Channel(ConfigurationInterface *configuration, std::string implementation, boost::shared_ptr queue); ``` +{: class="nocopy"} ### Naming rules for classes and structures @@ -95,6 +99,7 @@ My_Class_Name My_Struct_Name BPSK ``` +{: class="nocopy"} ### Use sensible, descriptive names @@ -152,6 +157,7 @@ class A { }; ``` +{: class="nocopy"} ### Function parameters should be lined up with one parameter per line @@ -171,6 +177,7 @@ do not contain any code. Example: ```cpp while (...) {} ``` +{: class="nocopy"} ### Each statement should be placed on a line on its own @@ -185,6 +192,7 @@ knowing which variables are pointers. (Bad) example: ```cpp int* p, i; ``` +{: class="nocopy"} It is easy to forget that the star belongs to the declared name, not the @@ -289,6 +297,7 @@ private: TYPE2 private_variable2; // Short description of private_variable2 here }; ``` +{: class="nocopy"} ### Include formulae @@ -362,6 +371,7 @@ multiple times. The format of the symbol name should be ... #endif // GNSS_SDR_BAR_BAZ_H ``` +{: class="nocopy"} ### The name of the macro used in the include guard should have the same name as the file (excluding the extension) followed by the suffix “`_H`” @@ -383,6 +393,7 @@ Example: #include ... ``` +{: class="nocopy"} ### System header files should be included with `<>` and project headers with `""` @@ -423,6 +434,7 @@ Example: #include ... ``` +{: class="nocopy"} ### Use `const` instead of \#define in header files @@ -443,6 +455,7 @@ have to write `const` twice: ```cpp const char * const authorName = "Carlos Aviles"; ``` +{: class="nocopy"} However, it is worth reminding you here that string objects are generally preferable to their `char*`-based progenitors, so `authorName` @@ -451,6 +464,7 @@ is often better defined this way: ```cpp const std::string authorName("Carlos Aviles"); ``` +{: class="nocopy"} The second special case concerns class-specific constants. To limit the scope of a constant to a class, you must make it a member, and to ensure @@ -466,6 +480,7 @@ private: ... }; ``` +{: class="nocopy"} In general, use `const` whenever possible. The wonderful thing about `const` is that it allows you to specify a semantic constraint — a @@ -526,6 +541,7 @@ Trigfunc myfunc = sin; void callfunc(Trigfunc callback); Trigfunc functable[10]; ``` +{: class="nocopy"} ### Do not use exception specifications @@ -594,6 +610,7 @@ void f() cout << "Decimal base is " << dec << '\n'; } ``` +{: class="nocopy"} ### The parts of a class definition must be `public`, `protected` and `private` @@ -632,6 +649,7 @@ T operator+(const T & left, const T & right) return temp; } ``` +{: class="nocopy"} ## Statements @@ -721,6 +739,7 @@ double sqrt(double x) assert(abs(result*result-x)/x < 1E-8) ; } ``` +{: class="nocopy"} ### Use prefix increment/decrement instead of postfix increment/decrement when the value of the variable is not used @@ -744,6 +763,7 @@ if (ptr) // wrong if (ptr != NULL) // wrong if (ptr != nullptr) // ok (C++11) ``` +{: class="nocopy"} ### Use the new cast operators @@ -783,6 +803,7 @@ int32_t f ( const char_t * numstr ) return atoi ( numstr ); // Non-compliant } ``` +{: class="nocopy"} ### The library functions `abort`, `exit`, `getenv` and `system` from library `` should not be used. @@ -796,6 +817,7 @@ void f ( ) exit(0); // Non-compliant } ``` +{: class="nocopy"} ### The time handling functions of library `` should not be used. @@ -809,6 +831,7 @@ void f ( ) clock(); // Non-compliant } ``` +{: class="nocopy"} ### The unbounded functions of library `` should not be used. @@ -825,6 +848,7 @@ void fn ( const char_t * pChar ) strcpy ( array, pChar ); // Non-compliant } ``` +{: class="nocopy"} ### The macro `offsetof` should not be used. @@ -842,6 +866,7 @@ void f1 ( ) offsetof ( A, i ); // Non-compliant } ``` +{: class="nocopy"} ### Dynamic heap memory allocation should not be used. @@ -859,6 +884,7 @@ void f1 ( ) delete i; } ``` +{: class="nocopy"} ### The signal handling facilities of `` should not be used. @@ -873,7 +899,7 @@ void f1 ( ) signal ( 1, my_handler ); // Non-compliant } ``` - +{: class="nocopy"} ### Do not use `std::vector` @@ -891,6 +917,7 @@ void foo () std::vector vb; // Non-Compliant } ``` +{: class="nocopy"} ### The error indicator errno should not be used. @@ -913,6 +940,7 @@ void f1 ( const char_t * str ) } } ``` +{: class="nocopy"} ### The stream input/output library `` should not be used. @@ -927,6 +955,7 @@ void fn ( ) gets ( array ); // Can lead to buffer over-run } ``` +{: class="nocopy"} ## Final recommendations @@ -942,51 +971,54 @@ You can use clang-format in two simple steps: **Step 1.- Install clang-format** * **In GNU/Linux using Debian / Ubuntu distributions:** -```bash +```console $ sudo apt-get install clang-format ``` * **In GNU/Linux using Fedora / CentOS distributions:** -```bash +```console $ sudo yum install clang-tools-extra ``` * **In GNU/Linux using ArchLinux:** -```bash +```console $ sudo pacman -S clang ``` * **In GNU/Linux using openSUSE:** -```bash +```console $ sudo zypper -n install llvm-clang ``` * **In macOS using Homebrew:** -```bash +```console $ brew install clang-format ``` * **In macOS using Macports:** -```bash +```console $ sudo port install clang-11 ``` NOTE: You can see all available choices with `port select --list` for clang: -```bash + ```console $ port select --list clang Available versions for clang: mp-clang-11 none (active) -``` + ``` + {: class="nocopy"} With `sudo port select --set clang ` you choose one of them as the new default, which will create symlinks in `/opt/local/bin` without the version suffix. -```bash + ```console $ sudo port select --set clang mp-clang-11 selecting 'mp-clang-11' for 'clang' succeeded. 'mp-clang-11' is now active. -``` + ``` + {: class="nocopy"} You can confirm this change by looking at the version of the tool: -```bash + ```console $ clang-format --version clang-format version 11.0.0 -``` + ``` + {: class="nocopy"} If you later wish to remove these symlinks in order to avoid hiding tools installed by Xcode, just select the `none` version. @@ -996,11 +1028,12 @@ clang-format version 11.0.0 * **Tell your favorite editor to use clang-format.** You can use it in Eclipse via [CppStyle](https://github.com/wangzw/CppStyle), in Atom via the [clang-format package](https://atom.io/packages/clang-format), and in [many other editors](https://clang.llvm.org/docs/ClangFormat.html#vim-integration). Once the corresponding plugin or module is installed, configure your editor to run clang-format on every file save. * For applying code formatting from the command line: -```bash + ```console $ clang-format -i -``` + ``` + {: class="nocopy"} or for a folder and its and subfolders: -```bash +```console $ find src/algorithms/conditioner/ -iname *.h -o -iname *.cc | xargs clang-format -i ``` For each input file, clang-format will try to find the `.clang-format` file located in the closest parent directory of the input file, so [the one in the root folder](https://github.com/gnss-sdr/gnss-sdr/blob/next/.clang-format) will apply. Please do not modify that file, but feel free to propose changes (that would be applied to the whole source tree) by [filling an issue at GitHub](https://github.com/gnss-sdr/gnss-sdr/issues/new) in order to let other developers to discuss them. @@ -1012,6 +1045,7 @@ You can disable the automatic formatting of a piece of code by using comments: ... code here will not be formatted. // clang-format on ``` +{: class="nocopy"} Note the space in between the comment start (`//`) and `clang-format`. This space is required for the comment to be successfully detected. @@ -1023,12 +1057,12 @@ Note the space in between the comment start (`//`) and `clang-format`. This spac If you have modified markdown files (ended in `.md`), please apply [prettier](https://prettier.io). * Install prettier: -```bash +```console $ sudo npm install --global prettier ``` * Run it from the root of the source code tree: -```bash +```console $ find . -iname "*.md" | xargs prettier --parser markdown --print-width 80 --prose-wrap always --write ``` @@ -1057,27 +1091,27 @@ You can use clang-tidy in two simple steps: **Step 1.- Install clang-tidy** * **In GNU/Linux using Debian / Ubuntu distributions:** -```bash +```console $ sudo apt-get install clang clang-tidy ``` * **In GNU/Linux using Fedora / CentOS distributions:** -```bash +```console $ sudo yum install clang clang-tools-extra ``` * **In GNU/Linux using ArchLinux:** -```bash +```console $ sudo pacman -S clang ``` * **In GNU/Linux using openSUSE:** -```bash +```console $ sudo zypper -n install llvm-clang ``` * **In macOS using Homebrew:** -```bash +```console $ brew install llvm $ ln -s /usr/local/opt/llvm/bin/clang-tidy /usr/local/bin $ ln -s /usr/local/Cellar/llvm/11.*/bin/clang-apply-replacements /usr/local/bin @@ -1085,7 +1119,7 @@ $ ln -s /usr/local/Cellar/llvm/11.*/share/clang/run-clang-tidy.py /usr/local/bin ``` * **In macOS using Macports:** -```bash +```console $ sudo port install clang-11 ``` @@ -1093,7 +1127,7 @@ $ sudo port install clang-11 This tool integrates nicely with CMake >= 3.6. In GNSS-SDR, all you need to do is to tell CMake to use clang: -```bash +```console $ cmake -DCMAKE_CXX_COMPILER=/usr/bin/clang++ \ -DCMAKE_C_COMPILER=/usr/bin/clang .. $ make volk_gnsssdr_module core_monitor pvt_libs @@ -1101,19 +1135,19 @@ $ make volk_gnsssdr_module core_monitor pvt_libs (pointing `CMAKE_CXX_COMPILER` and `CMAKE_C_COMPILER` to the actual location of the clang binaries in your machine). This will create a file named `compile_commands.json` in your build folder containing the exact compiler calls for all translation units of the project in machine-readable form. After that, you can use the `run-clang-tidy` script (called `run-clang-tidy.py` in some platforms) to perform the project default checks over all files in the compilation database: -```bash +```console $ run-clang-tidy -fix ``` or you can apply specific checks by doing: -```bash +```console $ run-clang-tidy -header-filter='.*' -checks='-*,modernize-use-nullptr' -fix ``` An alternative choice is to run clang-tidy along with the building process, by activating the building option `ENABLE_CLANG_TIDY`: -```bash +```console $ cmake -DCMAKE_CXX_COMPILER=/usr/bin/clang++ \ -DCMAKE_C_COMPILER=/usr/bin/clang \ -DENABLE_CLANG_TIDY=ON .. @@ -1126,14 +1160,14 @@ You can read more about the usage of this tool at the [clang-tidy documentation] {% capture use-clang-tidy %} With clang and clang-tidy already installed, please do: -```bash +```console $ cmake -DCMAKE_CXX_COMPILER=/usr/bin/clang++ \ -DCMAKE_C_COMPILER=/usr/bin/clang .. $ make volk_gnsssdr_module core_monitor pvt_libs $ run-clang-tidy -fix ``` or -```bash +```console $ cmake -DCMAKE_CXX_COMPILER=/usr/bin/clang++ \ -DCMAKE_C_COMPILER=/usr/bin/clang \ -DENABLE_CLANG_TIDY=ON .. diff --git a/_posts/2013-07-07-how-profile-code.md b/_posts/2013-07-07-how-profile-code.md index fb234d08..4c6d0393 100644 --- a/_posts/2013-07-07-how-profile-code.md +++ b/_posts/2013-07-07-how-profile-code.md @@ -20,7 +20,7 @@ A cool feature of these tools is that they are non code-intrusive, in the sense In order to build GNSS-SDR with the appropriate compiler flags required by gperftools, configure it with the flag `ENABLE_GPERFTOOLS` enabled: -```bash +```console $ cmake -DENABLE_GPERFTOOLS=ON .. && make && sudo make install ``` @@ -29,19 +29,19 @@ $ cmake -DENABLE_GPERFTOOLS=ON .. && make && sudo make install A profiler needs to record what functions were invoked and how many times it took to execute a function. The simplest way of obtaining this data is sampling. When using this method, a profiler interrupts program execution at specified intervals and logs the state of program's call stack. Thus, when we define the `CPUPROFILE` variable and run the program, the profiling library will periodically pause the program, take a peak at its stack to see what functions are on the stack, making a note of this, and then returning to the program. This Monte-Carlo style analysis provides with an estimate of where the code is spending its time, without adding the overhead of forcing every function to track its own time usage. -```bash +```console $ CPUPROFILE=/tmp/gnss-sdr-cpu.prof /path/to/gnss-sdr ``` And a graphical output of the analysis can be invoked by: -```bash +```console $ pprof --gv /path/to/gnss-sdr /tmp/gnss-sdr-cpu.prof ``` You can display a larger fraction of nodes (procedures) and edges (caller to callee relationships) by doing: -```bash +```console $ CPUPROFILE_FREQUENCY=100000000000 CPUPROFILE=/tmp/gnss-sdr-cpu.prof /path/to/gnss-sdr $ pprof --gv --nodefraction=0.000000000001 --edgefraction=0.000000000001 ./gnss-sdr /tmp/gnss-sdr-cpu.prof ``` @@ -56,7 +56,7 @@ The heap is extremely important because it is available for use by applications However, shoddy implementations can lead to memory leaks, that is, the program could consume memory but be unable to release it back to the operating system. In object-oriented programming terminology, a memory leak happens when an object is stored in memory but cannot be accessed by the running code. This can diminish the performance of the computer by reducing the amount of available memory. Eventually, in the worst case, too much of the available memory may become allocated and all or part of the system or device stops working correctly, the application fails, or the system slows down unacceptably due to thrashing, the situation found when large amounts of computer resources are used to do a minimal amount of work, with the system in a continual state of resource contention. To conclude: memory leaks are something to avoid. -```bash +```console $ HEAPCHECK=1 /path/to/gnss-sdr ``` @@ -75,7 +75,7 @@ The heap profiler is used to explore how C++ programs manage memory. This facili The profiling system instruments all allocations and frees. It keeps track of various pieces of information per allocation site. An allocation site is defined as the active stack trace at the call to `malloc`, `calloc`, `realloc`, or `new`. Note that since the heap-checker uses the heap-profiling framework internally, it is not possible to run both the heap-checker and heap profiler at the same time. -```bash +```console $ HEAPPROFILE=/tmp/gnss-sdr.heap.prof [binary args] $ pprof /tmp/gnss-sdr.heap.prof.0045.heap # run 'ls' to see options $ pprof --gv /tmp/gnss-sdr.heap.prof.0045.heap @@ -87,7 +87,7 @@ Please see more details on the [heap profiler options](https://gperftools.github Script for profiling (run this as root from the same directory where the executable gnss-sdr is located): -```bash +```bash?comments=true #!/bin/bash # This script, due to the usage of "nice", must be run as root. if [ $EUID -ne 0 ]; @@ -103,19 +103,19 @@ nice -n -20 gnss-sdr Save it in the same directory where the executable gnss-sdr is (for instance, name it profiler), make the script executable: -```bash +```console $ chmod a+x profiler ``` and launch the executable with CPU and heap profiling activated: -```bash +```console $ sudo ./profiler ``` Then, the command line for displaying the results: -```bash +```console $ pprof --gv --nodefraction=0.000000000001 --edgefraction=0.000000000001 ./gnss-sdr /tmp/gnss-sdr-cpu.prof $ pprof --gv ./gnss-sdr /tmp/prof.gnss-sdr.0045.heap ``` @@ -131,19 +131,19 @@ When you use Callgrind to profile an application, your application is transforme First of all, you need to install Callgrind and KCachegrind. In Ubuntu, you can install everything by doing -```bash +```console $ sudo apt-get install valgrind kcachegrind ``` in a terminal. To profile an application with Callgrind, you just have to prepend the Callgrind invocation in front of your normal program invocation: -```bash +```console $ valgrind --tool=callgrind ./gnss-sdr ``` The profiling result will be stored in a `callgrind.out.XXX` text file where `XXX` will be the process identifier. The content is not human-readable, but here is where a profile data visualization tool as KCacheGrind comes into play. It can be launched from the command line, by doing -```bash +```console $ kcachegrind & ``` diff --git a/_posts/2013-11-10-first-positioning-fix-using-galileo.md b/_posts/2013-11-10-first-positioning-fix-using-galileo.md index 86cee835..498da146 100644 --- a/_posts/2013-11-10-first-positioning-fix-using-galileo.md +++ b/_posts/2013-11-10-first-positioning-fix-using-galileo.md @@ -37,7 +37,7 @@ The hardware setup was composed of a GNSS active antenna located at the rooftop If you wish to try, obtain an executable built from the latest revision of the source code repository, go to the install folder, and type: -```bash +```console $ gnss-sdr --config_file=../conf/gnss-sdr_Galileo_E1.conf ``` @@ -56,6 +56,7 @@ Dilution of Precision at 2013-Nov-10 15:52:14 is HDOP = 3.58641436755431 VDOP = 4.151352135926544 TDOP = 4.650305636312183 GDOP = 5.485990573475482 ``` +{: class="nocopy"} The maximum available Carrier-to-Noise density ratio (CN0) was 41 dB-Hz, associated to high elevation satellites (such as Galileo FM3), as predicted by the orbital model. In contrast, Galileo PFM (PRN ID 11) is visible with a low elevation, and thus the received CN0 was 35 dB-Hz. Next figure shows a capture of the predicted satellite positions and the skyplot. diff --git a/_posts/2016-06-23-sige-gn3s-sampler-v2-usb-front-end.md b/_posts/2016-06-23-sige-gn3s-sampler-v2-usb-front-end.md index e7fddb48..9a375177 100644 --- a/_posts/2016-06-23-sige-gn3s-sampler-v2-usb-front-end.md +++ b/_posts/2016-06-23-sige-gn3s-sampler-v2-usb-front-end.md @@ -163,7 +163,7 @@ In addition, it is required to copy the GN3S firmware binary file [gr-gn3s/firmw Since the driver requires access to the USB port, it is necessary to run the script as root. In case you are using gnuradio-companion, it can be done as: -```bash +```console $ sudo gnuradio-companion ``` @@ -185,7 +185,7 @@ Creating GPS Source GN3S Start started TX ``` - +{: class="nocopy"} In this sample script, the FFT GUI shows in real-time the digitized signal spectrum, as is shown in the next picture: @@ -286,7 +286,7 @@ Resampler.implementation=Pass_Through This configuration enables the real-time receiver operation with 8 satellite channels in an Intel Core 2 quad Q9400 @ 2.66 GHz with 4 GB of RAM. It is important to point out that the GN3S driver requires the firmware file available in the application runtime directory. In the case of the GNSS-SDR application, the firmware file gn3s_firmware.ihx should be copied the folder runniong the receiver. In addition, GNSS-SDR should be called with root privileges -```bash +```console $ sudo gnss-sdr --config_file=../conf/gnss-sdr_GPS_L1_GN3S_realtime.conf ``` diff --git a/_posts/2016-06-23-using-git.md b/_posts/2016-06-23-using-git.md index 5d195ba0..6551cc5d 100644 --- a/_posts/2016-06-23-using-git.md +++ b/_posts/2016-06-23-using-git.md @@ -65,15 +65,16 @@ by you or fetched from other users) by going to your git-cloned repository and issuing the `git checkout` command with the name of the desired branch name, like this: -```bash +```console $ git checkout master # now you are in the master branch $ git checkout next # now you are in the next branch ``` +{: class="nocopy"} If you do not know in which branch you are, pay attention to the first line of this command’s output: -```bash +```console $ git status ``` @@ -91,87 +92,93 @@ or by browsing to [https://github.com/gnss-sdr/gnss-sdr](https://github.com/gnss Once you have forked the repository, open a terminal, go to your favorite working folder and type: -```bash +```console $ git clone https://github.com/YOUR_USERNAME/gnss-sdr ``` +{: class="nocopy"} where `YOUR_USERNAME` is your GitHub user name. Now, you have a local copy of your fork of the GNSS-SDR repository into a directory called `gnss-sdr`. Change to that directory: -```bash +```console $ cd gnss-sdr ``` and (if you have not done so yet) [configure Git](https://help.github.com/articles/set-up-git/) with some basic information, such as your identity: -```bash +```console $ git config user.name "Your Name" $ git config user.email "your@email.abc" ``` +{: class="nocopy"} The email you specify should be the same one found in your [GitHub email settings](https://help.github.com/articles/adding-an-email-address-to-your-github-account/). When you fork a project in order to propose changes to the original repository, you can configure Git to pull changes from the original, or _upstream_, repository into the local clone of your fork. If you type `git remote -v` in a terminal and press **Enter**, you will see the current configured remote repository for your fork: -```bash +```console $ git remote -v origin https://github.com/YOUR_USERNAME/gnss-sdr.git (fetch) origin https://github.com/YOUR_USERNAME/gnss-sdr.git (push) ``` +{: class="nocopy"} We can add the original, _upstream_ repository like this: -```bash +```console $ git remote add upstream https://github.com/gnss-sdr/gnss-sdr.git ``` To verify the new upstream repository you have specified for your fork, type `git remote -v` again. You should see the URL for your fork as `origin`, and the URL for the original repository as `upstream`: -```bash +```console $ git remote -v origin https://github.com/YOUR_USERNAME/gnss-sdr.git (fetch) origin https://github.com/YOUR_USERNAME/gnss-sdr.git (push) upstream https://github.com/gnss-sdr/gnss-sdr.git (fetch) upstream https://github.com/gnss-sdr/gnss-sdr.git (push) ``` +{: class="nocopy"} Now, you can keep your fork synced with the upstream repository with a few Git commands: 1. Fetch the branches and their respective commits from the upstream repository. Commits to `next` will be stored in a local branch, `upstream/next`. - ```bash - $ git fetch upstream + ```console +$ git fetch upstream ``` 2. Check out your fork's local `next` branch: - ```bash - $ git checkout next + ```console +$ git checkout next ``` 3. Merge the changes from `upstream/next` into your local `next` branch. This brings your fork's `next` branch into sync with the upstream repository, without losing your local changes: - ```bash - $ git merge upstream/next + ```console +$ git merge upstream/next ``` Now that you are up to date, go to the `next` branch and create a new branch off from it: -```bash +```console $ git checkout next $ git checkout -b my_feature ``` +{: class="nocopy"} Whenever you want to work on something, create a branch for it. Then, do your changes, stage modified and new files and do commits: -```bash +```console ... (change files, compile, test) ... $ git add file1.cc file1.h ... # This is called file staging $ git commit -m "adding stuff" # Records staged files to the repository ``` +{: class="nocopy"} {% capture commit-text %}

Sign your commits!

@@ -179,12 +186,12 @@ If you plan to contribute your work back to the upstream repository in form of p * **The `-s` flag:** `git commit -m -s "commit message"`. This adds a Signed-off-by trailer by the committer at the end of the commit log message. * **The `-S` flag:** `git commit -m -S "commit message"`. This will sign the commit with your GPG key (check [how to generate your GPG key](https://docs.github.com/en/github/authenticating-to-github/generating-a-new-gpg-key) and [how to tell Git about your signing key](https://docs.github.com/en/github/authenticating-to-github/telling-git-about-your-signing-key)). * **Preferred method:** To configure your Git client to sign commits by default for a local repository (so you don't need to add the `-S` flag to your commits anymore), in Git versions 2.0.0 and above, after generating your GPG key and telling Git about it, run: - ```bash - $ git config commit.gpgsign true + ```console +$ git config commit.gpgsign true ``` To sign all commits by default in any local repository on your computer, run: - ```bash - $ git git config --global commit.gpgsign true + ```console +$ git git config --global commit.gpgsign true ``` {% endcapture %}
@@ -205,9 +212,10 @@ changes in your repository. Next figure summarizes this workflow: Once you are done with your changes in your local repository, it's time to push that changes to your GitHub repository: -```bash +```console $ git push origin my_feature ``` +{: class="nocopy"} Then, go onto the GitHub site, visit your repository, switch to your `my_feature` branch, and click the _Pull Request_ button that will do all the work for you. @@ -228,19 +236,21 @@ to and from them when you need to share work. Now, someone might be doing something interesting you care about. Say this is Carles Fernández and you want to track his work: -```bash +```console $ git remote add cf git://github.com/carlesfernandez/gnss-sdr.git $ git fetch cf # This downloads all the content from Carles' repo. $ git branch -r # Lists remote branches ``` +{: class="nocopy"} Then you can see all your available remote branches (including those of the remote repository you just added) and their name. You can then checkout a specific remote branch by typing: -```bash +```console $ git checkout cf/very_cool_feature ``` +{: class="nocopy"} When checking out a remote branch, you can look around, make experimental changes and commit them, and you can discard any commits @@ -249,19 +259,21 @@ another checkout. If you want to create a new branch to retain commits you create, you may do so (now or later) by using `-b` with the `checkout` command again: -```bash -$ git checkout -b new_branch_name +```console +$ git checkout -b new_branch_name ``` +{: class="nocopy"} ## Setting up tracking branches When you create a new local branch off from next, it diverges from your local next at that point in time: -```bash +```console $ git checkout next $ git checkout --track -b my_feature ``` +{: class="nocopy"} If you want to keep that new branch updated with the new changes of next, you either need to pull changes through next and then rebase your @@ -296,17 +308,19 @@ ones that do not track branches on `origin` and do not track the Say you want to work off the `next` branch. First, you need a copy of that in your local repository - a tracking branch: -```bash +```console $ git fetch --all # This downloads all available content $ git branch -r # Lists remote branches ``` +{: class="nocopy"} Then, create a local tracking branch called `my_feature` from the remote branch called `origin/next`: -```bash +```console $ git checkout --track -b my_feature origin/next ``` +{: class="nocopy"} Now you have a branch `my_feature` which is tracking `origin/next`. When there is an update in the upstream repository, and do a `pull`, you will @@ -322,12 +336,12 @@ Always use them as a base to branch off! branch.** In Git terminology, this is called rebasing a branch. When rebasing, you need to specify which branch you want to rebase onto: - ```bash - $ git checkout my_feature - $ git fetch upstream - $ git rebase upstream/next + ```console +$ git checkout my_feature +$ git fetch upstream +$ git rebase upstream/next ``` - + {: class="nocopy"} This simply reshuffles your `my_feature` branch patches on top of the current `next branch` in the `upstream` remote. Rebasing is a good idea while your feature branch is still in development. Check out Scott Chacon’s Git Pro book section about diff --git a/_posts/2016-06-28-understanding-data-types.md b/_posts/2016-06-28-understanding-data-types.md index 36307a4e..c7253090 100644 --- a/_posts/2016-06-28-understanding-data-types.md +++ b/_posts/2016-06-28-understanding-data-types.md @@ -119,6 +119,8 @@ typedef unsigned long ulong; unsigned long l1; ulong l2; ``` +{: class="nocopy"} + **Idea to take home:** If your GNSS front-end is delivering samples of 2-bit length, a computer does not know how to handle them. A data type for that length is not defined, so there are no operations defined upon it. Even if you define a specific data type and its related operations, processors and compilers will likely not be optimized for such non-standard type. You need to bring whatever format your _Signal Source_ is delivering to a format that is understandable by the processing environment (processor, operating system, compiler, etc.) in charge of executing GNSS-SDR. Luckily, it is easy to define new formats converters, and they need to be placed at the first processing block that receives the incoming sample stream: the _Data Type_Adapter_. {: .notice--info} @@ -171,7 +173,7 @@ template inline std::complex lv_cmake(const T &r, const T &i){ } ... ``` - +{: class="nocopy"} As shown in the typedefs listed above, VOLK defines type names for objects holding complex numbers in which their real and diff --git a/_posts/2017-01-03-cross-compiling-gnss-sdr.md b/_posts/2017-01-03-cross-compiling-gnss-sdr.md index 303735b6..da54a377 100644 --- a/_posts/2017-01-03-cross-compiling-gnss-sdr.md +++ b/_posts/2017-01-03-cross-compiling-gnss-sdr.md @@ -63,7 +63,7 @@ Head to [https://github.com/carlesfernandez/oe-gnss-sdr-manifest](https://github 1) Install `repo`: -```bash +```console $ curl https://storage.googleapis.com/git-repo-downloads/repo > repo $ chmod a+x repo $ sudo mv repo /usr/local/bin/ @@ -71,14 +71,14 @@ $ sudo mv repo /usr/local/bin/ 2) Create a folder in which all the process will take place: -```bash +```console $ mkdir oe-repo $ cd oe-repo ``` 3) Initialize `repo`, download the required tools and prepare your building environment: -```bash +```console $ repo init -u git://github.com/carlesfernandez/oe-gnss-sdr-manifest.git -b thud $ repo sync $ TEMPLATECONF=`pwd`/meta-gnss-sdr/conf source ./oe-core/oe-init-build-env ./build ./bitbake @@ -89,13 +89,13 @@ This last command copies default configuration information into the `./build/con {% capture branches_info %} Please note that the name of the oe-gnss-sdr-manifest branch passed to `repo` will determine the version of the SDK to be built. For instance, -```bash +```console $ repo init -u git://github.com/carlesfernandez/oe-gnss-sdr-manifest.git -b sumo ``` will generate the Sumo release of the SDK (see the manifest for a list of installed packages and their respective versions), while -```bash +```console $ repo init -u git://github.com/carlesfernandez/oe-gnss-sdr-manifest.git -b thud ``` @@ -111,7 +111,7 @@ will generate the Thud release. 5) Build the image and the toolchain installer: -```bash +```console $ bitbake gnss-sdr-dev-image $ bitbake -c populate_sdk gnss-sdr-dev-image ``` @@ -120,19 +120,19 @@ This process downloads several gigabytes of source code and then proceeds to com If you are using Rocko or above, you can create a Docker image of the target environment by doing: -```bash +```console $ bitbake gnss-sdr-dev-docker ``` This will create a `.docker` file under `./tmp-glibc/deploy/images/` that can be ingested by Docker as: -```bash +```console $ docker load -i /path/to/file.docker ``` For your convenience, you can also directly pull and run this image from an arm32v7-based device: -```bash +```console $ docker run -it carlesfernandez/gnsssdr-dev-arm32v7:thud /bin/bash ``` @@ -151,13 +151,13 @@ Using the SDK Install some basic packages required by the SDK: -```bash +```console $ sudo apt-get install xz-utils python3 ``` Then, download the SDK shell script (or use a locally created SDK, as explained above) and install it: -```bash +```console $ sudo sh oecore-x86_64-armv7ahf-neon-toolchain-nodistro.0.sh ``` @@ -171,7 +171,7 @@ The SDK comes with everything you need to build GNSS-SDR. The main contents it h ### Setting up the cross-compiling environment Running the environment script will set up most of the variables you'll need to compile. You will need to do this each time you want to run the SDK (and since the environment variables are only set for the current shell, you need to source it for every console you will run the SDK from): -```bash +```console $ . /usr/local/oecore-x86_64/environment-setup-armv7ahf-neon-oe-linux-gnueabi ``` @@ -179,7 +179,7 @@ $ . /usr/local/oecore-x86_64/environment-setup-armv7ahf-neon-oe-linux-gnueabi Once the environment script has been run, you can cross-compile GNSS-SDR as: -```bash +```console $ git clone https://github.com/gnss-sdr/gnss-sdr.git $ cd gnss-sdr $ git checkout next @@ -200,7 +200,7 @@ We have several options here: ### Using `dd` -```bash +```console $ mkdir myimage $ tar -xvzf gnss-sdr-dev-image-zedboard-zynq7-20170103150322.rootfs.tar.gz -C myimage $ sudo dd status=progress bs=4M if=myimage of=/dev/sdX @@ -212,7 +212,7 @@ where `/dev/sdX` is the device the card is mounted as. This works, but can be sl This option is faster: -```bash +```console $ git clone https://github.com/01org/bmap-tools.git $ cd bmap-tools $ sudo python setup.py install @@ -223,7 +223,7 @@ $ sudo bmaptool copy gnss-sdr-dev-image-zedboard-zynq7-20170103150322.rootfs.tar For systems with a dedicated u-boot, devicetree and Kernel, it is possible to copy only the cross-compiled sysroot to the SD ext4 partition. Mount the SD card partition and extract the root filesystem to the mounted root directory (in this example, `sdb2` is the SD card device and the ext4 partition is the second partition in the SD partition table), and then use `cp` with the `-a` option, which preserves the same directory tree, same file types, same contents, same metadata (times, permissions, extended attributes, etc.) and same symbolic links: -```bash +```console $ mkdir ./mounted_SD $ sudo mount -rw /dev/sdb2 ./mounted_SD $ cd ./mounted_SD @@ -236,7 +236,7 @@ $ sudo cp /usr/local/oecore-x86_64/sysroots/armv7ahf-neon-oe-linux-gnueabi/* -a For example, let's assume that we can address the device by a network name or IP address. Let's say it's called "mydevice" and it has an ip address of 192.168.2.2. We would use a mount point created in your home directory. To install sshfs and mount mydevice locally: -```bash +```console $ sudo apt-get install sshfs $ sudo gpasswd -a $USER fuse $ cd @@ -246,13 +246,13 @@ $ sshfs -o allow_root root@192.168.2.2:/ mydevice You should be able to `ls mydevice` and see the contents of mydevice's file system. Then you can cross-compile GNSS-SDR as before, changing the last command by: -```bash +```console $ sudo make install DESTDIR=~/mydevice ``` in order to install the GNSS-SDR binary directly in your device. To unmount: -```bash +```console $ fusermount -u ~/mydevice ``` diff --git a/_posts/2017-03-07-configuration-options-building-time.md b/_posts/2017-03-07-configuration-options-building-time.md index 44e75d28..28e3bfaa 100644 --- a/_posts/2017-03-07-configuration-options-building-time.md +++ b/_posts/2017-03-07-configuration-options-building-time.md @@ -29,7 +29,7 @@ The `cmake` executable is the CMake command-line interface. When `cmake` is firs Once all the required dependencies are installed in your system, the default building process is: -```bash +```console $ cd gnss-sdr/build $ cmake .. $ make @@ -38,19 +38,20 @@ $ sudo make install CMake's defaults and GNSS-SDR project configuration settings can be overridden on the command line with the -D option, with the following syntax: -```bash +```console $ cmake -D= ``` +{: class="nocopy"} Thus, if you want to set the variable named `CMAKE_BUILD_TYPE` to the `Debug` value, you can write in your command line: -```bash +```console $ cmake -DCMAKE_BUILD_TYPE=Debug .. ``` You can specify any number of variables: -```bash +```console $ cmake -DCMAKE_BUILD_TYPE=Debug -DENABLE_OSMOSDR=ON .. ``` @@ -82,7 +83,7 @@ The building system honors the usual [CMake variables](https://cmake.org/cmake/h In addition, if the `DESTDIR` environment variable is set, it will be prefixed to `CMAKE_INSTALL_PREFIX` in places where it is used to access files during installation. This allows the files to be installed in an intermediate directory tree without changing the final installation path name. For instance: -```bash +```console $ make DESTDIR=/home/carles install ``` @@ -201,7 +202,7 @@ Some statistical profiling tools require the software under analysis to be compi Please note that you can also use the `run-clang-tidy` script (called `run-clang-tidy.py` in some platforms) to perform checks over all files in the compilation database: -```bash +```console $ run-clang-tidy -checks='-*,modernize-use-nullptr' -fix ``` @@ -209,12 +210,12 @@ You can examine the full [list of clang-tidy checks](https://clang.llvm.org/extr In Debian and Ubuntu machines, clang-tidy can be installed with: -```bash +```console $ sudo apt-get install clang clang-tidy ``` Example of usage: -```bash +```console $ cmake -DCMAKE_CXX_COMPILER=/usr/bin/clang++ \ -DCMAKE_C_COMPILER=/usr/bin/clang \ -DENABLE_CLANG_TIDY=ON .. @@ -239,7 +240,7 @@ By default, the HTML output makes use of [MathJax](https://www.mathjax.org/) loa For instance, in Debian/Ubuntu systems MathJax can be installed as: -```bash +```console $ sudo apt-get install libjs-mathjax ``` diff --git a/_posts/2018-06-30-testing-software-receiver-2.md b/_posts/2018-06-30-testing-software-receiver-2.md index 47717c56..e0334ef9 100644 --- a/_posts/2018-06-30-testing-software-receiver-2.md +++ b/_posts/2018-06-30-testing-software-receiver-2.md @@ -31,7 +31,7 @@ GNSS-SDR tests are divided in two categories: By default, only a (large) subset of unit tests are compiled (see details [below]({{ "#unit-tests" }})). So, when doing: -```bash +```console $ cd gnss-sdr/build $ git checkout next $ cmake .. @@ -41,7 +41,7 @@ $ make check # THIS STEP IS OPTIONAL. It builds and runs a subset of tests. this process will end up generating some executables at the `gnss-sdr/install` folder. Among them, a test program called `run_tests`. This executable gathers all the available GNSS-SDR's unit tests. It can be run by doing: -```bash +```console $ cd ../install $ ./run_tests ``` @@ -61,7 +61,7 @@ Running GNSS-SDR Tests... [ PASSED ] 217 tests. ``` - +{: class="nocopy"} Other additional unit and system tests require from external tools, libraries and data files not included in the GNSS-SDR's source tree. As in the case of the Google C++ Testing Framework source code, they can be automatically downloaded and built by passing the following option flags to CMake: @@ -94,10 +94,11 @@ TestSuite1. TestSuite2. TestCase ``` +{: class="nocopy"} So, running: -```bash +```console $ ./run_tests --gtest_list_tests ``` @@ -126,7 +127,7 @@ The `--gtest_repeat` flag allows you to repeat all (or selected) test methods in For example: -```bash +```console $ ./run_tests --gtest_filter=GpsL1CaPcpsAcquisitionTest.* --gtest_repeat=10 ``` @@ -153,6 +154,7 @@ The format of the report is as follows: ``` +{: class="nocopy"} * The root `` element corresponds to the entire test program. * `` elements correspond to Google Test test suites. @@ -161,19 +163,19 @@ The format of the report is as follows: For example: -```bash +```console $ ./run_tests --gtest_filter=CpuMulticorrelatorTest.* --gtest_output=xml ``` generates a report called `test_detail.xml` in the current directory; -```bash +```console $ ./run_tests --gtest_filter=CpuMulticorrelatorTest.* --gtest_output=xml:./test_results/ ``` generates a report called `run_tests.xml` in a newly created `./test_results` directory; and -```bash +```console $ ./run_tests --gtest_filter=CpuMulticorrelatorTest.* --gtest_output=xml:./test_results/my_tests.xml ``` @@ -189,6 +191,7 @@ All these examples produce the following report: ``` +{: class="nocopy"}   @@ -203,23 +206,23 @@ The generation of some unit test suites are enabled by default, and gathered in * `CodeGenerationTest`: set of test cases for [gnss_signal_replica.h](https://github.com/gnss-sdr/gnss-sdr/blob/next/src/algorithms/libs/gnss_signal_replica.h) measuring the execution time of various implementations of PRN code generation. * `ComplexCarrierTest`: set of test cases for [gnss_signal_replica.h](https://github.com/gnss-sdr/gnss-sdr/blob/next/src/algorithms/libs/gnss_signal_replica.h) measuring the execution time of various implementations of complex carrier generation. The default vector length is $$ 100000 $$, but this test suite accepts the flag `--size_carrier_test`. You can try a different length by doing: - ```bash + ```console $ ./run_tests --gtest_filter=ComplexCarrier* --size_carrier_test=1000000 ``` * `ConjugateTest`: set of test cases measuring the execution time of various implementations of vector conjugation. The default vector length is $$ 100000 $$, but this test suite accepts the flag `--size_conjugate_test`. You can try a different length by doing: - ```bash + ```console $ ./run_tests --gtest_filter=Conjugate* --size_conjugate_test=1000000 ``` * `FFTLengthTest`: set of test cases measuring the execution time for several FFT lengths. The default number of averaged iterations is $$ 1000 $$, but this test suite accepts the flag `--fft_iterations_test`. If you have [Gnuplot](http://www.gnuplot.info/) installed in your system, you can get some plots by adding the flag `--plot_fft_length_test`. You can try a different number of iterations and get some plots by doing: - ```bash + ```console $ ./run_tests --gtest_filter=FFT* --fft_iterations_test=10000 --plot_fft_length_test ``` * `MagnitudeSquaredTest`: set of test cases measuring the execution time of various implementations of vector square magnitude computation. The default vector length is $$ 100000 $$, but this test suite accepts the flag `--size_magnitude_test`. You can try a different length by doing: - ```bash + ```console $ ./run_tests --gtest_filter=Magnitude* --size_magnitude_test=1000000 ``` * `MultiplyTest`: set of test cases measuring the execution time of various implementations of vector (element-by-element) multiplication. The default vector length is $$ 10000 $$, but this test suite accepts the flag `--size_multiply_test`. You can try a different length by doing: - ```bash + ```console $ ./run_tests --gtest_filter=Multiply* --size_multiply_test=100000 ``` @@ -252,14 +255,14 @@ The generation of some unit test suites are enabled by default, and gathered in * Acquisition - `GpsL1CaPcpsAcquisitionTest`: set of test cases for [gps_l1_ca_pcps_acquisition.h](https://github.com/gnss-sdr/gnss-sdr/blob/next/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.h). If Gnuplot is installed in your machine, this test can plot the acquisition grid by passing the flag `--plot_acq_grid`. Example: - ```bash + ```console $ ./run_tests --gtest_filter=GpsL1CaPcpsAcquisitionTest* --plot_acq_grid ``` - `GpsL1CaPcpsAcquisitionGSoC2013Test`: set of test cases for [gps_l1_ca_pcps_acquisition.h](https://github.com/gnss-sdr/gnss-sdr/blob/next/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.h) developed during GSoC 2013. - `GpsL1CaPcpsTongAcquisitionGSoC2013Test`: set of test cases for [gps_l1_ca_pcps_tong_acquisition.h](https://github.com/gnss-sdr/gnss-sdr/blob/next/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_tong_acquisition.h) - `GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test`: set of test cases for [gps_l1_ca_pcps_quicksync_acquisition.h](https://github.com/gnss-sdr/gnss-sdr/blob/next/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_quicksync_acquisition.h) - `GalileoE1PcpsAmbiguousAcquisitionTest`: set of test cases for [galileo_e1_pcps_ambiguous_acquisition.h](https://github.com/gnss-sdr/gnss-sdr/blob/next/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition.h). If Gnuplot is installed in your machine, this test can plot the acquisition grid by passing the flag `--plot_acq_grid`. Example: - ```bash + ```console $ ./run_tests --gtest_filter=GalileoE1PcpsAmbiguousAcquisitionTest* --plot_acq_grid ``` - `GalileoE1PcpsAmbiguousAcquisitionGSoCTest`: set of test cases for [galileo_e1_pcps_ambiguous_acquisition.h](https://github.com/gnss-sdr/gnss-sdr/blob/next/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition.h) developed during GSoC 2012. @@ -271,11 +274,11 @@ The generation of some unit test suites are enabled by default, and gathered in * Tracking - `CpuMulticorrelatorTest`: set of test cases for [cpu_multicorrelator.h](https://github.com/gnss-sdr/gnss-sdr/blob/next/src/algorithms/tracking/libs/cpu_multicorrelator.h) that measure the execution time for multi-correlations of size $$ 2048 $$, $$ 4096 $$ and $$ 8192 $$. By default, the measurements average $$ 1000 $$ independent realizations, a value that can be changed by the flag `--cpu_multicorrelator_iterations_test`. You can also set the number of threads spawn by this program with the flag `--cpu_multicorrelator_max_threads_test`. A possible call for this test could be: - ```bash + ```console $ ./run_tests --gtest_filter=Cpu* --cpu_multicorrelator_iterations_test=10000 --cpu_multicorrelator_max_threads_test=2 ``` - `GpuMulticorrelatorTest`: set of test cases for [cuda_multicorrelator.h](https://github.com/gnss-sdr/gnss-sdr/blob/next/src/algorithms/tracking/libs/cuda_multicorrelator.h) that measure the execution time for multi-correlations of size $$ 2048 $$, $$ 4096 $$ and $$ 8192 $$ executed in the GPU. The availability of this test suite requires the [CUDA Toolkit](https://developer.nvidia.com/cuda-downloads) installed in your system, a GPU [supporting CUDA](https://developer.nvidia.com/cuda-gpus), and have passed the option `-DENABLE_CUDA=ON` to CMake. By default, the measurements average $$ 1000 $$ independent realizations, a value that can be changed by the flag `--gpu_multicorrelator_iterations_test`. You can also set the number of threads spawn by this program with the flag `--gpu_multicorrelator_max_threads_test`. A possible call for this test could be: - ```bash + ```console $ ./run_tests --gtest_filter=Gpu* --gpu_multicorrelator_iterations_test=10000 --gpu_multicorrelator_max_threads_test=2 ``` - `GalileoE1DllPllVemlTrackingInternalTest`: set of test cases for [galileo_e1_dll_pll_veml_tracking.h](https://github.com/gnss-sdr/gnss-sdr/blob/next/src/algorithms/tracking/adapters/galileo_e1_dll_pll_veml_tracking.h) @@ -303,7 +306,7 @@ The generation of some unit test suites are enabled by default, and gathered in This option builds some extra unit tests cases that require external tools not included in the GNSS-SDR source tree. It can be activated by: -```bash +```console $ cmake -DENABLE_UNIT_TESTING_EXTRA=ON .. $ make ``` @@ -362,12 +365,12 @@ This test computes the Receiver Operation Characteristic (ROC), that is, Probabi **Extra Unit Tests for Tracking blocks** * `GpsL1CADllPllTrackingTest`: set of test cases for [gps_l1_ca_dll_pll_tracking.h](https://github.com/gnss-sdr/gnss-sdr/blob/next/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking.h) that make use of the software-defined signal generator. This test plots the correlators' outputs with the flag `--plot_gps_l1_tracking_test`. For long tests, data can be decimated with the flag `--plot_decimate`. For not showing the plots in the screen, but still get the figures in PDF and PS file formats, use `--noshow_plots`. Example: - ```bash + ```console $ ./run_tests --gtest_filter=GpsL1CADllPllTrackingTest* --plot_gps_l1_tracking_test --plot_decimate=10 ``` * `GpsL1CAKfTrackingTest`: set of test cases for [gps_l1_ca_kf_tracking.h](https://github.com/gnss-sdr/gnss-sdr/blob/next/src/algorithms/tracking/adapters/) that make use of the software-defined signal generator. This test plots the correlators' outputs with the flag `--plot_gps_l1_kf_tracking_test`. For long tests, data can be decimated with the flag `--plot_decimate`. For not showing the plots in the screen, but still get the figures in PDF and PS file formats, use `--noshow_plots`. Example: - ```bash + ```console $ ./run_tests --gtest_filter=GpsL1CAKfTrackingTest* --plot_gps_l1_kf_tracking_test --plot_decimate=10 ``` @@ -378,7 +381,7 @@ This test computes the Receiver Operation Characteristic (ROC), that is, Probabi Tracking pull-in test for several Tracking block implementations. It can make use of the software-defined signal generator to produce GPS L1 CA signals at different CN0 levels and to obtain the true synchronization parameters, or to use an external file with any of the supported GNSS signals. The test performs a two-dimensional sweep of Doppler errors and code delay errors for each CN0 to emulate an imperfect signal acquisition in the pull-in tracking step. The test output is a 2D grid plot showing those combinations of Doppler and Code delay errors that produced a valid tracking (green dots) and those that produced a loss of lock (black dots). The criterium to decide a valid tracking is a correct CRC in the demodulation of the navigation message. Example: -```bash +```console $ ./run_tests --gtest_filter=TrackingPullInTest* --plot_detail_level=0 --duration=4 --CN0_dBHz_start=45 CN0_dBHz_stop=35 ``` @@ -461,7 +464,7 @@ Unit test for [hybrid_observables.h](https://github.com/gnss-sdr/gnss-sdr/blob/n This option builds some extra system test programs that require external tools not included in the GNSS-SDR source tree. It can be activated by: -```bash +```console $ cmake -DENABLE_SYSTEM_TESTING=ON .. $ make ``` @@ -489,7 +492,7 @@ Each TTFF sample is computed as the time interval starting with the invocation o So an example of running this test could be: -```bash +```console $ ./ttff --config_file_ttff=my_GPS_rx.conf --num_measurements=50 ``` @@ -519,7 +522,7 @@ The results of the experiment are reported as follows: This option builds some extra system test programs that require external tools not included in the GNSS-SDR source tree. It can be activated by: -```bash +```console $ cmake -DENABLE_SYSTEM_TESTING_EXTRA=ON .. $ make ``` @@ -561,26 +564,26 @@ This test program computes metrics of static accuracy and precision. It can use So an example of running this test could be: -```bash +```console $ ./position_test ``` By default, the program triggers a software-defined GPS L1 C/A signal generator, which takes the default RINEX navigation file (brdc3540.14n, already included in the files automatically downloaded by CMake's `-DENABLE_SYSTEM_TESTING_EXTRA=ON` option) and the default reference location (longitude $$30.286502^o $$, latitude $$ 120.032669^o $$, height $$ 100 $$ m), and generates a RINEX observation file and a raw signal sample file, with a duration of $$ 100 $$ s. Then, it triggers the software receiver and processes such raw data file. At the end of the processing, the program reports several metrics for accuracy and precision. Since the generation of the raw samples file only needs to be executed once, the next time you execute this program, the generation can be skipped by: -```bash +```console $ ./position_test --disable_generator ``` If you have [Gnuplot](http://www.gnuplot.info/) installed in your system, you can get some plots by adding the flag `--plot_position_test`: -```bash +```console $ ./position_test --plot_position_test ``` You can use your own configuration file: -```bash +```console $ ./position_test --config_file_ptest=my_GPS_rx.conf --static_position="0.000000,000000,0" ``` @@ -642,6 +645,7 @@ TEST(test_suite_name, test_case_name) ... test body ... } ``` +{: class="nocopy"} An example of this would be: @@ -696,7 +700,7 @@ The existing tests are also a source of examples on how to write tests. Please p │   │   ├── telemetry_decoder │   │   └── tracking ``` - +{: class="nocopy"} Once the test code is written, you need to build and link it against the Google Test library. This process is managed in the file [gnss-sdr/src/tests/CMakeLists.txt](https://github.com/gnss-sdr/gnss-sdr/blob/next/src/tests/CMakeLists.txt). You will need to list your new test in the appropriate place in order to include it in the building: @@ -707,7 +711,7 @@ Once the test code is written, you need to build and link it against the Google At the end of the building, we should be able to run your new test. In the example provided above, this would be: -```bash +```console $ ./run_tests --gtest_filter=RtcmTest.HexToInt* ``` @@ -727,6 +731,7 @@ Note: Google Test filter = RtcmTest.HexToInt* [==========] 1 test from 1 test suite ran. (2 ms total) [ PASSED ] 1 test. ``` +{: class="nocopy"}   diff --git a/_posts/2019-01-15-monitoring-software-receiver-internal-status.md b/_posts/2019-01-15-monitoring-software-receiver-internal-status.md index b3b8eb84..c1278552 100644 --- a/_posts/2019-01-15-monitoring-software-receiver-internal-status.md +++ b/_posts/2019-01-15-monitoring-software-receiver-internal-status.md @@ -50,7 +50,7 @@ Finally, at the other end, the monitoring client deserializes the Gnss_Synchro o ### Install dependencies Copy and paste the following line in a terminal: -```bash +```console $ sudo apt-get install build-essential cmake libboost-dev libboost-system-dev \ libprotobuf-dev protobuf-compiler libncurses5-dev libncursesw5-dev wget ``` @@ -60,14 +60,14 @@ This will install the GCC/g++ compiler, the CMake build system, and the library Create a new directory in the home folder for storing all the source files of our project: -```bash +```console $ mkdir monitoring-client $ cd monitoring-client ``` Use the following command to download the `gnss_synchro.proto` file from the GNSS-SDR GitHub repository into the project folder: -```bash +```console $ wget https://raw.githubusercontent.com/gnss-sdr/gnss-sdr/next/docs/protobuf/gnss_synchro.proto ``` @@ -389,13 +389,13 @@ Save it in the project folder alongside the project source files. Next, create a build folder inside the project folder: -```bash +```console $ mkdir build ``` We can make use of the `tree` command to list the contents of our project folder in a tree-like format. This is how it should look at this stage: -```bash +```console $ tree . ├── build @@ -407,10 +407,11 @@ $ tree 1 directory, 5 files ``` +{: class="nocopy"} Finally go ahead and build the source code: -```bash +```console $ cd build $ cmake ../ $ make @@ -418,10 +419,11 @@ $ make The `monitoring-client` executable will be created in the build folder. Try running it with no arguments. It should print the usage help: -```bash +```console $ ./monitoring-client Usage: monitoring-client ``` +{: class="nocopy"} Our monitoring client is ready. We have completed the first half of this tutorial. Now let's go ahead and configure the receiver. @@ -434,7 +436,7 @@ In order to run the receiver, we are going to use the same signal source file th It is convenient to store the signal file and the receiver configuration in a separate directory from the project folder. Create a work directory in your home folder: -```bash +```console $ cd ~ $ mkdir work $ cd work @@ -442,7 +444,7 @@ $ cd work Download the [file]({{ "/my-first-fix/#step-2-download-a-file-of-raw-signal-samples" | relative_url }}) containing the GNSS raw signal samples. This can be done directly from the terminal: -```bash +```console $ wget https://sourceforge.net/projects/gnss-sdr/files/data/2013_04_04_GNSS_SIGNAL_at_CTTC_SPAIN.tar.gz $ tar -zxvf 2013_04_04_GNSS_SIGNAL_at_CTTC_SPAIN.tar.gz ``` @@ -534,25 +536,26 @@ Please do not forget to point `SignalSource.filename` to the actual path of your We are now ready to test our application. Switch back to the other terminal window and start the monitoring client on port 1234: -```bash +```console $ ./monitoring-client 1234 ``` You will see this message printed on the screen: -```bash +```console Listening on port 1234 UDP... ``` +{: class="nocopy"} Now start the receiver on the other terminal window: -```bash +```console $ gnss-sdr -c ./my-first-GNSS-SDR-receiver.conf ``` If all worked fine you should see a table like this: -```bash +```console CH PRN CN0 [dB-Hz] Doppler [Hz] 0 1 44.205502 7175.743399 2 17 43.886524 10032.649712 @@ -560,6 +563,7 @@ CH PRN CN0 [dB-Hz] Doppler [Hz] 4 20 42.442753 8469.028326 6 32 43.016476 6550.037773 ``` +{: class="nocopy"} If you see something similar to this... Yay! You are successfully monitoring the internals of your open source software-defined GPS receiver! {: .notice--success} diff --git a/_quick-start/03-build-and-install.md b/_quick-start/03-build-and-install.md index c951a2d1..43a1bfb9 100644 --- a/_quick-start/03-build-and-install.md +++ b/_quick-start/03-build-and-install.md @@ -25,7 +25,7 @@ This page describes several ways to build and install GNSS-SDR. Starting from Debian 9 and Ubuntu 16.04, you can install GNSS-SDR just by doing: -```bash +```console $ sudo apt-get install gnss-sdr ``` @@ -46,7 +46,7 @@ If everything went fine, you can directly jump into how to get your [first posit If you are using macOS 11 Big Sur (or Mac OS X 10.9 and above), and the [Macports](https://www.macports.org/) package manager, GNSS-SDR can be installed by typing in a Terminal: -```bash +```console $ sudo port install gnss-sdr ``` @@ -56,7 +56,7 @@ This will install the latest stable release of GNSS-SDR. {% capture mac-os-text %} Instead of installing the latest stable release, you can install the code found on the `next` branch, which might contain some bug fixes and new features with respect to the latest stable release: -```bash +```console $ sudo port install gnss-sdr-devel ``` {% endcapture %} @@ -100,7 +100,7 @@ Some highly automated tools that can do some of the work for you are described b If you are using Debian 8, Ubuntu 14.10 or above, this can be done by copying and pasting the following line in a terminal: -```bash +```console $ sudo apt-get install build-essential cmake git pkg-config libboost-dev \ libboost-date-time-dev libboost-system-dev libboost-filesystem-dev \ libboost-thread-dev libboost-chrono-dev libboost-serialization-dev \ @@ -129,44 +129,44 @@ This option is adequate if you are interested in development, in working with th First of all, install some basic packages: -```bash +```console $ sudo apt-get install git python3-pip ``` Download, build and install PyBOMBS: -```bash +```console $ sudo pip3 install --upgrade git+https://github.com/gnuradio/pybombs.git ``` Apply a configuration: -```bash +```console $ pybombs auto-config ``` Add list of default recipes (_i.e._, instructions on how to install software dependencies): -```bash +```console $ pybombs recipes add-defaults ``` Download, build and install GNU Radio, related drivers and some other extra modules into the directory `/path/to/prefix` (replace this path by your preferred one, for instance `$HOME/sdr`): -```bash +```console $ pybombs prefix init /path/to/prefix -a myprefix -R gnuradio-default ``` This will perform a local installation of the dependencies under `/path/to/prefix`, so they will not be visible when opening a new terminal. In order to make them available, you will need to set up the adequate environment variables by sourcing the `setup_env.sh` script: -```bash +```console $ cd /path/to/prefix $ . ./setup_env.sh ``` Now you are ready to use GNU Radio and to jump into [building GNSS-SDR](#build) after installing a few other dependencies. Actually, those are steps that PyBOMBS can do for you as well: -```bash +```console $ pybombs install gnss-sdr ``` @@ -174,7 +174,7 @@ By default, PyBOMBS installs the ‘next’ branch of GNSS-SDR development, whic In case you do not want to use PyBOMBS and prefer to build and install GNSS-SDR step by step (i.e., cloning the repository and doing the usual `cmake .. && make && sudo make install` dance, as explained below), there are still some missing dependencies (_i.e._, Armadillo, GFlags, Glog, GnuTLS and Protocol Buffers) that can be installed either by using PyBOMBS: -```bash +```console $ pybombs install armadillo gflags glog gnutls protobuf ``` @@ -186,7 +186,7 @@ or manually, just downloading, building and installing them. More details are av Once all the dependencies are installed in your system, you are ready to clone the repository, build the source code and install the software in your system: -```bash +```console $ git clone https://github.com/gnss-sdr/gnss-sdr $ cd gnss-sdr/build $ git checkout next @@ -199,7 +199,7 @@ The step `git checkout next` is optional, and sets the source tree pointing to t In addition, CMake accepts a number of configuration options for your building process. For instance, if you want to compile your source in "Debug" mode instead of the default "Release", you can type: -```bash +```console $ cmake -DCMAKE_BUILD_TYPE=Debug .. ``` @@ -214,7 +214,7 @@ If everything went fine in the building process, now you can jump into how to ge [Ninja](https://ninja-build.org/) is a small build system with a focus on speed, that can be seen as a replacement for `make`. If the parameter `-GNinja` is passed to CMake, it generates a `build.ninja` file (instead of a `Makefile`) that is used by the Ninja build system to compile and link the source code. Thus, after cloning the repository, the build workflow is: -```bash +```console $ cd gnss-sdr/build $ git checkout next $ cmake -GNinja .. @@ -224,49 +224,47 @@ $ sudo ninja install In general, the compilation time when using Ninja is comparable to that when using Make for a full build, although its performance is quite platform dependent. Ninja is specially targeted to improve performance in large projects and for incremental builds, so it seems to be a good replacement for Make especially for developers who need to often recompile the source code. In Debian-based GNU/Linux distributions, it can be installed by doing: -```bash +```console $ sudo apt-get install ninja-build ``` On macOS, Ninja can be installed using Macports: -```bash +```console $ sudo port install ninja ``` or Homebrew: -```bash +```console $ brew install ninja ``` More information about Ninja usage can be found in the [Ninja Manual](https://ninja-build.org/manual.html). - - ## Using Clang [Clang](https://clang.llvm.org/) is a compiler front end for C, C++ and other programming languages. It uses [LLVM](https://llvm.org/) as its back end, and it is designed to be able to replace the full GNU Compiler Collection ([GCC](https://gcc.gnu.org/)). Under macOS, this compiler is used by default. In GNU/Linux, it can be used to build GNSS-SDR in replacement of GCC. In Debian/Ubuntu-based distributions, Clang can be installed by doing: -```bash +```console $ sudo apt-get install clang ``` -Other packages specifying the Clang version, such as `clang-3.4`, `clang-3.8`, `clang-4.0`, `clang-5.0`, `clang-6.0`, `clang-7`, `clang-8`, `clang-9` or `clang-10` could exist for your distribution, check its documentation. Once installed, its use can be configured by passing the following parameters to CMake: +Other packages specifying the Clang version, such as `clang-3.4`, `clang-3.8`, `clang-4.0`, `clang-5.0`, ..., or `clang-11` could exist for your distribution, check its documentation. Once installed, its use can be configured by passing the following parameters to CMake: -```bash -$ cmake -DCMAKE_CXX_COMPILER=/usr/bin/clang++-10 -DCMAKE_C_COMPILER=/usr/bin/clang-10 .. +```console +$ cmake -DCMAKE_CXX_COMPILER=/usr/bin/clang++-11 -DCMAKE_C_COMPILER=/usr/bin/clang-11 .. ``` -of course replacing `10` by the actual version installed in your machine. Some distributions drop the version number, so you may just have `/usr/bin/clang++` and `/usr/bin/clang`. +of course replacing `11` by the actual version installed in your machine. Some distributions drop the version number, so you may just have `/usr/bin/clang++` and `/usr/bin/clang`. If you have the Ninja build system installed, you can build GNSS-SDR replacing GCC and `make` by Clang and Ninja: -```bash -$ cmake -DCMAKE_CXX_COMPILER=/usr/bin/clang++-10 -DCMAKE_C_COMPILER=/usr/bin/clang-10 -GNinja .. +```console +$ cmake -DCMAKE_CXX_COMPILER=/usr/bin/clang++-11 -DCMAKE_C_COMPILER=/usr/bin/clang-11 -GNinja .. ``` ## Using Xcode @@ -275,7 +273,7 @@ $ cmake -DCMAKE_CXX_COMPILER=/usr/bin/clang++-10 -DCMAKE_C_COMPILER=/usr/bin/cla In order to build GNSS-SDR with Xcode, pass the following parameter to CMake: -```bash +```console $ cmake -GXcode .. ``` @@ -283,12 +281,12 @@ This will create a `gnss-sdr.xcodeproj` project that can be opened by Xcode (in You can also build from the command line: -```bash +```console $ xcodebuild ``` or -```bash +```console $ xcodebuild -config Release ``` @@ -323,25 +321,25 @@ Releases of Docker images with GNSS-SDR already installed are available from the * An image based on Ubuntu with dependencies installed via .deb packages - ```bash + ```console $ docker run -it carlesfernandez/docker-gnsssdr ``` The latest built from GNSS-SDR's `next` branch can be pulled as: - ```bash + ```console $ docker pull carlesfernandez/docker-gnsssdr:latest ``` * An image based on Ubuntu with dependencies built and installed via PyBOMBS: - ```bash + ```console $ docker run -it carlesfernandez/docker-pybombs-gnsssdr ``` The latest built from GNSS-SDR's `next` branch can be pulled as: - ```bash + ```console $ docker pull carlesfernandez/docker-pybombs-gnsssdr:latest ``` diff --git a/_quick-start/04-my-first-position-fix.md b/_quick-start/04-my-first-position-fix.md index d9c6cddf..46914657 100644 --- a/_quick-start/04-my-first-position-fix.md +++ b/_quick-start/04-my-first-position-fix.md @@ -18,40 +18,42 @@ toc_sticky: true This guide assumes that GNSS-SDR and its software dependencies are already installed on your system. In order to check whether it is correctly installed, open a terminal and type: -```bash +```console $ gnss-sdr --version ``` you should see something similar to: -```bash +```console $ gnss-sdr --version gnss-sdr version 0.0.14 $ ``` +{: class="nocopy"} Please check that your installed version is 0.0.14 (or something like 0.0.14.git-`branchname`-`githash` if you built the code from a source code snapshot). Older versions could not work for the example shown here. If you installed GNSS-SDR by doing `sudo apt-get install gnss-sdr` and you got a version earlier to 0.0.14, please do `sudo apt-get remove gnss-sdr` and [build it from source]({{ "/build-and-install/#build" | relative_url }}). {: .notice--warning} If you see something like: -```bash +```console $ gnss-sdr --version gnss-sdr: command not found $ ``` +{: class="nocopy"} please check out the [building guide]({{ "/build-and-install/" | relative_url }}) and the [README.md](https://github.com/gnss-sdr/gnss-sdr/blob/master/README.md) file for more details on how to install GNSS-SDR. In order to take advantage of the SIMD instruction sets present in your processor, you will need to run the profiler tools of the VOLK and VOLK_GNSSSDR libraries (these operations only need to be done once, and can take a while): -```bash +```console $ volk_profile ``` and -```bash +```console $ volk_gnsssdr_profile ``` @@ -59,7 +61,7 @@ $ volk_gnsssdr_profile Now it's time to download the file containing the GNSS raw signal samples. This can be done directly from the terminal: -```bash +```console $ mkdir work $ cd work $ wget https://sourceforge.net/projects/gnss-sdr/files/data/2013_04_04_GNSS_SIGNAL_at_CTTC_SPAIN.tar.gz @@ -154,7 +156,7 @@ Ok, let's recap. We have: So, we are ready to run our software-defined GPS receiver. In a terminal, type: -```bash +```console $ gnss-sdr --config_file=./my-first-GNSS-SDR-receiver.conf ``` @@ -174,6 +176,7 @@ Starting a TCP/IP server of RTCM messages on port 2101 The TCP/IP server of RTCM messages is up and running. Accepting connections ... ... ``` +{: class="nocopy"} Then, after some seconds detecting GPS signals and decoding some frames of their navigation messages (at least, subframes 1, 2 and 3 from four satellites)... @@ -227,6 +230,7 @@ Position at 2013-Apr-04 06:23:37.500000 UTC using 4 observations is Lat = 41.274 Current receiver time: 32 s ... ``` +{: class="nocopy"} If you see something similar to this... Yay! You are getting position fixes with your open source software-defined GPS receiver! @@ -244,6 +248,7 @@ GNSS-SDR program ended. Stopping TCP/IP server on port 2101 $ ``` +{: class="nocopy"} Now you can examine the processing outputs in the folder from which you invoked GNSS-SDR: diff --git a/_quick-start/05-configurations.md b/_quick-start/05-configurations.md index b775017e..781f133a 100644 --- a/_quick-start/05-configurations.md +++ b/_quick-start/05-configurations.md @@ -119,6 +119,7 @@ UHD Find Devices Allowed options: --help help message --args arg device address args ``` +{: class="nocopy"} Then, you can search your USRP in a specific IP address: @@ -137,6 +138,7 @@ Device Address: serial: F5CA38 product: X300 ``` +{: class="nocopy"} or by typing: @@ -255,6 +257,7 @@ PVT.rtcm_MT1019_rate_ms=5000 PVT.rtcm_MT1077_rate_ms=1000 PVT.rinex_version=2 ``` +{: class="nocopy"} You will need to adjust the values for at least two parameters: @@ -267,7 +270,7 @@ The [Signal Processing Blocks documentation]({{ "/docs/sp-blocks/" | relative_ur Once the hardware and the software configurations are ready, go to your favorite working directory where the file `my_GPS_receiver.conf` was stored and invoke the software receiver with this particular configuration: -```bash +```console $ gnss-sdr --config_file=./my_GPS_receiver.conf ``` @@ -300,6 +303,7 @@ Starting a TCP Server on port 2101 The TCP Server is up and running. Accepting connections ... ... ``` +{: class="nocopy"} Of course, file `my_GPS_receiver.conf` can be wherever (`--config-file` accepts both relative and absolute paths), and the data displayed at the terminal output might vary according to your setup. @@ -352,6 +356,7 @@ Current input signal time = 68 [s] ... ``` +{: class="nocopy"} If you see something similar to this... Yay! You are getting real-time position fixes with your open source software-defined GPS receiver! {: .notice--success} @@ -374,6 +379,7 @@ GNSS-SDR program ended. Stopping TCP Server on port 2101 $ ``` +{: class="nocopy"} Now you can examine the files created in your working folder. @@ -433,13 +439,13 @@ In order to get real-time position fixes, you will need: This device requires the use of the [`Osmosdr_Signal_Source`]({{ "/docs/sp-blocks/signal-source/#implementation-osmosdr_signal_source" | relative_url }}) implementation. If you installed GNSS-SDR from a software package, this implementation is already available. But if you are building GNSS-SDR from the source code, you will need the required software dependencies (the `gr-osmosdr` component of GNU Radio) and configure the building with the following flag: -```bash +```console $ cmake -DENABLE_OSMOSDR=ON ../ ``` and then build and install the software: -```bash +```console $ make $ sudo make install ``` @@ -572,12 +578,13 @@ PVT.rtcm_MT1077_rate_ms=1000 PVT.rinex_version=2 ``` +{: class="nocopy"} Copy and paste this configuration in your favorite plain text editor and save it as, for instance, `hackrf_GPS_L1.conf`. Once the hardware and the software configurations are ready, go to your favorite working directory where the file `hackrf_GPS_L1.conf` was stored and invoke the software receiver with this particular configuration: -```bash +```console $ gnss-sdr --config_file=./hackrf_GPS_L1.conf ``` diff --git a/_sass/minimal-mistakes/_colors.scss b/_sass/minimal-mistakes/_colors.scss index 7f6c37b7..cd19fd45 100644 --- a/_sass/minimal-mistakes/_colors.scss +++ b/_sass/minimal-mistakes/_colors.scss @@ -83,7 +83,7 @@ $colors: ( base01: #3a3c4e, base02: #4d4f68, base03: #626483, - base04: #62d6e8, + base04: #f07178, base05: #e9e9f4, base06: #f1f2f8, base07: #f7f7fb, diff --git a/_sass/minimal-mistakes/_utilities.scss b/_sass/minimal-mistakes/_utilities.scss index d16ace1f..e3602b0d 100644 --- a/_sass/minimal-mistakes/_utilities.scss +++ b/_sass/minimal-mistakes/_utilities.scss @@ -595,3 +595,54 @@ a.reversefootnote { position: static; } } + + +/* + Copy
 block to clipboard
+   ========================================================================== */
+
+// a ",y.noCloneChecked=!!f.cloneNode(!0).lastChild.defaultValue,f.innerHTML="",y.option=!!f.lastChild;var pe={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function he(e,t){var n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[];return void 0===t||t&&A(e,t)?E.merge([e],n):n}function me(e,t){for(var n=0,r=e.length;n",""]);var ge=/<|&#?\w+;/;function ve(e,t,n,r,o){for(var i,a,s,l,u,c=t.createDocumentFragment(),f=[],d=0,p=e.length;d\s*$/g;function Ie(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&E(e).children("tbody")[0]||e}function je(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Le(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function De(e,t){var n,r,o,i;if(1===t.nodeType){if(Y.hasData(e)&&(i=Y.get(e).events))for(o in Y.remove(t,"handle events"),i)for(n=0,r=i[o].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",o=function(e){r.remove(),o=null,e&&t("error"===e.type?404:200,e.type)}),T.head.appendChild(r[0])},abort:function(){o&&o()}}});var Jt=[],Gt=/(=)\?(?=&|$)|\?\?/;E.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Jt.pop()||E.expando+"_"+It.guid++;return this[e]=!0,e}}),E.ajaxPrefilter("json jsonp",function(e,t,n){var r,o,i,a=!1!==e.jsonp&&(Gt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Gt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=b(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Gt,"$1"+r):!1!==e.jsonp&&(e.url+=(jt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return i||E.error(r+" was not called"),i[0]},e.dataTypes[0]="json",o=C[r],C[r]=function(){i=arguments},n.always(function(){void 0===o?E(C).removeProp(r):C[r]=o,e[r]&&(e.jsonpCallback=t.jsonpCallback,Jt.push(r)),i&&b(o)&&o(i[0]),i=o=void 0}),"script"}),y.createHTMLDocument=((f=T.implementation.createHTMLDocument("").body).innerHTML="
",2===f.childNodes.length),E.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=T.implementation.createHTMLDocument("")).createElement("base")).href=T.location.href,t.head.appendChild(r)):t=T),r=!n&&[],(n=N.exec(e))?[t.createElement(n[1])]:(n=ve([e],t,r),r&&r.length&&E(r).remove(),E.merge([],n.childNodes)));var r},E.fn.load=function(e,t,n){var r,o,i,a=this,s=e.indexOf(" ");return-1").append(E.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,i||[e.responseText,t,e])})}),this},E.expr.pseudos.animated=function(t){return E.grep(E.timers,function(e){return t===e.elem}).length},E.offset={setOffset:function(e,t,n){var r,o,i,a,s=E.css(e,"position"),l=E(e),u={};"static"===s&&(e.style.position="relative"),i=l.offset(),r=E.css(e,"top"),a=E.css(e,"left"),a=("absolute"===s||"fixed"===s)&&-1<(r+a).indexOf("auto")?(o=(s=l.position()).top,s.left):(o=parseFloat(r)||0,parseFloat(a)||0),null!=(t=b(t)?t.call(e,n,E.extend({},i)):t).top&&(u.top=t.top-i.top+o),null!=t.left&&(u.left=t.left-i.left+a),"using"in t?t.using.call(e,u):("number"==typeof u.top&&(u.top+="px"),"number"==typeof u.left&&(u.left+="px"),l.css(u))}},E.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){E.offset.setOffset(this,t,e)});var e,n=this[0];return n?n.getClientRects().length?(e=n.getBoundingClientRect(),n=n.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],o={top:0,left:0};if("fixed"===E.css(r,"position"))t=r.getBoundingClientRect();else{for(t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;e&&(e===n.body||e===n.documentElement)&&"static"===E.css(e,"position");)e=e.parentNode;e&&e!==r&&1===e.nodeType&&((o=E(e).offset()).top+=E.css(e,"borderTopWidth",!0),o.left+=E.css(e,"borderLeftWidth",!0))}return{top:t.top-o.top-E.css(r,"marginTop",!0),left:t.left-o.left-E.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&"static"===E.css(e,"position");)e=e.offsetParent;return e||re})}}),E.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,o){var i="pageYOffset"===o;E.fn[t]=function(e){return B(this,function(e,t,n){var r;return m(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n?r?r[o]:e[t]:void(r?r.scrollTo(i?r.pageXOffset:n,i?n:r.pageYOffset):e[t]=n)},t,e,arguments.length)}}),E.each(["top","left"],function(e,n){E.cssHooks[n]=Je(y.pixelPosition,function(e,t){if(t)return t=Ye(e,n),We.test(t)?E(e).position()[n]+"px":t})}),E.each({Height:"height",Width:"width"},function(a,s){E.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,i){E.fn[i]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),o=r||(!0===e||!0===t?"margin":"border");return B(this,function(e,t,n){var r;return m(e)?0===i.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?E.css(e,t,o):E.style(e,t,n,o)},s,n?e:void 0,n)}})}),E.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){E.fn[t]=function(e){return this.on(t,e)}}),E.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),E.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(e,n){E.fn[n]=function(e,t){return 0x

',t.appendChild(n.childNodes[1])),e&&i.extend(o,e),this.each(function(){var e=['iframe[src*="player.vimeo.com"]','iframe[src*="youtube.com"]','iframe[src*="youtube-nocookie.com"]','iframe[src*="kickstarter.com"][src*="video.html"]',"object","embed"];o.customSelector&&e.push(o.customSelector);var r=".fitvidsignore";o.ignore&&(r=r+", "+o.ignore);e=i(this).find(e.join(","));(e=(e=e.not("object object")).not(r)).each(function(e){var t,n=i(this);0
').parent(".fluid-width-video-wrapper").css("padding-top",100*t+"%"),n.removeAttr("height").removeAttr("width"))})})}}(window.jQuery||window.Zepto),$(function(){var n,r,e,o,t=$("nav.greedy-nav .greedy-nav__toggle"),i=$("nav.greedy-nav .visible-links"),a=$("nav.greedy-nav .hidden-links"),s=$("nav.greedy-nav"),l=$("nav.greedy-nav .site-logo"),u=$("nav.greedy-nav .site-logo img"),c=$("nav.greedy-nav .site-title"),f=$("nav.greedy-nav button.search__toggle");function d(){function t(e,t){r+=t,n+=1,o.push(r)}r=n=0,e=1e3,o=[],i.children().outerWidth(t),a.children().each(function(){var e;(e=(e=$(this)).clone()).css("visibility","hidden"),i.append(e),t(0,e.outerWidth()),e.remove()})}d();var p,h,m,g,v=$(window).width(),y=v<768?0:v<1024?1:v<1280?2:3;function b(){var e=(v=$(window).width())<768?0:v<1024?1:v<1280?2:3;e!==y&&d(),y=e,h=i.children().length,p=s.innerWidth()-(0!==l.length?l.outerWidth(!0):0)-c.outerWidth(!0)-(0!==f.length?f.outerWidth(!0):0)-(h!==o.length?t.outerWidth(!0):0),m=o[h-1],po[h]&&(a.children().first().appendTo(i),h+=1,b()),t.attr("count",n-h),h===n?t.addClass("hidden"):t.removeClass("hidden")}$(window).resize(function(){b()}),t.on("click",function(){a.toggleClass("hidden"),clearTimeout(g)}),a.on("mouseleave",function(){g=setTimeout(function(){a.addClass("hidden")},e)}).on("mouseenter",function(){clearTimeout(g)}),0===u.length||u[0].complete||0!==u[0].naturalWidth?b():u.one("load error",b)}),function(u){function e(){}function c(e,t){h.ev.on("mfp"+e+w,t)}function f(e,t,n,r){var o=document.createElement("div");return o.className="mfp-"+e,n&&(o.innerHTML=n),r?t&&t.appendChild(o):(o=u(o),t&&o.appendTo(t)),o}function d(e,t){h.ev.triggerHandler("mfp"+e,t),h.st.callbacks&&(e=e.charAt(0).toLowerCase()+e.slice(1),h.st.callbacks[e]&&h.st.callbacks[e].apply(h,u.isArray(t)?t:[t]))}function p(e){return e===t&&h.currTemplate.closeBtn||(h.currTemplate.closeBtn=u(h.st.closeMarkup.replace("%title%",h.st.tClose)),t=e),h.currTemplate.closeBtn}function i(){u.magnificPopup.instance||((h=new e).init(),u.magnificPopup.instance=h)}var h,r,m,g,o,v,t,l="Close",y="BeforeClose",b="MarkupParse",x="Open",w=".mfp",C="mfp-ready",n="mfp-removing",a="mfp-prevent-close",s=!!window.jQuery,T=u(window);function E(){A&&(S.after(A.addClass(k)).detach(),A=null)}e.prototype={constructor:e,init:function(){var e=navigator.appVersion;h.isIE7=-1!==e.indexOf("MSIE 7."),h.isIE8=-1!==e.indexOf("MSIE 8."),h.isLowIE=h.isIE7||h.isIE8,h.isAndroid=/android/gi.test(e),h.isIOS=/iphone|ipad|ipod/gi.test(e),h.supportsTransition=function(){var e=document.createElement("p").style,t=["ms","O","Moz","Webkit"];if(void 0!==e.transition)return!0;for(;t.length;)if(t.pop()+"Transition"in e)return!0;return!1}(),h.probablyMobile=h.isAndroid||h.isIOS||/(Opera Mini)|Kindle|webOS|BlackBerry|(Opera Mobi)|(Windows Phone)|IEMobile/i.test(navigator.userAgent),g=u(document),h.popupsCache={}},open:function(e){if(m=m||u(document.body),!1===e.isObj){h.items=e.items.toArray(),h.index=0;for(var t,n=e.items,r=0;r(e||T.height())},_setFocus:function(){(h.st.focus?h.content.find(h.st.focus).eq(0):h.wrap).focus()},_onFocusIn:function(e){if(e.target!==h.wrap[0]&&!u.contains(h.wrap[0],e.target))return h._setFocus(),!1},_parseMarkup:function(o,e,t){var i;t.data&&(e=u.extend(t.data,e)),d(b,[o,e,t]),u.each(e,function(e,t){return void 0===t||!1===t||void(1<(i=e.split("_")).length?0<(n=o.find(w+"-"+i[0])).length&&("replaceWith"===(r=i[1])?n[0]!==t[0]&&n.replaceWith(t):"img"===r?n.is("img")?n.attr("src",t):n.replaceWith(''):n.attr(i[1],t)):o.find(w+"-"+e).html(t));var n,r})},_getScrollbarSize:function(){var e;return void 0===h.scrollbarSize&&((e=document.createElement("div")).id="mfp-sbm",e.style.cssText="width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;",document.body.appendChild(e),h.scrollbarSize=e.offsetWidth-e.clientWidth,document.body.removeChild(e)),h.scrollbarSize}},u.magnificPopup={instance:null,proto:e.prototype,modules:[],open:function(e,t){return i(),(e=e?u.extend(!0,{},e):{}).isObj=!0,e.index=t||0,this.instance.open(e)},close:function(){return u.magnificPopup.instance&&u.magnificPopup.instance.close()},registerModule:function(e,t){t.options&&(u.magnificPopup.defaults[e]=t.options),u.extend(this.proto,t.proto),this.modules.push(e)},defaults:{disableOn:0,key:null,midClick:!1,mainClass:"",preloader:!0,focus:"",closeOnContentClick:!1,closeOnBgClick:!0,closeBtnInside:!0,showCloseBtn:!0,enableEscapeKey:!0,modal:!1,alignTop:!1,removalDelay:0,prependTo:null,fixedContentPos:"auto",fixedBgPos:"auto",overflowY:"auto",closeMarkup:'',tClose:"Close (Esc)",tLoading:"Loading..."}},u.fn.magnificPopup=function(e){i();var t,n,r,o=u(this);return"string"==typeof e?"open"===e?(t=s?o.data("magnificPopup"):o[0].magnificPopup,n=parseInt(arguments[1],10)||0,r=t.items?t.items[n]:(r=o,(r=t.delegate?r.find(t.delegate):r).eq(n)),h._openClick({mfpEl:r},o,t)):h.isOpen&&h[e].apply(h,Array.prototype.slice.call(arguments,1)):(e=u.extend(!0,{},e),s?o.data("magnificPopup",e):o[0].magnificPopup=e,h.addGroup(o,e)),o};var k,S,A,N="inline";function I(){L&&m.removeClass(L)}function j(){I(),h.req&&h.req.abort()}u.magnificPopup.registerModule(N,{options:{hiddenClass:"hide",markup:"",tNotFound:"Content not found"},proto:{initInline:function(){h.types.push(N),c(l+"."+N,function(){E()})},getInline:function(e,t){if(E(),e.src){var n,r=h.st.inline,o=u(e.src);return o.length?((n=o[0].parentNode)&&n.tagName&&(S||(k=r.hiddenClass,S=f(k),k="mfp-"+k),A=o.after(S).detach().removeClass(k)),h.updateStatus("ready")):(h.updateStatus("error",r.tNotFound),o=u("
")),e.inlineElement=o}return h.updateStatus("ready"),h._parseMarkup(t,{},e),t}}});var L,D,_,O="ajax";function P(e){var t;!h.currTemplate[H]||(t=h.currTemplate[H].find("iframe")).length&&(e||(t[0].src="//about:blank"),h.isIE8&&t.css("display",e?"block":"none"))}u.magnificPopup.registerModule(O,{options:{settings:null,cursor:"mfp-ajax-cur",tError:'The content could not be loaded.'},proto:{initAjax:function(){h.types.push(O),L=h.st.ajax.cursor,c(l+"."+O,j),c("BeforeChange."+O,j)},getAjax:function(r){L&&m.addClass(L),h.updateStatus("loading");var e=u.extend({url:r.src,success:function(e,t,n){n={data:e,xhr:n};d("ParseAjax",n),h.appendContent(u(n.data),O),r.finished=!0,I(),h._setFocus(),setTimeout(function(){h.wrap.addClass(C)},16),h.updateStatus("ready"),d("AjaxContentAdded")},error:function(){I(),r.finished=r.loadError=!0,h.updateStatus("error",h.st.ajax.tError.replace("%url%",r.src))}},h.st.ajax.settings);return h.req=u.ajax(e),""}}}),u.magnificPopup.registerModule("image",{options:{markup:'
',cursor:"mfp-zoom-out-cur",titleSrc:"title",verticalFit:!0,tError:'The image could not be loaded.'},proto:{initImage:function(){var e=h.st.image,t=".image";h.types.push("image"),c(x+t,function(){"image"===h.currItem.type&&e.cursor&&m.addClass(e.cursor)}),c(l+t,function(){e.cursor&&m.removeClass(e.cursor),T.off("resize"+w)}),c("Resize"+t,h.resizeImage),h.isLowIE&&c("AfterChange",h.resizeImage)},resizeImage:function(){var e,t=h.currItem;t&&t.img&&h.st.image.verticalFit&&(e=0,h.isLowIE&&(e=parseInt(t.img.css("padding-top"),10)+parseInt(t.img.css("padding-bottom"),10)),t.img.css("max-height",h.wH-e))},_onImageHasSize:function(e){e.img&&(e.hasSize=!0,D&&clearInterval(D),e.isCheckingImgSize=!1,d("ImageHasSize",e),e.imgHidden&&(h.content&&h.content.removeClass("mfp-loading"),e.imgHidden=!1))},findImageSize:function(t){var n=0,r=t.img[0],o=function(e){D&&clearInterval(D),D=setInterval(function(){0
',srcAction:"iframe_src",patterns:{youtube:{index:"youtube.com",id:"v=",src:"//www.youtube.com/embed/%id%?autoplay=1"},vimeo:{index:"vimeo.com/",id:"/",src:"//player.vimeo.com/video/%id%?autoplay=1"},gmaps:{index:"//maps.google.",src:"%id%&output=embed"}}},proto:{initIframe:function(){h.types.push(H),c("BeforeChange",function(e,t,n){t!==n&&(t===H?P():n===H&&P(!0))}),c(l+"."+H,function(){P()})},getIframe:function(e,t){var n=e.src,r=h.st.iframe;u.each(r.patterns,function(){if(-1',preload:[0,2],navigateByImgClick:!0,arrows:!0,tPrev:"Previous (Left arrow key)",tNext:"Next (Right arrow key)",tCounter:"%curr% of %total%"},proto:{initGallery:function(){var i=h.st.gallery,e=".mfp-gallery",r=Boolean(u.fn.mfpFastClick);if(h.direction=!0,!i||!i.enabled)return!1;v+=" mfp-gallery",c(x+e,function(){i.navigateByImgClick&&h.wrap.on("click"+e,".mfp-img",function(){if(1=h.index,h.index=e,h.updateItemHTML()},preloadNearbyImages:function(){for(var e=h.st.gallery.preload,t=Math.min(e[0],h.items.length),n=Math.min(e[1],h.items.length),r=1;r<=(h.direction?n:t);r++)h._preloadItem(h.index+r);for(r=1;r<=(h.direction?t:n);r++)h._preloadItem(h.index-r)},_preloadItem:function(e){var t;e=M(e),h.items[e].preloaded||((t=h.items[e]).parsed||(t=h.parseEl(e)),d("LazyLoad",t),"image"===t.type&&(t.img=u('').on("load.mfploader",function(){t.hasSize=!0}).on("error.mfploader",function(){t.hasSize=!0,t.loadError=!0,d("LazyLoadError",t)}).attr("src",t.src)),t.preloaded=!0)}}});var $,F,R="retina";function B(){T.off("touchmove"+F+" touchend"+F)}u.magnificPopup.registerModule(R,{options:{replaceSrc:function(e){return e.src.replace(/\.\w+$/,function(e){return"@2x"+e})},ratio:1},proto:{initRetina:function(){var n,r;1t.durationMax?t.durationMax:t.durationMin&&e=l)return b.cancelScroll(!0),e=t,n=g,0===(t=r)&&document.body.focus(),n||(t.focus(),document.activeElement!==t&&(t.setAttribute("tabindex","-1"),t.focus(),t.style.outline="none"),x.scrollTo(0,e)),E("scrollStop",m,r,o),!(y=f=null)},h=function(e){var t,n,r;u+=e-(f=f||e),d=i+s*(n=d=1<(d=0===c?0:u/c)?1:d,"easeInQuad"===(t=m).easing&&(r=n*n),"easeOutQuad"===t.easing&&(r=n*(2-n)),"easeInOutQuad"===t.easing&&(r=n<.5?2*n*n:(4-2*n)*n-1),"easeInCubic"===t.easing&&(r=n*n*n),"easeOutCubic"===t.easing&&(r=--n*n*n+1),"easeInOutCubic"===t.easing&&(r=n<.5?4*n*n*n:(n-1)*(2*n-2)*(2*n-2)+1),"easeInQuart"===t.easing&&(r=n*n*n*n),"easeOutQuart"===t.easing&&(r=1- --n*n*n*n),"easeInOutQuart"===t.easing&&(r=n<.5?8*n*n*n*n:1-8*--n*n*n*n),"easeInQuint"===t.easing&&(r=n*n*n*n*n),"easeOutQuint"===t.easing&&(r=1+--n*n*n*n*n),"easeInOutQuint"===t.easing&&(r=n<.5?16*n*n*n*n*n:1+16*--n*n*n*n*n),(r=t.customEasing?t.customEasing(n):r)||n),x.scrollTo(0,Math.floor(d)),p(d,a)||(y=x.requestAnimationFrame(h),f=e)},0===x.pageYOffset&&x.scrollTo(0,0),t=r,e=m,g||history.pushState&&e.updateURL&&history.pushState({smoothScroll:JSON.stringify(e),anchor:t.id},document.title,t===document.documentElement?"#top":"#"+t.id),"matchMedia"in x&&x.matchMedia("(prefers-reduced-motion)").matches?x.scrollTo(0,Math.floor(a)):(E("scrollStart",m,r,o),b.cancelScroll(!0),x.requestAnimationFrame(h)))};function t(e){if(!e.defaultPrevented&&!(0!==e.button||e.metaKey||e.ctrlKey||e.shiftKey)&&"closest"in e.target&&(i=e.target.closest(o),i&&"a"===i.tagName.toLowerCase()&&!e.target.closest(v.ignore)&&i.hostname===x.location.hostname&&i.pathname===x.location.pathname&&/#/.test(i.href))){var t,n,r;try{t=a(decodeURIComponent(i.hash))}catch(e){t=a(i.hash)}if("#"===t){if(!v.topOnEmptyHash)return;n=document.documentElement}else n=document.querySelector(t);(n=n||"#top"!==t?n:document.documentElement)&&(e.preventDefault(),r=v,history.replaceState&&r.updateURL&&!history.state&&(e=(e=x.location.hash)||"",history.replaceState({smoothScroll:JSON.stringify(r),anchor:e||x.pageYOffset},document.title,e||x.location.href)),b.animateScroll(n,i))}}function r(e){var t;null!==history.state&&history.state.smoothScroll&&history.state.smoothScroll===JSON.stringify(v)&&("string"==typeof(t=history.state.anchor)&&t&&!(t=document.querySelector(a(history.state.anchor)))||b.animateScroll(t,null,{updateURL:!1}))}b.destroy=function(){v&&(document.removeEventListener("click",t,!1),x.removeEventListener("popstate",r,!1),b.cancelScroll(),y=n=i=v=null)};return function(){if(!("querySelector"in document&&"addEventListener"in x&&"requestAnimationFrame"in x&&"closest"in x.Element.prototype))throw"Smooth Scroll: This browser does not support the required JavaScript methods and browser APIs.";b.destroy(),v=w(k,e||{}),n=v.header?document.querySelector(v.header):null,document.addEventListener("click",t,!1),v.updateURL&&v.popstate&&x.addEventListener("popstate",r,!1)}(),b}}),function(e,t){"function"==typeof define&&define.amd?define([],function(){return t(e)}):"object"==typeof exports?module.exports=t(e):e.Gumshoe=t(e)}("undefined"!=typeof global?global:"undefined"!=typeof window?window:this,function(c){"use strict";function f(e,t,n){n.settings.events&&(n=new CustomEvent(e,{bubbles:!0,cancelable:!0,detail:n}),t.dispatchEvent(n))}function n(e){var t=0;if(e.offsetParent)for(;e;)t+=e.offsetTop,e=e.offsetParent;return 0<=t?t:0}function d(e){e&&e.sort(function(e,t){return n(e.content)=Math.max(document.body.scrollHeight,document.documentElement.scrollHeight,document.body.offsetHeight,document.documentElement.offsetHeight,document.body.clientHeight,document.documentElement.clientHeight)}function p(e,t){var n,r,o=e[e.length-1];if(n=o,r=t,!(!s()||!a(n.content,r,!0)))return o;for(var i=e.length-1;0<=i;i--)if(a(e[i].content,t))return e[i]}function h(e,t){var n;!e||(n=e.nav.closest("li"))&&(n.classList.remove(t.navClass),e.content.classList.remove(t.contentClass),r(n,t),f("gumshoeDeactivate",n,{link:e.nav,content:e.content,settings:t}))}var m={navClass:"active",contentClass:"active",nested:!1,nestedClass:"active",offset:0,reflow:!1,events:!0},r=function(e,t){!t.nested||(e=e.parentNode.closest("li"))&&(e.classList.remove(t.nestedClass),r(e,t))},g=function(e,t){!t.nested||(e=e.parentNode.closest("li"))&&(e.classList.add(t.nestedClass),g(e,t))};return function(e,t){var n,o,i,r,a,s={setup:function(){n=document.querySelectorAll(e),o=[],Array.prototype.forEach.call(n,function(e){var t=document.getElementById(decodeURIComponent(e.hash.substr(1)));t&&o.push({nav:e,content:t})}),d(o)}};s.detect=function(){var e,t,n,r=p(o,a);r?i&&r.content===i.content||(h(i,a),t=a,!(e=r)||(n=e.nav.closest("li"))&&(n.classList.add(t.navClass),e.content.classList.add(t.contentClass),g(n,t),f("gumshoeActivate",n,{link:e.nav,content:e.content,settings:t})),i=r):i&&(h(i,a),i=null)};function l(e){r&&c.cancelAnimationFrame(r),r=c.requestAnimationFrame(s.detect)}function u(e){r&&c.cancelAnimationFrame(r),r=c.requestAnimationFrame(function(){d(o),s.detect()})}s.destroy=function(){i&&h(i,a),c.removeEventListener("scroll",l,!1),a.reflow&&c.removeEventListener("resize",u,!1),a=r=i=n=o=null};return a=function(){var n={};return Array.prototype.forEach.call(arguments,function(e){for(var t in e){if(!e.hasOwnProperty(t))return;n[t]=e[t]}}),n}(m,t||{}),s.setup(),s.detect(),c.addEventListener("scroll",l,!1),a.reflow&&c.addEventListener("resize",u,!1),s}}),$(document).ready(function(){$("#main").fitVids();function e(){(0===$(".author__urls-wrapper button").length?1024<$(window).width():!$(".author__urls-wrapper button").is(":visible"))?$(".sidebar").addClass("sticky"):$(".sidebar").removeClass("sticky")}e(),$(window).resize(function(){e()}),$(".author__urls-wrapper button#CarlesFernández-Prades").on("click",function(){$(".author__urls#urls-CarlesFernández-Prades").toggleClass("is--visible"),$(".author__urls-wrapper button#CarlesFernández-Prades").toggleClass("open")}),$(".author__urls-wrapper button#JavierArribas").on("click",function(){$(".author__urls#urls-JavierArribas").toggleClass("is--visible"),$(".author__urls-wrapper button#JavierArribas").toggleClass("open")}),$(".author__urls-wrapper button#LuisEsteve").on("click",function(){$(".author__urls#urls-LuisEsteve").toggleClass("is--visible"),$(".author__urls-wrapper button#LuisEsteve").toggleClass("open")}),$(".author__urls-wrapper button#PauClosas").on("click",function(){$(".author__urls#urls-PauClosas").toggleClass("is--visible"),$(".author__urls-wrapper button#PauClosas").toggleClass("open")}),$(".author__urls-wrapper button#MarcMajoral").on("click",function(){$(".author__urls#urls-MarcMajoral").toggleClass("is--visible"),$(".author__urls-wrapper button#MarcMajoral").toggleClass("open")}),$(".author__urls-wrapper button#JordiVilà-Valls").on("click",function(){$(".author__urls#urls-JordiVilà-Valls").toggleClass("is--visible"),$(".author__urls-wrapper button#JordiVilà-Valls").toggleClass("open")}),$(".author__urls-wrapper button#ÁlvaroCebriánJuan").on("click",function(){$(".author__urls#urls-ÁlvaroCebriánJuan").toggleClass("is--visible"),$(".author__urls-wrapper button#ÁlvaroCebriánJuan").toggleClass("open")}),$(".author__urls-wrapper button#DamianMiralles").on("click",function(){$(".author__urls#urls-DamianMiralles").toggleClass("is--visible"),$(".author__urls-wrapper button#DamianMiralles").toggleClass("open")}),$(".author__urls-wrapper button#AntonioRamosdeTorres").on("click",function(){$(".author__urls#urls-AntonioRamosdeTorres").toggleClass("is--visible"),$(".author__urls-wrapper button#AntonioRamosdeTorres").toggleClass("open")}),$(document).keyup(function(e){27===e.keyCode&&$(".initial-content").hasClass("is--hidden")&&($(".search-content").toggleClass("is--visible"),$(".initial-content").toggleClass("is--hidden"))}),$(".search__toggle").on("click",function(){$(".search-content").toggleClass("is--visible"),$(".initial-content").toggleClass("is--hidden"),setTimeout(function(){$(".search-content input").focus()},400)});new SmoothScroll('a[href*="#"]',{offset:20,speed:300,durationMax:600,easing:"easeInOutQuint"});0<$("nav.toc").length&&new Gumshoe("nav.toc a",{navClass:"active",contentClass:"active",nested:!1,nestedClass:"active",offset:20,reflow:!0,events:!0}),$("a[href$='.jpg'],a[href$='.jpeg'],a[href$='.JPG'],a[href$='.png'],a[href$='.gif'],a[href$='.webp']").addClass("image-popup"),$(".image-popup").magnificPopup({type:"image",tLoading:"Loading image #%curr%...",gallery:{enabled:!0,navigateByImgClick:!0,preload:[0,1]},image:{tError:'Image #%curr% could not be loaded.'},removalDelay:500,mainClass:"mfp-zoom-in",callbacks:{beforeOpen:function(){this.st.image.markup=this.st.image.markup.replace("mfp-figure","mfp-figure mfp-with-anim")}},closeOnContentClick:!0,midClick:!0}),$(".page__content").find("h1, h2, h3, h4, h5, h6").each(function(){var e,t=$(this).attr("id");t&&((e=document.createElement("a")).className="header-link",e.href="#"+t,e.innerHTML='Permalink',e.title="Permalink",$(this).append(e))})}); \ No newline at end of file +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";function m(e){return null!=e&&e===e.window}var t=[],n=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},l=t.push,o=t.indexOf,r={},i=r.toString,v=r.hasOwnProperty,a=v.toString,u=a.call(Object),y={},b=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},T=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function x(e,t,n){var r,o,i=(n=n||T).createElement("script");if(i.text=e,t)for(r in c)(o=t[r]||t.getAttribute&&t.getAttribute(r))&&i.setAttribute(r,o);n.head.appendChild(i).parentNode.removeChild(i)}function h(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?r[i.call(e)]||"object":typeof e}var f="3.5.1",E=function(e,t){return new E.fn.init(e,t)};function d(e){var t=!!e&&"length"in e&&e.length,n=h(e);return!b(e)&&!m(e)&&("array"===n||0===t||"number"==typeof t&&0>10|55296,1023&e|56320))}function r(){C()}var e,p,x,i,o,h,d,m,w,l,u,C,T,a,E,g,s,c,v,k="sizzle"+ +new Date,y=n.document,S=0,b=0,A=le(),N=le(),I=le(),j=le(),L=function(e,t){return e===t&&(u=!0),0},D={}.hasOwnProperty,t=[],_=t.pop,O=t.push,P=t.push,H=t.slice,M=function(e,t){for(var n=0,r=e.length;n+~]|"+$+")"+$+"*"),V=new RegExp($+"|>"),Q=new RegExp(B),Y=new RegExp("^"+F+"$"),J={ID:new RegExp("^#("+F+")"),CLASS:new RegExp("^\\.("+F+")"),TAG:new RegExp("^("+F+"|[*])"),ATTR:new RegExp("^"+R),PSEUDO:new RegExp("^"+B),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+$+"*(even|odd|(([+-]|)(\\d*)n|)"+$+"*(?:([+-]|)"+$+"*(\\d+)|))"+$+"*\\)|)","i"),bool:new RegExp("^(?:"+q+")$","i"),needsContext:new RegExp("^"+$+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+$+"*((?:-\\d)?\\d*)"+$+"*\\)|)(?=[^-]|$)","i")},G=/HTML$/i,K=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,ee=/^[^{]+\{\s*\[native \w/,te=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ne=/[+~]/,re=new RegExp("\\\\[\\da-fA-F]{1,6}"+$+"?|\\\\([^\\r\\n\\f])","g"),oe=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},ae=ye(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{P.apply(t=H.call(y.childNodes),y.childNodes),t[y.childNodes.length].nodeType}catch(e){P={apply:t.length?function(e,t){O.apply(e,H.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}function se(t,e,n,r){var o,i,a,s,l,u,c,f=e&&e.ownerDocument,d=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==d&&9!==d&&11!==d)return n;if(!r&&(C(e),e=e||T,E)){if(11!==d&&(l=te.exec(t)))if(o=l[1]){if(9===d){if(!(a=e.getElementById(o)))return n;if(a.id===o)return n.push(a),n}else if(f&&(a=f.getElementById(o))&&v(e,a)&&a.id===o)return n.push(a),n}else{if(l[2])return P.apply(n,e.getElementsByTagName(t)),n;if((o=l[3])&&p.getElementsByClassName&&e.getElementsByClassName)return P.apply(n,e.getElementsByClassName(o)),n}if(p.qsa&&!j[t+" "]&&(!g||!g.test(t))&&(1!==d||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===d&&(V.test(t)||X.test(t))){for((f=ne.test(t)&&me(e.parentNode)||e)===e&&p.scope||((s=e.getAttribute("id"))?s=s.replace(oe,ie):e.setAttribute("id",s=k)),i=(u=h(t)).length;i--;)u[i]=(s?"#"+s:":scope")+" "+ve(u[i]);c=u.join(",")}try{return P.apply(n,f.querySelectorAll(c)),n}catch(e){j(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return m(t.replace(W,"$1"),e,n,r)}function le(){var n=[];function r(e,t){return n.push(e+" ")>x.cacheLength&&delete r[n.shift()],r[e+" "]=t}return r}function ue(e){return e[k]=!0,e}function ce(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){for(var n=e.split("|"),r=n.length;r--;)x.attrHandle[n[r]]=t}function de(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function pe(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function he(a){return ue(function(i){return i=+i,ue(function(e,t){for(var n,r=a([],e.length,i),o=r.length;o--;)e[n=r[o]]&&(e[n]=!(t[n]=e[n]))})})}function me(e){return e&&void 0!==e.getElementsByTagName&&e}for(e in p=se.support={},o=se.isXML=function(e){var t=e.namespaceURI,e=(e.ownerDocument||e).documentElement;return!G.test(t||e&&e.nodeName||"HTML")},C=se.setDocument=function(e){var t,e=e?e.ownerDocument||e:y;return e!=T&&9===e.nodeType&&e.documentElement&&(a=(T=e).documentElement,E=!o(T),y!=T&&(t=T.defaultView)&&t.top!==t&&(t.addEventListener?t.addEventListener("unload",r,!1):t.attachEvent&&t.attachEvent("onunload",r)),p.scope=ce(function(e){return a.appendChild(e).appendChild(T.createElement("div")),void 0!==e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),p.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),p.getElementsByTagName=ce(function(e){return e.appendChild(T.createComment("")),!e.getElementsByTagName("*").length}),p.getElementsByClassName=ee.test(T.getElementsByClassName),p.getById=ce(function(e){return a.appendChild(e).id=k,!T.getElementsByName||!T.getElementsByName(k).length}),p.getById?(x.filter.ID=function(e){var t=e.replace(re,f);return function(e){return e.getAttribute("id")===t}},x.find.ID=function(e,t){if(void 0!==t.getElementById&&E){e=t.getElementById(e);return e?[e]:[]}}):(x.filter.ID=function(e){var t=e.replace(re,f);return function(e){e=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return e&&e.value===t}},x.find.ID=function(e,t){if(void 0!==t.getElementById&&E){var n,r,o,i=t.getElementById(e);if(i){if((n=i.getAttributeNode("id"))&&n.value===e)return[i];for(o=t.getElementsByName(e),r=0;i=o[r++];)if((n=i.getAttributeNode("id"))&&n.value===e)return[i]}return[]}}),x.find.TAG=p.getElementsByTagName?function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):p.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],o=0,i=t.getElementsByTagName(e);if("*"!==e)return i;for(;n=i[o++];)1===n.nodeType&&r.push(n);return r},x.find.CLASS=p.getElementsByClassName&&function(e,t){if(void 0!==t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],g=[],(p.qsa=ee.test(T.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&g.push("[*^$]="+$+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||g.push("\\["+$+"*(?:value|"+q+")"),e.querySelectorAll("[id~="+k+"-]").length||g.push("~="),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||g.push("\\["+$+"*name"+$+"*="+$+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||g.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||g.push(".#.+[+~]"),e.querySelectorAll("\\\f"),g.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=T.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&g.push("name"+$+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&g.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(p.matchesSelector=ee.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){p.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",B)}),g=g.length&&new RegExp(g.join("|")),s=s.length&&new RegExp(s.join("|")),t=ee.test(a.compareDocumentPosition),v=t||ee.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,t=t&&t.parentNode;return e===t||!(!t||1!==t.nodeType||!(n.contains?n.contains(t):e.compareDocumentPosition&&16&e.compareDocumentPosition(t)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},L=t?function(e,t){if(e===t)return u=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!p.sortDetached&&t.compareDocumentPosition(e)===n?e==T||e.ownerDocument==y&&v(y,e)?-1:t==T||t.ownerDocument==y&&v(y,t)?1:l?M(l,e)-M(l,t):0:4&n?-1:1)}:function(e,t){if(e===t)return u=!0,0;var n,r=0,o=e.parentNode,i=t.parentNode,a=[e],s=[t];if(!o||!i)return e==T?-1:t==T?1:o?-1:i?1:l?M(l,e)-M(l,t):0;if(o===i)return de(e,t);for(n=e;n=n.parentNode;)a.unshift(n);for(n=t;n=n.parentNode;)s.unshift(n);for(;a[r]===s[r];)r++;return r?de(a[r],s[r]):a[r]==y?-1:s[r]==y?1:0}),T},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(C(e),p.matchesSelector&&E&&!j[t+" "]&&(!s||!s.test(t))&&(!g||!g.test(t)))try{var n=c.call(e,t);if(n||p.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){j(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(re,f),e[3]=(e[3]||e[4]||e[5]||"").replace(re,f),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return J.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&Q.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(re,f).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=A[e+" "];return t||(t=new RegExp("(^|"+$+")"+e+"("+$+"|$)"))&&A(e,function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(t,n,r){return function(e){e=se.attr(e,t);return null==e?"!="===n:!n||(e+="","="===n?e===r:"!="===n?e!==r:"^="===n?r&&0===e.indexOf(r):"*="===n?r&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function I(e,n,r){return b(n)?E.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?E.grep(e,function(e){return e===n!==r}):"string"!=typeof n?E.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(E.fn.init=function(e,t,n){if(!e)return this;if(n=n||j,"string"!=typeof e)return e.nodeType?(this[0]=e,this.length=1,this):b(e)?void 0!==n.ready?n.ready(e):e(E):E.makeArray(e,this);if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return(!t||t.jquery?t||n:this.constructor(t)).find(e);if(r[1]){if(t=t instanceof E?t[0]:t,E.merge(this,E.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:T,!0)),N.test(r[1])&&E.isPlainObject(t))for(var r in t)b(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(e=T.getElementById(r[2]))&&(this[0]=e,this.length=1),this}).prototype=E.fn,j=E(T);var D=/^(?:parents|prev(?:Until|All))/,_={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}E.fn.extend({has:function(e){var t=E(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,de=/^$|^module$|\/(?:java|ecma)script/i;f=T.createDocumentFragment().appendChild(T.createElement("div")),(p=T.createElement("input")).setAttribute("type","radio"),p.setAttribute("checked","checked"),p.setAttribute("name","t"),f.appendChild(p),y.checkClone=f.cloneNode(!0).cloneNode(!0).lastChild.checked,f.innerHTML="",y.noCloneChecked=!!f.cloneNode(!0).lastChild.defaultValue,f.innerHTML="",y.option=!!f.lastChild;var pe={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function he(e,t){var n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[];return void 0===t||t&&A(e,t)?E.merge([e],n):n}function me(e,t){for(var n=0,r=e.length;n",""]);var ge=/<|&#?\w+;/;function ve(e,t,n,r,o){for(var i,a,s,l,u,c=t.createDocumentFragment(),f=[],d=0,p=e.length;d\s*$/g;function Ie(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&E(e).children("tbody")[0]||e}function je(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Le(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function De(e,t){var n,r,o,i;if(1===t.nodeType){if(Y.hasData(e)&&(i=Y.get(e).events))for(o in Y.remove(t,"handle events"),i)for(n=0,r=i[o].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",o=function(e){r.remove(),o=null,e&&t("error"===e.type?404:200,e.type)}),T.head.appendChild(r[0])},abort:function(){o&&o()}}});var Jt=[],Gt=/(=)\?(?=&|$)|\?\?/;E.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Jt.pop()||E.expando+"_"+It.guid++;return this[e]=!0,e}}),E.ajaxPrefilter("json jsonp",function(e,t,n){var r,o,i,a=!1!==e.jsonp&&(Gt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Gt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=b(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Gt,"$1"+r):!1!==e.jsonp&&(e.url+=(jt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return i||E.error(r+" was not called"),i[0]},e.dataTypes[0]="json",o=C[r],C[r]=function(){i=arguments},n.always(function(){void 0===o?E(C).removeProp(r):C[r]=o,e[r]&&(e.jsonpCallback=t.jsonpCallback,Jt.push(r)),i&&b(o)&&o(i[0]),i=o=void 0}),"script"}),y.createHTMLDocument=((f=T.implementation.createHTMLDocument("").body).innerHTML="
",2===f.childNodes.length),E.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=T.implementation.createHTMLDocument("")).createElement("base")).href=T.location.href,t.head.appendChild(r)):t=T),r=!n&&[],(n=N.exec(e))?[t.createElement(n[1])]:(n=ve([e],t,r),r&&r.length&&E(r).remove(),E.merge([],n.childNodes)));var r},E.fn.load=function(e,t,n){var r,o,i,a=this,s=e.indexOf(" ");return-1").append(E.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,i||[e.responseText,t,e])})}),this},E.expr.pseudos.animated=function(t){return E.grep(E.timers,function(e){return t===e.elem}).length},E.offset={setOffset:function(e,t,n){var r,o,i,a,s=E.css(e,"position"),l=E(e),u={};"static"===s&&(e.style.position="relative"),i=l.offset(),r=E.css(e,"top"),a=E.css(e,"left"),a=("absolute"===s||"fixed"===s)&&-1<(r+a).indexOf("auto")?(o=(s=l.position()).top,s.left):(o=parseFloat(r)||0,parseFloat(a)||0),null!=(t=b(t)?t.call(e,n,E.extend({},i)):t).top&&(u.top=t.top-i.top+o),null!=t.left&&(u.left=t.left-i.left+a),"using"in t?t.using.call(e,u):("number"==typeof u.top&&(u.top+="px"),"number"==typeof u.left&&(u.left+="px"),l.css(u))}},E.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){E.offset.setOffset(this,t,e)});var e,n=this[0];return n?n.getClientRects().length?(e=n.getBoundingClientRect(),n=n.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],o={top:0,left:0};if("fixed"===E.css(r,"position"))t=r.getBoundingClientRect();else{for(t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;e&&(e===n.body||e===n.documentElement)&&"static"===E.css(e,"position");)e=e.parentNode;e&&e!==r&&1===e.nodeType&&((o=E(e).offset()).top+=E.css(e,"borderTopWidth",!0),o.left+=E.css(e,"borderLeftWidth",!0))}return{top:t.top-o.top-E.css(r,"marginTop",!0),left:t.left-o.left-E.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&"static"===E.css(e,"position");)e=e.offsetParent;return e||re})}}),E.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,o){var i="pageYOffset"===o;E.fn[t]=function(e){return B(this,function(e,t,n){var r;return m(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n?r?r[o]:e[t]:void(r?r.scrollTo(i?r.pageXOffset:n,i?n:r.pageYOffset):e[t]=n)},t,e,arguments.length)}}),E.each(["top","left"],function(e,n){E.cssHooks[n]=Je(y.pixelPosition,function(e,t){if(t)return t=Ye(e,n),We.test(t)?E(e).position()[n]+"px":t})}),E.each({Height:"height",Width:"width"},function(a,s){E.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,i){E.fn[i]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),o=r||(!0===e||!0===t?"margin":"border");return B(this,function(e,t,n){var r;return m(e)?0===i.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?E.css(e,t,o):E.style(e,t,n,o)},s,n?e:void 0,n)}})}),E.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){E.fn[t]=function(e){return this.on(t,e)}}),E.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),E.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(e,n){E.fn[n]=function(e,t){return 0x

',t.appendChild(n.childNodes[1])),e&&i.extend(o,e),this.each(function(){var e=['iframe[src*="player.vimeo.com"]','iframe[src*="youtube.com"]','iframe[src*="youtube-nocookie.com"]','iframe[src*="kickstarter.com"][src*="video.html"]',"object","embed"];o.customSelector&&e.push(o.customSelector);var r=".fitvidsignore";o.ignore&&(r=r+", "+o.ignore);e=i(this).find(e.join(","));(e=(e=e.not("object object")).not(r)).each(function(e){var t,n=i(this);0').parent(".fluid-width-video-wrapper").css("padding-top",100*t+"%"),n.removeAttr("height").removeAttr("width"))})})}}(window.jQuery||window.Zepto),$(function(){var n,r,e,o,t=$("nav.greedy-nav .greedy-nav__toggle"),i=$("nav.greedy-nav .visible-links"),a=$("nav.greedy-nav .hidden-links"),s=$("nav.greedy-nav"),l=$("nav.greedy-nav .site-logo"),u=$("nav.greedy-nav .site-logo img"),c=$("nav.greedy-nav .site-title"),f=$("nav.greedy-nav button.search__toggle");function d(){function t(e,t){r+=t,n+=1,o.push(r)}r=n=0,e=1e3,o=[],i.children().outerWidth(t),a.children().each(function(){var e;(e=(e=$(this)).clone()).css("visibility","hidden"),i.append(e),t(0,e.outerWidth()),e.remove()})}d();var p,h,m,g,v=$(window).width(),y=v<768?0:v<1024?1:v<1280?2:3;function b(){var e=(v=$(window).width())<768?0:v<1024?1:v<1280?2:3;e!==y&&d(),y=e,h=i.children().length,p=s.innerWidth()-(0!==l.length?l.outerWidth(!0):0)-c.outerWidth(!0)-(0!==f.length?f.outerWidth(!0):0)-(h!==o.length?t.outerWidth(!0):0),m=o[h-1],po[h]&&(a.children().first().appendTo(i),h+=1,b()),t.attr("count",n-h),h===n?t.addClass("hidden"):t.removeClass("hidden")}$(window).resize(function(){b()}),t.on("click",function(){a.toggleClass("hidden"),clearTimeout(g)}),a.on("mouseleave",function(){g=setTimeout(function(){a.addClass("hidden")},e)}).on("mouseenter",function(){clearTimeout(g)}),0===u.length||u[0].complete||0!==u[0].naturalWidth?b():u.one("load error",b)}),function(u){function e(){}function c(e,t){h.ev.on("mfp"+e+w,t)}function f(e,t,n,r){var o=document.createElement("div");return o.className="mfp-"+e,n&&(o.innerHTML=n),r?t&&t.appendChild(o):(o=u(o),t&&o.appendTo(t)),o}function d(e,t){h.ev.triggerHandler("mfp"+e,t),h.st.callbacks&&(e=e.charAt(0).toLowerCase()+e.slice(1),h.st.callbacks[e]&&h.st.callbacks[e].apply(h,u.isArray(t)?t:[t]))}function p(e){return e===t&&h.currTemplate.closeBtn||(h.currTemplate.closeBtn=u(h.st.closeMarkup.replace("%title%",h.st.tClose)),t=e),h.currTemplate.closeBtn}function i(){u.magnificPopup.instance||((h=new e).init(),u.magnificPopup.instance=h)}var h,r,m,g,o,v,t,l="Close",y="BeforeClose",b="MarkupParse",x="Open",w=".mfp",C="mfp-ready",n="mfp-removing",a="mfp-prevent-close",s=!!window.jQuery,T=u(window);function E(){A&&(S.after(A.addClass(k)).detach(),A=null)}e.prototype={constructor:e,init:function(){var e=navigator.appVersion;h.isIE7=-1!==e.indexOf("MSIE 7."),h.isIE8=-1!==e.indexOf("MSIE 8."),h.isLowIE=h.isIE7||h.isIE8,h.isAndroid=/android/gi.test(e),h.isIOS=/iphone|ipad|ipod/gi.test(e),h.supportsTransition=function(){var e=document.createElement("p").style,t=["ms","O","Moz","Webkit"];if(void 0!==e.transition)return!0;for(;t.length;)if(t.pop()+"Transition"in e)return!0;return!1}(),h.probablyMobile=h.isAndroid||h.isIOS||/(Opera Mini)|Kindle|webOS|BlackBerry|(Opera Mobi)|(Windows Phone)|IEMobile/i.test(navigator.userAgent),g=u(document),h.popupsCache={}},open:function(e){if(m=m||u(document.body),!1===e.isObj){h.items=e.items.toArray(),h.index=0;for(var t,n=e.items,r=0;r(e||T.height())},_setFocus:function(){(h.st.focus?h.content.find(h.st.focus).eq(0):h.wrap).focus()},_onFocusIn:function(e){if(e.target!==h.wrap[0]&&!u.contains(h.wrap[0],e.target))return h._setFocus(),!1},_parseMarkup:function(o,e,t){var i;t.data&&(e=u.extend(t.data,e)),d(b,[o,e,t]),u.each(e,function(e,t){return void 0===t||!1===t||void(1<(i=e.split("_")).length?0<(n=o.find(w+"-"+i[0])).length&&("replaceWith"===(r=i[1])?n[0]!==t[0]&&n.replaceWith(t):"img"===r?n.is("img")?n.attr("src",t):n.replaceWith(''):n.attr(i[1],t)):o.find(w+"-"+e).html(t));var n,r})},_getScrollbarSize:function(){var e;return void 0===h.scrollbarSize&&((e=document.createElement("div")).id="mfp-sbm",e.style.cssText="width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;",document.body.appendChild(e),h.scrollbarSize=e.offsetWidth-e.clientWidth,document.body.removeChild(e)),h.scrollbarSize}},u.magnificPopup={instance:null,proto:e.prototype,modules:[],open:function(e,t){return i(),(e=e?u.extend(!0,{},e):{}).isObj=!0,e.index=t||0,this.instance.open(e)},close:function(){return u.magnificPopup.instance&&u.magnificPopup.instance.close()},registerModule:function(e,t){t.options&&(u.magnificPopup.defaults[e]=t.options),u.extend(this.proto,t.proto),this.modules.push(e)},defaults:{disableOn:0,key:null,midClick:!1,mainClass:"",preloader:!0,focus:"",closeOnContentClick:!1,closeOnBgClick:!0,closeBtnInside:!0,showCloseBtn:!0,enableEscapeKey:!0,modal:!1,alignTop:!1,removalDelay:0,prependTo:null,fixedContentPos:"auto",fixedBgPos:"auto",overflowY:"auto",closeMarkup:'',tClose:"Close (Esc)",tLoading:"Loading..."}},u.fn.magnificPopup=function(e){i();var t,n,r,o=u(this);return"string"==typeof e?"open"===e?(t=s?o.data("magnificPopup"):o[0].magnificPopup,n=parseInt(arguments[1],10)||0,r=t.items?t.items[n]:(r=o,(r=t.delegate?r.find(t.delegate):r).eq(n)),h._openClick({mfpEl:r},o,t)):h.isOpen&&h[e].apply(h,Array.prototype.slice.call(arguments,1)):(e=u.extend(!0,{},e),s?o.data("magnificPopup",e):o[0].magnificPopup=e,h.addGroup(o,e)),o};var k,S,A,N="inline";function I(){L&&m.removeClass(L)}function j(){I(),h.req&&h.req.abort()}u.magnificPopup.registerModule(N,{options:{hiddenClass:"hide",markup:"",tNotFound:"Content not found"},proto:{initInline:function(){h.types.push(N),c(l+"."+N,function(){E()})},getInline:function(e,t){if(E(),e.src){var n,r=h.st.inline,o=u(e.src);return o.length?((n=o[0].parentNode)&&n.tagName&&(S||(k=r.hiddenClass,S=f(k),k="mfp-"+k),A=o.after(S).detach().removeClass(k)),h.updateStatus("ready")):(h.updateStatus("error",r.tNotFound),o=u("
")),e.inlineElement=o}return h.updateStatus("ready"),h._parseMarkup(t,{},e),t}}});var L,D,_,O="ajax";function P(e){var t;!h.currTemplate[H]||(t=h.currTemplate[H].find("iframe")).length&&(e||(t[0].src="//about:blank"),h.isIE8&&t.css("display",e?"block":"none"))}u.magnificPopup.registerModule(O,{options:{settings:null,cursor:"mfp-ajax-cur",tError:'The content could not be loaded.'},proto:{initAjax:function(){h.types.push(O),L=h.st.ajax.cursor,c(l+"."+O,j),c("BeforeChange."+O,j)},getAjax:function(r){L&&m.addClass(L),h.updateStatus("loading");var e=u.extend({url:r.src,success:function(e,t,n){n={data:e,xhr:n};d("ParseAjax",n),h.appendContent(u(n.data),O),r.finished=!0,I(),h._setFocus(),setTimeout(function(){h.wrap.addClass(C)},16),h.updateStatus("ready"),d("AjaxContentAdded")},error:function(){I(),r.finished=r.loadError=!0,h.updateStatus("error",h.st.ajax.tError.replace("%url%",r.src))}},h.st.ajax.settings);return h.req=u.ajax(e),""}}}),u.magnificPopup.registerModule("image",{options:{markup:'
',cursor:"mfp-zoom-out-cur",titleSrc:"title",verticalFit:!0,tError:'The image could not be loaded.'},proto:{initImage:function(){var e=h.st.image,t=".image";h.types.push("image"),c(x+t,function(){"image"===h.currItem.type&&e.cursor&&m.addClass(e.cursor)}),c(l+t,function(){e.cursor&&m.removeClass(e.cursor),T.off("resize"+w)}),c("Resize"+t,h.resizeImage),h.isLowIE&&c("AfterChange",h.resizeImage)},resizeImage:function(){var e,t=h.currItem;t&&t.img&&h.st.image.verticalFit&&(e=0,h.isLowIE&&(e=parseInt(t.img.css("padding-top"),10)+parseInt(t.img.css("padding-bottom"),10)),t.img.css("max-height",h.wH-e))},_onImageHasSize:function(e){e.img&&(e.hasSize=!0,D&&clearInterval(D),e.isCheckingImgSize=!1,d("ImageHasSize",e),e.imgHidden&&(h.content&&h.content.removeClass("mfp-loading"),e.imgHidden=!1))},findImageSize:function(t){var n=0,r=t.img[0],o=function(e){D&&clearInterval(D),D=setInterval(function(){0
',srcAction:"iframe_src",patterns:{youtube:{index:"youtube.com",id:"v=",src:"//www.youtube.com/embed/%id%?autoplay=1"},vimeo:{index:"vimeo.com/",id:"/",src:"//player.vimeo.com/video/%id%?autoplay=1"},gmaps:{index:"//maps.google.",src:"%id%&output=embed"}}},proto:{initIframe:function(){h.types.push(H),c("BeforeChange",function(e,t,n){t!==n&&(t===H?P():n===H&&P(!0))}),c(l+"."+H,function(){P()})},getIframe:function(e,t){var n=e.src,r=h.st.iframe;u.each(r.patterns,function(){if(-1',preload:[0,2],navigateByImgClick:!0,arrows:!0,tPrev:"Previous (Left arrow key)",tNext:"Next (Right arrow key)",tCounter:"%curr% of %total%"},proto:{initGallery:function(){var i=h.st.gallery,e=".mfp-gallery",r=Boolean(u.fn.mfpFastClick);if(h.direction=!0,!i||!i.enabled)return!1;v+=" mfp-gallery",c(x+e,function(){i.navigateByImgClick&&h.wrap.on("click"+e,".mfp-img",function(){if(1=h.index,h.index=e,h.updateItemHTML()},preloadNearbyImages:function(){for(var e=h.st.gallery.preload,t=Math.min(e[0],h.items.length),n=Math.min(e[1],h.items.length),r=1;r<=(h.direction?n:t);r++)h._preloadItem(h.index+r);for(r=1;r<=(h.direction?t:n);r++)h._preloadItem(h.index-r)},_preloadItem:function(e){var t;e=M(e),h.items[e].preloaded||((t=h.items[e]).parsed||(t=h.parseEl(e)),d("LazyLoad",t),"image"===t.type&&(t.img=u('').on("load.mfploader",function(){t.hasSize=!0}).on("error.mfploader",function(){t.hasSize=!0,t.loadError=!0,d("LazyLoadError",t)}).attr("src",t.src)),t.preloaded=!0)}}});var $,F,R="retina";function B(){T.off("touchmove"+F+" touchend"+F)}u.magnificPopup.registerModule(R,{options:{replaceSrc:function(e){return e.src.replace(/\.\w+$/,function(e){return"@2x"+e})},ratio:1},proto:{initRetina:function(){var n,r;1t.durationMax?t.durationMax:t.durationMin&&e=l)return b.cancelScroll(!0),e=t,n=g,0===(t=r)&&document.body.focus(),n||(t.focus(),document.activeElement!==t&&(t.setAttribute("tabindex","-1"),t.focus(),t.style.outline="none"),x.scrollTo(0,e)),E("scrollStop",m,r,o),!(y=f=null)},h=function(e){var t,n,r;u+=e-(f=f||e),d=i+s*(n=d=1<(d=0===c?0:u/c)?1:d,"easeInQuad"===(t=m).easing&&(r=n*n),"easeOutQuad"===t.easing&&(r=n*(2-n)),"easeInOutQuad"===t.easing&&(r=n<.5?2*n*n:(4-2*n)*n-1),"easeInCubic"===t.easing&&(r=n*n*n),"easeOutCubic"===t.easing&&(r=--n*n*n+1),"easeInOutCubic"===t.easing&&(r=n<.5?4*n*n*n:(n-1)*(2*n-2)*(2*n-2)+1),"easeInQuart"===t.easing&&(r=n*n*n*n),"easeOutQuart"===t.easing&&(r=1- --n*n*n*n),"easeInOutQuart"===t.easing&&(r=n<.5?8*n*n*n*n:1-8*--n*n*n*n),"easeInQuint"===t.easing&&(r=n*n*n*n*n),"easeOutQuint"===t.easing&&(r=1+--n*n*n*n*n),"easeInOutQuint"===t.easing&&(r=n<.5?16*n*n*n*n*n:1+16*--n*n*n*n*n),(r=t.customEasing?t.customEasing(n):r)||n),x.scrollTo(0,Math.floor(d)),p(d,a)||(y=x.requestAnimationFrame(h),f=e)},0===x.pageYOffset&&x.scrollTo(0,0),t=r,e=m,g||history.pushState&&e.updateURL&&history.pushState({smoothScroll:JSON.stringify(e),anchor:t.id},document.title,t===document.documentElement?"#top":"#"+t.id),"matchMedia"in x&&x.matchMedia("(prefers-reduced-motion)").matches?x.scrollTo(0,Math.floor(a)):(E("scrollStart",m,r,o),b.cancelScroll(!0),x.requestAnimationFrame(h)))};function t(e){if(!e.defaultPrevented&&!(0!==e.button||e.metaKey||e.ctrlKey||e.shiftKey)&&"closest"in e.target&&(i=e.target.closest(o),i&&"a"===i.tagName.toLowerCase()&&!e.target.closest(v.ignore)&&i.hostname===x.location.hostname&&i.pathname===x.location.pathname&&/#/.test(i.href))){var t,n,r;try{t=a(decodeURIComponent(i.hash))}catch(e){t=a(i.hash)}if("#"===t){if(!v.topOnEmptyHash)return;n=document.documentElement}else n=document.querySelector(t);(n=n||"#top"!==t?n:document.documentElement)&&(e.preventDefault(),r=v,history.replaceState&&r.updateURL&&!history.state&&(e=(e=x.location.hash)||"",history.replaceState({smoothScroll:JSON.stringify(r),anchor:e||x.pageYOffset},document.title,e||x.location.href)),b.animateScroll(n,i))}}function r(e){var t;null!==history.state&&history.state.smoothScroll&&history.state.smoothScroll===JSON.stringify(v)&&("string"==typeof(t=history.state.anchor)&&t&&!(t=document.querySelector(a(history.state.anchor)))||b.animateScroll(t,null,{updateURL:!1}))}b.destroy=function(){v&&(document.removeEventListener("click",t,!1),x.removeEventListener("popstate",r,!1),b.cancelScroll(),y=n=i=v=null)};return function(){if(!("querySelector"in document&&"addEventListener"in x&&"requestAnimationFrame"in x&&"closest"in x.Element.prototype))throw"Smooth Scroll: This browser does not support the required JavaScript methods and browser APIs.";b.destroy(),v=w(k,e||{}),n=v.header?document.querySelector(v.header):null,document.addEventListener("click",t,!1),v.updateURL&&v.popstate&&x.addEventListener("popstate",r,!1)}(),b}}),function(e,t){"function"==typeof define&&define.amd?define([],function(){return t(e)}):"object"==typeof exports?module.exports=t(e):e.Gumshoe=t(e)}("undefined"!=typeof global?global:"undefined"!=typeof window?window:this,function(c){"use strict";function f(e,t,n){n.settings.events&&(n=new CustomEvent(e,{bubbles:!0,cancelable:!0,detail:n}),t.dispatchEvent(n))}function n(e){var t=0;if(e.offsetParent)for(;e;)t+=e.offsetTop,e=e.offsetParent;return 0<=t?t:0}function d(e){e&&e.sort(function(e,t){return n(e.content)=Math.max(document.body.scrollHeight,document.documentElement.scrollHeight,document.body.offsetHeight,document.documentElement.offsetHeight,document.body.clientHeight,document.documentElement.clientHeight)}function p(e,t){var n,r,o=e[e.length-1];if(n=o,r=t,!(!s()||!a(n.content,r,!0)))return o;for(var i=e.length-1;0<=i;i--)if(a(e[i].content,t))return e[i]}function h(e,t){var n;!e||(n=e.nav.closest("li"))&&(n.classList.remove(t.navClass),e.content.classList.remove(t.contentClass),r(n,t),f("gumshoeDeactivate",n,{link:e.nav,content:e.content,settings:t}))}var m={navClass:"active",contentClass:"active",nested:!1,nestedClass:"active",offset:0,reflow:!1,events:!0},r=function(e,t){!t.nested||(e=e.parentNode.closest("li"))&&(e.classList.remove(t.nestedClass),r(e,t))},g=function(e,t){!t.nested||(e=e.parentNode.closest("li"))&&(e.classList.add(t.nestedClass),g(e,t))};return function(e,t){var n,o,i,r,a,s={setup:function(){n=document.querySelectorAll(e),o=[],Array.prototype.forEach.call(n,function(e){var t=document.getElementById(decodeURIComponent(e.hash.substr(1)));t&&o.push({nav:e,content:t})}),d(o)}};s.detect=function(){var e,t,n,r=p(o,a);r?i&&r.content===i.content||(h(i,a),t=a,!(e=r)||(n=e.nav.closest("li"))&&(n.classList.add(t.navClass),e.content.classList.add(t.contentClass),g(n,t),f("gumshoeActivate",n,{link:e.nav,content:e.content,settings:t})),i=r):i&&(h(i,a),i=null)};function l(e){r&&c.cancelAnimationFrame(r),r=c.requestAnimationFrame(s.detect)}function u(e){r&&c.cancelAnimationFrame(r),r=c.requestAnimationFrame(function(){d(o),s.detect()})}s.destroy=function(){i&&h(i,a),c.removeEventListener("scroll",l,!1),a.reflow&&c.removeEventListener("resize",u,!1),a=r=i=n=o=null};return a=function(){var n={};return Array.prototype.forEach.call(arguments,function(e){for(var t in e){if(!e.hasOwnProperty(t))return;n[t]=e[t]}}),n}(m,t||{}),s.setup(),s.detect(),c.addEventListener("scroll",l,!1),a.reflow&&c.addEventListener("resize",u,!1),s}}),$(document).ready(function(){$("#main").fitVids();function e(){(0===$(".author__urls-wrapper button").length?1024<$(window).width():!$(".author__urls-wrapper button").is(":visible"))?$(".sidebar").addClass("sticky"):$(".sidebar").removeClass("sticky")}e(),$(window).resize(function(){e()}),$(".author__urls-wrapper button#CarlesFernández-Prades").on("click",function(){$(".author__urls#urls-CarlesFernández-Prades").toggleClass("is--visible"),$(".author__urls-wrapper button#CarlesFernández-Prades").toggleClass("open")}),$(".author__urls-wrapper button#JavierArribas").on("click",function(){$(".author__urls#urls-JavierArribas").toggleClass("is--visible"),$(".author__urls-wrapper button#JavierArribas").toggleClass("open")}),$(".author__urls-wrapper button#LuisEsteve").on("click",function(){$(".author__urls#urls-LuisEsteve").toggleClass("is--visible"),$(".author__urls-wrapper button#LuisEsteve").toggleClass("open")}),$(".author__urls-wrapper button#PauClosas").on("click",function(){$(".author__urls#urls-PauClosas").toggleClass("is--visible"),$(".author__urls-wrapper button#PauClosas").toggleClass("open")}),$(".author__urls-wrapper button#MarcMajoral").on("click",function(){$(".author__urls#urls-MarcMajoral").toggleClass("is--visible"),$(".author__urls-wrapper button#MarcMajoral").toggleClass("open")}),$(".author__urls-wrapper button#JordiVilà-Valls").on("click",function(){$(".author__urls#urls-JordiVilà-Valls").toggleClass("is--visible"),$(".author__urls-wrapper button#JordiVilà-Valls").toggleClass("open")}),$(".author__urls-wrapper button#ÁlvaroCebriánJuan").on("click",function(){$(".author__urls#urls-ÁlvaroCebriánJuan").toggleClass("is--visible"),$(".author__urls-wrapper button#ÁlvaroCebriánJuan").toggleClass("open")}),$(".author__urls-wrapper button#DamianMiralles").on("click",function(){$(".author__urls#urls-DamianMiralles").toggleClass("is--visible"),$(".author__urls-wrapper button#DamianMiralles").toggleClass("open")}),$(".author__urls-wrapper button#AntonioRamosdeTorres").on("click",function(){$(".author__urls#urls-AntonioRamosdeTorres").toggleClass("is--visible"),$(".author__urls-wrapper button#AntonioRamosdeTorres").toggleClass("open")}),$(document).keyup(function(e){27===e.keyCode&&$(".initial-content").hasClass("is--hidden")&&($(".search-content").toggleClass("is--visible"),$(".initial-content").toggleClass("is--hidden"))}),$(".search__toggle").on("click",function(){$(".search-content").toggleClass("is--visible"),$(".initial-content").toggleClass("is--hidden"),setTimeout(function(){$(".search-content input").focus()},400)});new SmoothScroll('a[href*="#"]',{offset:20,speed:300,durationMax:600,easing:"easeInOutQuint"});0<$("nav.toc").length&&new Gumshoe("nav.toc a",{navClass:"active",contentClass:"active",nested:!1,nestedClass:"active",offset:20,reflow:!0,events:!0}),$("a[href$='.jpg'],a[href$='.jpeg'],a[href$='.JPG'],a[href$='.png'],a[href$='.gif'],a[href$='.webp']").addClass("image-popup"),$(".image-popup").magnificPopup({type:"image",tLoading:"Loading image #%curr%...",gallery:{enabled:!0,navigateByImgClick:!0,preload:[0,1]},image:{tError:'Image #%curr% could not be loaded.'},removalDelay:500,mainClass:"mfp-zoom-in",callbacks:{beforeOpen:function(){this.st.image.markup=this.st.image.markup.replace("mfp-figure","mfp-figure mfp-with-anim")}},closeOnContentClick:!0,midClick:!0}),document.querySelector(".page__content").querySelectorAll("h1, h2, h3, h4, h5, h6").forEach(function(e){var t,n=e.getAttribute("id");n&&((t=document.createElement("a")).className="header-link",t.href="#"+n,t.innerHTML='Permalink',t.title="Permalink",e.appendChild(t))});function o(e){for(var t=(e=e.target).nextElementSibling;t&&"code"!==t.tagName.toLowerCase();)t=t.nextElementSibling;if(!t)throw console.warn(e),new Error("No code block found for this button.");return function(e){var t="rtl"===document.documentElement.getAttribute("dir"),n=document.createElement("textarea");n.className="clipboard-helper",n.style[t?"right":"left"]="-9999px";t=window.pageYOffset||document.documentElement.scrollTop;n.style.top=t+"px",n.setAttribute("readonly",""),n.value=e,document.body.appendChild(n);var r=!0;try{n.select(),r=document.execCommand("copy")}catch(e){r=!1}return n.parentNode.removeChild(n),r}((t=(e=t.querySelector("td.code"))?e:t).innerText.replace(/\$\s/g,""))}document.querySelectorAll(".page__content pre > code").forEach(function(e,t,n){var r=e.parentElement;"code"===r.firstElementChild.tagName.toLowerCase()&&(e.closest(".nocopy")||((e=document.createElement("button")).title="Copy to clipboard",e.className="clipboard-copy-button",e.innerHTML='',e.addEventListener("click",o),r.prepend(e)))})}); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index d1f7876d..9bad50ec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,8 +1,1040 @@ { "name": "geniuss-place", - "version": "1.0.3", - "lockfileVersion": 1, + "version": "1.0.4", + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "version": "1.0.4", + "license": "CC-BY-4.0", + "devDependencies": { + "minimist": ">=1.2.2", + "npm-run-all": "^4.1.5", + "onchange": "^6.1.1", + "uglify-js": "^3.12.7" + }, + "engines": { + "node": ">= 12.10.0" + } + }, + "node_modules/@blakeembrey/deque": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@blakeembrey/deque/-/deque-1.0.5.tgz", + "integrity": "sha512-6xnwtvp9DY1EINIKdTfvfeAtCYw4OqBZJhtiqkT3ivjnEfa25VQ3TsKvaFfKm8MyGIEfE95qLe+bNEt3nB0Ylg==", + "dev": true + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.1" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.18.0-next.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.2.tgz", + "integrity": "sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.1", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.3", + "string.prototype.trimstart": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.5.tgz", + "integrity": "sha512-kBBSQbz2K0Nyn+31j/w36fUfxkBW9/gfwRWdUY1ULReH3iokVJgddZAFcD1D0xlgTmFxJCbUkUclAlc6/IDJkw==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "dev": true + }, + "node_modules/ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/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=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/object-inspect": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/onchange": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/onchange/-/onchange-6.1.1.tgz", + "integrity": "sha512-G60OULp9Hi2dixPKYn/lfs7C8oDgFcneAhZ/4nPnvzd+Ar94q3FN0UG/t1zqXI15StSLvt7NlRqylamTSGhc4A==", + "dev": true, + "dependencies": { + "@blakeembrey/deque": "^1.0.3", + "arrify": "^2.0.0", + "chokidar": "^3.0.0", + "cross-spawn": "^7.0.1", + "ignore": "^5.1.4", + "minimist": "^1.2.3", + "supports-color": "^7.0.0", + "tree-kill": "^1.2.2" + }, + "bin": { + "onchange": "cli.js" + } + }, + "node_modules/onchange/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/onchange/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/onchange/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/onchange/node_modules/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==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/onchange/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/onchange/node_modules/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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/onchange/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/readdirp": { + "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, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "dependencies": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", + "dev": true + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", + "dev": true + }, + "node_modules/string.prototype.padend": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.1.tgz", + "integrity": "sha512-eCzTASPnoCr5Ht+Vn1YXgm8SB015hHKgEIMu9Nr9bQmLhRBxKRfmzSj/IQsxDFc8JInJDDFA0qXwK+xxI7wDkg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", + "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", + "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/uglify-js": { + "version": "3.12.7", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.12.7.tgz", + "integrity": "sha512-SIZhkoh+U/wjW+BHGhVwE9nt8tWJspncloBcFapkpGRwNPqcH8pzX36BXe3TPBjzHWPMUZotpCigak/udWNr1Q==", + "dev": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/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", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + } + }, "dependencies": { "@blakeembrey/deque": { "version": "1.0.5", @@ -42,9 +1074,9 @@ "dev": true }, "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==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, "brace-expansion": { @@ -66,6 +1098,16 @@ "fill-range": "^7.0.1" } }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -78,19 +1120,19 @@ } }, "chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", - "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", "dev": true, "requires": { "anymatch": "~3.1.1", "braces": "~3.0.2", - "fsevents": "~2.1.2", + "fsevents": "~2.3.1", "glob-parent": "~5.1.0", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" + "readdirp": "~3.5.0" } }, "color-convert": { @@ -146,23 +1188,31 @@ } }, "es-abstract": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", - "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "version": "1.18.0-next.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.2.tgz", + "integrity": "sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw==", "dev": true, "requires": { - "es-to-primitive": "^1.2.0", + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2", "has": "^1.0.3", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-keys": "^1.0.12" + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.1", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.3", + "string.prototype.trimstart": "^1.0.3" } }, "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "requires": { "is-callable": "^1.1.4", @@ -186,9 +1236,9 @@ } }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, @@ -198,6 +1248,17 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "glob-parent": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", @@ -208,9 +1269,9 @@ } }, "graceful-fs": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", - "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.5.tgz", + "integrity": "sha512-kBBSQbz2K0Nyn+31j/w36fUfxkBW9/gfwRWdUY1ULReH3iokVJgddZAFcD1D0xlgTmFxJCbUkUclAlc6/IDJkw==", "dev": true }, "has": { @@ -229,15 +1290,15 @@ "dev": true }, "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "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==", "dev": true }, "hosted-git-info": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.4.tgz", - "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", "dev": true }, "ignore": { @@ -262,15 +1323,24 @@ } }, "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", "dev": true }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "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==", "dev": true }, "is-extglob": { @@ -288,6 +1358,12 @@ "is-extglob": "^2.1.1" } }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -295,21 +1371,22 @@ "dev": true }, "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", "dev": true, "requires": { - "has": "^1.0.1" + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" } }, "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", "dev": true, "requires": { - "has-symbols": "^1.0.0" + "has-symbols": "^1.0.1" } }, "isexe": { @@ -398,12 +1475,30 @@ "string.prototype.padend": "^3.0.0" } }, + "object-inspect": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "dev": true + }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, "onchange": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/onchange/-/onchange-6.1.1.tgz", @@ -459,9 +1554,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -516,9 +1611,9 @@ "dev": true }, "pidtree": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.0.tgz", - "integrity": "sha512-9CT4NFlDcosssyg8KVFltgokyKZIFjoBxw8CTGy+5F38Y1eQWrt8tRayiUOXE+zVKQnYu5BR8JjCtvK3BcnBhg==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", "dev": true }, "pify": { @@ -539,20 +1634,21 @@ } }, "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, "requires": { "picomatch": "^2.2.1" } }, "resolve": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", - "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", "dev": true, "requires": { + "is-core-module": "^2.1.0", "path-parse": "^1.0.6" } }, @@ -584,9 +1680,9 @@ "dev": true }, "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -594,15 +1690,15 @@ } }, "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "dev": true }, "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "requires": { "spdx-exceptions": "^2.1.0", @@ -610,20 +1706,40 @@ } }, "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.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", "dev": true }, "string.prototype.padend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz", - "integrity": "sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.1.tgz", + "integrity": "sha512-eCzTASPnoCr5Ht+Vn1YXgm8SB015hHKgEIMu9Nr9bQmLhRBxKRfmzSj/IQsxDFc8JInJDDFA0qXwK+xxI7wDkg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", + "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", + "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.4.3", - "function-bind": "^1.0.2" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" } }, "strip-bom": { diff --git a/package.json b/package.json index 1f1a625c..b3db77fe 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "geniuss-place", - "version": "1.0.3", + "version": "1.0.4", "description": "GNSS-SDR website npm build scripts", "repository": { "type": "git", @@ -18,7 +18,7 @@ }, "homepage": "https://gnss-sdr.org/", "engines": { - "node": ">= 0.10.0" + "node": ">= 12.10.0" }, "devDependencies": { "minimist": ">=1.2.2",