diff --git a/.circleci/config.yml b/.circleci/config.yml index 1d3a5e933..398f37ad2 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -12,7 +12,7 @@ jobs: build: docker: - - image: cimg/go:1.17 + - image: cimg/go:1.19 environment: working_directory: ~/go/src/github.com/SAP/cloud-mta-build-tool steps: @@ -23,8 +23,38 @@ jobs: name: install dependencies command: | go mod vendor - - run: go test -v ./... - - run: sudo chown circleci:circleci $GOPATH/bin + - run: + name: install node16 npm and npx + command: | + sudo apt-get update + curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash - + sudo apt-get install -y nodejs + echo "node version:" + node --version + echo "npm version:" + npm --version + echo "npx version:" + npx --version + - run: + name: install micromatch wrapper + command: | + MICROMATCH_WRAPPER_DIR=micromatch + MICROMATCH_WRAPPER_BINARY_NAME=micromatch-wrapper + MICROMATCH_WRAPPER_OS=Linux + chmod ug+rwx ${MICROMATCH_WRAPPER_DIR}/${MICROMATCH_WRAPPER_OS}/${MICROMATCH_WRAPPER_BINARY_NAME} + cp ${MICROMATCH_WRAPPER_DIR}/${MICROMATCH_WRAPPER_OS}/${MICROMATCH_WRAPPER_BINARY_NAME} ${GOPATH}/bin/${MICROMATCH_WRAPPER_BINARY_NAME} + echo "${MICROMATCH_WRAPPER_BINARY_NAME} help:" + ${MICROMATCH_WRAPPER_BINARY_NAME} --help + - run: + name: build mbt binary + command: | + BINARY_NAME=mbt + BUILD_DIR=release + CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o ${BUILD_DIR}/${BINARY_NAME} -v + chmod ug+rwx ${BUILD_DIR}/${BINARY_NAME} + cp ${BUILD_DIR}/${BINARY_NAME} ${GOPATH}/bin/${BINARY_NAME} + ${BINARY_NAME} --version + - run: sudo chown circleci:circleci ${GOPATH}/bin - run: make tools - run: make lint - run: @@ -80,7 +110,7 @@ jobs: release-to-github: docker: - - image: cimg/go:1.17 + - image: cimg/go:1.19 working_directory: ~/go/src/github.com/SAP/cloud-mta-build-tool steps: - add_ssh_keys: @@ -91,6 +121,12 @@ jobs: name: install dependencies command: | go mod vendor + - run: + name: install goreleaser + command: | + go install github.com/goreleaser/goreleaser@v1.18.2 + echo "goreleaser --version:" + goreleaser --version - run: name: bump version command: | @@ -137,11 +173,12 @@ jobs: #Make sure HEAD points to master git checkout master export GITHUB_TOKEN=${CLOUD_MTA_BOT_GITHUB_TOKEN} - curl -sfL https://goreleaser.com/static/run | bash + goreleaser release + #curl -sfL https://goreleaser.com/static/run | bash publish-to-dockerhub-java8-node14: docker: - - image: cimg/go:1.17 + - image: cimg/go:1.19 working_directory: ~/go/src/github.com/SAP/cloud-mta-build-tool steps: - checkout @@ -155,25 +192,25 @@ jobs: git fetch git rebase - run: - name: build Java 8.1.091 & Node 14.21.1 image + name: build Java 8.1.094 & Node 14.21.1 image command: | MBT_VERSION=$(cat ./VERSION) - sh $PWD/scripts/build_image 8.1.091 14.21.1 ${MBT_VERSION} + sh $PWD/scripts/build_image 8.1.094 14.21.1 ${MBT_VERSION} - run: - name: publish Java 8.1.091 & Node 14.21.1 image + name: publish Java 8.1.094 & Node 14.21.1 image command: | MBT_VERSION=$(cat ./VERSION) echo "Image release: ${MBT_VERSION}" #Push to Docker Hub echo "$DOCKER_HUB_TOKEN" | docker login --username $DOCKER_HUB_USER --password-stdin - sh $PWD/scripts/publish_image 8.1.091 14.21.1 ${MBT_VERSION} "devxci" + sh $PWD/scripts/publish_image 8.1.094 14.21.1 ${MBT_VERSION} "devxci" #Push to GitHub Container Registry echo "$CLOUD_MTA_BOT_GITHUB_TOKEN" | docker login "ghcr.io" --username $CLOUD_MTA_BOT_USER --password-stdin - sh $PWD/scripts/publish_image 8.1.091 14.21.1 ${MBT_VERSION} "ghcr.io/sap" + sh $PWD/scripts/publish_image 8.1.094 14.21.1 ${MBT_VERSION} "ghcr.io/sap" publish-to-dockerhub-java8-node16: docker: - - image: cimg/go:1.17 + - image: cimg/go:1.19 working_directory: ~/go/src/github.com/SAP/cloud-mta-build-tool steps: - checkout @@ -187,25 +224,25 @@ jobs: git fetch git rebase - run: - name: build Java 8.1.091 & Node 16.18.1 image + name: build Java 8.1.094 & Node 16.18.1 image command: | MBT_VERSION=$(cat ./VERSION) - sh $PWD/scripts/build_image 8.1.091 16.18.1 ${MBT_VERSION} + sh $PWD/scripts/build_image 8.1.094 16.18.1 ${MBT_VERSION} - run: - name: publish Java 8.1.091 & Node 16.18.1 image + name: publish Java 8.1.094 & Node 16.18.1 image command: | MBT_VERSION=$(cat ./VERSION) echo "Image release: ${MBT_VERSION}" #Push to Docker Hub echo "$DOCKER_HUB_TOKEN" | docker login --username $DOCKER_HUB_USER --password-stdin - sh $PWD/scripts/publish_image 8.1.091 16.18.1 ${MBT_VERSION} "devxci" + sh $PWD/scripts/publish_image 8.1.094 16.18.1 ${MBT_VERSION} "devxci" #Push to GitHub Container Registry echo "$CLOUD_MTA_BOT_GITHUB_TOKEN" | docker login "ghcr.io" --username $CLOUD_MTA_BOT_USER --password-stdin - sh $PWD/scripts/publish_image 8.1.091 16.18.1 ${MBT_VERSION} "ghcr.io/sap" + sh $PWD/scripts/publish_image 8.1.094 16.18.1 ${MBT_VERSION} "ghcr.io/sap" publish-to-dockerhub-java8-node18: docker: - - image: cimg/go:1.17 + - image: cimg/go:1.19 working_directory: ~/go/src/github.com/SAP/cloud-mta-build-tool steps: - checkout @@ -219,25 +256,25 @@ jobs: git fetch git rebase - run: - name: build Java 8.1.091 & Node 18.12.1 image + name: build Java 8.1.094 & Node 18.16.1 image command: | MBT_VERSION=$(cat ./VERSION) - sh $PWD/scripts/build_image 8.1.091 18.12.1 ${MBT_VERSION} + sh $PWD/scripts/build_image 8.1.094 18.16.1 ${MBT_VERSION} - run: - name: publish Java 8.1.091 & Node 18.12.1 image + name: publish Java 8.1.094 & Node 18.16.1 image command: | MBT_VERSION=$(cat ./VERSION) echo "Image release: ${MBT_VERSION}" #Push to Docker Hub echo "$DOCKER_HUB_TOKEN" | docker login --username $DOCKER_HUB_USER --password-stdin - sh $PWD/scripts/publish_image 8.1.091 18.12.1 ${MBT_VERSION} "devxci" + sh $PWD/scripts/publish_image 8.1.094 18.16.1 ${MBT_VERSION} "devxci" #Push to GitHub Container Registry echo "$CLOUD_MTA_BOT_GITHUB_TOKEN" | docker login "ghcr.io" --username $CLOUD_MTA_BOT_USER --password-stdin - sh $PWD/scripts/publish_image 8.1.091 18.12.1 ${MBT_VERSION} "ghcr.io/sap" + sh $PWD/scripts/publish_image 8.1.094 18.16.1 ${MBT_VERSION} "ghcr.io/sap" publish-to-dockerhub-java11-node14: docker: - - image: cimg/go:1.17 + - image: cimg/go:1.19 working_directory: ~/go/src/github.com/SAP/cloud-mta-build-tool steps: - checkout @@ -269,7 +306,7 @@ jobs: publish-to-dockerhub-java11-node16: docker: - - image: cimg/go:1.17 + - image: cimg/go:1.19 working_directory: ~/go/src/github.com/SAP/cloud-mta-build-tool steps: - checkout @@ -301,7 +338,7 @@ jobs: publish-to-dockerhub-java11-node18: docker: - - image: cimg/go:1.17 + - image: cimg/go:1.19 working_directory: ~/go/src/github.com/SAP/cloud-mta-build-tool steps: - checkout @@ -315,25 +352,25 @@ jobs: git fetch git rebase - run: - name: build Java 11.0.17 & Node 18.12.1 image + name: build Java 11.0.17 & Node 18.16.1 image command: | MBT_VERSION=$(cat ./VERSION) - sh $PWD/scripts/build_image 11.0.17 18.12.1 ${MBT_VERSION} + sh $PWD/scripts/build_image 11.0.17 18.16.1 ${MBT_VERSION} - run: - name: publish Java 11.0.17 & Node 18.12.1 image + name: publish Java 11.0.17 & Node 18.16.1 image command: | MBT_VERSION=$(cat ./VERSION) echo "Image release: ${MBT_VERSION}" #Push to Docker Hub echo "$DOCKER_HUB_TOKEN" | docker login --username $DOCKER_HUB_USER --password-stdin - sh $PWD/scripts/publish_image 11.0.17 18.12.1 ${MBT_VERSION} "devxci" + sh $PWD/scripts/publish_image 11.0.17 18.16.1 ${MBT_VERSION} "devxci" #Push to GitHub Container Registry echo "$CLOUD_MTA_BOT_GITHUB_TOKEN" | docker login "ghcr.io" --username $CLOUD_MTA_BOT_USER --password-stdin - sh $PWD/scripts/publish_image 11.0.17 18.12.1 ${MBT_VERSION} "ghcr.io/sap" + sh $PWD/scripts/publish_image 11.0.17 18.16.1 ${MBT_VERSION} "ghcr.io/sap" publish-to-dockerhub-java17-node14: docker: - - image: cimg/go:1.17 + - image: cimg/go:1.19 working_directory: ~/go/src/github.com/SAP/cloud-mta-build-tool steps: - checkout @@ -365,7 +402,7 @@ jobs: publish-to-dockerhub-java17-node16: docker: - - image: cimg/go:1.17 + - image: cimg/go:1.19 working_directory: ~/go/src/github.com/SAP/cloud-mta-build-tool steps: - checkout @@ -397,7 +434,7 @@ jobs: publish-to-dockerhub-java17-node18: docker: - - image: cimg/go:1.17 + - image: cimg/go:1.19 working_directory: ~/go/src/github.com/SAP/cloud-mta-build-tool steps: - checkout @@ -411,25 +448,25 @@ jobs: git fetch git rebase - run: - name: build Java 17.0.5 & Node 18.12.1 image + name: build Java 17.0.5 & Node 18.16.1 image command: | MBT_VERSION=$(cat ./VERSION) - sh $PWD/scripts/build_image 17.0.5 18.12.1 ${MBT_VERSION} + sh $PWD/scripts/build_image 17.0.5 18.16.1 ${MBT_VERSION} - run: - name: publish Java 17.0.5 & Node 18.12.1 image + name: publish Java 17.0.5 & Node 18.16.1 image command: | MBT_VERSION=$(cat ./VERSION) echo "Image release: ${MBT_VERSION}" #Push to Docker Hub echo "$DOCKER_HUB_TOKEN" | docker login --username $DOCKER_HUB_USER --password-stdin - sh $PWD/scripts/publish_image 17.0.5 18.12.1 ${MBT_VERSION} "devxci" + sh $PWD/scripts/publish_image 17.0.5 18.16.1 ${MBT_VERSION} "devxci" #Push to GitHub Container Registry echo "$CLOUD_MTA_BOT_GITHUB_TOKEN" | docker login "ghcr.io" --username $CLOUD_MTA_BOT_USER --password-stdin - sh $PWD/scripts/publish_image 17.0.5 18.12.1 ${MBT_VERSION} "ghcr.io/sap" + sh $PWD/scripts/publish_image 17.0.5 18.16.1 ${MBT_VERSION} "ghcr.io/sap" publish-to-dockerhub-java19-node14: docker: - - image: cimg/go:1.17 + - image: cimg/go:1.19 working_directory: ~/go/src/github.com/SAP/cloud-mta-build-tool steps: - checkout @@ -461,7 +498,7 @@ jobs: publish-to-dockerhub-java19-node16: docker: - - image: cimg/go:1.17 + - image: cimg/go:1.19 working_directory: ~/go/src/github.com/SAP/cloud-mta-build-tool steps: - checkout @@ -493,7 +530,7 @@ jobs: publish-to-dockerhub-java19-node18: docker: - - image: cimg/go:1.17 + - image: cimg/go:1.19 working_directory: ~/go/src/github.com/SAP/cloud-mta-build-tool steps: - checkout @@ -507,25 +544,25 @@ jobs: git fetch git rebase - run: - name: build Java 19.0.1 & Node 18.12.1 image + name: build Java 19.0.1 & Node 18.16.1 image command: | MBT_VERSION=$(cat ./VERSION) - sh $PWD/scripts/build_image 19.0.1 18.12.1 ${MBT_VERSION} + sh $PWD/scripts/build_image 19.0.1 18.16.1 ${MBT_VERSION} - run: - name: publish Java 19.0.1 & Node 18.12.1 image + name: publish Java 19.0.1 & Node 18.16.1 image command: | MBT_VERSION=$(cat ./VERSION) echo "Image release: ${MBT_VERSION}" #Push to Docker Hub echo "$DOCKER_HUB_TOKEN" | docker login --username $DOCKER_HUB_USER --password-stdin - sh $PWD/scripts/publish_image 19.0.1 18.12.1 ${MBT_VERSION} "devxci" + sh $PWD/scripts/publish_image 19.0.1 18.16.1 ${MBT_VERSION} "devxci" #Push to GitHub Container Registry echo "$CLOUD_MTA_BOT_GITHUB_TOKEN" | docker login "ghcr.io" --username $CLOUD_MTA_BOT_USER --password-stdin - sh $PWD/scripts/publish_image 19.0.1 18.12.1 ${MBT_VERSION} "ghcr.io/sap" + sh $PWD/scripts/publish_image 19.0.1 18.16.1 ${MBT_VERSION} "ghcr.io/sap" remove-github-release-tag: docker: - - image: cimg/go:1.17 + - image: cimg/go:1.19 working_directory: ~/go/src/github.com/SAP/cloud-mta-build-tool steps: - checkout @@ -571,10 +608,10 @@ workflows: filters: branches: ignore: master - - build-node: - filters: - branches: - ignore: master + # - build-node: + # filters: + # branches: + # ignore: master - compliance: filters: branches: @@ -593,10 +630,10 @@ workflows: filters: branches: only: master - - build-node: - filters: - branches: - only: master + # - build-node: + # filters: + # branches: + # only: master - compliance: filters: branches: diff --git a/.goreleaser.yml b/.goreleaser.yml index 468abb060..b111c8af4 100755 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -33,6 +33,9 @@ archives: - README* - changelog* - CHANGELOG* + - src: 'micromatch/{{ .Os }}/*' + dst: ./ + strip_parent: true dist: dist checksum: name_template: 'checksums.txt' diff --git a/Dockerfile_mbtci_template b/Dockerfile_mbtci_template index 8188edb24..9c767e422 100644 --- a/Dockerfile_mbtci_template +++ b/Dockerfile_mbtci_template @@ -4,9 +4,12 @@ FROM debian:bullseye-slim ARG MTA_USER="mta" ARG MTA_USER_HOME="/home/${MTA_USER}" ARG MBT_VERSION=1.2.23 +ARG MICROMATCH_WRAPPER_VERSION=1.0.0 +ARG MICROMATCH_WRAPPER_BINARY_NAME=micromatch-wrapper ARG GO_VERSION=1.19.3 ARG NODE_VERSION=NODE_VERSION_TEMPLATE -ARG MAVEN_VERSION=3.8.7 +ARG MAVEN_VERSION=3.9.3 +ARG UI5_VERSION=2.14.19 ARG MAVEN_BASE_URL=https://downloads.apache.org/maven/maven-3/${MAVEN_VERSION}/binaries ARG SAPMACHINE_VERSION=JAVA_VERSION_TEMPLATE @@ -63,7 +66,7 @@ RUN ARCH= && dpkgArch="$(dpkg --print-architecture)" \ 4ED778F539E3634C779C87C6D7062848A1AB005C \ 141F07595B7B3FFE74309A937405533BE57C7D57 \ 74F12602B6F1C4E913FAA37AD3A89613643B6201 \ - 61FC681DFB92A079F1685E77973F295594EC4689 \ + DD792F5973C6DE52C432CBDAC77ABFA00DDBF2B7 \ 8FCCA13FEF1D0C2E91008E09770F7A9A5AE15600 \ C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 \ 890C08DB8579162FEE0DF9DB8BEAB4DFCF555EF4 \ @@ -104,7 +107,7 @@ RUN set -ex \ # Install UI5 CLI RUN set -ex \ - && npm install --prefix /usr/local/ -g @ui5/cli \ + && npm install --prefix /usr/local/ -g @ui5/cli@${UI5_VERSION} \ && npm cache clean -g --force \ # smoke test && echo "ui5 install smoke test!" \ @@ -182,7 +185,7 @@ RUN sapmachine_install() { \ apt-get install -y ca-certificates curl libarchive-tools --no-install-recommends; \ rm -rf /var/lib/apt/lists/*; \ curl -fsSLO --compressed -b 'eula_3_1_agreed=tools.hana.ondemand.com/developer-license-3_1.txt' https://tools.hana.ondemand.com/additional/sapjvm-${SAPMACHINE_VERSION}-linux-${ARCH}.zip; \ - echo "583dedfeee0c119839a610ddc8c6768d0c044429 sapjvm-${SAPMACHINE_VERSION}-linux-${ARCH}.zip" | sha1sum -c -; \ + echo "7d63f20b17becb5f658d413c113ea9efdfbba6a0 sapjvm-${SAPMACHINE_VERSION}-linux-${ARCH}.zip" | sha1sum -c -; \ bsdtar -xvf sapjvm-${SAPMACHINE_VERSION}-linux-${ARCH}.zip -C /usr/local --strip-components=1 --no-same-owner; \ rm -f sapjvm-${SAPMACHINE_VERSION}-linux-${ARCH}.zip; \ apt-get remove --purge --auto-remove -y ca-certificates curl libarchive-tools; \ @@ -207,7 +210,7 @@ RUN set -ex \ && curl -fsSLO --compressed ${MAVEN_BASE_URL}/apache-maven-${MAVEN_VERSION}-bin.tar.gz.asc \ && export GNUPGHOME="$(mktemp -d)" \ && for key in \ - 6A814B1F869C2BBEAB7CB7271A2A1C94BDE89688 \ + 29BEA2A645F2D6CED7FB12E02B172E3E156466E8 \ ; do \ gpg --batch --keyserver hkps://pgp.surf.nl --recv-keys "$key" || \ gpg --batch --keyserver hkps://keyserver.ubuntu.com --recv-keys "$key" ; \ @@ -229,7 +232,9 @@ RUN set -ex \ && npm cache clean -g --force \ # smoke test && echo "mbt ${MBT_VERSION} install smoke test!" \ - && mbt --version + && mbt --version \ + && echo "micromatch-wrapper ${MICROMATCH_WRAPPER_VERSION} install smoke test!" \ + && micromatch-wrapper --version # Install essential build tools and Python RUN set -ex \ @@ -248,6 +253,11 @@ RUN set -ex \ && chown -R ${MTA_USER}:${MTA_USER} ${MTA_USER_HOME} ENV NPM_CONFIG_PREFIX ${MTA_USER_HOME}/.npm-global +# Instll curl and ca-certificates +RUN set -ex \ + && apt-get update \ + && apt-get install -y curl ca-certificates --no-install-recommends + ENV PATH=$PATH:./node_modules/.bin:${MTA_USER_HOME}/.npm-global/bin WORKDIR /project USER ${MTA_USER} \ No newline at end of file diff --git a/Makefile b/Makefile index 7ffe5a919..4e9d732ec 100644 --- a/Makefile +++ b/Makefile @@ -4,10 +4,9 @@ # Execute go build # Copy files to machine go/bin folder (temp target to avoid manual steps when developing locally) -all:format clean dir gen build-linux build-linux-arm build-darwin build-darwin-arm build-windows copy tests +all:format clean dir gen build-linux build-linux-arm build-darwin build-darwin-arm build-windows install-pkg install-micromatch-wrapper copy tests .PHONY: build-darwin-arm build-darwin build-linux build-linux-arm build-windows tests - GOCMD=go GOBUILD=$(GOCMD) build GOLANGCI_VERSION = 1.21.0 @@ -16,6 +15,27 @@ GOLANGCI_VERSION = 1.21.0 BINARY_NAME=mbt BUILD = $(CURDIR)/release +# pkg +PKG_NAME=pkg + +# micromatch wrapper +MICROMATCH_WRAPPER_DIR=$(CURDIR)/micromatch +MICROMATCH_WRAPPER_BINARY_NAME=micromatch-wrapper + +ifeq ($(OS),Windows_NT) +MICROMATCH_WRAPPER_OS=win +else ifeq ($(shell uname -s), Linux) +MICROMATCH_WRAPPER_OS=linux +else ifeq ($(shell uname -s), Darwin) +MICROMATCH_WRAPPER_OS=macos +endif + +ifeq ($(OS),Windows_NT) + MICROMATCH_WRAPPER_SUFFIX = .exe +else + MICROMATCH_WRAPPER_SUFFIX = +endif + format : go fmt ./... @@ -33,7 +53,7 @@ lint: # execute general tests tests: - go test -v ./... + go test -v -count=1 -timeout 30m ./... # check code coverage cover: go test -v -coverprofile cover.out ./... @@ -66,6 +86,20 @@ build-windows: CGO_ENABLED=0 GOOS=windows GOARCH=amd64 $(GOBUILD) -o release/$(BINARY_NAME)_windows -v # use for local development - > copy the new bin to go/bin path to use new compiled version + +# build and install micromatch wrapper +install-pkg: + npm install -g $(PKG_NAME) + echo "$(PKG_NAME) version:" + $(PKG_NAME) --version + +install-micromatch-wrapper: + @cd $(MICROMATCH_WRAPPER_DIR) && npm install && cd - + pkg $(MICROMATCH_WRAPPER_DIR) --out-path $(MICROMATCH_WRAPPER_DIR) + cp $(MICROMATCH_WRAPPER_DIR)/$(MICROMATCH_WRAPPER_BINARY_NAME)-$(MICROMATCH_WRAPPER_OS)$(MICROMATCH_WRAPPER_SUFFIX) $(GOPATH)/bin/$(MICROMATCH_WRAPPER_BINARY_NAME)$(MICROMATCH_WRAPPER_SUFFIX) + echo "$(MICROMATCH_WRAPPER_BINARY_NAME) version:" + $(MICROMATCH_WRAPPER_BINARY_NAME) --version + copy: ifeq ($(OS),Windows_NT) cp $(CURDIR)/release/$(BINARY_NAME)_windows $(GOPATH)/bin/$(BINARY_NAME).exe diff --git a/cmd/build_parameter_test.go b/cmd/build_parameter_test.go new file mode 100644 index 000000000..1f6733f3b --- /dev/null +++ b/cmd/build_parameter_test.go @@ -0,0 +1,88 @@ +package commands + +import ( + "bytes" + "io" + "os" + "os/exec" + + dir "github.com/SAP/cloud-mta-build-tool/internal/archive" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" +) + +var source string + +func copyFile(source string, destination string) error { + sourceFile, err := os.Open(source) + if err != nil { + return err + } + defer sourceFile.Close() + + destFile, err := os.Create(destination) + if err != nil { + return err + } + defer destFile.Close() + + _, err = io.Copy(destFile, sourceFile) + if err != nil { + return err + } + + err = destFile.Sync() + if err != nil { + return err + } + + return nil +} + +var _ = Describe("mbt cli build to test build parameter", func() { + BeforeEach(func() { + source = "testdata/mtaignore" + mbtCmdCLI = getBuildCmdCli() + }) + + AfterEach(func() { + mbtCmdCLI = "" + Ω(os.RemoveAll(getTestPath("mtaignore", dir.MtarFolder))).Should(Succeed()) + }) + It("Success - build-parameter ignore all node_modules", func() { + sourceMta := getTestPath("mtaignore", "mta-ignore-all-node_modules.yaml") + targetMta := getTestPath("mtaignore", "mta.yaml") + copyFile(sourceMta, targetMta) + + var stdout bytes.Buffer + cmd := exec.Command("bash", "-c", mbtCmdCLI+" build"+" --source "+source) + cmd.Stdout = &stdout + + Ω(cmd.Run()).Should(Succeed()) + Ω(os.Remove(getTestPath("mtaignore", "mta.yaml"))).Should(Succeed()) + }) + It("Success - build-parameter ignore node_modules subfolders", func() { + sourceMta := getTestPath("mtaignore", "mta-ignore-node_modules-subfolders.yaml") + targetMta := getTestPath("mtaignore", "mta.yaml") + copyFile(sourceMta, targetMta) + + var stdout bytes.Buffer + cmd := exec.Command("bash", "-c", mbtCmdCLI+" build"+" --source "+source) + cmd.Stdout = &stdout + + Ω(cmd.Run()).Should(Succeed()) + Ω(os.Remove(getTestPath("mtaignore", "mta.yaml"))).Should(Succeed()) + }) + It("Success - build-parameter ignore all invisible dirs and files", func() { + sourceMta := getTestPath("mtaignore", "mta-ignore-all-invisible-dir-and-files.yaml") + targetMta := getTestPath("mtaignore", "mta.yaml") + copyFile(sourceMta, targetMta) + + var stdout bytes.Buffer + cmd := exec.Command("bash", "-c", mbtCmdCLI+" build"+" --source "+source) + cmd.Stdout = &stdout + + Ω(cmd.Run()).Should(Succeed()) + Ω(os.Remove(getTestPath("mtaignore", "mta.yaml"))).Should(Succeed()) + }) +}) diff --git a/cmd/cmd_test.go b/cmd/cmd_test.go index 669539732..7dec31e94 100644 --- a/cmd/cmd_test.go +++ b/cmd/cmd_test.go @@ -47,6 +47,11 @@ var _ = Describe("Commands", func() { }) }) +func getBuildCmdCli() string { + cli := "mbt" + return cli +} + func getTestPath(relPath ...string) string { wd, _ := os.Getwd() return filepath.Join(wd, "testdata", filepath.Join(relPath...)) diff --git a/cmd/init.go b/cmd/init.go index 0671a6935..1a49a0283 100644 --- a/cmd/init.go +++ b/cmd/init.go @@ -23,6 +23,7 @@ var initCmdExtensions []string var initCmdMode string // flags of build command +var mbtCmdCLI string var buildCmdSrc string var buildCmdTrg string var buildCmdExtensions []string diff --git a/cmd/init_test.go b/cmd/init_test.go index d7738fb63..6eaccf012 100644 --- a/cmd/init_test.go +++ b/cmd/init_test.go @@ -1,8 +1,11 @@ package commands import ( + "bytes" "os" + "os/exec" + dir "github.com/SAP/cloud-mta-build-tool/internal/archive" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" ) @@ -24,18 +27,150 @@ var _ = Describe("Init", func() { }) var _ = Describe("Build", func() { - BeforeEach(func() { - Ω(os.MkdirAll(getTestPath("result"), os.ModePerm)).Should(Succeed()) + mbtCmdCLI = getBuildCmdCli() }) AfterEach(func() { - Ω(os.RemoveAll(getTestPath("result"))).Should(Succeed()) + mbtCmdCLI = "" + }) + It("Success - build with abs source parameter", func() { + source := "\"" + getTestPath("mta") + "\"" + + var stdout bytes.Buffer + cmd := exec.Command("bash", "-c", mbtCmdCLI+" build"+" --source "+source) + cmd.Stdout = &stdout + + Ω(cmd.Run()).Should(Succeed()) + Ω(os.RemoveAll(getTestPath("mta", dir.MtarFolder))).Should(Succeed()) }) - It("Failure - wrong platform", func() { - buildCmdSrc = getTestPath("mta") - buildCmdTrg = getTestPath("result") - buildCmdPlatform = "xxx" - err := buildCmd.RunE(nil, []string{}) - Ω(err).Should(HaveOccurred()) + It("Success - build with relative source parameter", func() { + // Notice: relative source path is relative to os.Getwd() + source := "\"" + "testdata/mta" + "\"" + + var stdout bytes.Buffer + cmd := exec.Command("bash", "-c", mbtCmdCLI+" build"+" --source "+source) + cmd.Stdout = &stdout + + Ω(cmd.Run()).Should(Succeed()) + Ω(os.RemoveAll(getTestPath("mta", dir.MtarFolder))).Should(Succeed()) + }) + It("Success - build with abs source and abs target parameter", func() { + source := "\"" + getTestPath("mta") + "\"" + target := "\"" + getTestPath("mtar_result") + "\"" + + var stdout bytes.Buffer + cmd := exec.Command("bash", "-c", mbtCmdCLI+" build"+" --source "+source+" --target "+target) + cmd.Stdout = &stdout + + Ω(cmd.Run()).Should(Succeed()) + Ω(os.RemoveAll(getTestPath("mtar_result"))).Should(Succeed()) + }) + It("Success - build with abs source and relative target path parameter", func() { + // Notice: target parameter is relative to source parameter + source := "\"" + getTestPath("mta") + "\"" + target := "\"" + "mtar_result" + "\"" + + var stdout bytes.Buffer + cmd := exec.Command("bash", "-c", mbtCmdCLI+" build"+" --source "+source+" --target "+target) + cmd.Stdout = &stdout + + Ω(cmd.Run()).Should(Succeed()) + Ω(os.RemoveAll(getTestPath("mta", "mtar_result"))).Should(Succeed()) + }) + It("Success - build with relative source and abs target path parameter", func() { + source := "\"" + "testdata/mta" + "\"" + target := "\"" + getTestPath("mta", "mtar_result") + "\"" + + var stdout bytes.Buffer + cmd := exec.Command("bash", "-c", mbtCmdCLI+" build"+" --source "+source+" --target "+target) + cmd.Stdout = &stdout + + Ω(cmd.Run()).Should(Succeed()) + Ω(os.RemoveAll(getTestPath("mta", "mtar_result"))).Should(Succeed()) + }) + It("Success - build with relative source and relative target path parameter", func() { + // Notice: target parameter is relative to source parameter + source := "\"" + "testdata/mta" + "\"" + target := "\"" + "mtar_result" + "\"" + + var stdout bytes.Buffer + cmd := exec.Command("bash", "-c", mbtCmdCLI+" build"+" --source "+source+" --target "+target) + cmd.Stdout = &stdout + + Ω(cmd.Run()).Should(Succeed()) + Ω(os.RemoveAll(getTestPath("mta", "mtar_result"))).Should(Succeed()) + }) + It("Failure - build with invalid source parameter case 1", func() { + // Notice: target parameter is relative to source parameter + source := "\"" + "testdata/**??mta" + "\"" + target := "\"" + "mtar_result" + "\"" + + var stdout bytes.Buffer + cmd := exec.Command("bash", "-c", mbtCmdCLI+" build"+" --source "+source+" --target "+target) + cmd.Stdout = &stdout + + Ω(cmd.Run()).Should(HaveOccurred()) + // Ω(stdout.String()).Should(ContainSubstring("The filename, directory name, or volume label syntax is incorrect")) + Ω(os.RemoveAll(getTestPath("mta", "mtar_result"))).Should(Succeed()) + }) + It("Failure - build with invalid source parameter case 2", func() { + // Notice: target parameter is relative to source parameter + source := "\"" + "testdata<>/tmp" + "\"" + var stdout bytes.Buffer + + cmd := exec.Command("bash", "-c", mbtCmdCLI+" build"+" --source "+source+" --target "+target) + cmd.Stdout = &stdout + + Ω(cmd.Run()).Should(HaveOccurred()) + //Ω(stdout.String()).Should(ContainSubstring("The filename, directory name, or volume label syntax is incorrect")) + Ω(os.RemoveAll(getTestPath("mta", "mtar_result"))).Should(Succeed()) + }) + It("Failure - build with invalid target parameter case 2", func() { + // Notice: target parameter is relative to source parameter + source := "\"" + "testdata/mta" + "\"" + target := "\"" + "mtar_result/??*tmp" + "\"" + var stdout bytes.Buffer + + cmd := exec.Command("bash", "-c", mbtCmdCLI+" build"+" --source "+source+" --target "+target) + cmd.Stdout = &stdout + + Ω(cmd.Run()).Should(HaveOccurred()) + //Ω(stdout.String()).Should(ContainSubstring("The filename, directory name, or volume label syntax is incorrect")) + Ω(os.RemoveAll(getTestPath("mta", "mtar_result"))).Should(Succeed()) + })*/ + It("Failure - build without mta.yaml", func() { + source := "\"" + getTestPath("tmp") + "\"" + Ω(os.MkdirAll(getTestPath("tmp"), os.ModePerm)).Should(Succeed()) + + var stdout bytes.Buffer + cmd := exec.Command("bash", "-c", mbtCmdCLI+" build"+" --source "+source) + cmd.Stdout = &stdout + + Ω(cmd.Run()).Should(HaveOccurred()) + Ω(os.RemoveAll(getTestPath("tmp"))).Should(Succeed()) + }) + It("Failure - build with invalid platform parameter", func() { + platform := "\"" + "xxx" + "\"" + source := "\"" + getTestPath("mta") + "\"" + + var stdout bytes.Buffer + cmd := exec.Command("bash", "-c", mbtCmdCLI+" build"+" --source "+source+" --platform "+platform) + cmd.Stdout = &stdout + + Ω(cmd.Run()).Should(HaveOccurred()) }) }) diff --git a/cmd/testdata/mta/mta.yaml b/cmd/testdata/mta/mta.yaml index 7c8e881b6..38c501095 100644 --- a/cmd/testdata/mta/mta.yaml +++ b/cmd/testdata/mta/mta.yaml @@ -3,10 +3,10 @@ _schema-version: '2.1' version: 0.0.1 modules: - - name: node-js - type: nodejs - path: node-js - provides: - - name: node-js_api - properties: - url: ${default-url} + - name: node-js + type: nodejs + path: node-js + provides: + - name: node-js_api + properties: + url: ${default-url} \ No newline at end of file diff --git a/cmd/testdata/mtaignore/mta-ignore-all-invisible-dir-and-files.yaml b/cmd/testdata/mtaignore/mta-ignore-all-invisible-dir-and-files.yaml new file mode 100644 index 000000000..e5826f5ea --- /dev/null +++ b/cmd/testdata/mtaignore/mta-ignore-all-invisible-dir-and-files.yaml @@ -0,0 +1,15 @@ +ID: mta +_schema-version: '2.1' +version: 0.0.1 + +modules: + - name: node-js + type: nodejs + path: node-js + provides: + - name: node-js_api + properties: + url: ${default-url} + build-parameters: + ignore-use-full-glob-pattern: true + ignore: ["**/.*", "**/.*/**", "**/.*/.*", "**/.*/.*/**", "**/.*/.*/.*", "**/.*/*/**", "**/.*/*/.*", "node_modules/**", "!node_modules/sproutid/**", "!node_modules/sproutid/**/.*"] diff --git a/cmd/testdata/mtaignore/mta-ignore-all-node_modules.yaml b/cmd/testdata/mtaignore/mta-ignore-all-node_modules.yaml new file mode 100644 index 000000000..43a9a6f3e --- /dev/null +++ b/cmd/testdata/mtaignore/mta-ignore-all-node_modules.yaml @@ -0,0 +1,15 @@ +ID: mta +_schema-version: '2.1' +version: 0.0.1 + +modules: + - name: node-js + type: nodejs + path: node-js + provides: + - name: node-js_api + properties: + url: ${default-url} + build-parameters: + ignore-use-full-glob-pattern: true + ignore: ["node_modules"] \ No newline at end of file diff --git a/cmd/testdata/mtaignore/mta-ignore-node_modules-subfolders.yaml b/cmd/testdata/mtaignore/mta-ignore-node_modules-subfolders.yaml new file mode 100644 index 000000000..85c5f0523 --- /dev/null +++ b/cmd/testdata/mtaignore/mta-ignore-node_modules-subfolders.yaml @@ -0,0 +1,15 @@ +ID: mta +_schema-version: '2.1' +version: 0.0.1 + +modules: + - name: node-js + type: nodejs + path: node-js + provides: + - name: node-js_api + properties: + url: ${default-url} + build-parameters: + ignore-use-full-glob-pattern: true + ignore: ["node_modules/**", "!node_modules/sproutid/**"] diff --git a/cmd/testdata/mtaignore/node-js/.invisible-dir/.invisible-file b/cmd/testdata/mtaignore/node-js/.invisible-dir/.invisible-file new file mode 100644 index 000000000..e69de29bb diff --git a/cmd/testdata/mtaignore/node-js/.invisible-dir/.invisible-sub-dir/.invisible-sub-file b/cmd/testdata/mtaignore/node-js/.invisible-dir/.invisible-sub-dir/.invisible-sub-file new file mode 100644 index 000000000..e69de29bb diff --git a/cmd/testdata/mtaignore/node-js/.invisible-dir/.invisible-sub-dir/visible-sub-file b/cmd/testdata/mtaignore/node-js/.invisible-dir/.invisible-sub-dir/visible-sub-file new file mode 100644 index 000000000..e69de29bb diff --git a/cmd/testdata/mtaignore/node-js/.invisible-dir/visible-file b/cmd/testdata/mtaignore/node-js/.invisible-dir/visible-file new file mode 100644 index 000000000..e69de29bb diff --git a/cmd/testdata/mtaignore/node-js/.invisible-dir/visible-sub-dir/.invisible-sub-file b/cmd/testdata/mtaignore/node-js/.invisible-dir/visible-sub-dir/.invisible-sub-file new file mode 100644 index 000000000..e69de29bb diff --git a/cmd/testdata/mtaignore/node-js/.invisible-dir/visible-sub-dir/visible-sub-file b/cmd/testdata/mtaignore/node-js/.invisible-dir/visible-sub-dir/visible-sub-file new file mode 100644 index 000000000..e69de29bb diff --git a/cmd/testdata/mtaignore/node-js/.invisible-file b/cmd/testdata/mtaignore/node-js/.invisible-file new file mode 100644 index 000000000..e69de29bb diff --git a/cmd/testdata/mtaignore/node-js/gulpfile.js b/cmd/testdata/mtaignore/node-js/gulpfile.js new file mode 100644 index 000000000..4d1b56cdc --- /dev/null +++ b/cmd/testdata/mtaignore/node-js/gulpfile.js @@ -0,0 +1,132 @@ +/** + * This is the gulp script to run jasmine tests with coverage analysis using istanbul. + * For more information, please see also: + * @see {@link http://jasmine.github.io/2.0/introduction.html} + * @see {@link https://www.npmjs.com/package/istanbul} + * @see {@link https://www.npmjs.com/package/gulp} + * @see {@link https://www.npmjs.com/package/gulp-istanbul} + * @see {@link https://www.npmjs.com/package/gulp-jasmine} + * @see {@link https://www.npmjs.com/package/jasmine-reporters} + * @see {@link https://www.npmjs.com/package/glob} + **/ + +var path = require("path"); + +var gulp = require("gulp"); +var jasmine = require("gulp-jasmine"); +var istanbul = require("gulp-istanbul"); +var reporters = require("jasmine-reporters"); + +// required to replace absolute paths in results with relative ones +var replace = require("gulp-replace"); + +// configuration of the test coverage, uses glob syntax +// @see {@link https://www.npmjs.com/package/glob} + +// the following files are included in the coverage analysis +// include all javascript files and exclude myExclude.js +// replace or remove files depending on what is to be excluded or included in addition +var includedScripts = ["**/*.js", "!myExclude.js"]; + +// the following files are part of the framework and are to be excluded from the test coverage +var defaultExclusion = ["!**/*spec.js", "!rungulp.js", "!gulpfile.js", "!**/node_modules/**", "!appcontroller.*/**", "!vendor/**"]; + +// test results folder for test view history +// assign each test run a unique timestamp, coverage and test results +// are associated via timestamp, so the test results folder fills up with files +// of form: +// 123456_report.xml +// 123456_coverage.json +// 456789_report.xml +// 456789_coverage.json +// ... +var testResultsDir = path.join(__dirname, ".testresults"); + +var timestamp = Date.now(); +var testResultFile = timestamp + "_report.xml"; +var coverageResultFile = timestamp + "_coverage.json"; + +/** + * Instrument the test/productive code + */ +gulp.task("instrumentation", function() { + return gulp.src(includedScripts.concat(defaultExclusion)) + // Covering files + .pipe(istanbul({ + includeUntested: true // instrument all files + })) + // Force `require` to return covered files + .pipe(istanbul.hookRequire()); +}); + +/** + * Execute tests with coverage information, requires instrumentation + * before tests are executed + */ +gulp.task("jasmine-istanbul", ["instrumentation"], function() { + // run all tests ending with "spec", skip all tests that are part of the node_modules + return gulp.src(["**/*spec.js", "!**/node_modules/**"]) + .pipe(jasmine({ + errorOnFail: false, + // use the standard junit xml reporter + reporter: new reporters.JUnitXmlReporter({ + savePath: testResultsDir, + filePrefix: testResultFile, + consolidateAll: true + }) + })) + .pipe(istanbul.writeReports({ + // generage json report for the coverage + reporters: ["json"], + reportOpts: { + json: { + dir: testResultsDir, + file: coverageResultFile + } + } + })); +}); + +/** + * Execute tests without coverage information + */ +gulp.task("jasmine", function() { + // run all tests ending with "spec", skip all tests that are part of the node_modules + return gulp.src(["**/*spec.js", "!**/node_modules/**"]) + .pipe(jasmine({ + errorOnFail: false, + // use the standard junit xml reporter + reporter: new reporters.JUnitXmlReporter({ + savePath: testResultsDir, + filePrefix: testResultFile, + consolidateAll: true + }) + })); +}); + +/** + * Remove absolute path portions so test view can open the referenced files + */ +function postProcessing() { + return gulp.src([ + path.join(testResultsDir, testResultFile), + path.join(testResultsDir, coverageResultFile) + ], { + dot: true + }) + .pipe(replace(__dirname, "")) + .pipe(gulp.dest(testResultsDir)); +} + +// run tests with coverage analysis +gulp.task("test-coverage", ["jasmine-istanbul"], function() { + return postProcessing(); +}); + +// only run the tests, skip test coverage analysis +gulp.task("test", ["jasmine"], function() { + return postProcessing(); +}); + +//the default task is to run tests with coverage analysis +gulp.task("default", ["test-coverage"]); diff --git a/cmd/testdata/mtaignore/node-js/package-lock.json b/cmd/testdata/mtaignore/node-js/package-lock.json new file mode 100644 index 000000000..5d9a90b94 --- /dev/null +++ b/cmd/testdata/mtaignore/node-js/package-lock.json @@ -0,0 +1,6782 @@ +{ + "name": "node-js", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "node-js", + "version": "1.0.0", + "dependencies": { + "prune": "0.0.2" + }, + "devDependencies": { + "gulp": "3.9.1", + "gulp-istanbul": "1.1.1", + "gulp-jasmine": "2.4.1", + "gulp-replace": "0.5.4", + "jasmine-reporters": "2.1.1" + }, + "engines": { + "node": ">=14.15.0" + } + }, + "node_modules/abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", + "dev": true + }, + "node_modules/amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.4.2" + } + }, + "node_modules/ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha512-HrgGIZUl8h2EHuZaU9hTR/cU5nhKxpVE1V6kdGsQ8e4zirElJ5fvtfc8N7Q1oq1aatO275i8pUFUCpNWCAnVWw==", + "dev": true, + "dependencies": { + "ansi-wrap": "0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha512-LeZY+DZDRnvP7eMuQ6LHfCzUGxAAIViUBliK24P3hWXL6y4SortgR6Nim6xrkfSLlmH0+k+9NYNwVC2s53ZrYQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "dev": true + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha512-3vqtKL1N45I5dV0RdssXZG7X6pCqQrWPNOlBPZPrd+QkE2HEhR57Z04m0KtpbsZH73j+a3F8UD1TQnn+ExTvIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/binaryextensions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-1.0.1.tgz", + "integrity": "sha512-xnG0l4K3ghM62rFzDi2jcNEuICl6uQ4NgvGpqQsY7HgW8gPDeAWGOxHI/k+qZfXfMANytzrArGNPXidaCwtbmA==", + "dev": true + }, + "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": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/braces/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha512-dhUqc57gSMCo6TX85FLfe51eC/s+Im2MLkAgJwfaRRexR2tA4dd3eLEW4L6efzHc2iNorrRRXITifnDLlRrhaA==", + "dev": true + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dev": true, + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha512-GODcnWq3YGoTnygPfi02ygEiRxqUxpJwuRHjdhJYuxpcZmDq4rjBiXYmbCCzStxo176ixfLT6i4NPwQooRySnw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deprecated": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", + "integrity": "sha512-BRACtc6B1mJe2J2mruHFqHWrtLy0Qppu/7LKdqWH3o/9j1L/1phPUaQV+2S3H8ZDW0k6h+NEOKcHBDRikWLiOA==", + "dev": true, + "engines": { + "node": ">= 0.9" + } + }, + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha512-+AWBwjGadtksxjOQSFDhPNQbed7icNXApT4+2BNpsXzcCBiInq2H9XW0O8sfHFaPmnQRs7cg/P0fAr2IWQSW0g==", + "dev": true, + "dependencies": { + "readable-stream": "~1.1.9" + } + }, + "node_modules/duplexer2/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "node_modules/duplexer2/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/duplexer2/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + }, + "node_modules/end-of-stream": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", + "integrity": "sha512-go5TQkd0YRXYhX+Lc3UrXkoKU5j+m72jEP5lHWr2Nh82L8wfZtH8toKgcg4T10o23ELIMGXQdwCbl+qAXIPDrw==", + "dev": true, + "dependencies": { + "once": "~1.3.0" + } + }, + "node_modules/end-of-stream/node_modules/once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "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": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==", + "dev": true, + "dependencies": { + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=0.12.0" + }, + "optionalDependencies": { + "source-map": "~0.2.0" + } + }, + "node_modules/esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "dependencies": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fileset": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-0.2.1.tgz", + "integrity": "sha512-aK3PFyHSwWsBJCarRxMRIXSGamfroi9ehG8f4e5A2n5nSlEVHe8y44jNTIN4+HdZSpK3FNV0EdihH1iDWTdnGg==", + "dev": true, + "dependencies": { + "glob": "5.x", + "minimatch": "2.x" + } + }, + "node_modules/fileset/node_modules/minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha512-jQo6o1qSVLEWaw3l+bwYA2X0uLuK2KjNh2wjgO7Q/9UJnXr1Q3yQKR8BI0/Bt/rPg75e6SMW4hW/6cBHVTZUjA==", + "deprecated": "Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue", + "dev": true, + "dependencies": { + "brace-expansion": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fill-range/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/find-index": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", + "integrity": "sha512-uJ5vWrfBKMcE6y2Z8834dwEZj9mNGxYa3t3I53OwFeuZ8D9oc2E5zcsrkuhX6h4iYrjhiv0T3szQmxlAV9uxDg==", + "dev": true + }, + "node_modules/findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha512-vs+3unmJT45eczmcAZ6zMJtxN3l/QXeccaXQx5cu/MeJMhewVfoWZqibRkOxPnmoR59+Zy5hjabfQc6JLSah4g==", + "dev": true, + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/first-chunk-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", + "integrity": "sha512-ArRi5axuv66gEsyl3UuK80CzW7t56hem73YGNYxNWTGNKFJUadSb9Gu9SHijYEUi8ulQMf1bJomYNwSCPHhtTQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "dev": true, + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dev": true, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/gaze": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", + "integrity": "sha512-3IWbXGkDDHFX8zIlNdfnmhvlSMhpBO6tDr4InB8fGku6dh/gjFPGNqcdsXJajZg05x9jRzXbL6gCnCnuMap4tw==", + "dev": true, + "dependencies": { + "globule": "~0.1.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", + "dev": true, + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-stream": { + "version": "3.1.18", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", + "integrity": "sha512-owHtlMMXIAbxLjhUAO0HhW1/TB7kV0AwDduI3BLbYsWCaRzNIcLBu8N0wHZft2Za2SCmUXCEOdpZzC7k/H19eg==", + "dev": true, + "dependencies": { + "glob": "^4.3.1", + "glob2base": "^0.0.12", + "minimatch": "^2.0.1", + "ordered-read-streams": "^0.1.0", + "through2": "^0.6.1", + "unique-stream": "^1.0.0" + }, + "engines": { + "node": ">= 0.9" + } + }, + "node_modules/glob-stream/node_modules/glob": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", + "integrity": "sha512-I0rTWUKSZKxPSIAIaqhSXTM/DiII6wame+rEC3cFA5Lqmr9YmdL7z6Hj9+bdWtTvoY1Su4/OiMLmb37Y7JzvJQ==", + "dev": true, + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^2.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-stream/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "node_modules/glob-stream/node_modules/minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha512-jQo6o1qSVLEWaw3l+bwYA2X0uLuK2KjNh2wjgO7Q/9UJnXr1Q3yQKR8BI0/Bt/rPg75e6SMW4hW/6cBHVTZUjA==", + "deprecated": "Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue", + "dev": true, + "dependencies": { + "brace-expansion": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-stream/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/glob-stream/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + }, + "node_modules/glob-stream/node_modules/through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", + "dev": true, + "dependencies": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "node_modules/glob-watcher": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", + "integrity": "sha512-lzYWq1BJLBmtb9rzT6+lgbFlEW6Sc7B+Qs3RmsNA9lbdFSqLHhebfypPR3nbEOMeEQyawVXqSDH0aqjtImldow==", + "dev": true, + "dependencies": { + "gaze": "^0.5.1" + }, + "engines": { + "node": ">= 0.9" + } + }, + "node_modules/glob2base": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", + "integrity": "sha512-ZyqlgowMbfj2NPjxaZZ/EtsXlOch28FRXgMd64vqZWk1bT9+wvSRLYD1om9M7QfQru51zJPAT17qXm4/zd+9QA==", + "dev": true, + "dependencies": { + "find-index": "^0.1.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/globule": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", + "integrity": "sha512-3eIcA2OjPCm4VvwIwZPzIxCVssA8HSpM2C6c6kK5ufJH4FGwWoyqL3In19uuX4oe+TwH3w2P1nQDmW56iehO4A==", + "dev": true, + "dependencies": { + "glob": "~3.1.21", + "lodash": "~1.0.1", + "minimatch": "~0.2.11" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/globule/node_modules/glob": { + "version": "3.1.21", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "integrity": "sha512-ANhy2V2+tFpRajE3wN4DhkNQ08KDr0Ir1qL12/cUe5+a7STEK8jkW4onUYuY8/06qAFuT5je7mjAqzx0eKI2tQ==", + "dev": true, + "dependencies": { + "graceful-fs": "~1.2.0", + "inherits": "1", + "minimatch": "~0.2.11" + }, + "engines": { + "node": "*" + } + }, + "node_modules/globule/node_modules/graceful-fs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "integrity": "sha512-iiTUZ5vZ+2ZV+h71XAgwCSu6+NAizhFU3Yw8aC/hH5SQ3SnISqEqAek40imAFGtDcwJKNhXvSY+hzIolnLwcdQ==", + "deprecated": "please upgrade to graceful-fs 4 for compatibility with current and future versions of Node.js", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/globule/node_modules/inherits": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", + "integrity": "sha512-Al67oatbRSo3RV5hRqIoln6Y5yMVbJSIn4jEJNL7VCImzq/kLr7vvb6sFRJXqr8rpHc/2kJOM+y0sPKN47VdzA==", + "dev": true + }, + "node_modules/globule/node_modules/lodash": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", + "integrity": "sha512-0VSEDVec/Me2eATuoiQd8IjyBMMX0fahob8YJ96V1go2RjvCk1m1GxmtfXn8RNSaLaTtop7fsuhhu9oLk3hUgA==", + "dev": true, + "engines": [ + "node", + "rhino" + ] + }, + "node_modules/globule/node_modules/minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha512-zZ+Jy8lVWlvqqeM8iZB7w7KmQkoJn8djM585z88rywrEbzoqawVa9FR5p2hwD+y74nfuKOjmNvi9gtWJNLqHvA==", + "deprecated": "Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue", + "dev": true, + "dependencies": { + "lru-cache": "2", + "sigmund": "~1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "dev": true, + "dependencies": { + "sparkles": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/graceful-fs": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.12.tgz", + "integrity": "sha512-J55gaCS4iTTJfTXIxSVw3EMQckcqkpdRv3IR7gu6sq0+tbC363Zx6KH/SEwXASK9JRbhyZmVjJEVJIOxYsB3Qg==", + "dev": true, + "dependencies": { + "natives": "^1.1.3" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/gulp": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", + "integrity": "sha512-6FHNdR+VG1LcPz6gZGGqgvimWWGtl4x3FvshAdK/UnAjU7aFOyzft3Fjp35r0Y3ZF4u8vND0S4nGsIB/sxTqzQ==", + "dev": true, + "dependencies": { + "archy": "^1.0.0", + "chalk": "^1.0.0", + "deprecated": "^0.0.1", + "gulp-util": "^3.0.0", + "interpret": "^1.0.0", + "liftoff": "^2.1.0", + "minimist": "^1.1.0", + "orchestrator": "^0.3.0", + "pretty-hrtime": "^1.0.0", + "semver": "^4.1.0", + "tildify": "^1.0.0", + "v8flags": "^2.0.2", + "vinyl-fs": "^0.3.0" + }, + "bin": { + "gulp": "bin/gulp.js" + }, + "engines": { + "node": ">= 0.9" + } + }, + "node_modules/gulp-istanbul": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/gulp-istanbul/-/gulp-istanbul-1.1.1.tgz", + "integrity": "sha512-zb9TskzBREokmiOzV83ZZmWQa4r1Ij3hBJB4BoCTZogRT3rChdMpRH3yoyq1s2H6GoadwY/n8MjsMP2UHMERMA==", + "dev": true, + "dependencies": { + "gulp-util": "^3.0.1", + "istanbul": "^0.4.0", + "istanbul-threshold-checker": "^0.1.0", + "lodash": "^4.0.0", + "through2": "^2.0.0", + "vinyl-sourcemaps-apply": "^0.2.1" + } + }, + "node_modules/gulp-jasmine": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/gulp-jasmine/-/gulp-jasmine-2.4.1.tgz", + "integrity": "sha512-2QlQP4QjqCbD8mnt00PigVp4wg3vRrTN4vQsluFAC/d4xTJTnedHgar8Hirci5UyDQE0orBpP33UD2+m3SAGgw==", + "dev": true, + "dependencies": { + "arrify": "^1.0.0", + "gulp-util": "^3.0.0", + "jasmine": "^2.3.0", + "jasmine-terminal-reporter": "^1.0.0", + "through2": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-replace": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/gulp-replace/-/gulp-replace-0.5.4.tgz", + "integrity": "sha512-lHL+zKJN8uV95UkONnfRkoj2yJxPPupt2SahxA4vo5c+Ee3+WaIiMdWbOyUhg8BhAROQrWKnnxKOWPdVrnBwGw==", + "dev": true, + "dependencies": { + "istextorbinary": "1.0.2", + "readable-stream": "^2.0.1", + "replacestream": "^4.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha512-q5oWPc12lwSFS9h/4VIjG+1NuNDlJ48ywV2JKItY4Ycc/n1fXJeYPVQsfu5ZrhQi7FGSDBalwUCLar/GyHXKGw==", + "deprecated": "gulp-util is deprecated - replace it, following the guidelines at https://medium.com/gulpjs/gulp-util-ca3b1f9f9ac5", + "dev": true, + "dependencies": { + "array-differ": "^1.0.0", + "array-uniq": "^1.0.2", + "beeper": "^1.0.0", + "chalk": "^1.0.0", + "dateformat": "^2.0.0", + "fancy-log": "^1.1.0", + "gulplog": "^1.0.0", + "has-gulplog": "^0.1.0", + "lodash._reescape": "^3.0.0", + "lodash._reevaluate": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.template": "^3.0.0", + "minimist": "^1.1.0", + "multipipe": "^0.1.2", + "object-assign": "^3.0.0", + "replace-ext": "0.0.1", + "through2": "^2.0.0", + "vinyl": "^0.5.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha512-hm6N8nrm3Y08jXie48jsC55eCZz9mnb4OirAStEk2deqeyhXU3C1otDVh+ccttMuc1sBi6RX6ZJ720hs9RCvgw==", + "dev": true, + "dependencies": { + "glogg": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/handlebars/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha512-+F4GzLjwHNNDEAJW2DC1xXfEoPkRDmUdJ7CBYw4MpqtDwOnqdImJl7GWlpqx+Wko6//J8uKTnIe4wZSv7yCqmw==", + "dev": true, + "dependencies": { + "sparkles": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dev": true, + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==", + "dev": true, + "dependencies": { + "repeating": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "dev": true + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", + "integrity": "sha512-nMtdn4hvK0HjUlzr1DrKSUY8ychprt8dzHOgY2KXsIhHu5PuQQEOTM27gV9Xblyon7aUH/TSFIjRHEODF/FRPg==", + "deprecated": "This module is no longer maintained, try this instead:\n npm i nyc\nVisit https://istanbul.js.org/integrations for other alternatives.", + "dev": true, + "dependencies": { + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "istanbul": "lib/cli.js" + } + }, + "node_modules/istanbul-threshold-checker": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/istanbul-threshold-checker/-/istanbul-threshold-checker-0.1.0.tgz", + "integrity": "sha512-50uqabaVYk7kkc6IqtwpdSHbSwCX+eCrm0LtDfqZgdFE45p8z3tjFNofiPKhJmViJEynabVVbOHW5jsdrymUvw==", + "dev": true, + "dependencies": { + "istanbul": "0.3.*", + "lodash": "3.6.*" + } + }, + "node_modules/istanbul-threshold-checker/node_modules/escodegen": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.7.1.tgz", + "integrity": "sha512-2cd7+JUtUEmZVpGmfF9r+uRYXswJAkf85Ce8GvdBa7hSvdjY8hGo+rwC5syAgYzqHpfxNJzLntFjw6879yPbgQ==", + "dev": true, + "dependencies": { + "esprima": "^1.2.2", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.5.0" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=0.12.0" + }, + "optionalDependencies": { + "source-map": "~0.2.0" + } + }, + "node_modules/istanbul-threshold-checker/node_modules/escodegen/node_modules/esprima": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.5.tgz", + "integrity": "sha512-S9VbPDU0adFErpDai3qDkjq8+G05ONtKzcyNrPKg/ZKa+tf879nX2KexNU95b31UoTJjRLInNBHHHjFPoCd7lQ==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/istanbul-threshold-checker/node_modules/esprima": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.5.0.tgz", + "integrity": "sha512-uM6hfS0/8ybNIj8SGRMdidPJy5uhWqWN/GIkyqnMAbCSL44yfFGLuBpRRCgOpBXBZt2OymQuM+IfahkqJq3DWw==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-threshold-checker/node_modules/fast-levenshtein": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.0.7.tgz", + "integrity": "sha512-hYsfI0s4lfQ2rHVFKXwAr/L/ZSbq9TZwgXtZqW7ANcn9o9GKvcbWxOnxx7jykXf/Ezv1V8TvaBEKcGK7DWKX5A==", + "dev": true + }, + "node_modules/istanbul-threshold-checker/node_modules/istanbul": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.3.22.tgz", + "integrity": "sha512-8H/jxiee2UqX/mviKkPoKQYMxU2t995FC5PwO4zjWeDPOozjoeKqxEyN62l9o5+UgzvYQbrKgQjjxhGON8FcMg==", + "deprecated": "This module is no longer maintained, try this instead:\n npm i nyc\nVisit https://istanbul.js.org/integrations for other alternatives.", + "dev": true, + "dependencies": { + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.7.x", + "esprima": "2.5.x", + "fileset": "0.2.x", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "istanbul": "lib/cli.js" + } + }, + "node_modules/istanbul-threshold-checker/node_modules/levn": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.2.5.tgz", + "integrity": "sha512-mvp+NO++YH0B+e8cC/SvJxk6k5Z9Ngd3iXuz7tmT8vZCyQZj/5SI1GkFOiZGGPkm5wWGI9SUrqiAfPq7BJH+0w==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.0", + "type-check": "~0.3.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/istanbul-threshold-checker/node_modules/lodash": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.6.0.tgz", + "integrity": "sha512-fysFKsJtaOtRGZT/b3Xx03iyEmO0zjU+d1HBH5NcEaUjtg7XO0wDY5I7IJFfr2rguJt0Rve2V32426Za3zYyRw==", + "dev": true + }, + "node_modules/istanbul-threshold-checker/node_modules/optionator": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.5.0.tgz", + "integrity": "sha512-jUr7aBk/kCInAEsl+qxuw4ORpe458atDKXNLhyvPUD4NfnsJsbAViX1b9nb/0rS62lO8cIFd1VoiaXLQ+MybOw==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.2", + "fast-levenshtein": "~1.0.0", + "levn": "~0.2.5", + "prelude-ls": "~1.1.1", + "type-check": "~0.3.1", + "wordwrap": "~0.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/istanbul-threshold-checker/node_modules/optionator/node_modules/wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/istanbul-threshold-checker/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/istanbul/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/istextorbinary": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-1.0.2.tgz", + "integrity": "sha512-qZ5ptUDuni2pdCngFTraYa5kalQ0mX47Mhn08tT0DZZv/7yhX1eMb9lFtXVbWhFtgRtpLG/UdqVAjh9teO5x+w==", + "dev": true, + "dependencies": { + "binaryextensions": "~1.0.0", + "textextensions": "~1.0.0" + }, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/jasmine": { + "version": "2.99.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.99.0.tgz", + "integrity": "sha512-kmuDC+6c9tA8BAZGd7wmucWKrM/aCCBSzCJEqRghvw9lKValw+pg88aN/BFIikmZwRTD57QmHamQ2wRpKb3FDQ==", + "dev": true, + "dependencies": { + "exit": "^0.1.2", + "glob": "^7.0.6", + "jasmine-core": "~2.99.0" + }, + "bin": { + "jasmine": "bin/jasmine.js" + } + }, + "node_modules/jasmine-core": { + "version": "2.99.1", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.99.1.tgz", + "integrity": "sha512-ra97U4qu3OCcIxvN6eg3kyy8bLrID/TgxafSGMMICg3SFx5C/sUfDPpiOh7yoIsHdtjrOVdtT9rieYhqOsh9Ww==", + "dev": true + }, + "node_modules/jasmine-reporters": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/jasmine-reporters/-/jasmine-reporters-2.1.1.tgz", + "integrity": "sha512-9Z2VY9rB16zSH/u6Ddc0poEQLMc4LXUuh6RnOGHwlfpCVu8B+Oks98U6GlJK/t/85NSDly/50GxaO8k6tLNq5g==", + "dev": true, + "dependencies": { + "mkdirp": "~0.3.5" + } + }, + "node_modules/jasmine-reporters/node_modules/mkdirp": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", + "integrity": "sha512-8OCq0De/h9ZxseqzCH8Kw/Filf5pF/vMI6+BH7Lu0jXz2pqYCjTAQRolSxRIi+Ax+oCCjlxoJMP0YQ4XlrQNHg==", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "dev": true + }, + "node_modules/jasmine-terminal-reporter": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/jasmine-terminal-reporter/-/jasmine-terminal-reporter-1.0.3.tgz", + "integrity": "sha512-lGjMqFBxKokZ4MHcRh3k/p325WKU4K7FR/BbFbUNDKIBIYDVZs6+t1YD6Gz8lPZ5GDG65WL1SS9VDvy8EYnijg==", + "dev": true, + "dependencies": { + "indent-string": "^2.1.0", + "pluralize": "^1.2.1" + } + }, + "node_modules/jasmine/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/js-yaml/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/liftoff": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", + "integrity": "sha512-01zfGFqfORP1CGmZZP2Zn51zsqz4RltDi0RDOhbGoLYdUT5Lw+I2gX6QdwXhPITF6hPOHEOp+At6/L24hIg9WQ==", + "dev": true, + "dependencies": { + "extend": "^3.0.0", + "findup-sync": "^2.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha512-rFR6Vpm4HeCK1WPGvjZSJ+7yik8d8PVUdCJx5rT2pogG4Ve/2ZS7kfmO5l5T2o5V2mqlNIfSF5MZlr1+xOoYQQ==", + "dev": true + }, + "node_modules/lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha512-mTzAr1aNAv/i7W43vOR/uD/aJ4ngbtsRaCubp2BfZhlGU/eORUjg/7F6X0orNMdv33JOrdgGybtvMN/po3EWrA==", + "dev": true + }, + "node_modules/lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha512-H94wl5P13uEqlCg7OcNNhMQ8KvWSIyqXzOPusRgHC9DK3o54P6P3xtbXlVbRABG4q5gSmp7EDdJ0MSuW9HX6Mg==", + "dev": true + }, + "node_modules/lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==", + "dev": true + }, + "node_modules/lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha512-De+ZbrMu6eThFti/CSzhRvTKMgQToLxbij58LMfM8JnYDNSOjkjTCIaa8ixglOeGh2nyPlakbt5bJWJ7gvpYlQ==", + "dev": true + }, + "node_modules/lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha512-Sjlavm5y+FUVIF3vF3B75GyXrzsfYV8Dlv3L4mEpuB9leg8N6yf/7rU06iLPx9fY0Mv3khVp9p7Dx0mGV6V5OQ==", + "dev": true + }, + "node_modules/lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha512-OrPwdDc65iJiBeUe5n/LIjd7Viy99bKwDdk7Z5ljfZg0uFRFlfQaCy9tZ4YMAag9WAZmlVpe1iZrkIMMSMHD3w==", + "dev": true + }, + "node_modules/lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==", + "dev": true + }, + "node_modules/lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha512-O0pWuFSK6x4EXhM1dhZ8gchNtG7JMqBtrHdoUFUWXD7dJnNSUze1GuyQr5sOs0aCvgGeI3o/OJW8f4ca7FDxmQ==", + "dev": true + }, + "node_modules/lodash.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha512-n1PZMXgaaDWZDSvuNZ/8XOcYO2hOKDqZel5adtR30VKQAtoWs/5AOeFA0vPV8moiPzlqe7F4cP2tzpFewQyelQ==", + "dev": true, + "dependencies": { + "lodash._root": "^3.0.0" + } + }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", + "dev": true + }, + "node_modules/lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==", + "dev": true + }, + "node_modules/lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ==", + "dev": true, + "dependencies": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "node_modules/lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha512-L4/arjjuq4noiUJpt3yS6KIKDtJwNe2fIYgMqyYYKoeIfV1iEqvPwhCx23o+R9dzouGihDAPN1dTIRWa7zk8tw==", + "dev": true + }, + "node_modules/lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha512-0B4Y53I0OgHUJkt+7RmlDFWKjVAI/YUpWNiL9GQz5ORDr4ttgfQGo+phBWKFLJbBdtOwgMuUkdOHOnPg45jKmQ==", + "dev": true, + "dependencies": { + "lodash._basecopy": "^3.0.0", + "lodash._basetostring": "^3.0.0", + "lodash._basevalues": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0", + "lodash.keys": "^3.0.0", + "lodash.restparam": "^3.0.0", + "lodash.templatesettings": "^3.0.0" + } + }, + "node_modules/lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha512-TcrlEr31tDYnWkHFWDCV3dHYroKEXpJZ2YJYvJdhN+y4AkWMDZ5I4I8XDtUKqSAyG81N7w+I1mFEJtcED+tGqQ==", + "dev": true, + "dependencies": { + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0" + } + }, + "node_modules/lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha512-WpibWJ60c3AgAz8a2iYErDrcT2C7OmKnsWhIcHOjkUHFjkXncJhtLxNSqUmxRxRunpb5I8Vprd7aNSd2NtksJQ==", + "dev": true + }, + "node_modules/make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dev": true, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha512-7ZxrUybYv9NonoXgwoOqtStIu18D1c3eFZj27hqgf5kBrBF8Q+tE8V0MW8dKM5QLkQPh1JhhbKgHLY9kifov4Q==", + "dev": true, + "dependencies": { + "duplexer2": "0.0.2" + } + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/natives": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz", + "integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==", + "deprecated": "This module relies on Node.js's internals and will break at some point. Do not use it, and update to graceful-fs@4.x.", + "dev": true + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha512-jHP15vXVGeVh1HuaA2wY6lxk+whK/x4KBG88VXeRma7CCun7iGD5qPc4eYykQ9sdQvg8jkwFKsSxHln2ybW3xQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dev": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dev": true, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", + "dev": true, + "dependencies": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", + "dev": true, + "dependencies": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/orchestrator": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", + "integrity": "sha512-DrQ43ngaJ0e36j2CHyoDoIg1K4zbc78GnTQESebK9vu6hj4W5/pvfSFO/kgM620Yd0YnhseSNYsLK3/SszZ5NQ==", + "dev": true, + "dependencies": { + "end-of-stream": "~0.1.5", + "sequencify": "~0.0.7", + "stream-consume": "~0.1.0" + } + }, + "node_modules/ordered-read-streams": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", + "integrity": "sha512-PMX5ehiNri4+lgk9fl09xuPeciGmyPyVUSBwwPT4C/3EHGxoVf7UdgKDE3SLBD4pUDmlzrg1L1cK5igrp+Tyuw==", + "dev": true + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "dev": true, + "dependencies": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "dev": true, + "dependencies": { + "path-root-regex": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pluralize": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "integrity": "sha512-TH+BeeL6Ct98C7as35JbZLf8lgsRzlNJb5gklRIGHKaPkGl1esOKBc5ALUMd+q08Sr6tiEKM+Icbsxg5vuhMKQ==", + "dev": true + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/prune": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/prune/-/prune-0.0.2.tgz", + "integrity": "sha512-5ZDNTaYgyOElBdXH5kRWFvyrAj2yHkuR32g9lBftm0SjC3xaq9tU30Ft6TOMHDrQJKGeTtMzPt+KKF85qOOJbg==", + "dependencies": { + "lodash": "latest", + "sproutid": "latest" + }, + "engines": { + "node": "*" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", + "dev": true, + "dependencies": { + "is-finite": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha512-AFBWBy9EVRTa/LhEcG8QDP3FvpwZqmvN2QFDuJswFeaVhWnZMp8q3E6Zd90SR04PlIwfGdyVjNyLPyen/ek5CQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/replacestream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/replacestream/-/replacestream-4.0.3.tgz", + "integrity": "sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.3", + "object-assign": "^4.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/replacestream/node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", + "dev": true + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dev": true, + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha512-IrpJ+yoG4EOH8DFWuVg+8H1kW1Oaof0Wxe7cPcXW3x9BjkN/eVo54F15LyqemnDIUYskQWr9qvl/RihmSy6+xQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/sequencify": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", + "integrity": "sha512-YL8BPm0tp6SlXef/VqYpA/ijmTsDP2ZEXzsnqjkaWS7NP7Bfvw18NboL0O8WCIjy67sOCG3MYSK1PB4GC9XdtQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==", + "dev": true + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", + "dev": true, + "optional": true, + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated", + "dev": true + }, + "node_modules/sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/sproutid": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/sproutid/-/sproutid-0.0.5.tgz", + "integrity": "sha512-b4ToovLPYmdRzfvFhNS8DoHmv+TTW0AebcipzsrTcrHE8WMG3eGlDIJn584bXK95CbCktGQazNSA39Y9qgTDyA==", + "dependencies": { + "lodash": "latest" + }, + "engines": { + "node": "*" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dev": true, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stream-consume": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz", + "integrity": "sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg==", + "dev": true + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-bom": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", + "integrity": "sha512-qVAeAIjblKDp/8Cd0tJdxpe3Iq/HooI7En98alEaMbz4Wedlrcj3WI72dDQSrziRW5IQ0zeBo3JXsmS8RcS9jg==", + "dev": true, + "dependencies": { + "first-chunk-stream": "^1.0.0", + "is-utf8": "^0.2.0" + }, + "bin": { + "strip-bom": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/textextensions": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-1.0.2.tgz", + "integrity": "sha512-jm9KjEWiDmtGLBrTqXEduGzlYTTlPaoDKdq5YRQhD0rYjo61ZNTYKZ/x5J4ajPSBH9wIYY5qm9GNG5otIKjtOA==", + "dev": true + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/tildify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", + "integrity": "sha512-Y9q1GaV/BO65Z9Yf4NOGMuwt3SGdptkZBnaaKfTQakrDyCLiuO1Kc5wxW4xLdsjzunRtqtOdhekiUFmZbklwYQ==", + "dev": true, + "dependencies": { + "os-homedir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true, + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/union-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unique-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", + "integrity": "sha512-L8KM6TdpsoBk6TJTXevbmpub3bATS06Znu3BcfVPVQkFtnh1MFeCZ3gFKCQcji7f7YYiigsO5OR99vqhoNT8nQ==", + "dev": true + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dev": true, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dev": true, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "dev": true + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha512-aggiKfEEubv3UwRNqTzLInZpAOmKzwdHqEBmW/hBA/mt99eg+b4VrX6i+IRLxU8+WJYfa33rGwRseg4eElUgsQ==", + "dev": true, + "bin": { + "user-home": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/v8flags": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "integrity": "sha512-SKfhk/LlaXzvtowJabLZwD4K6SGRYeoxA7KJeISlUMAB/NT4CBkZjMq3WceX2Ckm4llwqYVo8TICgsDYCBU2tA==", + "dev": true, + "dependencies": { + "user-home": "^1.1.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha512-P5zdf3WB9uzr7IFoVQ2wZTmUwHL8cMZWJGzLBNCHNZ3NB6HTMsYABtt7z8tAGIINLXyAob9B9a1yzVGMFOYKEA==", + "dev": true, + "dependencies": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + }, + "engines": { + "node": ">= 0.9" + } + }, + "node_modules/vinyl-fs": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", + "integrity": "sha512-9CTKjt8378nhdydwFDTwywKio0n8aqq6xA70g0uypcnTNSCow/gQOwv0L9E2GaKd7EQ3kZl/diBxPSCgcBXESw==", + "dev": true, + "dependencies": { + "defaults": "^1.0.0", + "glob-stream": "^3.1.5", + "glob-watcher": "^0.0.6", + "graceful-fs": "^3.0.0", + "mkdirp": "^0.5.0", + "strip-bom": "^1.0.0", + "through2": "^0.6.1", + "vinyl": "^0.4.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-fs/node_modules/clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha512-g62n3Kb9cszeZvmvBUqP/dsEJD/+80pDA8u8KqHnAPrVnQ2Je9rVV6opxkhuWCd1kCn2gOibzDKxCtBvD3q5kA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/vinyl-fs/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "node_modules/vinyl-fs/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/vinyl-fs/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + }, + "node_modules/vinyl-fs/node_modules/through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", + "dev": true, + "dependencies": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "node_modules/vinyl-fs/node_modules/vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha512-pmza4M5VA15HOImIQYWhoXGlGNafCm0QK5BpBUXkzzEwrRxKqBsbAhTfkT2zMcJhUX1G1Gkid0xaV8WjOl7DsA==", + "dev": true, + "dependencies": { + "clone": "^0.2.0", + "clone-stats": "^0.0.1" + }, + "engines": { + "node": ">= 0.9" + } + }, + "node_modules/vinyl-sourcemaps-apply": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha512-+oDh3KYZBoZC8hfocrbrxbLUeaYtQK7J5WU5Br9VqWqmCll3tFJqKp97GC9GmMsVIL0qnx2DgEDVxdo5EZ5sSw==", + "dev": true, + "dependencies": { + "source-map": "^0.5.1" + } + }, + "node_modules/vinyl-sourcemaps-apply/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.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" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + } + }, + "dependencies": { + "abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", + "dev": true + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", + "dev": true, + "optional": true + }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha512-HrgGIZUl8h2EHuZaU9hTR/cU5nhKxpVE1V6kdGsQ8e4zirElJ5fvtfc8N7Q1oq1aatO275i8pUFUCpNWCAnVWw==", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==", + "dev": true + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "dev": true + }, + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha512-LeZY+DZDRnvP7eMuQ6LHfCzUGxAAIViUBliK24P3hWXL6y4SortgR6Nim6xrkfSLlmH0+k+9NYNwVC2s53ZrYQ==", + "dev": true + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", + "dev": true + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, + "beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha512-3vqtKL1N45I5dV0RdssXZG7X6pCqQrWPNOlBPZPrd+QkE2HEhR57Z04m0KtpbsZH73j+a3F8UD1TQnn+ExTvIA==", + "dev": true + }, + "binaryextensions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-1.0.1.tgz", + "integrity": "sha512-xnG0l4K3ghM62rFzDi2jcNEuICl6uQ4NgvGpqQsY7HgW8gPDeAWGOxHI/k+qZfXfMANytzrArGNPXidaCwtbmA==", + "dev": true + }, + "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, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha512-dhUqc57gSMCo6TX85FLfe51eC/s+Im2MLkAgJwfaRRexR2tA4dd3eLEW4L6efzHc2iNorrRRXITifnDLlRrhaA==", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "dev": true + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha512-GODcnWq3YGoTnygPfi02ygEiRxqUxpJwuRHjdhJYuxpcZmDq4rjBiXYmbCCzStxo176ixfLT6i4NPwQooRySnw==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "deprecated": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", + "integrity": "sha512-BRACtc6B1mJe2J2mruHFqHWrtLy0Qppu/7LKdqWH3o/9j1L/1phPUaQV+2S3H8ZDW0k6h+NEOKcHBDRikWLiOA==", + "dev": true + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "dev": true + }, + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha512-+AWBwjGadtksxjOQSFDhPNQbed7icNXApT4+2BNpsXzcCBiInq2H9XW0O8sfHFaPmnQRs7cg/P0fAr2IWQSW0g==", + "dev": true, + "requires": { + "readable-stream": "~1.1.9" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + } + } + }, + "end-of-stream": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", + "integrity": "sha512-go5TQkd0YRXYhX+Lc3UrXkoKU5j+m72jEP5lHWr2Nh82L8wfZtH8toKgcg4T10o23ELIMGXQdwCbl+qAXIPDrw==", + "dev": true, + "requires": { + "once": "~1.3.0" + }, + "dependencies": { + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==", + "dev": true, + "requires": { + "wrappy": "1" + } + } + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==", + "dev": true, + "requires": { + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.2.0" + } + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", + "dev": true + }, + "estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + } + } + }, + "fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "requires": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + } + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fileset": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-0.2.1.tgz", + "integrity": "sha512-aK3PFyHSwWsBJCarRxMRIXSGamfroi9ehG8f4e5A2n5nSlEVHe8y44jNTIN4+HdZSpK3FNV0EdihH1iDWTdnGg==", + "dev": true, + "requires": { + "glob": "5.x", + "minimatch": "2.x" + }, + "dependencies": { + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha512-jQo6o1qSVLEWaw3l+bwYA2X0uLuK2KjNh2wjgO7Q/9UJnXr1Q3yQKR8BI0/Bt/rPg75e6SMW4hW/6cBHVTZUjA==", + "dev": true, + "requires": { + "brace-expansion": "^1.0.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + } + } + }, + "find-index": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", + "integrity": "sha512-uJ5vWrfBKMcE6y2Z8834dwEZj9mNGxYa3t3I53OwFeuZ8D9oc2E5zcsrkuhX6h4iYrjhiv0T3szQmxlAV9uxDg==", + "dev": true + }, + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha512-vs+3unmJT45eczmcAZ6zMJtxN3l/QXeccaXQx5cu/MeJMhewVfoWZqibRkOxPnmoR59+Zy5hjabfQc6JLSah4g==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + } + }, + "first-chunk-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", + "integrity": "sha512-ArRi5axuv66gEsyl3UuK80CzW7t56hem73YGNYxNWTGNKFJUadSb9Gu9SHijYEUi8ulQMf1bJomYNwSCPHhtTQ==", + "dev": true + }, + "flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "gaze": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", + "integrity": "sha512-3IWbXGkDDHFX8zIlNdfnmhvlSMhpBO6tDr4InB8fGku6dh/gjFPGNqcdsXJajZg05x9jRzXbL6gCnCnuMap4tw==", + "dev": true, + "requires": { + "globule": "~0.1.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "dev": true + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-stream": { + "version": "3.1.18", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", + "integrity": "sha512-owHtlMMXIAbxLjhUAO0HhW1/TB7kV0AwDduI3BLbYsWCaRzNIcLBu8N0wHZft2Za2SCmUXCEOdpZzC7k/H19eg==", + "dev": true, + "requires": { + "glob": "^4.3.1", + "glob2base": "^0.0.12", + "minimatch": "^2.0.1", + "ordered-read-streams": "^0.1.0", + "through2": "^0.6.1", + "unique-stream": "^1.0.0" + }, + "dependencies": { + "glob": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", + "integrity": "sha512-I0rTWUKSZKxPSIAIaqhSXTM/DiII6wame+rEC3cFA5Lqmr9YmdL7z6Hj9+bdWtTvoY1Su4/OiMLmb37Y7JzvJQ==", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^2.0.1", + "once": "^1.3.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha512-jQo6o1qSVLEWaw3l+bwYA2X0uLuK2KjNh2wjgO7Q/9UJnXr1Q3yQKR8BI0/Bt/rPg75e6SMW4hW/6cBHVTZUjA==", + "dev": true, + "requires": { + "brace-expansion": "^1.0.0" + } + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", + "dev": true, + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + } + } + }, + "glob-watcher": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", + "integrity": "sha512-lzYWq1BJLBmtb9rzT6+lgbFlEW6Sc7B+Qs3RmsNA9lbdFSqLHhebfypPR3nbEOMeEQyawVXqSDH0aqjtImldow==", + "dev": true, + "requires": { + "gaze": "^0.5.1" + } + }, + "glob2base": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", + "integrity": "sha512-ZyqlgowMbfj2NPjxaZZ/EtsXlOch28FRXgMd64vqZWk1bT9+wvSRLYD1om9M7QfQru51zJPAT17qXm4/zd+9QA==", + "dev": true, + "requires": { + "find-index": "^0.1.1" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globule": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", + "integrity": "sha512-3eIcA2OjPCm4VvwIwZPzIxCVssA8HSpM2C6c6kK5ufJH4FGwWoyqL3In19uuX4oe+TwH3w2P1nQDmW56iehO4A==", + "dev": true, + "requires": { + "glob": "~3.1.21", + "lodash": "~1.0.1", + "minimatch": "~0.2.11" + }, + "dependencies": { + "glob": { + "version": "3.1.21", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "integrity": "sha512-ANhy2V2+tFpRajE3wN4DhkNQ08KDr0Ir1qL12/cUe5+a7STEK8jkW4onUYuY8/06qAFuT5je7mjAqzx0eKI2tQ==", + "dev": true, + "requires": { + "graceful-fs": "~1.2.0", + "inherits": "1", + "minimatch": "~0.2.11" + } + }, + "graceful-fs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "integrity": "sha512-iiTUZ5vZ+2ZV+h71XAgwCSu6+NAizhFU3Yw8aC/hH5SQ3SnISqEqAek40imAFGtDcwJKNhXvSY+hzIolnLwcdQ==", + "dev": true + }, + "inherits": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", + "integrity": "sha512-Al67oatbRSo3RV5hRqIoln6Y5yMVbJSIn4jEJNL7VCImzq/kLr7vvb6sFRJXqr8rpHc/2kJOM+y0sPKN47VdzA==", + "dev": true + }, + "lodash": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", + "integrity": "sha512-0VSEDVec/Me2eATuoiQd8IjyBMMX0fahob8YJ96V1go2RjvCk1m1GxmtfXn8RNSaLaTtop7fsuhhu9oLk3hUgA==", + "dev": true + }, + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha512-zZ+Jy8lVWlvqqeM8iZB7w7KmQkoJn8djM585z88rywrEbzoqawVa9FR5p2hwD+y74nfuKOjmNvi9gtWJNLqHvA==", + "dev": true, + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + } + } + }, + "glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "dev": true, + "requires": { + "sparkles": "^1.0.0" + } + }, + "graceful-fs": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.12.tgz", + "integrity": "sha512-J55gaCS4iTTJfTXIxSVw3EMQckcqkpdRv3IR7gu6sq0+tbC363Zx6KH/SEwXASK9JRbhyZmVjJEVJIOxYsB3Qg==", + "dev": true, + "requires": { + "natives": "^1.1.3" + } + }, + "gulp": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", + "integrity": "sha512-6FHNdR+VG1LcPz6gZGGqgvimWWGtl4x3FvshAdK/UnAjU7aFOyzft3Fjp35r0Y3ZF4u8vND0S4nGsIB/sxTqzQ==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "chalk": "^1.0.0", + "deprecated": "^0.0.1", + "gulp-util": "^3.0.0", + "interpret": "^1.0.0", + "liftoff": "^2.1.0", + "minimist": "^1.1.0", + "orchestrator": "^0.3.0", + "pretty-hrtime": "^1.0.0", + "semver": "^4.1.0", + "tildify": "^1.0.0", + "v8flags": "^2.0.2", + "vinyl-fs": "^0.3.0" + } + }, + "gulp-istanbul": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/gulp-istanbul/-/gulp-istanbul-1.1.1.tgz", + "integrity": "sha512-zb9TskzBREokmiOzV83ZZmWQa4r1Ij3hBJB4BoCTZogRT3rChdMpRH3yoyq1s2H6GoadwY/n8MjsMP2UHMERMA==", + "dev": true, + "requires": { + "gulp-util": "^3.0.1", + "istanbul": "^0.4.0", + "istanbul-threshold-checker": "^0.1.0", + "lodash": "^4.0.0", + "through2": "^2.0.0", + "vinyl-sourcemaps-apply": "^0.2.1" + } + }, + "gulp-jasmine": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/gulp-jasmine/-/gulp-jasmine-2.4.1.tgz", + "integrity": "sha512-2QlQP4QjqCbD8mnt00PigVp4wg3vRrTN4vQsluFAC/d4xTJTnedHgar8Hirci5UyDQE0orBpP33UD2+m3SAGgw==", + "dev": true, + "requires": { + "arrify": "^1.0.0", + "gulp-util": "^3.0.0", + "jasmine": "^2.3.0", + "jasmine-terminal-reporter": "^1.0.0", + "through2": "^2.0.0" + } + }, + "gulp-replace": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/gulp-replace/-/gulp-replace-0.5.4.tgz", + "integrity": "sha512-lHL+zKJN8uV95UkONnfRkoj2yJxPPupt2SahxA4vo5c+Ee3+WaIiMdWbOyUhg8BhAROQrWKnnxKOWPdVrnBwGw==", + "dev": true, + "requires": { + "istextorbinary": "1.0.2", + "readable-stream": "^2.0.1", + "replacestream": "^4.0.0" + } + }, + "gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha512-q5oWPc12lwSFS9h/4VIjG+1NuNDlJ48ywV2JKItY4Ycc/n1fXJeYPVQsfu5ZrhQi7FGSDBalwUCLar/GyHXKGw==", + "dev": true, + "requires": { + "array-differ": "^1.0.0", + "array-uniq": "^1.0.2", + "beeper": "^1.0.0", + "chalk": "^1.0.0", + "dateformat": "^2.0.0", + "fancy-log": "^1.1.0", + "gulplog": "^1.0.0", + "has-gulplog": "^0.1.0", + "lodash._reescape": "^3.0.0", + "lodash._reevaluate": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.template": "^3.0.0", + "minimist": "^1.1.0", + "multipipe": "^0.1.2", + "object-assign": "^3.0.0", + "replace-ext": "0.0.1", + "through2": "^2.0.0", + "vinyl": "^0.5.0" + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha512-hm6N8nrm3Y08jXie48jsC55eCZz9mnb4OirAStEk2deqeyhXU3C1otDVh+ccttMuc1sBi6RX6ZJ720hs9RCvgw==", + "dev": true, + "requires": { + "glogg": "^1.0.0" + } + }, + "handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true + }, + "has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha512-+F4GzLjwHNNDEAJW2DC1xXfEoPkRDmUdJ7CBYw4MpqtDwOnqdImJl7GWlpqx+Wko6//J8uKTnIe4wZSv7yCqmw==", + "dev": true, + "requires": { + "sparkles": "^1.0.0" + } + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + }, + "istanbul": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", + "integrity": "sha512-nMtdn4hvK0HjUlzr1DrKSUY8ychprt8dzHOgY2KXsIhHu5PuQQEOTM27gV9Xblyon7aUH/TSFIjRHEODF/FRPg==", + "dev": true, + "requires": { + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "istanbul-threshold-checker": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/istanbul-threshold-checker/-/istanbul-threshold-checker-0.1.0.tgz", + "integrity": "sha512-50uqabaVYk7kkc6IqtwpdSHbSwCX+eCrm0LtDfqZgdFE45p8z3tjFNofiPKhJmViJEynabVVbOHW5jsdrymUvw==", + "dev": true, + "requires": { + "istanbul": "0.3.*", + "lodash": "3.6.*" + }, + "dependencies": { + "escodegen": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.7.1.tgz", + "integrity": "sha512-2cd7+JUtUEmZVpGmfF9r+uRYXswJAkf85Ce8GvdBa7hSvdjY8hGo+rwC5syAgYzqHpfxNJzLntFjw6879yPbgQ==", + "dev": true, + "requires": { + "esprima": "^1.2.2", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.5.0", + "source-map": "~0.2.0" + }, + "dependencies": { + "esprima": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.5.tgz", + "integrity": "sha512-S9VbPDU0adFErpDai3qDkjq8+G05ONtKzcyNrPKg/ZKa+tf879nX2KexNU95b31UoTJjRLInNBHHHjFPoCd7lQ==", + "dev": true + } + } + }, + "esprima": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.5.0.tgz", + "integrity": "sha512-uM6hfS0/8ybNIj8SGRMdidPJy5uhWqWN/GIkyqnMAbCSL44yfFGLuBpRRCgOpBXBZt2OymQuM+IfahkqJq3DWw==", + "dev": true + }, + "fast-levenshtein": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.0.7.tgz", + "integrity": "sha512-hYsfI0s4lfQ2rHVFKXwAr/L/ZSbq9TZwgXtZqW7ANcn9o9GKvcbWxOnxx7jykXf/Ezv1V8TvaBEKcGK7DWKX5A==", + "dev": true + }, + "istanbul": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.3.22.tgz", + "integrity": "sha512-8H/jxiee2UqX/mviKkPoKQYMxU2t995FC5PwO4zjWeDPOozjoeKqxEyN62l9o5+UgzvYQbrKgQjjxhGON8FcMg==", + "dev": true, + "requires": { + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.7.x", + "esprima": "2.5.x", + "fileset": "0.2.x", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" + } + }, + "levn": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.2.5.tgz", + "integrity": "sha512-mvp+NO++YH0B+e8cC/SvJxk6k5Z9Ngd3iXuz7tmT8vZCyQZj/5SI1GkFOiZGGPkm5wWGI9SUrqiAfPq7BJH+0w==", + "dev": true, + "requires": { + "prelude-ls": "~1.1.0", + "type-check": "~0.3.1" + } + }, + "lodash": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.6.0.tgz", + "integrity": "sha512-fysFKsJtaOtRGZT/b3Xx03iyEmO0zjU+d1HBH5NcEaUjtg7XO0wDY5I7IJFfr2rguJt0Rve2V32426Za3zYyRw==", + "dev": true + }, + "optionator": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.5.0.tgz", + "integrity": "sha512-jUr7aBk/kCInAEsl+qxuw4ORpe458atDKXNLhyvPUD4NfnsJsbAViX1b9nb/0rS62lO8cIFd1VoiaXLQ+MybOw==", + "dev": true, + "requires": { + "deep-is": "~0.1.2", + "fast-levenshtein": "~1.0.0", + "levn": "~0.2.5", + "prelude-ls": "~1.1.1", + "type-check": "~0.3.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==", + "dev": true + } + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "istextorbinary": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-1.0.2.tgz", + "integrity": "sha512-qZ5ptUDuni2pdCngFTraYa5kalQ0mX47Mhn08tT0DZZv/7yhX1eMb9lFtXVbWhFtgRtpLG/UdqVAjh9teO5x+w==", + "dev": true, + "requires": { + "binaryextensions": "~1.0.0", + "textextensions": "~1.0.0" + } + }, + "jasmine": { + "version": "2.99.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.99.0.tgz", + "integrity": "sha512-kmuDC+6c9tA8BAZGd7wmucWKrM/aCCBSzCJEqRghvw9lKValw+pg88aN/BFIikmZwRTD57QmHamQ2wRpKb3FDQ==", + "dev": true, + "requires": { + "exit": "^0.1.2", + "glob": "^7.0.6", + "jasmine-core": "~2.99.0" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "jasmine-core": { + "version": "2.99.1", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.99.1.tgz", + "integrity": "sha512-ra97U4qu3OCcIxvN6eg3kyy8bLrID/TgxafSGMMICg3SFx5C/sUfDPpiOh7yoIsHdtjrOVdtT9rieYhqOsh9Ww==", + "dev": true + }, + "jasmine-reporters": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/jasmine-reporters/-/jasmine-reporters-2.1.1.tgz", + "integrity": "sha512-9Z2VY9rB16zSH/u6Ddc0poEQLMc4LXUuh6RnOGHwlfpCVu8B+Oks98U6GlJK/t/85NSDly/50GxaO8k6tLNq5g==", + "dev": true, + "requires": { + "mkdirp": "~0.3.5" + }, + "dependencies": { + "mkdirp": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", + "integrity": "sha512-8OCq0De/h9ZxseqzCH8Kw/Filf5pF/vMI6+BH7Lu0jXz2pqYCjTAQRolSxRIi+Ax+oCCjlxoJMP0YQ4XlrQNHg==", + "dev": true + } + } + }, + "jasmine-terminal-reporter": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/jasmine-terminal-reporter/-/jasmine-terminal-reporter-1.0.3.tgz", + "integrity": "sha512-lGjMqFBxKokZ4MHcRh3k/p325WKU4K7FR/BbFbUNDKIBIYDVZs6+t1YD6Gz8lPZ5GDG65WL1SS9VDvy8EYnijg==", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "pluralize": "^1.2.1" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + } + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "liftoff": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", + "integrity": "sha512-01zfGFqfORP1CGmZZP2Zn51zsqz4RltDi0RDOhbGoLYdUT5Lw+I2gX6QdwXhPITF6hPOHEOp+At6/L24hIg9WQ==", + "dev": true, + "requires": { + "extend": "^3.0.0", + "findup-sync": "^2.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha512-rFR6Vpm4HeCK1WPGvjZSJ+7yik8d8PVUdCJx5rT2pogG4Ve/2ZS7kfmO5l5T2o5V2mqlNIfSF5MZlr1+xOoYQQ==", + "dev": true + }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha512-mTzAr1aNAv/i7W43vOR/uD/aJ4ngbtsRaCubp2BfZhlGU/eORUjg/7F6X0orNMdv33JOrdgGybtvMN/po3EWrA==", + "dev": true + }, + "lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha512-H94wl5P13uEqlCg7OcNNhMQ8KvWSIyqXzOPusRgHC9DK3o54P6P3xtbXlVbRABG4q5gSmp7EDdJ0MSuW9HX6Mg==", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha512-De+ZbrMu6eThFti/CSzhRvTKMgQToLxbij58LMfM8JnYDNSOjkjTCIaa8ixglOeGh2nyPlakbt5bJWJ7gvpYlQ==", + "dev": true + }, + "lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha512-Sjlavm5y+FUVIF3vF3B75GyXrzsfYV8Dlv3L4mEpuB9leg8N6yf/7rU06iLPx9fY0Mv3khVp9p7Dx0mGV6V5OQ==", + "dev": true + }, + "lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha512-OrPwdDc65iJiBeUe5n/LIjd7Viy99bKwDdk7Z5ljfZg0uFRFlfQaCy9tZ4YMAag9WAZmlVpe1iZrkIMMSMHD3w==", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==", + "dev": true + }, + "lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha512-O0pWuFSK6x4EXhM1dhZ8gchNtG7JMqBtrHdoUFUWXD7dJnNSUze1GuyQr5sOs0aCvgGeI3o/OJW8f4ca7FDxmQ==", + "dev": true + }, + "lodash.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha512-n1PZMXgaaDWZDSvuNZ/8XOcYO2hOKDqZel5adtR30VKQAtoWs/5AOeFA0vPV8moiPzlqe7F4cP2tzpFewQyelQ==", + "dev": true, + "requires": { + "lodash._root": "^3.0.0" + } + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ==", + "dev": true, + "requires": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha512-L4/arjjuq4noiUJpt3yS6KIKDtJwNe2fIYgMqyYYKoeIfV1iEqvPwhCx23o+R9dzouGihDAPN1dTIRWa7zk8tw==", + "dev": true + }, + "lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha512-0B4Y53I0OgHUJkt+7RmlDFWKjVAI/YUpWNiL9GQz5ORDr4ttgfQGo+phBWKFLJbBdtOwgMuUkdOHOnPg45jKmQ==", + "dev": true, + "requires": { + "lodash._basecopy": "^3.0.0", + "lodash._basetostring": "^3.0.0", + "lodash._basevalues": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0", + "lodash.keys": "^3.0.0", + "lodash.restparam": "^3.0.0", + "lodash.templatesettings": "^3.0.0" + } + }, + "lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha512-TcrlEr31tDYnWkHFWDCV3dHYroKEXpJZ2YJYvJdhN+y4AkWMDZ5I4I8XDtUKqSAyG81N7w+I1mFEJtcED+tGqQ==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0" + } + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha512-WpibWJ60c3AgAz8a2iYErDrcT2C7OmKnsWhIcHOjkUHFjkXncJhtLxNSqUmxRxRunpb5I8Vprd7aNSd2NtksJQ==", + "dev": true + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + } + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha512-7ZxrUybYv9NonoXgwoOqtStIu18D1c3eFZj27hqgf5kBrBF8Q+tE8V0MW8dKM5QLkQPh1JhhbKgHLY9kifov4Q==", + "dev": true, + "requires": { + "duplexer2": "0.0.2" + } + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "natives": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz", + "integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha512-jHP15vXVGeVh1HuaA2wY6lxk+whK/x4KBG88VXeRma7CCun7iGD5qPc4eYykQ9sdQvg8jkwFKsSxHln2ybW3xQ==", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", + "dev": true, + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "orchestrator": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", + "integrity": "sha512-DrQ43ngaJ0e36j2CHyoDoIg1K4zbc78GnTQESebK9vu6hj4W5/pvfSFO/kgM620Yd0YnhseSNYsLK3/SszZ5NQ==", + "dev": true, + "requires": { + "end-of-stream": "~0.1.5", + "sequencify": "~0.0.7", + "stream-consume": "~0.1.0" + } + }, + "ordered-read-streams": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", + "integrity": "sha512-PMX5ehiNri4+lgk9fl09xuPeciGmyPyVUSBwwPT4C/3EHGxoVf7UdgKDE3SLBD4pUDmlzrg1L1cK5igrp+Tyuw==", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "dev": true + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "dev": true, + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "dev": true + }, + "pluralize": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "integrity": "sha512-TH+BeeL6Ct98C7as35JbZLf8lgsRzlNJb5gklRIGHKaPkGl1esOKBc5ALUMd+q08Sr6tiEKM+Icbsxg5vuhMKQ==", + "dev": true + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "prune": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/prune/-/prune-0.0.2.tgz", + "integrity": "sha512-5ZDNTaYgyOElBdXH5kRWFvyrAj2yHkuR32g9lBftm0SjC3xaq9tU30Ft6TOMHDrQJKGeTtMzPt+KKF85qOOJbg==", + "requires": { + "lodash": "latest", + "sproutid": "latest" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha512-AFBWBy9EVRTa/LhEcG8QDP3FvpwZqmvN2QFDuJswFeaVhWnZMp8q3E6Zd90SR04PlIwfGdyVjNyLPyen/ek5CQ==", + "dev": true + }, + "replacestream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/replacestream/-/replacestream-4.0.3.tgz", + "integrity": "sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.3", + "object-assign": "^4.0.1", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + } + } + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", + "dev": true + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha512-IrpJ+yoG4EOH8DFWuVg+8H1kW1Oaof0Wxe7cPcXW3x9BjkN/eVo54F15LyqemnDIUYskQWr9qvl/RihmSy6+xQ==", + "dev": true + }, + "sequencify": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", + "integrity": "sha512-YL8BPm0tp6SlXef/VqYpA/ijmTsDP2ZEXzsnqjkaWS7NP7Bfvw18NboL0O8WCIjy67sOCG3MYSK1PB4GC9XdtQ==", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + } + } + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", + "dev": true, + "optional": true, + "requires": { + "amdefine": ">=0.0.4" + } + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true + }, + "sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "sproutid": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/sproutid/-/sproutid-0.0.5.tgz", + "integrity": "sha512-b4ToovLPYmdRzfvFhNS8DoHmv+TTW0AebcipzsrTcrHE8WMG3eGlDIJn584bXK95CbCktGQazNSA39Y9qgTDyA==", + "requires": { + "lodash": "latest" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "stream-consume": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz", + "integrity": "sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", + "integrity": "sha512-qVAeAIjblKDp/8Cd0tJdxpe3Iq/HooI7En98alEaMbz4Wedlrcj3WI72dDQSrziRW5IQ0zeBo3JXsmS8RcS9jg==", + "dev": true, + "requires": { + "first-chunk-stream": "^1.0.0", + "is-utf8": "^0.2.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + }, + "textextensions": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-1.0.2.tgz", + "integrity": "sha512-jm9KjEWiDmtGLBrTqXEduGzlYTTlPaoDKdq5YRQhD0rYjo61ZNTYKZ/x5J4ajPSBH9wIYY5qm9GNG5otIKjtOA==", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "tildify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", + "integrity": "sha512-Y9q1GaV/BO65Z9Yf4NOGMuwt3SGdptkZBnaaKfTQakrDyCLiuO1Kc5wxW4xLdsjzunRtqtOdhekiUFmZbklwYQ==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0" + } + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw==", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true, + "optional": true + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + } + } + }, + "unique-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", + "integrity": "sha512-L8KM6TdpsoBk6TJTXevbmpub3bATS06Znu3BcfVPVQkFtnh1MFeCZ3gFKCQcji7f7YYiigsO5OR99vqhoNT8nQ==", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "dev": true + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha512-aggiKfEEubv3UwRNqTzLInZpAOmKzwdHqEBmW/hBA/mt99eg+b4VrX6i+IRLxU8+WJYfa33rGwRseg4eElUgsQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "v8flags": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "integrity": "sha512-SKfhk/LlaXzvtowJabLZwD4K6SGRYeoxA7KJeISlUMAB/NT4CBkZjMq3WceX2Ckm4llwqYVo8TICgsDYCBU2tA==", + "dev": true, + "requires": { + "user-home": "^1.1.1" + } + }, + "vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha512-P5zdf3WB9uzr7IFoVQ2wZTmUwHL8cMZWJGzLBNCHNZ3NB6HTMsYABtt7z8tAGIINLXyAob9B9a1yzVGMFOYKEA==", + "dev": true, + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + } + }, + "vinyl-fs": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", + "integrity": "sha512-9CTKjt8378nhdydwFDTwywKio0n8aqq6xA70g0uypcnTNSCow/gQOwv0L9E2GaKd7EQ3kZl/diBxPSCgcBXESw==", + "dev": true, + "requires": { + "defaults": "^1.0.0", + "glob-stream": "^3.1.5", + "glob-watcher": "^0.0.6", + "graceful-fs": "^3.0.0", + "mkdirp": "^0.5.0", + "strip-bom": "^1.0.0", + "through2": "^0.6.1", + "vinyl": "^0.4.0" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha512-g62n3Kb9cszeZvmvBUqP/dsEJD/+80pDA8u8KqHnAPrVnQ2Je9rVV6opxkhuWCd1kCn2gOibzDKxCtBvD3q5kA==", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", + "dev": true, + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha512-pmza4M5VA15HOImIQYWhoXGlGNafCm0QK5BpBUXkzzEwrRxKqBsbAhTfkT2zMcJhUX1G1Gkid0xaV8WjOl7DsA==", + "dev": true, + "requires": { + "clone": "^0.2.0", + "clone-stats": "^0.0.1" + } + } + } + }, + "vinyl-sourcemaps-apply": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha512-+oDh3KYZBoZC8hfocrbrxbLUeaYtQK7J5WU5Br9VqWqmCll3tFJqKp97GC9GmMsVIL0qnx2DgEDVxdo5EZ5sSw==", + "dev": true, + "requires": { + "source-map": "^0.5.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + } + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + } + } +} diff --git a/cmd/testdata/mtaignore/node-js/package.json b/cmd/testdata/mtaignore/node-js/package.json new file mode 100644 index 000000000..e063e00a1 --- /dev/null +++ b/cmd/testdata/mtaignore/node-js/package.json @@ -0,0 +1,24 @@ +{ + "dependencies": { + "prune": "0.0.2" + }, + "devDependencies": { + "gulp": "3.9.1", + "gulp-replace": "0.5.4", + "jasmine-reporters": "2.1.1", + "gulp-jasmine": "2.4.1", + "gulp-istanbul": "1.1.1" + }, + "files": [], + "main": "server.js", + "name": "node-js", + "scripts": { + "start": "node server.js", + "test": "node ./node_modules/gulp/bin/gulp test", + "test-coverage": "node ./node_modules/gulp/bin/gulp test-coverage" + }, + "engines": { + "node": ">=14.15.0" + }, + "version": "1.0.0" +} diff --git a/cmd/testdata/mtaignore/node-js/server.js b/cmd/testdata/mtaignore/node-js/server.js new file mode 100644 index 000000000..07fabe2ec --- /dev/null +++ b/cmd/testdata/mtaignore/node-js/server.js @@ -0,0 +1,12 @@ +/*eslint no-console: 0*/ +"use strict"; + +var http = require("http"); +var port = process.env.PORT || 3000; + +http.createServer(function (req, res) { + res.writeHead(200, {"Content-Type": "text/plain"}); + res.end("Hello World\n"); +}).listen(port); + +console.log("Server listening on port %d", port); diff --git a/configs/builder_type_cfg.yaml b/configs/builder_type_cfg.yaml index c7f5e8d83..cbb1ad6fd 100644 --- a/configs/builder_type_cfg.yaml +++ b/configs/builder_type_cfg.yaml @@ -35,7 +35,7 @@ builders: info: "build golang application" path: "path to config file which override the following default commands" commands: - - command: go build *.go + - command: go build ./... - name: evo info: "installing module dependencies & run evo-build & remove dev dependencies" diff --git a/docs/docs/configuration.md b/docs/docs/configuration.md index da89b95fd..378563de4 100644 --- a/docs/docs/configuration.md +++ b/docs/docs/configuration.md @@ -1,5 +1,5 @@ -###Overview +#### Overview Optionally, you can define the builder behavior by configuring the parameters in the `build-parameters` section in the `mta.yaml` file for each module or globally. @@ -204,6 +204,27 @@ For example: # In this example, the following will not be packaged in to MTA archive: # all files with the"txt" extension and the "mtaignore" folder within the "myfolder" directory. +``` +From the MBT 1.2.25 version, the `build-parameters ignore` attribute will be upgraded to support [full glob patterns](https://en.wikipedia.org/wiki/Glob_(programming)). Wildcards, such as `*`,`!`,`?` can be used to match characters. + +By using the negation pattern `!` in the `build-parameters ignore` attribute, you can select specified content into the package (because `not ignore` equals `include`). + +To avoid regression, a new bool type attribute, `build-parameters ignore-use-full-glob-pattern` (the default value is false), has been added. Only when it is set to true, `build-parameters ignore` will support [full glob patterns](https://en.wikipedia.org/wiki/Glob_(programming)). Otherwise the MBT package behavior and result remain unchanged. + +For example: + +```yaml + +- name: module1 + type: nodejs + build-parameters: + build-result: myfolder + ignore-use-full-glob-pattern: true + ignore: ["node_modules/**", "!node_modules/mtainclude"] + +# In this example, all files and subfolders of 'node_modules' will not be packaged into the MTA archive, +# except for the 'mtainclude' subfolder of 'node_modules'. + ``` > **_NOTE:_** These parameters are not considered for the `fetcher` builder. diff --git a/docs/docs/download.md b/docs/docs/download.md index c520b31d2..13c50261c 100644 --- a/docs/docs/download.md +++ b/docs/docs/download.md @@ -32,3 +32,6 @@ Run the command below. npm install -g mbt ``` +From the MBT 1.2.25 version, the `build-parameters ignore` attribute will be upgraded to support [full glob patterns](https://en.wikipedia.org/wiki/Glob_(programming)). Details can be referenced [here](https://github.com/SAP/cloud-mta-build-tool/blob/master/docs/docs/configuration.md). You must install the micromatch wrapper to use the glob patterns. + +Follow the [instructions](https://github.com/SAP/cloud-mta-build-tool/tree/master/docs/docs/micromatch-wrapper.md) to install the micromatch wrapper. \ No newline at end of file diff --git a/docs/docs/micromatch-wrapper.md b/docs/docs/micromatch-wrapper.md new file mode 100644 index 000000000..ad48e1d0d --- /dev/null +++ b/docs/docs/micromatch-wrapper.md @@ -0,0 +1,52 @@ +#### Overview +[Micromatch](https://github.com/micromatch/micromatch) support various matching features, such as glob patterns and advanced globbing. + +Micromatch is a Node.js application, while MBT is a Go application. The micromatch wrapper is a package that enables MBT to use the functionalities provided by micromatch. From the MBT 1.2.25 version, we provide [micromath wrapper](https://github.com/SAP/cloud-mta-build-tool/tree/master/micromatch) to package it. + +#### Install +You can install the micromatch wrapper using one of the methods below: + + **Download and install manually** + + - [Download](https://github.com/SAP/cloud-mta-build-tool/releases) the latest binary file according to your operating system. + + - Extract the archive file to the folder where you want to install the tool. + + - Add the binary file to your `~/bin` path according to your operating system: + + * In Darwin / Linux, copy the micromatch-wrapper binary file to the `~/usr/local/bin/` folder. Here is a sample command: `cp micromatch-wrapper /usr/local/bin/` + + * In Windows, copy the `micromatch-wrapper.exe` binary file to the `C:/Windows/` folder. + +**Build and install from the source code** + + - [Download](https://github.com/SAP/cloud-mta-build-tool/releases) the latest source code. + + - Install [pkg](https://github.com/vercel/pkg/) on your operating system: +``` +npm install -g pkg +``` + + - Build the micromatch wrapper under the `micromatch` subfolder of the source code: +``` +cd micromatch +npm install +pkg ./ +``` + - Add the binary file to your `~/bin` path according to your operating system: + + * In Darwin, copy the micromatch-wrapper binary file to the `~/usr/local/bin/` folder. Here is a sample command: `cp micromatch-wrapper-macos /usr/local/bin/micromatch-wrapper` + + * In Linux, copy the micromatch-wrapper binary file to the `~/usr/local/bin/` folder. Here is a sample command: `cp micromatch-wrapper-linux /usr/local/bin/micromatch-wrapper` + + * In Windows, copy the micromatch-wrapper binary file to the `C:/Windows/` folder. + +**Install using npm** + +Run the command below to install MBT and the micromatch wrapper together: + +``` +npm install -g mbt@greater_than_or_equal_to_v1.2.25 +mbt --version +micromatch-wrapper --version +``` \ No newline at end of file diff --git a/docs/docs/whatsnew.md b/docs/docs/whatsnew.md index fa82c4836..94861d6d5 100644 --- a/docs/docs/whatsnew.md +++ b/docs/docs/whatsnew.md @@ -41,3 +41,27 @@ If you want to use the old `mvn -B package` command instead of the `maven` build ``` The same approach can be implemented if the `maven` builder is used in the global build step. + +## v1.2.25 +The `build-parameters ignore` attribute will be upgraded to support [full glob patterns](https://en.wikipedia.org/wiki/Glob_(programming)). Wildcards, such as `*`,`!`,`?` can be used to match characters. + +By using the `!` negation pattern in the `build-parameters ignore` attribute, you can select specified content into the package (because `not ignore` equals `include`). + +To avoid regression, a new bool type attribute, `build-parameters ignore-use-full-glob-pattern` (the default value is false), has been added. Only when it is set to true, `build-parameters ignore` will support [full glob patterns](https://en.wikipedia.org/wiki/Glob_(programming)). Otherwise the MBT package behavior and result remain unchanged. + +For example: + +```yaml + +- name: module1 + type: nodejs + build-parameters: + build-result: myfolder + ignore-use-full-glob-pattern: true + ignore: ["node_modules/**", "!node_modules/mtainclude"] + +# In this example, all files and subfolders of 'node_modules' will not be packaged into the MTA archive, +# except for the 'mtainclude' subfolder of 'node_modules'. + +``` + diff --git a/index.js b/index.js index 922f973c7..a85a58b50 100644 --- a/index.js +++ b/index.js @@ -8,7 +8,8 @@ var root = (process.env.XMAKE_IMPORT_COMMON_0 ? `${process.env.XMAKE_IMPORT_COMM module.exports = binwrap({ dirname: __dirname, binaries: [ - 'mbt' + 'mbt', + 'micromatch-wrapper' ], urls: { 'darwin-arm64': root + 'Darwin_arm64.tar.gz', diff --git a/integration/cloud_mta_build_tool_test.go b/integration/cloud_mta_build_tool_test.go index 1d550eb73..dae2cdf8b 100644 --- a/integration/cloud_mta_build_tool_test.go +++ b/integration/cloud_mta_build_tool_test.go @@ -7,6 +7,7 @@ import ( "bufio" "bytes" "fmt" + "io" "io/ioutil" "log" @@ -32,25 +33,23 @@ const ( binPath = "mbt" ) -var _ = Describe("Integration - CloudMtaBuildTool", func() { +var mbtName = "" +var mbtTargetPath = "" +var micromatchWrapperName = "" +var micromatchWrapperTargetPath = "" - var mbtName = "" +var _ = Describe("Integration - CloudMtaBuildTool", func() { BeforeSuite(func() { - By("Building MBT") - if runtime.GOOS == "linux" || runtime.GOOS == "darwin" { - mbtName = "mbt" - } else { - mbtName = "mbt.exe" - } - // This runs locally for testing purpose only - /* #nosec */ - cmd := exec.Command("go", "build", "-o", filepath.Join(os.Getenv("GOPATH"), "/bin/"+mbtName), ".") - cmd.Dir = filepath.FromSlash("../") - err := cmd.Run() - if err != nil { - fmt.Println("binary creation failed: ", err) - } + By("Building and smoke testing mbt") + mbtName = "mbt" + buildAndInstallMBT() + smokeTestMBT() + + By("Installing and smoke testing micromatch-wrapper") + micromatchWrapperName = "micromatch-wrapper" + installAndChmodMicromatchWrapper() + smokeTestMicromatchWrapper() }) AfterSuite(func() { @@ -660,6 +659,106 @@ resources: }) }) +func buildAndInstallMBT() error { + if runtime.GOOS == "linux" || runtime.GOOS == "darwin" { + mbtName = mbtName + } else { + mbtName = mbtName + ".exe" + } + mbtTargetPath = filepath.Join(os.Getenv("GOPATH"), "/bin/"+mbtName) + + cmd := exec.Command("go", "build", "-o", mbtTargetPath, ".") + cmd.Dir = filepath.FromSlash("../") + err := cmd.Run() + if err != nil { + fmt.Println("mbt build and install failed: ", err) + return err + } + + return nil +} + +func smokeTestMBT() error { + var stdout bytes.Buffer + cmd := exec.Command(mbtName, "-h") + cmd.Stdout = &stdout + err := cmd.Run() + if err != nil { + fmt.Println("exec mbt -h error: ", err) + return err + } + fmt.Println("exec mbt -h success: ", stdout.String()) + return nil +} + +func installAndChmodMicromatchWrapper() error { + var micromatchWrapperSourcePath = "" + wd, _ := os.Getwd() + if runtime.GOOS == "linux" { + micromatchWrapperSourcePath = filepath.Join(wd, filepath.FromSlash("../micromatch/Linux"), micromatchWrapperName) + } else if runtime.GOOS == "darwin" { + micromatchWrapperSourcePath = filepath.Join(wd, filepath.FromSlash("../micromatch/Darwin/"), micromatchWrapperName) + } else { + micromatchWrapperName = micromatchWrapperName + ".exe" + micromatchWrapperSourcePath = filepath.Join(wd, filepath.FromSlash("../micromatch/Windows"), micromatchWrapperName) + } + micromatchWrapperTargetPath = filepath.Join(os.Getenv("GOPATH"), "/bin/", micromatchWrapperName) + + // Destination file exists, remove it + _, err := os.Stat(micromatchWrapperTargetPath) + if err == nil { + err = os.Remove(micromatchWrapperTargetPath) + if err != nil { + return err + } + fmt.Printf("Remove %s success \n", micromatchWrapperTargetPath) + } + + source, err := os.Open(micromatchWrapperSourcePath) + if err != nil { + fmt.Println("Failed to open source file: ", err) + return err + } + + target, err := os.Create(micromatchWrapperTargetPath) + if err != nil { + fmt.Println("Failed to create target file:", err) + return err + } + + _, err = io.Copy(target, source) + if err != nil { + fmt.Println("Failed to copy file:", err) + return err + } + fmt.Printf("copy micromatch-wrapper from %s to %s success!\n", micromatchWrapperSourcePath, micromatchWrapperTargetPath) + + source.Close() + target.Close() + + err = os.Chmod(micromatchWrapperTargetPath, 0755) + if err != nil { + fmt.Printf("Failed to set file %s executable permission: %s\n", micromatchWrapperTargetPath, err) + return err + } + fmt.Printf("Success to set file %s executable permission! \n", micromatchWrapperTargetPath) + + return nil +} + +func smokeTestMicromatchWrapper() error { + var stdout bytes.Buffer + cmd := exec.Command(micromatchWrapperName, "-h") + cmd.Stdout = &stdout + err := cmd.Run() + if err != nil { + fmt.Println("exec micromatch-wrapper -h error: ", err) + return err + } + fmt.Println("exec micromatch-wrapper -h success: ", stdout.String()) + return nil +} + func getFileContentFromZip(path string, filename string) ([]byte, error) { zipFile, err := zip.OpenReader(path) if err != nil { diff --git a/internal/archive/fsops.go b/internal/archive/fsops.go index 3f0057b2f..59557774f 100755 --- a/internal/archive/fsops.go +++ b/internal/archive/fsops.go @@ -5,9 +5,11 @@ import ( "io" "io/ioutil" "os" + "os/exec" "path/filepath" "sort" "strings" + "time" "github.com/pkg/errors" @@ -53,13 +55,77 @@ func CreateDirIfNotExist(dir string) error { return err } -// Archive module and mtar artifacts, +// RemoveDirIfExist - remove file/dir +func RemoveIfExist(path string) error { + _, err := os.Stat(path) + if os.IsNotExist(err) { + return nil + } + err = os.RemoveAll(path) + return err +} + +// Package module and mtar artifacts, // compatible with the JAR specification // to support the spec requirements // Source Path to be zipped // Target artifact -func Archive(sourcePath, targetArchivePath string, ignore []string) (e error) { +func Package(sourcePath, targetArchivePath string, ignore []string) (e error) { + // check that folder to be packed exist + info, err := fileInfoProvider.stat(sourcePath) + if err != nil { + return err + } + + // create folder of archive file if not exists + err = CreateDirIfNotExist(filepath.Dir(targetArchivePath)) + if err != nil { + return errors.Wrapf(err, archivingFailedOnCreateFolderMsg, filepath.Dir(targetArchivePath)) + } + // create archive file + zipfile, err := os.Create(targetArchivePath) + if err != nil { + return err + } + defer func() { + e = CloseFile(zipfile, e) + }() + + // create archive writer + archive := zip.NewWriter(zipfile) + defer func() { + e = CloseFile(archive, e) + }() + + baseDir, err := getBaseDir(sourcePath, info) + if err != nil { + return err + } + + if !strings.HasSuffix(baseDir, string(os.PathSeparator)) { + baseDir += string(os.PathSeparator) + } + + err = checkSymbolicLinkTree(sourcePath, baseDir, make(map[string]bool)) + if err != nil { + return err + } + + ignorePatterns, err := getIgnorePatterns(sourcePath, ignore) + if err != nil { + return err + } + + err = generatePackage(sourcePath, baseDir, "", "", info, archive, ignorePatterns) + if err != nil { + return err + } + + return nil +} + +func Archive(sourcePath, targetArchivePath string, ignore []string) (e error) { // check that folder to be packed exist info, err := fileInfoProvider.stat(sourcePath) if err != nil { @@ -122,9 +188,42 @@ func getBaseDir(path string, info os.FileInfo) (string, error) { return filepath.Dir(path), nil } +func isIgnorePathDir(sourcePath, ignore string) bool { + info, err := fileInfoProvider.stat(filepath.Join(sourcePath, ignore)) + if err == nil && fileInfoProvider.isDir(info) { + return true + } + + if strings.HasSuffix(ignore, "/") { + return true + } + + return false +} + +func getIgnorePatterns(sourcePath string, ignore []string) ([]string, error) { + var ignPatterns []string + var ignToSlash, ignPattern, ignHidePattern string + for _, ign := range ignore { + ignToSlash = filepath.ToSlash(ign) + // if ignore path is DIR, add "/**" and the end, and ignore all hide files under it + if isIgnorePathDir(sourcePath, ignToSlash) { + if !strings.HasSuffix(ignToSlash, "/") { + ignToSlash = ignToSlash + "/" + } + ignPattern = ignToSlash + "**" + ignHidePattern = ignToSlash + "**/.*" + ignPatterns = append(ignPatterns, ignPattern) + ignPatterns = append(ignPatterns, ignHidePattern) + } else { + ignPatterns = append(ignPatterns, ignToSlash) + } + } + return ignPatterns, nil +} + // getIgnoresMap - getIgnores Helper func getIgnoredEntries(ignore []string, sourcePath string) (map[string]interface{}, error) { - info, err := fileInfoProvider.stat(sourcePath) if err != nil { return nil, err @@ -162,10 +261,130 @@ func CloseFile(file io.Closer, err error) error { return err } +func exportPackagedFiles(sourceDir string, ignorePatterns []string) (string, error) { + // (1) get export file path + exportFileName := TempNotIgnoreFile + "_" + time.Now().Format("20230517155317") + exportFilePath := filepath.Join(sourceDir, exportFileName) + + // (2) invoke micromatch wrapper + var cmdArgs []string + cmdArgs = append(cmdArgs, "getPackagedFiles") + cmdArgs = append(cmdArgs, "-s") + cmdArgs = append(cmdArgs, sourceDir) + cmdArgs = append(cmdArgs, "-t") + cmdArgs = append(cmdArgs, exportFilePath) + if len(ignorePatterns) > 0 { + cmdArgs = append(cmdArgs, "-p") + cmdArgs = append(cmdArgs, ignorePatterns...) + } + cmd := exec.Command("micromatch-wrapper", cmdArgs...) + output, err := cmd.Output() + if err != nil { + return exportFilePath, errors.Wrap(err, string(output)) + } + return exportFilePath, nil +} + +func getPackagedFiles(sourceDir string, ignorePatterns []string) ([]string, error) { + // (1) get all files need to be packaged which are not matched ignore patterns + exportFilePath, err := exportPackagedFiles(sourceDir, ignorePatterns) + if err != nil { + return nil, err + } + + // (2) read export file to get all filtered files, package to zip file + exportFileContent, err := ioutil.ReadFile(exportFilePath) + if err != nil { + return nil, err + } + files := strings.Split(string(exportFileContent), "\n") + + // (3) remove export file + err = RemoveIfExist(exportFilePath) + if err != nil { + return nil, err + } + + return files, nil +} + +func generatePackage(sourcePath, baseDir, symLinkPathInZip, linkedPath string, + sourcePathInfo os.FileInfo, archive *zip.Writer, ignorePatterns []string) error { + var files []string + var sourceDir string + var err error + + // (1) get files which need to be packaged + if sourcePathInfo.IsDir() { // if sourcePath is Dir, invoke micromatch wrapper to match ignore and get packaged files + sourceDir = sourcePath + files, err = getPackagedFiles(sourceDir, ignorePatterns) + if err != nil { + return err + } + } else { // if sourcePath is File, add it to files arry directly, do not match ignore pattern + sourceDir = filepath.Dir(sourcePath) + files = append(files, filepath.Base(sourcePath)) + } + + // (2) package files to zip + for _, file := range files { + filePath := filepath.Join(sourceDir, file) + fileInfo, err := fileInfoProvider.stat(filePath) + if err != nil { + return err + } + if filepath.Clean(filePath) == filepath.Clean(baseDir) { + continue + } + + pathInZip := getPathInZip(filePath, baseDir, symLinkPathInZip, linkedPath, fileInfo) + err = addToArchive(filePath, pathInZip, fileInfo, archive) + if err != nil { + return err + } + } + + return nil +} + +func checkSymbolicLinkTree(sourcePath, baseDir string, predecessors map[string]bool) error { + return filepath.Walk(sourcePath, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + + if fileInfoProvider.isSymbolicLink(info) { + if symlinkReferencesPredecessor(path, predecessors) { + return errors.Errorf(recursiveSymLinkMsg, path) + } + + linkedPath, linkedInfo, paths, err := dereferenceSymlink(path, predecessors) + if err != nil { + return err + } + + if fileInfoProvider.isDir(linkedInfo) { + files, err := ioutil.ReadDir(linkedPath) + if err != nil { + return err + } + for _, file := range files { + err = checkSymbolicLinkTree(filepath.Join(linkedPath, file.Name()), baseDir, predecessors) + if err != nil { + return err + } + } + } + deleteAddedPredecessors(predecessors, paths) + return nil + } + return nil + }) +} + func walk(sourcePath string, baseDir, symLinkPathInZip, linkedPath string, archive *zip.Writer, symlinks map[string]bool, ignore map[string]interface{}) error { - // pack files of source into archive return filepath.Walk(sourcePath, func(path string, info os.FileInfo, err error) error { if err != nil { @@ -223,7 +442,6 @@ func symlinkReferencesPredecessor(path string, predecessors map[string]bool) boo } func dereferenceSymlink(path string, predecessors map[string]bool) (string, os.FileInfo, []string, error) { - var paths []string var linkedInfo os.FileInfo var linkedPath string diff --git a/internal/archive/fsops_test.go b/internal/archive/fsops_test.go index e6736fe4b..884103264 100644 --- a/internal/archive/fsops_test.go +++ b/internal/archive/fsops_test.go @@ -94,10 +94,16 @@ var _ = Describe("FSOPS", func() { "ui5app/webapp/", "ui5app/webapp/Component.js", "ui5app/webapp/index.html", "ui5app/webapp/controller/", "ui5app/webapp/controller/View1.controller.js", "ui5app/webapp/model/", "ui5app/webapp/model/models.js", - "ui5app/webapp/view/", "ui5app/webapp/view/View1.view.xml", + "ui5app/webapp/view/", "ui5app/webapp/view/View1.view.xml", "ui5app/webapp/view/.invisibleView", }), Entry("SourceIsNotFolder", getFullPath("testdata", "level2", "level2_one.txt"), targetFilePath, nil, false, []string{"level2_one.txt"}), + Entry("SourceIsNotFolder with ignore case 1", + getFullPath("testdata", "level2", "level2_one.txt"), targetFilePath, []string{"level2_one.txt"}, false, []string{"level2_one.txt"}), + Entry("SourceIsNotFolder with ignore case 2", + getFullPath("testdata", "level2", "level2_one.txt"), targetFilePath, []string{"*.txt"}, false, []string{"level2_one.txt"}), + Entry("SourceIsNotFolder with ignore case 3", + getFullPath("testdata", "level2", "level2_one.txt"), targetFilePath, []string{"**/*.txt"}, false, []string{"level2_one.txt"}), Entry("Target is empty string", getFullPath("testdata", "mtahtml5"), "", nil, true, nil), Entry("Source is empty string", "", "", nil, true, nil), @@ -110,7 +116,8 @@ var _ = Describe("FSOPS", func() { []string{"symlink_dir_to_content/", "package.json", "symlink_dir_to_content/test_dir/", "symlink_dir_to_content/test_dir/test1.txt", "symlink_dir_to_content/test.txt", - "symlink_dir_to_content/symlink_dir_to_another_content/", "symlink_dir_to_content/symlink_dir_to_another_content/test3.txt", + "symlink_dir_to_content/symlink_dir_to_another_content/", + "symlink_dir_to_content/symlink_dir_to_another_content/test3.txt", "symlink_dir_to_content/symlink_dir_to_another_content/symlink_to_test4.txt"}), Entry("symbolic links with ignore", getFullPath("testdata", "testsymlink", "symlink_dir_to_moduleNew"), targetFilePath, []string{"symlink_dir_to_content"}, false, @@ -118,6 +125,342 @@ var _ = Describe("FSOPS", func() { ) }) + var _ = Describe("Test Package", func() { + var targetFilePath = getFullPath("testdata", "arch.mbt") + + BeforeEach(func() { + fileInfoProvider = &mockFileInfoProvider{} + }) + + AfterEach(func() { + fileInfoProvider = &standardFileInfoProvider{} + Ω(os.RemoveAll(targetFilePath)).Should(Succeed()) + }) + + var _ = DescribeTable("Test Package", func(source, target string, ignore []string, fails bool, expectedFiles []string) { + err := Package(source, target, ignore) + if fails { + Ω(err).Should(HaveOccurred()) + } else { + Ω(err).Should(Succeed()) + Ω(target).Should(BeAnExistingFile()) + validateArchiveContents(expectedFiles, target) + } + }, + Entry("package all content", + getFullPath("testdata", "mtahtml5"), targetFilePath, nil, false, + []string{ + "mta.sh", "mta.yaml", + "ui5app/", "ui5app/Gruntfile.js", + "ui5app/webapp/", "ui5app/webapp/Component.js", "ui5app/webapp/abc.jar", + "ui5app/webapp/index.html", + "ui5app/webapp/controller/", "ui5app/webapp/controller/View1.controller.js", + "ui5app/webapp/css/", "ui5app/webapp/css/style.css", + "ui5app/webapp/i18n/", "ui5app/webapp/i18n/i18n.properties", + "ui5app/webapp/model/", "ui5app/webapp/model/models.js", + "ui5app/webapp/view/", "ui5app/webapp/view/View1.view.xml", + }), + Entry("Source is empty string", "", "", nil, true, nil), + Entry("Target is empty string", + getFullPath("testdata", "mtahtml5"), "", nil, true, nil), + Entry("Target is folder", + getFullPath("testdata", "mtahtml5"), getFullPath("testdata"), nil, true, nil), + // Ignore folder + Entry("ignore folder case 1", + getFullPath("testdata", "testproject"), targetFilePath, + []string{"ui5app/"}, false, + []string{ + "cf-mtaext.yaml", "mta.sh", "mta.yaml", + }), + Entry("ignore folder case 2", + getFullPath("testdata", "testproject"), targetFilePath, + []string{"ui5app/**"}, false, + []string{ + "cf-mtaext.yaml", "mta.sh", "mta.yaml", + "ui5app/webapp/view/.invisibleView", + }), + Entry("ignore folder case 3", + getFullPath("testdata", "testproject"), targetFilePath, + []string{"ui5app/webapp/controller/**", "ui5app/webapp/model/**"}, false, + []string{ + "cf-mtaext.yaml", "mta.sh", "mta.yaml", + "ui5app/", "ui5app/Gruntfile.js", + "ui5app/webapp/", "ui5app/webapp/Component.js", "ui5app/webapp/index.html", + "ui5app/webapp/view/", "ui5app/webapp/view/View1.view.xml", "ui5app/webapp/view/.invisibleView", + }), + Entry("ignore folder case 4", + getFullPath("testdata", "testproject"), targetFilePath, + []string{"ui5app/webapp/**", "!ui5app/webapp/controller/", "!ui5app/webapp/model/**"}, false, + []string{ + "cf-mtaext.yaml", "mta.sh", "mta.yaml", + "ui5app/", + "ui5app/Gruntfile.js", + "ui5app/webapp/controller/", + "ui5app/webapp/model/", + "ui5app/webapp/controller/View1.controller.js", + "ui5app/webapp/view/.invisibleView", + "ui5app/webapp/model/models.js", + }), + Entry("ignore folder case 5", + getFullPath("testdata", "testproject"), targetFilePath, + []string{"ui5app/**", "!ui5app/webapp/controller/", "!ui5app/webapp/model/**"}, false, + []string{ + "cf-mtaext.yaml", "mta.sh", "mta.yaml", + "ui5app/webapp/controller/", + "ui5app/webapp/model/", + "ui5app/webapp/controller/View1.controller.js", + "ui5app/webapp/view/.invisibleView", + "ui5app/webapp/model/models.js", + }), + Entry("ignore folder case 6", + getFullPath("testdata", "testproject"), targetFilePath, + []string{"ui5app/**", "!ui5app/*.js"}, false, + []string{ + "cf-mtaext.yaml", "mta.sh", "mta.yaml", + "ui5app/Gruntfile.js", + "ui5app/webapp/view/.invisibleView", + }), + Entry("ignore folder case 7", + getFullPath("testdata", "testproject"), targetFilePath, + []string{"ui5app/webapp/!(controller)/**"}, false, + []string{ + "cf-mtaext.yaml", "mta.sh", "mta.yaml", + "ui5app/", "ui5app/Gruntfile.js", + "ui5app/webapp/", + "ui5app/webapp/controller/", + "ui5app/webapp/controller/View1.controller.js", + "ui5app/webapp/view/.invisibleView", + }), + Entry("ignore folder case 8", + getFullPath("testdata", "testproject"), targetFilePath, + []string{"ui5app/webapp/!(controller)/**", "ui5app/webapp/!(model)/**"}, false, + []string{ + "cf-mtaext.yaml", "mta.sh", "mta.yaml", + "ui5app/", "ui5app/Gruntfile.js", + "ui5app/webapp/", + "ui5app/webapp/view/.invisibleView", + }), + Entry("ignore folder case 9", + getFullPath("testdata", "testproject"), targetFilePath, + []string{"ui5app/webapp/!(controller)"}, false, + []string{ + "cf-mtaext.yaml", "mta.sh", "mta.yaml", + "ui5app/", "ui5app/Gruntfile.js", + "ui5app/webapp/", + "ui5app/webapp/model/models.js", + "ui5app/webapp/view/View1.view.xml", + "ui5app/webapp/controller/", + "ui5app/webapp/controller/View1.controller.js", + "ui5app/webapp/view/.invisibleView", + }), + Entry("ignore folder case 10", + getFullPath("testdata", "testproject"), targetFilePath, + []string{"ui5app/webapp/!(controller)", "ui5app/webapp/!(view)"}, false, + []string{ + "cf-mtaext.yaml", "mta.sh", "mta.yaml", + "ui5app/", "ui5app/Gruntfile.js", + "ui5app/webapp/", + "ui5app/webapp/model/models.js", + "ui5app/webapp/view/View1.view.xml", + "ui5app/webapp/controller/View1.controller.js", + "ui5app/webapp/view/.invisibleView", + }), + Entry("ignore folder case 11", + getFullPath("testdata", "testproject"), targetFilePath, + []string{"ui5app/webapp/**", "ui5app/webapp/!(controller)"}, false, + []string{ + "cf-mtaext.yaml", "mta.sh", "mta.yaml", + "ui5app/", "ui5app/Gruntfile.js", + "ui5app/webapp/view/.invisibleView", + }), + Entry("ignore folder case 12", + getFullPath("testdata", "testproject"), targetFilePath, + []string{"ui5app/webapp/**", "ui5app/webapp/!(controller)", "ui5app/webapp/!(model)"}, false, + []string{ + "cf-mtaext.yaml", "mta.sh", "mta.yaml", + "ui5app/", "ui5app/Gruntfile.js", + "ui5app/webapp/view/.invisibleView", + }), + Entry("ignore folder case 13", + getFullPath("testdata", "testproject"), targetFilePath, + []string{"!ui5app/webapp/controller/**", "ui5app/webapp/**", "!ui5app/webapp/model/**"}, false, + []string{ + "cf-mtaext.yaml", "mta.sh", "mta.yaml", + "ui5app/", "ui5app/Gruntfile.js", + "ui5app/webapp/model/", + "ui5app/webapp/model/models.js", + "ui5app/webapp/view/.invisibleView", + }), + Entry("ignore folder case 14", + getFullPath("testdata", "testproject"), targetFilePath, + []string{"ui5app/webapp/**", "!ui5app/webapp/controller/**", "!ui5app/webapp/!(model)/**"}, false, + []string{ + "cf-mtaext.yaml", "mta.sh", "mta.yaml", + "ui5app/", "ui5app/Gruntfile.js", + "ui5app/webapp/Component.js", "ui5app/webapp/index.html", + "ui5app/webapp/controller/", + "ui5app/webapp/controller/View1.controller.js", + "ui5app/webapp/view/", + "ui5app/webapp/view/View1.view.xml", + "ui5app/webapp/view/.invisibleView", + }), + Entry("ignore folder case 15", + getFullPath("testdata", "testproject"), targetFilePath, + []string{"ui5app/webapp/**", "!ui5app/webapp/!(controller)/**", "!ui5app/webapp/!(model)/**"}, false, + []string{ + "cf-mtaext.yaml", "mta.sh", "mta.yaml", + "ui5app/", "ui5app/Gruntfile.js", + "ui5app/webapp/Component.js", "ui5app/webapp/index.html", + "ui5app/webapp/controller/", + "ui5app/webapp/controller/View1.controller.js", + "ui5app/webapp/view/", + "ui5app/webapp/view/View1.view.xml", + "ui5app/webapp/view/.invisibleView", + "ui5app/webapp/model/", + "ui5app/webapp/model/models.js", + }), + // Ignore files + Entry("ignore file case 1", + getFullPath("testdata", "testproject"), targetFilePath, + []string{"ui5app/Gr*.js"}, false, + []string{ + "cf-mtaext.yaml", "mta.sh", "mta.yaml", + "ui5app/", + "ui5app/webapp/", "ui5app/webapp/Component.js", "ui5app/webapp/index.html", + "ui5app/webapp/controller/", "ui5app/webapp/controller/View1.controller.js", + "ui5app/webapp/model/", "ui5app/webapp/model/models.js", + "ui5app/webapp/view/", "ui5app/webapp/view/View1.view.xml", "ui5app/webapp/view/.invisibleView", + }), + Entry("ignore file case 2", + getFullPath("testdata", "testproject"), targetFilePath, + []string{"*.js"}, false, + []string{ + "cf-mtaext.yaml", "mta.sh", "mta.yaml", + "ui5app/", "ui5app/Gruntfile.js", + "ui5app/webapp/", "ui5app/webapp/index.html", "ui5app/webapp/Component.js", + "ui5app/webapp/controller/", "ui5app/webapp/controller/View1.controller.js", + "ui5app/webapp/model/", "ui5app/webapp/model/models.js", + "ui5app/webapp/view/", "ui5app/webapp/view/View1.view.xml", "ui5app/webapp/view/.invisibleView", + }), + Entry("ignore file case 3", + getFullPath("testdata", "testproject"), targetFilePath, + []string{"*/*.js"}, false, + []string{ + "cf-mtaext.yaml", "mta.sh", "mta.yaml", + "ui5app/", + "ui5app/webapp/", "ui5app/webapp/index.html", "ui5app/webapp/Component.js", + "ui5app/webapp/controller/", "ui5app/webapp/controller/View1.controller.js", + "ui5app/webapp/model/", "ui5app/webapp/model/models.js", + "ui5app/webapp/view/", "ui5app/webapp/view/View1.view.xml", "ui5app/webapp/view/.invisibleView", + }), + Entry("ignore file case 4", + getFullPath("testdata", "testproject"), targetFilePath, + []string{"**/*.js"}, false, + []string{ + "cf-mtaext.yaml", "mta.sh", "mta.yaml", + "ui5app/", + "ui5app/webapp/", "ui5app/webapp/index.html", + "ui5app/webapp/controller/", "ui5app/webapp/model/", + "ui5app/webapp/view/", "ui5app/webapp/view/View1.view.xml", "ui5app/webapp/view/.invisibleView", + }), + // Source is not a folder + Entry("SourceIsNotFolder", + getFullPath("testdata", "level2", "level2_one.txt"), targetFilePath, nil, false, + []string{"level2_one.txt"}), + Entry("SourceIsNotFolder with ignore case 1", + getFullPath("testdata", "level2", "level2_one.txt"), targetFilePath, + []string{"level2_one.txt"}, false, []string{"level2_one.txt"}), + Entry("SourceIsNotFolder with ignore case 2", + getFullPath("testdata", "level2", "level2_one.txt"), targetFilePath, + []string{"*.txt"}, false, []string{"level2_one.txt"}), + Entry("SourceIsNotFolder with ignore case 3", + getFullPath("testdata", "level2", "level2_one.txt"), targetFilePath, + []string{"**/*.txt"}, false, []string{"level2_one.txt"}), + ) + }) + + var _ = Describe("Check Symbolic Link", func() { + BeforeEach(func() { + fileInfoProvider = &mockFileInfoProvider{} + }) + + AfterEach(func() { + fileInfoProvider = &standardFileInfoProvider{} + }) + + var _ = DescribeTable("Check Symbolic Link", func(source string, fails bool) { + info, err := fileInfoProvider.stat(source) + baseDir, err := getBaseDir(source, info) + err = checkSymbolicLinkTree(source, baseDir, make(map[string]bool)) + if fails { + Ω(err).Should(HaveOccurred()) + } else { + Ω(err).Should(Succeed()) + } + }, + // symbolic link cases + Entry("Source is broken symbolic link", + getFullPath("testdata", "testsymlink", "symlink_broken"), true), + Entry("recursion to itself", + getFullPath("testdata", "testsymlink", "symlink_to_itself"), true), + Entry("2 steps recursion", + getFullPath("testdata", "testsymlink", "symlink_recursion_2step_a"), true), + Entry("3 steps recursion", + getFullPath("testdata", "testsymlink", "symlink_recursion_3step_a"), true), + Entry("sibling folders with recursion", + getFullPath("testdata", "testsymlink", "dir_with_recursive_symlink", "subdir", "symlink_dir_to_sibling"), true), + Entry("recursion to upper folder", + getFullPath("testdata", "testsymlink", "dir_with_recursive_symlink", "subdir", "symlink_dir_recursion_to_parent_dir"), true), + ) + }) + + // var _ = Describe("Test Package with Symbolic Link", func() { + // var targetFilePath = getFullPath("testdata", "arch.mbt") + + // BeforeEach(func() { + // fileInfoProvider = &standardFileInfoProvider{} + // }) + + // AfterEach(func() { + // fileInfoProvider = &standardFileInfoProvider{} + // Ω(os.RemoveAll(targetFilePath)).Should(Succeed()) + // }) + + // var _ = DescribeTable("GeneratePackage Test Symbolic Link", func(source, target string, ignore []string, fails bool, expectedFiles []string) { + // err := Package(source, target, ignore) + // if fails { + // Ω(err).Should(HaveOccurred()) + // } else { + // Ω(err).Should(Succeed()) + // Ω(target).Should(BeAnExistingFile()) + // validateArchiveContents(expectedFiles, target) + // } + // }, + // Entry("Source is broken symbolic link", + // getFullPath("testdata", "testignorewithsymlink", "symlink_to_symlink_broken"), targetFilePath, nil, true, nil), + // Entry("Source is broken symbolic link dir", + // getFullPath("testdata", "testignorewithsymlink", "symlink_dir_to_symlink_dir_broken"), targetFilePath, nil, true, nil), + // Entry("symbolic links", + // getFullPath("testdata", "testignorewithsymlink", "symlink_dir_to_moduleNew"), targetFilePath, nil, false, + // []string{"symlink_dir_to_content/", "package.json", + // "symlink_dir_to_content/test_dir/", "symlink_dir_to_content/test_dir/test1.txt", + // "symlink_dir_to_content/test.txt", + // "symlink_dir_to_content/symlink_dir_to_another_content/", + // "symlink_dir_to_content/symlink_dir_to_another_content/test3.txt", + // "symlink_dir_to_content/symlink_dir_to_another_content/symlink_to_test4.txt"}), + // Entry("symbolic links with ignore", + // getFullPath("testdata", "testignorewithsymlink", "symlink_dir_to_moduleNew"), targetFilePath, + // []string{"symlink_dir_to_content/"}, false, + // []string{"package.json"}), + // Entry("sibling folders with recursion", + // getFullPath("testdata", "testignorewithsymlink", "dir_with_recursive_symlink", "subdir", "symlink_dir_to_sibling"), + // targetFilePath, []string{}, true, []string{}), + // Entry("recursion to upper folder", + // getFullPath("testdata", "testignorewithsymlink", "dir_with_recursive_symlink", "subdir", "symlink_dir_recursion_to_parent_dir"), + // targetFilePath, []string{}, true, []string{}), + // ) + // }) + var _ = Describe("FindPath", func() { It("returns file path for existing file", func() { path := getFullPath("testdata", "findpath", "folder1", "file1.txt") diff --git a/internal/archive/mta_location.go b/internal/archive/mta_location.go index 38fff48e9..f9f454c51 100644 --- a/internal/archive/mta_location.go +++ b/internal/archive/mta_location.go @@ -21,6 +21,8 @@ const ( Mtad = "mtad.yaml" // MtarFolder - default archives folder MtarFolder = "mta_archives" + // TempNotIgnoreFile = temporary file for not ignored file + TempNotIgnoreFile = ".not_ignore_file_tmp" ) // IMtaParser - MTA Parser interface diff --git a/internal/archive/testdata/testignorewithsymlink/another_content/test3.txt b/internal/archive/testdata/testignorewithsymlink/another_content/test3.txt new file mode 100644 index 000000000..b45ef6fec --- /dev/null +++ b/internal/archive/testdata/testignorewithsymlink/another_content/test3.txt @@ -0,0 +1 @@ +Hello, World! \ No newline at end of file diff --git a/internal/archive/testdata/testignorewithsymlink/clean-symlink-env.bat b/internal/archive/testdata/testignorewithsymlink/clean-symlink-env.bat new file mode 100644 index 000000000..ea264812f --- /dev/null +++ b/internal/archive/testdata/testignorewithsymlink/clean-symlink-env.bat @@ -0,0 +1,17 @@ +rmdir moduleNew\symlink_dir_to_content + +rmdir content\symlink_dir_to_another_content + +del another_content\symlink_to_test4.txt + +rmdir symlink_dir_to_moduleNew + +del symlink_to_symlink_broken + +rmdir symlink_dir_to_symlink_dir_broken + +rmdir dir_with_recursive_symlink\subdir\symlink_dir_recursion_to_parent_dir + +rmdir dir_with_recursive_symlink\subdir\symlink_dir_to_sibling + +rmdir dir_with_recursive_symlink\subdir2\symlink_dir_to_sibling \ No newline at end of file diff --git a/internal/archive/testdata/testignorewithsymlink/content/test.txt b/internal/archive/testdata/testignorewithsymlink/content/test.txt new file mode 100644 index 000000000..b45ef6fec --- /dev/null +++ b/internal/archive/testdata/testignorewithsymlink/content/test.txt @@ -0,0 +1 @@ +Hello, World! \ No newline at end of file diff --git a/internal/archive/testdata/testignorewithsymlink/content/test_dir/test1.txt b/internal/archive/testdata/testignorewithsymlink/content/test_dir/test1.txt new file mode 100644 index 000000000..7c4a013e5 --- /dev/null +++ b/internal/archive/testdata/testignorewithsymlink/content/test_dir/test1.txt @@ -0,0 +1 @@ +aaa \ No newline at end of file diff --git a/internal/archive/testdata/testignorewithsymlink/moduleNew/package.json b/internal/archive/testdata/testignorewithsymlink/moduleNew/package.json new file mode 100644 index 000000000..6653204b8 --- /dev/null +++ b/internal/archive/testdata/testignorewithsymlink/moduleNew/package.json @@ -0,0 +1,7 @@ +{ + "name": "module", + "dependencies": {}, + "scripts": { + "install": "node ./link.js" + } +} diff --git a/internal/archive/testdata/testignorewithsymlink/prepare-symlink-env.bat b/internal/archive/testdata/testignorewithsymlink/prepare-symlink-env.bat new file mode 100644 index 000000000..432232101 --- /dev/null +++ b/internal/archive/testdata/testignorewithsymlink/prepare-symlink-env.bat @@ -0,0 +1,29 @@ + +set "PREVIOUS_DIR=%CD%" + +cd moduleNew +mklink /D symlink_dir_to_content "..\content" +cd "%PREVIOUS_DIR%" + +cd content +mklink /D symlink_dir_to_another_content "..\another_content" +cd "%PREVIOUS_DIR%" + +cd another_content +mklink symlink_to_test4.txt "..\test4.txt" +cd "%PREVIOUS_DIR%" + +mklink /D symlink_dir_to_moduleNew "moduleNew" + +mklink symlink_to_symlink_broken "link_to_broken_symlink" + +mklink /D symlink_dir_to_symlink_dir_broken "link_to_broken_symlink_dir" + +cd "dir_with_recursive_symlink\subdir" +mklink /D symlink_dir_recursion_to_parent_dir "..\" +mklink /D symlink_dir_to_sibling "..\subdir2\symlink_dir_to_sibling" +cd "%PREVIOUS_DIR%" + +cd "dir_with_recursive_symlink\subdir2" +mklink /D symlink_dir_to_sibling "..\subdir\symlink_dir_to_sibling" +cd "%PREVIOUS_DIR%" \ No newline at end of file diff --git a/internal/archive/testdata/testignorewithsymlink/test4.txt b/internal/archive/testdata/testignorewithsymlink/test4.txt new file mode 100644 index 000000000..b45ef6fec --- /dev/null +++ b/internal/archive/testdata/testignorewithsymlink/test4.txt @@ -0,0 +1 @@ +Hello, World! \ No newline at end of file diff --git a/internal/archive/testdata/testproject/ui5app/webapp/view/.invisibleView b/internal/archive/testdata/testproject/ui5app/webapp/view/.invisibleView new file mode 100644 index 000000000..e69de29bb diff --git a/internal/artifacts/module_arch.go b/internal/artifacts/module_arch.go index f9d2daf05..4341c779f 100644 --- a/internal/artifacts/module_arch.go +++ b/internal/artifacts/module_arch.go @@ -2,14 +2,15 @@ package artifacts import ( "fmt" - "gopkg.in/yaml.v2" "os" "path/filepath" "strings" + "gopkg.in/yaml.v2" + "github.com/pkg/errors" - "github.com/SAP/cloud-mta-build-tool/internal/archive" + dir "github.com/SAP/cloud-mta-build-tool/internal/archive" "github.com/SAP/cloud-mta-build-tool/internal/buildops" "github.com/SAP/cloud-mta-build-tool/internal/commands" "github.com/SAP/cloud-mta-build-tool/internal/exec" @@ -18,7 +19,8 @@ import ( ) const ( - ignore = "ignore" + ignore = "ignore" + ignoreGlobPattern = "ignore-use-full-glob-pattern" ) // ExecuteBuild - executes build of module from Makefile @@ -436,7 +438,8 @@ func packModule(moduleLoc dir.IModule, module *mta.Module, moduleName, platform, return copyModuleArchiveToResultDir(sourceArtifact, targetArtifact, moduleName) } - return archiveModuleToResultDir(sourceArtifact, targetArtifact, getIgnores(moduleLoc, module, sourceArtifact), moduleName) + ignoreList, isIgnoreGlobPattern := getIgnores(moduleLoc, module, sourceArtifact) + return archiveModuleToResultDir(sourceArtifact, targetArtifact, isIgnoreGlobPattern, ignoreList, moduleName) } func copyModuleArchiveToResultDir(source, target, moduleName string) error { @@ -455,9 +458,17 @@ func copyModuleArchiveToResultDir(source, target, moduleName string) error { return nil } -func archiveModuleToResultDir(buildResult string, requestedResultFileName string, ignore []string, moduleName string) error { +func archiveModuleToResultDir(buildResult string, requestedResultFileName string, isIgnoreGlobPattern bool, ignoreList []string, moduleName string) error { + var err error // Archive the folder without the ignored files and/or subfolders, which are excluded from the package. - err := dir.Archive(buildResult, requestedResultFileName, ignore) + // To avoid regression, only when ignore-use-full-glob-pattern is ture and ignore list is not empty, + // we use Package function which using micromatch wrapper internal; else, we still use Archive to package module + if isIgnoreGlobPattern && (len(ignoreList) > 0) { + err = dir.Package(buildResult, requestedResultFileName, ignoreList) + } else { + err = dir.Archive(buildResult, requestedResultFileName, ignoreList) + } + if err != nil { return errors.Wrapf(err, PackFailedOnArchMsg, moduleName) } @@ -465,22 +476,36 @@ func archiveModuleToResultDir(buildResult string, requestedResultFileName string } // getIgnores - get files and/or subfolders to exclude from the package. -func getIgnores(moduleLoc dir.IModule, module *mta.Module, moduleResultPath string) []string { +func getIgnores(moduleLoc dir.IModule, module *mta.Module, moduleResultPath string) ([]string, bool) { var ignoreList []string + var isIgnoreGlobPattern bool = false + // ignore defined in build params is declared - if module.BuildParams != nil && module.BuildParams[ignore] != nil { - ignoreList = convert(module.BuildParams[ignore].([]interface{})) + if module.BuildParams != nil { + // get ignore list + if module.BuildParams[ignore] != nil { + ignoreList = convert(module.BuildParams[ignore].([]interface{})) + } + // get is-ignore-use-full-glob-pattern + if module.BuildParams[ignoreGlobPattern] != nil { + result, ok := module.BuildParams[ignoreGlobPattern].(bool) + isIgnoreGlobPattern = result && ok + } } + // we add target folder to the list of ignores to avoid it's packaging // it can be the case only when target folder is subfolder (on any level) of the archived folder path // the ignored folder is the root where all the build results are created, even if we are building more than one module targetFolder := moduleLoc.GetTargetTmpRoot() relativeTarget, err := filepath.Rel(moduleResultPath, targetFolder) if err == nil && !(relativeTarget == ".." || strings.HasPrefix(relativeTarget, ".."+string(os.PathSeparator))) { + if isIgnoreGlobPattern { + relativeTarget = relativeTarget + "/**" + } ignoreList = append(ignoreList, relativeTarget) } - return ignoreList + return ignoreList, isIgnoreGlobPattern } // Convert slice []interface{} to slice []string diff --git a/internal/artifacts/module_arch_test.go b/internal/artifacts/module_arch_test.go index 61686b45d..7f65dbb5e 100644 --- a/internal/artifacts/module_arch_test.go +++ b/internal/artifacts/module_arch_test.go @@ -4,18 +4,19 @@ import ( "archive/zip" "errors" "fmt" - "gopkg.in/yaml.v2" "io/ioutil" "os" "path/filepath" "strconv" + "gopkg.in/yaml.v2" + . "github.com/onsi/ginkgo" . "github.com/onsi/ginkgo/extensions/table" . "github.com/onsi/gomega" "github.com/onsi/gomega/types" - "github.com/SAP/cloud-mta-build-tool/internal/archive" + dir "github.com/SAP/cloud-mta-build-tool/internal/archive" "github.com/SAP/cloud-mta-build-tool/internal/buildops" "github.com/SAP/cloud-mta-build-tool/internal/commands" "github.com/SAP/cloud-mta-build-tool/internal/exec" diff --git a/internal/artifacts/mtar.go b/internal/artifacts/mtar.go index 98e2279fc..1fb6c00db 100644 --- a/internal/artifacts/mtar.go +++ b/internal/artifacts/mtar.go @@ -5,10 +5,11 @@ import ( "github.com/pkg/errors" - "github.com/SAP/cloud-mta-build-tool/internal/archive" + "strconv" + + dir "github.com/SAP/cloud-mta-build-tool/internal/archive" "github.com/SAP/cloud-mta-build-tool/internal/logs" "github.com/SAP/cloud-mta/mta" - "strconv" ) const ( @@ -57,7 +58,12 @@ func generateMtar(targetLoc dir.ITargetPath, targetArtifacts dir.ITargetArtifact // archive building artifacts to mtar mtarPath := filepath.Join(mtarFolderPath, getMtarFileName(m, mtarName)) + + // To avoid regression, only when ignore list is not empty and ignore-use-full-glob-pattern is ture, + // we invoke dir.Package function which using micromatch wrapper internal; + // For the Mtar generation, we still use Archive to generate mtar file err = dir.Archive(targetTmpDir, mtarPath, nil) + if err != nil { return "", errors.Wrap(err, genMTARArchMsg) } diff --git a/internal/artifacts/testdata/mtahtml5/.mtahtml5_mta_build_tmp/xs-security.json b/internal/artifacts/testdata/mtahtml5/.mtahtml5_mta_build_tmp/xs-security.json deleted file mode 100644 index 6fa74c69c..000000000 --- a/internal/artifacts/testdata/mtahtml5/.mtahtml5_mta_build_tmp/xs-security.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "xsappname": "assemblyTesting", - "foreign-scope-references":["$ACCEPT_GRANTED_SCOPES"], - "scopes": [ - { - "name": "xs_user.read", - "description": "read user data" - }, - { - "name": "xs_user.write", - "description": "write user data" - }, - { - "name": "idps.read", - "description": "read only scopes to retrieve identity providers" - }, - { - "name": "idps.write", - "description": "write only scopes to retrieve identity providers" - }, - { - "name": "cloud_controller.read", - "description": "read access for controller" - }, - { - "name": "cloud_controller.write", - "description": "write access for controller" - }, - { - "name": "cloud_controller.admin", - "description": "admin access for controller" - }, - { - "name": "xs_authorization.read", - "description": "Read authorization information from UAA" - }, - { - "name": "xs_authorization.write", - "description": "Write authorization information to UAA" - } - - ], - "role-templates": [ - { - "name": "ControllerUser", - "description": "Template for Controller User", - "scope-references": [ - "cloud_controller.read", - "cloud_controller.write" - ] - }, - { - "name": "ControllerAdmin", - "description": "Template for Controller Admin", - "scope-references": [ - "cloud_controller.admin", - "cloud_controller.read", - "cloud_controller.write" - ] - }, - { - "name": "AuthorizationDisplay", - "description": "Template for Authorization display", - "scope-references": [ - "idps.read", - "xs_authorization.read" - ] - }, - { - "name": "AuthorizationAdmin", - "description": "Template for Authorization admin", - "scope-references": [ - "idps.read", - "idps.write", - "xs_authorization.read", - "xs_authorization.write" - ] - }, - { - "name": "UserDisplay", - "description": "Template for User display", - "scope-references": [ - "xs_user.read" - ] - }, - { - "name": "UserAdmin", - "description": "Template for User admin", - "scope-references": [ - "xs_user.read", - "xs_user.write" - ] - } - ] -} diff --git a/internal/commands/builder_type_cfg.go b/internal/commands/builder_type_cfg.go index 1d13a4499..19680d5d6 100644 --- a/internal/commands/builder_type_cfg.go +++ b/internal/commands/builder_type_cfg.go @@ -1,4 +1,4 @@ package commands // BuilderTypeConfig - do not edit -var BuilderTypeConfig = []byte{0x23, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x20, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0xa, 0x23, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x6f, 0x6c, 0xa, 0x23, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x61, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x75, 0x73, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0xa, 0x23, 0x20, 0x48, 0x6f, 0x77, 0x65, 0x76, 0x65, 0x72, 0x2c, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x20, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x27, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x20, 0x74, 0x6f, 0x6f, 0x6c, 0xa, 0x23, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x6f, 0x6c, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, 0x6c, 0x65, 0xa, 0x23, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x77, 0x69, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0xa, 0xa, 0x23, 0x20, 0x4e, 0x6f, 0x74, 0x65, 0x3a, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x75, 0x74, 0x75, 0x72, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x6f, 0x6c, 0xa, 0xa, 0x23, 0x20, 0x75, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x64, 0x64, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x60, 0x67, 0x6f, 0x3a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x60, 0xa, 0x23, 0x20, 0x54, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x20, 0x28, 0x73, 0x65, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x67, 0x6f, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x29, 0xa, 0xa, 0xa, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x3a, 0xa, 0x20, 0x20, 0x2d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x20, 0x6e, 0x70, 0x6d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x20, 0x26, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x64, 0x65, 0x76, 0x20, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3a, 0x20, 0x6e, 0x70, 0x6d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x20, 0x2d, 0x2d, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0xa, 0xa, 0x20, 0x20, 0x2d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x20, 0x6e, 0x70, 0x6d, 0x2d, 0x63, 0x69, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3a, 0x20, 0x6e, 0x70, 0x6d, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x2d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x20, 0x2d, 0x2d, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0xa, 0xa, 0x20, 0x20, 0x2d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x20, 0x67, 0x72, 0x75, 0x6e, 0x74, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x3a, 0x20, 0x22, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x20, 0x67, 0x72, 0x75, 0x6e, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3a, 0x20, 0x6e, 0x70, 0x6d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3a, 0x20, 0x67, 0x72, 0x75, 0x6e, 0x74, 0xa, 0xa, 0x20, 0x20, 0x2d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x20, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x3a, 0x20, 0x22, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x20, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3a, 0x20, 0x67, 0x6f, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x20, 0x2a, 0x2e, 0x67, 0x6f, 0xa, 0xa, 0x20, 0x20, 0x2d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x20, 0x65, 0x76, 0x6f, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x20, 0x26, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x65, 0x76, 0x6f, 0x2d, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x20, 0x26, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x64, 0x65, 0x76, 0x20, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3a, 0x20, 0x6e, 0x70, 0x6d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3a, 0x20, 0x6e, 0x70, 0x6d, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x69, 0x6e, 0x69, 0x74, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3a, 0x20, 0x6e, 0x70, 0x6d, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3a, 0x20, 0x6e, 0x70, 0x6d, 0x20, 0x70, 0x72, 0x75, 0x6e, 0x65, 0x20, 0x2d, 0x2d, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0xa, 0xa, 0x20, 0x20, 0x2d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x20, 0x6d, 0x61, 0x76, 0x65, 0x6e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x3a, 0x20, 0x22, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x20, 0x6a, 0x61, 0x76, 0x61, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3a, 0x20, 0x6d, 0x76, 0x6e, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2d, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x3a, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2f, 0x2a, 0x2e, 0x77, 0x61, 0x72, 0xa, 0xa, 0x20, 0x20, 0x2d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x65, 0x72, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x4d, 0x61, 0x76, 0x65, 0x6e, 0x20, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x4d, 0x54, 0x41, 0x52, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3a, 0x20, 0x6d, 0x76, 0x6e, 0x20, 0x2d, 0x42, 0x20, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x3a, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x2d, 0x44, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x3d, 0x7b, 0x7b, 0x72, 0x65, 0x70, 0x6f, 0x2d, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x7d, 0x7d, 0x20, 0x2d, 0x44, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x3d, 0x2e, 0x2f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0xa, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2d, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x3a, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2f, 0x2a, 0x2e, 0x2a, 0xa, 0xa, 0x20, 0x20, 0x2d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x20, 0x7a, 0x69, 0x70, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x2e, 0x7a, 0x69, 0x70, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x2e, 0x7a, 0x69, 0x70, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0xa, 0xa, 0x20, 0x20, 0x2d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x20, 0x6d, 0x61, 0x76, 0x65, 0x6e, 0x5f, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x3a, 0x20, 0x22, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x20, 0x6a, 0x61, 0x76, 0x61, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x4a, 0x75, 0x6c, 0x79, 0x20, 0x32, 0x30, 0x32, 0x31, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3a, 0x20, 0x6d, 0x76, 0x6e, 0x20, 0x2d, 0x42, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2d, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x3a, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2f, 0x2a, 0x2e, 0x77, 0x61, 0x72, 0xa} +var BuilderTypeConfig = []byte{0x23, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x20, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0xa, 0x23, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x6f, 0x6c, 0xa, 0x23, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x61, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x75, 0x73, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0xa, 0x23, 0x20, 0x48, 0x6f, 0x77, 0x65, 0x76, 0x65, 0x72, 0x2c, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x20, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x27, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x20, 0x74, 0x6f, 0x6f, 0x6c, 0xa, 0x23, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x6f, 0x6c, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, 0x6c, 0x65, 0xa, 0x23, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x77, 0x69, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0xa, 0xa, 0x23, 0x20, 0x4e, 0x6f, 0x74, 0x65, 0x3a, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x75, 0x74, 0x75, 0x72, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x6f, 0x6c, 0xa, 0xa, 0x23, 0x20, 0x75, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x64, 0x64, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x60, 0x67, 0x6f, 0x3a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x60, 0xa, 0x23, 0x20, 0x54, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x20, 0x28, 0x73, 0x65, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x67, 0x6f, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x29, 0xa, 0xa, 0xa, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x3a, 0xa, 0x20, 0x20, 0x2d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x20, 0x6e, 0x70, 0x6d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x20, 0x26, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x64, 0x65, 0x76, 0x20, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3a, 0x20, 0x6e, 0x70, 0x6d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x20, 0x2d, 0x2d, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0xa, 0xa, 0x20, 0x20, 0x2d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x20, 0x6e, 0x70, 0x6d, 0x2d, 0x63, 0x69, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3a, 0x20, 0x6e, 0x70, 0x6d, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x2d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x20, 0x2d, 0x2d, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0xa, 0xa, 0x20, 0x20, 0x2d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x20, 0x67, 0x72, 0x75, 0x6e, 0x74, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x3a, 0x20, 0x22, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x20, 0x67, 0x72, 0x75, 0x6e, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3a, 0x20, 0x6e, 0x70, 0x6d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3a, 0x20, 0x67, 0x72, 0x75, 0x6e, 0x74, 0xa, 0xa, 0x20, 0x20, 0x2d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x20, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x3a, 0x20, 0x22, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x20, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3a, 0x20, 0x67, 0x6f, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x20, 0x2e, 0x2f, 0x2e, 0x2e, 0x2e, 0xa, 0xa, 0x20, 0x20, 0x2d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x20, 0x65, 0x76, 0x6f, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x20, 0x26, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x65, 0x76, 0x6f, 0x2d, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x20, 0x26, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x64, 0x65, 0x76, 0x20, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3a, 0x20, 0x6e, 0x70, 0x6d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3a, 0x20, 0x6e, 0x70, 0x6d, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x69, 0x6e, 0x69, 0x74, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3a, 0x20, 0x6e, 0x70, 0x6d, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3a, 0x20, 0x6e, 0x70, 0x6d, 0x20, 0x70, 0x72, 0x75, 0x6e, 0x65, 0x20, 0x2d, 0x2d, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0xa, 0xa, 0x20, 0x20, 0x2d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x20, 0x6d, 0x61, 0x76, 0x65, 0x6e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x3a, 0x20, 0x22, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x20, 0x6a, 0x61, 0x76, 0x61, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3a, 0x20, 0x6d, 0x76, 0x6e, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2d, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x3a, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2f, 0x2a, 0x2e, 0x77, 0x61, 0x72, 0xa, 0xa, 0x20, 0x20, 0x2d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x65, 0x72, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x4d, 0x61, 0x76, 0x65, 0x6e, 0x20, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x4d, 0x54, 0x41, 0x52, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3a, 0x20, 0x6d, 0x76, 0x6e, 0x20, 0x2d, 0x42, 0x20, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x3a, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x2d, 0x44, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x3d, 0x7b, 0x7b, 0x72, 0x65, 0x70, 0x6f, 0x2d, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x7d, 0x7d, 0x20, 0x2d, 0x44, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x3d, 0x2e, 0x2f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0xa, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2d, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x3a, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2f, 0x2a, 0x2e, 0x2a, 0xa, 0xa, 0x20, 0x20, 0x2d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x20, 0x7a, 0x69, 0x70, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x2e, 0x7a, 0x69, 0x70, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x2e, 0x7a, 0x69, 0x70, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0xa, 0xa, 0x20, 0x20, 0x2d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x20, 0x6d, 0x61, 0x76, 0x65, 0x6e, 0x5f, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x3a, 0x20, 0x22, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x20, 0x6a, 0x61, 0x76, 0x61, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x4a, 0x75, 0x6c, 0x79, 0x20, 0x32, 0x30, 0x32, 0x31, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3a, 0x20, 0x6d, 0x76, 0x6e, 0x20, 0x2d, 0x42, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2d, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x3a, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2f, 0x2a, 0x2e, 0x77, 0x61, 0x72, 0xa} diff --git a/internal/commands/commands.go b/internal/commands/commands.go index 0d287096c..3189b0a71 100644 --- a/internal/commands/commands.go +++ b/internal/commands/commands.go @@ -109,7 +109,7 @@ func ConvertMap(m map[interface{}]interface{}) map[string]interface{} { } // CommandProvider - Get build command's to execute -//noinspection GoExportedFuncWithUnexportedType +// noinspection GoExportedFuncWithUnexportedType func CommandProvider(module mta.Module) (CommandList, string, error) { // Get config from ./commands_cfg.yaml as generated artifacts from source moduleTypes, err := parseModuleTypes(ModuleTypeConfig) diff --git a/internal/platform/model.go b/internal/platform/model.go index 36c320588..fd0d56b62 100644 --- a/internal/platform/model.go +++ b/internal/platform/model.go @@ -12,7 +12,7 @@ type Modules struct { } // Properties - properties list -//noinspection GoUnnecessarilyExportedIdentifiers +// noinspection GoUnnecessarilyExportedIdentifiers type Properties struct { NativeType string `yaml:"native-type"` PlatformType string `yaml:"platform-type"` diff --git a/micromatch/Darwin/micromatch-wrapper b/micromatch/Darwin/micromatch-wrapper new file mode 100644 index 000000000..3e158459d Binary files /dev/null and b/micromatch/Darwin/micromatch-wrapper differ diff --git a/micromatch/Linux/micromatch-wrapper b/micromatch/Linux/micromatch-wrapper new file mode 100644 index 000000000..12395e368 Binary files /dev/null and b/micromatch/Linux/micromatch-wrapper differ diff --git a/micromatch/Windows/micromatch-wrapper.exe b/micromatch/Windows/micromatch-wrapper.exe new file mode 100644 index 000000000..38a01ee8b Binary files /dev/null and b/micromatch/Windows/micromatch-wrapper.exe differ diff --git a/micromatch/build-install-test.sh b/micromatch/build-install-test.sh new file mode 100644 index 000000000..47640784b --- /dev/null +++ b/micromatch/build-install-test.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +sh build-install.sh + +sh test.sh \ No newline at end of file diff --git a/micromatch/build-install.sh b/micromatch/build-install.sh new file mode 100644 index 000000000..60aa6acda --- /dev/null +++ b/micromatch/build-install.sh @@ -0,0 +1,23 @@ +#!/bin/sh + +# clean env +rm -rf ./micromatch-wrapper-linux ./micromatch-wrapper-macos ./micromatch-wrapper-win.exe +rm -rf node_modules + +# install pkg +npm install -g pkg +pkg --version + +# build micromatch wrapper +npm install +pkg ./ + +# install and test micromatch wrapper +cp ./micromatch-wrapper-win.exe $GOPATH/bin/micromatch-wrapper.exe +micromatch-wrapper.exe -h + +# clean and copy micromatch wrapper to target path for release to GitHub +rm -rf ./Linux/* ./Darwin/* ./Windows/* +mv ./micromatch-wrapper-linux ./Linux/micromatch-wrapper +mv ./micromatch-wrapper-macos ./Darwin/micromatch-wrapper +mv ./micromatch-wrapper-win.exe ./Windows/micromatch-wrapper.exe \ No newline at end of file diff --git a/micromatch/micromatch-wrapper.js b/micromatch/micromatch-wrapper.js new file mode 100644 index 000000000..e5b67b66f --- /dev/null +++ b/micromatch/micromatch-wrapper.js @@ -0,0 +1,201 @@ +#!/usr/bin/env node +const micromatch = require('micromatch'); +const { program } = require('commander'); +const path = require('path'); +const util = require('util'); +const fs = require('fs'); +const { log } = require('console'); + +program + .version('1.0.0') + .description('Micromatch CLI Wrapper') + +const matchCommand = program + .command('match') + .description('The main function takes a list of strings and one or more glob patterns to use for matching.') + .option('-f, --files ', 'Specify file paths') + .option('-p, --patterns ', 'Specify match patterns') + .action((options) => { + const matchedFiles = micromatch(options.files, options.patterns) + if (matchedFiles.length == 0) { + process.stdout.write("Not Match"); + } + else { + process.stdout.write("Match Files: " + matchedFiles.toString()); + } + }); + +const isMatchCommand = program + .command('ismatch') + .description('Returns true if the specified string matches the given glob patterns.') + .option('-f, --file ', 'Specify file paths') + .option('-p, --patterns ', 'Specify match patterns') + .action((options) => { + const matchedFiles = micromatch(options.file, options.patterns) + if (matchedFiles.length == 0) { + process.stdout.write("false"); + } + else { + process.stdout.write("true"); + } + }); + + function exportFilePath(writeStream, filePath) { + writeStream.write(filePath + '\n'); + } + + function checkFilePathExists(filePath) { + return new Promise((resolve, reject) => { + fs.access(filePath, fs.constants.F_OK, (err) => { + if (err) { + resolve(false); + } else { + resolve(true); + } + }); + }); + } + + function checkFilePathIsDir(filePath) { + return new Promise((resolve, reject) => { + fs.stat(filePath, (err, stats) => { + if (err) { + reject(err); + } else { + resolve(stats.isDirectory()); + } + }); + }); + } + + function walk(rootPath, currentPath, patterns, writeStream, targetFileName, exportFilePath, visitedPaths = new Set()) { + return new Promise((resolve, reject) => { + fs.readdir(currentPath, function(err, files) { + if (err) reject(err); + let promises = []; + files.forEach(function(file) { + const filePath = path.join(currentPath, file); + // if current path is target file, skip it to exclude it from exported result + const relativeFilePath = path.normalize(path.relative(rootPath, filePath)).replace(/\\/g, '/'); + if (relativeFilePath === targetFileName) { + console.log('Skip target file:', targetFileName); + return; + } + promises.push( + new Promise((resolve, reject) => { + fs.stat(filePath, function(err, stats) { + if (err) reject(err); + // (1) check symbolic link recursive + fs.lstat(filePath, function(err, linkstats) { + if (linkstats.isSymbolicLink()) { + const resolvedPath = fs.realpathSync(filePath); + if (visitedPaths.has(resolvedPath)) { + console.log('Recursive symbolic link detected:', filePath); + process.exit(1); + } + visitedPaths.add(resolvedPath); + } + }); + // (2) if not match ignore pattern, export to file + const files = []; + files.push(relativeFilePath); + const matchedFiles = micromatch(files, patterns); + if (matchedFiles.length == 0) { + exportFilePath(writeStream, relativeFilePath); + } + // (3) walk dir + if (stats.isDirectory()) { + walk(rootPath, filePath, patterns, writeStream, targetFileName, exportFilePath, visitedPaths).then(resolve).catch(reject); + } else { + resolve(); + } + }); + }) + ); + }); + Promise.all(promises).then(resolve).catch(reject); + }); + }); + } + + const getPackagedFilesCommand = program + .command('getPackagedFiles') + .description('Get files and directories which will be packaged, and export file path to target file') + .option('-s, --source ', 'Source dir') + .option('-t, --target ', 'Target file path') + .option('-p, --patterns ', 'Ignore Patterns', []) + .action((options) => { + // (1) check if parameters are null + if (!options.source || !options.target) { + console.error('source or target paramerter should not be empty!'); + process.exit(1); + } + + const sourcePath = options.source; + const targetFilePath = options.target; + const targetFileDir = path.dirname(targetFilePath) + const targetFileName = path.basename(targetFilePath) + const patterns = options.patterns.map(pattern => pattern.replace(/\\/g, '/')); + + // (2) check if source path is exist + checkFilePathExists(sourcePath) + .then(exists => { + if (!exists) { + console.error('Source Path ', sourcePath, ' is not exist.') + process.exit(1); + } + }) + .catch(err => { + console.error('Error checking file path:', err); + process.exit(1); + }); + + // (3) check if target path is exist + checkFilePathExists(targetFileDir) + .then(exists => { + if (!exists) { + console.error('Target Path ', targetFileDir, ' is not exist.') + process.exit(1); + } + }) + .catch(err => { + console.error('Error checking file path:', err); + process.exit(1); + }); + + // (4) check if source path is dir + checkFilePathIsDir(sourcePath) + .then(isDir => { + if (!isDir) { + console.log('Source Path ', sourcePath, ' is not a directory.'); + process.exit(1); + } + }) + .catch(err => { + console.error('Error checking file path:', err); + process.exit(1); + }); + + // (5) create file stream + const writeStream = fs.createWriteStream(targetFilePath); + writeStream.on('error', function(err) { + console.error('Error writing to file:', err); + process.exit(1); + }); + writeStream.on('finish', function() { + console.log('Done!'); + }); + + // (6) walk file tree from source path, write packaged filepath to file stream + walk(sourcePath, sourcePath, patterns, writeStream, targetFileName, exportFilePath) + .then(() => { + writeStream.end(); + }) + .catch((err) => { + console.error('Error walking through files:', err); + process.exit(1); + }); + }); + +program.parse(process.argv); + diff --git a/micromatch/node-js/gulpfile.js b/micromatch/node-js/gulpfile.js new file mode 100644 index 000000000..6c2fa7adb --- /dev/null +++ b/micromatch/node-js/gulpfile.js @@ -0,0 +1,132 @@ +/** + * This is the gulp script to run jasmine tests with coverage analysis using istanbul. + * For more information, please see also: + * @see {@link http://jasmine.github.io/2.0/introduction.html} + * @see {@link https://www.npmjs.com/package/istanbul} + * @see {@link https://www.npmjs.com/package/gulp} + * @see {@link https://www.npmjs.com/package/gulp-istanbul} + * @see {@link https://www.npmjs.com/package/gulp-jasmine} + * @see {@link https://www.npmjs.com/package/jasmine-reporters} + * @see {@link https://www.npmjs.com/package/glob} + **/ + +var path = require("path"); + +var gulp = require("gulp"); +var jasmine = require("gulp-jasmine"); +var istanbul = require("gulp-istanbul"); +var reporters = require("jasmine-reporters"); + +// required to replace absolute paths in results with relative ones +var replace = require("gulp-replace"); + +// configuration of the test coverage, uses glob syntax +// @see {@link https://www.npmjs.com/package/glob} + +// the following files are included in the coverage analysis +// include all javascript files and exclude myExclude.js +// replace or remove files depending on what is to be excluded or included in addition +var includedScripts = ["**/*.js", "!myExclude.js"]; + +// the following files are part of the framework and are to be excluded from the test coverage +var defaultExclusion = ["!**/*spec.js", "!rungulp.js", "!gulpfile.js", "!**/node_modules/**", "!appcontroller.*/**", "!vendor/**"]; + +// test results folder for test view history +// assign each test run a unique timestamp, coverage and test results +// are associated via timestamp, so the test results folder fills up with files +// of form: +// 123456_report.xml +// 123456_coverage.json +// 456789_report.xml +// 456789_coverage.json +// ... +var testResultsDir = path.join(__dirname, ".testresults"); + +var timestamp = Date.now(); +var testResultFile = timestamp + "_report.xml"; +var coverageResultFile = timestamp + "_coverage.json"; + +/** + * Instrument the test/productive code + */ +gulp.task("instrumentation", function() { + return gulp.src(includedScripts.concat(defaultExclusion)) + // Covering files + .pipe(istanbul({ + includeUntested: true // instrument all files + })) + // Force `require` to return covered files + .pipe(istanbul.hookRequire()); +}); + +/** + * Execute tests with coverage information, requires instrumentation + * before tests are executed + */ +gulp.task("jasmine-istanbul", ["instrumentation"], function() { + // run all tests ending with "spec", skip all tests that are part of the node_modules + return gulp.src(["**/*spec.js", "!**/node_modules/**"]) + .pipe(jasmine({ + errorOnFail: false, + // use the standard junit xml reporter + reporter: new reporters.JUnitXmlReporter({ + savePath: testResultsDir, + filePrefix: testResultFile, + consolidateAll: true + }) + })) + .pipe(istanbul.writeReports({ + // generage json report for the coverage + reporters: ["json"], + reportOpts: { + json: { + dir: testResultsDir, + file: coverageResultFile + } + } + })); +}); + +/** + * Execute tests without coverage information + */ +gulp.task("jasmine", function() { + // run all tests ending with "spec", skip all tests that are part of the node_modules + return gulp.src(["**/*spec.js", "!**/node_modules/**"]) + .pipe(jasmine({ + errorOnFail: false, + // use the standard junit xml reporter + reporter: new reporters.JUnitXmlReporter({ + savePath: testResultsDir, + filePrefix: testResultFile, + consolidateAll: true + }) + })); +}); + +/** + * Remove absolute path portions so test view can open the referenced files + */ +function postProcessing() { + return gulp.src([ + path.join(testResultsDir, testResultFile), + path.join(testResultsDir, coverageResultFile) + ], { + dot: true + }) + .pipe(replace(__dirname, "")) + .pipe(gulp.dest(testResultsDir)); +} + +// run tests with coverage analysis +gulp.task("test-coverage", ["jasmine-istanbul"], function() { + return postProcessing(); +}); + +// only run the tests, skip test coverage analysis +gulp.task("test", ["jasmine"], function() { + return postProcessing(); +}); + +//the default task is to run tests with coverage analysis +gulp.task("default", ["test-coverage"]); diff --git a/micromatch/node-js/package.json b/micromatch/node-js/package.json new file mode 100644 index 000000000..10777c7c6 --- /dev/null +++ b/micromatch/node-js/package.json @@ -0,0 +1,24 @@ +{ + "dependencies": { + "prune": "0.0.2" + }, + "devDependencies": { + "gulp": "3.9.1", + "gulp-replace": "0.5.4", + "jasmine-reporters": "2.1.1", + "gulp-jasmine": "2.4.1", + "gulp-istanbul": "1.1.1" + }, + "files": [], + "main": "server.js", + "name": "node-js", + "scripts": { + "start": "node server.js", + "test": "node ./node_modules/gulp/bin/gulp test", + "test-coverage": "node ./node_modules/gulp/bin/gulp test-coverage" + }, + "engines": { + "node": ">=14.15.0" + }, + "version": "1.0.0" +} diff --git a/micromatch/node-js/server.js b/micromatch/node-js/server.js new file mode 100644 index 000000000..89d7f6ca6 --- /dev/null +++ b/micromatch/node-js/server.js @@ -0,0 +1,12 @@ +/*eslint no-console: 0*/ +"use strict"; + +var http = require("http"); +var port = process.env.PORT || 3000; + +http.createServer(function (req, res) { + res.writeHead(200, {"Content-Type": "text/plain"}); + res.end("Hello World\n"); +}).listen(port); + +console.log("Server listening on port %d", port); diff --git a/micromatch/package-lock.json b/micromatch/package-lock.json new file mode 100644 index 000000000..a89ad33c9 --- /dev/null +++ b/micromatch/package-lock.json @@ -0,0 +1,141 @@ +{ + "name": "micromatch-wrapper", + "version": "0.0.1", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "micromatch-wrapper", + "version": "0.0.1", + "dependencies": { + "commander": "^10.0.1", + "micromatch": "^4.0.5" + }, + "bin": { + "micromatch-wrapper": "micromatch-wrapper.js" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "engines": { + "node": ">=14" + } + }, + "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==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + } + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + } + } +} diff --git a/micromatch/package.json b/micromatch/package.json new file mode 100644 index 000000000..5433f731c --- /dev/null +++ b/micromatch/package.json @@ -0,0 +1,13 @@ +{ + "name": "micromatch-wrapper", + "version": "0.0.1", + "description": "CLI for micromatch", + "main": "micromatch-wrapper.js", + "bin": { + "micromatch-wrapper": "./micromatch-wrapper.js" + }, + "dependencies": { + "commander": "^10.0.1", + "micromatch": "^4.0.5" + } +} diff --git a/micromatch/test-micromatch.js b/micromatch/test-micromatch.js new file mode 100644 index 000000000..e9c790c81 --- /dev/null +++ b/micromatch/test-micromatch.js @@ -0,0 +1,155 @@ +#!/usr/bin/env node +const micromatch = require('micromatch'); + +// Test 1 +console.log("Test 1") +console.log(micromatch(['a/b/3.js'], ['a/b/**', '!a/b/3.js'])) +console.log("") + +// Test 2 +console.log("Test 2") +console.log(micromatch(['a/b/3.js', 'a/b/4.js', 'a/b/5.js', 'a/b/6.js'], ['a/b/**', '!a/b/3.js'])) +console.log(micromatch(['a/b/3.js'], ['a/b/**', '!a/b/3.js'])) +console.log(micromatch(['a/b/4.js'], ['a/b/**', '!a/b/3.js'])) +console.log(micromatch(['a/b/5.js'], ['a/b/**', '!a/b/3.js'])) +console.log(micromatch(['a/b/6.js'], ['a/b/**', '!a/b/3.js'])) +console.log("") + + +// Test 3 +console.log("Test 3") +console.log(micromatch(['a/b/3.js'], ['a/b/**', '!a/b/3.js', '!a/b/4.js'])) +console.log("") + +// Test 4 +console.log("Test 4") +console.log(micromatch(['a/b/3.js', 'a/b/4.js', 'a/b/5.js', 'a/b/6.js'], ['a/b/**', '!a/b/3.js', '!a/b/4.js'])) +console.log(micromatch(['a/b/3.js'], ['a/b/**', '!a/b/3.js', '!a/b/4.js'])) +console.log(micromatch(['a/b/4.js'], ['a/b/**', '!a/b/3.js', '!a/b/4.js'])) +console.log(micromatch(['a/b/5.js'], ['a/b/**', '!a/b/3.js', '!a/b/4.js'])) +console.log(micromatch(['a/b/6.js'], ['a/b/**', '!a/b/3.js', '!a/b/4.js'])) +console.log("") + +// Test 5 +console.log("Test 5") +console.log(micromatch(['a/b/3.js', 'a/b/4.js', 'a/b/5.js', 'a/b/6.js'], ['a/b/!(3.js)', 'a/b/!(4.js)'])) +console.log(micromatch(['a/b/3.js'], ['a/b/!(3.js)', 'a/b/!(4.js)'])) +console.log(micromatch(['a/b/4.js'], ['a/b/!(3.js)', 'a/b/!(4.js)'])) +console.log(micromatch(['a/b/5.js'], ['a/b/!(3.js)', 'a/b/!(4.js)'])) +console.log(micromatch(['a/b/6.js'], ['a/b/!(3.js)', 'a/b/!(4.js)'])) +console.log("") + +// Test 6 +console.log("Test 6") +console.log(micromatch(['a/b/3.js', 'a/b/4.js', 'a/b/5.js', 'a/b/6.js'], ['a/b/**', 'a/b/!(3.js)', '!a/b/3.js', '!a/b/4.js'])) +console.log(micromatch(['a/b/3.js'], ['a/b/**', 'a/b/!(3.js)', '!a/b/3.js', '!a/b/4.js'])) +console.log(micromatch(['a/b/4.js'], ['a/b/**', 'a/b/!(3.js)', '!a/b/3.js', '!a/b/4.js'])) +console.log(micromatch(['a/b/5.js'], ['a/b/**', 'a/b/!(3.js)', '!a/b/3.js', '!a/b/4.js'])) +console.log(micromatch(['a/b/6.js'], ['a/b/**', 'a/b/!(3.js)', '!a/b/3.js', '!a/b/4.js'])) +console.log("") + +// Test 7 +console.log("Test 7") +console.log(micromatch(['a/b/3.js'], ['!a/b/3.js', 'a/b/**'])) +console.log("") + +// Test 8 +console.log("Test 8") +console.log(micromatch(['a/b/3.js', 'a/b/4.js', 'a/b/5.js', 'a/b/6.js'], ['!a/b/4.js', 'a/b/**', '!a/b/3.js'])) +console.log(micromatch(['a/b/3.js'], ['!a/b/4.js', 'a/b/**', '!a/b/3.js'])) +console.log(micromatch(['a/b/4.js'], ['!a/b/4.js', 'a/b/**', '!a/b/3.js'])) +console.log(micromatch(['a/b/5.js'], ['!a/b/4.js', 'a/b/**', '!a/b/3.js'])) +console.log(micromatch(['a/b/6.js'], ['!a/b/4.js', 'a/b/**', '!a/b/3.js'])) +console.log("") + +// Test 9 +console.log("Test 9") +console.log(micromatch(['a/b/3.js', 'a/b/4.js', 'a/b/5.js', 'a/b/6.js'], ['!a/b/3.js', '!a/b/4.js', 'a/b/**'])) +console.log(micromatch(['a/b/3.js'], ['!a/b/3.js', '!a/b/4.js', 'a/b/**'])) +console.log(micromatch(['a/b/4.js'], ['!a/b/3.js', '!a/b/4.js', 'a/b/**'])) +console.log(micromatch(['a/b/5.js'], ['!a/b/3.js', '!a/b/4.js', 'a/b/**'])) +console.log(micromatch(['a/b/6.js'], ['!a/b/3.js', '!a/b/4.js', 'a/b/**'])) +console.log("") + +// Test 10 +console.log("Test 10") +console.log(micromatch(['a/b/3.js', 'a/b/4.js', 'a/b/5.js', 'a/b/6.js'], ['a/b/!(4.js)', 'a/b/!(3.js)'])) +console.log(micromatch(['a/b/3.js'], ['a/b/!(4.js)', 'a/b/!(3.js)'])) +console.log(micromatch(['a/b/4.js'], ['a/b/!(4.js)', 'a/b/!(3.js)'])) +console.log(micromatch(['a/b/5.js'], ['a/b/!(4.js)', 'a/b/!(3.js)'])) +console.log(micromatch(['a/b/6.js'], ['a/b/!(4.js)', 'a/b/!(3.js)'])) +console.log("") + + +// Test 11 +console.log("Test 11") +console.log(micromatch(['a/b/3.js', 'a/b/4.js', 'a/b/5.js', 'a/b/6.js'], ['a/b/!(3.js)', 'a/b/**', '!a/b/3.js', '!a/b/4.js'])) +console.log(micromatch(['a/b/3.js'], ['a/b/!(3.js)', 'a/b/**', '!a/b/3.js', '!a/b/4.js'])) +console.log(micromatch(['a/b/4.js'], ['a/b/!(3.js)', 'a/b/**', '!a/b/3.js', '!a/b/4.js'])) +console.log(micromatch(['a/b/5.js'], ['a/b/!(3.js)', 'a/b/**', '!a/b/3.js', '!a/b/4.js'])) +console.log(micromatch(['a/b/6.js'], ['a/b/!(3.js)', 'a/b/**', '!a/b/3.js', '!a/b/4.js'])) +console.log("") + +// Test 12 +console.log("Test 12") +console.log(micromatch(['a/b/3.js', 'a/b/4.js', 'a/b/5.js', 'a/b/6.js'], ['a/b/**', '!a/b/3.js', '!a/b/4.js', 'a/b/!(3.js)'])) +console.log(micromatch(['a/b/3.js'], ['a/b/**', '!a/b/3.js', '!a/b/4.js', 'a/b/!(3.js)'])) +console.log(micromatch(['a/b/4.js'], ['a/b/**', '!a/b/3.js', '!a/b/4.js', 'a/b/!(3.js)'])) +console.log(micromatch(['a/b/5.js'], ['a/b/**', '!a/b/3.js', '!a/b/4.js', 'a/b/!(3.js)'])) +console.log(micromatch(['a/b/6.js'], ['a/b/**', '!a/b/3.js', '!a/b/4.js', 'a/b/!(3.js)'])) +console.log("") + +// Test 13 +console.log("Test 13") +console.log(micromatch(['a/b/6.js'], [])) +console.log("") + +// Test 14 +console.log("Test 14") +console.log(micromatch(['a/b/6.js', 'a/b/.ignorefile'], ['**/.*'])) +console.log("") + +// Test 15 +console.log("Test 15") +console.log(micromatch(['a/b/6.js', 'a/b/.ignorefile'], ['.*'])) +console.log("") + +// Test 16 +console.log("Test 16") +console.log(micromatch(['a/b/6.js', 'a/b/.ignorefile'], ['.??*'])) +console.log("") + +// Test 17 +console.log("Test 17") +console.log(micromatch(['a/b/6.js', '.ignorefile'], ['.*'])) +console.log("") + +// Test 18 +console.log("Test 18") +console.log(micromatch(['a/b/6.js', '.ignorefile'], ['.??*'])) +console.log("") + +// Test 19 +console.log("Test 19") +console.log(micromatch(['.invisible-dir'], ['.??*'])) +console.log("") + +// Test 20 +console.log("Test 20") +console.log(micromatch(['.invisible-dir', '.invisible-dir/visible-file'], ['.??*'])) +console.log("") + +// Test 21 +console.log("Test 21") +console.log(micromatch(['.invisible-dir', '.invisible-dir/.invisible-file'], ['.??*'])) +console.log("") + +// Test 22 +console.log("Test 22") +console.log(micromatch(['a/b/c.js'], ['*.js'])) +console.log("") + +// Test 23 +console.log("Test 23") +console.log(micromatch(['a/b/c.js'], ['**/*.js'])) +console.log("") \ No newline at end of file diff --git a/micromatch/test.sh b/micromatch/test.sh new file mode 100644 index 000000000..da272e620 --- /dev/null +++ b/micromatch/test.sh @@ -0,0 +1,17 @@ +#!/bin/sh + +rm -rf node-js + +cp -r ../cmd/testdata/mta/node-js ./ + +cd node-js + +npm install --production + +cd - + +node test-micromatch.js + +go run test_micromatch_wrapper_js.go + +go run test_micromatch_wrapper_bin.go \ No newline at end of file diff --git a/micromatch/test_micromatch_wrapper_bin.go b/micromatch/test_micromatch_wrapper_bin.go new file mode 100644 index 000000000..3fc278af8 --- /dev/null +++ b/micromatch/test_micromatch_wrapper_bin.go @@ -0,0 +1,508 @@ +package main + +import ( + "fmt" + "os" + "os/exec" + "path/filepath" + "strings" +) + +func test_micromatch_bin_help() { + fmt.Println("Testing micromatch-wrapper-win!!") + + out, err := exec.Command("./micromatch-wrapper-win.exe", "-h").Output() + if err != nil { + fmt.Println("Error executing command:", err) + return + } + fmt.Println(string(out)) +} + +func test_micromatch_match(files, patterns []string) { + // Print file and pattern before slash + fmt.Printf("Files: [%s]\n", strings.Join(files, ",")) + fmt.Printf("Patterns: [%s]\n", strings.Join(patterns, ",")) + + // slash file and pattern and print + var files_toslash []string + for _, file := range files { + file_toslash := filepath.ToSlash(file) + files_toslash = append(files_toslash, file_toslash) + // fmt.Printf("File to slash: %s\n", file_toslash) + } + + var patterns_toslash []string + for _, pattern := range patterns { + pattern_toslash := filepath.ToSlash(pattern) + patterns_toslash = append(patterns_toslash, pattern_toslash) + // fmt.Printf("Pattern to slash: %s\n", pattern_toslash) + } + + var cmdArgs []string + cmdArgs = append(cmdArgs, "match") + cmdArgs = append(cmdArgs, "-f") + cmdArgs = append(cmdArgs, files_toslash...) + cmdArgs = append(cmdArgs, "-p") + cmdArgs = append(cmdArgs, patterns_toslash...) + + cmd := exec.Command("./micromatch-wrapper-win.exe", cmdArgs...) + out, err := cmd.Output() + //exitCode := cmd.ProcessState.ExitCode() + if err != nil { + fmt.Println("Error executing command:", err) + return + } + + output := string(out) + fmt.Println(output) + //fmt.Println(exitCode) + fmt.Println() +} + +func test_micromatch_ismatch(files, patterns []string) { + // Print file and pattern before slash + fmt.Printf("Files: [%s]\n", strings.Join(files, ",")) + fmt.Printf("Patterns: [%s]\n", strings.Join(patterns, ",")) + + // slash file and pattern and print + file_toslash := filepath.ToSlash(strings.Join(files, " ")) + // fmt.Printf("File to slash: %s\n", file_toslash) + + var patterns_toslash []string + for _, pattern := range patterns { + pattern_toslash := filepath.ToSlash(pattern) + patterns_toslash = append(patterns_toslash, pattern_toslash) + // fmt.Printf("Pattern to slash: %s\n", pattern_toslash) + } + + var cmdArgs []string + cmdArgs = append(cmdArgs, "ismatch") + cmdArgs = append(cmdArgs, "-f") + cmdArgs = append(cmdArgs, file_toslash) + cmdArgs = append(cmdArgs, "-p") + cmdArgs = append(cmdArgs, patterns_toslash...) + + cmd := exec.Command("./micromatch-wrapper-win.exe", cmdArgs...) + out, err := cmd.Output() + if err != nil { + fmt.Println("Error executing command:", err) + return + } + + output := string(out) + fmt.Println(output) + fmt.Println() +} + +func test_micromatch_getPackagedFiles(source, target string, patterns []string) { + // Print file and pattern before slash + fmt.Printf("Source: %s\n", source) + fmt.Printf("Target: %s\n", target) + fmt.Printf("Patterns: [%s]\n", strings.Join(patterns, ",")) + + var patterns_toslash []string + for _, pattern := range patterns { + pattern_toslash := filepath.ToSlash(pattern) + patterns_toslash = append(patterns_toslash, pattern_toslash) + // fmt.Printf("Pattern to slash: %s\n", pattern_toslash) + } + + var cmdArgs []string + cmdArgs = append(cmdArgs, "getPackagedFiles") + cmdArgs = append(cmdArgs, "-s") + cmdArgs = append(cmdArgs, source) + cmdArgs = append(cmdArgs, "-t") + cmdArgs = append(cmdArgs, target) + if len(patterns_toslash) > 0 { + cmdArgs = append(cmdArgs, "-p") + cmdArgs = append(cmdArgs, patterns_toslash...) + } + + cmd := exec.Command("./micromatch-wrapper-win.exe", cmdArgs...) + out, err := cmd.Output() + + output := string(out) + fmt.Println(output) + //exitCode := cmd.ProcessState.ExitCode() + if err != nil { + fmt.Println("Error executing command:", err) + return + } + + fmt.Println() +} + +func main() { + var cwd, source, target string + var files, patterns []string + + // Hello + test_micromatch_bin_help() + + // Test 1 + fmt.Printf("Test %d\n", 1) + files = []string{"node_modules/braces/lib/parse.js"} + patterns = []string{"node_modules/braces/**"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + + // Test 2 + fmt.Printf("Test %d\n", 2) + files = []string{"node_modules\\braces\\lib\\parse.js"} + patterns = []string{"node_modules\\braces\\**"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + + // Test 3 + fmt.Printf("Test %d\n", 3) + files = []string{"node_modules/commander/lib/help.js"} + patterns = []string{"node_modules/!(braces)/**"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + + // Test 4 + fmt.Printf("Test %d\n", 4) + files = []string{"/node_modules/npm_module/pkg/young.yang03.js"} + patterns = []string{"/**/pkg/**"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + + // Test 5 + fmt.Printf("Test %d\n", 5) + files = []string{"/node_modules/npm_module/pkg/young.yang03.js"} + patterns = []string{"/**/!(pkg)/**"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + + // Test 6 + fmt.Printf("Test %d\n", 6) + files = []string{"/node_modules/npm_module/pkg/young.yang03.js"} + patterns = []string{"/**/!(pkg)/!(pkg)/**"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + + // Test 7 + fmt.Printf("Test %d\n", 7) + files = []string{"/node_modules/npm_module/pkg/young.yang03.js"} + patterns = []string{"/**/!(pkg)/!(pkg)/!(pkg)/**"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + + // Test 8 + fmt.Printf("Test %d\n", 8) + files = []string{"/node_modules/npm_module/notpkg/young.yang03.js"} + patterns = []string{"/**/!(pkg)/**"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + + // Test 9 + fmt.Printf("Test %d\n", 9) + files = []string{"licence.js"} + patterns = []string{"*.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + + // Test 10 + fmt.Printf("Test %d\n", 10) + files = []string{"node_module/licence.js"} + patterns = []string{"node_module/*"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + + // Test 11 + fmt.Printf("Test %d\n", 11) + files = []string{"node_module/licence.js"} + patterns = []string{"node_module/**"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + + // Test 12 + fmt.Printf("Test %d\n", 12) + files = []string{"node-js\\gulpfile.js"} + patterns = []string{"node-js\\*.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + + // Test 13 + fmt.Printf("Test %d\n", 13) + files = []string{"C:\\Workspace\\Test_Project\\go_glob_patter_test\\test_micromatch\\node-js\\gulpfile.js"} + patterns = []string{"C:\\Workspace\\Test_Project\\go_glob_patter_test\\test_micromatch\\node-js\\*.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + + // Test 14 + fmt.Printf("Test %d\n", 14) + files = []string{"node_module/licence.js"} + patterns = []string{"node_module/?icence.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + + // Test 15 + fmt.Printf("Test %d\n", 15) + files = []string{"node_module/braces/lib"} + patterns = []string{"node_module/b[r,e]aces/*"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + + // Test 16 + fmt.Printf("Test %d\n", 16) + files = []string{"node_modules/@sap/excluded_nodejs_packages"} + patterns = []string{"node_modules/@sap/!(included_nodejs_packages)"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + + // Test 17 + fmt.Printf("Test %d\n", 17) + files = []string{"node_modules/@sap/included_nodejs_packages"} + patterns = []string{"node_modules/@sap/!(included_nodejs_packages)"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + + // Test 18 + fmt.Printf("Test %d\n", 18) + files = []string{"node_modules/@sap/excluded_nodejs_packages"} + patterns = []string{"!node_modules/@sap/included_nodejs_packages"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + + // Test 19 + fmt.Printf("Test %d\n", 19) + files = []string{"node_modules/@sap/included_nodejs_packages"} + patterns = []string{"!node_modules/@sap/included_nodejs_packages"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + + // Test 20 + fmt.Printf("Test %d\n", 20) + files = []string{"node_modules/@sap/included_nodejs_packages"} + patterns = []string{"!node_modules/@sap/included_nodejs_packages"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + + // Test 21 + fmt.Printf("Test %d\n", 21) + files = []string{"node_modules/@sap/included_nodejs_packages"} + patterns = []string{"node_modules/@sap/**", "!node_modules/@sap/included_nodejs_packages", "!node_modules/@sap/excluded_nodejs_packages"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + + // Test 22 + fmt.Printf("Test %d\n", 22) + files = []string{"a/b/3.js"} + patterns = []string{"a/b/**", "!a/b/3.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + + // Test 23 + fmt.Printf("Test %d\n", 23) + files = []string{"a/b/3.js", "a/b/4.js", "a/b/5.js", "a/b/6.js"} + patterns = []string{"a/b/**", "!a/b/3.js"} + test_micromatch_match(files, patterns) + files = []string{"a/b/3.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + files = []string{"a/b/4.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + files = []string{"a/b/5.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + files = []string{"a/b/6.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + + // Test 24 + fmt.Printf("Test %d\n", 24) + files = []string{"a/b/3.js"} + patterns = []string{"a/b/**", "!a/b/3.js", "!a/b/4.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + + // Test 25 + fmt.Printf("Test %d\n", 25) + files = []string{"a/b/3.js", "a/b/4.js", "a/b/5.js", "a/b/6.js"} + patterns = []string{"a/b/**", "!a/b/3.js", "!a/b/4.js"} + test_micromatch_match(files, patterns) + files = []string{"a/b/3.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + files = []string{"a/b/4.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + files = []string{"a/b/5.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + files = []string{"a/b/6.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + + // Test 26 + fmt.Printf("Test %d\n", 26) + files = []string{"a/b/3.js", "a/b/4.js", "a/b/5.js", "a/b/6.js"} + patterns = []string{"a/b/!(3.js)", "a/b/!(4.js)"} + test_micromatch_match(files, patterns) + files = []string{"a/b/3.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + files = []string{"a/b/4.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + files = []string{"a/b/5.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + files = []string{"a/b/6.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + + // Test 27 + fmt.Printf("Test %d\n", 27) + files = []string{"a/b/3.js", "a/b/4.js", "a/b/5.js", "a/b/6.js"} + patterns = []string{"a/b/**", "a/b/!(3.js)", "!a/b/3.js", "!a/b/4.js"} + test_micromatch_match(files, patterns) + files = []string{"a/b/3.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + files = []string{"a/b/4.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + files = []string{"a/b/5.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + files = []string{"a/b/6.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + + // Test 28 + fmt.Printf("Test %d\n", 28) + files = []string{"a/b/3.js"} + patterns = []string{"!a/b/3.js", "a/b/**"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + + // Test 29 + fmt.Printf("Test %d\n", 29) + files = []string{"a/b/3.js", "a/b/4.js", "a/b/5.js", "a/b/6.js"} + patterns = []string{"!a/b/4.js", "a/b/**", "!a/b/3.js"} + test_micromatch_match(files, patterns) + files = []string{"a/b/3.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + files = []string{"a/b/4.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + files = []string{"a/b/5.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + files = []string{"a/b/6.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + + // Test 30 + fmt.Printf("Test %d\n", 30) + files = []string{"a/b/3.js", "a/b/4.js", "a/b/5.js", "a/b/6.js"} + patterns = []string{"!a/b/3.js", "!a/b/4.js", "a/b/**"} + test_micromatch_match(files, patterns) + files = []string{"a/b/3.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + files = []string{"a/b/4.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + files = []string{"a/b/5.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + files = []string{"a/b/6.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + + // Test 31 + fmt.Printf("Test %d\n", 31) + files = []string{"a/b/3.js", "a/b/4.js", "a/b/5.js", "a/b/6.js"} + patterns = []string{"a/b/!(4.js)", "a/b/!(3.js)"} + test_micromatch_match(files, patterns) + files = []string{"a/b/3.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + files = []string{"a/b/4.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + files = []string{"a/b/5.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + files = []string{"a/b/6.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + + // Test 32 + fmt.Printf("Test %d\n", 32) + files = []string{"a/b/3.js", "a/b/4.js", "a/b/5.js", "a/b/6.js"} + patterns = []string{"a/b/!(3.js)", "a/b/**", "!a/b/3.js", "!a/b/4.js"} + test_micromatch_match(files, patterns) + files = []string{"a/b/3.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + files = []string{"a/b/4.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + files = []string{"a/b/5.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + files = []string{"a/b/6.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + + // Test 33 + fmt.Printf("Test %d\n", 33) + files = []string{"a/b/3.js", "a/b/4.js", "a/b/5.js", "a/b/6.js"} + patterns = []string{"a/b/**", "!a/b/3.js", "!a/b/4.js", "a/b/!(3.js)"} + test_micromatch_match(files, patterns) + files = []string{"a/b/3.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + files = []string{"a/b/4.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + files = []string{"a/b/5.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + files = []string{"a/b/6.js"} + test_micromatch_match(files, patterns) + test_micromatch_ismatch(files, patterns) + + // Test 34 + fmt.Printf("Test %d\n", 34) + files = []string{"node_modules/@sap/cds", "node_modules/@sap/credential-store-client-node", + "node_modules/@sap/external-service-mashup", "node_modules/@sap/low-code-event-handler", "node_modules/@sap/xssec"} + patterns = []string{"node_modules/@sap/**", "!node_modules/@sap/credential-store-client-node", "!node_modules/@sap/external-service-mashup"} + test_micromatch_match(files, patterns) + + // Test 35 + fmt.Printf("Test %d\n", 35) + files = []string{"node_modules/@sap/cds", "node_modules/@sap/credential-store-client-node", + "node_modules/@sap/external-service-mashup", "node_modules/@sap/low-code-event-handler", "node_modules/@sap/xssec"} + patterns = []string{"node_modules/@sap/!(credential-store-client-node)", "node_modules/@sap/!(external-service-mashup)"} + test_micromatch_match(files, patterns) + + // Test 36 + fmt.Printf("Test %d\n", 36) + files = []string{"node_modules/braces/lib/utils.js"} + patterns = []string{"node_modules/**", "!node_modules/braces/**"} + test_micromatch_match(files, patterns) + + // Test 37 + fmt.Printf("Test %d\n", 37) + cwd, _ = os.Getwd() + source = filepath.Join(cwd, "node-js") + target = filepath.Join(source, "tmpfile") + patterns = []string{} + test_micromatch_getPackagedFiles(source, target, patterns) + + // Test 38 + fmt.Printf("Test %d\n", 38) + cwd, _ = os.Getwd() + source = filepath.Join(cwd, "node-js") + target = filepath.Join(source, "tmpfile") + patterns = []string{"node_modules/**", "!node_modules/lodash/**"} + test_micromatch_getPackagedFiles(source, target, patterns) +} diff --git a/micromatch/test_micromatch_wrapper_js.go b/micromatch/test_micromatch_wrapper_js.go new file mode 100644 index 000000000..6aee96b90 --- /dev/null +++ b/micromatch/test_micromatch_wrapper_js.go @@ -0,0 +1,553 @@ +package main + +import ( + "fmt" + "os" + "os/exec" + "path/filepath" + "strings" +) + +func test_micromatch_help() { + fmt.Println("Testing micromatch-wrapper-js!!") + + out, err := exec.Command("node", "micromatch-wrapper.js", "-h").Output() + if err != nil { + fmt.Println("Error executing command:", err) + return + } + fmt.Println(string(out)) +} + +func test_micromatch_ismatch(files, patterns []string) { + // Print file and pattern before slash + fmt.Printf("File: [%s]\n", strings.Join(files, ",")) + fmt.Printf("Patterns: [%s]\n", strings.Join(patterns, ",")) + + // slash file and pattern and print + file_toslash := filepath.ToSlash(strings.Join(files, " ")) + // fmt.Printf("File to slash: %s\n", file_toslash) + + var patterns_toslash []string + for _, pattern := range patterns { + pattern_toslash := filepath.ToSlash(pattern) + patterns_toslash = append(patterns_toslash, pattern_toslash) + // fmt.Printf("Pattern to slash: %s\n", pattern_toslash) + } + + var cmdArgs []string + cmdArgs = append(cmdArgs, "micromatch-wrapper.js") + cmdArgs = append(cmdArgs, "ismatch") + cmdArgs = append(cmdArgs, "-f") + cmdArgs = append(cmdArgs, file_toslash) + cmdArgs = append(cmdArgs, "-p") + cmdArgs = append(cmdArgs, patterns_toslash...) + + cmd := exec.Command("node", cmdArgs...) + out, err := cmd.Output() + if err != nil { + fmt.Println("Error executing command:", err) + return + } + + output := string(out) + fmt.Println(output) + if strings.Contains(output, "true") { + // Skip + } else if strings.Contains(output, "false") { + // copy files to MTA Archive + } + + fmt.Println() +} + +func test_micromatch_match(files, patterns []string) { + // Print file and pattern before slash + fmt.Printf("Files: [%s]\n", strings.Join(files, ",")) + fmt.Printf("Patterns: [%s]\n", strings.Join(patterns, ",")) + + // slash file and pattern and print + var files_toslash []string + for _, file := range files { + file_toslash := filepath.ToSlash(file) + files_toslash = append(files_toslash, file_toslash) + // fmt.Printf("File to slash: %s\n", file_toslash) + } + + var patterns_toslash []string + for _, pattern := range patterns { + pattern_toslash := filepath.ToSlash(pattern) + patterns_toslash = append(patterns_toslash, pattern_toslash) + // fmt.Printf("Pattern to slash: %s\n", pattern_toslash) + } + + var cmdArgs []string + cmdArgs = append(cmdArgs, "micromatch-wrapper.js") + cmdArgs = append(cmdArgs, "match") + cmdArgs = append(cmdArgs, "-f") + cmdArgs = append(cmdArgs, files_toslash...) + cmdArgs = append(cmdArgs, "-p") + cmdArgs = append(cmdArgs, patterns_toslash...) + + cmd := exec.Command("node", cmdArgs...) + out, err := cmd.Output() + //exitCode := cmd.ProcessState.ExitCode() + if err != nil { + fmt.Println("Error executing command:", err) + return + } + + output := string(out) + fmt.Println(output) + //fmt.Println(exitCode) + if strings.Contains(output, "Not Match") { + // Skip + } else if strings.Contains(output, "Match Files") { + // copy files to MTA Archive + } + fmt.Println() +} + +func test_micromatch_getPackagedFiles(source, target string, patterns []string) { + // Print file and pattern before slash + fmt.Printf("Source: %s\n", source) + fmt.Printf("Target: %s\n", target) + fmt.Printf("Patterns: [%s]\n", strings.Join(patterns, ",")) + + var patterns_toslash []string + for _, pattern := range patterns { + pattern_toslash := filepath.ToSlash(pattern) + patterns_toslash = append(patterns_toslash, pattern_toslash) + // fmt.Printf("Pattern to slash: %s\n", pattern_toslash) + } + + var cmdArgs []string + cmdArgs = append(cmdArgs, "micromatch-wrapper.js") + cmdArgs = append(cmdArgs, "getPackagedFiles") + cmdArgs = append(cmdArgs, "-s") + cmdArgs = append(cmdArgs, source) + cmdArgs = append(cmdArgs, "-t") + cmdArgs = append(cmdArgs, target) + if len(patterns_toslash) > 0 { + cmdArgs = append(cmdArgs, "-p") + cmdArgs = append(cmdArgs, patterns_toslash...) + } + cmd := exec.Command("node", cmdArgs...) + out, err := cmd.Output() + + output := string(out) + fmt.Println(output) + //exitCode := cmd.ProcessState.ExitCode() + if err != nil { + fmt.Println("Error executing command:", err) + return + } + + fmt.Println() +} + +func main() { + + var cwd, source, target string + var files, patterns []string + + // // Hello + // test_micromatch_help() + + // // Test 1 + // fmt.Printf("Test %d\n", 1) + // files = []string{"node_modules/braces/lib/parse.js"} + // patterns = []string{"node_modules/braces/**"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + + // // Test 2 + // fmt.Printf("Test %d\n", 2) + // files = []string{"node_modules\\braces\\lib\\parse.js"} + // patterns = []string{"node_modules\\braces\\**"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + + // // Test 3 + // fmt.Printf("Test %d\n", 3) + // files = []string{"node_modules/commander/lib/help.js"} + // patterns = []string{"node_modules/!(braces)/**"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + + // // Test 4 + // fmt.Printf("Test %d\n", 4) + // files = []string{"/node_modules/npm_module/pkg/young.yang03.js"} + // patterns = []string{"/**/pkg/**"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + + // // Test 5 + // fmt.Printf("Test %d\n", 5) + // files = []string{"/node_modules/npm_module/pkg/young.yang03.js"} + // patterns = []string{"/**/!(pkg)/**"} + // test_micromatch_match(files, patterns) + + // // Test 6 + // fmt.Printf("Test %d\n", 6) + // files = []string{"/node_modules/npm_module/pkg/young.yang03.js"} + // patterns = []string{"/**/!(pkg)/!(pkg)/**"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + + // // Test 7 + // fmt.Printf("Test %d\n", 7) + // files = []string{"/node_modules/npm_module/pkg/young.yang03.js"} + // patterns = []string{"/**/!(pkg)/!(pkg)/!(pkg)/**"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + + // // Test 8 + // fmt.Printf("Test %d\n", 8) + // files = []string{"/node_modules/npm_module/notpkg/young.yang03.js"} + // patterns = []string{"/**/!(pkg)/**"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + + // // Test 9 + // fmt.Printf("Test %d\n", 9) + // files = []string{"licence.js"} + // patterns = []string{"*.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + + // // Test 10 + // fmt.Printf("Test %d\n", 10) + // files = []string{"node_module/licence.js"} + // patterns = []string{"node_module/*"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + + // // Test 11 + // fmt.Printf("Test %d\n", 11) + // files = []string{"node_module/licence.js"} + // patterns = []string{"node_module/**"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + + // // Test 12 + // fmt.Printf("Test %d\n", 12) + // files = []string{"node-js\\gulpfile.js"} + // patterns = []string{"node-js\\*.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + + // // Test 13 + // fmt.Printf("Test %d\n", 13) + // files = []string{"C:\\Workspace\\Test_Project\\go_glob_patter_test\\test_micromatch_match\\node-js\\gulpfile.js"} + // patterns = []string{"C:\\Workspace\\Test_Project\\go_glob_patter_test\\test_micromatch_match\\node-js\\*.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + + // // Test 14 + // fmt.Printf("Test %d\n", 14) + // files = []string{"node_module/licence.js"} + // patterns = []string{"node_module/?icence.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + + // // Test 15 + // fmt.Printf("Test %d\n", 15) + // files = []string{"node_module/braces/lib"} + // patterns = []string{"node_module/b[r,e]aces/*"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + + // // Test 16 + // fmt.Printf("Test %d\n", 16) + // files = []string{"node_module/braces/lib"} + // patterns = []string{"node_module/b[r,e]aces/*"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + + // // Test 17 + // fmt.Printf("Test %d\n", 17) + // files = []string{"node_modules/@sap/excluded_nodejs_packages"} + // patterns = []string{"node_modules/@sap/!(included_nodejs_packages)"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + + // // Test 18 + // fmt.Printf("Test %d\n", 18) + // files = []string{"node_modules/@sap/included_nodejs_packages"} + // patterns = []string{"node_modules/@sap/!(included_nodejs_packages)"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + + // // Test 19 + // fmt.Printf("Test %d\n", 19) + // files = []string{"node_modules/@sap/excluded_nodejs_packages"} + // patterns = []string{"!node_modules/@sap/included_nodejs_packages"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + + // // Test 20 + // fmt.Printf("Test %d\n", 20) + // files = []string{"node_modules/@sap/included_nodejs_packages"} + // patterns = []string{"!node_modules/@sap/included_nodejs_packages"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + + // // Test 21 + // fmt.Printf("Test %d\n", 21) + // files = []string{"node_modules/@sap/included_nodejs_packages"} + // patterns = []string{"node_modules/@sap/**", "!node_modules/@sap/included_nodejs_packages", "!node_modules/@sap/excluded_nodejs_packages"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + + // // Test 22 + // fmt.Printf("Test %d\n", 22) + // files = []string{"a/b/3.js"} + // patterns = []string{"a/b/**", "!a/b/3.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + + // // Test 23 + // fmt.Printf("Test %d\n", 23) + // files = []string{"a/b/3.js", "a/b/4.js", "a/b/5.js", "a/b/6.js"} + // patterns = []string{"a/b/**", "!a/b/3.js"} + // test_micromatch_match(files, patterns) + // files = []string{"a/b/3.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + // files = []string{"a/b/4.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + // files = []string{"a/b/5.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + // files = []string{"a/b/6.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + + // // Test 24 + // fmt.Printf("Test %d\n", 24) + // files = []string{"a/b/3.js"} + // patterns = []string{"a/b/**", "!a/b/3.js", "!a/b/4.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + + // // Test 25 + // fmt.Printf("Test %d\n", 25) + // files = []string{"a/b/3.js", "a/b/4.js", "a/b/5.js", "a/b/6.js"} + // patterns = []string{"a/b/**", "!a/b/3.js", "!a/b/4.js"} + // test_micromatch_match(files, patterns) + // files = []string{"a/b/3.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + // files = []string{"a/b/4.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + // files = []string{"a/b/5.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + // files = []string{"a/b/6.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + + // // Test 26 + // fmt.Printf("Test %d\n", 26) + // files = []string{"a/b/3.js", "a/b/4.js", "a/b/5.js", "a/b/6.js"} + // patterns = []string{"a/b/!(3.js)", "a/b/!(4.js)"} + // test_micromatch_match(files, patterns) + // files = []string{"a/b/3.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + // files = []string{"a/b/4.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + // files = []string{"a/b/5.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + // files = []string{"a/b/6.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + + // // Test 27 + // fmt.Printf("Test %d\n", 27) + // files = []string{"a/b/3.js", "a/b/4.js", "a/b/5.js", "a/b/6.js"} + // patterns = []string{"a/b/**", "a/b/!(3.js)", "!a/b/3.js", "!a/b/4.js"} + // test_micromatch_match(files, patterns) + // files = []string{"a/b/3.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + // files = []string{"a/b/4.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + // files = []string{"a/b/5.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + // files = []string{"a/b/6.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + + // // Test 28 + // fmt.Printf("Test %d\n", 28) + // files = []string{"a/b/3.js"} + // patterns = []string{"!a/b/3.js", "a/b/**"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + + // // Test 29 + // fmt.Printf("Test %d\n", 29) + // files = []string{"a/b/3.js", "a/b/4.js", "a/b/5.js", "a/b/6.js"} + // patterns = []string{"!a/b/4.js", "a/b/**", "!a/b/3.js"} + // test_micromatch_match(files, patterns) + // files = []string{"a/b/3.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + // files = []string{"a/b/4.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + // files = []string{"a/b/5.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + // files = []string{"a/b/6.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + + // // Test 30 + // fmt.Printf("Test %d\n", 30) + // files = []string{"a/b/3.js", "a/b/4.js", "a/b/5.js", "a/b/6.js"} + // patterns = []string{"!a/b/3.js", "!a/b/4.js", "a/b/**"} + // test_micromatch_match(files, patterns) + // files = []string{"a/b/3.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + // files = []string{"a/b/4.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + // files = []string{"a/b/5.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + // files = []string{"a/b/6.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + + // // Test 31 + // fmt.Printf("Test %d\n", 31) + // files = []string{"a/b/3.js", "a/b/4.js", "a/b/5.js", "a/b/6.js"} + // patterns = []string{"a/b/!(4.js)", "a/b/!(3.js)"} + // test_micromatch_match(files, patterns) + // files = []string{"a/b/3.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + // files = []string{"a/b/4.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + // files = []string{"a/b/5.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + // files = []string{"a/b/6.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + + // // Test 32 + // fmt.Printf("Test %d\n", 32) + // files = []string{"a/b/3.js", "a/b/4.js", "a/b/5.js", "a/b/6.js"} + // patterns = []string{"a/b/!(3.js)", "a/b/**", "!a/b/3.js", "!a/b/4.js"} + // test_micromatch_match(files, patterns) + // files = []string{"a/b/3.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + // files = []string{"a/b/4.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + // files = []string{"a/b/5.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + // files = []string{"a/b/6.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + + // // Test 33 + // fmt.Printf("Test %d\n", 33) + // files = []string{"a/b/3.js", "a/b/4.js", "a/b/5.js", "a/b/6.js"} + // patterns = []string{"a/b/**", "!a/b/3.js", "!a/b/4.js", "a/b/!(3.js)"} + // test_micromatch_match(files, patterns) + // files = []string{"a/b/3.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + // files = []string{"a/b/4.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + // files = []string{"a/b/5.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + // files = []string{"a/b/6.js"} + // test_micromatch_match(files, patterns) + // test_micromatch_ismatch(files, patterns) + + // // Test 34 + // fmt.Printf("Test %d\n", 34) + // files = []string{"node_modules/@sap/cds", "node_modules/@sap/credential-store-client-node", + // "node_modules/@sap/external-service-mashup", "node_modules/@sap/low-code-event-handler", "node_modules/@sap/xssec"} + // patterns = []string{"node_modules/@sap/**", "!node_modules/@sap/credential-store-client-node", "!node_modules/@sap/external-service-mashup"} + // test_micromatch_match(files, patterns) + + // // Test 35 + // fmt.Printf("Test %d\n", 35) + // files = []string{"node_modules/@sap/cds", "node_modules/@sap/credential-store-client-node", + // "node_modules/@sap/external-service-mashup", "node_modules/@sap/low-code-event-handler", "node_modules/@sap/xssec"} + // patterns = []string{"node_modules/@sap/!(credential-store-client-node)", "node_modules/@sap/!(external-service-mashup)"} + // test_micromatch_match(files, patterns) + + // Test 36 + fmt.Printf("Test %d\n", 36) + files = []string{"node_modules/braces/lib/utils.js"} + patterns = []string{"node_modules/**", "!node_modules/braces/**"} + test_micromatch_match(files, patterns) + + // Test 37 + fmt.Printf("Test %d\n", 37) + cwd, _ = os.Getwd() + source = filepath.Join(cwd, "node-js") + target = filepath.Join(cwd, "node-js/export-result-file") + patterns = []string{} + test_micromatch_getPackagedFiles(source, target, patterns) + + // Test 38 + fmt.Printf("Test %d\n", 38) + cwd, _ = os.Getwd() + source = filepath.Join(cwd, "node-js") + target = filepath.Join(cwd, "node-js/export-result-file") + patterns = []string{"node_modules/**", "!node_modules/lodash/**"} + test_micromatch_getPackagedFiles(source, target, patterns) + + // Test 39 + fmt.Printf("Test %d\n", 39) + cwd, _ = os.Getwd() + source = filepath.Join(cwd, "node-js") + target = filepath.Join(cwd, "node-js/export-result-file") + patterns = []string{"node_modules/**", "!node_modules/prune/**"} + test_micromatch_getPackagedFiles(source, target, patterns) + + // Test 40 + fmt.Printf("Test %d\n", 40) + cwd, _ = os.Getwd() + source = filepath.Join(cwd, "node-js") + target = filepath.Join(cwd, "node-js/export-result-file") + patterns = []string{"*.js"} + test_micromatch_getPackagedFiles(source, target, patterns) + + // Test 41 + fmt.Printf("Test %d\n", 41) + cwd, _ = os.Getwd() + source = filepath.Join(cwd, "node-js/gulpfile.js") + target = filepath.Join(cwd, "node-js/export-result-file") + patterns = []string{} + test_micromatch_getPackagedFiles(source, target, patterns) + + // Test 42 + fmt.Printf("Test %d\n", 42) + cwd, _ = os.Getwd() + source = filepath.Join(cwd, "node-js/gulpfile.js") + target = filepath.Join(cwd, "node-js/export-result-file") + patterns = []string{"*.js"} + test_micromatch_getPackagedFiles(source, target, patterns) +} diff --git a/package-lock.json b/package-lock.json index 1d2733f89..9f11779eb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,20 @@ { "name": "mbt", - "version": "1.2.19", + "version": "1.2.23", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "mbt", - "version": "1.2.19", + "version": "1.2.23", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { "binwrap": "0.2.3" }, "bin": { - "mbt": "bin/mbt" + "mbt": "bin/mbt", + "micromatch-wrapper": "bin/micromatch-wrapper" }, "devDependencies": { "npm-run-all": "4.1.5" diff --git a/package.json b/package.json index 98e70898a..e31dc4b25 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,8 @@ "test:binwrap-binary": "node ./bin/mbt" }, "bin": { - "mbt": "bin/mbt" + "mbt": "bin/mbt", + "micromatch-wrapper": "bin/micromatch-wrapper" }, "repository": { "type": "git", diff --git a/run_test.sh b/run_test.sh new file mode 100644 index 000000000..e331498e3 --- /dev/null +++ b/run_test.sh @@ -0,0 +1,57 @@ +#!/bin/sh + +go build + +# ./cloud-mta-build-tool.exe build -s /c/Workspace/MTA/cloud-mta-build-tool/cmd/testdata/mta -b sbom-gen-result/merged.bom.xml + +# ./cloud-mta-build-tool.exe build -s cmd/testdata/mta -b sbom-gen-result/merged.bom.xml + +# ./cloud-mta-build-tool.exe build -s /c/Workspace/MTA/cloud-mta-build-tool/cmd/testdata/mta -b /c/Workspace/MTA/cloud-mta-build-tool/cmd/testdata/mta/sbom-gen-result/merged.bom.xml + +# ./cloud-mta-build-tool.exe build -s cmd/testdata/mta -b /c/Workspace/MTA/cloud-mta-build-tool/cmd/testdata/mta/sbom-gen-result/merged.bom.xml + +# ./cloud-mta-build-tool.exe build -s cmd/testdata/mta-sbom -b sbom-gen-result/merged.bom.xml + +./cloud-mta-build-tool.exe build -s "C:\Workspace\MTA\cloud-mta-build-tool\cmd\testdata\mta" -b "sbom-gen-result\merged.bom.xml" + +./cloud-mta-build-tool.exe build -s "cmd\testdata\mta" -b "sbom-gen-result\merged.bom.xml" + +./cloud-mta-build-tool.exe build -s "C:\Workspace\MTA\cloud-mta-build-tool\cmd\testdata\mta" -b "C:\Workspace\MTA\cloud-mta-build-tool\cmd\testdata\mta\sbom-gen-result\merged.bom.xml" + +./cloud-mta-build-tool.exe build -s "cmd\testdata\mta" -b "C:\Workspace\MTA\cloud-mta-build-tool\cmd\testdata\mta\sbom-gen-result\merged.bom.xml" + +./cloud-mta-build-tool.exe sbom-gen -s /c/Workspace/MTA/cloud-mta-build-tool/cmd/testdata/mta -b sbom-gen-result/merged.bom.xml + +./cloud-mta-build-tool.exe sbom-gen -s cmd/testdata/mta -b sbom-gen-result/merged.bom.xml + +./cloud-mta-build-tool.exe sbom-gen -s /c/Workspace/MTA/cloud-mta-build-tool/cmd/testdata/mta -b /c/Workspace/MTA/cloud-mta-build-tool/cmd/testdata/mta/sbom-gen-result/merged.bom.xml + +./cloud-mta-build-tool.exe sbom-gen -s cmd/testdata/mta -b /c/Workspace/MTA/cloud-mta-build-tool/cmd/testdata/mta/sbom-gen-result/merged.bom.xml + + +./cloud-mta-build-tool.exe sbom-gen -s "C:\Workspace\MTA\cloud-mta-build-tool\cmd\testdata\mta" -b "sbom-gen-result\merged.bom.xml" + +./cloud-mta-build-tool.exe sbom-gen -s "cmd\testdata\mta" -b "sbom-gen-result\merged.bom.xml" + +./cloud-mta-build-tool.exe sbom-gen -s "C:\Workspace\MTA\cloud-mta-build-tool\cmd\testdata\mta" -b "C:\Workspace\MTA\cloud-mta-build-tool\cmd\testdata\mta\sbom-gen-result\merged.bom.xml" + +./cloud-mta-build-tool.exe sbom-gen -s "cmd\testdata\mta" -b "C:\Workspace\MTA\cloud-mta-build-tool\cmd\testdata\mta\sbom-gen-result\merged.bom.xml" + + + + +# ./cloud-mta-build-tool.exe build -s /c/Workspace/MTA/cloud-mta-build-tool/cmd/testdata/mta -b sbom-gen-result/merged.bom.xml + +# ./cloud-mta-build-tool.exe build -s /c/Workspace/MTA/cloud-mta-build-tool/nodejs-test-case -b sbom-gen-result/merged.bom.xml + +# ./cloud-mta-build-tool.exe build -s /c/Workspace/MTA/cloud-mta-build-tool/java-test-case -b sbom-gen-result/merged.bom.xml + +# ./cloud-mta-build-tool.exe sbom-gen -s /c/Workspace/MTA/cloud-mta-build-tool/go-test-case -b sbom-gen-result/merged.bom.xml + +# ./cloud-mta-build-tool.exe sbom-gen -s /c/Workspace/MTA/cloud-mta-build-tool/nodejs-test-case -b sbom-gen-result/merged.bom.xml + +# ./cloud-mta-build-tool.exe sbom-gen -s /c/Workspace/MTA/cloud-mta-build-tool/java-test-case -b sbom-gen-result/merged.bom.xml + +# ./cloud-mta-build-tool.exe build -s /c/Workspace/MTA/cf-mta-examples/blue-green-deploy-strategy/hello-blue -b sbom-gen-result/merged.bom.xml + +# ./cloud-mta-build-tool.exe sbom-gen -s /c/Workspace/MTA/cf-mta-examples/blue-green-deploy-strategy/hello-blue -b sbom-gen-result/merged.bom.xml \ No newline at end of file diff --git a/tag_branch.sh b/tag_branch.sh new file mode 100644 index 000000000..496787bc7 --- /dev/null +++ b/tag_branch.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +git tag --delete release +git push https://github.com/SAP/cloud-mta-build-tool.git --delete release + +git tag release +git push -u origin release + diff --git a/test/goss/goss_template.yaml b/test/goss/goss_template.yaml index 480f7e4da..bb06e24b8 100644 --- a/test/goss/goss_template.yaml +++ b/test/goss/goss_template.yaml @@ -33,7 +33,7 @@ command: mvn --version: exit-status: 0 stdout: - - Apache Maven 3.8 + - Apache Maven 3.9 # verify installed NODE version node --version: exit-status: 0