diff --git a/.babelrc b/.babelrc
deleted file mode 100644
index 0639bf76..00000000
--- a/.babelrc
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "presets": [
- "@babel/preset-env"
- ]
-}
\ No newline at end of file
diff --git a/.changeset/README.md b/.changeset/README.md
new file mode 100644
index 00000000..e5b6d8d6
--- /dev/null
+++ b/.changeset/README.md
@@ -0,0 +1,8 @@
+# Changesets
+
+Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works
+with multi-package repos, or single-package repos to help you version and publish your code. You can
+find the full documentation for it [in our repository](https://github.com/changesets/changesets)
+
+We have a quick list of common questions to get you started engaging with this project in
+[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md)
diff --git a/.changeset/config.json b/.changeset/config.json
new file mode 100644
index 00000000..2197cb75
--- /dev/null
+++ b/.changeset/config.json
@@ -0,0 +1,11 @@
+{
+ "$schema": "https://unpkg.com/@changesets/config@2.3.1/schema.json",
+ "changelog": "@changesets/cli/changelog",
+ "commit": false,
+ "fixed": [],
+ "linked": [],
+ "access": "restricted",
+ "baseBranch": "master",
+ "updateInternalDependencies": "patch",
+ "ignore": []
+}
diff --git a/.changeset/fluffy-oranges-end.md b/.changeset/fluffy-oranges-end.md
new file mode 100644
index 00000000..ffa8efc4
--- /dev/null
+++ b/.changeset/fluffy-oranges-end.md
@@ -0,0 +1,5 @@
+---
+"@ticketevolution/seatmaps-client": major
+---
+
+Updated dependencies, changed build tools and package structure
diff --git a/.eslintignore b/.eslintignore
deleted file mode 100644
index 45edcb7e..00000000
--- a/.eslintignore
+++ /dev/null
@@ -1,3 +0,0 @@
-build
-node_modules
-declarations
diff --git a/.eslintrc b/.eslintrc
index 02f5e267..52acf56b 100644
--- a/.eslintrc
+++ b/.eslintrc
@@ -4,44 +4,5 @@
"env": {
"node": true,
"browser": true
- },
- "extends": [
- "plugin:@typescript-eslint/recommended",
- "plugin:jest/recommended",
- "standard",
- "standard-react"
- ],
- "plugins": [
- "@typescript-eslint",
- "react"
- ],
- "settings": {
- "react": {
- "version": "16.8"
- }
- },
- "globals": {
- "fetchMock": "readonly"
- },
- "rules": {
- "no-unused-expressions": [
- "error",
- {
- "allowShortCircuit": true,
- "allowTernary": true
- }
- ],
- "no-plusplus": "off",
- "indent": "off",
- "@typescript-eslint/indent": [
- "error",
- 2
- ],
- "@typescript-eslint/explicit-function-return-type": "off",
- "@typescript-eslint/member-delimiter-style": "off",
- "@typescript-eslint/explicit-member-accessibility": "off",
- "react/react-in-jsx-scope": "off",
- "react/prop-types": "off",
- "camelcase": "off"
}
}
diff --git a/.github/actions/ci-checks/action.yml b/.github/actions/ci-checks/action.yml
new file mode 100644
index 00000000..b1f5ec3f
--- /dev/null
+++ b/.github/actions/ci-checks/action.yml
@@ -0,0 +1,19 @@
+name: "CI checks"
+runs:
+ using: "composite"
+ steps:
+ - name: Build
+ run: pnpm run build
+ shell: bash
+
+ - name: Typecheck
+ run: pnpm run check-ts
+ shell: bash
+
+ - name: Lint
+ run: pnpm run lint
+ shell: bash
+
+ - name: Test
+ run: pnpm run test
+ shell: bash
diff --git a/.github/actions/ci-setup/action.yml b/.github/actions/ci-setup/action.yml
new file mode 100644
index 00000000..35a640f3
--- /dev/null
+++ b/.github/actions/ci-setup/action.yml
@@ -0,0 +1,17 @@
+name: "CI setup"
+runs:
+ using: "composite"
+ steps:
+ - name: Use Node.js 18.x
+ uses: actions/setup-node@v3
+ with:
+ node-version: 18.x
+
+ - name: Use pnpm
+ uses: pnpm/action-setup@v2
+ with:
+ version: 8
+
+ - name: Install Dependencies
+ run: pnpm install --frozen-lockfile
+ shell: bash
diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml
new file mode 100644
index 00000000..7e98578f
--- /dev/null
+++ b/.github/workflows/checks.yml
@@ -0,0 +1,16 @@
+name: CI
+on:
+ push:
+ branches:
+ - master
+ pull_request:
+ branches:
+ - "**"
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+ - uses: ./.github/actions/ci-setup
+ - uses: ./.github/actions/ci-checks
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
new file mode 100644
index 00000000..6da39b81
--- /dev/null
+++ b/.github/workflows/publish.yml
@@ -0,0 +1,36 @@
+name: Publish
+on:
+ workflow_run:
+ workflows: ["CI"]
+ types:
+ - completed
+ push:
+ branches:
+ - master
+
+concurrency: ${{ github.workflow }}-${{ github.ref }}
+
+jobs:
+ publish:
+ if: github.repository == 'ticketevolution/seatmaps-client' && github.event.workflow_run.conclusion == 'success'
+ runs-on: ubuntu-latest
+ steps:
+ - name: Generate a token
+ id: generate_token
+ uses: actions/create-github-app-token@v1
+ with:
+ app-id: ${{ secrets.TEVO_GITHUB_TOKEN_GENERATOR_APP_ID }}
+ private-key: ${{ secrets.TEVO_GITHUB_TOKEN_GENERATOR_PRIVATE_KEY }}
+
+ - uses: actions/checkout@v3
+
+ - uses: ./.github/actions/ci-setup
+
+ - name: Create Release Pull Request or Publish
+ id: changesets
+ uses: changesets/action@v1
+ with:
+ publish: pnpm run release
+ env:
+ GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }}
+ NPM_TOKEN: ${{ secrets.TEVO_NPM_TOKEN }}
diff --git a/.gitignore b/.gitignore
index 584c2739..e3a5a91e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,3 +22,9 @@ cors.json
src/parse.js
.eslintcache
.stlelintcache
+
+stats
+cjs
+esm
+umd
+.turbo
diff --git a/.husky/pre-push b/.husky/pre-push
new file mode 100644
index 00000000..e7315c06
--- /dev/null
+++ b/.husky/pre-push
@@ -0,0 +1,4 @@
+#!/usr/bin/env sh
+. "$(dirname -- "$0")/_/husky.sh"
+
+pnpm run pre-push-hook
diff --git a/.nvm b/.nvm
index f9fb144f..b460d6f2 100644
--- a/.nvm
+++ b/.nvm
@@ -1 +1 @@
-10.15.0
+18.12.1
diff --git a/.prettierrc.cjs b/.prettierrc.cjs
new file mode 100644
index 00000000..f9913aca
--- /dev/null
+++ b/.prettierrc.cjs
@@ -0,0 +1,4 @@
+/** @type {import("prettier").Config} */
+module.exports = {
+ endOfLine: 'lf',
+};
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 00000000..216b1c58
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,44 @@
+# Contributing
+
+Thanks for your interest in @ticketevolution/seatmaps-client. All forms of contribution are
+welcome, from issue reports to PRs and documentation / write-ups.
+
+## Development
+
+This repository uses a monorepo structure and consists of multiple packages.
+
+### Tooling
+
+- [PNPM](https://pnpm.io/) to manage packages and dependencies
+- [Turborepo](https://turbo.build/) to simplify running scripts in monorepo and configure scripts dependencies.
+- [Tsup](https://tsup.egoist.dev/) to bundle packages
+- [Testing Library](https://testing-library.com/) for testing components and
+ hooks
+- [Changesets](https://github.com/atlassian/changesets) for changes
+ documentation, changelog generation, and release management.
+
+### Commands
+
+**`pnpm install`**: installs project dependencies
+
+**`pnpm dev`**: starts dev environment
+
+**`pnpm run-examples`**: starts http servers for usage examples
+
+**`pnpm changeset`**: create a new changeset to describe the changes you are making in the PR. NOTE: do not update package versions manually, changeset will do the correct bump in release PR based on accumulated changes.
+
+**`pnpm build`**: run build for all publishable packages.
+
+**`pnpm test`**: run test for all packages.
+
+## NPM Release
+
+This project uses [Changesets](https://github.com/atlassian/changesets) to manage npm releases.
+
+For new version of the package to be released:
+
+1. PR with changes and a new changeset file should be merged to the master branch.
+
+2. Changeset github action will then open a new PR with all changesets merged into a chengelog and package versions changed.
+
+3. Once PR with updated changelog is merged, changeset github action will publish all changed packages.
diff --git a/Makefile b/Makefile
index 1e1818a0..ad8c6bd3 100644
--- a/Makefile
+++ b/Makefile
@@ -18,32 +18,22 @@ RESET_COLOR=\x1b[0m
help:
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
-install: ## Install client and server side packages for development
+install: ## Install packages for development
@echo "Installing project dependencies..."
- npm install
+ pnpm install
-clean: ## Remove temporary files generated by the build and tests
- rm -rf ./coverage
- rm -rf ./build
-
-clean-all: clean ## Remove all temporary files plus installed dependencies
- rm -rf ./node_modules
-
-start: build ## Start the development server
+dev: ## Start the development server
@echo "\n\n\nStarting development server...\n\n\n"
- npm start
+ pnpm dev
-build: install clean ## Build the project
- npm run check
- npm run build
+lint: ## Lint with eslint
+ pnpm lint
-analyze: ## Run the webpack analyzer
- npm analyze
- @echo "\nOpen $(MAGENTA_COLOR)http://webpack.github.io/analyse/$(RESET_COLOR) in your browser and upload the stats.json file!"
- @echo "$(BLUE_COLOR)(Tip: CMD + double-click the link!)$(RESET_COLOR)\n"
+check-ts: ## Check ts types
+ pnpm check-ts
-copy-to-shell: build ## Build seatmaps and drop it into your local Shell instance
- docker cp build/. shell_app_1:/usr/src/shell/node_modules/ticket-evolution-seatmaps/build
+test: ## Run jest tests
+ pnpm test
-copy-to-core: build ## Build seatmaps and drop it into your local Core instance
- cp -r build /Users/Shared/workspace/pos/node_modules/ticket-evolution-seatmaps
+build: ## Build the project
+ pnpm build
diff --git a/README.md b/README.md
index 321abb8e..eb954f02 100644
--- a/README.md
+++ b/README.md
@@ -7,7 +7,6 @@
[![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com)
[![Known Vulnerabilities](https://snyk.io/test/github/ticketevolution/seatmaps-client/badge.svg?targetFile=package.json)](https://snyk.io/test/github/ticketevolution/seatmaps-client?targetFile=package.json)
-
A client side JavaScript library that enables users to view seatmaps for available tickets on Ticket Evolution by:
1. Fetching the map SVG and manifest JSON, with the given `venueId` and `configurationId`, from Ticket Evolution AWS S3 buckets using the `mapsDomain` (defaults to maps.ticketevolution.com).
@@ -15,7 +14,7 @@ A client side JavaScript library that enables users to view seatmaps for availab
1. Color map sections according to the `sectionPercentile` configurations and the available `ticketGroups` (and any `selectedSections` if provided).
1. Render a tooltip when the user hovers over a section, which will provide quantity and price information.
-*Note: Sections will not color and you will not be able to highlight/toggle sections via the map or the API until ticket groups are supplied to the map, either through `ticketGroups` configuration or `updateTicketGroups` API.*
+_Note: Sections will not color and you will not be able to highlight/toggle sections via the map or the API until ticket groups are supplied to the map, either through `ticketGroups` configuration or `updateTicketGroups` API._
After instantiation, a [public API](#public-api) is available with a limited number of functions to interact with the map.
@@ -34,24 +33,26 @@ wget https://raw.githubusercontent.com/ticketevolution/seatmaps-client/master/bu
### 2. Load `tevomaps.js`, create a map root, and build a map
```html
-
+
```
@@ -74,23 +75,25 @@ yarn add @ticketevolution/seatmaps-client
```js
// main.js
-import Tevomaps from '@ticketevolution/seatmaps-client'
+import Tevomaps from "@ticketevolution/seatmaps-client";
// create a new seatmap
const seatmap = new Tevomaps({
- venueId: '10',
- configurationId: '1046',
- ticketGroups: [{
- tevo_section_name: 'upper end zone 232',
- retail_price: 100
- }]
+ venueId: "10",
+ configurationId: "1046",
+ ticketGroups: [
+ {
+ tevo_section_name: "upper end zone 232",
+ retail_price: 100,
+ },
+ ],
});
// turn element with ID of 'my-map' into a seatmap for config 1046
-const seatmapApi = seatmap.build('my-map');
+const seatmapApi = seatmap.build("my-map");
// perform some actions, like highlighting section "upper end zone 232"
-seatmapApi.highlightSection('upper end zone 232')
+seatmapApi.highlightSection("upper end zone 232");
```
## API Reference
@@ -102,15 +105,15 @@ seatmapApi.highlightSection('upper end zone 232')
Options:
| Name | Required | Type | Default Value | Description |
-|-----------------------|----------|--------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| --------------------- | -------- | ------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `venueId` | ✓ | `string` | | Ticket Map Venue ID |
| `configurationId` | ✓ | `string` | | Ticket Map Configuration ID |
| `sectionPercentiles` | | `object` | `{`
`'0.2': '#FFC515',`
`'0.4': '#f2711c',`
`'0.6': '#D6226A',`
`'0.8': '#a333c8',`
`'1': '#2A6EBB'`
`}` | Define percentiles to color sections based on their average ticket group price. Ticket groups which fall within a given range will display the associated color on the map for their section.
ie. Given an event with 100 ticket groups, with each ticket group price incrementing by $1 from $100 to $200, a section whose average ticket group price is $110 will be displayed as `#FFC515`, and a section whose average price of $175 will be displayed as `#a333c8`. |
| `mapFontFamily` | | `string` | | Set a default font for the map. Native browser fonts available, a list below is provided but results may vary depending upon the browser and browser version.
• Helvetica
• Arial
• Times
• Times New Roman
• Courier
• Courier New
• Verdana
• Tahoma |
| `mapsDomain` | | `string` | `https://maps.ticketevolution.com` | The domain from which map SVGs and manifests will be fetched. To pull maps from the development environment, use `https://maps-dev.ticketevolution.com` |
-| `onSelection` | | `function` | | A function which will be called by Tevomaps when a section of the map has been clicked. It will pass as arguments an array of all currently selected section IDs and expect nothing back.
`onSelection: function (sectionIds) {`
`console.log(sectionIds); //=> ['id-1','id-2']`
`}`
*Note: This method is also called when a section is deselected. If all sections are deselected, the `sectionIds` array will be empty.*
*Note: This method will always return lower case section names, you will need to take that in consideration when you do string comparisons.* |
+| `onSelection` | | `function` | | A function which will be called by Tevomaps when a section of the map has been clicked. It will pass as arguments an array of all currently selected section IDs and expect nothing back.
`onSelection: function (sectionIds) {`
`console.log(sectionIds); //=> ['id-1','id-2']`
`}`
_Note: This method is also called when a section is deselected. If all sections are deselected, the `sectionIds` array will be empty._
_Note: This method will always return lower case section names, you will need to take that in consideration when you do string comparisons._ |
| `selectedSections` | | `string[]` | `[]` | An array of section IDs for the map to initially highlight by default when it is rendered. |
-| `ticketGroups` | | [`TicketGroup[]`](#interfaces) | `[]` | An array of ticket groups to be used for section pricing. Expects each ticket group to adhere to the [TicketGroup interface](#interfaces). This API was designed for you to directly pass into the client library the response from the [Ticket Evolution `/v9/listings` endpoint](https://ticketevolution.atlassian.net/wiki/spaces/API/pages/2853797930/Listings+Index). |
+| `ticketGroups` | | [`TicketGroup[]`](#interfaces) | `[]` | An array of ticket groups to be used for section pricing. Expects each ticket group to adhere to the [TicketGroup interface](#interfaces). This API was designed for you to directly pass into the client library the response from the [Ticket Evolution `/v9/listings` endpoint](https://ticketevolution.atlassian.net/wiki/spaces/API/pages/2853797930/Listings+Index). |
| `showControls` | | `boolean` | `true` | When set to true, the map controls (the zoom in, zoom out, reset zoom, and clear selection buttons) will be visible. |
| `showLegend` | | `boolean` | `true` | When set to true, the map legend will be visible. |
| `mouseControlEnabled` | | `boolean` | `true` | When set to true, the map will respond to mouse events (such as click, move, and hover). |
@@ -138,55 +141,5 @@ This is the same effect used for clicking on a section to deselect it. It revert
# Interfaces
| Name | Properties |
-|-------------|-----------------------------------------------------------------------------------------------------------------------|
+| ----------- | --------------------------------------------------------------------------------------------------------------------- |
| TicketGroup | `{`
`tevo_section_name: string;`
`retail_price: number;`
`}` |
-
-# Contributing & Development
-
-The below instructions will get the project up and running on your local machine for development and testing purposes.
-
-## System Prerequisites
-
-- `node`
-- `yarn`
-- `make`
-- `git`
-
-## Using `make`
-
-We've made the startup process simple by using a Makefile for all common workflows.
-
-To see what Makefile commands are available, in your terminal shell run `make` or `make help`. It will list all the available Makefile commands with their descriptions.
-
-| Target | Effect |
-|-----------|---------------------------------------------------------|
-| `help` | Display all other make targets and their effects |
-| `install` | Install client and server side packages for development |
-| `start` | Start the development server |
-
-## Using `yarn` or `npm`
-
-A slew of npm/yarn scripts are also present to make development a bit easier:
-
-| Script | Effect |
-|-----------|-------------------------------------------------------------------------------------|
-| `build` | Compiles and bundles all source into `build/tevomaps.js` and `build/tevomaps.js.gz` |
-| `watch` | Builds the project, then watches source files for changes (rebuilds on each change) |
-| `start` | Starts the `using-module` example using `webpack-dev-server` |
-| `analyze` | Analyses the build process that would create `build/tevomaps.js` |
-| `lint` | Uses `eslint` to lint all source code |
-
-# Contributing Cont.
-
-Once you have completed the above steps, contribution to the repository is as follows:
-
-1. Create an issue on GitHub to address your concerns
-1. In the issue state the feature request or problem (give exact steps for replicating problems)
-1. Give a detailed description of a solution to the problem or the behavior of the feature request
-1. If you plan to submit a PR then create a branch named as such `-`
-1. should be 2-3 words that can most accurately describe the intent of the code in the branch
-1. Write the code to create the feature or address the problem
-1. Before opening a PR against master: run `npm run build` and bump the version number in the package.json according to (semantic versioning rules)[https://semver.org]
-1. Open a PR of your branch against master
-1. Respond to any comments
-1. When all checks are passing and you have received a :+1:, squash & merge your PR
diff --git a/build/tevomaps.js b/build/tevomaps.js
deleted file mode 100644
index f9f3cca9..00000000
--- a/build/tevomaps.js
+++ /dev/null
@@ -1,30 +0,0 @@
-!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports["ticket-evolution-seatmaps"]=t():e.Tevomaps=t()}(window,(function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/",n(n.s=125)}([function(e,t,n){"use strict";e.exports=n(146)},function(e,t,n){e.exports=n(169)()},function(e,t,n){var r=n(57)("wks"),o=n(47),i=n(4).Symbol,a="function"==typeof i;(e.exports=function(e){return r[e]||(r[e]=a&&i[e]||(a?i:o)("Symbol."+e))}).store=r},function(e,t,n){"use strict";var r=n(62),o="object"==typeof self&&self&&self.Object===Object&&self,i=r.a||o||Function("return this")();t.a=i},function(e,t){var n=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(e,t,n){"use strict";var r=Array.isArray;t.a=r},function(e,t,n){"use strict";n(113),n(111),n(38),n(83),n(39),n(23),n(16),n(24),n(34),n(21),n(112),n(81);function r(e,t){return e===t}function o(e,t,n){if(null===t||null===n||t.length!==n.length)return!1;for(var r=t.length,o=0;o1&&void 0!==arguments[1]?arguments[1]:r,n=null,i=null;return function(){return o(t,n,arguments)||(i=e.apply(null,arguments)),n=arguments,i}}function a(e){var t=Array.isArray(e[0])?e[0]:e;if(!t.every((function(e){return"function"==typeof e}))){var n=t.map((function(e){return typeof e})).join(", ");throw new Error("Selector creators expect all input-selectors to be functions, instead received the following types: ["+n+"]")}return t}function u(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1?arguments[1]:void 0,n=Object.entries(e).map((function(e){var t=p(e,2),n=t[0],r=t[1];return{percentile:parseFloat(n),color:r,min:0,max:0,ticketGroups:[]}})).sort((function(e,t){return e.percentile-t.percentile})),r=0;ro){s.ticketGroups.push(t[r]);break}}}catch(e){a=!0,u=e}finally{try{i||null==c.return||c.return()}finally{if(a)throw u}}}return n.forEach((function(e){e.ticketGroups.length>0&&(e.min=e.ticketGroups[0].retail_price,e.max=e.ticketGroups[e.ticketGroups.length-1].retail_price)})),n})),w=v(m,(function(e){return e.reduce((function(e,t){return function(e){for(var t=1;to;)$(e,n=r[o++],t[n]);return e},q=function(e){var t=R.call(this,e=M(e,!0));return!(this===Y&&o(F,e)&&!o(W,e))&&(!(t||!o(this,e)||!o(F,e)||o(this,A)&&this[A][e])||t)},K=function(e,t){if(e=x(e),t=M(t,!0),e!==Y||!o(F,t)||o(W,t)){var n=C(e,t);return!n||!o(F,t)||o(e,A)&&e[A][t]||(n.enumerable=!0),n}},J=function(e){for(var t,n=N(x(e)),r=[],i=0;n.length>i;)o(F,t=n[i++])||t==A||t==l||r.push(t);return r},ee=function(e){for(var t,n=e===Y,r=N(n?W:x(e)),i=[],a=0;r.length>a;)!o(F,t=r[a++])||n&&!o(Y,t)||i.push(F[t]);return i};H||(u((P=function(){if(this instanceof P)throw TypeError("Symbol is not a constructor!");var e=p(arguments.length>0?arguments[0]:void 0),t=function(n){this===Y&&t.call(W,n),o(this,A)&&o(this[A],e)&&(this[A][e]=!1),G(this,e,k(1,n))};return i&&B&&G(Y,e,{configurable:!0,set:t}),V(e)}).prototype,"toString",(function(){return this._k})),S.f=K,O.f=$,n(78).f=E.f=J,n(51).f=q,T.f=ee,i&&!n(46)&&u(Y,"propertyIsEnumerable",q,!0),h.f=function(e){return V(d(e))}),a(a.G+a.W+a.F*!H,{Symbol:P});for(var te="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),ne=0;te.length>ne;)d(te[ne++]);for(var re=L(d.store),oe=0;re.length>oe;)v(re[oe++]);a(a.S+a.F*!H,"Symbol",{for:function(e){return o(U,e+="")?U[e]:U[e]=P(e)},keyFor:function(e){if(!Z(e))throw TypeError(e+" is not a symbol!");for(var t in U)if(U[t]===e)return t},useSetter:function(){B=!0},useSimple:function(){B=!1}}),a(a.S+a.F*!H,"Object",{create:function(e,t){return void 0===t?j(e):X(j(e),t)},defineProperty:$,defineProperties:X,getOwnPropertyDescriptor:K,getOwnPropertyNames:J,getOwnPropertySymbols:ee});var ie=c((function(){T.f(1)}));a(a.S+a.F*ie,"Object",{getOwnPropertySymbols:function(e){return T.f(w(e))}}),z&&a(a.S+a.F*(!H||c((function(){var e=P();return"[null]"!=I([e])||"{}"!=I({a:e})||"{}"!=I(Object(e))}))),"JSON",{stringify:function(e){for(var t,n,r=[e],o=1;arguments.length>o;)r.push(arguments[o++]);if(n=t=r[1],(b(t)||void 0!==e)&&!Z(e))return m(t)||(t=function(e,t){if("function"==typeof n&&(t=n.call(this,e,t)),!Z(t))return t}),r[1]=t,I.apply(z,r)}}),P.prototype[D]||n(20)(P.prototype,D,P.prototype.valueOf),f(P,"Symbol"),f(Math,"Math",!0),f(r.JSON,"JSON",!0)},function(e,t,n){"use strict";var r=n(8),o=Object.prototype,i=o.hasOwnProperty,a=o.toString,u=r.a?r.a.toStringTag:void 0;var l=function(e){var t=i.call(e,u),n=e[u];try{e[u]=void 0;var r=!0}catch(e){}var o=a.call(e);return r&&(t?e[u]=n:delete e[u]),o},c=Object.prototype.toString;var s=function(e){return c.call(e)},f="[object Null]",p="[object Undefined]",d=r.a?r.a.toStringTag:void 0;t.a=function(e){return null==e?void 0===e?p:f:d&&d in Object(e)?l(e):s(e)}},function(e,t,n){var r=n(4),o=n(20),i=n(30),a=n(47)("src"),u=n(131),l=(""+u).split("toString");n(29).inspectSource=function(e){return u.call(e)},(e.exports=function(e,t,n,u){var c="function"==typeof n;c&&(i(n,"name")||o(n,"name",t)),e[t]!==n&&(c&&(i(n,a)||o(n,a,e[t]?""+e[t]:l.join(String(t)))),e===r?e[t]=n:u?e[t]?e[t]=n:o(e,t,n):(delete e[t],o(e,t,n)))})(Function.prototype,"toString",(function(){return"function"==typeof this&&this[a]||u.call(this)}))},function(e,t,n){"use strict";var r=Function.prototype.toString;t.a=function(e){if(null!=e){try{return r.call(e)}catch(e){}try{return e+""}catch(e){}}return""}},function(e,t,n){var r=n(15),o=n(48);e.exports=n(12)?function(e,t,n){return r.f(e,t,o(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t,n){"use strict";var r=n(56),o={};o[n(2)("toStringTag")]="z",o+""!="[object z]"&&n(18)(Object.prototype,"toString",(function(){return"[object "+r(this)+"]"}),!0)},function(e,t,n){var r=n(99),o=n(45);e.exports=function(e){return r(o(e))}},function(e,t,n){n(101)("asyncIterator")},function(e,t,n){for(var r=n(34),o=n(33),i=n(18),a=n(4),u=n(20),l=n(49),c=n(2),s=c("iterator"),f=c("toStringTag"),p=l.Array,d={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},h=o(d),v=0;v-1};var s=function(e,t){var n=this.__data__,r=i(n,e);return r<0?(++this.size,n.push([e,t])):n[r][1]=t,this};function f(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t=e.length?(this._t=void 0,o(1)):o(0,"keys"==t?n:"values"==t?e[n]:[n,e[n]])}),"values"),i.Arguments=i.Array,r("keys"),r("values"),r("entries")},function(e,t,n){"use strict";t.a=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},function(e,t,n){"use strict";var r=n(11),o=Object(r.a)(Object,"create");var i=function(){this.__data__=o?o(null):{},this.size=0};var a=function(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t},u="__lodash_hash_undefined__",l=Object.prototype.hasOwnProperty;var c=function(e){var t=this.__data__;if(o){var n=t[e];return n===u?void 0:n}return l.call(t,e)?t[e]:void 0},s=Object.prototype.hasOwnProperty;var f=function(e){var t=this.__data__;return o?void 0!==t[e]:s.call(t,e)},p="__lodash_hash_undefined__";var d=function(e,t){var n=this.__data__;return this.size+=this.has(e)?0:1,n[e]=o&&void 0===t?p:t,this};function h(e){var t=-1,n=null==e?0:e.length;for(this.clear();++tf;)void 0!==(n=l(r,t=c[f++]))&&u(s,t,n);return s}})},function(e,t,n){var r=n(28),o=n(33);n(152)("keys",(function(){return function(e){return o(r(e))}}))},function(e,t,n){"use strict";t.a=function(e,t){return e===t||e!=e&&t!=t}},function(e,t,n){"use strict";var r=9007199254740991;t.a=function(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=r}},function(e,t,n){"use strict";t.a=function(e){var t=-1,n=Array(e.size);return e.forEach((function(e){n[++t]=e})),n}},function(e,t,n){"use strict";var r=9007199254740991,o=/^(?:0|[1-9]\d*)$/;t.a=function(e,t){var n=typeof e;return!!(t=null==t?r:t)&&("number"==n||"symbol"!=n&&o.test(e))&&e>-1&&e%1==0&&e0?o(r(e),9007199254740991):0}},function(e,t){var n=Math.ceil,r=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?r:n)(e)}},function(e,t,n){var r=n(37),o=n(2)("toStringTag"),i="Arguments"==r(function(){return arguments}());e.exports=function(e){var t,n,a;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),o))?n:i?r(t):"Object"==(a=r(t))&&"function"==typeof t.callee?"Arguments":a}},function(e,t,n){var r=n(29),o=n(4),i=o["__core-js_shared__"]||(o["__core-js_shared__"]={});(e.exports=function(e,t){return i[e]||(i[e]=void 0!==t?t:{})})("versions",[]).push({version:r.version,mode:n(46)?"pure":"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})},function(e,t,n){var r=n(7);r(r.S+r.F,"Object",{assign:n(138)})},function(e,t){t.f=Object.getOwnPropertySymbols},function(e,t,n){var r=n(9),o=n(142),i=n(76),a=n(75)("IE_PROTO"),u=function(){},l=function(){var e,t=n(69)("iframe"),r=i.length;for(t.style.display="none",n(95).appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write("
+