From 1ff6c8b8fc1bd03c8089dff4d8f783e9c555ddeb Mon Sep 17 00:00:00 2001 From: Alex Terentiev Date: Thu, 31 Jan 2019 22:06:09 -0800 Subject: [PATCH 01/42] progress control - work in progress --- package-lock.json | 28 +++++---- src/controls/progress/Action.tsx | 54 ++++++++++++++++ src/controls/progress/IProgress.ts | 38 ++++++++++++ src/controls/progress/Progress.module.scss | 72 ++++++++++++++++++++++ src/controls/progress/Progress.tsx | 9 +++ 5 files changed, 189 insertions(+), 12 deletions(-) create mode 100644 src/controls/progress/Action.tsx create mode 100644 src/controls/progress/IProgress.ts create mode 100644 src/controls/progress/Progress.module.scss create mode 100644 src/controls/progress/Progress.tsx diff --git a/package-lock.json b/package-lock.json index e97c55099..d2e19ed08 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@pnp/spfx-controls-react", - "version": "1.11.0", + "version": "1.12.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -6487,12 +6487,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -6512,7 +6514,8 @@ "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", @@ -6660,6 +6663,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -9266,7 +9270,7 @@ "iconv-lite": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha1-90aPYBNfXl2tM5nAqBvpoWA6CCs=" + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" }, "icss-replace-symbols": { "version": "1.1.0", @@ -11534,7 +11538,7 @@ "nanomatch": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.7.tgz", - "integrity": "sha1-U81KoQn/aLf4aVkf3J0Q2u7qPnk=", + "integrity": "sha512-/5ldsnyurvEw7wNpxLFgjVvBLMta43niEYOy0CJ4ntcYSbx6bugRUTQeFb4BR/WanEL1o3aQgHuVLHQaB6tOqg==", "dev": true, "requires": { "arr-diff": "^4.0.0", @@ -11591,7 +11595,7 @@ "node-fetch": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha1-mA9vcthSEaU0fGsrwYxbhMPrR+8=", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", "requires": { "encoding": "^0.1.11", "is-stream": "^1.0.1" @@ -11627,7 +11631,7 @@ "node-libs-browser": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", - "integrity": "sha1-X5QmPUBPbkR2fXJpAf/wVHjWAN8=", + "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", "dev": true, "requires": { "assert": "^1.1.1", @@ -11702,7 +11706,7 @@ "node-sass": { "version": "4.7.2", "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.7.2.tgz", - "integrity": "sha1-k2Z3i6FGnrAUOKnoWS9CYry2eU4=", + "integrity": "sha512-CaV+wLqZ7//Jdom5aUFCpGNoECd7BbNhjuwdsX/LkXBrHl8eb1Wjw4HvWqcFvhr5KuNgAk8i/myf/MQ1YYeroA==", "dev": true, "requires": { "async-foreach": "^0.1.3", @@ -13510,7 +13514,7 @@ "promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "requires": { "asap": "~2.0.3" } @@ -14119,7 +14123,7 @@ "request": { "version": "2.83.0", "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", - "integrity": "sha1-ygtl2gLtYpNYh4COb1EDgQNOM1Y=", + "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", "dev": true, "requires": { "aws-sign2": "~0.7.0", @@ -16219,7 +16223,7 @@ "ua-parser-js": { "version": "0.7.17", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz", - "integrity": "sha1-6exflJi57JEOeuOsYmqAXE0J7Kw=" + "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==" }, "uglify-js": { "version": "2.8.29", @@ -16903,7 +16907,7 @@ "webpack": { "version": "3.5.6", "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.5.6.tgz", - "integrity": "sha1-pJL7bB7X9XOBb5DgDI+7WiDMXDY=", + "integrity": "sha512-sXnxfx6KoZVrFAGLjdhCCwDtDwkYMfwm8mJjkQv3thr5pjTlbxopVlr/kJwc9Bz317gL+gNjvz++ir9TgG1MDg==", "dev": true, "requires": { "acorn": "^5.0.0", diff --git a/src/controls/progress/Action.tsx b/src/controls/progress/Action.tsx new file mode 100644 index 000000000..5df738d3a --- /dev/null +++ b/src/controls/progress/Action.tsx @@ -0,0 +1,54 @@ +import * as React from 'react'; +import { IProgressActionInternal, ProgressActionState } from './IProgress'; +import styles from './Progress.module.scss'; +import { Spinner, SpinnerSize } from 'office-ui-fabric-react/lib/Spinner'; +import { Icon } from 'office-ui-fabric-react/lib/Icon'; +import { Label } from 'office-ui-fabric-react/lib/Label'; +import { css } from 'office-ui-fabric-react/lib/Utilities'; + +export class Action extends React.Component { + public render(): React.ReactElement { + const { + state, + subActionsTitles, + errorMessage, + title + } = this.props; + const inactive: boolean = state === ProgressActionState.notStarted; + const labelClassName = inactive ? css(styles.label, styles.inactive) : styles.label; + let iconName = ''; + let className = ''; + switch (state) { + case ProgressActionState.finished: + iconName = 'CheckMark'; + className = styles.successIcon; + break; + case ProgressActionState.notStarted: + iconName = 'CheckMark'; + className = styles.inactiveIcon; + break; + case ProgressActionState.errored: + iconName = 'Cancel'; + className = styles.errorIcon; + break; + } + return ( +
+
+ {iconName ? : } +
{title}
+
+ {subActionsTitles && +
+ {subActionsTitles.map(saTitle => { + return
{saTitle}
; + })} +
} + {state === ProgressActionState.errored && +
+ +
} +
+ ); + } +} \ No newline at end of file diff --git a/src/controls/progress/IProgress.ts b/src/controls/progress/IProgress.ts new file mode 100644 index 000000000..e2074c88b --- /dev/null +++ b/src/controls/progress/IProgress.ts @@ -0,0 +1,38 @@ +export interface IProgressActionExecutionResult { + hasError?: boolean; + isCriticalError?: boolean; + errorMessage?: boolean; + actionParameters?: any; +} + +export interface IProgressAction { + title: string; + subActionsTitles?: string[]; +} + +export enum ProgressActionState { + notStarted, + inProgress, + finished, + errored +} + +export interface IProgressActionInternal extends IProgressAction { + state: ProgressActionState; + errorMessage?: string; +} + +export interface IProgressProps { + title: string; + showOverallProgress: boolean; + actions: IProgressAction[]; + executeAction: (action: IProgressAction, actionParameters: any) => Promise; + onConfigurationComplete: () => void; + onConfigurationFailed: () => void; +} + +export interface IProgressState { + actions?: IProgressActionInternal[]; + currentStep?: number; + hasError?: boolean; +} \ No newline at end of file diff --git a/src/controls/progress/Progress.module.scss b/src/controls/progress/Progress.module.scss new file mode 100644 index 000000000..471fa3b8a --- /dev/null +++ b/src/controls/progress/Progress.module.scss @@ -0,0 +1,72 @@ +.actionContainer { + margin-bottom: 20px; + + .actionHeader { + display: flex; + + .actionIcon { + margin-right: 8px; + line-height: 16px; + font-size: 16px; + flex-shrink: 0; + font-weight: 700; + + &.successIcon { + color: "[theme: accent, default: #038387]"; + } + + &.errorIcon { + color: "[theme: errorText, default: #a80000]"; + } + + &.inactiveIcon { + color: "[theme: disableSubtext, default: #d0d0d0]" + } + } + + .spinner { + display: inline-block; + } + .label { + font-size: 14px; + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0; + overflow-wrap: break-word; + word-wrap: break-word; + line-height: 16px; + color: "[theme: bodyText, default: #333333]"; + + &.inactive { + color: "[theme: disabledBodyText, default: #a6a6a6]"; + } + + } + } + + .errorContainer { + margin-top: 8px; + + .errorMessage { + margin-left: 24px; + color: "[theme: errorText, default: #a80000]"; + line-height: 14px; + font-size: 14px; + font-weight: 700; + } + } + + .subActionsContainer { + margin-top: 8px; + + .label { + color: "[theme: bodySubtext, default: #666666]"; + margin-left: 24px; + font-size: 11px; + + &.inactive { + color: "[theme: disabledBodySubtext, default: #666666]"; + } + } + } +} \ No newline at end of file diff --git a/src/controls/progress/Progress.tsx b/src/controls/progress/Progress.tsx new file mode 100644 index 000000000..8f4fcf93d --- /dev/null +++ b/src/controls/progress/Progress.tsx @@ -0,0 +1,9 @@ +import * as React from 'react'; +import { IProgressProps, IProgressState } from './IProgress'; + +export class Progress extends React.Component { + constructor(props: IProgressProps) { + super(props); + } + +} \ No newline at end of file From 3b5ebe7d15e11ce187e974261e199abd60c377d1 Mon Sep 17 00:00:00 2001 From: Alex Terentiev Date: Fri, 1 Feb 2019 16:38:45 -0800 Subject: [PATCH 02/42] Progress component - done --- docs/documentation/docs/assets/Progress.png | Bin 0 -> 36580 bytes docs/documentation/docs/controls/Map.md | 2 +- docs/documentation/docs/controls/Progress.md | 116 + .../docs/controls/SecurityTrimmedControl.md | 2 +- docs/documentation/docs/index.md | 12 +- docs/documentation/mkdocs.yml | 7 +- package-lock.json | 4466 +++++++++-------- src/Progress.ts | 1 + src/controls/progress/Action.tsx | 25 +- src/controls/progress/IProgress.ts | 127 +- src/controls/progress/Progress.module.scss | 143 +- src/controls/progress/Progress.tsx | 155 +- src/controls/progress/index.ts | 2 + src/loc/en-us.ts | 2 +- .../controlsTest/components/ControlsTest.tsx | 279 +- .../components/IControlsTestProps.ts | 3 + 16 files changed, 2917 insertions(+), 2425 deletions(-) create mode 100644 docs/documentation/docs/assets/Progress.png create mode 100644 docs/documentation/docs/controls/Progress.md create mode 100644 src/Progress.ts create mode 100644 src/controls/progress/index.ts diff --git a/docs/documentation/docs/assets/Progress.png b/docs/documentation/docs/assets/Progress.png new file mode 100644 index 0000000000000000000000000000000000000000..cbac3a4bcc729f07604f058af9bc59f01adf8338 GIT binary patch literal 36580 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 B6UYDn literal 0 HcmV?d00001 diff --git a/docs/documentation/docs/controls/Map.md b/docs/documentation/docs/controls/Map.md index c1cd3a0ea..5a00ba4c4 100644 --- a/docs/documentation/docs/controls/Map.md +++ b/docs/documentation/docs/controls/Map.md @@ -1,6 +1,6 @@ # Map control -This control renders can be used to render a map in your solution. The control has also the ability to search for new locations. +This control renders a map in your solution. The control has also the ability to search for new locations. Here is an example of the control in action: diff --git a/docs/documentation/docs/controls/Progress.md b/docs/documentation/docs/controls/Progress.md new file mode 100644 index 000000000..ad79bd85d --- /dev/null +++ b/docs/documentation/docs/controls/Progress.md @@ -0,0 +1,116 @@ +# Progress control + +This control shows progress of multiple SEQUENTIALLY executed actions. + +Here is an example of the control in action: + +![Progress control](../assets/Progress.png) + +## How to use this control in your solutions + +- Check that you installed the `@pnp/spfx-controls-react` dependency. Check out the [getting started](../#getting-started) page for more information about installing the dependency. +- Import the following modules to your component: + +```TypeScript +import { Progress } from "@pnp/spfx-controls-react/lib/Progress"; +``` + +- Use the `Progress` control in your code as follows: + +```TypeScript + +``` + +**Note**: the control itself is not responsible for actions' execution. It only renders the actions, overall progress and actions' execution states. +When using the control, you should implement actions execution. +As example, you can have a base class that implements `IProgressAction` interface and has an `execute` method: +```TypeScript +class BaseAction implements IProgressAction { + public get title(): string { ... } + public get subActionsTitles(): string[] { ... } + public get hasError(): boolean { ... } + public get errorMessage(): string { ... } + public async execute(): Promise { ... } +} +``` + +Then, you have multiple actions derived from the base one: +```TypeScript +class FirstAction extends BaseAction { + public async execute(): Promise { + // implementation for FirstAction + } +} + +class SecondAction extends BaseAction { + public async execute(): Promise { + // implementation for SecondAction + } +} +``` + +Now, in a component, where `Progress` is used you can have code as below: +```TypeScript + +export interface IYourComponentState { + actions: IProgressAction[]; + currentActionIndex?: number; + // other state properties +} + +// ... + +export class YourComponent extends React.Component { + // all other code, including render with Progress reference listed above + + private _initActions() { + this.setState({ + actions: [ + new FirstAction(), + new SecondAction() + ] + }); + } + + private async _execute() { + for (let i = 0; i <= this.state.actions.length; i++) { + this.setState( + currentActionIndex: i + ); + + if (i < this.state.actions.length) { + await this.state.actions[i].execute(); + } + } + } +} +``` + +## Implementation + +The IFrameDialog component can be configured with the following properties: + +| Property | Type | Required | Description | +| ---- | ---- | ---- | ---- | +| title | string | no | Title, or header, of the progress. | +| showOverallProgress | boolean | true | Specifies if overall progress indicator should be shown. | +| showIndeterminateOverallProgress | boolean | no | Specifies if indeterminate overall progress animation will be shown. | +| hideNotStartedActions | boolean | yes | Specifies if not started actions should not be rendered. | +| actions | IProgressAction[] | yes | Progress actions | +| currentActionIndex | number | no | Index of currently executing action | +| heigth | string | no | Height of the component | +| longRunningText | string | no | Text to be displayed for long running operations | +| longRunningTextDisplayDelay | number | no | Delay until longRunningText is displayed im milliseconds. If not set or 0 longRunningText is displayed right away. | +| className | string | no | Class name to be applied to the component | +| headerClassName | string | no | Header class name. Header contains title, progress indicator, and delay text | +| actionsContainerClassName | string | no | Actions container class name | +| actionClassName | string | no | Single action class name | \ No newline at end of file diff --git a/docs/documentation/docs/controls/SecurityTrimmedControl.md b/docs/documentation/docs/controls/SecurityTrimmedControl.md index a40bed0b5..236a80ee4 100644 --- a/docs/documentation/docs/controls/SecurityTrimmedControl.md +++ b/docs/documentation/docs/controls/SecurityTrimmedControl.md @@ -1,6 +1,6 @@ # SecurityTrimmedControl -This control is intended to be used when you want to show or hide components based on the user its permissions. The control can be used to check the user’s permissions on the current site / list were the solution is loaded, or on a remote site / list. +This control is intended to be used when you want to show or hide components based on the user permissions. The control can be used to check the user’s permissions on the current site / list were the solution is loaded, or on a remote site / list. ## How to use this control in your solutions diff --git a/docs/documentation/docs/index.md b/docs/documentation/docs/index.md index bbe4240f2..3d1a5be51 100644 --- a/docs/documentation/docs/index.md +++ b/docs/documentation/docs/index.md @@ -34,14 +34,20 @@ Once the package is installed, you will have to configure the resource file of t The following controls are currently available: +- [Charts](./controls/ChartControls) (makes it easy to integrate [Chart.js](https://www.chartjs.org/) charts into web part) - [FileTypeIcon](./controls/FileTypeIcon) (Control that shows the icon of a specified file path or application) +- [IFrameDialog](./controls/IFrameDialog) (renders a Dialog with an iframe as a content) +- [ListItemPicker](./controls/ListItemPicker) (allows to select one or more items from a list) +- [ListPicker](./controls/ListPicker) (allows to select one or multiple available lists/libraries of the current site) - [ListView](./controls/ListView) (List view control) -- [Placeholder](./controls/Placeholder) (Control that can be used to show an initial placeholder if the web part has to be configured) +- [Map](./controls/Map) (renders a map in a web part) +- [PeoplePicker](./controls/PeoplePicker) (People Picker) +- [Placeholder](./controls/Placeholder) (shows an initial placeholder if the web part has to be configured) +- [Progress](./controls/Progress) (shows progress of multiple SEQUENTIALLY executed actions) - [SiteBreadcrumb](./controls/SiteBreadcrumb) (Breadcrumb control) +- [SecurityTrimmedControl](./controls/SecurityTrimmedControl) (intended to be used when you want to show or hide components based on the user permissions) - [TaxonomyPicker](./controls/TaxonomyPicker) (Taxonomy Picker) -- [PeoplePicker](./controls/PeoplePicker) (People Picker) - [WebPartTitle](./controls/WebPartTitle) (Customizable web part title control) -- [IFrameDialog](./controls/IFrameDialog) (renders a Dialog with an iframe as a content) Field customizer controls: diff --git a/docs/documentation/mkdocs.yml b/docs/documentation/mkdocs.yml index c90672681..2b20e57dc 100644 --- a/docs/documentation/mkdocs.yml +++ b/docs/documentation/mkdocs.yml @@ -13,18 +13,19 @@ nav: - "Radar Chart": 'controls/charts/RadarChart.md' - "Scatter Chart": 'controls/charts/ScatterChart.md' - FileTypeIcon: 'controls/FileTypeIcon.md' + - IFrameDialog: 'controls/IFrameDialog.md' - ListItemPicker: 'controls/ListItemPicker.md' - ListPicker: 'controls/ListPicker.md' - ListView: 'controls/ListView.md' - "ListView: add a contextual menu": 'controls/ListView.ContextualMenu.md' - Map: 'controls/Map.md' + - PeoplePicker: 'controls/PeoplePicker.md' - Placeholder: 'controls/Placeholder.md' + - Progress: 'controls/Progress.md' - SiteBreadcrumb: 'controls/SiteBreadcrumb.md' - - WebPartTitle: 'controls/WebPartTitle.md' - SecurityTrimmedControl: 'controls/SecurityTrimmedControl.md' - TaxonomyPicker: 'controls/TaxonomyPicker.md' - - PeoplePicker: 'controls/PeoplePicker.md' - - IFrameDialog: 'controls/IFrameDialog.md' + - WebPartTitle: 'controls/WebPartTitle.md' - 'Field Controls': - 'Getting started': 'controls/fields/main.md' - FieldRendererHelper: 'controls/fields/FieldRendererHelper.md' diff --git a/package-lock.json b/package-lock.json index d2e19ed08..2fa36fcef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,23 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@babel/runtime": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.3.1.tgz", + "integrity": "sha512-7jGW8ppV0ant637pIqAcFfQDDH1orEPGJb8aXfUozuCU3QqX7rX4DA8iwrbPrR1hcH0FTTHz47yQnk+bl5xHQA==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.12.0" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", + "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==", + "dev": true + } + } + }, "@microsoft/api-extractor": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-3.2.3.tgz", @@ -131,6 +148,14 @@ "gulp-texttojs": "~1.0.3", "merge2": "~1.0.2", "postcss-modules": "~0.6.4" + }, + "dependencies": { + "@microsoft/load-themed-styles": { + "version": "1.7.84", + "resolved": "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.7.84.tgz", + "integrity": "sha512-MY0bNJHQRPA/ffFDCXnuOKg+LJwsAP/nX77gpSCBTNBYV5WwVT/QC6N65JXW9jmW6U0jXQ0FdvlUWeKp834/Ng==", + "dev": true + } } }, "@microsoft/gulp-core-build-serve": { @@ -206,9 +231,9 @@ } }, "@microsoft/load-themed-styles": { - "version": "1.7.28", - "resolved": "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.7.28.tgz", - "integrity": "sha1-FsZrbWASKuARx8nwJtOf1aqqvN8=" + "version": "1.8.56", + "resolved": "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.8.56.tgz", + "integrity": "sha512-C+ff/H6ArBYkSNQJrVL1ERRm+sNXh+cz1H5o3r/szZQ3IsnuqDNuUUkMlMeAoreEG8GALRNrtHoFDX7A9+VlRQ==" }, "@microsoft/loader-cased-file": { "version": "1.3.4", @@ -259,6 +284,12 @@ "loader-utils": "~1.1.0" }, "dependencies": { + "@microsoft/load-themed-styles": { + "version": "1.7.84", + "resolved": "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.7.84.tgz", + "integrity": "sha512-MY0bNJHQRPA/ffFDCXnuOKg+LJwsAP/nX77gpSCBTNBYV5WwVT/QC6N65JXW9jmW6U0jXQ0FdvlUWeKp834/Ng==", + "dev": true + }, "loader-utils": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", @@ -585,6 +616,12 @@ "integrity": "sha1-MEQ4FkfhHulzxa8uklMjkw9pHYA=", "dev": true }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, "debug": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", @@ -679,12 +716,28 @@ "dev": true }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } } }, "send": { @@ -729,6 +782,12 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", "dev": true + }, + "whatwg-fetch": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", + "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=", + "dev": true } } }, @@ -1081,6 +1140,12 @@ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.1.1.tgz", "integrity": "sha512-OaU1hHjgJf+b0NzsxCg7NdIYERD6Hy/PEmFLTjw+b65scuisG3Kt4QoTvJ66BBkPZ581gr0kpoVzKnxniM8nng==", "dev": true + }, + "whatwg-fetch": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", + "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=", + "dev": true } } }, @@ -1303,6 +1368,14 @@ "requires": { "@types/node": "6.0.62", "colors": "~1.1.2" + }, + "dependencies": { + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + } } }, "@pnp/common": { @@ -1343,13 +1416,6 @@ "integrity": "sha512-7Lr22EB6DgB8MZi0WDuou8VuXru3wHdiOQPenB2B2gdhp7bJj2ijN9vTiqF8aL1nh80uJxIyX269Ix/PSnJC7g==", "requires": { "whatwg-fetch": "2.0.4" - }, - "dependencies": { - "whatwg-fetch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", - "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" - } } }, "@sindresorhus/is": { @@ -1368,9 +1434,9 @@ } }, "@types/angular": { - "version": "1.6.42", - "resolved": "https://registry.npmjs.org/@types/angular/-/angular-1.6.42.tgz", - "integrity": "sha512-JKx/tYYWzVRGQs/FF9Jo55VsF9Vb4D2/CMS1M6fyWOI1dq0dLzt0obJfmxtbgBgjBVzcBJW0ikMJ8oz96Dx7Ow==", + "version": "1.6.53", + "resolved": "https://registry.npmjs.org/@types/angular/-/angular-1.6.53.tgz", + "integrity": "sha512-46op53S8hnDl9o6VOmMAXBv3laK8i2OyXOfriDwe6VRfh8wVFilIniLaNsz2pPpAM4oUwsBYFt7ZThe+IMnIeA==", "dev": true }, "@types/assertion-error": { @@ -1380,9 +1446,9 @@ "dev": true }, "@types/bluebird": { - "version": "3.5.20", - "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.20.tgz", - "integrity": "sha512-Wk41MVdF+cHBfVXj/ufUHJeO3BlIQr1McbHZANErMykaCWeDSZbH5erGjNBw2/3UlRdSxZbLfSuQTzFmPOYFsA==", + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.25.tgz", + "integrity": "sha512-yfhIBix+AIFTmYGtkC0Bi+XGjSkOINykqKvO/Wqdz/DuXlAKK7HmhLAXdPIGsV4xzKcL3ev/zYc4yLNo+OvGaw==", "dev": true }, "@types/chai": { @@ -1406,9 +1472,9 @@ "integrity": "sha512-yC8Ff5vsHFTClGCWXoAmNCh33cNYfP2/yFANBLjLiso4jTKsLfQ0KQuBEuKxOWTRoOSLyT6v+ZYcvz0uonvvsA==" }, "@types/cheerio": { - "version": "0.22.7", - "resolved": "https://registry.npmjs.org/@types/cheerio/-/cheerio-0.22.7.tgz", - "integrity": "sha512-+T9qBbqe/jXtTjzVddArZExahoPPmt8eq3O1ZuCKZXjBVxf/ciUYNXrIDZJEVgYvpELnv6VlPRCfLzufRxpAag==", + "version": "0.22.10", + "resolved": "https://registry.npmjs.org/@types/cheerio/-/cheerio-0.22.10.tgz", + "integrity": "sha512-fOM/Jhv51iyugY7KOBZz2ThfT1gwvsGCfWxpLpZDgkGjpEO4Le9cld07OdskikLjDUQJ43dzDaVRSFwQlpdqVg==", "dev": true }, "@types/colors": { @@ -1439,20 +1505,14 @@ "integrity": "sha1-O89E+x5Cnz33YYjIxth0Rjujcf0=", "dev": true }, - "@types/events": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-1.1.0.tgz", - "integrity": "sha512-y3bR98mzYOo0pAZuiLari+cQyiKk3UXRuT45h1RjhfeCzqkjaVsfZJNaxdgtk7/3tzOm1ozLTqEqMP3VbI48jw==", - "dev": true - }, "@types/express-serve-static-core": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.11.1.tgz", - "integrity": "sha512-EehCl3tpuqiM8RUb+0255M8PhhSwTtLfmO7zBBdv0ay/VTd/zmrqDfQdZFsa5z/PVMbH2yCMZPXsnrImpATyIw==", + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.16.1.tgz", + "integrity": "sha512-QgbIMRU1EVRry5cIu1ORCQP4flSYqLM1lS5LYyGWfKnFT3E58f0gKto7BR13clBFVrVZ0G0rbLZ1hUpSkgQQOA==", "dev": true, "requires": { - "@types/events": "*", - "@types/node": "*" + "@types/node": "*", + "@types/range-parser": "*" } }, "@types/finalhandler": { @@ -1563,9 +1623,9 @@ "dev": true }, "@types/mocha": { - "version": "2.2.47", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.47.tgz", - "integrity": "sha512-v/lko8AvmTt1K8p+ebdhdiHJE7zpPBYsDKjJSNCl8GwPGkKe5xND7s6M36LKye/USbWSPA7gYCDL0+DZ5h0L6Q==", + "version": "2.2.48", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz", + "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==", "dev": true }, "@types/node": { @@ -1598,6 +1658,12 @@ "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", "dev": true }, + "@types/range-parser": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", + "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", + "dev": true + }, "@types/react": { "version": "15.0.38", "resolved": "https://registry.npmjs.org/@types/react/-/react-15.0.38.tgz", @@ -1690,9 +1756,9 @@ "dev": true }, "@types/tapable": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-0.2.4.tgz", - "integrity": "sha512-pclMAvhPnXJcJu1ZZ8bQthuUcdDWzDuxDdbSf6l1U6s4fP6EBiZpPsOZYqFOrbqDV97sXGFSsb6AUpiLfv4xIA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.4.tgz", + "integrity": "sha512-78AdXtlhpCHT0K3EytMpn4JNxaf5tbqbLcbIRoQIHzpTIyjpxLQKRoxU55ujBXAtg3Nl2h/XWvfDa9dsMOd0pQ==", "dev": true }, "@types/through2": { @@ -1705,9 +1771,9 @@ } }, "@types/uglify-js": { - "version": "2.6.30", - "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-2.6.30.tgz", - "integrity": "sha512-NjiBNGFl58vHJeijl63w1fWRIjLnrfOvimsXF5b3lTzEzkTV1BnVsbqQeLejg54upsHPWIF63aiub5TEwH619A==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.0.4.tgz", + "integrity": "sha512-SudIN9TRJ+v8g5pTG8RRCqfqTMNqgWCKKd3vtynhGzkIIjxaicNAMuY5TRadJ6tzDu3Dotf3ngaMILtmOdmWEQ==", "dev": true, "requires": { "source-map": "^0.6.1" @@ -1751,9 +1817,9 @@ } }, "@types/webpack-env": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.13.4.tgz", - "integrity": "sha512-nPwZDLIb4I9OeTMrVmLlZ2bVSev36teBzsG0WWzcU4+qWVCKm3QRILA+HLzkJXfR6MWYYSbaHZpDI4wXulDbrQ==", + "version": "1.13.7", + "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.13.7.tgz", + "integrity": "sha512-rzi6fw7hhxPcCoNVsgysHFlKnhYYvVj7AJwdAO0HQNP5vg9sY0DoRRC1pfuCQm94cOa1sab82HGUtdFlWHIhBg==", "dev": true }, "@types/webpack-stream": { @@ -1796,20 +1862,20 @@ } }, "@uifabric/styling": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@uifabric/styling/-/styling-5.35.0.tgz", - "integrity": "sha512-K6XHjyLtRntGFj1pG5+k08T2a3Cnwjxf0SbEwa99X3RiOpqTa/qPiJSB9lTvMEIT/En9UFV+Ja0CnCIFVHcIog==", + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@uifabric/styling/-/styling-5.37.0.tgz", + "integrity": "sha512-3hC0itW/hWSD5J4uANzUKk8XVGWUNkU+VLjEjWsQ6i5lvwFGaanR6Qy0bTkZdFGqFWMXe91CkBHV7HnvEx7tCA==", "requires": { "@microsoft/load-themed-styles": "^1.7.13", "@uifabric/merge-styles": ">=5.17.1 <6.0.0", - "@uifabric/utilities": ">=5.34.1 <6.0.0", + "@uifabric/utilities": ">=5.34.2 <6.0.0", "tslib": "^1.7.1" } }, "@uifabric/utilities": { - "version": "5.34.1", - "resolved": "https://registry.npmjs.org/@uifabric/utilities/-/utilities-5.34.1.tgz", - "integrity": "sha512-xUZ+KlCxmA9PCEOtutfeyYnPmySkEVA/ak3fb8Uj54684GlbrnlqrfNEencVG5YgQDcNEaztTwxW3I7jSCrYJQ==", + "version": "5.34.2", + "resolved": "https://registry.npmjs.org/@uifabric/utilities/-/utilities-5.34.2.tgz", + "integrity": "sha512-7LDHamnrKpY49S49Nzu1YMTuBtZIgTsQd9AuWTvXlUevD67ZyjSRnhCKlKVZHwe/Vi0jWLIodbup4p5IyRGWoQ==", "requires": { "@uifabric/merge-styles": ">=5.17.1 <6.0.0", "prop-types": "^15.5.10", @@ -1833,9 +1899,9 @@ } }, "acorn": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.3.0.tgz", - "integrity": "sha512-Yej+zOJ1Dm/IMZzzj78OntP/r3zHEaKcyNoU2lAaxPtrseM6rF0xwqoz5Q5ysAiED9hTjI2hgtvLXitlCN1/Ug==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", "dev": true }, "acorn-dynamic-import": { @@ -1868,15 +1934,15 @@ "dev": true }, "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz", + "integrity": "sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==", "dev": true, "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", + "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, "ajv-keywords": { @@ -1928,6 +1994,15 @@ "string-width": "^1.0.1" } }, + "ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "requires": { + "ansi-wrap": "^0.1.0" + } + }, "ansi-cyan": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", @@ -1962,12 +2037,29 @@ "dev": true }, "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" + }, + "dependencies": { + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + } } }, "ansi-wrap": { @@ -2090,9 +2182,9 @@ "dev": true }, "are-we-there-yet": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", - "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, "requires": { "delegates": "^1.0.0", @@ -2106,24 +2198,24 @@ "dev": true }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", + "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "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" @@ -2132,9 +2224,9 @@ } }, "argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "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" @@ -2230,18 +2322,22 @@ "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true }, "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } }, "asn1.js": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.2.tgz", - "integrity": "sha512-b/OsSjvWEo8Pi8H0zsDd2P6Uqo2TK2pH8gNLSJtNLM2Db0v2QaAZ0pBQJXVjAn4gBuugeVDr7s63ZogpUIwWDg==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "dev": true, "requires": { "bn.js": "^4.0.0", @@ -2256,6 +2352,23 @@ "dev": true, "requires": { "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } } }, "assert-plus": { @@ -2307,9 +2420,9 @@ "dev": true }, "atob": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.0.3.tgz", - "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10=", + "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 }, "autoprefixer": { @@ -2333,9 +2446,9 @@ "dev": true }, "aws4": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", "dev": true }, "azure-storage": { @@ -2368,12 +2481,12 @@ "dev": true }, "async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", "dev": true, "requires": { - "lodash": "^4.14.0" + "lodash": "^4.17.10" } }, "aws-sign2": { @@ -2382,15 +2495,6 @@ "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", "dev": true }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "requires": { - "hoek": "2.x.x" - } - }, "caseless": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", @@ -2410,15 +2514,6 @@ "supports-color": "^2.0.0" } }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "requires": { - "boom": "2.x.x" - } - }, "extend": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/extend/-/extend-1.2.1.tgz", @@ -2448,24 +2543,6 @@ "pinkie-promise": "^2.0.0" } }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "dev": true, - "requires": { - "boom": "2.x.x", - "cryptiles": "2.x.x", - "hoek": "2.x.x", - "sntp": "1.x.x" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true - }, "http-signature": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", @@ -2483,12 +2560,30 @@ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, "node-uuid": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=", "dev": true }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, "qs": { "version": "6.0.4", "resolved": "https://registry.npmjs.org/qs/-/qs-6.0.4.tgz", @@ -2539,22 +2634,13 @@ }, "dependencies": { "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true } } }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "dev": true, - "requires": { - "hoek": "2.x.x" - } - }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", @@ -2611,6 +2697,12 @@ "supports-color": "^2.0.0" } }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", @@ -2619,6 +2711,16 @@ } } }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, "backo2": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", @@ -2644,6 +2746,46 @@ "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": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "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-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" + } + } } }, "base64-arraybuffer": { @@ -2653,9 +2795,9 @@ "dev": true }, "base64-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", - "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", "dev": true }, "base64-url": { @@ -2689,11 +2831,10 @@ "dev": true }, "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "dev": true, - "optional": true, "requires": { "tweetnacl": "^0.14.3" } @@ -2720,9 +2861,9 @@ "dev": true }, "binary-extensions": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", - "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz", + "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==", "dev": true }, "binaryextensions": { @@ -2752,6 +2893,12 @@ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, "readable-stream": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", @@ -2796,21 +2943,21 @@ "dev": true }, "body-parser": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", - "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", "dev": true, "requires": { "bytes": "3.0.0", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.1", - "http-errors": "~1.6.2", - "iconv-lite": "0.4.19", + "depd": "~1.1.2", + "http-errors": "~1.6.3", + "iconv-lite": "0.4.23", "on-finished": "~2.3.0", - "qs": "6.5.1", - "raw-body": "2.3.2", - "type-is": "~1.6.15" + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "~1.6.16" } }, "boolbase": { @@ -2820,12 +2967,12 @@ "dev": true }, "boom": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", - "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", "dev": true, "requires": { - "hoek": "4.x.x" + "hoek": "2.x.x" } }, "bowser": { @@ -2879,9 +3026,9 @@ } }, "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "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", @@ -2889,14 +3036,13 @@ } }, "braces": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.0.tgz", - "integrity": "sha512-P4O8UQRdGiMLWSizsApmXVQDBS6KCt7dSexgLKBmH5Hr1CZq7vsnscFh8oR1sP1ab1Zj0uCHCEzZeV6SfUf3rA==", + "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", - "define-property": "^1.0.0", "extend-shallow": "^2.0.1", "fill-range": "^4.0.0", "isobject": "^3.0.1", @@ -2905,6 +3051,17 @@ "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": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, "brorand": { @@ -2920,9 +3077,9 @@ "dev": true }, "browserify-aes": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", - "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { "buffer-xor": "^1.0.3", @@ -2934,9 +3091,9 @@ } }, "browserify-cipher": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", - "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dev": true, "requires": { "browserify-aes": "^1.0.4", @@ -2945,14 +3102,15 @@ } }, "browserify-des": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", - "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "dev": true, "requires": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", - "inherits": "^2.0.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "browserify-mime": { @@ -3051,6 +3209,12 @@ "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", "dev": true }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", @@ -3119,6 +3283,12 @@ "responselike": "1.0.2" }, "dependencies": { + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "dev": true + }, "normalize-url": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", @@ -3138,7 +3308,7 @@ }, "query-string": { "version": "5.1.1", - "resolved": "http://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", "dev": true, "requires": { @@ -3203,15 +3373,15 @@ } }, "caniuse-db": { - "version": "1.0.30000798", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000798.tgz", - "integrity": "sha1-kvJvd/icwqTWBIf0Hgs9Kmw/40E=", + "version": "1.0.30000933", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000933.tgz", + "integrity": "sha512-DdIlPHIGtjUS2sH/yioeS9CS0JsWk8zGqid0OdfYhwJvufYZKZPcgerEX9E7PWOnshDc9IndnEJDoqauv+JUHA==", "dev": true }, "capture-stack-trace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", - "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", "dev": true }, "caseless": { @@ -3240,14 +3410,6 @@ "requires": { "align-text": "^0.1.3", "lazy-cache": "^1.0.3" - }, - "dependencies": { - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true - } } }, "chai": { @@ -3262,14 +3424,14 @@ } }, "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "^3.1.0", + "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", - "supports-color": "^4.0.0" + "supports-color": "^5.3.0" } }, "charenc": { @@ -3294,13 +3456,6 @@ "requires": { "chartjs-color-string": "^0.5.0", "color-convert": "^0.5.3" - }, - "dependencies": { - "color-convert": { - "version": "0.5.3", - "resolved": "http://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", - "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=" - } } }, "chartjs-color-string": { @@ -3342,9 +3497,9 @@ "dev": true }, "lodash.merge": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.0.tgz", - "integrity": "sha1-aYhLoUSsM/5plzemCG3v+t0PicU=", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", + "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==", "dev": true } } @@ -3449,73 +3604,24 @@ "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": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "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": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "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": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "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": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "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 } } }, "clean-css": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.9.tgz", - "integrity": "sha1-Nc7ornaHpJuYA09w3gDE7dOCYwE=", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", + "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", "dev": true, "requires": { - "source-map": "0.5.x" + "source-map": "~0.6.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 + } } }, "cli-boxes": { @@ -3536,9 +3642,9 @@ } }, "clone": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz", - "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", "dev": true }, "clone-buffer": { @@ -3563,14 +3669,46 @@ "dev": true }, "cloneable-readable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.0.0.tgz", - "integrity": "sha1-pikNQT8hemEjL5XkWP84QYz7ARc=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", + "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", "dev": true, "requires": { "inherits": "^2.0.1", - "process-nextick-args": "^1.0.6", - "through2": "^2.0.1" + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "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" + } + }, + "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" + } + } } }, "co": { @@ -3627,24 +3765,6 @@ "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", "dev": true }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "requires": { - "hoek": "2.x.x" - } - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "requires": { - "boom": "2.x.x" - } - }, "form-data": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", @@ -3672,24 +3792,6 @@ "har-schema": "^1.0.5" } }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "dev": true, - "requires": { - "boom": "2.x.x", - "cryptiles": "2.x.x", - "hoek": "2.x.x", - "sntp": "1.x.x" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true - }, "http-signature": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", @@ -3701,12 +3803,24 @@ "sshpk": "^1.7.0" } }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, "performance-now": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", "dev": true }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, "qs": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", @@ -3743,13 +3857,13 @@ "uuid": "^3.0.0" } }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "dev": true, "requires": { - "hoek": "2.x.x" + "punycode": "^1.4.1" } } } @@ -3771,20 +3885,32 @@ "requires": { "color-convert": "^1.9.1", "color-string": "^1.5.2" + }, + "dependencies": { + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + } } }, "color-convert": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", - "requires": { - "color-name": "^1.1.1" - } + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", + "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=" }, "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "color-string": { "version": "1.5.3", @@ -3814,7 +3940,7 @@ "dependencies": { "color": { "version": "0.11.4", - "resolved": "http://registry.npmjs.org/color/-/color-0.11.4.tgz", + "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", "dev": true, "requires": { @@ -3823,9 +3949,24 @@ "color-string": "^0.3.0" } }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, "color-string": { "version": "0.3.0", - "resolved": "http://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", "dev": true, "requires": { @@ -3835,24 +3976,24 @@ } }, "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", + "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", "dev": true }, "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", "dev": true, "requires": { "delayed-stream": "~1.0.0" } }, "commander": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", - "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", "dev": true }, "component-bind": { @@ -3874,12 +4015,12 @@ "dev": true }, "compressible": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.12.tgz", - "integrity": "sha1-xZpcmdt2dn6YdlAOJx72OzSTvWY=", + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.15.tgz", + "integrity": "sha512-4aE67DL33dSW9gw4CI2H/yTxqHLNcxp0yS6jB+4h+wr3e43+1z7vm0HU9qXOH8j+qjKuL8+UtkOxYQSMq60Ylw==", "dev": true, "requires": { - "mime-db": ">= 1.30.0 < 2" + "mime-db": ">= 1.36.0 < 2" } }, "compression": { @@ -3948,11 +4089,12 @@ "dev": true }, "concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { + "buffer-from": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^2.2.2", "typedarray": "^0.0.6" @@ -3965,24 +4107,24 @@ "dev": true }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", + "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "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" @@ -4026,13 +4168,13 @@ } }, "connect": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.5.tgz", - "integrity": "sha1-+43ee6B2OHfQ7J352sC0tA5yx9o=", + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", "dev": true, "requires": { "debug": "2.6.9", - "finalhandler": "1.0.6", + "finalhandler": "1.1.0", "parseurl": "~1.3.2", "utils-merge": "1.0.1" } @@ -4116,10 +4258,13 @@ "dev": true }, "convert-source-map": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", - "dev": true + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } }, "cookie": { "version": "0.3.1", @@ -4158,9 +4303,9 @@ "dev": true }, "core-js": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", - "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.3.tgz", + "integrity": "sha512-l00tmFFZOBHtYhN4Cz7k32VM7vTn3rE2ANjQDxdEN6zmXZ/xq1jQuutnmHvMG1ZJ7xd72+TA5YpUK8wz3rWsfQ==", "dev": true }, "core-util-is": { @@ -4191,9 +4336,9 @@ "dev": true }, "create-ecdh": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", - "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", "dev": true, "requires": { "bn.js": "^4.1.0", @@ -4210,21 +4355,22 @@ } }, "create-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", - "ripemd160": "^2.0.0", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", "sha.js": "^2.4.0" } }, "create-hmac": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", - "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { "cipher-base": "^1.0.3", @@ -4247,9 +4393,9 @@ }, "dependencies": { "lru-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, "requires": { "pseudomap": "^1.0.2", @@ -4265,23 +4411,12 @@ "dev": true }, "cryptiles": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", - "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", "dev": true, "requires": { - "boom": "5.x.x" - }, - "dependencies": { - "boom": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", - "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", - "dev": true, - "requires": { - "hoek": "4.x.x" - } - } + "boom": "2.x.x" } }, "crypto-browserify": { @@ -4451,9 +4586,9 @@ } }, "css-selector-tokenizer": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", - "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", + "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", "dev": true, "requires": { "cssesc": "^0.1.0", @@ -4462,9 +4597,9 @@ } }, "css-what": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", - "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.2.tgz", + "integrity": "sha512-wan8dMWQ0GUeF7DGEPVjhHemVW/vy6xUYmFzRY8RYqgA0JtXC9rJmbScBjqSu6dg9q0lwPQy6ZAmJVr3PPTvqQ==", "dev": true }, "cssesc": { @@ -4599,13 +4734,13 @@ "dev": true }, "deasync": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/deasync/-/deasync-0.1.12.tgz", - "integrity": "sha512-gpacYo8FBZh3INBp2KOtrQp9kCO5faHvOmEZx3/cZTr3Mm8/kAYs7/Ws3E3OAH0ApBNK6Y6N+7+Dka2Zn2Fldw==", + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/deasync/-/deasync-0.1.14.tgz", + "integrity": "sha512-wN8sIuEqIwyQh72AG7oY6YQODCxIp1eXzEZlZznBuwDF8Q03Tdy9QNp1BNZXeadXoklNrw+Ip1fch+KXo/+ASw==", "dev": true, "requires": { "bindings": "~1.2.1", - "nan": "^2.0.7" + "node-addon-api": "^1.6.0" } }, "debug": { @@ -4639,9 +4774,9 @@ }, "dependencies": { "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "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 } } @@ -4753,13 +4888,13 @@ }, "file-type": { "version": "3.9.0", - "resolved": "http://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", "dev": true }, "get-stream": { "version": "2.3.1", - "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", "dev": true, "requires": { @@ -4797,9 +4932,9 @@ } }, "deep-extend": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true }, "deep-is": { @@ -4818,30 +4953,61 @@ } }, "define-properties": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, "requires": { - "foreach": "^2.0.5", - "object-keys": "^1.0.8" + "object-keys": "^1.0.12" }, "dependencies": { "object-keys": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", - "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", "dev": true } } }, "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "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.0" + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "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" + } + } } }, "defined": { @@ -4924,9 +5090,9 @@ "dev": true }, "diffie-hellman": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", - "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { "bn.js": "^4.1.0", @@ -4971,15 +5137,15 @@ "dev": true }, "domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", "dev": true }, "domhandler": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz", - "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", "dev": true, "requires": { "domelementtype": "1" @@ -5099,9 +5265,9 @@ "dev": true }, "duplexify": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.3.tgz", - "integrity": "sha512-g8ID9OroF9hKt2POf8YLayy+9594PzmM3scI00/uBXocX3TWNgoB67hjzkFe9ITAbQOne/lLdBxHXvYUM4ZgGA==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz", + "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==", "dev": true, "requires": { "end-of-stream": "^1.0.0", @@ -5117,24 +5283,24 @@ "dev": true }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", + "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "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" @@ -5143,13 +5309,13 @@ } }, "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "dev": true, - "optional": true, "requires": { - "jsbn": "~0.1.0" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, "ee-first": { @@ -5159,15 +5325,15 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.31", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.31.tgz", - "integrity": "sha512-XE4CLbswkZgZFn34cKFy1xaX+F5LHxeDLjY1+rsK9asDzknhbrd9g/n/01/acbU25KTsUSiLKwvlLyA+6XLUOA==", + "version": "1.3.111", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.111.tgz", + "integrity": "sha512-I2QjmmxWULp89fEHlFwRpKXSw4Y/Igo3u41py4MkzJTrgDOf/S4oq/IMuTUHze/5TTPpwem74oQiPMEgFtuDRA==", "dev": true }, "elliptic": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", - "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", + "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", "dev": true, "requires": { "bn.js": "^4.4.0", @@ -5195,6 +5361,7 @@ "version": "0.1.12", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "dev": true, "requires": { "iconv-lite": "~0.4.13" } @@ -5320,9 +5487,9 @@ "dev": true }, "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", "dev": true }, "enzyme": { @@ -5344,21 +5511,29 @@ } }, "errno": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.6.tgz", - "integrity": "sha512-IsORQDpaaSwcDP4ZZnHxgE85werpo34VYn1Ud3mq+eUsF593faR8oCZNXrROVkpFu2TsbrNhHin0aUrTsQ9vNw==", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "dev": true, "requires": { "prr": "~1.0.1" } }, "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { "is-arrayish": "^0.2.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + } } }, "errorhandler": { @@ -5372,37 +5547,47 @@ } }, "es-abstract": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.10.0.tgz", - "integrity": "sha512-/uh/DhdqIOSkAWifU+8nG78vlQxdLckUdI/sPgy0VhuXi2qJ7T8czBmqIYtLQVpCIFYafChnsRsB5pyb1JdmCQ==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", + "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", "dev": true, "requires": { - "es-to-primitive": "^1.1.1", + "es-to-primitive": "^1.2.0", "function-bind": "^1.1.1", - "has": "^1.0.1", - "is-callable": "^1.1.3", - "is-regex": "^1.0.4" + "has": "^1.0.3", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-keys": "^1.0.12" + }, + "dependencies": { + "object-keys": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "dev": true + } } }, "es-to-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", - "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", "dev": true, "requires": { - "is-callable": "^1.1.1", + "is-callable": "^1.1.4", "is-date-object": "^1.0.1", - "is-symbol": "^1.0.1" + "is-symbol": "^1.0.2" } }, "es5-ext": { - "version": "0.10.38", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.38.tgz", - "integrity": "sha512-jCMyePo7AXbUESwbl8Qi01VSH2piY9s/a3rSU/5w/MlTIx8HPL1xn2InGN8ejt/xulcJgnTO7vqNtOAxzYd2Kg==", + "version": "0.10.47", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.47.tgz", + "integrity": "sha512-/1TItLfj+TTfWoeRcDn/0FbGV6SNo4R+On2GGVucPU/j3BWnXE2Co8h8CTo4Tu34gFJtnmwS9xiScKs4EjZhdw==", "dev": true, "requires": { "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.1" + "es6-symbol": "~3.1.1", + "next-tick": "1" } }, "es6-collections": { @@ -5437,9 +5622,9 @@ } }, "es6-promise": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", - "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==", + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz", + "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==", "dev": true }, "es6-set": { @@ -5551,13 +5736,12 @@ "dev": true }, "esrecurse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", - "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "dev": true, "requires": { - "estraverse": "^4.1.0", - "object-assign": "^4.0.1" + "estraverse": "^4.1.0" }, "dependencies": { "estraverse": { @@ -5612,15 +5796,15 @@ } }, "eventemitter3": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", - "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", + "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", "dev": true }, "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", "dev": true }, "evp_bytestokey": { @@ -5728,62 +5912,14 @@ "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": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "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": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "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": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "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": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "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==", + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "is-extendable": "^0.1.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 } } }, @@ -5797,14 +5933,14 @@ }, "dependencies": { "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", "dev": true, "requires": { "is-number": "^2.1.0", "isobject": "^2.0.0", - "randomatic": "^1.1.3", + "randomatic": "^3.0.0", "repeat-element": "^1.1.2", "repeat-string": "^1.5.2" } @@ -6016,18 +6152,30 @@ } }, "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "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": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } } }, "extglob": { @@ -6044,37 +6192,69 @@ "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" - } - }, - "extract-zip": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.6.tgz", - "integrity": "sha1-EpDt6NINCHK0Kf0/NRyhKOxe+Fw=", - "dev": true, - "requires": { - "concat-stream": "1.6.0", - "debug": "2.6.9", - "mkdirp": "0.5.0", - "yauzl": "2.4.1" }, "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } }, - "mkdirp": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", - "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=", + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "minimist": "0.0.8" + "is-extendable": "^0.1.0" + } + }, + "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-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" } } } }, + "extract-zip": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", + "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", + "dev": true, + "requires": { + "concat-stream": "1.6.2", + "debug": "2.6.9", + "mkdirp": "0.5.1", + "yauzl": "2.4.1" + } + }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -6082,20 +6262,21 @@ "dev": true }, "fancy-log": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz", - "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=", + "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-deep-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", "dev": true }, "fast-json-stable-stringify": { @@ -6111,9 +6292,9 @@ "dev": true }, "fastparse": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", - "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", "dev": true }, "faye-websocket": { @@ -6126,9 +6307,10 @@ } }, "fbjs": { - "version": "0.8.16", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", - "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", + "version": "0.8.17", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", + "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", + "dev": true, "requires": { "core-js": "^1.0.0", "isomorphic-fetch": "^2.1.1", @@ -6136,13 +6318,14 @@ "object-assign": "^4.1.0", "promise": "^7.1.1", "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.9" + "ua-parser-js": "^0.7.18" }, "dependencies": { "core-js": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", + "dev": true } } }, @@ -6203,6 +6386,17 @@ "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": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, "filled-array": { @@ -6212,9 +6406,9 @@ "dev": true }, "finalhandler": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.6.tgz", - "integrity": "sha1-AHrqM9Gk0+QgF/YkhIrVjSEvgU8=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", "dev": true, "requires": { "debug": "2.6.9", @@ -6263,9 +6457,9 @@ } }, "fined": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz", - "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.1.tgz", + "integrity": "sha512-jQp949ZmEbiYHk3gkbdtpJ0G1+kgtLQBNdP5edFP7Fh+WAYceLQz6yO1SBj72Xkg8GVyTB3bBzAYrHJVh5Xd5g==", "dev": true, "requires": { "expand-tilde": "^2.0.2", @@ -6282,9 +6476,9 @@ "dev": true }, "flagged-respawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.0.tgz", - "integrity": "sha1-Tnmumy6zi/hrO7Vr8+ClaqX8q9c=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", "dev": true }, "flatten": { @@ -6293,6 +6487,26 @@ "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=", "dev": true }, + "follow-redirects": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.6.1.tgz", + "integrity": "sha512-t2JCjbzxQpWvbhts3l6SH1DKzSrx8a+SsaVf4h6bG4kOXUuPYS/kg2Lr4gQSb7eemaHqJkOThF1BGyjlUkO1GQ==", + "dev": true, + "requires": { + "debug": "=3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -6308,12 +6522,6 @@ "for-in": "^1.0.1" } }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -6327,13 +6535,13 @@ "dev": true }, "form-data": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", - "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "requires": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.5", + "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, @@ -6389,15 +6597,9 @@ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -6447,9 +6649,9 @@ "dev": true }, "fsevents": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", - "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz", + "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==", "dev": true, "optional": true, "requires": { @@ -6475,7 +6677,7 @@ "optional": true }, "are-we-there-yet": { - "version": "1.1.4", + "version": "1.1.5", "bundled": true, "dev": true, "optional": true, @@ -6487,21 +6689,19 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "chownr": { - "version": "1.0.1", + "version": "1.1.1", "bundled": true, "dev": true, "optional": true @@ -6514,8 +6714,7 @@ "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "console-control-strings": { "version": "1.1.0", @@ -6538,7 +6737,7 @@ } }, "deep-extend": { - "version": "0.5.1", + "version": "0.6.0", "bundled": true, "dev": true, "optional": true @@ -6587,7 +6786,7 @@ } }, "glob": { - "version": "7.1.2", + "version": "7.1.3", "bundled": true, "dev": true, "optional": true, @@ -6607,12 +6806,12 @@ "optional": true }, "iconv-lite": { - "version": "0.4.21", + "version": "0.4.24", "bundled": true, "dev": true, "optional": true, "requires": { - "safer-buffer": "^2.1.0" + "safer-buffer": ">= 2.1.2 < 3" } }, "ignore-walk": { @@ -6663,7 +6862,6 @@ "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -6674,16 +6872,16 @@ "dev": true }, "minipass": { - "version": "2.2.4", + "version": "2.3.5", "bundled": true, "dev": true, "requires": { - "safe-buffer": "^5.1.1", + "safe-buffer": "^5.1.2", "yallist": "^3.0.0" } }, "minizlib": { - "version": "1.1.0", + "version": "1.2.1", "bundled": true, "dev": true, "optional": true, @@ -6705,15 +6903,8 @@ "dev": true, "optional": true }, - "nan": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", - "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", - "dev": true, - "optional": true - }, "needle": { - "version": "2.2.0", + "version": "2.2.4", "bundled": true, "dev": true, "optional": true, @@ -6724,18 +6915,18 @@ } }, "node-pre-gyp": { - "version": "0.10.0", + "version": "0.10.3", "bundled": true, "dev": true, "optional": true, "requires": { "detect-libc": "^1.0.2", "mkdirp": "^0.5.1", - "needle": "^2.2.0", + "needle": "^2.2.1", "nopt": "^4.0.1", "npm-packlist": "^1.1.6", "npmlog": "^4.0.2", - "rc": "^1.1.7", + "rc": "^1.2.7", "rimraf": "^2.6.1", "semver": "^5.3.0", "tar": "^4" @@ -6752,13 +6943,13 @@ } }, "npm-bundled": { - "version": "1.0.3", + "version": "1.0.5", "bundled": true, "dev": true, "optional": true }, "npm-packlist": { - "version": "1.1.10", + "version": "1.2.0", "bundled": true, "dev": true, "optional": true, @@ -6833,12 +7024,12 @@ "optional": true }, "rc": { - "version": "1.2.7", + "version": "1.2.8", "bundled": true, "dev": true, "optional": true, "requires": { - "deep-extend": "^0.5.1", + "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" @@ -6868,16 +7059,16 @@ } }, "rimraf": { - "version": "2.6.2", + "version": "2.6.3", "bundled": true, "dev": true, "optional": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } }, "safe-buffer": { - "version": "5.1.1", + "version": "5.1.2", "bundled": true, "dev": true }, @@ -6894,7 +7085,7 @@ "optional": true }, "semver": { - "version": "5.5.0", + "version": "5.6.0", "bundled": true, "dev": true, "optional": true @@ -6945,17 +7136,17 @@ "optional": true }, "tar": { - "version": "4.4.1", + "version": "4.4.8", "bundled": true, "dev": true, "optional": true, "requires": { - "chownr": "^1.0.1", + "chownr": "^1.1.1", "fs-minipass": "^1.2.5", - "minipass": "^2.2.4", - "minizlib": "^1.1.0", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.1", + "safe-buffer": "^5.1.2", "yallist": "^3.0.2" } }, @@ -6966,12 +7157,12 @@ "optional": true }, "wide-align": { - "version": "1.1.2", + "version": "1.1.3", "bundled": true, "dev": true, "optional": true, "requires": { - "string-width": "^1.0.2" + "string-width": "^1.0.2 || 2" } }, "wrappy": { @@ -6980,7 +7171,7 @@ "dev": true }, "yallist": { - "version": "3.0.2", + "version": "3.0.3", "bundled": true, "dev": true } @@ -7041,10 +7232,13 @@ } }, "generate-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", - "dev": true + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dev": true, + "requires": { + "is-property": "^1.0.2" + } }, "generate-object-property": { "version": "1.2.0", @@ -7065,9 +7259,9 @@ } }, "get-caller-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", "dev": true }, "get-proxy": { @@ -7126,9 +7320,9 @@ } }, "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -7366,9 +7560,9 @@ } }, "glogg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.1.tgz", - "integrity": "sha512-ynYqXLoluBKf9XGR1gA59yEJisIL7YHEH4xr3ZziHB5/yl4qWfaK8Js9jGe6gBGCSCKVqiyO30WnRZADvemUNw==", + "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" @@ -7413,24 +7607,24 @@ "dev": true }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", + "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "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" @@ -7439,9 +7633,9 @@ } }, "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", "dev": true }, "graceful-readlink": { @@ -7534,9 +7728,9 @@ }, "dependencies": { "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", + "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", "dev": true }, "isarray": { @@ -7546,24 +7740,24 @@ "dev": true }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", + "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "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" @@ -7923,18 +8117,18 @@ "dev": true }, "event-stream": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.5.tgz", + "integrity": "sha512-vyibDcu5JL20Me1fP734QBH/kenBGLZap2n0+XXM7mvuUPzJ20Ydqj1aKcIeMdri1p+PU+4yAKugjN8KCVst+g==", "dev": true, "requires": { - "duplexer": "~0.1.1", - "from": "~0", - "map-stream": "~0.1.0", - "pause-stream": "0.0.11", - "split": "0.3", - "stream-combiner": "~0.0.4", - "through": "~2.3.1" + "duplexer": "^0.1.1", + "from": "^0.1.7", + "map-stream": "0.0.7", + "pause-stream": "^0.0.11", + "split": "^1.0.1", + "stream-combiner": "^0.2.2", + "through": "^2.3.8" } }, "finalhandler": { @@ -7965,12 +8159,6 @@ "integrity": "sha1-LstC/SlHRJIiCaLnxATayHk9it4=", "dev": true }, - "map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", - "dev": true - }, "mime": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", @@ -8080,14 +8268,24 @@ } }, "split": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", "dev": true, "requires": { "through": "2" } }, + "stream-combiner": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", + "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", + "dev": true, + "requires": { + "duplexer": "~0.1.1", + "through": "~2.3.4" + } + }, "utils-merge": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", @@ -8385,24 +8583,24 @@ "dev": true }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", + "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "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" @@ -8703,24 +8901,24 @@ } }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", + "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "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" @@ -8736,13 +8934,25 @@ } }, "unique-stream": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", - "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", "dev": true, "requires": { - "json-stable-stringify": "^1.0.0", - "through2-filter": "^2.0.0" + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + }, + "dependencies": { + "through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "dev": true, + "requires": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + } } }, "vinyl": { @@ -8852,25 +9062,37 @@ } }, "handlebars": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", - "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz", + "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==", "dev": true, "requires": { - "async": "^1.4.0", + "async": "^2.5.0", "optimist": "^0.6.1", - "source-map": "^0.4.4", - "uglify-js": "^2.6" + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" }, "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", "dev": true, "requires": { - "amdefine": ">=0.0.4" + "lodash": "^4.17.10" } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "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 } } }, @@ -8881,22 +9103,22 @@ "dev": true }, "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "dev": true, "requires": { - "ajv": "^5.1.0", + "ajv": "^6.5.5", "har-schema": "^2.0.0" } }, "has": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { - "function-bind": "^1.0.2" + "function-bind": "^1.1.1" } }, "has-ansi": { @@ -8924,9 +9146,9 @@ "dev": true }, "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "has-gulplog": { @@ -8998,22 +9220,23 @@ } }, "hash-base": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", - "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", "dev": true, "requires": { - "inherits": "^2.0.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, "requires": { "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" + "minimalistic-assert": "^1.0.1" } }, "hasha": { @@ -9027,21 +9250,21 @@ } }, "hawk": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", - "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", "dev": true, "requires": { - "boom": "4.x.x", - "cryptiles": "3.x.x", - "hoek": "4.x.x", - "sntp": "2.x.x" + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" } }, "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, "hmac-drbg": { @@ -9056,9 +9279,9 @@ } }, "hoek": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", - "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==", + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", "dev": true }, "homedir-polyfill": { @@ -9071,15 +9294,15 @@ } }, "hosted-git-info": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", "dev": true }, "html-comment-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz", - "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", "dev": true }, "html-loader": { @@ -9095,71 +9318,61 @@ "object-assign": "^4.1.0" }, "dependencies": { - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "dev": true, "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0" + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" } } } }, "html-minifier": { - "version": "3.5.8", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.8.tgz", - "integrity": "sha512-WX7D6PB9PFq05fZ1/CyxPUuyqXed6vh2fGOM80+zJT5wAO93D/cUjLs0CcbBFjQmlwmCgRvl97RurtArIpOnkw==", + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", "dev": true, "requires": { "camel-case": "3.0.x", - "clean-css": "4.1.x", - "commander": "2.12.x", - "he": "1.1.x", - "ncname": "1.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", "param-case": "2.1.x", "relateurl": "0.2.x", - "uglify-js": "3.3.x" + "uglify-js": "3.4.x" }, "dependencies": { "commander": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz", - "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==", + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", "dev": true - }, - "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 - }, - "uglify-js": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.9.tgz", - "integrity": "sha512-J2t8B5tj9JdPTW4+sNZXmiIWHzTvcoITkaqzTiilu/biZF/9crqf/Fi7k5hqbOmVRh9/hVNxAxBYIMF7N6SqMQ==", - "dev": true, - "requires": { - "commander": "~2.13.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", - "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", - "dev": true - } - } } } }, "htmlparser2": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", - "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.0.tgz", + "integrity": "sha512-J1nEUGv+MkXS0weHNWVKJJ+UrLfePxRWpN3C9bEi9fLxL2+ggW94DQvgYVXsaT30PGwYRIZKNZXuyMhp3Di4bQ==", "dev": true, "requires": { "domelementtype": "^1.3.0", @@ -9167,34 +9380,24 @@ "domutils": "^1.5.1", "entities": "^1.1.1", "inherits": "^2.0.1", - "readable-stream": "^2.0.2" + "readable-stream": "^3.0.6" }, "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.1.1.tgz", + "integrity": "sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", + "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -9209,39 +9412,32 @@ "dev": true }, "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "dev": true, "requires": { - "depd": "1.1.1", + "depd": "~1.1.2", "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": ">= 1.3.1 < 2" - }, - "dependencies": { - "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", - "dev": true - } + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" } }, "http-parser-js": { - "version": "0.4.9", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.9.tgz", - "integrity": "sha1-6hoE+2St/wJC6ZdPKX3Uw8rSceE=", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz", + "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==", "dev": true }, "http-proxy": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", - "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", + "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", "dev": true, "requires": { - "eventemitter3": "1.x.x", - "requires-port": "1.x.x" + "eventemitter3": "^3.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" } }, "http-signature": { @@ -9262,15 +9458,19 @@ "dev": true }, "hyphenate-style-name": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.2.tgz", - "integrity": "sha1-MRYKNpMK2vH8BMYHT360FGXU7Es=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz", + "integrity": "sha512-EcuixamT82oplpoJ2XU4pDtKGWQ7b00CD9f1ug9IaQ3p1bkHMiKCZ9ut9QDI6qsa6cpUuB+A/I+zLtdNK4n2DQ==", "dev": true }, "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } }, "icss-replace-symbols": { "version": "1.1.0", @@ -9279,9 +9479,9 @@ "dev": true }, "ieee754": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", "dev": true }, "imurmurhash": { @@ -9356,14 +9556,14 @@ "dev": true }, "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", "dev": true }, "into-stream": { "version": "3.1.0", - "resolved": "http://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", "dev": true, "requires": { @@ -9384,9 +9584,9 @@ "dev": true }, "is": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", - "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", + "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==", "dev": true }, "is-absolute": { @@ -9406,19 +9606,29 @@ "dev": true }, "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==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "^6.0.0" + "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": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, "is-binary-path": { "version": "1.0.1", @@ -9445,18 +9655,29 @@ } }, "is-callable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", - "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", "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==", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "^6.0.0" + "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": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, "is-date-object": { @@ -9466,14 +9687,22 @@ "dev": true }, "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "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": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "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 + } } }, "is-directory": { @@ -9536,14 +9765,21 @@ "is-extglob": "^2.1.0" } }, + "is-my-ip-valid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", + "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", + "dev": true + }, "is-my-json-valid": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.1.tgz", - "integrity": "sha512-Q2khNw+oBlWuaYvEEHtKSw/pCxD2L5Rc1C+UQme9X6JdRDh7m5D7HkozA0qa3DUkQ6VzCnEm8mVIQPyIRkI5sQ==", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.19.0.tgz", + "integrity": "sha512-mG0f/unGX1HZ5ep4uhRaPOS8EkAY8/j6mDRMJrutq4CqhoJWYp7qAlonIPy3TV7p3ju4TK9fo/PbnoksWmsp5Q==", "dev": true, "requires": { "generate-function": "^2.0.0", "generate-object-property": "^1.1.0", + "is-my-ip-valid": "^1.0.0", "jsonpointer": "^4.0.0", "xtend": "^4.0.0" } @@ -9592,15 +9828,6 @@ "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", "dev": true }, - "is-odd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-1.0.0.tgz", - "integrity": "sha1-O4qTLrAos3dcObsJ6RdnrM22kIg=", - "dev": true, - "requires": { - "is-number": "^3.0.0" - } - }, "is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", @@ -9608,9 +9835,9 @@ "dev": true }, "is-path-in-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", - "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", "dev": true, "requires": { "is-path-inside": "^1.0.0" @@ -9691,7 +9918,8 @@ "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true }, "is-subset": { "version": "0.1.1", @@ -9709,10 +9937,13 @@ } }, "is-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", - "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", - "dev": true + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } }, "is-typedarray": { "version": "1.0.0", @@ -9742,9 +9973,9 @@ "dev": true }, "is-windows": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.1.tgz", - "integrity": "sha1-MQ23D3QtJZoWo2kgK1GvhCMzENk=", + "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": { @@ -9754,10 +9985,13 @@ "dev": true }, "isbinaryfile": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", - "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=", - "dev": true + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "dev": true, + "requires": { + "buffer-alloc": "^1.2.0" + } }, "isexe": { "version": "2.0.0", @@ -9775,6 +10009,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "dev": true, "requires": { "node-fetch": "^1.0.1", "whatwg-fetch": ">=0.10.0" @@ -9888,20 +10123,20 @@ "dev": true }, "js-base64": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.3.tgz", - "integrity": "sha512-H7ErYLM34CvDMto3GbD6xD0JLUGYXR3QTcH6B/tr4Hi/QpSThnCsIp+Sy5FRTw3B0d6py4HcNkW7nO/wdtGWEw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", + "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==", "dev": true }, "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", - "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz", + "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -9909,9 +10144,9 @@ }, "dependencies": { "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "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 } } @@ -9920,8 +10155,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true + "dev": true }, "jsesc": { "version": "0.5.0", @@ -9948,9 +10182,9 @@ "dev": true }, "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, "json-stable-stringify": { @@ -9962,6 +10196,12 @@ "jsonify": "~0.0.0" } }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -10193,29 +10433,61 @@ } }, "karma-webpack": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/karma-webpack/-/karma-webpack-2.0.9.tgz", - "integrity": "sha512-F1j3IG/XhiMzcunAXbWXH95uizjzr3WdTzmVWlta8xqxcCtAu9FByCb4sccIMxaVFAefpgnUW9KlCo0oLvIX6A==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/karma-webpack/-/karma-webpack-2.0.13.tgz", + "integrity": "sha512-2cyII34jfrAabbI2+4Rk4j95Nazl98FvZQhgSiqKUDarT317rxfv/EdzZ60CyATN4PQxJdO5ucR5bOOXkEVrXw==", "dev": true, "requires": { - "async": "~0.9.0", - "loader-utils": "^0.2.5", - "lodash": "^3.8.0", + "async": "^2.0.0", + "babel-runtime": "^6.0.0", + "loader-utils": "^1.0.0", + "lodash": "^4.0.0", "source-map": "^0.5.6", "webpack-dev-middleware": "^1.12.0" }, "dependencies": { "async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", - "dev": true + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + }, + "dependencies": { + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + } + } }, - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } } } }, @@ -10259,13 +10531,10 @@ } }, "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "dev": true, - "requires": { - "set-getter": "^0.1.0" - } + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true }, "lazy-req": { "version": "1.1.0", @@ -10289,24 +10558,24 @@ "dev": true }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", + "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "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" @@ -10350,9 +10619,9 @@ } }, "livereload-js": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.3.0.tgz", - "integrity": "sha512-j1R0/FeGa64Y+NmqfZhyoVRzcFlOZ8sNlKzHjh4VvLULFACZhn68XrX5DFg2FhMvSMJmROuFxRSa560ECWKBMg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz", + "integrity": "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==", "dev": true }, "load-json-file": { @@ -10380,9 +10649,9 @@ } }, "loader-runner": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", - "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", "dev": true }, "loader-utils": { @@ -10627,6 +10896,12 @@ "lodash._isiterateecall": "^3.0.0" } }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, "lodash.deburr": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-3.2.0.tgz", @@ -10768,9 +11043,9 @@ } }, "lodash.mergewith": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz", - "integrity": "sha1-FQzwoWeR9ZA7iJHqsVRgknS96lU=", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz", + "integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==", "dev": true }, "lodash.pick": { @@ -10952,11 +11227,11 @@ "dev": true }, "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "requires": { - "js-tokens": "^3.0.0" + "js-tokens": "^3.0.0 || ^4.0.0" } }, "loud-rejection": { @@ -10976,9 +11251,9 @@ "dev": true }, "lowercase-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", "dev": true }, "lru-cache": { @@ -10987,12 +11262,6 @@ "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", "dev": true }, - "macaddress": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.8.tgz", - "integrity": "sha1-WQTcU3w57G2+/q6QIycTX6hRHxI=", - "dev": true - }, "make-dir": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", @@ -11011,23 +11280,12 @@ } }, "make-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.0.tgz", - "integrity": "sha1-V7713IXSOSO6I3ZzJNjo+PPZaUs=", + "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": "^3.1.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "kind-of": "^6.0.2" } }, "map-cache": { @@ -11063,6 +11321,12 @@ "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=", "dev": true }, + "math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", + "dev": true + }, "md5": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", @@ -11075,25 +11339,14 @@ } }, "md5.js": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", - "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "dev": true, "requires": { "hash-base": "^3.0.0", - "inherits": "^2.0.1" - }, - "dependencies": { - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - } + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "media-typer": { @@ -11128,24 +11381,24 @@ "dev": true }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", + "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "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" @@ -11193,24 +11446,24 @@ "dev": true }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", + "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "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" @@ -11243,24 +11496,24 @@ "dev": true }, "micromatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.5.tgz", - "integrity": "sha512-ykttrLPQrz1PUJcXjwsTUjGoPJ64StIGNE2lGVD1c9CuguJ+L7/navsE8IcDNndOoCMvYV0qc/exfVbMHkUhvA==", + "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.0", - "define-property": "^1.0.0", - "extend-shallow": "^2.0.1", - "extglob": "^2.0.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.0", - "nanomatch": "^1.2.5", + "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.1" + "to-regex": "^3.0.2" } }, "miller-rabin": { @@ -11280,24 +11533,24 @@ "dev": true }, "mime-db": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", - "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", "dev": true }, "mime-types": { - "version": "2.1.17", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", - "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "version": "2.1.21", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", + "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", "dev": true, "requires": { - "mime-db": "~1.30.0" + "mime-db": "~1.37.0" } }, "mimic-fn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", - "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, "mimic-response": { @@ -11307,9 +11560,9 @@ "dev": true }, "minimalistic-assert": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", - "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "dev": true }, "minimalistic-crypto-utils": { @@ -11334,9 +11587,9 @@ "dev": true }, "mixin-deep": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.0.tgz", - "integrity": "sha512-dgaCvoh6i1nosAUBKb0l0pfJ78K8+S9fluyIR2YvAeUD/QuMahnFnF3xYty5eYXMjhGSsB0DsW6A0uAZyetoAg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", "dev": true, "requires": { "for-in": "^1.0.2", @@ -11452,9 +11705,9 @@ "dev": true }, "moment": { - "version": "2.22.2", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", - "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=" + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" }, "morgan": { "version": "1.6.1", @@ -11524,65 +11777,60 @@ } }, "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, "nan": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", - "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", + "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==", "dev": true }, "nanomatch": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.7.tgz", - "integrity": "sha512-/5ldsnyurvEw7wNpxLFgjVvBLMta43niEYOy0CJ4ntcYSbx6bugRUTQeFb4BR/WanEL1o3aQgHuVLHQaB6tOqg==", + "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": "^1.0.0", - "extend-shallow": "^2.0.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", "fragment-cache": "^0.2.1", - "is-odd": "^1.0.0", - "kind-of": "^5.0.2", + "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" - }, - "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 - } } }, "natives": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.1.tgz", - "integrity": "sha512-8eRaxn8u/4wN8tGkhlc2cgwwvOLMLUMUn4IYTexMgWd+LyUDfeXVkk2ygQR0hvIHbJQXgHujia3ieUUDwNGkEA==", + "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 }, - "ncname": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", - "integrity": "sha1-W1etGLHKCShk72Kwse2BlPODtxw=", - "dev": true, - "requires": { - "xml-char-classes": "^1.0.0" - } - }, "negotiator": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", "dev": true }, + "neo-async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", + "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", + "dev": true + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, "no-case": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", @@ -11592,36 +11840,42 @@ "lower-case": "^1.1.1" } }, + "node-addon-api": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.6.2.tgz", + "integrity": "sha512-479Bjw9nTE5DdBSZZWprFryHGjUaQC31y1wHo19We/k0BZlrmhqQitWoUL0cD8+scljCbIUL+E58oRDEakdGGA==", + "dev": true + }, "node-fetch": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "dev": true, "requires": { "encoding": "^0.1.11", "is-stream": "^1.0.1" } }, "node-forge": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.1.tgz", - "integrity": "sha1-naYR6giYL0uUIGs760zJZl8gwwA=", + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.6.tgz", + "integrity": "sha512-sol30LUpz1jQFBjOKwbjxijiE3b6pjd74YwfD0fJOKPjF+fONKb2Yg8rYgS6+bK6VDl+/wfr4IYpC7jDzLUIfw==", "dev": true }, "node-gyp": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.6.2.tgz", - "integrity": "sha1-m/vlRWIoYoSDjnUOrAUpWFP6HGA=", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", "dev": true, "requires": { "fstream": "^1.0.0", "glob": "^7.0.3", "graceful-fs": "^4.1.2", - "minimatch": "^3.0.2", "mkdirp": "^0.5.0", "nopt": "2 || 3", "npmlog": "0 || 1 || 2 || 3 || 4", "osenv": "0", - "request": "2", + "request": "^2.87.0", "rimraf": "2", "semver": "~5.3.0", "tar": "^2.0.0", @@ -11629,9 +11883,9 @@ } }, "node-libs-browser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", - "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz", + "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==", "dev": true, "requires": { "assert": "^1.1.1", @@ -11641,7 +11895,7 @@ "constants-browserify": "^1.0.0", "crypto-browserify": "^3.11.0", "domain-browser": "^1.1.1", - "events": "^1.0.0", + "events": "^3.0.0", "https-browserify": "^1.0.0", "os-browserify": "^0.3.0", "path-browserify": "0.0.0", @@ -11655,7 +11909,7 @@ "timers-browserify": "^2.0.4", "tty-browserify": "0.0.0", "url": "^0.11.0", - "util": "^0.10.3", + "util": "^0.11.0", "vm-browserify": "0.0.4" }, "dependencies": { @@ -11665,25 +11919,42 @@ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", + "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" + }, + "dependencies": { + "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" + } + } } }, "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", + "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -11704,9 +11975,9 @@ } }, "node-sass": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.7.2.tgz", - "integrity": "sha512-CaV+wLqZ7//Jdom5aUFCpGNoECd7BbNhjuwdsX/LkXBrHl8eb1Wjw4HvWqcFvhr5KuNgAk8i/myf/MQ1YYeroA==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.11.0.tgz", + "integrity": "sha512-bHUdHTphgQJZaF1LASx0kAviPH7sGlcyNhWade4eVIpFp6tsn7SV8xNMTbsQFpEV9VXpnwTTnNYlfsZXgGgmkA==", "dev": true, "requires": { "async-foreach": "^0.1.3", @@ -11721,10 +11992,10 @@ "lodash.mergewith": "^4.6.0", "meow": "^3.7.0", "mkdirp": "^0.5.1", - "nan": "^2.3.2", - "node-gyp": "^3.3.1", + "nan": "^2.10.0", + "node-gyp": "^3.8.0", "npmlog": "^4.0.0", - "request": "~2.79.0", + "request": "^2.88.0", "sass-graph": "^2.2.4", "stdout-stream": "^1.4.0", "true-case-path": "^1.0.2" @@ -11736,33 +12007,6 @@ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", - "dev": true - }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", - "dev": true - }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "requires": { - "hoek": "2.x.x" - } - }, - "caseless": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", - "dev": true - }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", @@ -11786,151 +12030,47 @@ "which": "^1.2.9" } }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "requires": { - "boom": "2.x.x" - } - }, - "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.5", - "mime-types": "^2.1.12" - } - }, "gaze": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz", - "integrity": "sha1-hHIkZ3rbiHDWeSV+0ziP22HkAQU=", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", "dev": true, "requires": { "globule": "^1.0.0" } }, "globule": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.0.tgz", - "integrity": "sha1-HcScaCLdnoovoAuiopUAboZkvQk=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", + "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", "dev": true, "requires": { "glob": "~7.1.1", - "lodash": "~4.17.4", + "lodash": "~4.17.10", "minimatch": "~3.0.2" } }, - "har-validator": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", - "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", - "dev": true, - "requires": { - "chalk": "^1.1.1", - "commander": "^2.9.0", - "is-my-json-valid": "^2.12.4", - "pinkie-promise": "^2.0.0" - } - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "dev": true, - "requires": { - "boom": "2.x.x", - "cryptiles": "2.x.x", - "hoek": "2.x.x", - "sntp": "1.x.x" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", "dev": true }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "dev": true, - "requires": { - "assert-plus": "^0.2.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, "lru-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, "requires": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" } }, - "qs": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", - "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", - "dev": true - }, - "request": { - "version": "2.79.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", - "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", - "dev": true, - "requires": { - "aws-sign2": "~0.6.0", - "aws4": "^1.2.1", - "caseless": "~0.11.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.0", - "forever-agent": "~0.6.1", - "form-data": "~2.1.1", - "har-validator": "~2.0.6", - "hawk": "~3.1.3", - "http-signature": "~1.1.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.7", - "oauth-sign": "~0.8.1", - "qs": "~6.3.0", - "stringstream": "~0.0.4", - "tough-cookie": "~2.3.0", - "tunnel-agent": "~0.4.1", - "uuid": "^3.0.0" - } - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "dev": true, - "requires": { - "hoek": "2.x.x" - } - }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true - }, - "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", - "dev": true } } }, @@ -11950,12 +12090,13 @@ } }, "node.extend": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.6.tgz", - "integrity": "sha1-p7iCyC1sk6SGOlUEvV3o7IYli5Y=", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.8.tgz", + "integrity": "sha512-L/dvEBwyg3UowwqOUTyDsGBU6kjBQOpOhshio9V3i3BMPv5YUb9+mWNN8MK0IbWqT0AqaTSONZf0aTuMMahWgA==", "dev": true, "requires": { - "is": "^3.1.0" + "has": "^1.0.3", + "is": "^3.2.1" } }, "nopt": { @@ -11968,9 +12109,9 @@ } }, "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.2.tgz", + "integrity": "sha512-YcMnjqeoUckXTPKZSAsPjUPLxH85XotbpqK3w4RyCwdFQSU5FxxBys8buehkSfg0j9fKvV1hn7O0+8reEgkAiw==", "dev": true, "requires": { "hosted-git-info": "^2.1.4", @@ -12046,9 +12187,9 @@ } }, "nth-check": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", - "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", "dev": true, "requires": { "boolbase": "~1.0.0" @@ -12067,9 +12208,9 @@ "dev": true }, "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true }, "object-assign": { @@ -12103,43 +12244,6 @@ "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": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "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": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "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", @@ -12185,9 +12289,9 @@ }, "dependencies": { "object-keys": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", - "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", "dev": true } } @@ -12205,15 +12309,15 @@ } }, "object.entries": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.0.4.tgz", - "integrity": "sha1-G/mk3SKI9bM/Opk9JXZh8F0WGl8=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", + "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.6.1", - "function-bind": "^1.1.0", - "has": "^1.0.1" + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" } }, "object.map": { @@ -12257,15 +12361,15 @@ } }, "object.values": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz", - "integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", + "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.6.1", - "function-bind": "^1.1.0", - "has": "^1.0.1" + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" } }, "office-ui-fabric": { @@ -12286,29 +12390,6 @@ "@uifabric/utilities": ">=5.34.2 <6.0.0", "prop-types": "^15.5.10", "tslib": "^1.7.1" - }, - "dependencies": { - "@uifabric/styling": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@uifabric/styling/-/styling-5.37.0.tgz", - "integrity": "sha512-3hC0itW/hWSD5J4uANzUKk8XVGWUNkU+VLjEjWsQ6i5lvwFGaanR6Qy0bTkZdFGqFWMXe91CkBHV7HnvEx7tCA==", - "requires": { - "@microsoft/load-themed-styles": "^1.7.13", - "@uifabric/merge-styles": ">=5.17.1 <6.0.0", - "@uifabric/utilities": ">=5.34.2 <6.0.0", - "tslib": "^1.7.1" - } - }, - "@uifabric/utilities": { - "version": "5.34.2", - "resolved": "https://registry.npmjs.org/@uifabric/utilities/-/utilities-5.34.2.tgz", - "integrity": "sha512-7LDHamnrKpY49S49Nzu1YMTuBtZIgTsQd9AuWTvXlUevD67ZyjSRnhCKlKVZHwe/Vi0jWLIodbup4p5IyRGWoQ==", - "requires": { - "@uifabric/merge-styles": ">=5.17.1 <6.0.0", - "prop-types": "^15.5.10", - "tslib": "^1.7.1" - } - } } }, "on-finished": { @@ -12452,9 +12533,9 @@ "dev": true }, "osenv": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", - "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dev": true, "requires": { "os-homedir": "^1.0.0", @@ -12463,7 +12544,7 @@ }, "p-cancelable": { "version": "0.4.1", - "resolved": "http://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", "dev": true }, @@ -12495,14 +12576,14 @@ }, "p-is-promise": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", "dev": true }, "p-limit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", - "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "requires": { "p-try": "^1.0.0" @@ -12545,9 +12626,9 @@ } }, "pako": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.8.tgz", + "integrity": "sha512-6i0HVbUfcKaTv+EG8ZTr75az7GFXcLYk9UyLEg7Notv/Ma+z/UG3TCoz6GiNeOrn1E/e63I0X/Hpw18jHOTUnA==", "dev": true }, "param-case": { @@ -12560,16 +12641,17 @@ } }, "parse-asn1": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", - "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.3.tgz", + "integrity": "sha512-VrPoetlz7B/FqjBLD2f5wBVZvsZVLnRUrxVLfRYhGXCODa/NWE4p3Wp+6+aV3ZPL3KM7/OZmxDIwwijD7yuucg==", "dev": true, "requires": { "asn1.js": "^4.0.0", "browserify-aes": "^1.0.0", "create-hash": "^1.1.0", "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3" + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" } }, "parse-filepath": { @@ -12621,6 +12703,12 @@ "error-ex": "^1.2.0" } }, + "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", @@ -12706,9 +12794,9 @@ "dev": true }, "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, "path-root": { @@ -12759,9 +12847,9 @@ } }, "pbkdf2": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", - "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", "dev": true, "requires": { "create-hash": "^1.1.2", @@ -12859,73 +12947,33 @@ } }, "plugin-error": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", - "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "dev": true, + "requires": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "dev": true, "requires": { - "ansi-cyan": "^0.1.1", - "ansi-red": "^0.1.1", - "arr-diff": "^1.0.1", - "arr-union": "^2.0.1", - "extend-shallow": "^1.1.2" - }, - "dependencies": { - "arr-diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", - "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1", - "array-slice": "^0.2.3" - } - }, - "arr-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", - "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", - "dev": true - }, - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", - "dev": true - }, - "extend-shallow": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", - "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", - "dev": true, - "requires": { - "kind-of": "^1.1.0" - } - }, - "kind-of": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", - "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": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" }, "dependencies": { "ansi-styles": { @@ -13051,13 +13099,12 @@ } }, "postcss-filter-plugins": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz", - "integrity": "sha1-bYWGJTTXNaxCDkqFgG4fXUKG2Ew=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz", + "integrity": "sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ==", "dev": true, "requires": { - "postcss": "^5.0.4", - "uniqid": "^4.0.0" + "postcss": "^5.0.4" } }, "postcss-load-config": { @@ -13210,14 +13257,14 @@ }, "dependencies": { "postcss": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.16.tgz", - "integrity": "sha512-m758RWPmSjFH/2MyyG3UOW1fgYbR9rtdzz5UNJnlm7OLtu4B2h9C6gi+bE4qFKghsBRFfZT8NzoQBs6JhLotoA==", + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", "dev": true, "requires": { - "chalk": "^2.3.0", + "chalk": "^2.4.1", "source-map": "^0.6.1", - "supports-color": "^5.1.0" + "supports-color": "^5.4.0" } }, "source-map": { @@ -13225,15 +13272,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true - }, - "supports-color": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", - "integrity": "sha512-Ry0AwkoKjDpVKK4sV4h6o3UJmNRbjYm2uXhwfj3J56lMVdvnUNqzQVRztOOMGQ++w1K/TjNDFvpJk0F/LoeBCQ==", - "dev": true, - "requires": { - "has-flag": "^2.0.0" - } } } }, @@ -13248,14 +13286,14 @@ }, "dependencies": { "postcss": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.16.tgz", - "integrity": "sha512-m758RWPmSjFH/2MyyG3UOW1fgYbR9rtdzz5UNJnlm7OLtu4B2h9C6gi+bE4qFKghsBRFfZT8NzoQBs6JhLotoA==", + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", "dev": true, "requires": { - "chalk": "^2.3.0", + "chalk": "^2.4.1", "source-map": "^0.6.1", - "supports-color": "^5.1.0" + "supports-color": "^5.4.0" } }, "source-map": { @@ -13263,15 +13301,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true - }, - "supports-color": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", - "integrity": "sha512-Ry0AwkoKjDpVKK4sV4h6o3UJmNRbjYm2uXhwfj3J56lMVdvnUNqzQVRztOOMGQ++w1K/TjNDFvpJk0F/LoeBCQ==", - "dev": true, - "requires": { - "has-flag": "^2.0.0" - } } } }, @@ -13286,14 +13315,14 @@ }, "dependencies": { "postcss": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.16.tgz", - "integrity": "sha512-m758RWPmSjFH/2MyyG3UOW1fgYbR9rtdzz5UNJnlm7OLtu4B2h9C6gi+bE4qFKghsBRFfZT8NzoQBs6JhLotoA==", + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", "dev": true, "requires": { - "chalk": "^2.3.0", + "chalk": "^2.4.1", "source-map": "^0.6.1", - "supports-color": "^5.1.0" + "supports-color": "^5.4.0" } }, "source-map": { @@ -13301,15 +13330,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true - }, - "supports-color": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", - "integrity": "sha512-Ry0AwkoKjDpVKK4sV4h6o3UJmNRbjYm2uXhwfj3J56lMVdvnUNqzQVRztOOMGQ++w1K/TjNDFvpJk0F/LoeBCQ==", - "dev": true, - "requires": { - "has-flag": "^2.0.0" - } } } }, @@ -13324,14 +13344,14 @@ }, "dependencies": { "postcss": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.16.tgz", - "integrity": "sha512-m758RWPmSjFH/2MyyG3UOW1fgYbR9rtdzz5UNJnlm7OLtu4B2h9C6gi+bE4qFKghsBRFfZT8NzoQBs6JhLotoA==", + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", "dev": true, "requires": { - "chalk": "^2.3.0", + "chalk": "^2.4.1", "source-map": "^0.6.1", - "supports-color": "^5.1.0" + "supports-color": "^5.4.0" } }, "source-map": { @@ -13339,15 +13359,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true - }, - "supports-color": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", - "integrity": "sha512-Ry0AwkoKjDpVKK4sV4h6o3UJmNRbjYm2uXhwfj3J56lMVdvnUNqzQVRztOOMGQ++w1K/TjNDFvpJk0F/LoeBCQ==", - "dev": true, - "requires": { - "has-flag": "^2.0.0" - } } } }, @@ -13447,9 +13458,9 @@ } }, "postcss-value-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", - "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true }, "postcss-zindex": { @@ -13500,9 +13511,9 @@ "dev": true }, "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "dev": true }, "progress": { @@ -13515,16 +13526,16 @@ "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, "requires": { "asap": "~2.0.3" } }, "prop-types": { - "version": "15.6.0", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz", - "integrity": "sha1-zq8IMCL8RrSjX2nhPvda7Q1jmFY=", + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", + "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", "requires": { - "fbjs": "^0.8.16", "loose-envify": "^1.3.1", "object-assign": "^4.1.1" } @@ -13557,23 +13568,30 @@ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", "dev": true }, + "psl": { + "version": "1.1.31", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", + "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", + "dev": true + }, "public-encrypt": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", - "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "dev": true, "requires": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", "create-hash": "^1.1.0", "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1" + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, "q": { @@ -13583,9 +13601,9 @@ "dev": true }, "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, "query-string": { @@ -13617,23 +13635,21 @@ "dev": true }, "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", "dev": true, "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" }, "dependencies": { - "kind-of": { + "is-number": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true } } }, @@ -13647,9 +13663,9 @@ } }, "randomfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.3.tgz", - "integrity": "sha512-YL6GrhrWoic0Eq8rXVbMptH7dAxCs0J+mh5Y0euNekPPYaxEmdVGim6GdoxoRzKW2yJoU8tueifS7mYxvcFDEQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "dev": true, "requires": { "randombytes": "^2.0.5", @@ -13663,24 +13679,24 @@ "dev": true }, "raw-body": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", - "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", "dev": true, "requires": { "bytes": "3.0.0", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", "unpipe": "1.0.0" } }, "rc": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.4.tgz", - "integrity": "sha1-oPYGyq4qO4YrvQ74VILAElsxX6M=", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "requires": { - "deep-extend": "~0.4.0", + "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" @@ -13740,24 +13756,24 @@ "dev": true }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", + "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "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" @@ -13799,15 +13815,14 @@ } }, "readdirp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "minimatch": "^3.0.2", - "readable-stream": "^2.0.2", - "set-immediate-shim": "^1.0.1" + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" }, "dependencies": { "isarray": { @@ -13817,24 +13832,24 @@ "dev": true }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", + "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "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" @@ -13918,9 +13933,15 @@ } }, "regenerate": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", - "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", "dev": true }, "regex-cache": { @@ -13933,12 +13954,13 @@ } }, "regex-not": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.0.tgz", - "integrity": "sha1-Qvg+OXcWIt+CawKvF2Ul1qXxV/k=", + "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": "^2.0.1" + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" } }, "regexpu-core": { @@ -14006,12 +14028,68 @@ "through2": "2.0.1" }, "dependencies": { + "arr-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", + "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1", + "array-slice": "^0.2.3" + } + }, + "arr-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", + "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", + "dev": true + }, + "array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "dev": true + }, + "extend-shallow": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", + "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", + "dev": true, + "requires": { + "kind-of": "^1.1.0" + } + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, + "kind-of": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", + "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", + "dev": true + }, + "plugin-error": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", + "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", + "dev": true, + "requires": { + "ansi-cyan": "^0.1.1", + "ansi-red": "^0.1.1", + "arr-diff": "^1.0.1", + "arr-union": "^2.0.1", + "extend-shallow": "^1.1.2" + } + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, "readable-stream": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", @@ -14051,9 +14129,9 @@ "dev": true }, "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", "dev": true }, "repeat-string": { @@ -14095,24 +14173,24 @@ "dev": true }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", + "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "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" @@ -14121,33 +14199,31 @@ } }, "request": { - "version": "2.83.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", - "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", "dev": true, "requires": { "aws-sign2": "~0.7.0", - "aws4": "^1.6.0", + "aws4": "^1.8.0", "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.1", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", "forever-agent": "~0.6.1", - "form-data": "~2.3.1", - "har-validator": "~5.0.3", - "hawk": "~6.0.2", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.17", - "oauth-sign": "~0.8.2", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", "performance-now": "^2.1.0", - "qs": "~6.5.1", - "safe-buffer": "^5.1.1", - "stringstream": "~0.0.5", - "tough-cookie": "~2.3.3", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", "tunnel-agent": "^0.6.0", - "uuid": "^3.1.0" + "uuid": "^3.3.2" } }, "request-progress": { @@ -14190,12 +14266,12 @@ "dev": true }, "resolve": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", - "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", + "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", "dev": true, "requires": { - "path-parse": "^1.0.5" + "path-parse": "^1.0.6" } }, "resolve-dir": { @@ -14233,6 +14309,12 @@ "lowercase-keys": "^1.0.0" } }, + "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 + }, "right-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", @@ -14252,12 +14334,12 @@ } }, "ripemd160": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dev": true, "requires": { - "hash-base": "^2.0.0", + "hash-base": "^3.0.0", "inherits": "^2.0.1" } }, @@ -14268,15 +14350,33 @@ "dev": true }, "rtl-css-js": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.10.0.tgz", - "integrity": "sha512-R6lk4bRxdpSWE5ZPyMLcY4ZcqeuaFXti1zW1vJHXiXLuK5+VC1ttSjXSKD0k9t0G6+lkBVMTxy6eVgLXHYxLHA==", - "dev": true + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.11.0.tgz", + "integrity": "sha512-YnZ6jWxZxlWlcQAGF9vOmiF9bEmoQmSHE+wsrsiILkdK9HqiRPAIll4SY/QDzbvEu2lB2h62+hfg3TYzjnldbA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.1.2" + } }, "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "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": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, "samsam": { @@ -14385,7 +14485,7 @@ "dependencies": { "commander": { "version": "2.8.1", - "resolved": "http://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", "dev": true, "requires": { @@ -14586,21 +14686,6 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, - "set-getter": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz", - "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=", - "dev": true, - "requires": { - "to-object-path": "^0.3.0" - } - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true - }, "set-value": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", @@ -14611,23 +14696,35 @@ "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": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true }, "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", "dev": true }, "sha.js": { - "version": "2.4.10", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.10.tgz", - "integrity": "sha512-vnwmrFDlOExK4Nm16J2KMWHLrp14lBrjxMxBJpu++EnsuBmpiYaM/MEs46Vxxm/4FvdP5yTwuCTO9it5FSjrqA==", + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { "inherits": "^2.0.1", @@ -14673,13 +14770,6 @@ "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", "requires": { "is-arrayish": "^0.3.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - } } }, "sinon": { @@ -14721,9 +14811,9 @@ "dev": true }, "snapdragon": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.1.tgz", - "integrity": "sha1-4StUh/re0+PeoKyR6UAL91tAE3A=", + "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", @@ -14733,7 +14823,7 @@ "map-cache": "^0.2.2", "source-map": "^0.5.6", "source-map-resolve": "^0.5.0", - "use": "^2.0.0" + "use": "^3.1.0" }, "dependencies": { "define-property": { @@ -14745,62 +14835,14 @@ "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": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "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": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "is-extendable": "^0.1.0" } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "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": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "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 } } }, @@ -14813,6 +14855,46 @@ "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": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "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-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" + } + } } }, "snapdragon-util": { @@ -14836,12 +14918,12 @@ } }, "sntp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", - "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", "dev": true, "requires": { - "hoek": "4.x.x" + "hoek": "2.x.x" } }, "socket.io": { @@ -14997,9 +15079,15 @@ "slugify": "1.3.1" }, "dependencies": { + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, "load-json-file": { "version": "2.0.0", - "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { @@ -15019,9 +15107,9 @@ } }, "progress": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.1.tgz", - "integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, "read-pkg": { @@ -15062,9 +15150,9 @@ } }, "source-list-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", - "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", "dev": true }, "source-map": { @@ -15102,12 +15190,12 @@ } }, "source-map-resolve": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", - "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", "dev": true, "requires": { - "atob": "^2.0.0", + "atob": "^2.1.1", "decode-uri-component": "^0.2.0", "resolve-url": "^0.2.1", "source-map-url": "^0.4.0", @@ -15121,30 +15209,41 @@ "dev": true }, "sparkles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", - "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", "dev": true }, "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", "dev": true, "requires": { - "spdx-license-ids": "^1.0.2" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, - "spdx-expression-parse": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", - "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", "dev": true }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, "spdx-license-ids": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", + "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==", "dev": true }, "split": { @@ -15163,27 +15262,6 @@ "dev": true, "requires": { "extend-shallow": "^3.0.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "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" - } - } } }, "sprintf-js": { @@ -15193,9 +15271,9 @@ "dev": true }, "sshpk": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", - "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", "dev": true, "requires": { "asn1": "~0.2.3", @@ -15205,6 +15283,7 @@ "ecc-jsbn": "~0.1.1", "getpass": "^0.1.1", "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" } }, @@ -15226,76 +15305,19 @@ "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": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "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": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "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": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "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": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "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 } } }, "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", "dev": true }, "stdout-stream": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.0.tgz", - "integrity": "sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s=", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", "dev": true, "requires": { "readable-stream": "^2.0.1" @@ -15308,24 +15330,24 @@ "dev": true }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", + "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "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" @@ -15334,9 +15356,9 @@ } }, "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", "dev": true, "requires": { "inherits": "~2.0.1", @@ -15350,24 +15372,24 @@ "dev": true }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", + "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "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" @@ -15385,9 +15407,9 @@ } }, "stream-consume": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.0.tgz", - "integrity": "sha1-pB6tGm1ggc63n2WwYZAbbY89HQ8=", + "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 }, "stream-counter": { @@ -15400,14 +15422,14 @@ } }, "stream-http": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.0.tgz", - "integrity": "sha512-sZOFxI/5xw058XIRHl4dU3dZ+TTOIGJR78Dvo0oEAejIt4ou27k+3ne1zYmCV+v7UucbxIFQuOgnkTVHh8YPnw==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", "dev": true, "requires": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.1", - "readable-stream": "^2.3.3", + "readable-stream": "^2.3.6", "to-arraybuffer": "^1.0.0", "xtend": "^4.0.0" }, @@ -15419,24 +15441,24 @@ "dev": true }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", + "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "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" @@ -15480,9 +15502,9 @@ "dev": true }, "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", + "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==", "dev": true }, "strip-ansi": { @@ -15576,12 +15598,12 @@ } }, "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "^2.0.0" + "has-flag": "^3.0.0" } }, "svgo": { @@ -15599,6 +15621,12 @@ "whet.extend": "~0.9.9" }, "dependencies": { + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, "js-yaml": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", @@ -15624,9 +15652,9 @@ "dev": true }, "tapable": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", - "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.9.tgz", + "integrity": "sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==", "dev": true }, "tar": { @@ -15661,15 +15689,9 @@ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -15724,12 +15746,12 @@ "dev": true }, "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "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.1.5", + "readable-stream": "~2.3.6", "xtend": "~4.0.1" }, "dependencies": { @@ -15740,24 +15762,24 @@ "dev": true }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", + "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "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" @@ -15797,9 +15819,9 @@ "dev": true }, "timers-browserify": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.6.tgz", - "integrity": "sha512-HQ3nbYRAowdVd0ckGFvmJPPCOH/CHleFN/Y0YQCX1DVaB7t+KFvisuyN09fuP8Jtp1CpfSh8O8bMkHbdbPe6Pw==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", "dev": true, "requires": { "setimmediate": "^1.0.4" @@ -15925,6 +15947,17 @@ "dev": true, "requires": { "extend-shallow": "^2.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, "to-array": { @@ -15966,82 +15999,15 @@ } }, "to-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.1.tgz", - "integrity": "sha1-FTWL7kosg712N3uh3ASdDxiDeq4=", + "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": "^0.2.5", - "extend-shallow": "^2.0.1", - "regex-not": "^1.0.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "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": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "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": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "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": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "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": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "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 - } + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" } }, "to-regex-range": { @@ -16055,12 +16021,21 @@ } }, "tough-cookie": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", - "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", "dev": true, "requires": { + "psl": "^1.1.24", "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } } }, "tr46": { @@ -16085,27 +16060,12 @@ } }, "true-case-path": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.2.tgz", - "integrity": "sha1-fskRMJJHZsf1c74wIMNPj9/QDWI=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", "dev": true, "requires": { - "glob": "^6.0.4" - }, - "dependencies": { - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } + "glob": "^7.1.2" } }, "try-json-parse": { @@ -16138,9 +16098,9 @@ } }, "tslint-microsoft-contrib": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/tslint-microsoft-contrib/-/tslint-microsoft-contrib-5.0.2.tgz", - "integrity": "sha1-7MKnl/d3oS8AZpRM7AyBqefFnuk=", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/tslint-microsoft-contrib/-/tslint-microsoft-contrib-5.0.3.tgz", + "integrity": "sha512-5AnfTGlfpUzpRHLmoojPBKFTTmbjnwgdaTHMdllausa4GBPya5u36i9ddrTX4PhetGZvd4JUYIpAmgHqVnsctg==", "dev": true, "requires": { "tsutils": "^2.12.1" @@ -16153,9 +16113,9 @@ "dev": true }, "tsutils": { - "version": "2.19.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.19.1.tgz", - "integrity": "sha512-1B3z4H4HddgzWptqLzwrJloDEsyBt8DvZhnFO14k7A4RsQL/UhEfQjD4hpcY5NpF3veBkjJhQJ8Bl7Xp96cN+A==", + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", "dev": true, "requires": { "tslib": "^1.8.1" @@ -16180,8 +16140,7 @@ "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true + "dev": true }, "type-check": { "version": "0.3.2", @@ -16199,13 +16158,13 @@ "dev": true }, "type-is": { - "version": "1.6.15", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", - "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", "dev": true, "requires": { "media-typer": "0.3.0", - "mime-types": "~2.1.15" + "mime-types": "~2.1.18" } }, "typedarray": { @@ -16221,19 +16180,51 @@ "dev": true }, "ua-parser-js": { - "version": "0.7.17", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz", - "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==" + "version": "0.7.19", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.19.tgz", + "integrity": "sha512-T3PVJ6uz8i0HzPxOF9SWzWAlfN/DavlpQqepn22xgve/5QecC+XMCAtmUNnY7C9StehaV6exjUCI801lOI7QlQ==", + "dev": true }, "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", + "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", + "dev": true, + "requires": { + "commander": "~2.17.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + }, + "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 + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "uglifyjs-webpack-plugin": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", + "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", "dev": true, "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" + "source-map": "^0.5.6", + "uglify-js": "^2.8.29", + "webpack-sources": "^1.0.1" }, "dependencies": { "camelcase": { @@ -16253,6 +16244,17 @@ "wordwrap": "0.0.2" } }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + } + }, "window-size": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", @@ -16279,24 +16281,6 @@ } } }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true - }, - "uglifyjs-webpack-plugin": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", - "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", - "dev": true, - "requires": { - "source-map": "^0.5.6", - "uglify-js": "^2.8.29", - "webpack-sources": "^1.0.1" - } - }, "uid-safe": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.4.tgz", @@ -16330,7 +16314,7 @@ }, "buffer": { "version": "3.6.0", - "resolved": "http://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz", "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=", "dev": true, "requires": { @@ -16360,9 +16344,9 @@ "dev": true }, "underscore.string": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.4.tgz", - "integrity": "sha1-LCo/n4PmR2L9xF5s6sZRQoZCE9s=", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz", + "integrity": "sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==", "dev": true, "requires": { "sprintf-js": "^1.0.3", @@ -16381,6 +16365,15 @@ "set-value": "^0.4.3" }, "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, "set-value": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", @@ -16401,15 +16394,6 @@ "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", "dev": true }, - "uniqid": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz", - "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=", - "dev": true, - "requires": { - "macaddress": "^0.2.8" - } - }, "uniqs": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", @@ -16480,6 +16464,12 @@ "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=", "dev": true }, + "upath": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", + "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", + "dev": true + }, "update-notifier": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-1.0.3.tgz", @@ -16529,6 +16519,15 @@ "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", "dev": true }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", @@ -16575,83 +16574,10 @@ "dev": true }, "use": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/use/-/use-2.0.2.tgz", - "integrity": "sha1-riig1y+TvyJCKhii43mZMRLeyOg=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "lazy-cache": "^2.0.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "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": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "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": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "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": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "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": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "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 - } - } + "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", @@ -16670,9 +16596,9 @@ }, "dependencies": { "lru-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, "requires": { "pseudomap": "^1.0.2", @@ -16682,20 +16608,12 @@ } }, "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", "dev": true, "requires": { - "inherits": "2.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - } + "inherits": "2.0.3" } }, "util-deprecate": { @@ -16711,9 +16629,9 @@ "dev": true }, "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", "dev": true }, "v8flags": { @@ -16732,13 +16650,13 @@ "dev": true }, "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "requires": { - "spdx-correct": "~1.0.0", - "spdx-expression-parse": "~1.0.0" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, "validator": { @@ -16754,9 +16672,9 @@ "dev": true }, "vendors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.1.tgz", - "integrity": "sha1-N61zyO5Bf7PVgOeFMSMH0nSEfyI=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.2.tgz", + "integrity": "sha512-w/hry/368nO21AN9QljsaIhb9ZiZtZARoVH5f3CsFbawdLdayCgKRPup7CggujvySMxx0I91NOyxdVENohprLQ==", "dev": true }, "verror": { @@ -16877,23 +16795,75 @@ "dev": true }, "watchpack": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", - "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", "dev": true, "requires": { - "async": "^2.1.2", - "chokidar": "^1.7.0", - "graceful-fs": "^4.1.2" + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" }, "dependencies": { - "async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "chokidar": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", + "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.2.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "lodash.debounce": "^4.0.8", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.5" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "dev": true, "requires": { - "lodash": "^4.14.0" + "is-extglob": "^2.1.1" } } } @@ -16934,6 +16904,18 @@ "yargs": "^8.0.2" }, "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", @@ -16941,20 +16923,32 @@ "dev": true }, "async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", "dev": true, "requires": { - "lodash": "^4.14.0" + "lodash": "^4.17.10" } }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, "camelcase": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", "dev": true }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", @@ -16964,12 +16958,24 @@ "locate-path": "^2.0.0" } }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, "load-json-file": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", @@ -16983,16 +16989,33 @@ } }, "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", "dev": true, "requires": { - "big.js": "^3.1.3", + "big.js": "^5.2.2", "emojis-list": "^2.0.0", - "json5": "^0.5.0" + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } } }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, "os-locale": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", @@ -17059,6 +17082,15 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "^2.0.0" + } + }, "yargs": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", @@ -17105,17 +17137,17 @@ }, "dependencies": { "time-stamp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz", - "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.2.0.tgz", + "integrity": "sha512-zxke8goJQpBeEgD82CXABeMh0LSJcj7CXEd0OHOg45HgcofF7pxNwZm9+RknpxpDhwN4gFpySkApKfFYfRQnUA==", "dev": true } } }, "webpack-sources": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", - "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", + "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", "dev": true, "requires": { "source-list-map": "^2.0.0", @@ -17131,24 +17163,26 @@ } }, "webpack-stream": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/webpack-stream/-/webpack-stream-4.0.0.tgz", - "integrity": "sha1-82c92QfW2bHqe/UfzR24W1/Z4PI=", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/webpack-stream/-/webpack-stream-4.0.3.tgz", + "integrity": "sha512-Tx7ks7Of/JiPz7/tUM4WqSg4OcXF4m4OzNSaEzNA1TNXQaiTHIjiKqUoL79wGXbFt2q1IP8VG5DcEdaxifY5Ew==", "dev": true, "requires": { - "gulp-util": "^3.0.7", + "fancy-log": "^1.3.2", "lodash.clone": "^4.3.2", "lodash.some": "^4.2.2", "memory-fs": "^0.4.1", + "plugin-error": "^1.0.1", + "supports-color": "^5.3.0", "through": "^2.3.8", "vinyl": "^2.1.0", "webpack": "^3.4.1" }, "dependencies": { "clone": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", - "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", "dev": true }, "clone-stats": { @@ -17164,9 +17198,9 @@ "dev": true }, "vinyl": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz", - "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", "dev": true, "requires": { "clone": "^2.1.1", @@ -17196,9 +17230,9 @@ "dev": true }, "whatwg-fetch": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", - "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", + "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" }, "whatwg-url": { "version": "4.7.1", @@ -17217,9 +17251,9 @@ "dev": true }, "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "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" @@ -17232,12 +17266,12 @@ "dev": true }, "wide-align": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", - "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "requires": { - "string-width": "^1.0.2" + "string-width": "^1.0.2 || 2" } }, "widest-line": { @@ -17319,12 +17353,6 @@ "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=", "dev": true }, - "xml-char-classes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", - "integrity": "sha1-ZGV4SKIP/F31g6Qq2KJ3tFErvE0=", - "dev": true - }, "xml2js": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.2.7.tgz", diff --git a/src/Progress.ts b/src/Progress.ts new file mode 100644 index 000000000..350f9fad7 --- /dev/null +++ b/src/Progress.ts @@ -0,0 +1 @@ +export * from './controls/progress'; \ No newline at end of file diff --git a/src/controls/progress/Action.tsx b/src/controls/progress/Action.tsx index 5df738d3a..a4fcca303 100644 --- a/src/controls/progress/Action.tsx +++ b/src/controls/progress/Action.tsx @@ -1,47 +1,48 @@ import * as React from 'react'; -import { IProgressActionInternal, ProgressActionState } from './IProgress'; +import { IActionProps, ProgressActionState } from './IProgress'; import styles from './Progress.module.scss'; import { Spinner, SpinnerSize } from 'office-ui-fabric-react/lib/Spinner'; import { Icon } from 'office-ui-fabric-react/lib/Icon'; import { Label } from 'office-ui-fabric-react/lib/Label'; import { css } from 'office-ui-fabric-react/lib/Utilities'; -export class Action extends React.Component { - public render(): React.ReactElement { +export class Action extends React.Component { + public render(): React.ReactElement { const { state, subActionsTitles, errorMessage, - title + title, + className } = this.props; const inactive: boolean = state === ProgressActionState.notStarted; const labelClassName = inactive ? css(styles.label, styles.inactive) : styles.label; let iconName = ''; - let className = ''; + let iconClassName = ''; switch (state) { case ProgressActionState.finished: iconName = 'CheckMark'; - className = styles.successIcon; + iconClassName = styles.successIcon; break; case ProgressActionState.notStarted: iconName = 'CheckMark'; - className = styles.inactiveIcon; + iconClassName = styles.inactiveIcon; break; case ProgressActionState.errored: iconName = 'Cancel'; - className = styles.errorIcon; + iconClassName = styles.errorIcon; break; } return ( -
+
- {iconName ? : } + {iconName ? : }
{title}
{subActionsTitles &&
- {subActionsTitles.map(saTitle => { - return
{saTitle}
; + {subActionsTitles.map((saTitle, index) => { + return
{saTitle}
; })}
} {state === ProgressActionState.errored && diff --git a/src/controls/progress/IProgress.ts b/src/controls/progress/IProgress.ts index e2074c88b..a42844b57 100644 --- a/src/controls/progress/IProgress.ts +++ b/src/controls/progress/IProgress.ts @@ -1,38 +1,127 @@ -export interface IProgressActionExecutionResult { - hasError?: boolean; - isCriticalError?: boolean; - errorMessage?: boolean; - actionParameters?: any; -} - +/** + * Progress Action + */ export interface IProgressAction { + /** + * Action title + */ title: string; + /** + * Sub actions titles + */ subActionsTitles?: string[]; + /** + * Flag in the action has errored during the execution. Needed to correctly display action's icon + */ + hasError?: boolean; + /** + * Error message + */ + errorMessage?: string; } +/** + * Possible action's states + */ export enum ProgressActionState { + /** + * Not started yet + */ notStarted, + /** + * Currently in progress + */ inProgress, + /** + * Finished with no errors + */ finished, + /** + * Errored + */ errored } -export interface IProgressActionInternal extends IProgressAction { - state: ProgressActionState; - errorMessage?: string; -} - +/** + * Progress component properties + */ export interface IProgressProps { - title: string; + /** + * Title (header) + */ + title?: string; + /** + * Flag if overall progress indicator should be shown + */ showOverallProgress: boolean; + /** + * Flag if indeterminate progress animation will be shown + */ + showIndeterminateOverallProgress?: boolean; + /** + * Flag if not started actions should not be rendered + */ + hideNotStartedActions: boolean; + /** + * Progress actions + */ actions: IProgressAction[]; - executeAction: (action: IProgressAction, actionParameters: any) => Promise; - onConfigurationComplete: () => void; - onConfigurationFailed: () => void; + /** + * Current executing action + */ + currentActionIndex?: number; + /** + * Height of the component + */ + height?: string; + /** + * Text to display for long running operations + */ + longRunningText?: string; + /** + * Delay until longRunningText is displayed im milliseconds. + * If not set or 0 longRunningText is displayed right away. + */ + longRunningTextDisplayDelay?: number; + /** + * Class name to be applied to the component + */ + className?: string; + /** + * Header class name. Header contains title, progress indicator, and delay text + */ + headerClassName?: string; + /** + * Actions container class name + */ + actionsContainerClassName?: string; + /** + * Single action class name + */ + actionClassName?: string; + } +/** + * Progress component state + */ export interface IProgressState { - actions?: IProgressActionInternal[]; - currentStep?: number; - hasError?: boolean; + /** + * flag if long running text should be displayed + */ + showLongRunningText?: boolean; +} + +/** + * Action component properties + */ +export interface IActionProps extends IProgressAction { + /** + * Action state + */ + state: ProgressActionState; + /** + * Action class name + */ + className?: string; } \ No newline at end of file diff --git a/src/controls/progress/Progress.module.scss b/src/controls/progress/Progress.module.scss index 471fa3b8a..e021f6a96 100644 --- a/src/controls/progress/Progress.module.scss +++ b/src/controls/progress/Progress.module.scss @@ -1,71 +1,102 @@ -.actionContainer { - margin-bottom: 20px; +.progress { + display: flex; + flex-direction: column; - .actionHeader { - display: flex; - - .actionIcon { - margin-right: 8px; - line-height: 16px; - font-size: 16px; - flex-shrink: 0; - font-weight: 700; - - &.successIcon { - color: "[theme: accent, default: #038387]"; - } - - &.errorIcon { - color: "[theme: errorText, default: #a80000]"; - } + .header { + margin: 12px 0 20px; + .title { + font-weight: 600; + } - &.inactiveIcon { - color: "[theme: disableSubtext, default: #d0d0d0]" - } + .progressIndicator { + margin-top: 10px; } - - .spinner { - display: inline-block; + + .progressSubtext { + font-size: 12px; } - .label { - font-size: 14px; - flex-shrink: 1; - flex-grow: 1; - flex-basis: 0; - overflow-wrap: break-word; - word-wrap: break-word; - line-height: 16px; - color: "[theme: bodyText, default: #333333]"; - - &.inactive { - color: "[theme: disabledBodyText, default: #a6a6a6]"; - } + .longRunningText { + font-size: 12px; + color: "[theme: bodySubtext, default: #666666]"; + margin: 12px 0 0; } } - .errorContainer { - margin-top: 8px; + .actionsContainer { + overflow-y: auto; + margin-bottom: 20px; + .actionContainer { + margin-bottom: 20px; - .errorMessage { - margin-left: 24px; - color: "[theme: errorText, default: #a80000]"; - line-height: 14px; - font-size: 14px; - font-weight: 700; - } - } + .actionHeader { + display: flex; - .subActionsContainer { - margin-top: 8px; + .actionIcon { + margin-right: 8px; + line-height: 16px; + font-size: 16px; + flex-shrink: 0; + font-weight: 700; - .label { - color: "[theme: bodySubtext, default: #666666]"; - margin-left: 24px; - font-size: 11px; + &.successIcon { + color: "[theme: accent, default: #038387]"; + } + + &.errorIcon { + color: "[theme: errorText, default: #a80000]"; + } + + &.inactiveIcon { + color: "[theme: disableSubtext, default: #d0d0d0]" + } + } + + .spinner { + display: inline-block; + } + .label { + font-size: 14px; + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0; + overflow-wrap: break-word; + word-wrap: break-word; + line-height: 16px; + color: "[theme: bodyText, default: #333333]"; + + &.inactive { + color: "[theme: disabledBodyText, default: #a6a6a6]"; + } + + } + } + + .errorContainer { + margin-top: 8px; + + .errorMessage { + margin-left: 24px; + color: "[theme: errorText, default: #a80000]"; + line-height: 14px; + font-size: 14px; + font-weight: 700; + padding: 0; + } + } + + .subActionsContainer { + margin-top: 8px; + + .label { + color: "[theme: bodySubtext, default: #666666]"; + margin-left: 24px; + font-size: 11px; - &.inactive { - color: "[theme: disabledBodySubtext, default: #666666]"; + &.inactive { + color: "[theme: disabledBodySubtext, default: #666666]"; + } + } } } } diff --git a/src/controls/progress/Progress.tsx b/src/controls/progress/Progress.tsx index 8f4fcf93d..bfb0375e6 100644 --- a/src/controls/progress/Progress.tsx +++ b/src/controls/progress/Progress.tsx @@ -1,9 +1,162 @@ import * as React from 'react'; -import { IProgressProps, IProgressState } from './IProgress'; +import { IProgressProps, IProgressAction, IActionProps, ProgressActionState, IProgressState } from './IProgress'; +import { Action } from './Action'; +import { ProgressIndicator } from 'office-ui-fabric-react/lib/ProgressIndicator'; +import { css } from 'office-ui-fabric-react/lib/Utilities'; +import styles from './Progress.module.scss'; +/** + * Component to show progress of multiple SEQUENTIALLY executed actions + */ export class Progress extends React.Component { constructor(props: IProgressProps) { super(props); + + this.state = { + showLongRunningText: props.longRunningText && !props.longRunningTextDisplayDelay + }; + } + + public componentDidUpdate() { + // + // Check if we need to start a timer to display long running text + // + if (this.props.longRunningText && this.props.longRunningTextDisplayDelay && + this.props.currentActionIndex === 0) { + setTimeout(() => { + this.setState({ + showLongRunningText: true + }); + }, this.props.longRunningTextDisplayDelay); + } + + // + // long running text should be hidden if all the actions have been executed + // + if (this.state.showLongRunningText && this.props.currentActionIndex >= this.props.actions.length) { + this.setState({ + showLongRunningText: false + }); + } + } + + public shouldComponentUpdate(nextProps: IProgressProps): boolean { + if (this.props.currentActionIndex !== nextProps.currentActionIndex || + this.props.showOverallProgress !== nextProps.showOverallProgress || + this.props.title !== nextProps.title || + !this._areActionsEqual(this.props.actions, nextProps.actions)) { + return true; + } + } + + public render(): React.ReactElement { + const { + currentActionIndex, + showOverallProgress, + showIndeterminateOverallProgress, + hideNotStartedActions, + title, + actions, + height, + longRunningText, + className, + headerClassName, + actionClassName, + actionsContainerClassName + } = this.props; + + // correcting action index if props contain incorrect one + let actionIndex = currentActionIndex; + if (actionIndex > actions.length) { + actionIndex = actions.length; + } + + // getting actions to be rendered based on hideNotStartedActions flag + const actionsToRender: IProgressAction[] = hideNotStartedActions ? actions.filter((a, index) => { + return index <= currentActionIndex; + }) : actions; + + const actionEls: JSX.Element[] = actionsToRender.map((a, index) => { + let state = ProgressActionState.notStarted; // by default the state is not started + if (actionIndex === index) { // current action is in progress + state = ProgressActionState.inProgress; + } + else if (index < actionIndex) { + if (a.hasError) { // finished with error + state = ProgressActionState.errored; + } + else { // finished with no errors + state = ProgressActionState.finished; + } + } + + return ; + + }); + + // + // calculating progress and progressSubText based on parameters + // + let progress: number | null = 0; + let progressSubTtext = ''; + if (showIndeterminateOverallProgress) { + if (actionIndex !== undefined || actionIndex < actions.length) { + progress = null; + progressSubTtext = `${(actionIndex / actions.length * 100).toFixed(0)}%`; + } + } + else { + progress = actionIndex ? actionIndex / actions.length : 0; + progressSubTtext = actionIndex !== undefined ? `${(progress * 100).toFixed(0)}%` : ''; + } + + // + // logic: + // header is displayed if title, showOverallProgress, or showLongRunnungText are set + // progress indicator is shown if showOverallProgress is set to true + // progress indicator subtext is shown if showOverallProgress is set to true and there is a text to display (see if section above) + // long running text is shown if there is a text and we waited needed delay time + // + return
+ { + (title || showOverallProgress || this.state.showLongRunningText) && +
+
{title}
+ {showOverallProgress && +
+ +
} + {showOverallProgress && progressSubTtext && + {progressSubTtext}} + {this.state.showLongRunningText && +
{longRunningText}
} +
+ } +
+ {actionEls} +
+
; + + } + + private _areActionsEqual(actions: IProgressAction[], nextActions: IProgressAction[]): boolean { + if (actions.length !== nextActions.length) { + return false; + } + + for (let i = 0, len = actions.length; i < len; i++) { + const action = actions[i]; + const nextAction = nextActions[i]; + + // comparing error state only, + // assuming that actions can't be changed during the progress execution + if (action.hasError !== nextAction.hasError) { + return false; + } + } + + return true; } } \ No newline at end of file diff --git a/src/controls/progress/index.ts b/src/controls/progress/index.ts new file mode 100644 index 000000000..e63a84eb0 --- /dev/null +++ b/src/controls/progress/index.ts @@ -0,0 +1,2 @@ +export * from './IProgress'; +export * from './Progress'; \ No newline at end of file diff --git a/src/loc/en-us.ts b/src/loc/en-us.ts index 643836c34..641521c6a 100644 --- a/src/loc/en-us.ts +++ b/src/loc/en-us.ts @@ -62,6 +62,6 @@ define([], () => { genericNoResultsFoundText: 'No results found', - ListViewFilterLabel: "Filter the list" + ListViewFilterLabel: "Filter the list", }; }); diff --git a/src/webparts/controlsTest/components/ControlsTest.tsx b/src/webparts/controlsTest/components/ControlsTest.tsx index c87481278..c4d953ae8 100644 --- a/src/webparts/controlsTest/components/ControlsTest.tsx +++ b/src/webparts/controlsTest/components/ControlsTest.tsx @@ -22,6 +22,7 @@ import { getItemClassNames } from 'office-ui-fabric-react/lib/components/Context import { ListItemPicker } from "../../../ListItemPicker"; import { Map, ICoordinates, MapType } from '../../../Map'; import { ChartControl, ChartType } from "../../../ChartControl"; +import { Progress, IProgressAction, IProgressProps } from '../../../Progress'; /** * Component that can be used to test out the React controls from this project @@ -36,11 +37,13 @@ export default class ControlsTest extends React.Component { + const actions = this.state.progressActions; + + if (currentIndex >= actions.length) { + clearInterval(intervalId); + } + else { + const action = actions[currentIndex]; + if (currentIndex == 1) { // just a test for error + action.hasError = true; + action.errorMessage = 'some error message'; + } + } + + this.setState({ + currentProgressActionIndex: currentIndex, + progressActions: actions + }); + currentIndex++; + }, 5000); + } + + private _initProgressActions(): IProgressAction[] { + return [{ + title: 'First Step', + subActionsTitles: [ + 'Sub action 1', + 'Sub action 2' + ] + }, { + title: 'Second step' + }, { + title: 'Third Step', + subActionsTitles: [ + 'Sub action 1', + 'Sub action 2', + 'Sub action 3' + ] + }, { + title: 'Fourth Step' + }]; + } + /** * Renders the component */ @@ -236,136 +284,136 @@ export default class ControlsTest extends React.Component + iconText='Configure your web part' + description='Please configure the web part.' + buttonLabel='Configure' + hideButton={this.props.displayMode === DisplayMode.Read} + onConfigure={this._onConfigure} /> + titleText="People Picker (Group not found)" + webAbsoluteUrl={this.props.context.pageContext.site.absoluteUrl} + groupName="Team Site Visitors 123" + ensureUser={true} + principalTypes={[PrincipalType.User, PrincipalType.SharePointGroup, PrincipalType.SecurityGroup, PrincipalType.DistributionList]} + defaultSelectedUsers={["admin@tenant.onmicrosoft.com", "test@tenant.onmicrosoft.com"]} + selectedItems={this._getPeoplePickerItems} /> + titleText="People Picker (search for group)" + groupName="Team Site Visitors" + principalTypes={[PrincipalType.User, PrincipalType.SharePointGroup, PrincipalType.SecurityGroup, PrincipalType.DistributionList]} + defaultSelectedUsers={["admin@tenant.onmicrosoft.com", "test@tenant.onmicrosoft.com"]} + selectedItems={this._getPeoplePickerItems} /> + titleText="People Picker (pre-set global users)" + principalTypes={[PrincipalType.User, PrincipalType.SharePointGroup, PrincipalType.SecurityGroup, PrincipalType.DistributionList]} + defaultSelectedUsers={["admin@tenant.onmicrosoft.com", "test@tenant.onmicrosoft.com"]} + selectedItems={this._getPeoplePickerItems} + personSelectionLimit={2} + ensureUser={true} /> + titleText="People Picker (pre-set local users)" + webAbsoluteUrl={this.props.context.pageContext.site.absoluteUrl} + principalTypes={[PrincipalType.User, PrincipalType.SharePointGroup, PrincipalType.SecurityGroup, PrincipalType.DistributionList]} + defaultSelectedUsers={["admin@tenant.onmicrosoft.com", "test@tenant.onmicrosoft.com"]} + selectedItems={this._getPeoplePickerItems} /> + titleText="People Picker (tenant scoped)" + personSelectionLimit={5} + // groupName={"Team Site Owners"} + showtooltip={true} + isRequired={true} + //defaultSelectedUsers={["tenantUser@domain.onmicrosoft.com", "test@user.com"]} + //defaultSelectedUsers={this.state.authorEmails} + selectedItems={this._getPeoplePickerItems} + showHiddenInUI={false} + principalTypes={[PrincipalType.User, PrincipalType.SharePointGroup, PrincipalType.SecurityGroup, PrincipalType.DistributionList]} + suggestionsLimit={2} + resolveDelay={200} /> + titleText="People Picker (local scoped)" + webAbsoluteUrl={this.props.context.pageContext.site.absoluteUrl} + personSelectionLimit={5} + // groupName={"Team Site Owners"} + showtooltip={true} + isRequired={true} + //defaultSelectedUsers={["tenantUser@domain.onmicrosoft.com", "test@user.com"]} + //defaultSelectedUsers={this.state.authorEmails} + selectedItems={this._getPeoplePickerItems} + showHiddenInUI={false} + principalTypes={[PrincipalType.User, PrincipalType.SharePointGroup, PrincipalType.SecurityGroup, PrincipalType.DistributionList]} + suggestionsLimit={2} + resolveDelay={200} /> + titleText="People Picker (disabled)" + disabled={true} + showtooltip={true} /> + viewFields={viewFields} + iconFieldName='ServerRelativeUrl' + groupByFields={groupByFields} + compact={true} + selectionMode={SelectionMode.single} + selection={this._getSelection} + showFilter={true} + // defaultFilter="Team" + /> + data={{ + labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"], + datasets: [{ + label: '# of Votes', + data: [12, 19, 3, 5, 2, 3], + backgroundColor: [ + 'rgba(255, 99, 132, 0.2)', + 'rgba(54, 162, 235, 0.2)', + 'rgba(255, 206, 86, 0.2)', + 'rgba(75, 192, 192, 0.2)', + 'rgba(153, 102, 255, 0.2)', + 'rgba(255, 159, 64, 0.2)' + ], + borderColor: [ + 'rgba(255,99,132,1)', + 'rgba(54, 162, 235, 1)', + 'rgba(255, 206, 86, 1)', + 'rgba(75, 192, 192, 1)', + 'rgba(153, 102, 255, 1)', + 'rgba(255, 159, 64, 1)' + ], + borderWidth: 1 + }] + }} + options={{ + scales: { + yAxes: [{ + ticks: { + beginAtZero: true + } + }] + } + }} /> console.log("Updated location:", coordinates)} - // zoom={15} - //mapType={MapType.cycle} - //width="50" - //height={150} - //loadingMessage="Loading maps" - //errorMessage="Hmmm, we do not have maps for Mars yet. Working on it..." + coordinates={{ latitude: 51.507351, longitude: -0.127758 }} + enableSearch={true} + mapType={MapType.normal} + onUpdateCoordinates={(coordinates) => console.log("Updated location:", coordinates)} + // zoom={15} + //mapType={MapType.cycle} + //width="50" + //height={150} + //loadingMessage="Loading maps" + //errorMessage="Hmmm, we do not have maps for Mars yet. Working on it..." />
); } diff --git a/src/webparts/controlsTest/components/IControlsTestProps.ts b/src/webparts/controlsTest/components/IControlsTestProps.ts index 49dcdae31..6e4d7cf29 100644 --- a/src/webparts/controlsTest/components/IControlsTestProps.ts +++ b/src/webparts/controlsTest/components/IControlsTestProps.ts @@ -1,6 +1,7 @@ import { WebPartContext } from '@microsoft/sp-webpart-base'; import { ImageSize } from '../../../FileTypeIcon'; import { DisplayMode } from '@microsoft/sp-core-library'; +import { IProgressAction } from '../../../Progress'; export interface IControlsTestProps { context: WebPartContext; @@ -17,4 +18,6 @@ export interface IControlsTestState { iFrameDialogOpened?: boolean; authorEmails: string[]; selectedList: string; + progressActions: IProgressAction[]; + currentProgressActionIndex?: number; } From 11e33c594af9b15428aa3a32667137ba2c5e0e8c Mon Sep 17 00:00:00 2001 From: Alex Terentiev Date: Fri, 1 Feb 2019 16:43:01 -0800 Subject: [PATCH 03/42] small doc fix --- docs/documentation/docs/controls/Progress.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/documentation/docs/controls/Progress.md b/docs/documentation/docs/controls/Progress.md index ad79bd85d..0134d6b13 100644 --- a/docs/documentation/docs/controls/Progress.md +++ b/docs/documentation/docs/controls/Progress.md @@ -97,7 +97,7 @@ export class YourComponent extends React.Component Date: Mon, 4 Feb 2019 21:37:24 -0800 Subject: [PATCH 04/42] error icon change; added props to overwrite icons; hasError prioritized on currentIndex - current executing action will be displayed as errored if hasError is set to true - needed for critical errors --- docs/documentation/docs/controls/Progress.md | 5 +++- src/controls/progress/Action.tsx | 14 +++++++--- src/controls/progress/IProgress.ts | 26 +++++++++++++++++ src/controls/progress/Progress.tsx | 28 ++++++++++++------- .../controlsTest/components/ControlsTest.tsx | 3 +- 5 files changed, 60 insertions(+), 16 deletions(-) diff --git a/docs/documentation/docs/controls/Progress.md b/docs/documentation/docs/controls/Progress.md index 0134d6b13..f18564844 100644 --- a/docs/documentation/docs/controls/Progress.md +++ b/docs/documentation/docs/controls/Progress.md @@ -113,4 +113,7 @@ The `Progress` component can be configured with the following properties: | className | string | no | Class name to be applied to the component | | headerClassName | string | no | Header class name. Header contains title, progress indicator, and delay text | | actionsContainerClassName | string | no | Actions container class name | -| actionClassName | string | no | Single action class name | \ No newline at end of file +| actionClassName | string | no | Single action class name | +| successIconName | string | no | Success icon name. Default is CheckMark | +| errorIconName | string | no | Error icon name. Default is Error | +| inProgressIconName | string | no | InProgress icon name. Default is '', spinner is displayed. | \ No newline at end of file diff --git a/src/controls/progress/Action.tsx b/src/controls/progress/Action.tsx index a4fcca303..f90dfe7a1 100644 --- a/src/controls/progress/Action.tsx +++ b/src/controls/progress/Action.tsx @@ -13,7 +13,10 @@ export class Action extends React.Component { subActionsTitles, errorMessage, title, - className + className, + successIconName, + errorIconName, + inProgressIconName } = this.props; const inactive: boolean = state === ProgressActionState.notStarted; const labelClassName = inactive ? css(styles.label, styles.inactive) : styles.label; @@ -21,17 +24,20 @@ export class Action extends React.Component { let iconClassName = ''; switch (state) { case ProgressActionState.finished: - iconName = 'CheckMark'; + iconName = successIconName || 'CheckMark'; iconClassName = styles.successIcon; break; case ProgressActionState.notStarted: - iconName = 'CheckMark'; + iconName = successIconName || 'CheckMark'; iconClassName = styles.inactiveIcon; break; case ProgressActionState.errored: - iconName = 'Cancel'; + iconName = errorIconName || 'Error'; iconClassName = styles.errorIcon; break; + case ProgressActionState.inProgress: + iconName = inProgressIconName; + break; } return (
diff --git a/src/controls/progress/IProgress.ts b/src/controls/progress/IProgress.ts index a42844b57..7f942425e 100644 --- a/src/controls/progress/IProgress.ts +++ b/src/controls/progress/IProgress.ts @@ -100,6 +100,19 @@ export interface IProgressProps { */ actionClassName?: string; + /** + * Success icon name. Default is CheckMark + */ + successIconName?: string; + /** + * Error icon name. Default is Error + */ + errorIconName?: string; + /** + * InProgress icon name. Default is '', spinner is displayed. + */ + inProgressIconName?: string; + } /** @@ -124,4 +137,17 @@ export interface IActionProps extends IProgressAction { * Action class name */ className?: string; + + /** + * Success icon name. Default is CheckMark + */ + successIconName?: string; + /** + * Error icon name. Default is Error + */ + errorIconName?: string; + /** + * InProgress icon name. Default is '', spinner is displayed. + */ + inProgressIconName?: string; } \ No newline at end of file diff --git a/src/controls/progress/Progress.tsx b/src/controls/progress/Progress.tsx index bfb0375e6..5a5b976b0 100644 --- a/src/controls/progress/Progress.tsx +++ b/src/controls/progress/Progress.tsx @@ -62,7 +62,10 @@ export class Progress extends React.Component { className, headerClassName, actionClassName, - actionsContainerClassName + actionsContainerClassName, + successIconName, + errorIconName, + inProgressIconName } = this.props; // correcting action index if props contain incorrect one @@ -78,19 +81,24 @@ export class Progress extends React.Component { const actionEls: JSX.Element[] = actionsToRender.map((a, index) => { let state = ProgressActionState.notStarted; // by default the state is not started - if (actionIndex === index) { // current action is in progress + if (a.hasError && index <= actionIndex) { // current or prev action has errored + state = ProgressActionState.errored; + } + else if (actionIndex === index) { // current action is in progress state = ProgressActionState.inProgress; } - else if (index < actionIndex) { - if (a.hasError) { // finished with error - state = ProgressActionState.errored; - } - else { // finished with no errors - state = ProgressActionState.finished; - } + else if (index < actionIndex) { // finished with no errors + state = ProgressActionState.finished; } - return ; + return ; }); diff --git a/src/webparts/controlsTest/components/ControlsTest.tsx b/src/webparts/controlsTest/components/ControlsTest.tsx index c4d953ae8..a36fa3fb1 100644 --- a/src/webparts/controlsTest/components/ControlsTest.tsx +++ b/src/webparts/controlsTest/components/ControlsTest.tsx @@ -553,7 +553,8 @@ export default class ControlsTest extends React.Component + height={'350px'} + inProgressIconName={'ChromeBackMirrored'} />
From 35d3aaf9549edc15cae11b5656ce19233983261d Mon Sep 17 00:00:00 2001 From: Alex Terentiev Date: Thu, 14 Feb 2019 18:18:22 -0800 Subject: [PATCH 05/42] lost export --- src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/index.ts b/src/index.ts index b996ddeec..3989da93a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,6 +7,7 @@ export * from './WebPartTitle'; export * from './ListPicker'; export * from './ListItemPicker'; export * from './ChartControl'; +export * from './Progress'; export * from './IFrameDialog'; export * from './IFramePanel'; From 4ee059836a5e304862a7c806fc5b447f41e9a296 Mon Sep 17 00:00:00 2001 From: Hugo Bernier Date: Sun, 24 Feb 2019 02:25:13 -0500 Subject: [PATCH 06/42] Updated web part title documentation --- .../docs/controls/WebPartTitle.MoreLink.md | 39 +++++++++++++++++++ .../docs/controls/WebPartTitle.md | 2 + 2 files changed, 41 insertions(+) create mode 100644 docs/documentation/docs/controls/WebPartTitle.MoreLink.md diff --git a/docs/documentation/docs/controls/WebPartTitle.MoreLink.md b/docs/documentation/docs/controls/WebPartTitle.MoreLink.md new file mode 100644 index 000000000..cdea79633 --- /dev/null +++ b/docs/documentation/docs/controls/WebPartTitle.MoreLink.md @@ -0,0 +1,39 @@ +# WebPartTitle: Adding a 'More' link + +It is quite common for SharePoint web parts to show a _See all_ option next to the web part title. + +You can achieve this look by using the `moreLink` prop. + +## The `moreLink` prop + +In order to render a hyperlink to the right of the web part title, you must specify the `moreLink` prop of the `WebPartTitle` component. + +To do so, you may pass the children elements you wish to render as the _See all_ link, as in the following example code: + +```TypeScript +See all + } /> +``` + +If you wish, you may pass a callback function instead, as per the following example code: + +```TypeScript + { + return (See all); + } + } /> +``` + +## The result + +The resulting web part title will look like the following: + +![More Link](../assets/webparttitle-morelink.png) diff --git a/docs/documentation/docs/controls/WebPartTitle.md b/docs/documentation/docs/controls/WebPartTitle.md index 4026b525b..188eb40a7 100644 --- a/docs/documentation/docs/controls/WebPartTitle.md +++ b/docs/documentation/docs/controls/WebPartTitle.md @@ -60,5 +60,7 @@ The WebPartTitle control can be configured with the following properties: | title | string | yes | The title value for the web part. | | updateProperty | Function | yes | Function that you can pass to update the title in the root web part. | | className | string | no | Optional property to specify a custom class that allows you to change the web part title style. | +| placeholder | string | no | Optional property to specify a custom placeholder to display when the title is editable. | +| moreLink | Function or JSX.Element | no | Optional property to render a _See all_ link in the web part title. | ![](https://telemetry.sharepointpnp.com/sp-dev-fx-controls-react/wiki/controls/WebPartTitle) From fe2bd9a0488a75d16b90e36fcfc41a832c7ad9af Mon Sep 17 00:00:00 2001 From: Hugo Bernier Date: Sun, 24 Feb 2019 02:27:34 -0500 Subject: [PATCH 07/42] Added screen shot of web part title with "see all" --- .../docs/assets/webparttitle-morelink.png | Bin 0 -> 13497 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/documentation/docs/assets/webparttitle-morelink.png diff --git a/docs/documentation/docs/assets/webparttitle-morelink.png b/docs/documentation/docs/assets/webparttitle-morelink.png new file mode 100644 index 0000000000000000000000000000000000000000..9fae719a4a36afa84aa23a056fd82a2271d0666d GIT binary patch literal 13497 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 Date: Sun, 24 Feb 2019 02:28:33 -0500 Subject: [PATCH 08/42] Added moreLink prop --- .../webPartTitle/WebPartTitle.module.scss | 27 ++++++++++++++++ .../webPartTitle/WebPartTitle.test.tsx | 32 +++++++++++++++++++ src/controls/webPartTitle/WebPartTitle.tsx | 30 ++++++++++------- src/controls/webPartTitle/index.ts | 2 +- 4 files changed, 79 insertions(+), 12 deletions(-) diff --git a/src/controls/webPartTitle/WebPartTitle.module.scss b/src/controls/webPartTitle/WebPartTitle.module.scss index 69546375b..6e0f2223e 100644 --- a/src/controls/webPartTitle/WebPartTitle.module.scss +++ b/src/controls/webPartTitle/WebPartTitle.module.scss @@ -1,8 +1,22 @@ +.webPartHeader { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: baseline; + -ms-flex-align: baseline; + align-items: baseline; +} + .webPartTitle { font-size: 14px; font-weight: 100; margin-bottom: 11px; color: "[theme:neutralPrimary, default: #333333]"; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + overflow-x: hidden; + text-overflow: ellipsis; @media (min-width: 320px) { font-size: 21px; @@ -31,10 +45,23 @@ text-align: inherit; white-space: pre; width: 100%; + + &::placeholder, + &::-webkit-input-placeholder { + color: "[theme: neutralSecondary, default: #666666]"!important; + } } // View mode span { // Nothing at the moment + + a:link { + text-decoration: none; + } + } + + .moreLink { + margin-bottom: 11px; } } diff --git a/src/controls/webPartTitle/WebPartTitle.test.tsx b/src/controls/webPartTitle/WebPartTitle.test.tsx index 99c52c385..6e7a000af 100644 --- a/src/controls/webPartTitle/WebPartTitle.test.tsx +++ b/src/controls/webPartTitle/WebPartTitle.test.tsx @@ -13,6 +13,8 @@ describe('', () => { let webparttitle: ReactWrapper; const dummyTitle = "Dummy Title"; const dummyClass = "DummyClass"; + const dummyMoreLink = "See all"; + const dummyPlaceholder = "News"; const dummyUpdateFnc = sinon.spy((value) => { return value; }); afterEach(() => { @@ -55,4 +57,34 @@ describe('', () => { done(); }); + + it('Check more link is shown if function specified', (done) => { + webparttitle = mount( {}} + moreLink={()=> {dummyMoreLink}} />); + expect(webparttitle.find(`div.${styles.webPartTitle} span`).text()).to.be.equal(dummyTitle); + expect(webparttitle.find(`div.${styles.webPartTitle} textarea`)).to.have.length(0); + expect(webparttitle.find(`span.${styles.moreLink}`)).to.have.length(1); + expect(webparttitle.find(`span.${styles.moreLink} a`)).to.have.length(1); + expect(webparttitle.find(`span.${styles.moreLink} a`).text()).to.be.equal(dummyMoreLink); + done(); + }); + + it('Check more link is shown if children specified', (done) => { + webparttitle = mount( {}} + moreLink={{dummyMoreLink}} />); + expect(webparttitle.find(`div.${styles.webPartTitle} span`).text()).to.be.equal(dummyTitle); + expect(webparttitle.find(`div.${styles.webPartTitle} textarea`)).to.have.length(0); + expect(webparttitle.find(`span.${styles.moreLink}`)).to.have.length(1); + expect(webparttitle.find(`span.${styles.moreLink} a`)).to.have.length(1); + expect(webparttitle.find(`span.${styles.moreLink} a`).text()).to.be.equal(dummyMoreLink); + done(); + }); + + it('Check more link is not shown otherwise', (done) => { + webparttitle = mount( {}} />); + expect(webparttitle.find(`div.${styles.webPartTitle} span`).text()).to.be.equal(dummyTitle); + expect(webparttitle.find(`div.${styles.webPartTitle} textarea`)).to.have.length(0); + expect(webparttitle.find(`span.${styles.moreLink}`)).to.have.length(0); + done(); + }); }); diff --git a/src/controls/webPartTitle/WebPartTitle.tsx b/src/controls/webPartTitle/WebPartTitle.tsx index 172899c66..4a4ee8564 100644 --- a/src/controls/webPartTitle/WebPartTitle.tsx +++ b/src/controls/webPartTitle/WebPartTitle.tsx @@ -2,6 +2,7 @@ import * as React from 'react'; import * as strings from 'ControlStrings'; import { DisplayMode } from '@microsoft/sp-core-library'; import styles from './WebPartTitle.module.scss'; +import { css } from 'office-ui-fabric-react/lib/Utilities'; import * as telemetry from '../../common/telemetry'; export interface IWebPartTitleProps { @@ -9,6 +10,8 @@ export interface IWebPartTitleProps { title: string; updateProperty: (value: string) => void; className?: string; + placeholder?: string; + moreLink?: JSX.Element | Function; } /** @@ -22,9 +25,9 @@ export class WebPartTitle extends React.Component { super(props); telemetry.track('ReactWebPartTitle', { - title: !!props.title, - updateProperty: !!props.updateProperty, - className: !!props.className + title: !!props.title, + updateProperty: !!props.updateProperty, + className: !!props.className }); this._onChange = this._onChange.bind(this); @@ -43,14 +46,19 @@ export class WebPartTitle extends React.Component { public render(): React.ReactElement { if (this.props.title || this.props.displayMode === DisplayMode.Edit) { return ( -
- { - this.props.displayMode === DisplayMode.Edit && - } - - { - this.props.displayMode !== DisplayMode.Edit && this.props.title && {this.props.title} - } +
+
+ { + this.props.displayMode === DisplayMode.Edit && + } + + { + this.props.displayMode !== DisplayMode.Edit && this.props.title && {this.props.title} + } +
+ {this.props.moreLink && + {typeof this.props.moreLink === "function" ? this.props.moreLink() : this.props.moreLink} + }
); } diff --git a/src/controls/webPartTitle/index.ts b/src/controls/webPartTitle/index.ts index 528b5e04a..d001a5ef0 100644 --- a/src/controls/webPartTitle/index.ts +++ b/src/controls/webPartTitle/index.ts @@ -1 +1 @@ -export * from './WebPartTitle'; +export * from './WebPartTitle'; From 93a102096df5d98046ba49cba97c2db9716b3266 Mon Sep 17 00:00:00 2001 From: Hugo Bernier Date: Sun, 24 Feb 2019 02:50:23 -0500 Subject: [PATCH 09/42] Added logic to render if no title is provided, but morelink is --- src/controls/webPartTitle/WebPartTitle.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controls/webPartTitle/WebPartTitle.tsx b/src/controls/webPartTitle/WebPartTitle.tsx index 4a4ee8564..02fb6fd98 100644 --- a/src/controls/webPartTitle/WebPartTitle.tsx +++ b/src/controls/webPartTitle/WebPartTitle.tsx @@ -44,7 +44,7 @@ export class WebPartTitle extends React.Component { * Default React component render method */ public render(): React.ReactElement { - if (this.props.title || this.props.displayMode === DisplayMode.Edit) { + if (this.props.title || this.props.moreLink || this.props.displayMode === DisplayMode.Edit) { return (
From 398a6c8857bfeb39fcdfad86833196fcca4fb534 Mon Sep 17 00:00:00 2001 From: Francis Date: Thu, 28 Feb 2019 09:36:12 -0500 Subject: [PATCH 10/42] Update ListView.md: iconFieldName description I had a hard time understanding how to use iconFieldName and its effect. It was not clear to me by the original description that it required the property name of the items with the path of the file and that it would automagically create the entire column, header and field rendering. I had to read the source code to figure it out. --- docs/documentation/docs/controls/ListView.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/documentation/docs/controls/ListView.md b/docs/documentation/docs/controls/ListView.md index c33154438..2d7877791 100644 --- a/docs/documentation/docs/controls/ListView.md +++ b/docs/documentation/docs/controls/ListView.md @@ -67,7 +67,7 @@ The ListView control can be configured with the following properties: | Property | Type | Required | Description | | ---- | ---- | ---- | ---- | -| iconFieldName | string | no | Specify the name of the file URL path which will be used to show the file icon. | +| iconFieldName | string | no | Specify the items' property name that defines the file URL path which will be used to show the file icon. This automatically creates a column and renders the file icon. | | items | any[]| yes | Items to render in the list view. | | viewFields | IViewField[] | no | The fields you want to render in the list view. Check the `IViewField` implementation to see which properties you can define. | | compact | boolean | no | Boolean value to indicate if the control should render in compact mode. By default this is set to `false`. | From 2f491f5fbce03c0164dce2142f7dbf365b4b12ff Mon Sep 17 00:00:00 2001 From: Tautvydas Duda Date: Sat, 2 Mar 2019 22:56:10 +0200 Subject: [PATCH 11/42] interface for DateTime strings --- src/loc/mystrings.d.ts | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/src/loc/mystrings.d.ts b/src/loc/mystrings.d.ts index 23b11b9fc..848172cfd 100644 --- a/src/loc/mystrings.d.ts +++ b/src/loc/mystrings.d.ts @@ -14,7 +14,7 @@ declare interface IControlStrings { ListViewGroupEmptyLabel: string; WebPartTitlePlaceholder: string; WebPartTitleLabel: string; - DateTime: { [key: string]: string }; + DateTime: IDateTimeStrings; SendEmailTo: string; StartChatWith: string; Contact: string; @@ -39,8 +39,8 @@ declare interface IControlStrings { ListItemAttachmentsdialogOKbuttonLabel: string; ListItemAttachmentsdialogCancelButtonLabel: string; ListItemAttachmentsdialogOKbuttonLabelOnDelete: string; - ListItemAttachmentsuploadAttachmentDialogTitle:string; - ListItemAttachmentsuploadAttachmentButtonLabel:string; + ListItemAttachmentsuploadAttachmentDialogTitle: string; + ListItemAttachmentsuploadAttachmentButtonLabel: string; ListItemAttachmentsuploadAttachmentErrorMsg: String; ListItemAttachmentsCommandBarAddAttachmentLabel: string; ListItemAttachmentsloadingMessage: string; @@ -54,6 +54,33 @@ declare interface IControlStrings { mapsTitlePrefix: string; } +declare interface IDateTimeStrings { + L_RelativeDateTime_AFewSecondsFuture: string; + L_RelativeDateTime_AFewSeconds: string; + L_RelativeDateTime_AboutAMinuteFuture: string; + L_RelativeDateTime_AboutAMinute: string; + L_RelativeDateTime_XMinutesFuture: string; + L_RelativeDateTime_XMinutes: string; + L_RelativeDateTime_XMinutesFutureIntervals: string; + L_RelativeDateTime_XMinutesIntervals: string; + L_RelativeDateTime_AboutAnHourFuture: string; + L_RelativeDateTime_AboutAnHour: string; + L_RelativeDateTime_Tomorrow: string; + L_RelativeDateTime_Yesterday: string; + L_RelativeDateTime_TomorrowAndTime: string; + L_RelativeDateTime_YesterdayAndTime: string; + L_RelativeDateTime_XHoursFuture: string; + L_RelativeDateTime_XHours: string; + L_RelativeDateTime_XHoursFutureIntervals: string; + L_RelativeDateTime_XHoursIntervals: string; + L_RelativeDateTime_DayAndTime: string; + L_RelativeDateTime_XDaysFuture: string; + L_RelativeDateTime_XDays: string; + L_RelativeDateTime_XDaysFutureIntervals: string; + L_RelativeDateTime_XDaysIntervals: string; + L_RelativeDateTime_Today: string; +} + declare module 'ControlStrings' { const strings: IControlStrings; export = strings; From c46e98ece298382f2c47d2342734e1523a537651 Mon Sep 17 00:00:00 2001 From: Tautvydas Duda Date: Sat, 2 Mar 2019 23:19:05 +0200 Subject: [PATCH 12/42] translations --- src/loc/lt-lt.ts | 85 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 src/loc/lt-lt.ts diff --git a/src/loc/lt-lt.ts b/src/loc/lt-lt.ts new file mode 100644 index 000000000..1f322eeb9 --- /dev/null +++ b/src/loc/lt-lt.ts @@ -0,0 +1,85 @@ +declare var define: any; + +define([], () => { + return { + 'SiteBreadcrumbLabel': 'Svetainės navigacijos grandinė', + + 'ListViewGroupEmptyLabel': 'Nenurodyta', + + 'WebPartTitlePlaceholder': 'Puslapio dalies antraštė', + 'WebPartTitleLabel': 'Pridėti antraštę', + + "DateTime": { + "L_RelativeDateTime_AFewSecondsFuture": "po kelių sekundžių", + "L_RelativeDateTime_AFewSeconds": "prieš kelias sekundes", + "L_RelativeDateTime_AboutAMinuteFuture": "maždaug po minutės", + "L_RelativeDateTime_AboutAMinute": "beveik prieš minutę", + "L_RelativeDateTime_XMinutesFuture": "po {0} min.", + "L_RelativeDateTime_XMinutes": "prieš {0} min.", + "L_RelativeDateTime_XMinutesFutureIntervals": "0-", + "L_RelativeDateTime_XMinutesIntervals": "0-", + "L_RelativeDateTime_AboutAnHourFuture": "maždaug po valandos", + "L_RelativeDateTime_AboutAnHour": "beveik prieš valandą", + "L_RelativeDateTime_Tomorrow": "rytoj", + "L_RelativeDateTime_Yesterday": "vakar", + "L_RelativeDateTime_TomorrowAndTime": "rytoj, {0}", + "L_RelativeDateTime_YesterdayAndTime": "vakar, {0}", + "L_RelativeDateTime_XHoursFuture": "po {0} val.", + "L_RelativeDateTime_XHours": "prieš {0} val.", + "L_RelativeDateTime_XHoursFutureIntervals": "0-", + "L_RelativeDateTime_XHoursIntervals": "0-", + "L_RelativeDateTime_DayAndTime": "{0}, {1}", + "L_RelativeDateTime_XDaysFuture": "po {0} d.", + "L_RelativeDateTime_XDays": "prieš {0} d.", + "L_RelativeDateTime_XDaysFutureIntervals": "0-", + "L_RelativeDateTime_XDaysIntervals": "0-", + "L_RelativeDateTime_Today": "šiandien" + }, + "SendEmailTo": "Siųsti el. laišką {0}", + "StartChatWith": "Pradėti pokalbį su {0}", + "Contact": "Kontaktas", + "UpdateProfile": "Atnaujinti profilį", + + "TaxonomyPickerNoTerms": "Terminų rinkinys tuščias", + "TaxonomyPickerExpandTitle": "Išskleisti terminų rinkinį", + "TaxonomyPickerMenuTermSet": "Terminų rinkinio meniu", + "TaxonomyPickerInLabel": "", + "TaxonomyPickerTermSetLabel": "Terminų rinkinys", + + peoplePickerComponentTooltipMessage: "Pasirinkite naudotojus", + peoplePickerComponentErrorMessage: "Privalomas laukas", + peoplePickerSuggestionsHeaderText: 'Pasiūlymai', + peoplePickerLoadingText: 'Įkeliama', + PeoplePickerSearchText: 'Ieškoma naudotojų', + PeoplePickerGroupNotFound: "Grupės nepavyko rasti.", + + genericNoResultsFoundText: 'Rezultatų nėra', + + ListItemPickerSelectValue: 'Pasirinkite reikšmę', + ListItemAttachmentsActionDeleteIconTitle: 'Naikinti', + ListItemAttachmentsactionDeleteTitle: 'Naikinti', + ListItemAttachmentsfileDeletedMsg: 'Failas „{0}“ panaikintas', + ListItemAttachmentsfileDeleteError: 'Klaida naikinant failą „{0}“: {1}', + ListItemAttachmentserrorLoadAttachments: 'Nepavyko įkelti elemento priedų infomacijos: {0}', + ListItemAttachmentsconfirmDelete: 'Ar tikrai norite priedą „{0}“ siųsti į svetainės šiukšlinę?', + ListItemAttachmentsdialogTitle: 'Elemento priedai', + ListItemAttachmentsdialogOKbuttonLabel: 'Gerai', + ListItemAttachmentsdialogCancelButtonLabel: 'Atšaukti', + ListItemAttachmentsdialogOKbuttonLabelOnDelete: 'Naikinti', + ListItemAttachmentsuploadAttachmentDialogTitle: 'Įkelti priedą', + ListItemAttachmentsuploadAttachmentButtonLabel: 'Įkelti priedą', + ListItemAttachmentsuploadAttachmentErrorMsg: 'Failo „{0}“ įkelti nepavyko: {1}', + ListItemAttachmentsCommandBarAddAttachmentLabel: 'Įkelti priedą', + ListItemAttachmentsloadingMessage: 'Failas siunčiamas...', + ListItemAttachmentslPlaceHolderIconText: 'Elemento priedai', + ListItemAttachmentslPlaceHolderDescription: 'Please Add Attachment', + ListItemAttachmentslPlaceHolderButtonLabel: 'Pridėti', + + mapsErrorMessage: 'Įkeliant žemėlapį įvyko klaida', + mapsLoadingText: 'Įkeliama', + mapsSearchButtonText: 'Paieška', + mapsTitlePrefix: 'Žemėlapis', + + ListViewFilterLabel: "Filtruoti" + }; +}); From ceaa551fd5bbe039087f03d19e70fd8b5780368f Mon Sep 17 00:00:00 2001 From: Tautvydas Duda Date: Sat, 2 Mar 2019 23:19:05 +0200 Subject: [PATCH 13/42] use coresponding resource --- src/controls/peoplepicker/PeoplePickerComponent.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controls/peoplepicker/PeoplePickerComponent.tsx b/src/controls/peoplepicker/PeoplePickerComponent.tsx index 1580871ca..30289451c 100644 --- a/src/controls/peoplepicker/PeoplePickerComponent.tsx +++ b/src/controls/peoplepicker/PeoplePickerComponent.tsx @@ -73,7 +73,7 @@ export class PeoplePicker extends React.Component Date: Sun, 3 Mar 2019 00:26:46 +0200 Subject: [PATCH 14/42] change person photo url --- src/services/PeopleSearchService.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/services/PeopleSearchService.ts b/src/services/PeopleSearchService.ts index 276bb00a0..d02299be0 100644 --- a/src/services/PeopleSearchService.ts +++ b/src/services/PeopleSearchService.ts @@ -13,6 +13,7 @@ import { cloneDeep, findIndex } from "@microsoft/sp-lodash-subset"; export default class SPPeopleSearchService { private cachedPersonas: { [property: string]: IUserInfo[] }; private cachedLocalUsers: { [siteUrl: string]: IUserInfo[] }; + private absoluteWebUrl: string; /** * Service constructor @@ -20,16 +21,17 @@ export default class SPPeopleSearchService { constructor(private context: WebPartContext | ExtensionContext) { this.cachedPersonas = {}; this.cachedLocalUsers = {}; - this.cachedLocalUsers[this.context.pageContext.web.absoluteUrl] = []; + this.absoluteWebUrl = this.context.pageContext.web.absoluteUrl; + this.cachedLocalUsers[this.absoluteWebUrl] = []; } /** - * Generate the user photo link + * Generate the user photo link using SharePoint user photo endpoint. * * @param value */ public generateUserPhotoLink(value: string): string { - return `https://outlook.office365.com/owa/service.svc/s/GetPersonaPhoto?email=${value}&UA=0&size=HR96x96`; + return `${this.absoluteWebUrl}/_layouts/15/userphoto.aspx?accountname=${encodeURIComponent(value)}&size=M`; } /** @@ -42,7 +44,7 @@ export default class SPPeopleSearchService { * @param principalTypes */ public getSumOfPrincipalTypes(principalTypes: PrincipalType[]) { - return !!principalTypes && principalTypes.length > 0 ? principalTypes.reduce((a, b) => a + b, 0) : 1; + return !!principalTypes && principalTypes.length > 0 ? principalTypes.reduce((a, b) => a + b, 0) : 1; } /** @@ -228,7 +230,7 @@ export default class SPPeopleSearchService { const userResults = values.map(element => { switch (element.EntityType) { case 'User': - let email : string = element.EntityData.Email !== null ? element.EntityData.Email : element.Description; + let email: string = element.EntityData.Email !== null ? element.EntityData.Email : element.Description; return { id: element.Key, imageUrl: this.generateUserPhotoLink(email), @@ -336,7 +338,7 @@ export default class SPPeopleSearchService { */ private searchPeopleFromMock(query: string): Promise> { let mockClient: PeoplePickerMockClient = new PeoplePickerMockClient(); - let filterValue = { valToCompare: query }; + let filterValue = { valToCompare: query }; return new Promise>((resolve) => resolve(MockUsers.filter(mockClient.filterPeople, filterValue))); } } From 66496cca15d2b04858e4d8dd489492e09d022ba8 Mon Sep 17 00:00:00 2001 From: Tautvydas Duda Date: Sun, 3 Mar 2019 20:10:59 +0200 Subject: [PATCH 15/42] remove private field --- src/services/PeopleSearchService.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/services/PeopleSearchService.ts b/src/services/PeopleSearchService.ts index d02299be0..f2ced3207 100644 --- a/src/services/PeopleSearchService.ts +++ b/src/services/PeopleSearchService.ts @@ -13,7 +13,6 @@ import { cloneDeep, findIndex } from "@microsoft/sp-lodash-subset"; export default class SPPeopleSearchService { private cachedPersonas: { [property: string]: IUserInfo[] }; private cachedLocalUsers: { [siteUrl: string]: IUserInfo[] }; - private absoluteWebUrl: string; /** * Service constructor @@ -21,8 +20,7 @@ export default class SPPeopleSearchService { constructor(private context: WebPartContext | ExtensionContext) { this.cachedPersonas = {}; this.cachedLocalUsers = {}; - this.absoluteWebUrl = this.context.pageContext.web.absoluteUrl; - this.cachedLocalUsers[this.absoluteWebUrl] = []; + this.cachedLocalUsers[this.context.pageContext.web.absoluteUrl] = []; } /** @@ -31,7 +29,7 @@ export default class SPPeopleSearchService { * @param value */ public generateUserPhotoLink(value: string): string { - return `${this.absoluteWebUrl}/_layouts/15/userphoto.aspx?accountname=${encodeURIComponent(value)}&size=M`; + return `${this.context.pageContext.web.absoluteUrl}/_layouts/15/userphoto.aspx?accountname=${encodeURIComponent(value)}&size=M`; } /** From 484cf8a42c1e8cd7fe6a7e3efb1f26048193e6d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=96zg=C3=BCr=20ERSOY?= Date: Wed, 13 Mar 2019 15:38:18 +0300 Subject: [PATCH 16/42] Update ListItemAttachments.md fix import path --- docs/documentation/docs/controls/ListItemAttachments.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/documentation/docs/controls/ListItemAttachments.md b/docs/documentation/docs/controls/ListItemAttachments.md index ed9c57c0a..e6a532752 100644 --- a/docs/documentation/docs/controls/ListItemAttachments.md +++ b/docs/documentation/docs/controls/ListItemAttachments.md @@ -18,7 +18,7 @@ Here is an example of the control: - Import the control into your component: ```TypeScript -import { ListItemAttachments } from '@pnp/spfx-controls-react/listItemAttachments'; +import { ListItemAttachments } from '@pnp/spfx-controls-react/lib/ListItemAttachments'; ``` - Use the `ListItemAttachments` control in your code as follows: From 823d18ade26aafa8d195e032fd254ef3159eeebf Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Thu, 28 Mar 2019 10:44:34 +0100 Subject: [PATCH 17/42] Merge changes --- .../docs/assets/RichTextOutput.gif | Bin 0 -> 509215 bytes docs/documentation/docs/controls/RichText.md | 68 ++ package-lock.json | 100 ++- package.json | 3 +- src/RichText.ts | 1 + src/common/utilities/ThemeColorHelper.ts | 68 ++ src/controls/chartControl/ChartControl.tsx | 131 +-- src/controls/richText/RichText.module.scss | 400 +++++++++ src/controls/richText/RichText.tsx | 832 ++++++++++++++++++ src/controls/richText/RichText.types.ts | 131 +++ .../richText/RichTextPropertyPane.module.scss | 108 +++ .../richText/RichTextPropertyPane.tsx | 606 +++++++++++++ .../richText/RichTextPropertyPane.types.ts | 13 + .../richText/RteColorPicker.module.scss | 150 ++++ src/controls/richText/RteColorPicker.tsx | 414 +++++++++ src/controls/richText/RteColorPicker.types.ts | 15 + .../richText/SwatchColorPickerGroup.tsx | 69 ++ .../richText/SwatchColorPickerGroup.types.ts | 16 + src/controls/richText/index.ts | 2 + src/loc/en-us.ts | 84 +- src/loc/mystrings.d.ts | 83 ++ 21 files changed, 3223 insertions(+), 71 deletions(-) create mode 100644 docs/documentation/docs/assets/RichTextOutput.gif create mode 100644 docs/documentation/docs/controls/RichText.md create mode 100644 src/RichText.ts create mode 100644 src/common/utilities/ThemeColorHelper.ts create mode 100644 src/controls/richText/RichText.module.scss create mode 100644 src/controls/richText/RichText.tsx create mode 100644 src/controls/richText/RichText.types.ts create mode 100644 src/controls/richText/RichTextPropertyPane.module.scss create mode 100644 src/controls/richText/RichTextPropertyPane.tsx create mode 100644 src/controls/richText/RichTextPropertyPane.types.ts create mode 100644 src/controls/richText/RteColorPicker.module.scss create mode 100644 src/controls/richText/RteColorPicker.tsx create mode 100644 src/controls/richText/RteColorPicker.types.ts create mode 100644 src/controls/richText/SwatchColorPickerGroup.tsx create mode 100644 src/controls/richText/SwatchColorPickerGroup.types.ts create mode 100644 src/controls/richText/index.ts diff --git a/docs/documentation/docs/assets/RichTextOutput.gif b/docs/documentation/docs/assets/RichTextOutput.gif new file mode 100644 index 0000000000000000000000000000000000000000..04b3f4376529071e46dd239e6d9e4ce2f7504986 GIT binary patch literal 509215 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

-@B6_ts}i%2~l6A4-e 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%0A^83H8J;*fgLqoa8(! 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

HB z^B*~;L@W~C7x*5us=q!QQ(PIc^)8HmJ@P~k9ORVW*QWnMDUx$#C>mKh9!LCKThpV> zHC}YZ+qQR`ZzxtT-&#?-s;wa|4@2vB=bc4yOkMBJ>0fb7AGFY@T)*ON-~5WF(NJL# z=H5+rd*EbG5EwwCo|%4K2vu8C3wj-(og&(wA|LMYB#J&$%DK;+Zt%6JmKR6_ucp(j zc4w}^s4K8}*#7-IGT_C$>b(ySmU`mNR_jrvl4~QmvJ)GIsM;E=hqkPOD9N5Wtm0Vg!4R zn>i9Prt&6G@}P%SVN;5b=FxzHLrF8?K~L+MjL;^783Kk$?!zdhQ$>p7i`hW;k>y%( zQ`|v6KO+4+9DoG(3DEn&iB#&rHwT1N=bX%WUS-7S9u9&C&pF!NFZ|G}q5P|*iYiQG z4_-+Om%7VKPQP<=^P#NlBsYp-@~z?^!+TId`{<*noaV}D4OH5lIRId!E5GC?I-s9yChI-g6FQK>DBV#vw_f#ay$8{}RAn$iN*`BCXr zuRWi(svsUu0TdX&F9tPhl`SIbQCoGyBvt|6dOMdna;H6-+J`qlNblTp?HQGyz*?f3 zX+8hg%LSg?D#^LD;b@U-po>d!XW8K{YC)z65s%={$;=D zSW&$a760~rQJE`G371Au&3@f48g=MYl75x&V+FbpO}{7xx&w`Rh|ydW)$C)k+lQaH z$7FpP(4Y4UwF9=FYOWMHSypFIHCNnkimx!2LT}noHCNY^>pW03S4}$CQ2WJJS0Av; zZm~Ud+<)Q)s^+S6pmdGpqM_<8f*-lpG|(tK!tNxE;vOH)ijN`mP~79!D9j~_dz`8H zm%SzbFVrD4LmmRG4m} zyzb-mvOpp4bvb+C#`PC z-Zrn&#$B`gHFgbaWi@mEdVCFthF9q`wylzeF82Oc zO7tiyvR$(4_D@%2{$`BEr}yjMn72pQtUcd(&@i+hHA==kBGBJ5V>)NwW^RvDf+Y7N zf?%4#g-fe0liodeMR-S~Uxr_&b+{8W;Be6UImyxPO}a;VtRy!)8^8BVfE{{uMRpsy z{<+z0_{N-<+lXkBBN5j{45Lsl9(r@h_~3!Ph+-c+zKcOvo%M_Sy4d?K6GR{7@ns+=dYk#+JdmR=m)gm#y>U*1E$IXHg!4*E{m$N8d}Yx$6R zfzZlL`Fl0gL;hOhs=QRoNEHgug8oMk86Uil^M-oo=~bggH{3n5bDf!%KDps=BGEGKlZ0 zB*5@~;9CX=!hh5wPcNzM`(&4M-sP_A6X005fuPx1+jpd8S3r~sZeYT{l z`Lbq*s{jZABJ?s0Nuj)+OIrIuH(8Y|bA+U~z~p2_zK2~mRN5Jkelu8HC1FbIg~VJD9X zpPZ7ntv@PLc+I1{;{7K}SbQPf__?$nc4w4Zc+})FOU(MCA|CL2NqvZ_C@3DIgda{yr{n@U+K^SNe&{4I=6f5djR_6~Us{94%P= zE8=CDLu9O7uqDm?@QWEOIPx}!$lQ)Pb-gz53VCAj7si6xXyPoyru%gFmm)GEe5O{VynI3`as}=A$>44k!Q`&Bxjk44C3|{Uu}+3=r^O+ zi>|MTV2Ar%;=%!F9K@AC7pl?m0l_C~~CVzs8vnA@}KM*{CcRv%5#$%}SMJFnQ zpnLLEZ!K1M={J+}V%in%^dZ}ru6ZfQHJj35o4@SWlhgJ#2H}7u&^cxS7*2PrmcK4Y zs2|$}U4+C)(mmY-_GD0?opn0pW2}M%l&FPCccBtin0`Tf zaQ9{3q6G$>as<(476~db&SZA-4uea75r#?c7lXy6m{$Yqp)|76Xmj)f9GKegGYOrPyoVakwhO>uEa znJJ$lmu}O?dMPRkuso^1!>7hg`&BHiEyIqo$~;fk*yh)t+`<8Qt4-Gw5TvC1C0|{M z%Q=qfP=@uD8P2^HbQ-S_nQGpF`zFOE&~Zp#L>zcgaBu zNW`%$B{h`Sts9MNydQPz@N#Rq`!(JEB@`2{rtxf3&uaAiD8hMI<2d4ein{O(opIe< zvz19BoIRE)lb7lbQ_!D%{8$gifr`TJNb!2iQn=k99J^1`>@hB)edBn>Rqqw^g7i}y zGmq+rG$K(l+CTaf*+E!92f&SAU-3VDA4^cz=^lxnG0Eu1`|T)Wt#bHzLhSORkGZ|^ z9Oe5`lL7duVVqXP&1}NiYMN%qMJAK#LhS%<62H-U^x>8`+4w1aJG=hT9OXnc&EE1Y zaqqt8#o^+$JW2&x2DbxDU0+UDgJEw4*gcc%vsj3wPb-R2@qL^yYaX19(C-7Qq$g4k;WTyJw3@*f@7d7Tj z``Z7RJSn!gu4mTOe#LP-_q4XPDrkK9gLmvf+T{9_%c^@f7Hwhd2l1^D9~Qoh_lqr` z-}}U022jx-o*b@SW-9ahHsATQJ{?W5>0Nf@(08!&VfgLa%L`DCXsisF+?LVCU@3di zA6IO1F~IYJX;ER?z;?+otU;+enD)xYL%Up=eUt3jz2z`=8yhS-X6_!#aDf)i+;EYx zeawfXy@f2#+ypz9qxnEw)-ej-PcZEy`lc72^zO&^#ORQ7<;PBI%)|tdVf(Uq*h)~X zz0kvWY^`{Z9m;%*NA7ebmAMLQE&0o25XJ4)~DyA5gByM z)Xm>N52X^u#^O+J#g^KQS2zQPvc%N&Uu&{*mRw7w>&-_b+M4t)GT3rHrKJCM(3{mz zWnuj(ho>vlsmU24;E-1#!wjW9(8Y3mVuuwY5QE~eZFg6CtgB*jc0Co*uqDajH$ER!7VjgBf;(+TriT#PpU zDzq27?jyx@o*@jgpsMbf*(j&4^iK0JU(P3QeEhJPFm1 z?f<%|F7#w4;m&h)&6=>MCZ`{lmir{PsQfq2KhrJ4G}BX8a>6)zILc8BD&cZ0t`3J! zX{t1uFB>+S)J5-nRVC{Aruw7RT@cg*m;!kIjW6=2kQRF&(_&1=ug*Hs@BF46bp2P4@?-1s=Ij8 zI)@Fe8})xzXz{pS`}xD0(^{Z>0dDf3@bO2z!nvc*8*fkjQaT>skUwmezirh*^ZIz) zz`*G;CI1tttp8k^_V=NdYX<9P#rrfNnU869KOPda7=A3b8#s4V#-yJrE&Sl88;N>& zSuHZX6D2&z9U#v`$TRo{pl~O_)czby-l}5_6gO=~}9z zcQ2NXnpmDie4eLVAMcy_xD7t9uSFX#AI35NMuns1%xqY6eV*}LiF+$MlQY*cy%=jG zFC%FY)_v6vRLtgAXSZEsHWjv(h^U(_5SlT+47HQfc#_jAYK&^c#70@&dCK|Wj7Xup z*Y>4F#q=emNzOyXgzPR_y7j#(k?;x2lBYZS(HyM1QhXM)whowa6l zf$ZpE&`XedQbpcH$S}Z-7&4v;mg{5ECD2e~>}0=iMXoCix>p5o}U8lI62-RU_rc@NB*6Z)y<673F)?%AazE5u>W(mHzWK0LdLA4d5Ni>ARJtqqa2r{ z(y4d#8PASy;4B6rnDde8(nYnelRQ+uLTgRs9?U9`ls*}`KlgZtoPSa71m8#}UL~X6 zJQw%c8*q-l(UZD;(7Hc2s#Nd|0@PTLSO-HF%g@Xi5Up@##tE#rpljf+hKh%?7arvd z@Zr2P-IysHmiXLh&rw|6eIG~ioFLUB99;|!9=n3!&oSWdgM>vaaLxqgdG`nsn7BPs9=dcUBvj3KUZvfh2Kf1d=1N{GrJ(G=1Cl zQT@ak{X7skLWQB)RfVv63)lOV`s76*dxv0P7M6ys98vkczpSSt!^H`ZTp#8ytAQgD z(%wc4aZ!FqIsDiRsYIiX%wmKfRab5O2`60Q*mPiwMuh(C`p(a}GYbQ&%@-O_b$oJ! z%YkOh?7 z?NQIiDZ=Lpt~eDr16_j^Y>U+8RL@h4Wo73TqlCt2F;0xIZ|a1gFa zWuVAj0KN#c6P@Uc)4+TQ9ql7J+3h`l9!?g*gu5V{az=pAM50BeN|4Q*0Dg3i!7Gqz zMyGccuKK0Eomx@@#&x2v{64Wc0miyOssz~0iK#8pyb2mz=SmIjhFwCCdKnwBpLs9a za)}A|9cGA;K!s%y1zqC$8Qei^^5&A+x?bj!>8HdR2RNm<)g;$&?*&o_0Ld&4Uu7i$ z(3m#yo|#t1_d}0!4Bn`?1Euzmy7>kCkrW|?{VAQ`oM18IlQv32GSI%AmQK)h zTP^57T)dk7Eq0y5U>tYSy%ui%&wT^JA9Ahd^9Q(yH98+wB{y}njBA$ak7~LVAq&>U z%HLfMI(t{AuV`#Y%ux*`R=J3ZKFl9EJstM_ewd7@X{&c*OOqL|D7b7C$4TOBG$yJh zk3(}y&FpL}O3XD!UX203wK1NBUyD%I+}2Gyn?PvQ7Hjemn!rvcE26I6$vdWVXHyMB zwPlY6cW$4bO(XH^Dnc}OEoshYdbH}QUJUNqNS(hMiK?q9)ck1AvN=9wNGw_%$w>A% zZSIUow86+Vj`Z>Q{L1$s`>FS7?y?*6d%+b=d;!~!bJ-X67i!+%w14t0xA~AT8iK^s za`s1S7C6y5X%$Y`^Wty5h8J?&zNNeO9LH-J_knm9QQ3ZEQ{m+9*Auv-xl623f&4*@ zSYw~j&_Pnu#hO5LKpb@AcGp+`e*R!{BQK>|9%X3Ug89ji?h?bl;3hK>rP zzHR9|s4E1cTHX~hSkQ=jD8DiS%5VVqx8I&AvI-K4Nw*Q*yB7eU&GrCF%kAO<&!7cS zAw>kMdd_!xe5+cH8&~uI9>Y)NyfeS}J9>V0<$qmrc>AOgC-}1;=IfE%sFOY%g-j0gppmDOdsSm%--AjAIRRHh3VtpsZzAEz z7Tm6LXX~%yyIFpJCAH&;EsjR5_S!b8*NWe`G!zM+dxXbt{x+0EySWQB@b52UqQ!+Vu_&K1jZwny?L8dX zVggn=7L7QbJ44N=UaOH@_1~V}4;H}PWDol&4=-1)7pTVXCh6{sUvGY<@5=asHd{D2 z;@kPj;m=QtO8^GvqA%)cvFLXknT3{Mvk#)e_$UwI`V_=T zs-l5lS`GtcfPy6h!E)GSRujjV3fm$UN)OOPM=_!}zxEJ^@o=x?I`{37gi_@>`YAfS z5$Cj)m%C=6WM2~5PC({_TePMI)osjoFg6(jQ@$DT!=#hqJ~VU2i4|Y7&>yKBe&HTB zaW~_+#lyb13s$av^7_4*0)R%d31O1|a*?fK0}*yGbeC`Tg|5K96$ZK4MF+e5{U;JS z>2bmKH*+^u3jIC7)Pvo#ql}Q${^LC-zzE8?uj}lLqHj7vnMTvq&=5|`;VlmM;Kt&`y zIQ!%xdxa*t1AI-8){0zcdNVY%M|tpZq@+#rVi>@u*%#A!*_$_}m6sr`0ydK@O-QZ* zoj<%OmkJA@77!<^K(1=pjg%>0s%__jR2*VPKyTodlPWkP!Pvqwcn`BNZ{mF|e#CAq zq~n7a2`_Xoo7|dkU)8J6Gb+C{Jm@vMfF3Wvn9@Xxbos-%m)yT*e1W;O`5)9p_>kRM z25%WR<~R{x&#&vhzcq3{YsI8kzBSBDQa^{MSu!Kz?Wd%nm;EhkTT71%euD&kPKK_{ zmT@k3?c8Ot=;e70Cd<4a>N%P)dhqSb%)Rn&U*{kFRAX{A@P9GI?dOzNzXkGo=w80_38OHIt1Nhrs7 zQW@PycMxmwPB|8yLkc`1ic98IEBOk1`OKM^CrZJHU70JvFeQ$*^rjl#E;_UBYh8}Q z2sYWenDnFOgQV+W`COH)ZH7w+FL+Gix%3))yJ7<3ks3Ct?(euQg~k*5B5ZU6i`0SA zdZ{x?qR}i#D=`I>hP1<@%V#*oZ|Jo z%hx&chc8b=uw>3thBI#*{#;{1t^P#lD4US&9;~%MeNf>j2eP)xF4%W7P|Mxv;%F87 zfjGWz>QNr&n+dg#nCd6f4<;BtCdIuCoh&v@EEX66ke9mP=||<}!tqLsv$rM+>$dM23CL+zv`*E% zHlUgk*S7Ccn|^IsQ;Kn;M6#>`oSaU|x}KdU*VL!cCU!{OAh^p#cAgc=JyquUk;;KO z(J)!#YgIg-E}SU*-OzRbLw(AwlMKyl+(ElqAs?RurRunq$Jg2yYhNnHymk`I=DJssTs=bRwo;R{7Xr}nw#7;jC+v$_*$L;<( zdfq(7qFq-_>>2ix$#~;d`G6cXOndMW!3_(ISQQxB2Kg3&)FS2^$O@(R0H*XkykWu7 zIm++Pl}W^*=o;9#3|$SRSqpEbEgtsIb!QS^zW{tP`7#%fxo3st0Sihs-9!z9?@N2m z!1xn@;juyonES;EPpBSil#2Is;g5lFwMOM=&%cxr8B%yYEScH|9o4Uk3K@1G!9c(o zHoQWK#+w*IS-V77I0K|Fb7r}?9YE-bRN_ZEqf3s!sMHzJC@Y{*W{c2EbTgeUyAxnI zpEwMS^O}O+4;`v+t8I7xLFc#tKh&_p#V ze(^v6=#~8wm$r@zBpO~>Wq@D@4aT;ue7vAnP>v{%87MoS7oHU%2-}_W^aQ$WJ;u|F zStc#62-GI|Hf*OSWxhv*tOa7fbmU2q*6>Ug&2q$}1^Z*!UN#b^Tu7_)5`r+#-c;jv z$wR0)+addB0mZ$@Ky)8ZMMjCX$P<@zlLY#3;`9Bscu`d5hJ6>GvA%dL>YFRlij@);uEJjoy zcFc=%qRc&H4#k5VMWZEIpYJ@m6q5jq*m}!ABKjNI=7IYr70%euPJ&{j75a(LwllU2 zn<~hIMkfewJLd6Br^fm*&qc=rO(l8i7uILKx7uoT%MUPbjDTgJ=+KA$VN=F|Fm&Y+ zu+0n8usU;*I*Z7=RuL9#7mDU+b-K)7ROb|34C-wej5&1jT|gE#y5d1LQy9Wy*0=Ia zMZOroRE&MHF!sJMM%*+FtToRZ!EhJA@n3_+cbYhD21kyXz>Lk@Jxw$lxI^;s-LpW3 zq6WqW2F`_`5@qkFaNwpF1VH4WiN z%7`}c2(-y?PiDQq4*kA{h=G}iAw)!sWyF|x|s_7ucphcY#&* zyZCzR{Ksfi{|nH`7u~MUvoguQX-AUf`|Z`N2Aa>HzxMD^2Q9aPg7q{JR}ME+Q@3)q z`({kra?!eGx$SuIt^Tit`ob6Z7EBLoU!fdshucArxJ1f3?I!sJOUlA~ zT-Bjh7g&>geNoXMi~@)1s;gpF;pTypR2@yT`*`Fi$BILH-swIGyq7qWJ<0Ix!eGJ&ef9BrDEJ zD@ffg^7r26MwFgio^F>^o)vAsN}sYHm8t$4(1})T-!167XDUTSmbW?0G^Vv!UqPFr zB)Q5#w*K7>t4UYd(O;XodHAmlJ>dZqjW2{?(xubJ_548(-+Tp|J*y?5M4!7@(c7dL zyN^BZBt;U~wn=M-x!#DMR{}f4)FC6clkDA#&c#;w zhrzFQ7yAXnxp)=S(K52ePnEFmPpAewt{EjT__kP}HK**9ORA(f^lsSnRCEk8;}+9^ z20`BNu#?pGXC?*p%a6RJ&o*ux4?)pT@m}5l8j%6{;~Rt$PPWWY8hyB5CpnYeX%UoV z@RiOax=F4Y|Cu$1oyX0z+k|w=fxegnpa?&7EEAhY{pKL|YXD|59X-Nr>XH`z{;yaq zn+ut4_)SFaa2hG{N$bZ9bow!%I5z!@O2PNfKD-wao8gVZ{LqC%2&Uu0S;WHivU>b7 zsNUoygv`$wg&qJ~$a|eW$Ig(3t)9RR!Bs)*dC@ik^7v%b^*7qc6c`Y;RF{N_bzM~2 zkijMb+}TC83_+L`1o$5MeG&7)ksMvy(}YXXF|;ErMnZw)pp`yWIsd&JiYXPQSwmZC zU;!?!YBE#O;qEk{TG1uPBBi-`z-J}a86*eyA`|5L^_nvD>%sxQ=cmMYjjC`5LCnKV@6 zkI+RN65(RB`}zdTfz)kse*`UVtHN^<4&6KLW_I(Z{cA_t^XZp@uxq^xVjd((K#a&IMha;n;zv*4kDDU_l;gPbu;1>sVKir z9E>GZU69*QbyMg_e0_v+tQ2Y7QyWjM0%uHB7ip2r>V}Un7D{Q3;xjTgW-WI=Qkv8y z$r~lQ#h$1L_v8-KzZpvn@x{LpWAE@}mWatKu*7t&k5Vs37pU`444=!vI1MzlS|rM1 zYrbPq(@@l4qY#2QnqhwYpGFsr)ZnWBcV@DaH9Cy#*8X_+5q7*+Xg&o1O%r~lT? z%@valxLas>wyIk5vuSZqC5oYx#dD(9T&=cvvc$OBqq%E%oLs=u(we*0PT>Yz-F?+ZHL`~Qt<7wJP4h=obvXkm7e&* zwL&AhB4|aKSErCt>A}uSb)loZ-2k6}k&55t&Cc=*osXy^;B8MLDVadw-bib1@XM;A z9n=gXI_3^PZ?mohKz+=W$`=DuFHp89ZIVmZTe zdyB)`>+9)8R$#B)W_lnywlT_#xV>o}A$GQzXRY{zBR|=O3;{^9+1}Dkx{XS8DsNeB z7a?-gwu=>mp0JlxEL_$Mm)1;4I+Ql7yCbq2zjBwnsyX8>Rj+?;xKq(H#(J-6KF&l>6%yAoV-!tT2oV|4#?EnqV8bRBQJ74<8JTtoe= zFaANUr>Tkl;@W>@MUS>?xa5ys2VPW2@90m5^!)xhq}Ts~P`T~*kNLlsSt5u>LX3J)BVR+>@AkUbm#S6 z!&J6|t-?&-)U}N)FARHx@gw%)&FqLL21~gyO0%1JW{UQ9K?ydgWZ6OX+eHTH1*cnx zo42sJiV!kEMSz|gsoN#_WtZ4HsE^rx=f4ahR<6W0bn@qVmH$-V)_)A?rI9+1>%2U7 zNA+#-&F~ri(6{yKRS;zc3zFXwjXhGt&Zrih11<4gtoU*b-=yd^twJZmh3BRIaf6)B zESTw;&#FxWOyfxqz}Th+lm1vg{<@o92+yO;Fo=Gm;?kntNcxBG0;TUVaYZ5o9mD6^ zvqK({ewdw#Fq4?~kTp5~*sxJ1)spf#^Xq!cTU_bJ_Rne_dp~;}{#M`C+`>1b39oX4 zWsn8m_tWV_Pl+?#+H0saHE!s2p;D{mqyP0oxzD}R&%ZHCpv9rZzGNvcRimy$F}M}T z&nZJ>2yGL1NXvXk=X+O$#1pU<6#QtLL(w?=3o9aHxU^Z)gnB$8$FTC8(flmJctzw% zJnlY2%cfIvrYl{96I{fx(3DvY=Hp=sQOhELJ+p&PuxU3$)-ch=o6( zD=UIYvLpO5KA6<%9w7zxB7p!>NlyAiA$if)g(lk%&_h9_t+MY^P1r-}3?v4E+ZgTP z5MF#C_Tc79ys#4Ulwuf+$+tDkI53m|lG8=Y2_~P;Y9ojmiQ!vhdH}Ckn5Y;H?;G`t zxS-OOS5qaT!eW&{(kMrKzb-3U)yH@qY7INN*+`W2Yqc=(=ap< za5!rH7%7m#=@T^TjY{qF{>zIkHuXLBsGiFj8Fr~*ZO>m zUR!G4+4cMbs|&6MlCnKR6sM#F?u05Q+^%g#b%F>VWIF>mOP`Xjqev?+G+4<~4R@6HRnq;&Ux6*y_ zM7NMyp~RW9M;ZNKDqX-Y9^JacRPQ_#a{0`IQE?FB__RTP?7KzH<1bv+L8)_(y$$Q0 zitjqo@x)Nzb<{}S?4oPBH+uuOgUH;Vgyj=*-cP}>l*5G+z~nFsy+|sz^(}jpZD!zm zi=<+6uARd93?k-f05D|>Wtr8{-H`cOhq1Kde935(i9v`Ez_xeLmYfe@JgL^=bB2C6 zTl7DnDC1V#vzpw|-SB=?2#KxGsL$0tY{c(4Ng!L(G1nujKIs&=Us+a8?b_4R zemH)0a<|61P}=E$tyXpF^uW4U)9J>bb5wQuhQ@~E-06_#P<7_m! zl%qKt3Dv5}p%~m$lKKl}HF>C};QHW}*3+}UR#uG$w+)-l{!_}T+4=0uP+eX9;K%z< z&*v8L>l?Z?Ke?uz&u?ngzn&iakC0HV0P7QZx>gb{~h{G2|D zUrtKBn&lK#p$)%8r4)}m%P(*e}C_X757 zOHGPd#V08H{Q@VdomaM5vn}{=aY2$b&v@#~?gCH>9qhQ~7B4F+cC|RHmPKARiM^5hdU$WVY^`u> zR>pO;>qUK3ON$YnW==E><{g$1-pyuUfP4H#?f@oF}saSqWrDGmtGiWI+trQmdtitrdEIO`Uj0AWvA=ukACmk{0A5L zf3L31YyUW)-_v>RpoBt|HhBp21N=h(NQ4>(XZ^WZK(~K-9sDmCAE`6@*$X zc;(NFp<)h|h!p-i}3WGKSROVAz3dJ|GX*MLb@;})0 zhZdFG$Kjf)xosxeKSS5FTVsJTwM4Jno|Q>Ojx~Kw`tiu-1(E>{fti2udkc#HtJz!s zi(do7X}`%YzkYAI{QJDHzMsA~pE`+9j-O_4_W6`O@RV0@lo7hWCe`;Y=vM5l{<>FY zDg6m=eww|7uYS7n4_yHUP_s7_U|^{|l!WK@PqR0INh)06m466L0=_VCDzr9~CC~Al z_jS!yE3HU6DlmMXgd2ot_P(Jb=IB>vwzJ@*pJBa#dag5QNsBi&V@6Z_NB_`=|GxqT z)QYr=N^b=e+dbZ|F1Ee6$j%NcDfh=fqXZ#LcWf?@0>P56KRu_yYe0d&tyUsf0F{lI zPj;=QL)!_er^U}ptp<+HN-C$>zv9DMKy!T77d-$B+4-oFhOM1GJuFDsN6J-pp@k& z-PyOe5D_%!WVsA-?eqOuP0;WAkrpc>=qP<(pGEiDAFJFaZRUs&Pq^ZxNM)2XFfiAHzj@scwUg@WFR~w?#w(( zE&zfD4CXwO>`M}z3S}7*Pr~oB&CSRmBhGdYE}qIk9Ut5#(~y{9>1~Lx&PK7#wp! z){%11!2fsG(I|sA=R;NYdy`mi)$mD;JN%gv*nq`9Hy%=)f+Dd@vI_5eB(L?1Ov$> z4S)2=Y61X&agZJ87l_Ue@w;CdnN%u&!)UK40YHGzE03&d9IgN*ydsVb?S+6@pO=I% z`(T=w+thqmeBn?g)Cc>Es)+4qwo*LvttSbE-Ken7l}Glc-9i`raaD;CfGdrgtlz!# zU6pNb@r@=izPWmh+TV7Ig|)NV&pj{17{CBY&ozzKz+3e6j@8caE@3);Eyok~<*w&^ z@-18@!fV|xIjqWd4_sFV@~;bf1B~4@-~0l_aEkQ$_7$(+_se=>fJwW;u9Se*GA`{4 z8G7l){iVUga?%Cj#-oLS$~%SM$IcG7N8diWB=8Y`x_>ZInQLQ*L;_H%+XJz|#kybq zmj&zZmmj>kp5bPhaWBbFg~>RVr4>_gqf#_0q||bF&f$L zX7B^cb(8T|Oq<&9+7zMglpd!s;rvM*GxP2Qjn|SvAtCQ9b~mf zuqB;s6$$5H+ZPu_Jt;1!D897!1$d^*VRQLJ05K??Xxmg71D%D!sVQ-t*)R-yOT{)auGpJ zlgOG@T89(P7Iu;CuY!gf?VuJ;S`<_35wXWB+6LD7HN95#; zin(jpGO~1qy)gL%pmanLc&ywRzjnWB(Kn_kynywQ?PZLBX^j8}=(KkPT$E=+M)>;4 zzL%{Y9}HY4pjo`!H?;41^X64+2=$S;xqZrA0wc4$ra+jDae_-HrIjswwN~@k+858b z87YaY>IDQ0mEF#?>*VqKPK@imh}?Otn2Fa4CF48{BuoH@NFkTdodF$`q0m5M4S&Lr z9wTPnC1Azoz+*<-Y)B#K#(M}pN0bFFTG@+h*CY8gm(MeC%^;LhDm)Tq$hKe*5={~g z_jSuz=)S}y%wZ4#0=Ru)K_i}} z4*=g^RotL&OG~882MIKDNMP84NUA~`)7>N4j8JyP+k^~&m@Hhg6FC;)nrmNh7cp5q zZ((*-bf%Lsf(@Xp5Lze%wUn@8e8G&2f*6+Gt^N;K!OYI+B+^&C$gH9Ck5*o#cUpVR z*!6~p)TAdkj%)CC49yK34Zd&`jtipQP=f{zy4c$S)EoTgZd`mTQTZXT3FN1%$UTCAe0sFxVh*5*kn72_Vx+3T?r##5VXp0B%5$zd%D0{H4;u8kTP?1yFsAR@9rQq&@TW zkU3+x69G_GXD_^-VFVzpNM3Gy)M?KjF;K-w#%HHgNJ3E!0E05LZ6)3dnZz*g2Mzzw z&pj|$0t4_sg1nt7rw%>q3&e&R#FPmDVCcgXrcj3Xnc)wlyb=}Y_M|^p;;mCaLlf3{ z*zS5aV2SOD&|GDcL6(!JgZXA-MYYqICa0Z_9glm%qQY{4$?R;Ge6#Il;KD%W7fK+vPL61k+nU?SSSEfwZes5sZD4e_hO!I0pGkXM|<5zUp5CfDm7$SnS_u#3F5;-kqDu$Z`1@orbtJ=`~LSN3<b~ z$^g#cfevH%!G?}NJbig$Wyk`){`Zd?;SV1rZ{abRv3iU#7~$b+rsEn{QXKk2A)XQw zqE&nr20N`}c5V@NW(QmhKnJ7{2+?KKaFm3UQFhnYBji{lxiayV@Pc%tZs7a}h0K?Spr2!}8wRDcC^Aa@x=2$nzxP2g`h z;6dONt_V$Bq(cffF})vXd13SUBAzhY1pd-RFj_ zgdi4zkusE#M;Ij7A`&6c1ikW&q~HmGKn6*m0onhDjug3*FUOAg=#IzONpq+!KNvnL z=^6A<8Arm5LReg_1a8ZiidPbZxPu_6 zirlf30y%+Xl@n4Yl&n&f*eI7ys3W9TYwh7O1{WS*`Im&|lR5ZpBdz(Fyy;#4XA&>-o5DGq#95rid7Q|ZoF&nl%qc=Y@SM;Y zozgj-)JdH^&;vVg1V;b^+}WMp`JLbyp5p&Gp5$4c=6RmznV#yop6uD4?)jcD(46u) zLi|vl_IaQ9nV=N zdZRj;qddB!KH8%|`lCV`q(nNTGisqoIxx7fq)ghRPWq%!%A~h23sg#_9_k5wm8Dv` zrCi#jUizhA8m3}8res>CW_qS*nx<;HrhS#9ZrUuj5T|lFr*vAUb}FY;N~N-}r>X!8 zs*nn|pbWhrsDwJGhFYkIdZ>z;sEq%*sE*pGkou^S8mW{zsgi1`m71xTx~ZDlshIkv zpqeaEI;y1Fq*I!wA-bWea0|Uqs;>H~uo|nfI;*rws=aUv{Gbf8(5kiCtG@cHvKp$w z8Yy>Ltj0R0sJf?qI--Eu3(oqi&>F4MI<3@Nt=4+2*qW`{x~wunilu8H=)1s~-pZq^GK|94fCr+Y7Yd4R;U;l^_YRPzjX)2(|zYu5hc+x}=C_ z4nJGD+DjXkYpQ*lwH^OzyaMYAU`q($;0mB%49QTsYx}IgpbSs440YQJq<{zi8mABI z31C19%CNS;umyqeZ-R;oe`~Gt+77XhzzV#;zMu-v8mN{q25LYDWY7j{OQp^_22H>T z>cG3gO9}!23-da!)cd%+dc;3WuG_oBu+hCzI;S4Gxj^fzU(2&TOAE!243J<8%h0~93Jl_~ z1Ta7gv;YkG0A@`)3lWP8^010;>34weE zfPAxn@CU~5wAcSY2wy-23PlD)46*Oq1V%s#)^H8iFt}L23As9`us{b8TfNc>4D}ET zf-no6oD3JloL205?=n&b+)8_J1msI7_(o?r$HOAX2(3l}@6^IFW~ z%EZci7c1M$$hxP>8n4VM${Ab5e{jCE@D9d+vt10Wz%UP200VfS3*qn!ORxl;pbO|A zGqjKome2$>a|+hb3&5Zce?SGwzzo1Z2)Inm&*}>0yv6)L4)8D!^MDQzdk#5^&2b70 z>Tu81FwgtU3FM#*{A$U{kjea@zlM_0bdUsr;KkAk(7XT$$3xuEw)iBhz01LN@3QwEN%N*5n z;ly>DwOZ?^dknBDYzxNFwCd{zX)Ds-9B@|v3RuQeoS+M~+yqo`3#70Fjl2YSzzGY(1r&;)j^4^%J)`~U`6a13|r z&&FU3TdcP9%(kxZ4zYj-iA@Xh3JlEM1hgQ>1a!a;STF|W zV+~;N1)R_Xy>JC!U=3t&1$aOO*r0W;fZWiXt<#<5R8igTI;BzU&*R$*V0+EztG-+8 zw9gve@DSp3K#LyBaaYg=){qa)tqG1z4XD5bns5bCas{Z61XOSZOh5&?aH{|g*tY*5 z*hmb}cn}ND+P?MN*uAg}r0@lh-2@ih1cYD)@`DFpa0oqs1y>*hZJ-JLO1<_hgV-w{-ux!9f6_`0_5z_am?v)(-nrVH*csSaIdaz{W4uCN4H zK;fE@3OV53OCaA&5G74u4eHHxfp84i-p4!(4%uuAci;_Vtk8GB(DaNA20!p0t=vnX z3m48*yz+i(00#NJ1+MVt9^1dz%Bt|t3*b<#z_1T#&;d(ohW=%yoxg4bVjg z)-dsOzyw@}2i8CbFJKA1&`;K2@zxsju8$F1j;!#C)!HrQcMuD_khAU34ruG~(E10O zFb=3-3CaKqf1nD|01Ihg2Be@4K8*-u5D3-K3x9wpfzS*4kSla><+f7rFe%69!}f~mp*>i7~jRFZlNVq=tdT9Ojxv8+GqcjQS-d;8q8bztXXT^ zOJC!~qOb8&hgVtRTiEo%tUVLzbn4ZuU&o$Z`*!Z#jp70yUi^6S<-=F?njV%a&(X`a zhu#ZVIB)gs1Cx2{FfQn`_Dl6lKdA_UuE1NyDhncG>|@ZIWRg*4HiP&(OTfl(;R?LF zcpFf(_}nv#!q4FA@W8VO;%^oX3H%U5?_Pv4Mj2M41j# zhQbKjqa{ftX^W7cBZUM}Nhz0v@*w@H#4<}Q$-1#iFTVscOfkpoX-6~7tBNZi+r#n@ zQt(P75JCvCgiWhx^W+dh0zm{NSq^EjHc|*-6QKd|g9-nb4!2~qQAeR9Gg3(>rLyW$9;s6At3ZV$`@HpjBU3cY`(Mx{? zHdtYY#ZFUW)9f@zEf29IkT(-kMwvtisd8Gy6jKJ4KrA5yLHA}sgxOxlCAVCeh($MD zb=PIrSWVOXF+Ej21u+mjG@0d;{Rj%glOo;I_7=SeQUw-I{`iAlnUu*BmTo6BH)4q! zWw&CBFUHtQch7`3URVTJRmeE^BqTnD68Sf}Jd5;906FDUSf)fgxyDV!7M(a}oukXR zXP&iDMpFvk%9`*F7CzI*St=Sd&i zX$oERYsCNF`=Gej=Ni^p7yl>m_xV#9Y_``&pY*%esr^)x(Z@cnkqA=oLjVCp1Yi2bdVn z3yDUeq|k`cQ=$O!ct%q4>yKwWmzo8JVM1bZUN#jp`67u4kDjIzPo zp>m7@IFNrZ1Pf)@5}fzMXFg?w!YB3SjVc9dQ1^HWq88PtM@4E*%*h^eubM^e z9!bha&hA8@pY393Nn6yrl0vVSonc$Yw^7};wYP-*EpK;AzTpbDx4{kWFN;gu<1Tl( z#szM1lMCGoJ~z46buMzVD_!jVw!7SIu6DgE-r;^XyyYdYZp+(A>|J9V?uGC6;v3)X zQqY2IWo~rUo8Ri@w?hSPgr4#1-CfhErUV4uja1AGS${MZDt9k=Vs1UNMSsOkxtJ_{Kdx z@rY}j;}ZWE#zqD*h_(M%WEBUQ$SrQNl6m~kZW{2RSH^Odwfq;y{zc1Q26LFjJZ3VN z*`Y?+hk~_5hLQxrV78qFZXM`gQlw&Qhrop;!m0^a-1(WLI7OXasAo^~?#{Qc1fVT( zix(!sV4mo6FYv5qQs8TAiI_zlRUzm+@43&oz;qo04eC6r!V`Q>1gH_sR825?l8^p$ zB351LS)|(0b=@?nDQ)RVW?Ip@K1HD;4X8wuV$rsSMO|T0Ct2_M7MFhWrX}5rUDtY& zw-B|UsU2)XU%S|?ZZxd#+-YM!`_-Cw)t$FZ>q95{6sc~ssk=>VrfT~T$%eGLi){%P z_Bz|R7<90C4XFQrhkL=6K+MlLft^6q#1pC%fGYaMtyBC#Tclu?@J1zZPgufDff&^( z=%k6^{oxd2vxFu@-l{$y)6pdhRmx9sh*@;YO`NcVDqz0p2V>giw#_-A6gM-B*SzMZ z(1gl`UTdbl{1#NS1Se+RDiZFM={6XHQjiD+8paw9E z!38qZ2$w_`@Z)vxV`Rjr@P+YZg|Bf-tK|VyWJh{ zcfbq2@r(yU8UpWl#ABZAWZ?YXArA)16aMg--~8$4?s?O*-S28B{M$>vdd-)f^?Y~z z-%~&P*pvTW_hcZ0>U+=ozU!Xxy2t(Be;<4`Abx$P0Q?h|bC{ajv^pXb1hhJxYn28xz*+G+p^&YXPz6oc zH1sPpw1XgZxP>NQf)|8ACUC(Rq(K>k!5MVH9JIk5yulaL!5OSU8w5fi3_>0ZLLw}} zB1FO@WI`WoLMME}7}P-;TtX;}!X>OiBTT|9oI)qWLM;SCE2Kgx1j8>x!X{V(Ebt~P zGc*4z^RkEf3(_DBhx&^*q(e76B0RjZI@Cir%)>qW!{XsXK(s?a#6$Q=FuOVhRCut+ z3N~7kuj9sI;m1jSP{#Ztt?P$Wf6Ohs2* zMO0ixO>9L`jKx>9#axs{U8F@%gvCw-#$C)rG*rX8;3U|&on*uvA6mv_oG#z0AeJJX zo+7aEs>W-quIoxK{ldlo%SOUVBL%~&alEY$9V+EffPu849I{KLs0xdBUD9${6~8v$bE!JVx)$R+NA&1 z(g||vuONygl*xab zNu9h&m(0nOtVy8sNiQ7Aos>bNL`r-7$)Hq9m`uZp+{iEDB{A|PizFX2TBn;BCZs4R zGI=a(;)JjiOR;P_m+ z$V*?`Nwti^V9d+9?8RSXNW}!mGz6Vv?4`~sqjCa@H|$Cb+RAsz$fyhxvNRr}* zTQ~*NtdZbpgV1!(HYiPVoW!&oNPJw(GknS7giif@NrCiFnzYIM6i^pjf&xu~B}jrA z>_VZ0K`Ka123^N1fI=#e(54(lJs=sy9%+*W0Gc2D$shQ^o*R8JZt{!l*&Y${1W4kt6TOjfFrM~w&(I76 z$3RjBLe1Z_(AAX3`UKH~%u)fx$r1HOP~3vK1HLhM(22B5LfC>NkjVddOhZDr!6X2K zKNwC8U4jPt13W+&gu&B4kkH;-Nf=xLK=nb|9LPZZ#Wm&9pM1*dlu9--Azv!2@);=I z5upM)A_3A5)*&5w0t^CL4#7&Zyht>~5Ujg6l_Tm4*zywgY*HsJD+of(;oLzrok3ZR z#Vs7eFl5Cq%vDzO)g#2!x)jAFAOzc44&%83Tm4l|T!Je|1Yca%G(-d^tW!B%Oe$;w z2h~<>y@D(F(6;nKFlYibXi_{#gKMqAAq-S1$kudJ)?4L5<6P9+@uS2VB%V5~jJhID zAP90$hB_)V#z?e|E0St@RZ}CYNrE&@PzHV=s#_?aQ)t8s`pEwo0Ul3iRaXtM25O)A z^ujc30~o{tFbGuFyg}I1&5y+bJiyBU{m_@S&=93kCNNY(eMlzw1CpQuGq9gFP}7_I zPajNz_Waqu?7OP~xe@kX!DdpZyaYR8R+fcohNo8-Cz~Dw37# z(H~1l1%3!1%OV9>*av=vScX^(sZ&qyVAYHzP2qSTWb{}ZOae3D2Qny7HIP#@JW$sx zP?}|e1f|)ZUEM%kf-SHFp~V6+I06?u&=+*wB)9@IID-F&L{u%sQi$BvCh*q!T!Nha zgCIBpLQn@hFjV3FQ#37FGxfnX#lfW&(H*>kE%4s&1p_L`-6<^I;|0hqXo57LgQ$gC zIxqu$yn=0I*DGxTLLk%m9Ror@!{~L{xopf5HI0hhB72pvtt=xcVx5E%q9r=j-_eAT zs8oglp2iIx#~3DtVOVmotjK-1Ss<(Z!xv(z5!|`ljD6CL{iI)_M5g^*M6iS_2m&+s zg9E(+FxUc`?ba>m*6ziEIz?X@+=B2uf-P`U82kfHxZx(SVZg)!Vx$5*@Pr@UQv2Le z>qXi$00va>gkJcAFZ}}nkW(z!iXKK(fNX-YJp})lWlCwK);OKh{&d0a{oXCW0`CO_ zapl1=fCViEhCuj9Z>{4w{$5eU17L_OU{C{oOoFoe-6eS9E%*a6aNm*z-on(u*d3j5 zSfDQAr@+byEef5&8Yq8a-~yW90(zx|h$Z9k9enwn5;_i~6WlnvhK`G~Q~B5B*eC&x zk&9(g6GjYPo}MWk)FXgeG9ZK){sSQxgG6WpLcoI{7z2#m0z~+OHb8{WB!o6F=FtoU zCcuJ2Xi!2R1vO{_JV0lbMTGE81hYkjHo#8>1y*_f)r4dMIv@>BNX=eN-t%PGYam$< z?Ny;|Pn+G)lTF&|bz@z%!Px!GUk**R-9i5~C>~FcXjc?hGkEBY9s@5-0xC#^;$hh% zOadZif+L^;LNEg?2!uLTX-cN&B%p&Xc4SK+*(6W{MDRrFqy|p9+qoU5$#k!u-iK4s zQDqRz^n@(dA%!Yxz}^raM&vVoXuvpA1rj=yeJH`m0-!G`;Z_xiO-|uh#ldbq0!!F} zvReYQ4uU4IXfUvZ1my%UpaDEcgdey9Psr9fh6OBeRv$cqvZDdG&Q?_LYlHy<9f;H4 zwbK3sT9{>9nYIM_%t@Se*gpt_Yk-9cFOG`Wi=%rFRK-2%J4TLsW0+gQY&Thpe&}bKYWSY&0b>wLo<7C9* zF`O7C3gW2k+@Qu%rU2d`e=VKX>F$AwmJ*VpXaS*UaadEfNS6Ak5&r5X?K%{e($3An zBTxf8@Bt!j&nuYSlm3G{hTbMP1S|*wI=}-V(C;Q_gFjFMPw?wR@IfPxVIEKeQb1=k z#ev~j0wYlCDh^(LgkvwQWHeOXBUl1F;0JNGS}i@}aAwP z+x})+nAArc6j#zSgEUA3HAn-%qv9%lyU(;?1Em5)pic|6+2~DO;oO2~>FLUiq3gtn zANr+F9VXKO^Mv9hFT3s>S|a}sgD9FfqCjg{P*w9I>P%07X!m~A7+T>Q?B)Y)17)Ct zwFU!}*5|UTakTD%nHGX@#sXMyK~nJR{cZvo4}>28gEVG>N`z!QAcG%3W`mw$54Ym} zZP{AYWNAGO zghX!nm(S1)?ReMR0%ouVTx!EIQ-`hRdTUUJtUt3i2m7(VGI0Tw#*` z{MY~Gf$yFG2zLSo0&3)k2tp|ci6~sykRc2h2^~^oi15Y3hZbKXlxXoI#)TgziX5p? zBgv5}Rh|@ivPqL9aFR4(SurKUFJB~Pbm`L}6G3-$0{U_X&P^#vDq@830%MM+A#YN( znG&T{oF|v!)JnA_)fY(`4J>Q+EZVec*RpNv_AT7FYX=D!WcM!Kyn6TQ1yo5A;J|_h z6E1A{FyjBjfE&dcH%_0veUc|ru59@-X3FFQkfP)HGiW-5dI`vE`ZVg)s#i-cow}^I zd+);WiV2emP20I~!;Cqz32)%LZzrK5oH(2%z-=FAj@vly+`g6LMk@V!a^co{W2aet zw@m8NziU^XFAtN-l`mKJU!iiIJ96F?*BgOwz!x2RL|{h* zci;gSpG*ukr(JF`378#%!bOOjc^8lkvFTF77WRp)y86}laS~=yFP4;q)C1$ko zC7AzUs`1AuSejYonOUltCYxxwx#pW~TDgx|$1sD6e+23Y-)*;1*BhV91-cxeO#Im= zqJa)7C=+}(s%M{u0=j6V%K2I7p$7t|X`_o82PuIES_+({iULaNq>et?=n}0O`Y57| z4r*!=uZZDK3Tv*YQrfGdqlWrtr=Uv81QyINBh8A@N;@sJ0$6h`w%KaC zEw|T7^X<3JitDU2-D<1OGOjE`%QEY>%dWfe!aMJ~^~!56z3wWb3@y_5B8fFlGPy65 z0~dU-!3iUbFq7g~qDGhzxA8|R3R}GJ#TjF~vBn*9{ISAi(IWsg)R02Oft{+nGRyxh zyZkcDFmD<&%{9L~bILBunyk$__sp}P#Qv-@&hUBXGtVpIT(r_XFFo|CMCbfy5?EYw zwE*K(yEWHcpCu01VT(OB*=2)$HQLuGqqf@n>N5`5j>$c@K1{wnH{N;cy*J-_r;`pg z{Ad%)GU9mc7C)VZ7Fr;^@N+oiC$iR>SzdZBJGtU;CX``h~ zY0f*p50m^@zdiTed#}7>)$l`%B>c>S4f@!8zyA6H@Z(7vi-XqqKJ43nKmPyub8n)v zc-HQE&|p_6(y5MspzGWKHHAP&8Bl=^OdtXe$iM*_Fn|vrcsP% zY$F`i7{)lZagB4N;}qYB$35mzk8&hq8Ud+CI|7o8e>5Z?1-V5!E|QUXWWo`yFpd>6 zv65YbA^xBz0O{56hHlZ}<1CrAaWI1)|1uvDU1&rkCUJ+NWMT98$Bh48&>?2>dnG=rr9T;>ZIfxc=O?rGO2?Ek zh|4%1He7g(RkBiv`HWmFK}F<}4)LhefZUwTF`RM36ZvTGOgl0qFl@En4H`KgHVCxz4pL zT4NGh95WEDwN*u9RZA(!XFkfYa2yOpVjymjwX(*guV#VFS=8#-zb;lS)wtTeGOO9m za<;Rc{VZrhE85YLwzQ@_EoxJ%+SRhQwXQX-@)#>yxJ-^RZGo!|uhCW8mSr<|P0MDq z*F@J4mauDSO>ECXj>m}4pz|=x@`^`}!^$tQ!=3GMU4zq_&a^VnjqX4;qZaOBx4h;( zFM3f#-t=NOe{aDpW@qTV(g-xV%G*bi>IcgG**Cn+!!IoC3K>$GvV23thF*>9wS|%b zn2U2Ld;R-7=P4JwRb4MyB&*>KbGXAE{xFC`EaDN9xWxY^J~4_@tl|}aIKt=ETHp58 zmbSu|ZFlQi-Fk83u|5VBiH%GuJn^>3+zm2xGVIuOT(xy^2VGo0hxLKu%3Z!`8M);h`7G3R*4 za@$8LEMW;{@Iw`(fXu)kgIRxWNgqy9bd$ufk6UgcC=AnswaiSOF zCWUSxXX^R6(#`Yzu7%yF3{og#AG4l?t^+RcffJmpnC$g<@m$0B*3Wx7Y~rv#`z6Y{#SgS(Y1wT5{ldklw)j4nc%yV4p+-JS*0~N=Xg(qNvie7Ny8jm#+B5GydpwZn~M*LgRjR((8P-8`b}Uep~)gg{vc%t3NmOJ3L=65=vI`O7A!&wjZ^cy)eAXq8GEI1AXo?O4}i@y!e zE$jxJU6-orAXE|YVRhA8!NDLQULq!D;tN4sCS?~QRv{=2)HsOG zDM4Zj?V*D)4kZ$tC2FE8zTy`qRQk*!E!Lu%CEVPUj4o2cHBbYV+2SldTx|`bX+TCb z2!KI}gF2`KF%n}!DGnAAS2Io{HC7{Lz#=wg>jF-gFDV6J=XuDJsu!AYNI~x}39+;{7#_JPIXJCMCjs&r3F?Q?i#o zG9~}jPeAGx`&eT&8Y413B381-W=P_f;bd2iWmih$X*?xbrsZte;2RzyIRcc6l~O6@ z;qee978ajc=A~ZlrGz2eT2y5fl2s!*7hN7t3$7wxCZ=LK<>QH=dc^3A4NR3(at*Ao2@Vcz0yvL?OtCU8C{bRJz)-Wx#LW?Tg(oxo56 zN{)iTMI+9oavCOc@*HADr+J=d(g|l;047bE1z7QeMYSSaP?B6AXDnQUZW@nWB35~# zr+@w@u1%-)%;z@>z&$xpL}3rLkpeDoqIg*thGCB-uav=K%fXCeenmwRSQBM6J8==jl`-Iinz$bjtNsYP{fe}M2R0BL@Xyh+gGJR1EX;y#wT&t$gQF$Fgx1w9Txr{MsVul3eqAYE z+98I9XYuUkB$8&4wyB%8kbwSN!YL^@eh;#h-Yuw2v{lw%mVgJ=-^qXjuwuOM$U%5DW+y>C4nef&{0u&yh+PD`9_ zk0vRc!U_MR_uQU-Q5)&ug19l*vuT3S`P)J%YWGPXxOJbDc@kRmqq29Lkzl1>rdC%VS*4($b&XAljq(6Tx6$pHdH7 zm?=Nxsw(9y@42SWel5hl>wtRV!bxrQJZLO!#$?1&!%4<{v7855RCm3n+=3OC{m`W5 zr-pK^3xciR{;Jqg7}<)Zfm-E*_7=W{mxD@J@*uG(V~XPA{M zk3#>h*CbB5;-A-6F6q80r<#T4vX|rP?T=onbe1mc5?qNPp<4~Dhdl<1t=KW@Xf;Th z66S7)X-$JQ?C%1v@v<20#;)?(+QcRvV4lVU_NkUkFZEWh^f{fBXAIj9Z`Lpl=Wq&}Fb|UzF;eU%rtVt!mgBsVF*^U^ zK`jx^hAs#jXTV)X4@WU$q3{mt)F%eilzf3u^lr}Oim6ELs#_FW_N|~aAi--_LhAi=(IqFT;ib%DbHcf zae8&9c3qfvA?_VlvUE9U0g~;-y72ad;#$-#jl$<1`;~$+HM8K-=Tu_eFq zCAk;? zrA6I%0wPSGGNghks6ryh!Z5o= z>d<;&4=zaD%xQOjVOYe1tb@#>W!GfBg%Ne}YS^#UwtTuUc4aJ}?!;$s?@G<_AZT1ekM-?T4>bItm6*QjY& z!r9mYUC_}NtaY?fm-S3bB}~&Y@yKaSPqjXio>W&0Pj~Th0<~9Hu`yTGLYcK$Q*l_k zr@U6)Swmb@ll56pHTJAqLFW~L4Ng`wEJ1%LG7t4+uP9&lbtleqTpj;&%(k^!>`P5r ztv~;APb*X^_oFLcc2fKGAgk~dC)X-h)gq1;O)Yj?*ym#h^GHi)YO6L&vvv*z_I2`F z(0O(x;U+Na;c35MZ~L}GUv7*Ety4>;TTC-PQCV(#al@K3oNb|VJ2z7|H5$Vu^lX_Z zR%U6RVhdhtCFb>amo;lwwpIaVIFiN)tA8W%ocEPCzlq<7=n~aD}oc z1F~G`7dc!hf}!_3EaMOx=qV(kc+G;wwe}FlF+o2dB)k8#0B{{?=sL95JOBCm0|$E! z&04tjyR|-`ds{p94BFe+AxN{u`H{N&OdFRY4yQL~bDzaEkOH<*sJ&l2yuZ4lmo2@1 z^>J}YAcVZg6GE#7yh~5lwedrlJ9^1!g2GFyM$3h&^Qy^DrDO=~Fe})zWBfyhc|NWU zT8|gVAHoEZ0wEB>AvoZ$vjxC&w6U{%PS+Gwo5;+!5+@5)6X_Q>*YdXCq+Ta8&wsbH z1J}>%)>)4G&=VRtaKh0$j=O*JbcNnNJO;SGdlR)h#aBW+qE!QXt zfMY|w%e%1j4fb#*j%SQP8+0%Si|%%Q5~ej#wCPYUEPbN)LLxZMDGb`qPd=FQd7pFq zr|P@VZ+_A@D$>J(3l}HGl`KIC0C*z2yH)gb?Y+mlC-ww_8PI_ln86s#I31{gmyAZk z(Uz=InR~McRWCl6F5*nL4yYi?z?7*5TQed0uh2GV4pyQ z7cm;-r_7SFisQyH$?+p~iXTjv8L#zHMhHxsF<{gH9WzEv znn1lOl2dt6VWLC@ZCYH4aUZEbxcE_=x|RQHSFc~eh7~)OY+18s(WX_qmTg{9|ySA4vUjfRl*|ob=>B5GG5*=ztirn3>{8V|Wxlfy1Xnk z1#VnXCe6`<55`n=$kU%KU|xfP9eWF&UILVME$sBA;C;H4k|H##ChpvDktbKaoOyHS z&!I<`o>pm8>rt2f?z{c3=<8BdDzp^n5MX7TBF;)WmK-PI0zonpKrB`@cqo^GemQWT zC)3zfIz<&twoqdXGw2v24Wj61;}4{c+v+zMp786xFdje)yRsNKYyn3o=iPBPTw7=(|Q7 z{PKgPBLOHSM-xskv}r4TIBA29S!tzJfI#r#Y9mcN+D92rl!5BH>;xbM77=UI8E)9&hand9&}&^SSleqH%}_!e1L?S9 zLOf|qQ)PI4^i%rmLy6RkC{>0OPe{RvpG<|-)f0YkKI-7Ec1Cw#Z^5dHl!PKK+UTQ^ zPWmj0D_-hii~%Ef##210`ejmX5lz#VJM}aqe%xJ|DrG8E1(vhvJtbJMuHna%eQ};u zXSIOt3bH^*=~3yu`R?2AhbLwlJgTU?nA^G)rIb=sXVwrbal1Y_mTTS(@7Jm^$J|-4 z+>X1}x#lA-VHZ1SNiJpNQ%>9T6+jER zkcU0=;nCWNBw@2*a!#m275|HM2Ign7f166(QbHwCO&~rO{;upaf zM(Oy5i~wt1Y8r^KXH}+%{DV$R09e7>EKrPfwBsFZXRtB~W_zi@O&XO4C^lY^a;R#K zK)86kIpUF#jdcIyS31ZvVx@70Bjle1m6OO6p7D{L^duuANwG=Bu3OfjlR?B$LIIqz zATPpXStLifSLVfo7)hcWIr&Ll?(&Iy^i3ZTq8IKMBv@t4NGee>r*Q=GES0GS*fhf# z&v3<;zf4U`NI@$+#ElTj@C+S!8BTF(urlQ|=Q+{2CY4wzcIhlpIWq(Yv=QR}=p&umz544d@Y+!>XL}((H4Ylb_ofpb$jWT=QL6kxEQ4C(# zVyHzW>QVoPnv8g=1%mw}OiClfk6XYDXWOJzH*rDJn&OnJT~(S+fBLO7mJ(ao;D<4a z%8Rt7m8i)8iP&Bj%mrGJgeub_N*{`<(&ey%%D4qhIT%+zmIa(%HSA&EQY2;0X(?+; zBas%%C9@_&tw#!RO?hy429ZXel@X>QwpK#a`UP z5(lBvZ4XizF6DNl0$9^K+9~j2x)o1k5}FlTzx8-Bnv0UAU<0rfIZs z*Wm6NAOv@J55e6nxVtvixVyVs<1WEHSO`J#;hwOVb06$$ovr^+RacEM-tpX;>|L5N ztbpVW4-<1r*8TU@>G9X<<%lrg`dL4yQ0@V-mbza<+9VJZSKS-sdvpoXaT~6=IY&yy zuSW5|LwO%QKk;0}y-X#{e!tT_=ebaJ?%^1sKO;l*p$|7&f)@^KN!x0jFgZ2z&n-5@ zC&R7@63(4H*qN0jz!?iBs$NY^mJ%NwJ=HGub4*E3WJDmy+yujmZ3wnpO! zjfExxy96(XUZn(w#F(_Xi)*am-T?`IcSM7Ha&+&C9-t$7!}%m4F4V@CrdmKcdMqBS zXVGClgLXHVRcTa(J?Ao4_P+2Wy<*kWB|C(vn%5VhnCHD%w(N~8Z1aMZ!)GKuLgSd_ zOwqrhkrF}+2^)Mvsx-s9?8p_unbWB7MPk`E0--d8d^6ZBv+u{si%nzJR2+H{SrWt) z?lxBYZpJK<_%V#U44cYDXsL&m);(k6%ATys*4uj76WP6YJ6{QCaxePG+K5q>T*z>V z-VWs2{0!*Oc1WzrtfsC(%jbNl3F~ndz)uKF%lmOQz6S)SjI%y+UJh`Vs06t-MoyRG zgcs61znaor+YrXEHD;s^xx1t}^hPoD96rs^Ckjt;f1s|Q$fr6=3ha+H zpOUCKaU&jcuxmrZ-&%{(3YyC6xH0cNIA@4!W zJ##WVvt5!BI(Ak)l@I|V`d`APkF6FI&_R4!aja#lHJu0n-w-_iQCyk1oUw}u*3b>c z3u{2>&FYyu)MeO6#;Y`zez{JPb>GgSn9|@1_e&(1TqLd)yI!K@ns6xIn?fY@KLuPZ zQwpg+hn$gk5+DK{OB)eaZvhK}=wYnyS6E<`luX6vdTC3Og=Q_b=}iSnwa`|Ogco-i zwHrH=lq5w~6IU##fES)T5S~*+86yBe8@0sn^uGy$D@r$K@ZmA$D{A9o2{o+(%^k2G zr0Rt#;U(70F;PVKFPi46_{R zV2)7@ueWCowU;tU~jPI4R?r zge)oI_X)k>aF|$#Nm2<(c!(ty+P&=4xr@2cC1|7fQ~p$^|8r}4T_jpss95_pji zxWS=fK4dqu7}`9r5LjXVEJyc2@$QkTD zk1K@dSBdv5v+ZdGL!(s?(u*`s#jsmbq>7dEV&y+`SUZ{4Ao6LD+alQFF(;;}@% zCV?-nZOf;ZWh1v!B}a9t0j87BvXDaUL07XK-dN23GJXSAH zHuUAMr@6Y0rw}xe0AcVJ&%wJ*@bOMpv)u~b%Q(q1+9RDpM(69AnHAxxRRn==_J0>P ztwM}djcOKVRZD_c@}?Us=22dDFIJX5%-Ub?rLeu?3ZaCmP`kl)(^ws8K@?ld33E*g zNNbTTCQ4%W%GWf0ho4YWtS0g%FKfShWzzJ%w|+0DzdAv$i%LbFQnP$FM|f(@d|&{lhccG0QC_@V;?e>dzS8nJ#tj4aYE=n3==zKjs)2MRBs(gMXkC_co9@L4E-|t1k2<19 zIz$vZPAvF?ruC#-<@&<0oc5PcC3qNq`DG33lYaBZ){_?E*O*!PyfIEaf$*dkMvZYX z$LaLPPL+N7dV!xvI}J|NPF0bWsaKAG?QQ5|h+zydI|Cn=%AK!0;b# z${;=0JU#cr)+A*g!Dzm`_&e^978m4HJ+@?{O)F(#D(o>TV}c?4ZxRHJ;e2gUyZ2Ps z8X*)K;;cMbvfJe}rLn9s$JQAQL*mr>Wyi(S`EUtW{Vj6Y?$Hz z0%AqpL@bv?EE)FPFrO_Ks@%_1Sg#6l!f>iyK$dNbbQQ(4LEUW2m25cQz)W4gIxWto z@sPSa>VOtkj2daqRlVh4GsOFh-k)qUY4d~7bCacKj?@o-wxg?WNGzVYM}vln+67VuT= zWP3GkK)ne$kaQZovVHLA>fZixyV?@6-#^yDy;SLC8-LA!I^mb442vjs7pMv~lINtq zbvB`9aF#?g+&r=dL;J`cno=FR33Sv5*3W;dheu#GUk!3G?1Cfp z__EeD`Cxy&TB@4St-saX(8GYOt%>3t8ZXq|_bH^szA^8k?S`u~U#kX|ukq4r^jOL&;? zb%^N`tHM_MGfN8f993d%x_vDTd)hE*g z6#CW(nA^cI&1(uK3Sx2+zJzV(q?S9{JC`!KgkQ%w4_CO-IZj1ke5TpWDx! zgC}3O;+V&!snDiY7ffv}HO!_6ADI=7bv9jO3Rpa=Tjct@#6v!;-@Bx5#IR{UBNnhM zP41}lcUk!h{tTj{*5{ScvII%;Wy?i&Za(Hu+A{?Li`vgKp%rTZf7c>py-$m2LOy$E za;?h#9hDB)F#o&u7V(W7-!S`j#xwY1=GeAjs^MB{25f~;HuPqy;g!c7xKx)xF!gua zZ*bcWj&R}&Y^fu=7LF%Unf=Jasyaq4^Lc{9QFP#%<#%x04dG&s#n|`XEQ=pMwtdzZ z+@b`?kA{&A+sYWWKW#N!fj@`*2ka({8NMTssZw18Q9rMIKm)-pvS#9k zc(h{^R;-62VtynIsWMg0En{MW)Pt1nNLy>xV>6!jIdTukasTL5aDMi-Qd7vPT54BJGLCsT7|%M6(n+tF1t^%ZS*2Zx`#N2wlp_>?%2&NyrB!3l z7t2?(T4&Vb`xlkJcD+gQp^G+}zizXYJu5}ho2`DkYpVW&rh}ht*Pip`UVAle^@s5k z2=_kjF*~>e`Ny?i?egz-z3CBCO=~Zvqj8o0sx48U@W_QrWe>TOqtujoK{+Wj3#HZ!d=%tXL3FTVSMhsJ@%;yn(Mv2*uGdhZEo); z;Tg4~l)@pOB(^y^50)YA2o(_GaXohf%+cF%vx`<~bzSeb&% zllY#0PUp_qUKu|F%l&Ec6zefT*b~j{5f{gUaT{`y`r`e(aAIaD|$b94c ze41``IHJ54i=Szo~4bs z&dABixH|6BYwEAb5w6sy-zO|HVP-82GB1p{uHz0VIas0c@+(cp9DQ4f8 zQcnuPiDlKQ*ent4>q*}xZ<4*b44oGwFqJ*N7b4dFr}>Y>mU^+V-Fi1wRY=~G8$7(+ zIM(4XVYWugT#^_#fapi2N$S4ixi;3+TRRWki(w%5_}A1vo7dMi&t%hqOxEm`5#i2Z zYiNeTo=lwJeGtnr*QqOqlzY0kvvK#h)I9f&Rf6HO+Z0Fn%Mt;ms4h*-Hu!OG&sKq{ z2GIHJR;rJ!3qvB`5^7aFE&g=%2x))oenIm%9KuxfzmiOP7T9`Kz;J;fb{CY*3CC=mPX= zW+~dP{rR!(s3wTjp$Po7vx=6D*_#Br5Urqt({NBK3hb8@>P-ij6ON=@-HUqIL?EGr zDl#EU#M$Rs4lx?o>v7f=<2OW0tL{9kMp9dA%h+C!r^IFE zAn+c>)T$ejHMNVnDe&55_*S zmZz@J1=b3|d3}xoR*SrI2kTFHZdh=q!+C#}$2nSj=$;)RW<2eSy(d$6b`3uaEu`s7%xS5kobAkwYDk2%`wr`l1Y8c&Z~vf z!$DIamew1cCq+&hL)qL`qTJ1^t=6;1Ityr!5sF%0hxXN7rAB?F-K(S5(WvKs6I%U@ z-z;*GEZ*N;Z~}|0k5YDUE&zWi?jvXq3ef#HdOI7$P1y4N?V|o$82=6w1&j58dfH~( zYAef_zs>7!z2A?QlJ^(5Xxmm!(noiDY=SV@N|DZyE!+4wt*t&Qq9FuxJNK_dV*j?S z@gld(!2Ivnfsc}l^=h(Ga>azXm25>$*k}h>JW=_yR@R2Z1_$5Tr6^=^U_|L$s<=E6 zc+KnULq_W8Q&4`v&bHrT(r8DNpD+@OEH1ss;(5O$0|{RiDEITxeoDb4j98Q=L>z`O z^=N@p>R!@H@V&WrzK;Y51kG9VukzIM4^6e*&Sah|>}91+y1(3=u;9$0Wy&*^pHvbv zGd7HQ!M+Ri*i1QF4ztYm@ti;yf|C{8Z#hX40?$w7Z;Fp@h0EeHp04SU*I+4;!DyC@{K0rb#e%xo1(LdJnJ`~dD z_bh{XTVij1hsXSUeCdB1%0H{{xM38x#zp*4LXg9MUDpW_4k`HRE^v5w+&QaTlbU<> zO07a1CHyV_rmPa!RJj)pF#Z#xe=bSKVmm1y_ZAYHA=YPJd16fatCK7jd22ZOZgO_u z-;_DBdMpX;dyK@$k#RFcl@tfy=K z)dvQ->pzdGP5nSFf9djjPg4K4a+co&M<`$+&9V{eyV>0Nqw@S)l7DEs@pnrU;mhRd z_$l^Zx2dZAckd?@I0fB&<;L4^tJGg_+r#a1+UoJc_EnxGb*C$4f>kd;qJ%6BfxO$~LdZzbBc)w^w|D-hM16dP| zlZfEb5Z#G@TSD?yUE=nS1o)4pUne5j!@~j)g8$?8-MtN?!Vf>^3wNxH`cCVWT@j8w z5kAadqFU+dXA?bg6IqWPRdf*QT4rPyt;gyeohrv0b3zb@%*>9gbE6hDO%+C*5tYUm zJ6>XC`4GIa9O8u}A|@AYArRXz!F1~J7XF79kCq?rKSB;AWY+pejeDe6W2Cr2#xLar zoHN4?h7s|nP^=Pbtt7eVBF6adkL=kp2`kY;@)ijjl?hwO#E;Ep#-o@yC-FQ)F^e{d z;_k@5D-+Kq5-&~?&*hM##E@?Ul8mg99-@<;Dw7`9si9aBFNkcl`Hrj&+}1UeKc`j`|ZAAuhN z!O6Udh29Vvrc{(Mol!YLCOWst%2bRAoRaZm0(>Ffs>lvN0*`IlGMtfMbWFiwG&>4; zV@Pl%VXCZrx@l41nQkERzWWNo8^>2muDA@cenyoiq zfOnU=NN80zk=-|`86c-oCMeGk%DSm67UMtLz$4_7Rm9w%T*Cr6h zJ%)EftEy&-CCY_&zZ~%6wjZV?vX&nH1M7wE(q<+;gPcEKuSg`t-5FzJW99HSFAb=A&f56`o&n(Cl zlL|T|1s#hmXwJ+#1F2H_MtEYIZ**W*Us63cV)B@&W~)`PdsWCxRiMAudtA`bNF*8; z3VE0@(1$PqIpVw$$Q6aE_D8ufg0)}aV(#S|3adhzi2ZKpC`1pP8o9V7LcmcbbyZWC zoXr*fgB8cr0A1!PO?rw?H8qVel>eHN_kV>SJ=W9ZKs+ZI`FSOM2T3O7F{Z@on_Q7~ z+KU^p-(o3B+v2}N2d+~Pt6EnlTSW|Lr^iTDS+pst>7bmgJ&RyjyTYHAG}oz2S;aBF zK1E)S@tT6|JR9Y0Od{4SIWAiGJK~}{*w9(qa;hzSDglQe`@Aq)Ib!P0n-VVhn&il= zoWw2sfU0jPXE|xpYN)>W*<0>|zjD`tO9mrbi_dZ%s`Cm))2|2oqg|*o?-2cVUMff ze77&xKCmx(BU&*&CMfS6a3=PX&!%Tts{U!R!lnP!#C}v7F%V9RCNy$Mx(TM; zjCV+V1RO$wSyMv&MO~h8<-EGGi_nB`7~UqdUsE(Js=GTC{Y{l7k8LI^GMnpl-v}VF z{Na+QGuHf+++ZjW++jkPGy_vUAE=6l$i}xzbx$^Nkik~Oe^ zCm|440;K3E7;6H9;aAD(_~`=_O@8(m9BLQfw>n8Hf%gF_H`?yXF@3nM-!-!+le3hB zZsnC+xmflYP34D-^IhlJy+d#B4!u)EcPZ^N$$yjc8xJTsK(1H$IMCW`u{6x&8GG|Lo&| zF45NKQZM;Qbxs0R@na9kpjovG6Auqq+!c$o1daP+K_J;uwbJ*Q>`B3_H&$&T?T$<8 zGc(d<#Pm{tufK(P`w*chkLpYz24byoN^hj*=a?GSp`40I;isZ|ubSy=A}Tif99C@? zZYkMj%xQ>uxo|Wm`dXCDK-en>`_=3TA`3|xe+-tr!H!T@?s7{ZTJ^$W(!*kP)_TZ! zc7rWHm(dzDfQLhzEIVPQvW{g(oX8*)wXYE4cx$|nd^5yoB}8^p{Yo(OBfc#hbu(_ldyY zD|XV4RwEeqj0Kji(W?jTd#XFf`^ltxU-nW3mefOjB2n@W-9oXF3)j03#WIJ>q+DAwnq2HzXd$GXiA4JlB=%}|s>1*MMtxxB# zMg6a9-0w)5aZN{Hh~Id&&wolt?Fs?<|were5Zw+iq7Aq|0_7}$(hkLnM$ zn{&VKO6U8)+#P*rj@{tH+mNCX8d%R|68NjbHgiMySpCEALXo$_m_JiNb0G*uepT!P z8gr*$y>`vs0|)up-P>sN`r(fLZ*0O^Gd-bh$cZE2qqF#jLl|DXDlppZ1+Wu7R^Ikp zeQ?(<5yc;xl3$;5eENyQ%!qaPKSd>w_=T3~u}p)noa(Nz!@A(q+fTKxK575*pmP_ZZimu8 zaN!c~pt55Rc4NJuBjM0-iQGf;4X~}~{So5D_P4#TIdfHthxz=YFY`2bo>x%;cRoSx zJo681aPa8t=3O=BkBpUimA~S9J3o;|J((J3UQ9iy zIG+`~Ifp0x$z6mlp!_KY-c-Ihe-?$s*AIL&c-Gv1YUX(8`SK{#oSYxfnm+%6J@8O7 zz!WI@G+}xXY5dv}^!kC~DJ1hnqv>T{)UF8g{%g~SLy+G?;@`6Jub_YBDqANUl^Cu0 z_zPao`=U0js;5<*uNLA5#Q*)n{_*IAe)he-j|u||2ztYy)mzvT4@Y?Nv6CF%my8ba zy-?KqejpuB%;$8p{{2uELM5F@tG{?8pT?wJZ-J6>Ad<;tIaeA3$pyHrdHgx5IwzTf zGTi+(ADhph4ZLYYV3SMS9*V>&QvgjZpK90Yw>kaXTshNiG<6lCGhB7ph!b8hzG2ci z>~xjx7&R#Ou+^#5s8I3PTKn%SECd0Q-Y9cVf8^Z>-uazcY#QS74#UM>{8_R0xf4ly zB)YaZ-<$8Sz2R`G-2UyM{r2}tM}zf`-M=q2AA4Bp<*vN# z=OZ(4?VU(Dp0{ZakVJrB-b*nMdWy5iO1~kC@XxUrNB*0Cam-@pFtdFxkMl{zw&B|A8%6rGs)X&0R%k z2RBtb?tJ+B4DM4^GdF(Llv@MO8Skx{lyZr!x(v&d?fgO{v)!!y$i^uXAf%RAUFFjq zUgM`LB{|hqrFhPE(S}~Th3JFVTWvk_QD&{T12QcZ*}r3kEhOHr!?6?^fy;~9`f+^s z>q%qcDe_hswQ^J3U7!R7mVhsOntlIHqzx>3?(Vn3i0}!^<36zQ2~I@DCTJ+yf^^pV z_z}Jt`&w$Z>-(n%5GWLMM#LM4wZvlV>in&HFbT)4Qy(FnM`u%3xM=2Q)DfiNH;w1v zPg(sl!MdVFPIud~DaJGgRZGy+@sUfkCr=;w3?_FN(DTmITSzrb_p!|P<9A^!3?neG zfkUIW$>o-X_x|A4L{ecE)hfMcU0u_zSr|czrdwG04Kd!z_<_lXF19do$-ZVur>Dbp z6d&N|J}9}yDKC3mu~VCmdaqpVWboqr22->b1d6!Jpu)4zg z95L&DIIc1;)$ZdyUzc?7mg={EJ|yELEiPSt|JiqGIb)!DYji*S^V1OSvJ^X+{wP{m z`?sF)x5&3IMl5@ulY;`EKkr+--rTGeln%!Ebt#>7(J2SnEj9S=$6T(c29|bGJl#Kt zA)84lRF~|j>3xIv(V??N82<#0MjR71dN1+4c)4antc5mCvzw^$O@NFl7cic7|d zkFGEfGbH5E&=ga5yun&V9!8@6h|fD{XZ??|{{!LhGqnt2UoRuX`9h7a;Q zbjxH#RBJx-z8A^qLW3(5S#RzieTu{Lg{0_3&`;~UsE<-pQx$om1eM)aTMCiNY-;%@ z;@(-i zLhU{#omqv_44aiQ<*V{x0p?64z^vA4aKb=u~)32p# zp}jm3=yi%}$~fzGvCECA(rRy5sTJ+d&8jAz4)Qj(8kz>F%_Ved2KwDP1a_?qqCWN} z2L>NB7QaL4=o}r_S~TCRFIxCS@#zJt6ht)&m)eH|l61Zfjn#K2H{DQLvW3KH9LPKf zLCfaf%>1vm%oNbHf$tZ3vBPi^j6KK*mn)KqoyQixZGbb^sa(t~Fztx&SPnZ^uZtt&xwz=V@ zKWh}y{OO5=Xkhn^kR?Q#$8^o#8tR{E$}!_WQBjM3E_lnYw`v-D<$rQfr5$a?uCxQ& zG#ZRloo<1AU?=jC@nuXFTZkjfG9(kRgVbOfvP-G1L(tocHI=JCsq(s$J$n!$h9 z+xT6n3SbYrt8)xA_k!`v{3-m6dKxC{zjLl42N{Uzsx*Gu7qD_0!ORy?=<#dATw3{x z-gy-owR!kfeEhM@)MgigVz@_F)Dn8pb?wp7+Z#CMbZ@1Sf_C5?Jeh!1lpkGbTjS;BVYDZ^;JT^NKpUsH z+yZ}+rg`$+&-eZ0`!dee<;4BBKDf9)6$pM5+|BK4FfdKgjOXsOES|c1ysG+nE7x{j^#lN@s;AV)}ZUj~XYW7L` z{PQVak8JYtK2fyG;qwnaKHdKNzz1ujAg6;LIJTLNu1pAPx*)S*xLojNIac^>pC76NhZGDNpJruaF5nI&gcOf1S+33gr z-QSKY&i5jE1WXD%t%M7YI*w&Uuo!%x77z0l%&+;xvem0WB1E>#Mb3)+fwu?ST_hon zmx@e+`t@@tr#OWXU(JMQw7Ud#?&s@f;mns$JMs<8N5ZHhL*({irC}{sV&dhE63uR( zxZ~@oX`^Wz%3ADee@Svmw3NB~Ng^5%?QGWJ#>4Q?Bvcl-MJ%{@&|sO<7w zw@*?Sal;{*!(HIP7hGb#?GIc=;_|l~OByv{oiSHu9fQ&B93CS{E~ufY{h(K=H|n0z zo)NK9332s7`f%xo*iT(?gU*Ly+P5&38R;*t?8d^w4f2xWMv_Lt{bpqK52PedeFmb6diK>`awhP_7tAK{lC|O`Vl66;DisMa)R4iPS;9wp(oKZ6A4z zQC7^Ayf#?)Z>n%^D;wcdbbdHP)G5reg};|(tT?xJX%X4oCoQa%<2ajzzIMElwKjuR zPF85*r-58eXH1a)XnpJZpCxks<>ZYdikucVRB3v0Q=+}Jp_HZB(97Jq-jcW;H6z?WY(BLnJiWpzvu4!3zTFz$Dj7x7OBOn{m0N2-(-*G> z-Fc0dZ%XlUK(REX?lq*;yBXW3WmoA|TsoiSW>GW{0%-~%D9VMW7SEhIm9k=;MIZHk zPP=V}7m5%ogjWqlP%I3SM5eH2o$skeIrmrMrkPF_;?jPE7m@=#YegVPD!!7jO`nLZ zQ=xnAQP%@Ls6Z(6ki&W9K=A1WFY;=ys zPap);cTkp9?VX@q_bXsL=)&=_OdvO?lSn)|vD~{$*}=P^=S#i!(t0|IY83+(`c~G>n`g7jK!du0ZOxvad$5i`~ho29p@&ebMYoUCXSO`ED9@l={B&)-#?uC6gj z1?5Jk6r<#IlaM8`d;Ja;ZQPT<5cQr&&xZUjG;Al|L2F5`aKB`B6yTj#K*D@qQ5XW9 z_?6#=-i?cH%^Ze`FN`6DB-%Ft1dHZgo)G5cz7w<+gps$|#phhVbKZB=eM!SZ9XFU$ z%G%$w#N=DL^;0rxsyEBvMo{)BqpMM2N!(KwLRbI<2p#}``F3%-tixvWL*=rL{YAwc zwjD)1wE@#lz}_)ard|C%f~5u^++JZrH@&WAouAL-VK*i)icB8kUT7gdibO3KsetV}uVT{3358o^Vvv93N>|7Bn?^u-z)O*^~Ef<}w1R?}YF9v6Zh zgdC1k+On%p8aSCKE=%g@twx)U7$1%#T6#IWC#Q>i89^Hipa$R%cOIO#tU5I1%j4@h z-mOd}K(B2FxWzncop-YO zjfv{%zuWT%R{a&S2LR*YWE5nG0vWoGju8NeKq9!`U|s+Wo&ad#!kzJPRzwWfWWo@J zqcL7VmAgda+#dr&@}Y64t||vhT&(!a9*#No#tKeK>>M zcw+IyH}cJ!w1mWIrfBk56MzX5ZtM@gU2-IJxy zD(~`Cj&y>f@#{NXlGUAb0(vAQ0W3}$Y>oJJB{)f+IZu9KDX`ZZ(78L2 z(p(ppK`(x?_KMGLe{db{DPK}fJxLRmC`CEllYod2iW8iNO5Ghnjd69M$g`Ch zFtInmt+fy4EDU2PrGv1{0P%Y-M>u*Jf|)_8bk}IrYAp29jvpdDd#*@&7oqHH7mL}j zqMuGjG7A-(xJBpnq=f`Q=P_IFCI?61A{N&}F+sx&l93p`<F$6Xh4dH_0OCKfsQ0`aiVPNzNTnz=`PB|ElyFFD8x@g*4HpXZhWjw3HsR-q zM!)(3{12myOQPDGpl^Xp)Cw+=E_h)8jVO%xU+|nEV;DiuUcL@Z`3^yko=E91>V}O^ zN)&-hb~)cM%3x)Eq(&Xrkd&Pm@WhH5=Kx7h_plw#`CZlA~1&0Sny#bt`i3j zrWAgp(E4UeRQHQQA7>k@u_ld=7=Zgo6<0B9_U0<)o_Yu?#YD4Sx9wX;LfgAL5P5kL z+}LD0IHyYuD8J@Y=u;q)RGdj=@@!43s~tpZ6c14g$s@Y>%2l+Pnkqhz{LNtqpO$RT zRogbZjU<>t^^TU~PJ&qay@CNW<#s^_fk*6GYTstgjCsaYWMf+$ZGKJHk=zw|PFk@& z#q|B@MvP2g@-hyjlh_P_LQgcHdKDu&d+9~4#M0X8p(s|^v8eOBD*;sHYK zNgU8Uul{mkK>u7v|AreE{PR{QoDpF{Y8}_XC2C0fF@CenXnoKNb67t$BOix1?pb~h zJ53C+&u2wGhqsp>X#`Xzf7|kta$XM~--^F9tNgn%{2n}eu`8Q{1_KFWgjv>W@*riT5Rnq6c_zA8?StclQmd0J%SL8y!U99~8v+dEjqQy-t z(OuHX6BJMnyI`+i)|bAymuiN_lFAsoN?iKMh~#rRp}dGTv_kF z1Cm2YC_Ygu=}&4;gi3~5q|lBIawfXqt~Cw`@gRCQzz3|L*9CV~Nmd>SRLBr6*?L&{ zH!fC2cFg+__U53vhtOyZ>LpWh8Du|mIBrdRvei~zZx?!=W=yp)(C=nkk@bjxZyrt7 z;btErjTz{|K1%=52#@dZE!NfuzYlj!4QCprv7(np=jIdGkMI@n*x>fuvhphjMzB8; z*{%CFA^CJQ8=6W+TAPPrym@K4iHn`#NBHT*^dE<4G)EFihW{vv-WLz;{6!sYqeV6x zghE7SzWPb`HU_#L8^rIai67T25Z9^~*X|wHnHksJ8P_WiM@{S4auPfAXhvmfKm3Tj zDs4XA8Q*sgKerA)_Xsb(0571HuN0fLVka(n*cE1i(F*E78GwF3b>EB}#fEWT4guHboA`%NVs$n%YLK@XV zfG|j-7-}{Q1y4Vjz$cj~E19G#nQSBZ!&5RPaSF9y3ax$$y|X_Yx$(>WToqMr5kLd8$G2P6GKe|p=SC}i>`EQTc}+Y)S(ONGznEC&R9K2@t90` zAEPhU%5dw-@R!F@eaiSIm>MLQ8Lpoh>600ql^NTW8NZR4_>>7D&WhT|NE2l6l+Or7 zNkwzd%H7DyMM)7 zMo$0ltRBJafyoqEUaX;~ta01yUcp=s;+(nPG?9YfdxG>7`OMCD_mETbuq7`Xf(8`J zRYA$0enZJWAZGiKC9kZXzhavoq@O=RoO{ZY#Vv>>)tdi1CLf4haQ2k@DoEAhlQF5E zBYT8ePYDQYL@HQ7PQXGb03cn6fq(eqdkKO$vgk8>a^ZZlIb*;fOzECJU}!T0?=+=n zGPhR{45SQ!nV9_$Or^+%uvZr~!*Vk=3iz2RT8P>9ZHw17z`FqCAT><*5X@i`FeqDI zZYux3E=-E-;$M@T@UG}I)kS?K=-~Yn#%c`E_uS7NS@ekZ9$iJHD5>=@w2?ieq)TK! zF_aK244_&8n_xQdJ6KaF$6BJq*Qdl6mAo`7i%TdM?T{C7leM%xGzWXfP_$zq+Xk#Oe_h)09G+D${t(iJi$UBq%wsP1*nEn5nG*t1!nY>x{pLQ zp)`B{NHp%DHdBJXYfw(@p}tF!j)jPeCN-TTY&e-kz!3eUHpo&5;d@|(8Cm#rrGT|&? zvXe5*sRQoUS5(#8kdj3C)Hvj1-4j>l9U=ku^4wVf3h+g822H>P5VIQMIINZXeJQDi z87*cH3`Q2;Ly3Z+EUGmf1|umgyelw(AV`Q)PJW*WnimV;Xz%mhyQ;fq0W=ZJW~l@g zVgg-2ubf?J_9#idAjcFvi57%KG4x!MPKssjliy_>YK8B<<<|ual`&+$J*0M%rl!Km zMhK?)0_c6%MOX|`#R?^t5~K1G31JF_l?jlq<^#M!s(5Qe%ZE8NyP!f&QI5KLQnT96 zr-=iYv%OI}h+mMLggT;x(0>35@JTUjOC!RUK}xV%T^EoH4AfkRA}EHSL<#TQ0t&iB zQVd29hk#_?Dab~&VTEG+7qFXQA?H&$@CpNZh)x*~&QU;OU2f271WD{^8_6JmiZKj> z5mv^rq$voq zl}7mrR#-y6Kpg^#BTX)VRl>l{5KPAS+JQ?Xs0%{WE4)@AW;g&o27qX2g2LGtC~?Uz zV$vU!EsxEN6~2Ie0YFaW?D`4=Uzxl=rQ@BAy|$OYcg<6&5aaz16X6uzu@O^42GQUV zK^KB7(b%B}!!)@ZS5!k+7PGXd9dI}w`#%7rKwH1`ycYi%oWty!P+FjJn+%0&vB%1r z1v(E$KnH3-1#LhDnot9%&;(_m4(JeN=4`$Kumg#}1P{yvo&W<}Rs&1`p(sk81-iK& zyrBhZ40mt`;V{zE%*sblpqg+6D=Y-M|1in>un$Zi#et&&0Q>@FkO)0+t>YS|<|z;) ztTaf|4VojN(;T%hUhZ&e}o1TJ7$I0Mi#b7kk;5`D($6iGQFz^SQKm(|N1x=u( zSiseVZ4Gpw0|KxFZNdb=kOO3(3AARN0$>cV5XukP3lbQ@mP5BJ2@B{T0Ou?KSil7O z&;~xx3_?H#(trxMtjm7@1A&kTwDt!%pbN@yxlf6r0ssuXK)jG(3wWEsE#18NAPt&J z)y#0Pbims+B~gKp1h8-fTX4Ia{~!-nU<7UO2S>1jk2%-qEfr(BqdaQVbQ})8AOPO* z4n>N}y9vU|5Cmkv58Esa2g?bkKm?-31BpNiD!>F=AOp=L1eAQvWHgah6gUB4u3!dor41rE&#`%1|g7GQ+o`Xhpy?p z4^kWm*ed{pFa~WvEQb&X z)Nl)Cur{tx4}ky%nKGlM8LzIe#x04Wh(JftLTkGU4|LEr0s#zkV7{J!2e&{Df6zgh z0%b092x_e5T%PPm5uMX1ox)w6*EtKtfCp;22N(MYW6%yGEu7>4shva2sw^y8nvnA_ z5HtCxy?_nTq7O4-L~;D;0${3pum^B3@Af|Lgs{@+NzCGap530~=7}SfLM&Rld=;w< zR=S*s`LjFv!P#n;Io|5HKqJ{|o)|U`s?1YWsShA34iBlH>#OV{&k=C^<*zBNP-+aD z+O+M^w011d9C}1P|68$5S%Ky{lMQK?nWXB{dE*~yp5c%TyrAJsD*zhav>E2}6nLVr zAPW>4lUkdt6bh3$&!HBInkFBnQ@Wc|T7grV!@@TIS|M~7GU$Njh z5Ea`Ej`XGy&$~bSlK1WEIeMC=OAwBP%6h-v&H3|q>g5?)_<5T4icb-SZ?>y>3#U*- zvv8BC5R+@($r_r0Hi@FJkb$Zx5U>#WS}(3#zoL4K_^6-y!@2mZFA?mT^{RObq(I!K z!1)Ps_%+I#kYD>Sc?z>1`aOP{2U4f1U;M^j_^qG(4pH*=>6*Jw3KQt|3BsC?zq05P zku@3or8)Vh|8Vuk|NY=!o60}_3i0~Q-QrS!KXc=W~y6Y1;mYe7c4ANsZ_=6#TOM` z!i5bVMx0o&Vy}%IKZYDx@?^@DdtJtyxz{ZLDMe#1aB?7cGef}ek z|2YQdWVBI7AB8lbD}%#x#f-ZAlB3~Nv?w_f(d>oBNJk~LR8u9i^2!sl6rjxyg{$r$ zSHp}h)-YRDZo3XKtIoqye+4#JVJVvwxJor8k+@ke4RTqCQq`_k>TDghT5GSxmd93m zys=U%kp&4%B)^^L$Xsh|^`IcLWw%{--Q{-34vH{V{B!PnV*{{=YU+TJ3# z;I~LY7-54KX1HO8ABH$$i6^F*U{XB6IAe`H;pCR?1O_=|k!v$9M{6z7BxRLXwnQ{i zi-kF6nP;ZCW}9!uIcJ@B=DBB|fBt#ojN+{kM@rZIRTGXmS(+24J<-JFNT=Pm|7xqR z#yV@Qx8}NQufGO6Y_Z2CyKJ-1Mtkf$g?`n-RgV)^6Q?;*TJEP?p1L@G_U5~9zyAh2 zaKQ&Byl}%0M?7)G7iYY2#~+70^2Cetmu*RlJvMHqHA&cRPw;*;M_K4-qYctcFa31Y zQ)eA@*H?eNb=YT@z4q8|ryY0ObLV|`-*pGR_uzjQzIft~A3k~GmH!>}Ka{aFS<4wh zulhT$*KlozqECo>?h*Q)A?>$s$a|115x^2v0>R=BSS)cG^hiAk0Rs*+(BS_3@z=k9 z{{P=!0R1OG01nWA1wjEG!KkDAb=EBi^vRO0b-@~r41328{9WJD7N>7ym|hz9`xvyF|q1}8{x zLvFUzr7wkPOl3M#n$}dB-o%D_O6ZV}Aq0gz6#xno0#t(t)u#$EDo=xo)TJJTs6)+) zC2UEGL4K4JGCb*=s*?y36w{_(1#4JkibG_QRjg-4YX`j9p`AX2Tt-6?+~V_)@YQu8 zcHIbGyY~_JrHpQL^J_2}RUJ#%(5z`itXMs;SjHaKnjYYQ|5u|KS+7Pmv6ro>H)B<~ z62dHVBtjaby0bCTMh#NSQHCYDidoj$R09~mz-#U2SZZ>>10j&?GjDrL+lD}z_ycZm z`G-v$HrBYUou+2_rPH<|Bvq3-7H6#j9PbEHs@KJ?B|7RT)N+-j##}6TX^UL)Hj@J| z5P}YPzylo^7MmJS0}sBdTMfXV4VERN5yqea`YxdjWFUhX04(4!kl_XMmFE5K2U`Zi zHh;v0EM?W2+4@qexeM_utK2#qQAMOop>-~ZZG$0BsG)QxMzIQ9BP0L{6Nv({@~(jl2HYJ!0k=z|BDCwVn6_Dh_N#{5CRoc*~%n% z0SsP{Wbrn3nN#LL2&jMsGM9M^R3Kswcg#!}7xTe1Rc?ANjA6`axFHvk)}3Xg5D<5% zI@0Y5hBRRY6BoJ-g;wz_AJyVwlJNybplp^S%h)b^IlO9KY#F!UL&$#j(qvt1jmb;d z$VM5*WK;t`=ZH-0SvLu?X2rd2To&P31%=gGwUk=CKQ_q26;hj zB}?l2ec1yq@Bj>GKm!>}TiP(FEVB^|UJa0742M<&9mrr1( zSqQu5ljr@wXWjNuM)lgQZUxE5KKA(!zYYTL|Hug145c&ip--HK6+a5Kh4pl;`LTr8 zUZD-K25zYTr#~3~aK;*-!5=1FMk8RL$1&zFWHF!uCfEm@*0x94p_6PS>6CQtze$~NW>VXnj5=61?72!Q~uKn1RI{R#po zYlI`~TO8Y#4p*=;2d+Se5C%KBY_71t=j>e2x(!FHa+aU7QzPo2$VB zt!(=HpK&B`KwHJ&3Wt258{ViUDZ{&<#y}GSG2~j40e>WbfeP|R0xGM3^eHvlYsj$fB}~~paB7B;tziy1Rjvj+h==#21_`C5#(=#CFlUM zYPD?|5`l+5SON={Jtm@4gV?ek0pI~MV1g?+g6vZ!{!zIbYO_X*yL6d5Ss|LYDGm`c zh#Ogs3=zEQ&=u+k73@H~?WhhBlor(bvwfkA$BVoZQ!z*Z4n_kn47h?DR09T}g5|@3 zKNtf%fVCwE1TqMMLmPv$BZEI^0vn`*F@UmflD#9dgiYH5I-rC9`-AYqgPYk02RnGGJJv9qctW-0|w|p9Xf<8YXdN#0tWCemt!p$8-qkp0Z>dP4QK;(AO-#- zhb)Xfo;yW@bS63EGz~BU|6toWWGXcU3!pbsvk(FUPAEv)Vnx@30VDVUAyCO6I072* zDq14}LV&V|j4Uu{0~lxmFnED7$VTQHvWGM#4Zs33Ffu$a0{o$ZHW0r!tH2GsKuXDy z=tzhgNs+zlyQ-v)Xu%NZ&<-DAju~u~6U>eiyv6*Gp2%>UeKX3GaEo1-zsLL1lgG0>3LL1z_yZvb z06MS)*kXb<07|sFKNq{dfe<(X|E3epBfzn4!>t=5BM&&UEx>}N%edO>%#*V%jvK%Hd9h)Wy9zv# zr}UPyw7{Z4t?S5+z5~JS*h*YslJHy-5xj=(;1}ztyJkGN7eu(pYm|VyJTrEQ)03A>| zV_SkI*nv<4z*$qdb^L=D-~jI<0WjDCiDV`b4b9?&ffH;>gos7=urpfpkL9wDX%UoM zBt~S+kAJHU|6z=kKsgj<>=kr#3>REWaO(^iY_W)=OY0;Bn_~h(s6rW~f&uh^EL2c$ zG)z-8gS${Yk+ZEb(u6GtfdbotEhy9)P=Q3qy-AQ%991kFg)af10~OGLKi~((^weYW zF&>Duaw{thI5IGJKlVXQWYT~is8lS-)k>98-9u6~Yc|;u*4Wa%>Z^f2XoDxigH20S zpi2|)Y_1C&7jL1isWcaZpd7;6krj!KYW2Hq&A`G#EfVoNR?$GOa7Ow(H2Y+fhx@{I z^i^1OQdnJr)vK}{LOpoZfDmxf5HNxlFg<=PCJuN3A+Oh{}dfWS5>nzI?QHGrr63!O^hv9C0HX6f+J8#lReoLy(zWYF`3gQ>trmCbSZDb zR%o5G43jH{kjin{5imiTEfE#!DjIFo(rr-=beRk~g+?`qK^C(-YdpE)!ka1pmZ<- ze682w*tCi;uANSpqFIA*w+i$g9m$@YrLz!Q7fT5eZ;g%|kxJ;fyT~0l^$4G>NY^@D zS4DG_YN!U4LNJ;8wD7Vm@WM1TW7$s&J4`Ds)n(bT{Vf8Ft-IAe5>VO6T3GPoT^jIJ z|JH0-N|W7FbJ>^jrezQSb=cB{2psZIhvDFg&0X529hD*L+p!wnZED%a618j6pWv$6 z>=j>KdjW4)UW#Z30Z8BVRp0hy-}iOj_=Vs3mEZcMU-mVKbFGRUkzUB_TvEA%6S&^- zC17hBI&FGgFDu{$ma!L*1VA`nh!}(ko?u2`ghsI74A$Tc=HL$Y;13324aVRL-h)c; z67~QZno(N+jX@?!;TMMCnmLGfKm>AQ;2Xx_93EarqlXBNh<5{;v+`l zBv#@jHi%E)2Y8?cYABg0rs68L;w#o00U!gW<>D?*gS)`uFc#x6CgUlaN<2aV%Ii}+}w&Od-<2=^mJ?7&+_G3B*IeuY=Ig^Hju!ciM*6k6R9P71Rc7T@Ugb2t zhC~3{2BYO#w&h#K7qAs^AUMm}hd~jC zX{P3C7KbSo0BhD}YNn2S*ye8r=WrJ1Y7hWtkOY312W(K@thl>$MX`mOB<*+<=cNm1eNG602512oQiA?xgD_}@R_KOa=!k~s|A~I+iXP}= zv*?3%Xn)pdiOy(!&ghNqXn>|@jQ;0}KIw~Ah>{-Zf)43?_UMK7XKZM^f7u6EXip$1 z77Wx9ojnuEag0IsZzvcs&fKjq=Y5!m#whA{PP9m=24%HddzV_?C z?wb4nk_+PpDIJ4x05TUAle;^PWf=~jevF~^3Kul$bsZJZy%QX9<;~{o&i3rj2JO%m z?a?Of49vi}INyxi*6#Y<0*VGOu^fH<z)-Kn@$rZiR!bF|#wlr!U99q1r}d)3 za_9*vJTL=MsYQ1?4oXjT{kYsPWh;X?koW+&V2j%pz^!pIO zMFEM&Gc-f{;#ZH7I-!pHuJv-?QW)o(TlfP+U`|}o*68wSFlQ4VCp=snOY5i_6*Lg+ zI6)PB&sIs0YH)@|P=~{#2Iv|0Tcp5MU-HV1MhkzE|1&Z6GB@{%7n;LEEoeY zzygms6UNpM$3|lS()GxwoA5+=45BAuxzkfs4gSw{vXg(pWds_r#B1 z9QR!8J7UCcTrZAZSbO%c27b8tW~c^ipoVnFGiD445@T|O^Y%N9`&y*?(HEKaw8^Fh zgF|Qojel*ZRNTvvcgC$eA2AVrN0C3f$`wq;|1|}Bny&`QmxOA##cQC3l*f0o-28@j zc!pz?A1D3ix0j}F&qUDGA8UP{UU=9ibCaj8Y}M=}Ar5fO5b*yy5kdG2Sr4*bYf$DF zEioF+o(fLr{BA#L=(qp-&y5w?2RaA@5dnyC0tX7bCg2)E0SXr~B&aW8!*L4r2~;?c zA;yXtC04{JprbQM{N@SR_mQK%i77p@Z0S;fCNpi?sG(`IO`1QqUh?ee^C!@tLWdG9 zYV;`5q)L}EZR+$X)TmOYF6GCMpu=$n5gJ_S(IG;wR9!k#NOCMoPBLqUXH)iU`!?>}x_9&LjZFZy;KGCN!-lnF%i#j3NgVF{ zIrQk#hYM^Sa^Jk^+P6zrs5UbA$tAgyFK_-l`slsavv2SIePwb2LI)mQ8aZmgr|I+W z@85rQt}PVYe+3#im_oAIG@AgpjCLS|5lT2Ah4R67A%+=hxZzLo`F9^|41vZKi6xqN zB8n-RxC}pKjWf?R)TlTkjVCI@k0oTZq=p%Pz)~ZSK?*q}ktuR`B$7!giJM9LIQgWL zqLFqGVDqsArIUTV2HaiWfd^TS{|;KXB$;KJc_x~Bc}SmqRGRiug>mv1AY;H`Bj+PiA(z`Ij4P$t&VuuAh@KA&nm26{pN&4lf4txAD z$eclJ(6#klqYTO!%Eri3P39KFYA2vg1iVjW}sSqs+E^LEo(q z##7U^v9~z^K04`ukIWNd0z7{5jpRTcSkk>nIi)f`3q7CE*Ysl0*cic#oyMf<-Dl0E z8-IMrUS|b%O9TO}jM-}I135)Pi_?oZ6v28j_9w?ZcI29~#F*#o!n9VO3tEai`|Zzb zFKGBC^e;i@zyem$u^ zhY#dUO<;VH8!%6mfTF)GO5WxB19rB8Dw76r9`U8Y;U!b4%Dy}h zN>-d8LmcR&|02;cMJy@{Ip#qP8P$?VH?o8oDkV%cq#+GF62Omosmx_E^F*tBX1Q8f z!P3BzUru9MGiiCtl4J)P*#uH!f;miK3cw6-AZfvz_94q|eYfC<)O?Sp=FV z&ko2Znove*`1~h8`Qy%k2J4OWiKD(!bB%wE1!e}U8pm8n(1}vCDAJ75E31i|Cs9eG zaxr7@_Q}tRlC-2jF{qS44Z4#DbqXxB{E|4DK8D_J}G&omLj#QM?$Gi(nq|()=O|%y4`N0ds=LL%5Zm0Eun_n zyV!D;Dea=|)uu>R#7Vcjw?S^j4*I_31*>Yq1EYth+tA4qyu`*i1Qf!5;R@euFEYpIVG) z|LAhcU$JW753|^K4gOR@Rm&?v^(&T40V#or8c_jcti?X&nt#F?W0OT#FDY)TNVWRo zCErZ3oa~BY0SQ?n$Jda_rPTVEtmT~L^TfZ!D_)MgLh#azxm!MS!(Lpt2UAHeY^95Q z=BwP1iV@9rrdOA}yk2>(lby>D5O%2HraqG>i0I3ec(6(6MX&SDjz&s|^C}od*GL)a za7H6Wq6}VAI&C=8QA>LCquh16)XID`s)-WmeR=dQVy2o~Ba;&|r@GeCTJ>1@B1(0r z5Y|cVXRB>3Y)<7F%$|Am=VD#oVKduTuNp|tY;#~XXEP~3*(LzPXucGH{Of{UMTJ%i&FW|gM({`ZoKZEVgUdoD6f zAixtIaO&#$C>HL}L=+OLo}87xU5smB->MYEWJ%#3-%CzkNtCp@mSPTfT1qTk@TYPV zWfVl(z*&;|p2~rOAeTG$d4@eW)Kv|d=fym=S;RWt zee&*#kyUlOLmb$9G4wT=q!)jlc*)#rlC{4#aB!cus{iz$(KN1qYF(3v|7@K1&A+^r zBDeW9b%#0Fg}v@Capm(4zYt!#1obY*((|_1`gSSgTeYouOJKj1S&Fc)JW(pp+8cb% z6JP70iMHAaBX+@$X8D6xx-$0tbGP4Hbw&2co&-RXU_!p@7Bb;hs;l?I?XKuUFTS{a z9#7HB&UIqHKHo`$y=n-kL(rGBe40-2Yw$x8+J8$;m_ZtdlaKt=Z;epNaaR3Yj#!}| z&#B*oCC2hiApCisdyx#{O<(UY9#;iM|A~_s1QQt)QwZWgGMS!)1x5*>AnF_rE>xfc z@?6MK(@-cCIZU83gdN+A9G1A;@4(c>ebDPoRr$4A1@+$;grFHD{~;NKAQ_B-0Gxv3 z7=+GkRFte>6<*2BP2qlIVGL>;N~s`>#h*_(pZvYw!_|lC2$94gT?=N{?Qoz^@LxHF zAdlQ(9pXW_upk%}P4lsi*)5>s{LJ}%p{+ezL5SZ_U_~$N1Vv1b*p(enIFIiEnol^y z8V=Fgh{GlFUrg|b9S)!XPDUzBSx-=+GH3drM{|05V0-$8L*@*ULJfnDG= z-uSf)bhY6~*k8$I&_ccAOFUio!6Q{s&{9Z=LTr~k*4y5ZAT4K_fOwc_~ zZvDjLjTC0o58KpZMKYT$M&ld89!JR?%)thReWXuWmPR^VIwBl{4MxzYd8T^4FqRgeM(E1}58Owq9<^j6oANVG=GO9!Oy%_M&~>Cq6RO znw1Q!)I&TdLp=0?JY?vGcBqE-LOswX5^dJbc%lGa8Sw}n9Fk~+eq4~rrc2xjIbZ{J z^g=wygFGlhIP7RV{Ah;C!#ubsb;22n@`!=4|EOqmi3JYj5JyB@nX)08;?S8k zX;;OjK0cUe%mXlVD2V2$hhFKBikL#0m6e!;C)LX01&l(lWrrN;w_GYH7+wp3V8@^us>qV;tA44wrc6fe z&JFgS`(48_>;tB$gE)-s6haQ;1l?=pTyMstSplrjTF}6n%-;pgYqf3dSk}&(P|gmb zMoytm22DmnPTDNa3UX@0E~?kA|B}Y;)agMLhHfdAa;Un}Dzg$-?quu9;2b}+E-=Du zBaj0+2rCCYSMVi`?mUlny3$^eMm5b+(9V>y5-n7fkkDC9wwloHWK1&NigjO zm4vmvmbWUexAspECI;{lW#={$X?Cp0>0HN}>xUj{$ZBalq%O;1Z~j~m>_Shy$}ErZ zL;mdIPwK1E+RxE=;||K6{|N3|4K3Tb*7Rm8_G)k9>Yp=$knT!v{xofio(AiRQ0DMn zfVox~E+6KFujg(i4RS1$)Pw25YRG~t$XcN>9>grUtp-`=Yh6RV3P3(6LvY{@2`TTh zYS7E&A1>667Lvp8(p<}4|Ik!XaN}6-LFA6x>YwG{oa^9@;33ZIPU>)Z5A5U|<;V`( z=B~Utjr)}!2t!kWl!i*Oi3z_d8>4H7_QH_PUGPzBS57ZfgRknt2#v!OC(YO( zB=%}u6Vnd?8!_QVDo6s|-VROB-7XgE4_{R=7H@H`UXCLpF3Tbg_XZdtk7OCI(ry|K zl?H~5nk$Z;E0&_L$&y1UyJOQ#kX3f7mC$hgb(64qujZ0b=KUt;{t1c>U{R@#0dJ5~ zolw8XD`skj^T}$^$jd!2c`iT5R)3b=X>@@ z6JPEuI*%tu*+Y2Go>nw|fo+BEnP6Z8bNF#P!oz%ALk=s2I0R^Mjzxj)vl%F8Q!^+k z@M7d#o~<$z$Ne%+v)CyACH{$ORBX#!+)A_17e5K!HDz@SA|jN63c8J%a@E8#qO~D@ zE~|RcqE3}mT-94zTR+P+Ezt8TRJsw7GR= zTl*TBxu#@0|Dak2CbD=Wk|El)Z8rLCb!Q0nSXA4Fk#_M39K1C)!mKE37aw5TM(3<2 zYaY<>cNX*a+f_ki}r?_`)H)fRc@oi_SKQY*DS<%(vvx5t?_W!9g1t7zQW zcfxVEw5jK64t8wQjDPPOe$P>MBjZ?W+<_~cc`tZSX_kbOBpNkQ%|PXY(;I#&IBd^Z zeQ$WXjV}bzV7TsuTTYBj^ok1jrp0^8i40>lZ?fj^Gb?`^@{K1o8KdUz&M~%Y|o7s65ZvD@7SJ; zTW3#ZMz{?xrldvW&`C7Jqt|JqOS;%lRvQMlimTg9K+B<{IbF(V3Ra#3QjR;iBQz7@ zsY_m|F5cu>-$D>MRH*jM9N4F$TAcr^zc`L|!Y~?Q^5tw$%LQns|qT@t-FThGlHl5K4KqY8;S2A~8AAG7!yE6kF+lU>&GtTbjAVRb} z=HO5G;KCFa-OMi(xeGjjXZCHP{GBB@f2Gs~CA1JfqxaO#>)uYzw%6-8&hT~8KB%6P z_e9l@nXL=`nfY8c#}773vmGmYymIg^GT&)Z_=n?Bx^w-HCH#{uHcONZMre`{t%Tic z68At?!q<&T3_8ghXA^b$6S@7Py|*u3H5R#~&!@JA(O26Wev2VKUXh&9_c|F`6$ znPMekW9fKEiT25F{*t8xbT1ZtLi(|t_vO#GyNo{R|5${d+tu^Ldh>SdYuSxcs078h zUfTsxAzESQ{^V0WikoQYCoA!5S%(vxw-tDZFMsj#hi4PgV4gd8%$oGeK9K*Z-6=(} z2F35=dGObIk8i(uCA{a0=iJ-9Q`9F=aAj^E(xiAg`m>l?uYZ)fyOfa{KwJ|zkYGWB z*8~g{pie+UhYuk(bS7Y5M2ieIKLP60{fx+||D#B+A4itd zI+ko%vuDw!RlAmLTemIu#g#jEAJL>3=N5&!*C|V80wz{W%TeStwtzskZ3oh=+x8#b zgaQE<9-R2_hPRR9M($fV^W}m5_%0s2mtc&6O?Ne1c%%T6wZVrMKc0Mf@wd>YSKq6b zfL`d^yKfkuKKov{)aTc~Up@Zs?c>YnFRHA<>a5ca`|1z#7;MnN2O*5GCaVPC$HEKw z*@r^wF2b-by7n1I#1Tm(Q6GIkSALYXbp*=3cPN1=hp`4HL9I+c`CWzwn9p}3B%R!VF`n^Gx= zzzxdOF;Z>UT~$>vw^$f|g~?YCdCgbfefgDI0a25qV|!pWXwYD*X5UChVa+8f~6L(xsqk} zPe7SPv>;)V0+;4}9__T#h$qd;z=$j!defpyM#v&xuUYq9cVA6Kw3C|t@UwXz^7Ytb zH5KhLuwzbJ?X_w963c{zwG^Yb_oQZ7dHQsAoV{PWT8b>^Uo>>gsd*f+>ByrZ4R{`>83YFgdHtrlC$sxc{X%mW+P0GreP zCq8-ct}a%)TB^n%fK!NOUiT7LsO&>D&Nym!@57xkaA7oT#ixAfGvNtQxRRL#On6fx zoA01RjXp6ef%_X)UQ!0NM$uv)&Jcv*7{b816h(w0^wedf#=xp^L=8=Jq7zjGi=v>- zcD}=mdz3*$&@51h{^Jx=1Y)+PlrV*5G~*dNh_WdfWndN=3JedD5IKUeDSab|u&_~) zH$LoJ`Z(T}uJXK!@ev{y3R(BcG(FYe0%UEx|I{GCM~=;eija@Ylx3<_w#`(_k!SSe zCsRnQIo zJky*-Orj+%XND&}aa97Cg&fxz%b=LkQSZ!?K67})>QIxQ1y!3hGnG4mnDUlSaT1f1 z@i&Drsg!$6(TS=tv5cs3g%!z=b=1VZc&b4F+c6AD)8x-}3Z*YBAg8}pO)dbf#i{$*h*(3|I)!Ng0U}wk=tmgG{G)2{1R1Uh~O|)N-_6c z&zP1hmRx2UR)f7w52tu zVj=6o#v0_It)=K&hxI~~U;kFlo2HMTK%%4*i*B6r0$ z^eaZR#E%1$1+dx)t&V7XVg z7A91=Y#_;EkSwGA_oa7KZXpIJ$zq9vU=CWrZlEY?Px$ky0_Fb_Olax;)JGH zE#0eRL+or{Tpt?R-R`rrS;{a}LobsvBb!F7ITwtQW<>~Y_JX|~?>0wxM43*>h+d~U zFzWP*86igertONcT?xjqW%00ti}m7y(cD77pk2aB_-o_4FN zT8_&ZW)_g?R}^2)m=*NrfBegUH582#;9(}YE;`sj{2ni z9(mFRz0oMi`mhrCIl1q%nCjMt%{yH7ov#`4k~jTW0U!7-cX=)uI;$2nc*MFIjv8oz z`q|-qdfm&^ZJ{fY+*aZykY5Ajb3Nxd4c?_Ifid8mIch%SVGY~fx+8-1h=_NeeS@an zmc-I}4PQ@j#aH&x!N&DrO0RwOqY1+f38ipO%F6vZX);g{Ef9_frEUtnFjqEE2CHrKR&4>l@CZ~~aXi8h64}iIeIl@q%nzsT5=Buq*5}KZP@_0;C(LfJR&W$u zkxtmI^02TfQjsS(M$cOD6?HK(@URVO4aS5GHRx~`iIErAC$)g^Ui5C*im@3XqY6z> z)AlgZ|G3Q=t??}&EW#!%ZeB+az405tQRG-;*``nDwh%Q)V&SfF9jnd1ip1B@0&NNq zv&!)&R&meFkRA2$EHDH^Xu}Xi@Aj&39|;mI4nY78At4n~Arqk?9r7U|G9o2%A}LZL zuP`FAFd!Wd_j0iyJ<=ygAtXg|BuTO)P4XmBG9^oLwkV<&pUXxzav(o)Cd;CEVuR2m zQ6MjnCV8?Zit8O+BNByh?{p+Udh#gkP?%5h{O4J4|!$(lIsX zGAu75M!<(6j&t>-EJZqnA37yPLd7A146_c=&=8{|g_9-~6PD=jIVmDk942Vqj+`u} z7x>|Zx(qZpBrsf3C$v)kATv9Aax$Y)?ue#3f})?YNQ0y#G|GmU2(M9`Gq$9J?j#AX zBw|b2Gbf&sFXdAzw=?1hhEdqVJ^BeiiK(y3r8LQuEa7x z4m1p>7Yc`DK%+mOR398g9NMEwG47qh>j0l_2)D8;hqNbGvqV}`Dr!?V@l8n!$59-| zJx1qfjOH4M2_cG)bb7%`l>tlf3N!SyQ${C2H>pInOOtrH!{|b6ANh!eRKD{VJ zE8=Jllp^RTiv|yqwrEc!;xfOq*+>FWk&-xz(>kDsF6gxLjs|{Y?jf3KV024tbTdH< zq%3|6)%PdXE-P+R#jF(syM^uBHohvKovW8^%|k^5w$8Q|B}fe-VZ18 zvO4E5ETXbm*-=qFQ&ik10#kx8gA_i8ky{JWTm8k6uI(mjEd@(%C(*Sa1u+J(&{KUv z%@Tww4|QJkQC%GaAk%CT(a&EAQVoZO4W&_BYeFZ_)nL~VU>ieVD=Io9!T_Gz0jWZhyqe=}EK7Hbz# zYuzv_rKb;_7HluES7lH^z0@qvBsIPkZS7EO-6CjzqR8G>Cgt`L|I5@wtP&y8^f8*w zH1$jo_x2U*b>;5WMSj!zg7a`=_GsCwGV|$Zg+^AfZbrr?uWGhp8}u+C7Z7EZa=R~n ze#WJaR-8IDEyx5B;Wl(*mhx0KxAw{SFisiT)jkiDGp+&jn(|YHQC?v;Y&BNm;;KD{ z=z=;gS~+iuf+As-f$^9&5zlsb&ro(Vmr-#yq2#EJ3{URvMCMF4?3|$z7?vhJH$JWR zdg)ejBPnH8hE9_cd>1O*1R{DTrD|~m{rYu%(Xf5XX+IA%WfGz;Ru#aELVNOU8TjE{ zvDIb$mk|@U?T+Mi2uFOz+a(%@+;pc!o(^_=rL_#<)(1B?m&t!9$1xJ@VvzMig zZ%gM3#q@`PslsrWE#V%viH~rH&)0Hu=;+4nrLF;s8^KoXaT1}@i`ln$WnzzHD~id1 zat5Rke%Eb<)Q!CmjB!Gbe9}^mxFy3FCgO56@|ce?PzS$+2ago^7DERMhtSl)XC2ef zu1_o!Sqh8vOo?w}P4p%_QLs#SlfM{_nG*k0kcmy10Vh}%CBts>6()1FJNmbkMevpH za$*}(Sqs&0ak&N6_FfD5B}gtupfH$QFojRCz6wYq|8Ll&;#QfnPnUs~Y_qkA#FUyv zuzl5nYq2$NtCyR#&yOv$m|dcE^G^ZEc?7+AEjrgJt+tKZnE@HuOVU9f(xLX4Bpn36 zpE>Z%)OaUq4+KlOp4ZQuS9UD7cn*^pp&9U<)dJX-v139NqV2gz{}z(hHj#M(S4nxB zF*^I6SV9+?J>gZs#(AXuPN6$Glx+gEs24R^+VqAQGUl;uKX9HMw5CrlYH4O_Q(31! zTG$G8ntj^mnAtM*_Y<`>sk85<9|N2#+N4$*s;N$@e~m4oOaCq!t4+_PHL>ZQ`I6su z&ng70B~P&yOEBA_O9xsf)H!cKSFO`ds|B})|IL~i?K<+rI+n3{l|8zz84j=UlA(i? zuL=9ES&wEY(`MXS0;M;x%WJXy&afAQs`olYExYRenr3;ps1Lcb`%a>q-BWO6efZ$< zj-7Nev2EMN#I|j7V%wfLnb@{%+ty4naWYYF-u>^^-fvZ3o{O$?ak~2ap6BzO3!b0c zbY)|!kcpjFQ!QQsXE!oHAr)Z0t=b+X|KIUi>%%nyq=So zPa9iGkKy}_3BQpK4x8frs4jzzvsC%WJjvlJh1AxVKGJZ&V29#F1{vw^8>E(BYVDm zMcq`?>0{3?v#1QST|S{5+mj#oV*@!BZT$T^-ScNxP+@#d5FVogcqu_Y7j_WmK|Vus zhxjEMqYQq-%zk#-YbF=}mUgE5b`tGlwgu)IW90QGL~|KJRa!}2R*-f|(brhcV>M#% z{B-sG?0ZH7bq7B^+97a3UlGR;zbPgCRS=glQwd#4hW-@f?ZV^ytgcCFl5R>_?!=uQ zm6l$M;?h#rN4JR|vm(+)Px|&$Pv>kd1H0ewM#qlhbZf%H=88bEo^7EE|9Ao9%! z>`dfiK22lX+Wc>Xtkq8C}&7r6OGZjZ+l z!+%J&>%ZlPvVJh&6TRLVyk;0)tZe@^4}K!qJMR#B=>gSC;4>x&y-pccXA)68={?#8 zyloj)uXp;9>Nb|WL$vgLeyu3=2SFm>e)Uia2g4BYczt164tk@|>5{uB_p>BjQ2D&Y z$K?XQ#!Mm0Ri9Z(gynN|I^94Q6KM2l?6#ZTQEX+ix%@t_?{Mtp^M&H>@qE$jG?H=H zF{@wiUGtZMR2X`?X@yUh|6hXEY>JdT;wwR0f;&Tr$kS-1nXYMU^EE(Tx7*|U_WH5a zQnc@f#pdvUpt;|jqIMWKaonO+Z)SsuUHYn(AYDYbY##@E?<;$+3sLAQ?1+O zkHqJp-O`M}mW!xPPa%W*30hT}bM62s^XOX{+l z+pej1A6aG+%yj*gpnWCD*tU<15+~Kf>LpLn6J(q)OBos|PmgR{h{Upf+qN=`PN+FI z%P{bV!%l6US=TfHH;OWePY#-}$aYAkut>C5{+SWS?ND))?R`B#r36OHK^i2%tBw(D z`xIqW6z$C(4+x0=l@LgFIg~^02Cr@vUrGO8f;JC|+;=MN`*B(qoKvye5C2J)*{k6CXkHRS zC`J!ZmTE<^r&Y^gd>2t&Z!&I1Sa|Z3L)V!=^l}HfcN$IJL1&C(Z-a8BV&CUecD&$) z5*dI4x{M4kh_2&p+9oFbXm2)sDeF9vqEA;?V3~*8(2N;?$ZB{BtyB8FWC!P}hoo-$ zPAhJZ?!rFxRh?M#QSj7xiubP^dgCN=Rz_NjcNgQFB#{7mV^2Ici#ErvKf1Hu73CkL zm_Rrco@`9j#~K<)y6)>H0mD`0zibfL7mN~SJhtFy7;HA(lfTjvgPXrScD;$H`o~q% zbFw>a|H{9t`?qlv=SpJgdmX9Xzt#06j#e*Bu}{Ta1RY6Vd7Tlx;d?Hb((Ga%<>l9c z?hh<~F?1@T+7_{1HfmP$I#4myTC6qw&10HQCG-FBn{P)C>#Uo|kpA3kQI2aF8#lrC zp+=Oj<2YYiu|$oa2A6rbU${GNHbpe^`e zm6suMZ&=gG35_^8toOTJ7_;Xxhr9bW8l`8Kzt}f&nCE>DqSrX&Lq|NX& zqhzO2kz((?iHKd{rYCM}f}Um9C>?R8&7!CE`m>K&=qjeIu1A8g%w(W(&M{=E7b&!j zi`o0&F!!WceKwAZsRp7HL~ zEF@O4Qv{&(Pjk}>L)I|k=O?IP#Bk)O*4WF^nS78lPh7bylst3|@56*nGl z;!b2PmwS-Yd{d`ZvhYrGm2t0a`L zOGUW`9~Q1CX`a?BnsU=y~&w_PXBf>rv;oMDTup<@_Q1jXt7m8^$4}H z^HEyze-wfe1eID+Bs&nir2C3NoJw>Z?bOk^3>b(DYYZ)#2(C9vNW@oacY6{F~sI^ia8b23H-G6RGMI^0!jcc$9v_WA-{M+xNGoz^-$P-jbGSnH3*63JvW zY}*@8rkDocztbnqSEzzJ5uinq99yKMs8$)wbaH&3t~VW%qz{}R@rU|%Q5)V;{ClrI z1R(;;u_U;6CE_@T# z@3%Iaf@ZYeJbwLh|9cOF%WvF$6eXo;aGaKrsn5RfNGNm<+PFPAcz?^ibgUbAtmxXl*-q9s<0jaE|*mC!;8w5Sr#V zu`g&n-Ga$GFwF~&QF2^Zle^tS4l0sb7{?1%cubfDbvZ^j#*YL*oG9!9LkzxN6wAR+ zJCqY8K1y?z6Nq!65%aaCTmry{bz2rTvWkL1Q472!O<`epg28|gpb3m*6rfFXFv3Mg zAeWYlo)KKv6N_iX&XYVVFHYA<%e99S4+kK2pOY%bz=7(AF#4q~jCzta?hMB~Gg41GG=~E7RwL zqRzFz84e19b&8}yLJ}ZhdAn8#K`h5LXzJ@uL3DCs07Y2Z<&o~#kj>tO1KXg2kDKj04K(-fig%P@5oc|-0el!*i zCI`LUd&5WR>CnNx7`w^_C z$|!!ZBGP)KsD6m^V7dioSdiA>_3L8;$R1-(A~+(`Jr*p*cd_Jwf%;|0cGBhAqI*d1(ib!4Hw3nA|iN@t7O8IeV172 zt_w}NoIHr-3>1VL#x+WWA}lASL?eNw)EEo|#0x_~KptpnMHVQNN`b$6InV><3s}b+ z5}ehfi0NZDQ>@tI{m|v`sVj>}vEXp(VsFS3jwb>1oQ!AxF2b2AP%tzo037}Cf);Yo zVA%VjXw(pb)1*@Fl48U`c7?o0Mwp!C0|lWhcj@iNF|E;T8P2HUE+^WEgx#mze3Y=Z zMy#jZh&M3qdLg1~>tjvGgJg>8ut5itC7f;2n8%So=goUna%0xoMA$?cmp{p1PRzMl z8d8ej|At6_A}|<&k&?$ZNAAVrpc((yC8}#zgy!@?mOGN?W}VXNYVOLi;vRNP3g z8$iBg+;Kkk%((*io(NM)RnsPti~ zmb-8@ycWDMh15s@NQAH)p>coYP-L~&?Mh`3Zvw|47t4kd3@JyHB0ZJvUdizIf0G zA^nHFFEe%i&r^G!ug`q|-S?wkdp&TclX{wD1H*6>Q!m0TiG(x1DKsinYyxTa$sy!b`rMvse=>DJzSRD^hmI7kh4A1#^G!=zR zAIHxZ5kMG+0t87Ct+&Y+P@P8@*k>-}_YP$hH<}8eTo4}dk9&awVbNGKHj=X3R4>4B z9!OTi>>zLAaQ5*U)FQ&|a+oDVJOqxrn8(hg&9{n$ z2+VPTd9y_0K+_SJ+ay-{g>Y?P7I7d&BtMk!Rd`|@S{hKe`-CC!6|=ZfjbS|FklPN7 zcoA`$8J5T5)-1eV1TAtu3}6BlA)xfOQAR6hsXH4PFo3SrWu+6Z^`Krx{7xKag!s|BJw%dt6Y@0}6j# zW*OhQy6kZZ`V|H5uWg7bZEZP@>b#kmKt54`MVCWU%feSBQb& zRa8oV7i_;k!TOK-GzM6M2U0>GpfJ}u5;ds-qZ0V{P(Yv{a2J6b1H58Ec(%+r2)6I< zK4=D1HAWA}E|fk7zlA1NKsE;(4uO+*!V+rjhx`c_2+OYpPEQ~7NMW>t`;!zv+bk&_ zNH^`|3?76~@C3DF#0Ef3W3H{z*Zx-0%&9lPH3ij+Al>}4WLC^4=FAVRVECPPR!O04#C?G$wLg8 zQxB=@0>ya5~hB%FwA7Tml*B(+4Eu`iai0N!!T6BC{PIF(7sjAAdjEOBiBu9-18}Ys=_r+hK!z_7B-I0Q0s0qJnh#~#&^m%PI5fE! z(hzv~BtUVpKMTUxqMR*k8q5C2Vdh#QW9&*WI5QE{m~?R|#UfYoMMsf3m}MYV8n_b- zc)eZD3)F4_p^qoR;;k7b7Y&sT!E_M9BM$B-C1830m{@OzH0CCgMcH2vD9`05ewn{4 zjAZD7w18bA8SNrcSp+F!LL+GcQD_5YY@_0Vux^AjeQOPaD!&@&30{v<3GHS+QRIP( zF%XGr5RTA)L$N!L959J+Q15Cm>7eR?@T=ANGAK|1#ED7@Q=WJlmFpEtT?Wk5aIVrw z$E^g~mD-wjngme-mnrQZ!w@hcQa!UOMUu*bDbt#T5nhsWd`c~-pNt%|tEg;jOv0^@ z!7L`Eft>eMJ@9q`s}<=o)!8=bKuMd4%F0Stp+T<2IAj*4m^!K z2kB_Wjd(1Lv{j8oxQ&dz`6|$xIFn?)4bbC(M4G@!nz-K@`RTZqsY-;pP|;bN(O8<% zRZy2bo0lw`Wo4TM-kOoWHMKmWvdW@z^0nX;Hi0X(C~dVYHKG{dweqc_8sn9rH-s2v zqgv^FJ`f$Fy+JwRp$0Ic>GMm^6#Tpaxc8k7M+Cc5j}KYS=OaRY6PxQ^=$HKp~}+szV+;b@OlsVdXIH`PknmNvwJVQdjD+oUcdF;;Pshj zH@QCcESkW5L94G_eX0~xm0dkN4N|5fok@6RFWG(IPJ(a0`v8a-pep4AU0N7^^&Hp! z4LtJY=LV!dsH9?=(!YUXlO)|Rit7>mu`L51YDj%CgM90K|DGaWVg@^oCDhq*A%i#( z2DB*UfKkMLx5Yycw=hjNFlA1#QOrb7PvVMqF!jR2ii2>9=pMzy!``B>>3|U^;~`Oc zU{D})p2&yi@{epbI9`S}{ zft;T7sMdeD1nEaz^v2rJ2c=sEg$gx9!KSbVc(M{l`6HO~swX>!C#6R^T={_A{1^k> zmEiq8up!KV-8(l+z6*Yp4=H-ttx1|a$DAjSY<&>U>gEY!iYnlYSdBD4kbJfy&U6&-k6X#p8^!JP_-q7Q6yUBJ;_2+dpwwOSzDSx^U?zuK1mvpownJPK$3 z&0Q7sLK2gqM+efk1qp=O$+pw^;M2l6)A=BaVdk_*xg!n5PDYFnUTZvq%o6B}x)f^O zhuF|+PuJ_r+jqpbqI}h=e!FB{zoM55ZNt1wyruqId5%s1Bjh(QQn%d($<20W)h@SP z0Rdyt7*1#B>$1g#-yG&OsOq^u*a!(7J zABGUpG6mA=3kV)!77GJvd3(T)`P6UsJa-p5#qY9b_Y7(Jlz`waZg+uYTEuz#N^fgY zfL!~M&unK~Hf3F)VW$OYE|GzX1c*U64+cWo*EmI5?Z*=h+Sc#cb6wm=?gdU@YKP1p z5PlvI6CRQZ9+Ddzk~3Pz?z1U0?8IHI>o{aiOIzk5G__Y?j(2qPRc_|yB@6-)(c${WEd(2OkaP!3pu} zp8MRu774?l8{T3D++ye7;`ZI*@7)rDZi$KRNQLgm4euxe?x^$cX#d`RV}fS{-7yp0 zvx0=~*$wYG1Ma!=?|J*~`SW@YMb@CI+j3XnIMVFNFb z{_Z2GIX>LolH^gSBxJsJr;nHWA92RxZ2JXz#F+4Vg+)IB-vJvoD(TnwMx z0-jy-pFQfH-5ekNLC=9iFTp}Dp@uKv0WXpHFVTH3v3oD^pqKanl(ZYTH{l=PNq^|# zZ!l&b-bGLzh>`DgF*8uWQX1iBLfJs5(X0zfbMpw~Xoe{431!oF}Y z_`i|LP=!1|c-#xi|7EjT$$v=-lIwI~=r_=pvcO+Z$uR*ULRXhZ~7W01O5hS9ZoC@>ENX$1PNx4ks zA?NjaeTi}m6SDAh8Zkt<<;Bbf0zP;E&D39;`OvN2IGT({yUqV$v%9X1c2mAdY2d#) z{v8d+6GIlLr9G{_%M@^<2H=?=ib++mT(Pt`bjMtD_~H04dfuJPZ7()1P=a$8!z|3(N+KV7=*wWP5Afk|gjvZjd6PAf0U(48@mj zKL}>8BB6Lo5l)16KUI;p*`Y8b@&%$H<%H*giyE23M02W|>Em zWt+GMit#P`rgLl~M=ln%lgIOGyU-Z4pLp(zoqN&iKuQu==FJPKl4kJ3|F)|fhu?}O z=Vnhc4=N?lm?&s}HA&_!EX3f4%2UGau(zmd8WP+~L^3kmiXn@+)eTpOtHCqVRl8^q83F9DDBT22%wk|8t5a2@fSsEu@p`R|A&@zv0tjz0nZJI6pjoDZ* z2(C7IRVksiVslo~w!78-f!J<;i)5omb$?v7V?NXWE8|Cgm@K3JmH8K&9ZYhjh zJEZ4jUKl~CQ*=Quro)?@D49|2jPllYntLyU3F7k<%j(?lvV`xns_XM;HwUNUNT)Vr zipgr~W!+cyNyP^tmO&K|d*FosP8m`>|5~SFh*n-rX8)HilyzlUT)qn@LVgzevfLC>y?2A}6n=GI3AHC4n_9uC$W( z!$+6driqt)1bd2)kt7MI@FW4O+A~lkS$?Q4ZvwQrC)A!;Lv+gW7Ci%kd_&Sh;ZoPtI{G}1Y|G&yp2rQQl^`TB^aQIal-vY}}E@apc9Hm&zx zzsh*ThW}(lPpOhtRkvpBF20|rBe;~rP94*pDFllux)y!|@X|GQgc72=A=#IU;fV50 z{#1zfswlyJ<6#PHtuG*Y+~K&7NG1W<2TJwbB>- z{CiE@MtF4^Ew#jXi~6=)fi8TdMihcFi$6-8T5yRzA!k+SgsQadiNibB*8F-`-a zU|ng<+ua4-|EphksZ{6RA;vpJ>&B2>QYE;=Y}hS%-+P3?Ec5!d2aswHy1FXT1cytd z3}(*9mcLv{f2CcMxo*JZTvmTa*bgeg=4x*l7m+vFPvu{&&M(>Y#M`DHMVrSpb8nES zC5eZdY8(;CixcAmWz5Hnw@=8$TgAc1#KqJ)<|FK~sJi16mXZGB`P`8TOPa>bwRwqq zv~#rILmz|OQmR;F)xgN-JB@ljlx7yL%e?5u{Ud3kVoh10Ua@UK_gB@@$s%(5xaBPQ zMhyCgMe|pj=$Pb|PJz>!=IOhs)z3~D=4c1oVmj6XW>uYK&kMF%8=vnSD3;~JmxJ>U%V>ddJ1ts%>pbYXAB<0sY-!Zl!JKWa_sQ_qDcf zw(_YzXU2|z1&Du`6vpV~vFkC|UbNA9Xt%K~q9;a!Mk5CQjPNDXKFHFqS@*yTwRKp- zKHuB3z5Y`pW=t^s#6qGm_FR&MtvV?or0n?!A)zf?Nc?ZIVOkea>s|JQl}Kh+Cec~T zzZp}lKVHaPb~S6u<&d5RrQi>+P1=`8_x?5P`R(`#`ISL{7>Aku4DZ=}h(03z zUWVzzRAurwrfMn~^Ymxn`Dl&c-}}fioLCted%IE1KWHBIVOz+1(wyk{1l4ibFXX>h zAq=||2lHfl70{d&2?6+f-oBMZP6=kfv&`LB{&np~tVSuVs?;QF?w)6HQRVv=#Ei5o z47-gDUX74OhLP@?w#YVsjo8&g%@>96Ya}My%cT7we~w2m$#3 z^us`%m`L;URFq3fYIv=Gd79Z{svhU|idyi6PrpcCgCf8>5ns?mV5 zvj`~Ls~kRPfN{E?lAVoMjs;~q72`*0^pEza@g3(}ncRjJlUOI6dRXz{sA3}75yfJZc*2QeWb9Z6evNFKlv7N_aHo#k{1#U%#>f$F zmGJ!~8w;zqEyI6qZDeRMzWg)vwNg^)uIIg^2h$z}B%{eb6oQ4zAV=ww6 zAi-Z`-z=6Q+&!B$vEn1$)+8P0o$MW3Mu8?S4JnX{*lu+ov$r&so7$6|DOtuW%Te5Z z97M!GiWH-IB5WP#O!9iu#9dQ< z)f20c(#sn|NI%63r{e0(VmjQq=hWIqr}6yMC}WF9$MBhIEgj7i zCQeU;3O`PbZehz8Y&Ys5%x2S#>HjPwA%|CO?l0sUK8x)-Am^(hrC(C3KTb`DS(+U? zn$5?a0tVN?r;?_cqAU5#+@W)9#P&b1S3mygjvktYO`5wpp6ISud`85Wdhd3Vnf_Gk zyoZcFY)05&S3(q@Uw@y2rI&A1>;7Gw9`R1X7^`IaYrLnPg?W$#_%7?;IH*wwQ@B0& z?YEM$Dr-D`KZ+SSc#kllow9B* z%?K`?jq%2j6>6%)NZf*?OW$opM=GKSTIL@&Xr)BQhn44{q$dR2Sx7l#x3|;b)#q^3 zXW&kfiPhCckA-t>m%I7l=76G(y4fP;D(!{KEY{t!=FJ@l@q!DKs$^A_PD=sZup@4h zESVh6Q_0FUlhICG8YFZ&0yO#G)zn&;C)gBZZ<}0)zfZhMrw|uP`*CL+3?YR^f51l* z#;9OYXrNauMtLc(UMy0)jhJV_?5mWUy-Va0k2B;_NAhaMJxC;_Qsc0VdOWIl?Tnah zf6rOZwclamMbB}Fh5tGVR%B7}*Heh{(!kdvd))^bgQp=oOGmlaf$ZOgL&NYheitIG zXar!?JM3s~!>vW3Y0myr0CNhb`WfN$vAW8$#{K{w3tSQVrOD1O?G{I!!JvIGxsk5k znDeNSSrTddsCCDxk*kZZlB4C~G+YY+E-d4@gm#9F%!d;IHB4K25qsrNq`DD{HPM&i z8FcQzHw^x0uLQADR?&yPW~4#^-Ga4qp>){ErH$BQMyj-ZB&f}sbMqc`b11Zv{lrrK zjBw>do>qoy;cq1f=q63qj8fEl#_6`JkCto8zDKi;`%$+GYnF(NpApyF@I;vTVQAP#K;dx z2N(`JY)1%Zz@$D?s=*;+Q#@NVPDsx}0!E!#v3^^5W{kFUaP6@*AhlTDeS(=rjwnNiSSY;sxCEUj{{uxu-suWu*F6pQC&TiFh zZf%urcb0bw>-=kh`_+pYHZi+Y&bqF-v)DJ`s{jCJfegL#m5Zycg`UaqO!|Mxa+7fBP zt#7uXSJelhaef%_r3EYYgF}Cr!Nic}^`_cpGri}hP2UvJAXM{%MiP$dHf$h}&cjsm z%$eACH@~ZpcCR#XlYptCzr6FB@56j`7}UotK(+kK`QsAaqw`LyWYGAQ=at|5nL{G; ztcv8!aZ`mgD3zTI=%q9|nIWu^xS;@V)3Uu8gqTPQtAskL^n_ci(>)#WK30fJEqgL6X=&gIsPs@BNc$tt_KH{p36~KeKJ=H>nmoPt$i%3 zTAsoTj|O7(Lm(Rg&;p?*1qbl;<7#>bK(X}d*e@r18+_Btd(Eh9E05e+1vmW|{u>FV%1h&frPhg*-;_NME1lE1-o~!?vlz7o z;h)x!GoG^z$sBeBt)#qG%Kp`jTehz7UzWmyn_K64_)|L(lf1~I6h6ARO>3pr1qu-L zYq1^l@6@1@yU{7GK?9J?X~ zY%$djagAiMbv}|IvNO2H_|g_vMuENxN+C1?jbsgb9UdlO-t+?6wzGJ6M~P>OEK0b6 zyN7=7u1RfGCD4Ns%p=P&jAbM;9+$;b^8?xRaQvzp*5Q4GdCp2Uty+c~Lfb?s@*m9$ zIqm#M$mAJF=t@Or!(==yi~v>9Jvgzs5-p-9k4sf`x_#4(*#WZz?!LK`TFZgaBWp)0 z1tNGh0ysrQ8_PL3h~dWIpuf+MOZAwZhL<-)e#?pie>>4`5w_P?^PXiYpRM zAEmREf0)rk3UpCtb4{8rNB!hdea)HzH@=Eav|RUVmHJ%)g*ui3(FIQ9dB5J>Y)9X^ z1}S~9l5fIvYG1JKlbWAcFSshjlV~Dy0c~U2`pZ(M-=Kh`M>=5JkRjI z_zQQQ@Cgim10PWLXS+`{R35kVhup*oqdd9e0^Lh}eSH1u%j@U#;W1gku;1z!-+JId zBt^+&t8eTyX!$U(VBj!l^j0^-qG0Kx<<{r(g*af14;0l_x1^)7xLoj&Qi@rf_Q8WI zRT}o&-0`%UUu^ar#dIdC~4zUS9I=jg+#v|JZB{oq8%6yY*dUUY_|Dxxi*&GkTl8UobIpGwf~RJ{*84Y2=)g34H=)i z@BlOz{k7R(r)9L?5mLwDhwEM$Sm}&HB=^UwVL!&KHyWx+GEm$9m=N@_#d$pLy{=Gd zXa9fL?B1RgtF>sI2ox;fHuq%S8YFkvq?{31!ElHLzW%1$aFY<11D8UxxyF(0#RwlX zUael||FGEt?_05K{7=*@mT)3-^{QNgBA?7KI}l0l^%r$)+BDkh=VLYNqnO z7&>16vDuM(dIXi0Nf9K`+@w*i2UPuf>uRU?7Ma%K%29+SW>Ekn9Jfs(>iBySNdkEC zLt%c(FFR9ts5j8YZp@{AOE;i56xtkt--&;7rc#z8al4 z7>0o=(0wh5BGAJUxs<{RTc2m%xB4Qrm>ry+rZ7bfo|n2X41TjfLXUQ{B-kyv$t2(> zTtPgqHJVw8p8@4EWstdbnWd$h!A3!eSG0G2DK~}nZvJYqC3SVfB(JT*{YFQ5QASbu zoRQouRT>~pP5rW@9nBVq1Fp|CU-od~O>b5P-JUL0J<5qE(`?hl(6%%CknOc^!a>j> zhLMWTGxb3W_^GPzuH3PsUOZt15&n3peK2V2;Dud+k=M@G^OSDa{KJQN5RPs-%@Z`Z z<Us9A%#yW#I<+$MeXuWI$I&-AvD^CM^KiYO4A#vgcOxdSRY+@k7AzSzotH z>MHj*6z!Z3$_&lAJX}->d7frD&c1ZC7}xpTc!llJ+<};~iL#|#>OevOjPN$+9!Gmf z>&^Gh)eLU|NYa0<8=w2Zy#ST^;Kr;?Mf9}}aDPh^osiV0_vFr_nL%raqdiE5@<9xh z3cr%0f}_JVJ|HbK(@58>*610#ZIYP_{W}SeD-|sjm}G)QLW-7BK1{*55DBd;WAXA$ zw3mL^%bGh|T<$vxAtrsK!8@rhGj=`Jpi`htk#W8FI`CGY-kd6x82gA?YPUTx)_i$i z7%g)YN(a^OQC165Rwa%HtufKR;z;EBdoES4Y{J3;8S?E(^U1)qdU!WEWfi%A)y~QH z`1fD>l9@xC>5eh7LmKw16_e_tkVygm$cdo(M?q+Vv5Nkk=@i-(Q~EZ;8m+hFxI`0J z%CD#vRAwshKfc&(wBa;==VDy43NhHMJKs-JO3t*4>E3=9riaTT_8l#G5n{INQ?paf ze~U9cK(-u&qi><);)Sk@DQQ1mDfCx=WZ=!J#8iVrves$O1O9>V;o#N(9x7(F~IrC`p~kj?TAMwb1F6YD=OQrw=6+e@^GCJpLdV`SsQt z-WctBV zQKgOrM_A*)L9!u(rSBMx<$tJHw|q=W3r45C*~5`!LQgL`k0CLyEaBvBU8Vrmp;9X1 z)>vAiYtAR71u=-BzYdXp{#_GmG?}9r7QxI+u}b#|j?=Viq*|nr6FHeuBlAx)stcaV zYM66FK*}EkmuStvKh&=9AHFzH4q zso`j>Ds*)Blf-(Y4%)Bxr*U!GI~$8r<-IO$cWsM)F{ZpzrIy{c0hnwDHYNliaQOWe z4t@uS7Q7_g7u8DSPv)B1%2q@)Dl*VSg%k77PR#jT(Gi$zM+$S8LmZUJj2f_035>Um zoYA&aUkZk}knO>`s8l8wS!YSSDkJLxjCfK1yHw(wlv*8&XioHTX}tFBt@xCZxiHpD zI&{^(WprANQDzxcnVB0_?rDcnB_;QzwwbJdgKuiEVou|f<(258@7ZVB5Icm}IMQ6p z!gmIh)UxjrCdvBgGl5VH*1PN2T=U1KSu6AkLK&`$d8=`e?ylC3t5bI7TP}m|e@+ye zHn~neWPdhUTBh8sFM!Nc7ZSqF1mQH!N3!!)uD-LjEit4hwS`Z*ud>t}RE-cltL;3s zMy0ML&uiH%{_=P1Tcck|NA5m|kwtJY@jK;fvW|;$cWxsTATj6b zK5C;wbPQ&=>I!_?gbT5Z4LiO~gD6#a$uW*^lcI^%rJ5PN)*!Ay<#KE4K07Ev*0^Q0 zL?7#B+Dr9h;6S#@XZr|5r=y)i@n#hNUDBT`T3_QBMd&Bqb3u^LTz%5!m?M}rBpqQ_ z+*AAX)bDb7tKc=2*z;Ih=XVm(&bNDC``mNi^Vk2(M+CX|=*mWOsU)^*dmJ`A0 zf&r~zJo2-rAg>3lA^$1p9{f)Oncl>y!qW+xqhq~LHY27_xAR|@HJ$w2AF^0ILkPQB zvRym=E3K_H`Y3N{_nKU!d!}D+->q(qKmO=Mu#b7xIc)re+Wf2Vv2|SU!)>^F(<cEuCG)L!dh9-Q}`(0Zusd6chDM#qbHJs)|=p|Cg;pStgydwD{M^T{1u@# zu0ky|r&)AcHq@`jh6K;~{8?D6tk(UG>D-?EEJF0skc8bjYc&#v!XKlIOWM#7)9 z+CMT8h@1_oOC_Gx%uQ6Az;9oQmb`9fl4`@<#s!Bthg_YuAd@f?1b zT;`EN>ZaH-Xnf{JjINepPlIVeq2an$gzR@ceFn_*!XxZbQXzPqoQ};L4ibY@QV;Ze z8S|}pax?>nIfO7e@ZtqiozB;MMAU5C18&8Y(PGs1TP8 zcqp{0$RfrulJ#GgT@;tQEM!e5;7UJGfY(;s4duUt#EwsvcfnCO)lgo<#1p;#z1V3*I+J|NfhIEkeR(>axd<0Un)8Z4?X6I;+dEG!9;KQW*$ zkS`>cLf&7>Jo&v*5;Buta;1B-L9{4u_6b+2X<}yEZmwT#U{YiPWIfgAEj4&A7EL;t z_%N>329SSKfqV1*b4^p@gY4)vu*=(?3)?krcxuz=%@8 z#n(c7!m-~h4Phv@N6g(9I7VR2f=e443?g?{!7!M_7_J#MrYO6zUlTJMQy-o5Br$N? zUDFiAw{TIHnZ|HT#$|XtA+L>92tPB7JDYYw_VgOFjW>T&F7*+m@_kk7sS!d+a-mP+TqA26E2)QTg^o!a zU{NmhVF`_jDI9J(6ngS^+|1Cy)JBCg`ZC?QQe4J~;2WH{@)d##k6AlOhQ|ik|7!0n zgW~G9F5finjXS~J13?3g6Wl@w7Ccx87M!GUcMa||?(Xic!Gc=|!L-<(070Xup(|%-!b_bPQr*_fM)YsRhdYjg|ZnP1E3wv>j z%t9SVGi3)Iq=U>~ha;k9I9!;^+B8T$9GVX^Pfoq}Q&rq65@I|Ittl2(*-xuU z^3d6Jz8zH7VR8GA?M8bra!_nuZwZk~p?;K2`mmo!o%WUunu|}EMXjO)%Wq96-ZV)& zF=TsG`i<;FZEMIvUQKq$x?XG}SE{7)_Rk*~IwAUC8gTgOl! zEL(LJTD70Zc4cmxJN@9)v*|g9BO4Rsf=qX&%>viAZ(nEjsdDsl*)$#UHE+jm#~0 zHL^x{LIuR=mrG_^T;mSkmTQvdKg*?BTi|5EvurvlN8Bs@TEP&5aKgvSrd;(?+2(zY z$gIo_Z{`~U5;bR%5U%ZUwtd@;61|pt4&a^!PqbhiZ z<-?E7uU6P3bJJ|6XlC>s$1(+;j` zBD2cn27SCyD|98^3FK0wFT4uEXLg1>@E?NA*nd z&Xo?%RKzwGM82~4^H8Xf4QHAIEKg}|!&5VN*-$~OKMqKH_wW{vQQVF@i_baf9rEmh z!?}`}CXv`4C_V(8^Q>Ug|BzV{=TgM3ESsxAm8jj7sb!Dfqu-agoZu^8wI{Nzy^k=5 zmB?PWew>mjBT1{h-+AJb7pmEltIqh%Goi^RCLJk8G0#P@#)ny6b#g(~$ftU+dm&t| z>`)`%wNJUiCn>5XVT<%q%?j6(8_EQIE`K?zTo?LSyJSQ5d*)o8|LvAj-A{)LN&ib? zv&)_~n-_U5bM7uoI5H&U=P%QUlt0!fb4MtC@8c&h@0WGr{8=Y{QwJd9SN~NbH7Jv> zXGL;Dq`5MIEvjK_7tFedgc~o5m2739`e_$dry^8gRP|0C|MZ)m0DrLKlEBvC47tX0 z`kkpa2PFbyuu4__k6OJ*($Oy8Jj)E&4v0l^&AAJv!uVFfy^gF5)P=^=zcY4@(gR zR&@6Fs&@`@gFzG6hISXk2@P`f9iPmJ8J>BaPZ?c*BpES&FlUqG-6Or>_*tKw@j4e%>^0l!Z!LONa56Yr@%; z)$@;Dw&B*>0f(l?CWWs3jxT<02~Iq2e!3AXvud;@Zcr*4CWRG}X*UHvS*p-+{ouRp zft9`k;{|jEFr`Q~#Elajy0*=b1h-<*)mVi5NCr?!(Txd3PBsA;dZM!huq&Gyy+0TY z6YlgP)XGcT0# z1##TE7v{pBS+_>-sUJPHQq-Cgy*Sj;?&5{qRm|&k8k^JDNs;_B)1Qrf`7Q%tc6sM5 zoEa`Wm+g?{r4+FtS9z>2uz(y))RHs0(ahx82y0eB@}$*@&F>VxwQnkz42!o7$e2aS z+4h)=5%vl8j5KldxY&aTzRsa<&fKT3m=`EjLNDA$qP^IVcD+yOb*%{2HTxlx+}Kwf zEL_g6+kpMh5aB78;HiuxR}<<>F=8e%?|kQ|~VvNpoV?^?*zydb!Z5xayUNDhj#~b$)nooqdqgF>LMS zTqg6*Ikh*z7xWcqGZ0+-EbU#2dH#+vbf(22_idXwX50WtSn!RkC1%SsQ40X-*TL;R z+!)-Jh12C6(6!%OT0(z5&=z!j->KDh8Vb7!Vw?OSVg+$E^oA7%i;e1g@Ys4y+YXIA zM0ot_8&|qZlkm}#_X$#N$Lc;vaPpk(gta<9zMHyZ(LoWJ^RIjZThh8O&uaa45x4>5 zn0i+__3PSvvK{ou@?qs#uvE6FRjk0@ZTswH(5;xJ&g1;Vef<}KtzbNT+>;&&)AjHq zQ~9Ugfp&L8%a`f*{qt&`+S2WNO4vQ4GV0G^D~&}w$)DTQKEtbP>HBr%_Favjc5PVl zk6;bp7D|kN+fn1)&tHkJem$Iozx{P{vNn2u^yB@HXJ5S1#oobGcK7=?*v~GczYKjc zwXfk3&i7uD&-~fxkz^zB3)Rh@=d-H8Nd{e#MrZPWT0sgdeN(tV}^DXgD)a_=>S_{2}_O@?p z-%l65ZcX~IQuDAeu(q#b+U<`{^1{^i%0{l`3oRcag&MU|G6auVr|l0mTP%{=(2m4r zz1>GpTu$knT``eEAei`Ns*Clkh+&~lI#&jy$i1MU|M<&Ne%zNqr0 zY7p`5!B7JE<4b$(Ae{O0pJ}g~CMq(J@hS=@+&}&L{s)__ZofKQneoGrz5SPaDuZ*d z0Bpv`=i%n8Hd2i6)Wq+AQ~%?Oh;z))=T+K0g{eTYKiKT|ia&Yo0eM(2g61^s!74Om zAq?FvT2;MxuQ+%+bFQV?crj=Fxj3(@_;~3&!DAIw$QDmy8iQ0Hlwu|Nbg_6^uss5B zyAvIDG=>?!<}1;lXTg+eXw1xPyUJ`v&%kSYws35Ax3W#=vo*aERzQK%8Ha)Kn6f;* zv|VTq&tci@M2t6VRDz9{(BZ|=dIYNI&$zbPDQP@ImPw-NW9K1+M2^EDE`sv88E!4} zGL0+hjL5+sQItPsG+vGK3h%UNRrILL%V5sXDQz*UJ}H*ZF907PKZN<-$gswV{ zR>`!@FPZ%u)t)pGY(Iwk^sd;ng=5PX^fnWaBUty~@Aqhp8TX&mN>y?$u1;sCYe_ii zI+r)M>AhrM5-iAgz2MrHZaegSv_UuRS+RfRoN7 zN3g@u+E8~p(s%2Ig>TI?EEUq(j-k$pts0{j_14~_$j*am=uQ2e&1|LBHa)*tvd78W zd|5N<5Od>q1#VLmKB{_$(b?u>i|+L^pcxJeO5$y=>6OU%RLzvGGjG zr*&FPUi%`g%u8T)xHq26RHW^nZvZ3gLuQ>9w9<>#zMXWF?4@!(zYAKN{FW`?2?w$- z-o8Rd?n*8HIvYn`8(*qQ_Ntp6w_Ptzvv?(T#3-(0 zhl3Cu|8T)hMQz@~!+lr6SbMVuU!Z=RIjskveE&F~%-nEyk6ZBT0F*nv6H` zb;u?w?Hz!Yh5i@op7ny)_o67dVl;aP`J3l7wU_TD1#>w3ceXarRb;>zbUYrjzKN?P zCfJKPF+n(~nCnP9tqpS%A1v`!fJ$@VyZM+9kS1-OR7zLcTRR@Xdqcb&p-gnTYW*mi zoM9uO;wRbI@RP$gU)n6&*i>ah&1N;e?U+S!RaA>Z@7GB!5CxB|V;T3^i_$dm`loY=LF za^6x}=c-oh#P`5aQ)784eFd)ojhOm;{s+QSV)1DfJ0J*l~MYMg`@1-fNtefAac zl0Wa&@GIRVYj#mU%iUC>XT^zatU;6qCMW{stm1ZYXo4ycn^+fLr?Pfbg0ZwF_#f)j zp5eI2V6PTR@#@jURy&w#ndP?gk!#)@XeL=4Gcvz*;|T~$DBv?;F+5mMI~8WgCRode zNb*pZYDg%0*1U;razABezZ+a^Zltyz%SQPU=M%e3ZYrNvYPKX(VhOcJvA*euhVOcU zZzhH5>uz##J>En%*^Ioqp45d<-E$|s`eG&_$M)x*SD7~0rM;^)Y9T>t-kBSHvgB^D zO&R%_eg?&c#cUd7Y^W5!^DSL!fSguTbReLR^?nL1JB2KMb;e6dG`C@5F{~ZJ03K-? zF~_%1Md{jWu`>8rxAa=05+9og3Xl_x8R;SV3i-Lfa)91K)+DkaJAJ#A>l{c0Zt1pXWOq60t!i~vo50JJ9n zG8&~qRd%;O8UdTZP*qNEFo<3;U7OS6gxt{q0!ztuTLeF|T_0<% zeIIC%WP`5`x%8hwx#jt!z_#OTZ93Z?A_Ep# zdu$s-JY2u64H`5?fFo*bzi0ZqB0!MJ@_!;32GblZ6Jlmh3Poo@aEPm&v(!32uQLKo z9P{aujnjC~U-4_JY@qSrNVF^!ZTMkT6lBTEF)*ylB8&vQ@h7!}n!G0Ptdk8SK{h53 zUbM5?3T3J3&r*Q;rfh}t3=Dk(bTy}F1ml-8Z%2t;ALN1i9$9u`WT=DRgvv4%@5DvX z4)4UP%M}w#>>#o3ChA%i??KWV>`@G(79(4045%ozin~}3opnn zJPZZLp@G5yUl?YUicG56Af@DMPkc(yx{-r0L7*7^EBXjDnlSLF*j2GgEyk2m`A~-f z?sHV^@C5!baimh!Mh4rTwplH7kZ1Gg07YJHm2eQx2%1bdpli%uLllWoYpMR!GK5`r z#5nJRJmgq1h6Wuy7*u$G5s)oAh%prbuIM7*;2d01j7nLHkYDaO2?M4W5U{1#O`22QD`iFU(^YdG zV<#A(HXAoKM*mzU09+LDgy7FEj)@c`fYCgtzVuya&UKU2M`Vn_ia>R0rqR13iwrG; z4oq?1_R~Y3Qi8KuT1D9qL=b|O-3;JSb^;OXU2Ag44xoWYk1^0`A@g{jL`0;%!+wKU zfhp7)t69wN=3YXu66(RoHZuO;FB`tku*`JnVmpU$U0!glNe7@}eWB!=x&(?r)w!(% zzf{y#_)W`*Aj=v~EspGeNo-i%(wgGg$HI^P`41&&8{Q*MWtBr&4^~*SZM(d9QpEIaW-}NvQTKeSk-N0HuL_n2#j5# z9;`T*OMV4afFoa$N9GDeu8P$oOSFp==S%diN_59dbQ(wID?G1Cjp4|bLB)ld)T=Tp zl~TRMk%fkqt8$0PQiFZP#g^r(3it6+qnnY%j{B=h2zHqN-m2#Umqst2|*Y#DA<#z9t zR+gWZuN#`i%kAApSJv;Z8@sS89DMl&mCi61PJvcf%L28#9 zj`l**cjLc;1+_QPqur%(#T|o0%C=BGHFa|8sE4YIwURRL_dnJ1`Z!P;Q~lBfU|#e3 zbET8hQry9jFEw$=V>?Wucf;yYH3>y<F-~pDpz><$aNry9swcQS2^Y#Hm<7}WE$NijUa}b|S zIq)+Y`GV$Gfzl6=w#5vaQeMTdd)`mwW%xSFmJPlP@YY7&=^vEU( zT{QQ#yUnixJruuBL)6-~NG5LwM1P;fM7QlQtKE(0 z|2|KdY}*r@yqoa)eUXjZeju-QKa=+R5~|jI^k(vYq4oDwRdoCDd$otJ<+GTspyW&BDKdO{ipk-$&TyB$;T6~r-u#P zPP^MdwcqDyPp|{E&ilp5-`A~AkEhX{uzj_s`<18Px09W}Zzi99KRi7FNFhKW2$C)Y z#T|l{0>Nm4U@bv#ZXqC2Uwun4X?b6TeW?Z#oGS;pt$8#+Fu~;|**QpVQ&#g0pWmK^ zp9Ve%@b3mp0e}Qp0$TiUHDK_FRUp&fnR|a4us8sK5Q$zrvE;2F9NMG!FXrB|ITF}4JquYw2z!nLx?NA^b_;~yF zpr!WbN|UpHd89l9r36=uj*B!r1Yop-5;fbX*Lbl%mA4{;t`EqGp6A6W;&4DG&8UCr z`J_~#_Feq&V7By~8ebb^;6yNWIwipCI&>9nE0mFDq3Y3Xi4H7))<3xJi^h~fZL6)G zlZ1efoe%^@;YvtGAk7|_21K>LpK`^wkOBg_i+QHdfdMoS@nqWk96z1`mTgP&z1Ord zEA@DD@3D}Xr^JmiZZ;!ih^==lEzpd+tVyn%Vi2G)#^efu)H`8PiL8jDU~lZptyp*i zR;YupRFEgzi|4zHiQLwO7Xs}53bHk1D%1i1d9r~Fz-&|XM6*8)7(egXasrt(;632t z+tseLjf(qs>8%iYh7cBBbqH$jsnmuo1fT5)n(wKt?}HS(p$kQ(7KyQOw0vSiQW;>c z+6el=o{37N4ltk9WI5@8o&QMiI#vxpMFEnrL0XAB zjAdGtK3h0Qj6gTz|9rm>(suB$If(;xNd0v+A-~K2xQNQ&*5Pwfyw+<~w_yEualT zVt>1ULdtTr86kLbyB#CXb+?o7#{O-QmO~;?re^Dbmo96uB<5DKww^-2@n+jqG{e;da0Xmye;*PnZ zM~_y&n)^6M%;kZ}6aH&7nfu@+A}`$(GjN&?e2YJ>DJI!C)De5lP4u0ZXAw=NL+=Ve61JO@bA03(Eyerhj0YY;;CW!AO>DQD? zQsXQuhO~tqrmIHQs~f_$z8GV)184MtgTYZIF}B8)v~8dm@KcmL=yqJ4s3s)~=5Qv7 zB6UivjFm&U2@DBp>LJDS?H7QWNT}-e(zau6gS{JrBaEeK&SDU%SCgasF4X|~PH`}N z&FD;sKN#6A_*us(j_*#SFw&t+M}rI5+XEcG_xvHW{eqxdm9tpgoc=@@B-o(|NZ79s z1Tcky4AHvqfe-{{K8@(=M`?iYsSJ%mcSJ)-p3f4`P9lgU<{etT(iJohd}|i-oLUm_ zuI%l)5N(W1iv~8(5&7;jG{!@_+81d!7+^yKuVAJ@8U)rD^0`@B@vd&kgDNE8nN~W>OGWNBgb+LQjW9$6 zR1^aIfCF@6EDDAY9PIO#-#51uJB^DZDTU>X+ca~4)69~7#o7gIy>EfEfl{8nvQjL0 zRIgWQrhgk_8DE;Z%@CqtBW)0oHkl?#I;R2V++(~8F3Ytf-+e>^goW_*JjQV$hY1|!(!KdV4KTPo$DoQ&_&x*8u(7UQ8e!8u<%tvLKEMfH|+YvCvs4a%h=A#F?UL zU=6mSKp`_S-Hh*nCcvFXl_`Z~eeu4L@#&#g*s597xX-MNk26FYRf>-Q-5hJSk6Rn_ zT;d1vCt8=Ooi~mM;RpBusTkHhl0uT`a{yFu=G{CCMDG(ghnuFSVBhyc93hn`WGoA2qz&@e?Q{!`Q$NiAGY!}vR+c}!0qZ=8l!G^5 zv~KlV(~|OPB;dIsoU0Nzh*7( ze#d!AQQIDO=iQj|?~6=apM7~;&l$7NmQ0O(Q^-zXq>f;IAZYx@6W7D??C7ysQDlN7^!j92uC8t|-Z26^LiP1O^<;wKrDYQ`-$ z&_N?;=RF8j7xZOAX00B?CGY|y2|+xAAkzAxoIxxbzTj)UV0o^mi{PhSi@VtG%LH|6 zafCd+_v1Jq=InFhB=zST0$l~-NyJd!3;Ls1`~K)gppW&(L8%-#dNubFRD77gxMUn^3xM9dvdsP*VoD(|Krze&~h&e<^3f5&X2|?Km6sQN) zrhq(dL#Z5tIuu9+6+nwL`Ek-IRyCzgQ$7DFg7`+gg}W_piL_fK6(@z z4I`)!p`8Upb?S-sHM;RE0@)E6zzQf!WELC%rFZFLPDk)+#9`2eAw6|R;!dN03h?|% z127~5&`jb7bwLjY6kYD1ssqq{FoFmV=tE2h6DvKA4v2v!GN2d14f@3b&D7M_kElEN zd3A{NCIYr_B3eys^*%x;ZGgyd0#**f$G1ck3V5{EAa*jm_f65>p$Oi0ZqC*OhABR@ zIatP_Nt(3S<9SK5ODXoOAm3Lc%I*ozd38EJC7U({q%%w^tI@|%aCx_T73$YW0%nYzsK5pCEB@R zu$|4W)SCfD$xL%r)Qe9*?#9|?&AKnfv-=A2mc*v4&q^YAtBB}z#|rSH$xiZjx%?_{ zU7Ve^{nctV3$!epd8ngjmJL^xsn4=0?{kPHb7(|ziE?rnJah4?Ggw-3v2(sm4(IZ; zfKbWvI7)K)J@f8@^F%~IX$WF=hWiIM5LTqK`T1X+&s7J(Mu6$O#|>!d;ho|f|@MxdVXon=_cs}iwq!o?}6 z#iVX&sca;E%f(D7{vjA8`FbUVo+Z%Kl9HB^kGq*=sV<0206Qj7@_k8zXKBGUHfdO? zj2rGSDw`{c2*bYSOf7^44m~m1^pTY8r|fI?);i z{Te2(8kV#gw$>Vsl^U*x8Xk&TKG9l!{n{5#UbRALwIZ#xVk@=c54B*5Iw{dQ8T~pr zuR4XaI>pvH<&`?shdOnNdQH)KZT)&3uX^3IdcD?qgOz%thk7`3&s4O*T))B6tHCO* z!KSsrZl%Hgp}~Qo(Mhz?MZeM2tI<8J(X+MDd!_O7LnDNu$xpN?K))%-t0{y+>Z5jP z=t@)6LsJYza~y@pph$C)S93~Q^Y1I3^wH+jR_Y9jmVMrmEG5z%hZbmBOR;{-bWTgf zXv@rIOC@IO6m2V1skNHDwJDsswiW)d1$Vo(6SJ-7fwDorZNd?b-J^hG_Zp|$CR)js zLNm@4lq#mXXAPb)l;jp~Jwa zE)di)jb?H&0+KdlEC>P{7@0JixxEWF-Lr=)ma-OvR@;R{3Ww}vqcbV@KJV@(ia;iZ zbn77Y!Bccbx^UlQBaG1CtoZdwRrjfsVO`PnYmN1hJ7B+w=og%pP~pfhQYHxCfybdB zBxP%x84#rN;Jkrj&>9DLHqBJqa3wef*&Vxy+K^=py4|q|NMNYS5M*n2WR)u9N9VyW zPaOD***M182;^Nz?o$Zl0L1nx+=$j8Y7Nf&jX~40Va^i6bj172?4W*Bbw2h6ej!nSE zrYOhZ%spXxzOQ9t>q_IxZR4w}P7@kV z6Z=e)W=xZ}PgAZR+ea8Ax=P9bAXv3*W?ZBF%ZPMvCA^X0s@;k=H|yl%$4 zUi-Yk+Pu-@yfM{+>B|Lk!v#y91*?n&n|3%8Z^8a?!GUVg>E)t};UXN1=bo|X*}mw# zw)pvR5kj@(_i`z~a4E=VDI{YltbHkBZOQOM`Dz(@i36JXM)X8F29gOpYq`O_A3YTk zo`(1L%}pG@1TY1lM)+@}GlnG-xO9ei2L2D}jAO~cOcs~wOKwRhzvb|CG-Dq$Ol3H^b8s{;|2K-Ji^s4yRUWsXLs7{*{(c|3^9-%~WY^ z__MkBu|D3~`0Gzv!ZX#jKhjw|`@4y@=0BSor7YF1-38mT<5cOcTVi6~d78M>;EnZiR6)9Q={aShgeh7p%4;h4!F-NoVj^*#4v? z{Mp>ZD*TbolwTbFk%S3U0zK`KBF%N#3_1Wr;naVALb*+ zK1U(eJ@y|Y(go$>6pm2k9+e<5(m^oDttzMbFsn@^F=)qQb4x2w$7em(R@m6 z0BJO~sZ%M6TfMR|JhnDtbYeCrz^Q*>zBEc?Xp8-q%i^4}>iA*|y}j1o6F(>r(g8Gp zbHKlASkiam`B~WWW`E*LyHlg(@pNzEZ{7k2Z`+;jiR#^pG%JG_ouxc`k4V==#X`( zTrjwFHT`jj6K3EgV`dV_E?l(fjCkm*;`(5mjPHX=Y-KF@?6)K$)|+%XBrK(|o@fZj zCnOky2MX@N>A_wU@aQp!Ud^1n#gPmVp0W1YCa=0m?rQGQ#YSe|Z3y z7>eK?0N)2X@$`_G^cq_%R-08frEeV(psa;rGdC1-mf|7p;ib*`et{8cF@2z% zsRVk&3jCO}t+$aKG>H_(VOFYR@bXC4uccY{<$1#RPdLcbMo#l@xQ3+z=Mzhzvb!w`ERc_s{O<9A*1U6e{2DVV*M3(b7Vq^o)a@D@R-4|kuSxMhpKai z0`HL$#O@qcn_@VqOndkE3Z<=Q`a)}))tQwu(F{$I$XzI3D)uxGSSiX#RkpeU#Ie4_GEO0DiIk48N;g(=}6WxkOGixJKO z@4#5Td*7gg{`MbBA(SKF0Lb9S`YznnLn`P%Dd~@d%qBB5mEGe5clE3?L+F~}t{zju zrK&tB1aiU8gbw990!|F_nmdDPfKFQueGKK~s4Qj?7lq

3v)QghPe%l^#HEI1?!; z^x#T!LtOWZ0%tckL_OD*PWt+t}yOX!3g7qdC?z19ck3DDx}yC(N3i{`k-rWvrj>R;i=xf4ooel9I^~KDe3RNcB&q;;QAy!kIOA#MPWmJS?HWkIV zjiG2~TgXvbM@;wzcc=rHY!xnDAkC{(_1=X!3vK4qs+B@ug@=w$`N906>UXAuNIfw4 z-4riFB^3Xy%WH2r>An$+)d>Q14dzvNS z#Hil;3*Fb52GNSx;rLTj-Xmp^j1&ZuR6-UuHIE@`kV4-ExseQZEt*arox1_TSMR^S z?&fRU_!dr@FP;~vak4`4|483SW@NS{#AH-UWc5JFFdfcKJwPVWegO8v$W(VUqlj>9 zP~%qW`bVP$)XhH3n}{Qg!J{|N`nnX3qJNqf5s_(V#+djr$dVDo*w_ptoBQD{V^Wrn z$DRgi@m!(ei?81pm80jaiva4LGLh+v#?oI^>`~aD=3LgGJ)ti^wu4-A)4FKBk;|Sg zVhN*oD`i*9`z3ji&0Iee>M5`kD!EW-p?m}i#!Q}>u?8bm1-`Q8j9PJ~%r|jvx%zyi zDzwwcTXVD7~=bvClEOQst@i7lqWTt^Pqe+L#q(W zs8tdnWcht0nd)n`3wrHdf8+~i%>-VJqRAi{>)(`~Am-`3=dsiRC3Ek~D2)SN%(H5I zpGzMr+x7Rn+Q;O9wH(>a$dyglZjb%vJR$xM4mLswN}4K-lL8|w&e;AqOihb^Fl{T7 zK%hd(q5up!jYRN8w?~G67GZ#vh}=E92a_89?Dum#q~DIds{jO6WRRA;$S>iCCA2B(@jSgui@CYi+npd|F z1`5D^Ayf#>i%OkJR=pRtt$ckgu#*7fKYEikhreeTv}pAAR)Y^-NLK*zzfP(A&&>|K@G@{}b~6-h`YM`8>*NQTuHH-|Gf9YzcTF?Ft;l*6tE>w?R;; zxw|095<4;enJF;493U1$48R{l7y3LZ?ck?#q=-RBwp8-ZyJ9Q}3qAi`@t={k7GGx! zo?Cc1V2n%(c-QQ+krOlL9fS7_l<^vWGLXqDu1oFpdoJ zaJ}^Ty5U~cHV6Wul0nJ35Ufs8mLSPt28qZTEk830cD%it98uvG$)_9FTVAFf#15a3 zlWb3#4+_JR(!Q3o>ZY9ztekk9kFa;O?ateNOt~LOTdx58pg-+Ge4^m#2BIk+c4R9a z@_6G&9IuNLzEM8&x{{*gEjhj#wfCg%9sM|jLSX0A{V{H}y5l4#!pR0c4T=62rKfVG literal 0 HcmV?d00001 diff --git a/docs/documentation/docs/controls/RichText.md b/docs/documentation/docs/controls/RichText.md new file mode 100644 index 000000000..6eb98e1c1 --- /dev/null +++ b/docs/documentation/docs/controls/RichText.md @@ -0,0 +1,68 @@ +# RichText control + +This control provides rich text editing and display capability. + +![RichText control output](../assets/RichTextOutput.gif) + +## How to use this control in your solutions + +- Check that you installed the `@pnp/spfx-controls-react` dependency. Check out the [getting started](../#getting-started) page for more information about installing the dependency. +- Import the following modules to your component: + +```TypeScript +import { RichText } from "@pnp/spfx-controls-react/lib/RichText"; +``` + +- The simplest way to use the `RichText` control in your code is as follows: + +```TypeScript + this.props.onChange(text)} + /> + +``` + +- The `value` property should contain the HTML that you wish to display +- The `onChange` handler will be called every time a user changes the text. For example, to have your web part store the rich text as it is updated, you would use the following code: + +```TypeScript + private _onTextChange = (newText: string) => { + this.properties.myRichText = newText; + return newText; + } +``` + +It is possible to use the `onChange` handler as users type -- for example, the following code replaces all instance of the word `bold` with bold text. + +```TypeScript + private _onTextChange = (newText: string) => { + newText = newText.replace(" bold ", " bold "); + this.properties.description = newText; + return newText; + } +``` + +## Implementation + +The RichText control can be configured with the following properties: + +| Property | Type | Required | Description | +| ---- | ---- | ---- | ---- | +| className | string | no | The custom CSS class to apply to the RichText control. | +| isEditMode | boolean | no | `true` indicates that users will be able to edit the content of the RichText control. `false` will display the rich text as read-only. | +| showAlign | boolean | no | Indicates whether to show the **Align** toolbar button or not. Default value is `true` | +| showBold | boolean | no | Indicates whether to show the **Bold** toolbar button or not. Default value is `true` | +| showItalic | boolean | no | Indicates whether to show the **Italic** toolbar button or not. Default value is `true` | +| showLink | boolean | no | Indicates whether to show the **Hyperlink** toolbar button or not. Default value is `true` | +| showList | boolean | no | Indicates whether to show the **List** toolbar button or not. Default value is `true` | +| showMore | boolean | no | Indicates whether to show the **More** toolbar button or not. Note that this option is indenpendent from the other `show___` options. I.e.: Setting `showBold` to `false` will disable the **Bold** toolbar, but will not disable it from the formatting pane. Default value is `true` | +| showStyles | boolean | no | Indicates whether to show the **Headings** toolbar button or not. Note that this option is indenpendent from the other `show___` options. I.e.: Setting `showBold` to `false` will disable the **Bold** toolbar, but will not disable it from the formatting pane. Default value is `true` | +| showUnderline | boolean | no | Indicates whether to show the **Underline** toolbar button or not. Note that this option is indenpendent from the other `show___` options. I.e.: Setting `showBold` to `false` will disable the **Bold** toolbar, but will not disable it from the formatting pane. Default value is `true` | +| value | string | no | Sets the rich text to display in the RichText control. | +| onChange | (text: string) => string | no | onChange handler for the RichText control. The function must return a `string` containing the rich text to display in the RichText control. | + +> Note that setting `showAlign`, `showBold`, `showItalic`, `showLink`, `showList`, `showStyles`, or +`showUnderline` to `false` does *not* remove the user's ability to apply the button's associated formatting -- it only hides the toolbar option. If `showMore` is `true`, the options will remain available in the formatting pane. To prevent users from applying specific formats, use the `onChange` handler to parse the rich text and remove the formatting as desired. + +![](https://telemetry.sharepointpnp.com/sp-dev-fx-controls-react/wiki/controls/RichText) diff --git a/package-lock.json b/package-lock.json index e97c55099..42694eefe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1598,11 +1598,18 @@ "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", "dev": true }, + "@types/quill": { + "version": "1.3.10", + "resolved": "https://registry.npmjs.org/@types/quill/-/quill-1.3.10.tgz", + "integrity": "sha512-IhW3fPW+bkt9MLNlycw8u8fWb7oO7W5URC9MfZYHBlA24rex9rs23D5DETChu1zvgVdc5ka64ICjJOgQMr6Shw==", + "requires": { + "parchment": "^1.1.2" + } + }, "@types/react": { "version": "15.0.38", "resolved": "https://registry.npmjs.org/@types/react/-/react-15.0.38.tgz", - "integrity": "sha512-CkRB27L/kMDu7K20U0V7BwYK9/kPd9Im6Jlxv2vAEolYBvQy6JrSpPJsbZXtOk4MoDUomkct8Q7PNBUSLd0fmg==", - "dev": true + "integrity": "sha512-CkRB27L/kMDu7K20U0V7BwYK9/kPd9Im6Jlxv2vAEolYBvQy6JrSpPJsbZXtOk4MoDUomkct8Q7PNBUSLd0fmg==" }, "@types/react-addons-shallow-compare": { "version": "0.14.17", @@ -4235,6 +4242,16 @@ "sha.js": "^2.4.8" } }, + "create-react-class": { + "version": "15.6.3", + "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.3.tgz", + "integrity": "sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg==", + "requires": { + "fbjs": "^0.8.9", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + }, "cross-spawn": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", @@ -4796,6 +4813,11 @@ } } }, + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" + }, "deep-extend": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", @@ -6018,8 +6040,7 @@ "extend": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" }, "extend-shallow": { "version": "2.0.1", @@ -6098,6 +6119,11 @@ "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", "dev": true }, + "fast-diff": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz", + "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==" + }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", @@ -12555,6 +12581,11 @@ "no-case": "^2.2.0" } }, + "parchment": { + "version": "1.1.4", + "resolved": "http://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz", + "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==" + }, "parse-asn1": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", @@ -13606,6 +13637,48 @@ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", "dev": true }, + "quill": { + "version": "1.3.6", + "resolved": "http://registry.npmjs.org/quill/-/quill-1.3.6.tgz", + "integrity": "sha512-K0mvhimWZN6s+9OQ249CH2IEPZ9JmkFuCQeHAOQax3EZ2nDJ3wfGh59mnlQaZV2i7u8eFarx6wAtvQKgShojug==", + "requires": { + "clone": "^2.1.1", + "deep-equal": "^1.0.1", + "eventemitter3": "^2.0.3", + "extend": "^3.0.1", + "parchment": "^1.1.4", + "quill-delta": "^3.6.2" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + }, + "eventemitter3": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz", + "integrity": "sha1-teEHm1n7XhuidxwKmTvgYKWMmbo=" + } + } + }, + "quill-delta": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz", + "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==", + "requires": { + "deep-equal": "^1.0.1", + "extend": "^3.0.2", + "fast-diff": "1.1.2" + }, + "dependencies": { + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + } + } + }, "random-bytes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", @@ -13710,6 +13783,25 @@ "object-assign": "^4.1.0" } }, + "react-dom-factories": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/react-dom-factories/-/react-dom-factories-1.0.2.tgz", + "integrity": "sha1-63cFxNs2+1AbOqOP91lhaqD/luA=" + }, + "react-quill": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/react-quill/-/react-quill-1.3.3.tgz", + "integrity": "sha512-T9RubLaWJ8gCfp7sOqmFupjiTiEp/EdGqhCG+PWGKc5UHiK6xIWNKWYsOHHEhQ+sZCKs8u/DPx47gc1VfFmcLg==", + "requires": { + "@types/quill": "1.3.10", + "@types/react": "*", + "create-react-class": "^15.6.0", + "lodash": "^4.17.4", + "prop-types": "^15.5.10", + "quill": "^1.2.6", + "react-dom-factories": "^1.0.0" + } + }, "read": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", diff --git a/package.json b/package.json index f825ae066..7a608843c 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,8 @@ "chart.js": "2.7.3", "color": "^3.1.0", "lodash": "4.17.4", - "office-ui-fabric-react": "5.131.0" + "office-ui-fabric-react": "5.131.0", + "react-quill": "^1.3.3" }, "devDependencies": { "@microsoft/decorators": "~1.3.0", diff --git a/src/RichText.ts b/src/RichText.ts new file mode 100644 index 000000000..441fb9ba2 --- /dev/null +++ b/src/RichText.ts @@ -0,0 +1 @@ +export * from './controls/richText/index'; diff --git a/src/common/utilities/ThemeColorHelper.ts b/src/common/utilities/ThemeColorHelper.ts new file mode 100644 index 000000000..bbc87518c --- /dev/null +++ b/src/common/utilities/ThemeColorHelper.ts @@ -0,0 +1,68 @@ +interface Window { + __themeState__: any; +} + +declare var window: Window; + +export class ThemeColorHelper { + /** + * Extracts the color from a theme string + * @param value The theme string (e.g.: "[theme:neutralDark, default: #212121]") + */ + public static GetThemeColor(value: string): string { + try { + if (value.indexOf('theme:') > 0) { + // This value has a theme substitution + const themeParts: string[] = value.replace('[', '').replace(']', '').replace('"', '').split(','); + let defaultValue: string = undefined; + let themeValue: string = undefined; + + // Break the theme string into it's components + themeParts.forEach(themePart => { + if (themePart.indexOf('theme:') >= 0) { + themeValue = themePart.replace('theme:', ''); + } else if (themePart.indexOf('default:') >= 0) { + defaultValue = themePart.replace('default:', '').replace('"', '').trim(); + } + }); + + // If there is a theme value, try to read from environment + if (themeValue !== undefined) { + try { + // This should definitely be easier to do in SPFx! + + // tslint:disable-next-line + const themeStateVariable: any = window.__themeState__; + if (themeStateVariable === undefined) { + return defaultValue; + } + const themeState: {} = themeStateVariable.theme; + + if (themeState === undefined) { + return defaultValue; + } + + for (const varName in themeState) { + if (!themeState.hasOwnProperty(varName)) { + continue; + } + + // Cheesy cleanup of variables to remove extra quotes + if (varName === themeValue) { + return themeState[varName].replace('"', '').trim(); + } + } + } catch (error) { + // do nothing + } + + return defaultValue; + } + } + } catch (error) { + + } + + return value; + } +} diff --git a/src/controls/chartControl/ChartControl.tsx b/src/controls/chartControl/ChartControl.tsx index b4348d82a..0899f6c58 100644 --- a/src/controls/chartControl/ChartControl.tsx +++ b/src/controls/chartControl/ChartControl.tsx @@ -7,6 +7,7 @@ import { PaletteGenerator } from './PaletteGenerator'; import { AccessibleChartTable } from './AccessibleChartTable'; import * as telemetry from '../../common/telemetry'; import { ChartPalette } from './ChartControl.types'; +import { ThemeColorHelper } from '../../common/utilities/ThemeColorHelper'; interface Window { __themeState__: any; @@ -349,32 +350,32 @@ export class ChartControl extends React.Component 0) { - // This value has a theme substitution - const themeParts: string[] = value.replace('[', '').replace(']', '').replace('"', '').split(','); - let defaultValue: string = undefined; - let themeValue: string = undefined; - - // Break the theme string into it's components - themeParts.forEach(themePart => { - if (themePart.indexOf('theme:') >= 0) { - themeValue = themePart.replace('theme:', ''); - } else if (themePart.indexOf('default:') >= 0) { - defaultValue = themePart.replace('default:', '').replace('"', '').trim(); - } - }); - - // If there is a theme value, try to read from environment - if (themeValue !== undefined) { - try { - // This should definitely be easier to do in SPFx! - - // tslint:disable-next-line - const themeStateVariable: any = window.__themeState__; - if (themeStateVariable === undefined) { - return defaultValue; - } - const themeState: {} = themeStateVariable.theme; - - if (themeState === undefined) { - return defaultValue; - } - - for (const varName in themeState) { - if (!themeState.hasOwnProperty(varName)) { - continue; - } - - // Cheesy cleanup of variables to remove extra quotes - if (varName === themeValue) { - return themeState[varName].replace('"', '').trim(); - } - } - } catch (error) { - // do nothing - } - - return defaultValue; - } - } - } catch (error) { - - } - - return value; - } + // private _getThemeColor(value: string): string { + // try { + // if (value.indexOf('theme:') > 0) { + // // This value has a theme substitution + // const themeParts: string[] = value.replace('[', '').replace(']', '').replace('"', '').split(','); + // let defaultValue: string = undefined; + // let themeValue: string = undefined; + + // // Break the theme string into it's components + // themeParts.forEach(themePart => { + // if (themePart.indexOf('theme:') >= 0) { + // themeValue = themePart.replace('theme:', ''); + // } else if (themePart.indexOf('default:') >= 0) { + // defaultValue = themePart.replace('default:', '').replace('"', '').trim(); + // } + // }); + + // // If there is a theme value, try to read from environment + // if (themeValue !== undefined) { + // try { + // // This should definitely be easier to do in SPFx! + + // // tslint:disable-next-line + // const themeStateVariable: any = window.__themeState__; + // if (themeStateVariable === undefined) { + // return defaultValue; + // } + // const themeState: {} = themeStateVariable.theme; + + // if (themeState === undefined) { + // return defaultValue; + // } + + // for (const varName in themeState) { + // if (!themeState.hasOwnProperty(varName)) { + // continue; + // } + + // // Cheesy cleanup of variables to remove extra quotes + // if (varName === themeValue) { + // return themeState[varName].replace('"', '').trim(); + // } + // } + // } catch (error) { + // // do nothing + // } + + // return defaultValue; + // } + // } + // } catch (error) { + + // } + + // return value; + // } // Reads one of the Office Fabric defined font sizes // and converts to a number diff --git a/src/controls/richText/RichText.module.scss b/src/controls/richText/RichText.module.scss new file mode 100644 index 000000000..d2f0ab497 --- /dev/null +++ b/src/controls/richText/RichText.module.scss @@ -0,0 +1,400 @@ +@import '~office-ui-fabric-react/dist/sass/References.scss'; + +.richtext { + color: inherit; +} + +.insertLinkDialog { + :global { + .ms-Dialog-main { + max-width: 540px; + width: 540px; + } + } + + .actions { + position: relative; + width: 100%; + min-height: 24px; + line-height: 24px; + margin-top: 20px; + margin-right: 0px; + margin-bottom: 0px; + margin-left: 0px; + font-size: 0px; + + .actionsRight { + text-align: right; + margin-right: -4px; + font-size: 0px; + + .action { + margin-top: 0px; + margin-right: 4px; + margin-bottom: 0px; + margin-left: 4px; + } + + .unlinkButton { + margin-top: 4px; + font-size: 14px; + float: left; + } + } + } +} + +.headerDropDown { + width: 160px; +} + +.toolbarDropDown { + height: 34px; +} +.toolbarDropDownTitleIcon { + margin-top: -2px; + margin-right: 0px; +} + +.toolbarDropDownIcon { + margin-top: -2px; + margin-right: 0px; + margin-left: -4px; +} + +.toolbarDropDownOption { + &.toolbarButtonH2 { + font-size: 21px; + font-weight: 100; + } + + &.toolbarButtonH3 { + font-size: 14px; + font-weight: 100 !important; + } + + &.toolbarButtonH4 { + font-size: 14px; + font-weight: 100 !important; + } + + &.toolbarButtonBlockQuote { + font-size: 14px; + font-style: italic; + } +} + +.toolbarSubmenuCaret { + display: inline-block; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-style: normal; + font-weight: normal; + font-size: 8px; + speak: none; + font-family: "FabricMDL2Icons-6"; + top: 50%; + color: $ms-color-neutralLighterAlt; +} + +.toolbarSubmenuDisplayButton { + width: 100%; +} + +:global { + .ql-toolbar { + background-color: transparent; + color: $ms-color-neutralLighterAlt; + border: none; + display: none; + + .ms-TooltipHost { + display: inline-block !important; + } + + .ms-Dropdown-container { + display: inline-block !important; + } + + .ms-Button { + background-color: $ms-color-neutralPrimary; + color: $ms-color-neutralLighterAlt !important; + + &:hover { + background-color: $ms-color-neutralSecondaryAlt; + color: $ms-color-neutralLighterAlt; + } + + &:focus { + border: 1px solid $ms-color-neutralLighterAlt; + outline: 0; + color: $ms-color-neutralLighterAlt; + } + + &:active { + color: $ms-color-neutralLighterAlt; + } + + &.is-checked { + background-color: $ms-color-themePrimary !important; + } + } + .ms-Dropdown-title { + background-color: $ms-color-neutralPrimary; + color: $ms-color-neutralLighterAlt !important; + border: none; + min-height: 34px; + padding-bottom: 0px; + padding-left: 9px; + padding-right: 20px; + padding-top: 2px; + -webkit-transition: all 0.3s; + transition: all 0.3s; + -webkit-transition-property: background-color, color; + + &:hover { + background-color: $ms-color-neutralSecondaryAlt; + color: $ms-color-neutralLighterAlt; + } + + &:focus { + border: 1px solid $ms-color-neutralLighterAlt; + outline: 0; + color: $ms-color-neutralLighterAlt; + } + + &:active { + color: $ms-color-neutralLighterAlt; + } + } + + .ms-Dropdown-caretDownWrapper { + right: 4px; + margin-top: -1px; + } + } + + .ql-snow.ql-toolbar button, + .ql-snow .ql-toolbar button { + background-color: $ms-color-neutralPrimary; + color: $ms-color-neutralLighterAlt; + font-size: 14px; + min-width: 34px; + height: 34px; + padding-top: 4px; + padding-left: 8px; + padding-right: 8px; + } + + .ql-toolbar.ql-snow { + padding: 0px; + font-family: "Segoe UI Web (West European)", Segoe UI, -apple-system, + BlinkMacSystemFont, Roboto, Helvetica Neue, sans-serif; + border: none; + margin-bottom: 2px; + z-index: 3; + -webkit-animation-name: ms-fadeIn, ms-slideUpIn10; + animation-name: ms-fadeIn, ms-slideUpIn10; + -webkit-animation-duration: 167ms; + animation-duration: 167ms; + -webkit-animation-timing-function: cubic-bezier(0.1, 0.25, 0.75, 0.9); + animation-timing-function: cubic-bezier(0.1, 0.25, 0.75, 0.9); + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-transition: all 367ms cubic-bezier(0.1, 0.9, 0.2, 1); + transition: all 367ms cubic-bezier(0.1, 0.9, 0.2, 1); + } + + .ql-snow.ql-toolbar:after, + .ql-snow .ql-toolbar:after { + clear: both; + content: ""; + display: table; + } + .ql-container.ql-snow { + border: none; + } + + .ql-active .ql-editor:hover { + border-width: 1px; + border-style: solid; + border-color: $ms-color-neutralTertiary; + } + + .ql-active .ql-editor:focus, + .ql-active .ql-editor:active, + .ql-active .ql-editor:active:hover { + border-width: 1px; + border-style: solid; + border-color: $ms-color-themePrimary; + } + + .ql-active .ql-toolbar { + display: block; + position: absolute; + top: -28px; + opacity: 1; + height: 34px; + -webkit-box-shadow: 0 0 5px 0 #c8c8c8; + box-shadow: 0px 0px 5px 0px #c8c8c8; + } + + .ql-snow .ql-editor, .ql-editor{ + border: 1px solid transparent; + padding-left: 10px; + padding-right: 10px; + padding-top: 8px; + padding-bottom: 8px; + min-height: 68px; + font-family: "Segoe UI Web (West European)", Segoe UI, -apple-system, + BlinkMacSystemFont, Roboto, Helvetica Neue, sans-serif; + font-size: 17px; + + h2 { + font-weight: 100 !important; + font-size: 28px; + } + + h3 { + font-size: 24px; + font-weight: 100 !important; + } + + h4 { + font-size: 21px; + font-weight: 100 !important; + } + + blockquote, + div, + h2, + h3, + h4, + ol, + p, + ul { + -webkit-font-smoothing: antialiased; + color: $ms-color-neutralPrimary; + line-height: 1.3; + margin: 0 0 16px; + word-wrap: break-word; + } + + blockquote { + border-bottom-color: $ms-color-neutralTertiaryAlt; + border-bottom-style: solid; + border-bottom-width: 1px; + border-left-style: none; + border-left-width: 0; + border-left-color: transparent; + border-right-style: none; + border-right-width: 0; + border-right-color: transparent; + border-top-color: $ms-color-neutralTertiaryAlt; + border-top-style: solid; + border-top-width: 1px; + color: $ms-color-neutralSecondaryAlt; + font-size: 24px; + font-style: italic; + font-weight: 100; + line-height: 31.2px; + margin-bottom: 28px; + padding-bottom: 32px; + margin-top: 28px; + margin-right: 0px; + margin-left: 0px; + padding-left: 32px; + padding-right: 32px; + padding-top: 32px; + text-align: center; + } + + .ql-size-small { + font-size: 12px; + } + + .ql-size-medium { + font-size: 14px; + } + + .ql-size-mediumplus { + font-size: 15px; + } + + .ql-size-large { + font-size: 17px; + } + + .ql-size-xlarge { + font-size: 21px; + } + + .ql-size-xlargeplus { + font-size: 24px; + } + + .ql-size-xxlarge { + font-size: 28px; + } + + .ql-size-xxxlarge { + font-size: 32px; + } + + .ql-size-xxlargeplus { + font-size: 36px; + } + + .ql-size-super { + font-size: 42px; + } + } + + @media screen and (min-width: 1024px) { + .ql-editor div, + .ql-editor ol, + .ql-editor p, + .ql-editor ul { + font-size: 17px; + font-weight: 300; + line-height: 1.3; + } + } + + .ql-active .ql-editor { + // background-color: red; + color: inherit; + } + + .ql-tooltip { + display: none !important; + } + + .ql-editor.ql-blank::before { + font-style: normal; + color: $ms-color-neutralTertiary; + font-size: 17px; + font-weight: 300; + line-height: 1.3; + } + + .ms-Dropdown-item { + background-color: $ms-color-neutralPrimary !important; + color: $ms-color-neutralLighterAlt !important; + -webkit-transition: all 0.3s; + transition: all 0.3s; + -webkit-transition-property: background-color, color; + } + + .ms-Dropdown-item:hover { + background-color: $ms-color-neutralSecondaryAlt !important; + color: $ms-color-neutralLighterAlt !important; + cursor: pointer; + } + + .ms-Dropdown-item.is-selected, + .ms-Dropdown-item.is-selected:hover { + background-color: $ms-color-themePrimary !important; + color: $ms-color-neutralLighterAlt !important; + } +} diff --git a/src/controls/richText/RichText.tsx b/src/controls/richText/RichText.tsx new file mode 100644 index 000000000..ba7cfe4bd --- /dev/null +++ b/src/controls/richText/RichText.tsx @@ -0,0 +1,832 @@ +import * as React from 'react'; + +import { IRichTextProps, IRichTextState } from './RichText.types'; +import RichTextPropertyPane from './RichTextPropertyPane'; +import ReactQuill, { Quill } from 'react-quill'; +import 'react-quill/dist/quill.snow.css'; +import styles from './RichText.module.scss'; +import { css } from 'office-ui-fabric-react/lib/Utilities'; +import { IconButton } from 'office-ui-fabric-react/lib/Button'; +import { Guid } from '@microsoft/sp-core-library'; +import * as strings from 'ControlStrings'; +import { TooltipHost } from 'office-ui-fabric-react/lib/Tooltip'; +import { Dialog, DialogType, DialogFooter } from 'office-ui-fabric-react/lib/Dialog'; +import { TextField } from 'office-ui-fabric-react/lib/TextField'; +import { Link } from 'office-ui-fabric-react/lib/Link'; +import { PrimaryButton, DefaultButton } from 'office-ui-fabric-react/lib/Button'; +import { Dropdown, IDropdownOption } from 'office-ui-fabric-react/lib/Dropdown'; +import { Icon } from 'office-ui-fabric-react/lib/Icon'; +import { elementContains } from 'office-ui-fabric-react/lib/Utilities'; + + +import * as telemetry from '../../common/telemetry'; + +/** + * Creates a rich text editing control that mimics the out-of-the-box + * SharePoint Rich Text control. + * NOTE: + * Quill.js has a few quirks that we can't work around + * - Block quotes only work on single lines. This is a frequently-requested feature with Quill that isn't available yet. + * - Tables aren't supported yet. I'll gladly add table formatting support if users request it. + */ +export class RichText extends React.Component { + private _quillElem: ReactQuill = undefined; + private _wrapperRef = undefined; + private _propertyPaneRef: RichTextPropertyPane = undefined; + private _toolbarId = undefined; + + /** + * Sets default properties + */ + public static defaultProps: Partial = { + isEditMode: true, + showStyles: true, + showBold: true, + showItalic: true, + showUnderline: true, + showAlign: true, + showList: true, + showLink: true, + showMore: true + }; + + + constructor(props: IRichTextProps) { + super(props); + + telemetry.track('ReactRichText', { + className: !!props.className + }); + + this.state = { + text: this.props.value, + editing: false, + morePaneVisible: false, + hideDialog: true, + formats: {}, + insertUrl: undefined, + insertUrlText: undefined, + selectedText: undefined, + selectedUrl: undefined + }; + + // Prepare to handle clicking outside of the control + this._setWrapperRef = this._setWrapperRef.bind(this); + this._handleClickOutside = this._handleClickOutside.bind(this); + + // Get a unique toolbar id + this._toolbarId = "toolbar_" + Guid.newGuid().toString(); + } + + /** + * Attaches to mouse down events to determine if we clicked outside + */ + public componentDidMount() { + // If we're in edit mode, attach the mouse down event + if (this.props.isEditMode) { + document.addEventListener('click', this._handleClickOutside); + document.addEventListener('focus', this._handleClickOutside); + } + } + + /** + * Removes the mouse down event + */ + public componentWillUnmount() { + // If we were in edit mode, remove the mouse down handler + if (this.props.isEditMode) { + document.removeEventListener('click', this._handleClickOutside); + document.removeEventListener('focus', this._handleClickOutside); + } + } + + /** + * If we're switching from non-edit mode to edit mode, attach mouse down event + * If we're going from edit mode to non-edit mode, remove mouse down event + * @param prevProps + * @param prevState + */ + public componentDidUpdate(prevProps: IRichTextProps, prevState: IRichTextState): void { + // If we're going from non-edit to edit mode + if (this.props.isEditMode && !prevProps.isEditMode) { + document.addEventListener('click', this._handleClickOutside); + document.addEventListener('focus', this._handleClickOutside); + } + + // If we're going from edit mode to non-edit mode + if (!this.props.isEditMode && prevProps.isEditMode) { + document.removeEventListener('click', this._handleClickOutside); + document.removeEventListener('focus', this._handleClickOutside); + } + } + + /*** + * Renders the Rich Text Editor + */ + public render(): React.ReactElement { + const { text } = this.state; + const { isEditMode } = this.props; + + // If we're not in edit mode, display read-only version of the html + if (!isEditMode) { + return ( +

+
+ ); + } + + // Okay, we're in edit mode. + const { + placeholder, + showStyles, + showBold, + showItalic, + showUnderline, + showAlign, + showList, + showLink, + showMore + } = this.props; + + // Get a unique id for the toolbar + const modules = { + toolbar: { + container: "#" + this._toolbarId, + handlers: [ + "link" // disable the link handler so we can add our own + ] + }, + clipboard: { + matchVisual: false // prevents weird bug that inserts blank lines when loading stored text + } + }; + + // Remove fonts and set Segoe UI as the main font + var font = Quill.import('formats/font'); + font.whitelist = ['Segoe UI']; + Quill.register(font, true); + + // Set headers and add blockquote capability + var header = Quill.import('formats/header'); + header.tagName = [ + 'H1', + 'H2', + 'H3', + 'H4', + 'H5', + 'H6', + 'blockquote']; + Quill.register(header, true); + + // Add the sharepoint font sizes + var SizeClass = Quill.import('formats/size'); + SizeClass.whitelist = [ + 'small', + 'medium', + 'mediumplus', + 'large', + 'xlarge', + 'xlargeplus', + 'xxlarge', + 'xxxlarge', + 'xxlargeplus', + 'super']; + Quill.register(SizeClass, true); + + return ( +
+
+ {showStyles && + { return ; }} + selectedKey={this.state.formats.header !== undefined ? this.state.formats.header : 0} + options={[ + { + key: 0, + text: strings.HeaderNormalText, + data: {} + }, + { + key: 2, + text: strings.HeaderH2, + data: + { className: styles.toolbarButtonH2 } + }, + { + key: 3, + text: strings.HeaderH3, + data: + { className: styles.toolbarButtonH3 } + }, + { + key: 4, + text: strings.HeaderH4, + data: + { className: styles.toolbarButtonH4 } + }, + { + key: 7, + text: strings.HeaderBlockQuote, + data: + { className: styles.toolbarButtonBlockQuote } + } + ]} + onChanged={(item) => this._onChangeHeading(item)} + onRenderOption={(option: IDropdownOption): JSX.Element => { + return ( + +
+ {option.text} +
+
+ ); + }} + onRenderTitle={(options: IDropdownOption[]): JSX.Element => { + const option = options[0]; + + return ( + +
+ {option.text} +
+
+ ); + }} + /> + } + {showBold && + + + this._onChangeBold()}> + + + } + {showItalic && + + + this._onChangeItalic()}> + + + + } + {showUnderline && + + + this._onChangeUnderline()}> + + + } + {showAlign && + { return ; }} + selectedKey={this.state.formats.align !== undefined ? this.state.formats.align : 'left'} + options={[ + { + key: 'left', + text: strings.AlignLeft, + data: { icon: 'AlignLeft' } + }, + { + key: 'center', + text: strings.AlignCenter, + data: { icon: 'AlignCenter' } + }, + { + key: 'right', + text: strings.AlignRight, + data: { icon: 'AlignRight' } + } + ]} + onChanged={(item) => this._onChangeAlign(item)} + onRenderOption={(option: IDropdownOption): JSX.Element => { + return ( + +
+
+
+ ); + }} + onRenderTitle={(options: IDropdownOption[]): JSX.Element => { + const option = options[0]; + + return ( + +
+
+
+ ); + }} + /> + } + {showList && + { return ; }} + selectedKey={this.state.formats.list} + options={[ + { + key: 'bullet', + text: strings.ListBullet, + data: { icon: 'BulletedList' } + }, + { + key: 'ordered', + text: strings.ListNumbered, + data: { icon: 'NumberedList' } + } + ]} + // this option is not available yet + // notifyOnReselect={true} // allows re-selecting selected item to turn it off + onChanged={(item) => this._onChangeList(item)} + onRenderOption={(option: IDropdownOption): JSX.Element => { + return ( + +
+
+
+ ); + }} + onRenderTitle={(options: IDropdownOption[]): JSX.Element => { + const option = options[0]; + + return ( + +
+
+
+ ); + }} + onRenderPlaceHolder={(): JSX.Element => { + return ( + +
+
+
+ ); + }} + /> + } + {showLink && + + this._showInsertLinkDialog()} + aria-describedby="link-richtextbutton" + iconProps={{ + iconName: 'Link' + }} /> + + } + {showMore && + + + this._handleShowMore()}> + + + } +
+ + this._handleChangeSelection(range, oldRange, source)} + onFocus={(range, source, editor) => + this._handleOnFocus(range, source, editor)} + /> + this._handleClosePanel()} + onLink={() => this._showInsertLinkDialog()} + /> + {this._renderLinkDialog()} +
+ ); + } + + /** + * Returns a handle to the Quill editor + */ + public getEditor = (): Quill => { + try { + return this._quillElem!.getEditor(); + } catch (error) { + return undefined; + } + } + + private _onChangeBold = (): void => { + const newBoldValue = !this.state.formats.bold; + this._applyFormat("bold", newBoldValue); + } + + private _onChangeItalic = (): void => { + const newValue = !this.state.formats.italic; + this._applyFormat("italic", newValue); + } + + private _onChangeUnderline = (): void => { + const newValue = !this.state.formats.underline; + this._applyFormat("underline", newValue); + } + private _onChangeHeading = (item: IDropdownOption): void => { + const newHeadingValue = item.key === 0 ? '' : item.key.toString(); + this._applyFormat("header", newHeadingValue); + } + + private _onChangeAlign = (item: IDropdownOption): void => { + const newAlignValue = item.key === 'left' ? false : item.key.toString(); + this._applyFormat("align", newAlignValue); + } + + private _onChangeList = (item: IDropdownOption): void => { + // if we're already in list mode, toggle off + const key = item.key; + const newAlignValue = (key === 'bullet' && this.state.formats.list === 'bullet') || + (key === 'numbered' && this.state.formats.list === 'numbered') + ? false : key; + this._applyFormat("list", newAlignValue); + } + + /** + * Renders the "Insert Link" dialog + */ + private _renderLinkDialog = (): JSX.Element => { + return (); + } + + /** + * Displays the insert link dialog + */ + private _showInsertLinkDialog = () => { + const quill = this.getEditor(); + const range = quill.getSelection(); + + let linkText = this.state.selectedText; + if (this.state.selectedUrl !== undefined && this.state.selectedText === "") { + const { text } = this.state; + const urlStartIndex = text.indexOf(this.state.selectedUrl); + const startTextIndex = text.indexOf(">", urlStartIndex) + 1; + const endTextIndex = text.indexOf("<", startTextIndex); + const realLength = endTextIndex - startTextIndex; + linkText = text.substr(startTextIndex, realLength); + + //Find where the link text starts and select that + const editorText = quill.getText(); + const linkStart = editorText.indexOf(linkText); + range.index = linkStart; + range.length = linkText.length; + } + + this.setState({ + hideDialog: false, + insertUrlText: linkText, + insertUrl: this.state.selectedUrl, + selectedRange: range + }); + } + + /** + * Hides the insert link dialog + */ + private _closeDialog = () => { + this.setState({ hideDialog: true }); + } + + /** + * When user enters the richtext editor, displays the border + */ + private _handleOnFocus = (range, source, editor) => { + if (!this.state.editing) { + this.setState({ editing: true }); + } + } + + /** + * Called when user removes the link + */ + private _handleRemoveLink = () => { + const quill = this.getEditor(); + quill.format('link', false); + this._closeDialog(); + } + + /** + * Called when user creates a new link + */ + private _handleCreateLink = () => { + const quill = this.getEditor(); + const range = this.state.selectedRange; + const cursorPosition: number = range!.index; + if (range.length > 0) { + quill.deleteText(range.index, range.length); + } + + if (cursorPosition) { + const textToInsert: string = this.state.insertUrlText !== undefined ? this.state.insertUrlText : this.state.insertUrl; + const urlToInsert: string = this.state.insertUrl; + quill.insertText(cursorPosition, textToInsert); + quill.setSelection(cursorPosition, textToInsert.length); + quill.formatText(cursorPosition, textToInsert.length, 'link', urlToInsert); + } + + this.setState({ + hideDialog: true, + insertUrl: undefined, + insertUrlText: undefined + }); + } + + /** + * Applies a format to the selection + * @param name format name + * @param value format value, or false to unset format + */ + private _applyFormat(name: string, value: any) { + const quill = this.getEditor(); + quill.format(name, value); + + // we use a timeout to ensure that format has been applied + // and buttons are updated + setTimeout( + () => { + this._handleChangeSelection(quill.getSelection(), undefined, undefined); + }, + 100 + ); + } + + /** + * Called when richtext selection changes + */ + private _handleChangeSelection = (range, oldRange, source) => { + const quill = this.getEditor(); + try { + if (quill) { + // Get the selected text + const selectedText = quill.getText(range); + + // Get the current format + const formats = quill.getFormat(range); + + // Get the currently selected url + const selectedUrl = formats.link ? formats.link : undefined; + + this.setState({ + selectedText: selectedText, + selectedUrl: selectedUrl, + formats: formats + }); + + if (this._propertyPaneRef && this.state.morePaneVisible) { + this._propertyPaneRef.onChangeSelection(range, oldRange, source); + } + } + } catch (error) { + + } + } + + /** + * Called when user clicks on the close icon + */ + private _handleClosePanel = (): void => { + this._closePanel(); + } + + /** + * Closes the panel + */ + private _closePanel = (): void => { + this.setState({ morePaneVisible: false }); + } + + /** + * Called when user clicks on the more button + */ + private _handleShowMore = () => { + this.setState({ + morePaneVisible: !this.state.morePaneVisible + }, () => { + this.getEditor().focus(); + }); + } + + /** + * Called when user changes the text of the editor + */ + private _handleChange = (value: string) => { + const { onChange } = this.props; + + // do we need to pass this to a handler? + if (onChange) { + // yes, get the changed text from the handler + let newText: string = this.props.onChange(value); + this.setState({ text: newText }); + } else { + // no, write the text to the state + this.setState({ text: value }); + } + } + + /** + * Set the wrapper ref + */ + private _setWrapperRef(node) { + this._wrapperRef = node; + } + + /** + * Keeps track of whether we clicked outside the element + */ + private _handleClickOutside(event) { + let outside: boolean = !elementContains(this._wrapperRef, event.target); + + // Did we click outside? + if (outside) { + // If we are currently editing, stop editing + // -- unless we're using the property pane or the dialog + if (this.state.editing) { + this.setState({ + editing: false + }); + } + } else { + // We clicked inside + if (!this.state.editing) { + // if we aren't currently editing, start editing + this.setState({ editing: true }); + } + } + } + + /** + * Links to the quill reference + */ + private _linkQuill = (e: any) => { + this._quillElem = e; + } + + /** + * Links to the property pane element + */ + private _linkPropertyPane = (e: any) => { + this._propertyPaneRef = e; + } +} diff --git a/src/controls/richText/RichText.types.ts b/src/controls/richText/RichText.types.ts new file mode 100644 index 000000000..bdaff6803 --- /dev/null +++ b/src/controls/richText/RichText.types.ts @@ -0,0 +1,131 @@ +export interface IRichTextProps { + /** + * CSS class to apply to the rich text editor. + * @defaultvalue null + */ + className?: string; + + /** + * Indicates if the rich text editor should be in edit mode + * @defaultvalue true + */ + isEditMode?: boolean; + + /** + * Placeholder text to show when editor is empty. + * @defaultvalue undefined + */ + placeholder? : string; + + /** + * Indicates if we should show the Align button + * @defaultvalue true + */ + showAlign?: boolean; + + /** + * Indicates if we should show the Bold button + * @defaultvalue true + */ + showBold?: boolean; + + /** + * Indicates if we should show the Italic button + * @defaultvalue true + * */ + showItalic?: boolean; + + /** + * Indicates if we should show the Hyperlink button + * @defaultvalue true + */ + showLink?: boolean; + + /** + * Indicates if we should show the List button + * @defaultvalue true + */ + showList?: boolean; + + /** + * Indicates if we should show the More button. + * If the More button is enabled, users can use + * all options (Bold, Italic, etc.) whether they + * are turned off or not. + * @defaultvalue true + */ + showMore?: boolean; + + /** + * Indicates if we should show the Styles button (Heading 1, Heading 2, ..., Pull quote) + * @defaultvalue true + */ + showStyles?: boolean; + + /** + * Indicates if we should show the Underline button + * @defaultvalue true + */ + showUnderline?: boolean; + + /** + * The HTML text containing the rich text + */ + value?: string; + + /** + * Callback issued when the rich text changes. + * Returns the text that will be inserted in the rich text control. + */ + onChange?: (text: string) => string; +} + +export interface IRichTextState { + /** + * Whether the rich text is currently editing (i.e.: has focus) + */ + editing: boolean; + + /** + * The formats of the current range selection + */ + formats: any; + + /** + * Whether to hide the insert link dialog + */ + hideDialog: boolean; + + /** + * The URL to insert + */ + insertUrl: string; + + /** + * The text to display when inserting URL + */ + insertUrlText: string; + + /** + * Whether the "More" pane is visible + */ + morePaneVisible: boolean; + + /** + * The currently selected range + */ + selectedRange?: any; + + /** + * The currently selected text + */ + selectedText: string; + + /** + * The currently selected URL + */ + selectedUrl: string; + + /** The text */ + text: string; +} diff --git a/src/controls/richText/RichTextPropertyPane.module.scss b/src/controls/richText/RichTextPropertyPane.module.scss new file mode 100644 index 000000000..54fb554d7 --- /dev/null +++ b/src/controls/richText/RichTextPropertyPane.module.scss @@ -0,0 +1,108 @@ +@import '~office-ui-fabric-react/dist/sass/References.scss'; + +:export { + NeutralPrimary: $ms-color-neutralPrimary; +} + +.richTextPropertyPane { + .formattingPaneTitle { + background-attachment: scroll; + background-clip: border-box; + background-color: $ms-color-neutralPrimaryAlt; + background-image: none; + background-origin: padding-box; + background-position-x: 0%; + background-position-y: 0%; + background-repeat: repeat; + background-size: auto; + display: flex; + padding-bottom: 12px; + padding-left: 20px; + padding-right: 20px; + padding-top: 10px; + color: $ms-color-white; + font-family: "Segoe UI Web (West European)", Segoe UI, -apple-system, + BlinkMacSystemFont, Roboto, Helvetica Neue, sans-serif; + font-size: 21px; + font-weight: 100; + line-height: 25.2px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + .propertyPaneGroupContent { + padding: 0 20px 16px; + } + + .controlsInOneRow { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + } + + .propertyPaneClose { + margin-left: auto; + background-color: transparent; + border: none; + color: #fff; + cursor: pointer; + font-size: 20px; + padding: 0; + min-width: 0px; + } + + :global { + .ms-Panel-content { + padding-top: 0px; + padding-right: 0px; + padding-bottom: 16px; + padding-left: 0px; + } + + .ms-Panel-contentInner { + top: 67px; + } + } +} + +.propertyPaneButton { + width: 40px; + height: 40px; + padding: 0; + + &:hover { + background-color: $ms-color-neutralLight; + color: $ms-color-themePrimary; + } + + &:global(.is-checked) { + color: $ms-color-themePrimary; + } + + &:global(.is-disabled) { + background-color: #fff; + } +} + +.propertyPaneGroupField { + padding-top: 4px; + color: #333333; + word-wrap: break-word; +} + +.propertyPaneGroupHeaderNoAccordion { + font-size: 14px; + font-weight: 400; + font-weight: 600; + color: #333333; + padding-right: 0; + // padding-left: 20px; + text-align: left; + height: 40px; + line-height: 40px; + padding-top: 4px; + width: 300px; + text-overflow: ellipsis; + overflow: hidden; +} diff --git a/src/controls/richText/RichTextPropertyPane.tsx b/src/controls/richText/RichTextPropertyPane.tsx new file mode 100644 index 000000000..fefd5b5de --- /dev/null +++ b/src/controls/richText/RichTextPropertyPane.tsx @@ -0,0 +1,606 @@ +import * as React from 'react'; + +import { IRichTextPropertyPaneProps, IRichTextPropertyPaneState } from './RichTextPropertyPane.types'; +import styles from './RichTextPropertyPane.module.scss'; +import { IconButton } from 'office-ui-fabric-react/lib/Button'; +import * as strings from 'ControlStrings'; +import { Panel, PanelType } from 'office-ui-fabric-react/lib/Panel'; +import { TooltipHost } from 'office-ui-fabric-react/lib/Tooltip'; +import { Dropdown, IDropdownOption } from 'office-ui-fabric-react/lib/Dropdown'; +import RteColorPicker from './RteColorPicker'; +import { ThemeColorHelper } from '../../common/utilities/ThemeColorHelper'; + +export default class RichTextPropertyPane extends React.Component { + + constructor(props: IRichTextPropertyPaneProps) { + super(props); + + this.state = { + formats: {} + }; + } + + public componentDidUpdate(prevProps: IRichTextPropertyPaneProps, prevState: IRichTextPropertyPaneState): void { + + // if we're just opening, sync the format choices with the current selection + if (!prevProps.isOpen && this.props.isOpen) { + const quill = this.props.editor; + if (quill === undefined) { + return; + } + + const range = quill.getSelection(); + this.onChangeSelection(range, undefined, undefined); + } + } + + public render(): React.ReactElement { + return ( + +
+
+
+
+ {this._renderActionsGroup()} + {this._renderFontStylesGroup()} + {this._renderFontSizesGroup()} + {this._renderInlineStylesGroup()} + {this._renderColorStylesGroup()} +
+
+
+
{strings.ParagraphSectionTitle}
+ {this._renderAlignmentStylesGroup()} + {this._renderListStylesGroup()} +
+
+
{strings.HyperlinkSectionTitle}
+ {this._renderHyperlinkStylesGroup()} +
+
+
+
+ ); + } + + public onChangeSelection = (range, oldRange?, source?) => { + const quill = this.props.editor; + if (quill === undefined || range === undefined) { + return; + } + + if (range) { + const formats = quill.getFormat(range); + this.setState({ + formats + }); + } + } + + private _renderActionsGroup = (): JSX.Element => { + return
+
+
+ + this._handleUndo()} + className={styles.propertyPaneButton} + aria-describedby="undo-propertyPaneButton" + iconProps={{ + iconName: 'Undo', + style: { + fontSize: '20px' + } + }} /> + + + this._handleRedo()} + className={styles.propertyPaneButton} + aria-describedby="redo-propertyPaneButton" + iconProps={{ + iconName: 'Redo', + style: { + fontSize: '20px' + } + }} /> + + + this._handleClearFormatting()} + className={styles.propertyPaneButton} + aria-describedby="clearFormatting-button-propertyPaneButton" + iconProps={{ + iconName: 'ClearFormatting', + style: { + fontSize: '20px' + } + }} /> + +
+
+
; + } + + private _renderFontStylesGroup = (): JSX.Element => { + const selectedHeader = this.state.formats!.header ? this.state.formats!.header : 0; + + return
+ this._onChangeHeading(item)} + /> +
; + } + + private _renderFontSizesGroup = (): JSX.Element => { + // get the selected header + const selectedSize = this.state.formats!.size ? this.state.formats!.size : 'large'; + + return
+ this._onChangeSize(item)} + /> +
; + } + + private _renderInlineStylesGroup = (): JSX.Element => { + return
+
+
+ + this._applyFormat('bold', !this.state.formats!.bold)} + className={styles.propertyPaneButton} + aria-describedby="bold-propertyPaneButton" + iconProps={{ + iconName: 'Bold', + style: { + fontSize: '20px' + } + }} /> + + + this._applyFormat('italic', !this.state.formats!.italic)} + className={styles.propertyPaneButton} + aria-describedby="italic-propertyPaneButton" + iconProps={{ + iconName: 'Italic', + style: { + fontSize: '20px' + } + }} /> + + + this._applyFormat('underline', !this.state.formats!.underline)} + className={styles.propertyPaneButton} + aria-describedby="underline-propertyPaneButton" + iconProps={{ + iconName: 'Underline', + style: { + fontSize: '20px' + } + }} /> + + + this._applyFormat('strike', !this.state.formats!.strike)} + className={styles.propertyPaneButton} + aria-describedby="strikethrough-propertyPaneButton" + iconProps={{ + iconName: 'Strikethrough', + style: { + fontSize: '20px' + } + }} /> + + + this._applyFormat('script', this.state.formats!.script === 'super' ? '' : 'super')} + className={styles.propertyPaneButton} + aria-describedby="superscript-propertyPaneButton" + iconProps={{ + iconName: 'Superscript', + style: { + fontSize: '20px' + } + }} /> + + + this._applyFormat('script', this.state.formats!.script === 'sub' ? '' : 'sub')} + className={styles.propertyPaneButton} + aria-describedby="subscript-propertyPaneButton" + iconProps={{ + iconName: 'Subscript', + style: { + fontSize: '20px' + } + }} /> + +
+
+
; + } + + private _renderColorStylesGroup = (): JSX.Element => { + const color: string = this.state.formats.color || ThemeColorHelper.GetThemeColor(styles.NeutralPrimary); + const backgroundColor: string = this.state.formats.background || "rgba(0, 0, 0, 0)"; + return
+
+
+ this._handleFillColorChanged(fillColor)} + switchToDefaultColor={() => this._handleFillColorChanged(undefined)} + /> + this._handleHighlightColorChanged(highlightColor)} + switchToDefaultColor={() => this._handleHighlightColorChanged(undefined)} + previewColor={backgroundColor} + defaultButtonLabel={strings.NoColorHighlightColor} + selectedColor={backgroundColor} + id="highlightColor-propertyPaneButton" + /> +
+
+
; + } + + private _handleFillColorChanged = (color: string) => { + this._applyFormat('color', color); + } + + private _handleHighlightColorChanged = (color: string) => { + this._applyFormat('background', color); + } + + private _renderAlignmentStylesGroup = (): JSX.Element => { + return
+
+
+ + this._applyFormat('align', 'left')} + className={styles.propertyPaneButton} + aria-describedby="left-propertyPaneButton" + iconProps={{ + iconName: 'AlignLeft', + style: { + fontSize: '20px' + } + }} /> + + + this._applyFormat('align', 'center')} + className={styles.propertyPaneButton} + aria-describedby="center-propertyPaneButton" + iconProps={{ + iconName: 'AlignCenter', + style: { + fontSize: '20px' + } + }} /> + + + this._applyFormat('align', 'right')} + className={styles.propertyPaneButton} + aria-describedby="right-propertyPaneButton" + iconProps={{ + iconName: 'AlignRight', + style: { + fontSize: '20px' + } + }} /> + + + this._applyFormat('align', 'justify')} + className={styles.propertyPaneButton} + aria-describedby="justify-propertyPaneButton" + iconProps={{ + iconName: 'AlignJustify', + style: { + fontSize: '20px' + } + }} /> + + + this._applyFormat('script', this.state.formats!.script === 'super' ? '' : 'super')} + className={styles.propertyPaneButton} + aria-describedby="increaseindent-propertyPaneButton" + iconProps={{ + iconName: 'IncreaseIndentLegacy', + style: { + fontSize: '20px' + } + }} /> + + + this._applyFormat('script', this.state.formats!.script === 'sub' ? '' : 'sub')} + className={styles.propertyPaneButton} + aria-describedby="decreaseindent-propertyPaneButton" + iconProps={{ + iconName: 'DecreaseIndentLegacy', + style: { + fontSize: '20px' + } + }} /> + +
+
+
; + } + + private _renderListStylesGroup = (): JSX.Element => { + return
+
+
+ + this._applyFormat('list', 'bullet')} + className={styles.propertyPaneButton} + aria-describedby="bullet-propertyPaneButton" + iconProps={{ + iconName: 'BulletedList', + style: { + fontSize: '20px' + } + }} /> + + + this._applyFormat('list', 'ordered')} + className={styles.propertyPaneButton} + aria-describedby="ordered-propertyPaneButton" + iconProps={{ + iconName: 'NumberedList', + style: { + fontSize: '20px' + } + }} /> + +
+
+
; + } + + private _renderHyperlinkStylesGroup = (): JSX.Element => { + return
+
+
+ + this.props.onLink()} + className={styles.propertyPaneButton} + aria-describedby="link-propertyPaneButton" + iconProps={{ + iconName: 'Link', + style: { + fontSize: '20px' + } + }} /> + + + this._applyFormat('link', false)} + className={styles.propertyPaneButton} + aria-describedby="unlink-propertyPaneButton" + iconProps={{ + iconName: 'RemoveLink', + style: { + fontSize: '20px' + } + }} /> + +
+
+
; + } + + private _onChangeHeading = (item: IDropdownOption): void => { + const newHeadingValue = item.key === 0 ? '' : item.key.toString(); + this._applyFormat("header", newHeadingValue); + } + + private _onChangeSize = (item: IDropdownOption): void => { + const newSizeValue = item.key === 0 ? '' : item.key.toString(); + this._applyFormat("size", newSizeValue); + } + + private _applyFormat(name: string, value: any) { + const quill = this.props.editor; + quill.format(name, value); + setTimeout( + () => { + this.onChangeSelection(quill.getSelection()); + }, + 100 + ); + } + + private _handleUndo = (): void => { + const quill = this.props.editor; + quill!.getModule("history")!.undo(); + setTimeout( + () => { + this.onChangeSelection(quill.getSelection()); + }, + 100 + ); + } + + private _handleClearFormatting = (): void => { + const quill = this.props.editor; + var range = quill.getSelection(); + if (range) { + if (range.length > 0) { + quill.removeFormat(range.index, range.length); + setTimeout( + () => { + this.onChangeSelection(quill.getSelection()); + }, + 100 + ); + } + } + } + + private _handleRedo = (): void => { + const quill = this.props.editor; + quill!.getModule("history")!.redo(); + setTimeout( + () => { + this.onChangeSelection(quill.getSelection()); + }, + 100 + ); + } + + private _handleRenderNavigation = (): JSX.Element => { + return ( + + ); + } +} diff --git a/src/controls/richText/RichTextPropertyPane.types.ts b/src/controls/richText/RichTextPropertyPane.types.ts new file mode 100644 index 000000000..129564945 --- /dev/null +++ b/src/controls/richText/RichTextPropertyPane.types.ts @@ -0,0 +1,13 @@ +import ReactQuill, { Quill } from 'react-quill'; + +export interface IRichTextPropertyPaneProps { + className?: string; + editor: Quill; + isOpen: boolean; + onClose: () => void; + onLink: () => void; +} + +export interface IRichTextPropertyPaneState { + formats: any; +} diff --git a/src/controls/richText/RteColorPicker.module.scss b/src/controls/richText/RteColorPicker.module.scss new file mode 100644 index 000000000..983eb664a --- /dev/null +++ b/src/controls/richText/RteColorPicker.module.scss @@ -0,0 +1,150 @@ +@import '~office-ui-fabric-react/dist/sass/References.scss'; + +:export { + ThemeColorDarker: $ms-color-themeDarker; + ThemeColorDark: $ms-color-themeDark; + ThemeColorDarkAlt: $ms-color-themeDarkAlt; + ThemeColorPrimary: $ms-color-themePrimary; + ThemeColorSecondary: $ms-color-themeSecondary; + ThemeColorTertiary: $ms-color-themeTertiary; + ThemeColorNeutralSecondary:$ms-color-neutralSecondary; + ThemeColorNeutralPrimaryAlt: $ms-color-neutralPrimaryAlt; + ThemeColorNeutralPrimary: $ms-color-neutralPrimary; + ThemeColorNeutralDark:$ms-color-neutralDark +} + +.colorPickerButton { + background: 0 0; + padding-left: 4px; + padding-right: 12px; + background-color: #ffffff; +} + +.previewSvg { + width: 20px; + height: 20px; + + &.border { + border: 1px solid #000; + } +} + +.previewRectangle { + width: 100%; + height: 100%; +} + +.buttonLabel { + padding-left: 10px; +} + +.previewIcon { + padding-left: 7px; + font-size: 7px; + padding-top: 8px; +} + +.pickerCallout { + width: 166px; + &:global(.ms-Callout-main) { + background-color: rgb(255, 255, 255); + overflow-x: hidden; + overflow-y: auto; + position: relative; + } +} + +.defaultSvg { + padding: 2px; + &.fillThemeColor { + fill: #333; + border: none; + } + + &.border { + border: 1px solid #000; + } + + &.fillDefaultColor { + fill: #fff; + } +} + +.pickerLabel { + display: block; + margin-left: 6px; +} + +.focusedContainer { + clear: both; + display: block; + min-width: 180px; +} + +.tableRoot { + padding-top: 2px; + padding-right: 2px; + padding-bottom: 2px; + padding-left: 2px; + outline: none; + display: table; + border-collapse: separate; + border-spacing: 2px; + border-color: grey; +} + +.tableCell { + padding-top: 0px; + padding-right: 0px; + padding-bottom: 0px; + padding-left: 0px; +} + +.colorCell { + position: relative; + font-family: "Segoe UI", "Segoe UI Web (West European)", "Segoe UI", + -apple-system, BlinkMacSystemFont, Roboto, "Helvetica Neue", sans-serif; + -webkit-font-smoothing: antialiased; + font-size: 14px; + font-weight: 400; + box-sizing: border-box; + display: inline-block; + text-align: center; + cursor: pointer; + vertical-align: top; + padding-top: 0px; + padding-right: 0px; + padding-bottom: 0px; + padding-left: 0px; + height: 40px; + color: rgb(51, 51, 51); + user-select: none; + outline: transparent; + border-width: 1px; + border-style: solid; + border-color: transparent; + border-image: initial; + text-decoration: none; + border-radius: 0px; + overflow: visible; + background: transparent; + + & .svg { + width: 20px; + height: 20px; + padding-top: 4px; + padding-right: 4px; + padding-bottom: 4px; + padding-left: 4px; + box-sizing: content-box; + &:hover, &.selected { + box-shadow: rgb(150, 150, 150) 0px 0px 0px 1px; + width: 12px; + height: 12px; + border-width: 4px; + border-style: solid; + border-image: initial; + border-color: rgb(200, 200, 200); + } + } +} diff --git a/src/controls/richText/RteColorPicker.tsx b/src/controls/richText/RteColorPicker.tsx new file mode 100644 index 000000000..0dd87f6e2 --- /dev/null +++ b/src/controls/richText/RteColorPicker.tsx @@ -0,0 +1,414 @@ +import * as React from 'react'; +import styles from './RteColorPicker.module.scss'; +import { css } from 'office-ui-fabric-react/lib/Utilities'; +import { IRteColorPickerProps, IRteColorPickerState } from './RteColorPicker.types'; +import { DefaultButton } from 'office-ui-fabric-react/lib/Button'; +import { TooltipHost } from 'office-ui-fabric-react/lib/Tooltip'; +import { Icon } from 'office-ui-fabric-react/lib/Icon'; +import { Callout } from 'office-ui-fabric-react/lib/Callout'; +import SwatchColorPickerGroup from './SwatchColorPickerGroup'; +import { ISwatchColor } from './SwatchColorPickerGroup.types'; +import * as strings from 'ControlStrings'; +import { ThemeColorHelper } from '../../common/utilities/ThemeColorHelper'; + +export default class RteColorPicker extends React.Component { + private _wrapperRef: any = undefined; + + constructor(props: IRteColorPickerProps) { + super(props); + + this.state = { + isCalloutVisible: false + }; + } + + public render(): React.ReactElement { + const { + buttonLabel, + defaultButtonLabel, + fillThemeColor, + id, + previewColor + } = this.props; + return ( +
+
+ + this._handleColorChanged(previewColor)} + > + + + +
{buttonLabel}
+ +
+
+
+ +
+ ); + } + + private _handleSwitchToDefault = () => { + this.setState({ isCalloutVisible: !this.state.isCalloutVisible }); + this.props.switchToDefaultColor(); + } + private _handleColorChanged = (color: string) => { + this.setState({ isCalloutVisible: !this.state.isCalloutVisible }); + this.props.onColorChanged(color); + } + + private _getSwatchColorPickerGroup = (pickerGroup: string) => { + let groupName: string = undefined; + switch (pickerGroup) { + case "themeColors": + groupName = strings.ThemeColorsGroupName; + break; + case "highlightColors": + groupName = strings.HighlightColorsGroupName; + break; + default: + groupName = strings.HighlightColorsGroupName; + break; + } + + let groupColors: ISwatchColor[] = []; + switch (pickerGroup) { + case "themeColors": + groupColors = [ + { + color: ThemeColorHelper.GetThemeColor(styles.ThemeColorDarker), + id: "#1c561c", + label: strings.ThemeColorDarker + }, + { + color: ThemeColorHelper.GetThemeColor(styles.ThemeColorDark), + id: "#267426", + label: strings.ThemeColorDark + }, + { + color: ThemeColorHelper.GetThemeColor(styles.ThemeColorDarkAlt), + id: "#2d8a2d", + label: strings.ThemeColorDarkAlt + }, + { + color: ThemeColorHelper.GetThemeColor(styles.ThemeColorPrimary), + id: "#339933", + label: strings.ThemeColorPrimary + }, + { + color: ThemeColorHelper.GetThemeColor(styles.ThemeColorSecondary), + id: "#44a544", + label: strings.ThemeColorSecondary + }, + { + color: ThemeColorHelper.GetThemeColor(styles.ThemeColorTertiary), + id: "#a6a6a6", + label: strings.ThemeColorTertiary + }, + { + color: ThemeColorHelper.GetThemeColor(styles.ThemeColorNeutralSecondary), + id: "#666666", + label: strings.ThemeColorNeutralSecondary + }, + { + color: ThemeColorHelper.GetThemeColor(styles.ThemeColorNeutralPrimaryAlt), + id: "#3c3c3c", + label: strings.ThemeColorNeutralPrimaryAlt + }, + { + color: ThemeColorHelper.GetThemeColor(styles.ThemeColorNeutralPrimary), + id: "#333333", + label: strings.ThemeColorNeutralPrimary + }, + { + color: ThemeColorHelper.GetThemeColor(styles.ThemeColorNeutralDark), + id: "#212121", + label: strings.ThemeColorNeutralDark + } + ]; + break; + case "highlightColors": + groupColors = [ + { + color: + "#FFFF00", + id: + "#FFFF00", + label: + strings.HighlightColorYellow + }, + { + color: + "#00FF00", + id: + "#00FF00", + label: + strings.HighlightColorGreen + }, + { + color: + "#00FFFF", + id: + "#00FFFF", + label: + strings.HighlightColorAqua + }, + { + color: + "#FF00FF", + id: + "#FF00FF", + label: + strings.HighlightColorMagenta + }, + { + color: + "#0000FF", + id: + "#0000FF", + label: + strings.HighlightColorBlue + }, + { + color: + "#FF0000", + id: + "#FF0000", + label: + strings.HighlightColorRed + }, + { + color: + "#000080", + id: + "#000080", + label: + strings.HighlightColorDarkblue + }, + { + color: + "#008080", + id: + "#008080", + label: + strings.HighlightColorTeal + }, + { + color: + "#008000", + id: + "#008000", + label: + strings.HighlightColorDarkgreen + }, + { + color: + "#800080", + id: + "#800080", + label: + strings.HighlightColorPurple + }, + { + color: + "#800000", + id: + "#800000", + label: + strings.HighlightColorMaroon + }, + { + color: + "#808000", + id: + "#808000", + label: + strings.HighlightColorGold + }, + { + color: + "#808080", + id: + "#808080", + label: + strings.HighlightColorDarkgrey + }, + { + color: + "#C0C0C0", + id: + "#C0C0C0", + label: + strings.HighlightColorGrey + }, + { + color: + "#000000", + id: + "#000000", + label: + strings.HighlightColorBlack + } + ]; + break; + default: + groupColors = [ + { + color: + "#a80000", + id: + "#a80000", + label: + strings.StandardColorDarkred + }, + { + color: + "#e81123", + id: + "#e81123", + label: + strings.StandardColorRed + }, + { + color: + "#ffb900", + id: + "#ffb900", + label: + strings.StandardColorOrange + }, + { + color: + "#fff100", + id: + "#fff100", + label: + strings.StandardColorYellow + }, + { + color: + "#bad80a", + id: + "#bad80a", + label: + strings.StandardColorLightgreen + }, + { + color: + "#107c10", + id: + "#107c10", + label: + strings.StandardColorGreen + }, + { + color: + "#00bcf2", + id: + "#00bcf2", + label: + strings.StandardColorLightblue + }, + { + color: + "#0078d4", + id: + "#0078d4", + label: + strings.StandardColorBlue + }, + { + color: + "#002050", + id: + "#002050", + label: + strings.StandardColorDarkblue + }, + { + color: + "#5c2d91", + id: + "#5c2d91", + label: + strings.StandardColorPurple + } + ]; + break; + } + + return ( this._handleColorChanged(color)} + groupColors={groupColors} + selectedColor={this.props.selectedColor} + />); + } + + private _linkWrapper = (e: any) => { + this._wrapperRef = e; + } +} + + + diff --git a/src/controls/richText/RteColorPicker.types.ts b/src/controls/richText/RteColorPicker.types.ts new file mode 100644 index 000000000..39de4b32f --- /dev/null +++ b/src/controls/richText/RteColorPicker.types.ts @@ -0,0 +1,15 @@ +export interface IRteColorPickerProps { + id: string; + buttonLabel: string; + colorPickerGroups: string[]; + defaultButtonLabel?: string; + fillThemeColor?: boolean; + onColorChanged: (string) => void; + previewColor: string; + selectedColor: string; + switchToDefaultColor: () => void; +} + +export interface IRteColorPickerState { + isCalloutVisible: boolean; +} diff --git a/src/controls/richText/SwatchColorPickerGroup.tsx b/src/controls/richText/SwatchColorPickerGroup.tsx new file mode 100644 index 000000000..ebfcd1d25 --- /dev/null +++ b/src/controls/richText/SwatchColorPickerGroup.tsx @@ -0,0 +1,69 @@ +import * as React from 'react'; +import styles from './RteColorPicker.module.scss'; +import { css } from 'office-ui-fabric-react/lib/Utilities'; +import { Label } from 'office-ui-fabric-react/lib/Label'; +import { ISwatchColorPickerGroupState, ISwatchColorPickerGroupProps, ISwatchColor } from './SwatchColorPickerGroup.types'; +import { FocusZone, FocusZoneDirection, FocusZoneTabbableElements } from 'office-ui-fabric-react/lib/FocusZone'; +import { ActionButton } from 'office-ui-fabric-react/lib/Button'; +import { chunk } from '@microsoft/sp-lodash-subset'; + +export default class SwatchColorPickerGroup extends React.Component { + public render(): React.ReactElement { + const colorRows = chunk(this.props.groupColors, 5); + return ( +
+ +
+ + + + { + colorRows.map((cr: ISwatchColor[], rowIndex: number) => { + return ( + {cr.map((gc: ISwatchColor, index: number) => { + return (); + + })} + ); + }) + } + + +
+ this._handleColorChanged(gc.color)} + > + + +
+
+ +
+
+ ); + } + + private _handleColorChanged(color: string) { + this.props.onColorChanged(color); + } +} diff --git a/src/controls/richText/SwatchColorPickerGroup.types.ts b/src/controls/richText/SwatchColorPickerGroup.types.ts new file mode 100644 index 000000000..75e22674e --- /dev/null +++ b/src/controls/richText/SwatchColorPickerGroup.types.ts @@ -0,0 +1,16 @@ +export interface ISwatchColorPickerGroupProps { + groupColors: ISwatchColor[]; + groupText: string; + onColorChanged: (string) => void; + selectedColor?: string; +} + +export interface ISwatchColorPickerGroupState { + +} + +export interface ISwatchColor { + color:string; + id: string; + label: string; +} diff --git a/src/controls/richText/index.ts b/src/controls/richText/index.ts new file mode 100644 index 000000000..ae7c5ed2b --- /dev/null +++ b/src/controls/richText/index.ts @@ -0,0 +1,2 @@ +export * from './RichText'; +export * from './RichText.types'; diff --git a/src/loc/en-us.ts b/src/loc/en-us.ts index e55fd647e..ffc334ae6 100644 --- a/src/loc/en-us.ts +++ b/src/loc/en-us.ts @@ -80,6 +80,88 @@ define([], () => { mapsSearchButtonText: 'Search', mapsTitlePrefix: 'Map of', - ListViewFilterLabel: "Filter the list" + ListViewFilterLabel: "Filter the list", + + HeaderNormalText: "Normal text", + HeaderH2: "Heading 1", + HeaderH3: "Heading 2", + HeaderH4: "Heading 3", + HeaderBlockQuote: "Pull quote", + AlignLeft: "Align left", + AlignCenter: "Center", + AlignRight: "Align right", + AlignJustify: "Justify", + ListBullet: "Bulleted list", + ListNumbered: "Numbered list", + StyleTitle: "Style", + BoldTitle: "Bold (Ctrl+B)", + ItalicTitle: "Italic (Ctrl+I)", + UnderlineTitle: "Underline (Ctrl+U)", + AlignTitle: "Align", + ListTitle: "List", + LinkTitle: "Hyperlink", + MoreTitle: "More", + FormattingPaneTitle: "Text formatting", + CloseButton: "Close", + InsertLinkTitle: "Insert link", + AddressFieldLabel: "Address", + TextToDisplayLabel: "Text to display", + SaveButtonLabel: "Save", + CancelButtonLabel: "Cancel", + RemoveLinkLabel: "Remove link", + ParagraphSectionTitle: "Paragraph", + HyperlinkSectionTitle: "Hyperlink", + UndoTitle: "Undo (Ctrl+Z)", + RedoTitle: "Redo (Ctrl+Y)", + ClearFormattingTitle: "Clear all formatting", + FontStyleTitle: "Font style", + FontSizeTitle: "Font size", + StrikethroughTitle: "Strikethrough", + SuperscriptTitle: "Superscript", + SubscriptTitle: "Subscript", + FontColorLabel: "Font Color", + AutomaticFontColor: "Automatic", + HighlightColorLabel: "Highlight color", + NoColorHighlightColor: "No color", + IncreaseIndentTitle: "Increase indent", + DecreaseIndentTitle: "Decrease indent", + ThemeColorsGroupName: "Theme colors", + HighlightColorsGroupName: "Highlight colors", + StandardColorsGroupName: "Standard colors", + ThemeColorDarker: "Theme darker", + ThemeColorDark: "Theme dark", + ThemeColorDarkAlt: "Theme dark alternate", + ThemeColorPrimary: "Theme primary", + ThemeColorSecondary: "Theme secondary", + ThemeColorTertiary: "Neutral tertiary", + ThemeColorNeutralSecondary: "Neutral secondary", + ThemeColorNeutralPrimaryAlt: "Neutral primary alternate", + ThemeColorNeutralPrimary: "Neutral primary", + ThemeColorNeutralDark: "Neutral dark", + HighlightColorYellow: "Yellow", + HighlightColorGreen: "Green", + HighlightColorAqua: "Aqua", + HighlightColorMagenta: "Magenta", + HighlightColorBlue: "Blue", + HighlightColorRed: "Red", + HighlightColorDarkblue: "Dark blue", + HighlightColorTeal: "Teal", + HighlightColorDarkgreen: "Dark green", + HighlightColorPurple: "Purple", + HighlightColorMaroon: "Maroon", + HighlightColorGold: "Gold", + HighlightColorDarkgrey: "Dark grey", + HighlightColorGrey: "Grey", + HighlightColorBlack: "Black", + StandardColorDarkred:"Dark red", + StandardColorRed:"Red", + StandardColorOrange:"Orange", + StandardColorYellow:"Yellow", + StandardColorLightgreen:"Light green", + StandardColorGreen:"Green", + StandardColorLightblue:"Light blue", + StandardColorBlue:"Blue", + StandardColorDarkblue:"Dark blue", + StandardColorPurple:"Purple" }; }); diff --git a/src/loc/mystrings.d.ts b/src/loc/mystrings.d.ts index 23b11b9fc..58be0a4f8 100644 --- a/src/loc/mystrings.d.ts +++ b/src/loc/mystrings.d.ts @@ -52,6 +52,89 @@ declare interface IControlStrings { mapsLoadingText: string; mapsSearchButtonText: string; mapsTitlePrefix: string; + + //RichText + HeaderNormalText: string; + HeaderH2: string; + HeaderH3: string; + HeaderH4: string; + HeaderBlockQuote: string; + AlignLeft: string; + AlignCenter: string; + AlignRight: string; + AlignJustify: string; + ListBullet: string; + ListNumbered: string; + StyleTitle: string; + BoldTitle: string; + ItalicTitle: string; + UnderlineTitle: string; + AlignTitle: string; + ListTitle: string; + LinkTitle: string; + MoreTitle: string; + FormattingPaneTitle: string; + CloseButton: string; + InsertLinkTitle: string; + AddressFieldLabel: string; + TextToDisplayLabel: string; + SaveButtonLabel: string; + CancelButtonLabel: string; + RemoveLinkLabel: string; + ParagraphSectionTitle: string; + HyperlinkSectionTitle: string; + UndoTitle: string; + RedoTitle: string; + ClearFormattingTitle: string; + FontStyleTitle: string; + FontSizeTitle: string; + StrikethroughTitle: string; + SuperscriptTitle: string; + SubscriptTitle: string; + FontColorLabel: string; + AutomaticFontColor: string; + HighlightColorLabel: string; + NoColorHighlightColor: string; + IncreaseIndentTitle: string; + DecreaseIndentTitle: string; + ThemeColorsGroupName: string; + HighlightColorsGroupName: string; + StandardColorsGroupName: string; + ThemeColorDarker: string; + ThemeColorDark: string; + ThemeColorDarkAlt: string; + ThemeColorPrimary: string; + ThemeColorSecondary: string; + ThemeColorTertiary: string; + ThemeColorNeutralSecondary: string; + ThemeColorNeutralPrimaryAlt: string; + ThemeColorNeutralPrimary: string; + ThemeColorNeutralDark: string; + HighlightColorYellow: string; + HighlightColorGreen: string; + HighlightColorAqua: string; + HighlightColorMagenta: string; + HighlightColorBlue: string; + HighlightColorRed: string; + HighlightColorDarkblue: string; + HighlightColorTeal: string; + HighlightColorDarkgreen: string; + HighlightColorPurple: string; + HighlightColorMaroon: string; + HighlightColorGold: string; + HighlightColorDarkgrey: string; + HighlightColorGrey: string; + HighlightColorBlack: string; + StandardColorDarkred: string; + StandardColorRed: string; + StandardColorOrange: string; + StandardColorYellow: string; + StandardColorLightgreen: string; + StandardColorGreen: string; + StandardColorLightblue: string; + StandardColorBlue: string; + StandardColorDarkblue: string; + StandardColorPurple: string; } declare module 'ControlStrings' { From 404713fae7639d59fdea6c1b9ed45ac8c33fc84d Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Thu, 28 Mar 2019 13:31:39 +0100 Subject: [PATCH 18/42] Updates + code refactoring on the RichText control --- docs/documentation/docs/controls/RichText.md | 36 +- package-lock.json | 302 +++--- package.json | 2 +- src/controls/richText/RichText.tsx | 909 ++++++++--------- src/controls/richText/RichText.types.ts | 29 +- .../richText/RichTextPropertyPane.tsx | 964 +++++++++--------- .../richText/RichTextPropertyPane.types.ts | 2 +- src/controls/richText/RteColorPicker.tsx | 396 +++---- .../richText/SwatchColorPickerGroup.tsx | 71 +- .../controlsTest/components/ControlsTest.tsx | 3 + 10 files changed, 1313 insertions(+), 1401 deletions(-) diff --git a/docs/documentation/docs/controls/RichText.md b/docs/documentation/docs/controls/RichText.md index 6eb98e1c1..24c3ad1ea 100644 --- a/docs/documentation/docs/controls/RichText.md +++ b/docs/documentation/docs/controls/RichText.md @@ -16,31 +16,29 @@ import { RichText } from "@pnp/spfx-controls-react/lib/RichText"; - The simplest way to use the `RichText` control in your code is as follows: ```TypeScript - this.props.onChange(text)} - /> - +this.props.onChange(text)} +/> ``` - The `value` property should contain the HTML that you wish to display - The `onChange` handler will be called every time a user changes the text. For example, to have your web part store the rich text as it is updated, you would use the following code: ```TypeScript - private _onTextChange = (newText: string) => { - this.properties.myRichText = newText; - return newText; - } +private onTextChange = (newText: string) => { + this.properties.myRichText = newText; + return newText; +} ``` It is possible to use the `onChange` handler as users type -- for example, the following code replaces all instance of the word `bold` with bold text. ```TypeScript - private _onTextChange = (newText: string) => { - newText = newText.replace(" bold ", " bold "); - this.properties.description = newText; - return newText; - } +private onTextChange = (newText: string) => { + newText = newText.replace(" bold ", " bold "); + this.properties.description = newText; + return newText; +} ``` ## Implementation @@ -51,6 +49,14 @@ The RichText control can be configured with the following properties: | ---- | ---- | ---- | ---- | | className | string | no | The custom CSS class to apply to the RichText control. | | isEditMode | boolean | no | `true` indicates that users will be able to edit the content of the RichText control. `false` will display the rich text as read-only. | +| styleOptions | StyleOptions | no | Define the styles you want to show or hide for the rich text editor | +| value | string | no | Sets the rich text to display in the RichText control. | +| onChange | (text: string) => string | no | onChange handler for the RichText control. The function must return a `string` containing the rich text to display in the RichText control. | + +`StyleOptions` interface + +| Property | Type | Required | Description | +| ---- | ---- | ---- | ---- | | showAlign | boolean | no | Indicates whether to show the **Align** toolbar button or not. Default value is `true` | | showBold | boolean | no | Indicates whether to show the **Bold** toolbar button or not. Default value is `true` | | showItalic | boolean | no | Indicates whether to show the **Italic** toolbar button or not. Default value is `true` | @@ -59,8 +65,6 @@ The RichText control can be configured with the following properties: | showMore | boolean | no | Indicates whether to show the **More** toolbar button or not. Note that this option is indenpendent from the other `show___` options. I.e.: Setting `showBold` to `false` will disable the **Bold** toolbar, but will not disable it from the formatting pane. Default value is `true` | | showStyles | boolean | no | Indicates whether to show the **Headings** toolbar button or not. Note that this option is indenpendent from the other `show___` options. I.e.: Setting `showBold` to `false` will disable the **Bold** toolbar, but will not disable it from the formatting pane. Default value is `true` | | showUnderline | boolean | no | Indicates whether to show the **Underline** toolbar button or not. Note that this option is indenpendent from the other `show___` options. I.e.: Setting `showBold` to `false` will disable the **Bold** toolbar, but will not disable it from the formatting pane. Default value is `true` | -| value | string | no | Sets the rich text to display in the RichText control. | -| onChange | (text: string) => string | no | onChange handler for the RichText control. The function must return a `string` containing the rich text to display in the RichText control. | > Note that setting `showAlign`, `showBold`, `showItalic`, `showLink`, `showList`, `showStyles`, or `showUnderline` to `false` does *not* remove the user's ability to apply the button's associated formatting -- it only hides the toolbar option. If `showMore` is `true`, the options will remain available in the formatting pane. To prevent users from applying specific formats, use the `onChange` handler to parse the rich text and remove the formatting as desired. diff --git a/package-lock.json b/package-lock.json index 42694eefe..2f2048802 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@pnp/spfx-controls-react", - "version": "1.11.0", + "version": "1.12.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -308,7 +308,7 @@ "@uifabric/styling": { "version": "0.24.2", "resolved": "https://registry.npmjs.org/@uifabric/styling/-/styling-0.24.2.tgz", - "integrity": "sha512-DSxYDRalPTvfsZVWCkcAdKctR1lI7BcT1wFjKnccSbodMW8Ic8o8aS2U0KDUx/PcJNeBvqGfmr25n5176VeU9w==", + "integrity": "sha1-ZuKvsXvfj7tYGZZh+XOr+RoG5Y0=", "dev": true, "requires": { "@uifabric/utilities": ">=4.16.0 <5.0.0", @@ -320,7 +320,7 @@ "@uifabric/utilities": { "version": "4.16.0", "resolved": "https://registry.npmjs.org/@uifabric/utilities/-/utilities-4.16.0.tgz", - "integrity": "sha512-VKYqGYQf6x0xa3C/of+DiflOu4KjMu/OfRXzU0DUvLuZErFkr/SmddqJePwFh2npqlACSv54KwUMVP5Qd1Hsig==", + "integrity": "sha1-BRVMFFCbDZ/koixtryG93SxiEec=", "dev": true, "requires": { "@microsoft/load-themed-styles": "^1.7.2", @@ -331,7 +331,7 @@ "office-ui-fabric-react": { "version": "4.40.2-hotfix.1", "resolved": "https://registry.npmjs.org/office-ui-fabric-react/-/office-ui-fabric-react-4.40.2-hotfix.1.tgz", - "integrity": "sha512-LRP/LCm5LQ0df8D6/xabTMCIQl/s51Z0kF802J2FG2h7QQ40xYOvLPmo8SGHGv9YyzMoWLtEEGAVxQElMWKBHw==", + "integrity": "sha1-VWXHZIX8jSpni9o5EaGfOf5Ryg4=", "dev": true, "requires": { "@microsoft/load-themed-styles": "^1.7.2", @@ -386,7 +386,7 @@ "commander": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "integrity": "sha1-FXFS/R56bI2YpbcVzzdt+SgARWM=", "dev": true }, "lodash": { @@ -398,7 +398,7 @@ "uglify-js": { "version": "3.0.28", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.0.28.tgz", - "integrity": "sha512-0h/qGay016GG2lVav3Kz174F3T2Vjlz2v6HCt+WDQpoXfco0hWwF5gHK9yh88mUYvIC+N7Z8NT8WpjSp1yoqGA==", + "integrity": "sha1-lrhJXwJylEeHtYQ6FnmqMmZA1fc=", "dev": true, "requires": { "commander": "~2.11.0", @@ -597,7 +597,7 @@ "es6-promise": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.1.1.tgz", - "integrity": "sha512-OaU1hHjgJf+b0NzsxCg7NdIYERD6Hy/PEmFLTjw+b65scuisG3Kt4QoTvJ66BBkPZ581gr0kpoVzKnxniM8nng==", + "integrity": "sha1-iBHpCRXZoNujYnTwskLb2nj5ySo=", "dev": true }, "finalhandler": { @@ -681,7 +681,7 @@ "rimraf": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "integrity": "sha1-LtgVDSShbqhlHm1u8PR8QVjOejY=", "dev": true, "requires": { "glob": "^7.0.5" @@ -727,7 +727,7 @@ "uuid": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "integrity": "sha1-PdPT55Crwk17DToDT/q6vijrvAQ=", "dev": true } } @@ -949,7 +949,7 @@ "@uifabric/styling": { "version": "0.24.2", "resolved": "https://registry.npmjs.org/@uifabric/styling/-/styling-0.24.2.tgz", - "integrity": "sha512-DSxYDRalPTvfsZVWCkcAdKctR1lI7BcT1wFjKnccSbodMW8Ic8o8aS2U0KDUx/PcJNeBvqGfmr25n5176VeU9w==", + "integrity": "sha1-ZuKvsXvfj7tYGZZh+XOr+RoG5Y0=", "dev": true, "requires": { "@uifabric/utilities": ">=4.16.0 <5.0.0", @@ -961,7 +961,7 @@ "@uifabric/utilities": { "version": "4.16.0", "resolved": "https://registry.npmjs.org/@uifabric/utilities/-/utilities-4.16.0.tgz", - "integrity": "sha512-VKYqGYQf6x0xa3C/of+DiflOu4KjMu/OfRXzU0DUvLuZErFkr/SmddqJePwFh2npqlACSv54KwUMVP5Qd1Hsig==", + "integrity": "sha1-BRVMFFCbDZ/koixtryG93SxiEec=", "dev": true, "requires": { "@microsoft/load-themed-styles": "^1.7.2", @@ -972,7 +972,7 @@ "office-ui-fabric-react": { "version": "4.40.2-hotfix.1", "resolved": "https://registry.npmjs.org/office-ui-fabric-react/-/office-ui-fabric-react-4.40.2-hotfix.1.tgz", - "integrity": "sha512-LRP/LCm5LQ0df8D6/xabTMCIQl/s51Z0kF802J2FG2h7QQ40xYOvLPmo8SGHGv9YyzMoWLtEEGAVxQElMWKBHw==", + "integrity": "sha1-VWXHZIX8jSpni9o5EaGfOf5Ryg4=", "dev": true, "requires": { "@microsoft/load-themed-styles": "^1.7.2", @@ -1079,7 +1079,7 @@ "es6-promise": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.1.1.tgz", - "integrity": "sha512-OaU1hHjgJf+b0NzsxCg7NdIYERD6Hy/PEmFLTjw+b65scuisG3Kt4QoTvJ66BBkPZ581gr0kpoVzKnxniM8nng==", + "integrity": "sha1-iBHpCRXZoNujYnTwskLb2nj5ySo=", "dev": true } } @@ -1188,7 +1188,7 @@ "@uifabric/styling": { "version": "0.24.2", "resolved": "https://registry.npmjs.org/@uifabric/styling/-/styling-0.24.2.tgz", - "integrity": "sha512-DSxYDRalPTvfsZVWCkcAdKctR1lI7BcT1wFjKnccSbodMW8Ic8o8aS2U0KDUx/PcJNeBvqGfmr25n5176VeU9w==", + "integrity": "sha1-ZuKvsXvfj7tYGZZh+XOr+RoG5Y0=", "dev": true, "requires": { "@uifabric/utilities": ">=4.16.0 <5.0.0", @@ -1200,7 +1200,7 @@ "@uifabric/utilities": { "version": "4.16.0", "resolved": "https://registry.npmjs.org/@uifabric/utilities/-/utilities-4.16.0.tgz", - "integrity": "sha512-VKYqGYQf6x0xa3C/of+DiflOu4KjMu/OfRXzU0DUvLuZErFkr/SmddqJePwFh2npqlACSv54KwUMVP5Qd1Hsig==", + "integrity": "sha1-BRVMFFCbDZ/koixtryG93SxiEec=", "dev": true, "requires": { "@microsoft/load-themed-styles": "^1.7.2", @@ -1211,7 +1211,7 @@ "office-ui-fabric-react": { "version": "4.40.2-hotfix.1", "resolved": "https://registry.npmjs.org/office-ui-fabric-react/-/office-ui-fabric-react-4.40.2-hotfix.1.tgz", - "integrity": "sha512-LRP/LCm5LQ0df8D6/xabTMCIQl/s51Z0kF802J2FG2h7QQ40xYOvLPmo8SGHGv9YyzMoWLtEEGAVxQElMWKBHw==", + "integrity": "sha1-VWXHZIX8jSpni9o5EaGfOf5Ryg4=", "dev": true, "requires": { "@microsoft/load-themed-styles": "^1.7.2", @@ -1260,7 +1260,7 @@ "@uifabric/styling": { "version": "0.24.2", "resolved": "https://registry.npmjs.org/@uifabric/styling/-/styling-0.24.2.tgz", - "integrity": "sha512-DSxYDRalPTvfsZVWCkcAdKctR1lI7BcT1wFjKnccSbodMW8Ic8o8aS2U0KDUx/PcJNeBvqGfmr25n5176VeU9w==", + "integrity": "sha1-ZuKvsXvfj7tYGZZh+XOr+RoG5Y0=", "dev": true, "requires": { "@uifabric/utilities": ">=4.16.0 <5.0.0", @@ -1272,7 +1272,7 @@ "@uifabric/utilities": { "version": "4.16.0", "resolved": "https://registry.npmjs.org/@uifabric/utilities/-/utilities-4.16.0.tgz", - "integrity": "sha512-VKYqGYQf6x0xa3C/of+DiflOu4KjMu/OfRXzU0DUvLuZErFkr/SmddqJePwFh2npqlACSv54KwUMVP5Qd1Hsig==", + "integrity": "sha1-BRVMFFCbDZ/koixtryG93SxiEec=", "dev": true, "requires": { "@microsoft/load-themed-styles": "^1.7.2", @@ -1283,7 +1283,7 @@ "office-ui-fabric-react": { "version": "4.40.2-hotfix.1", "resolved": "https://registry.npmjs.org/office-ui-fabric-react/-/office-ui-fabric-react-4.40.2-hotfix.1.tgz", - "integrity": "sha512-LRP/LCm5LQ0df8D6/xabTMCIQl/s51Z0kF802J2FG2h7QQ40xYOvLPmo8SGHGv9YyzMoWLtEEGAVxQElMWKBHw==", + "integrity": "sha1-VWXHZIX8jSpni9o5EaGfOf5Ryg4=", "dev": true, "requires": { "@microsoft/load-themed-styles": "^1.7.2", @@ -1340,7 +1340,7 @@ "@pnp/telemetry-js": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@pnp/telemetry-js/-/telemetry-js-1.0.0.tgz", - "integrity": "sha512-7Lr22EB6DgB8MZi0WDuou8VuXru3wHdiOQPenB2B2gdhp7bJj2ijN9vTiqF8aL1nh80uJxIyX269Ix/PSnJC7g==", + "integrity": "sha1-LtP5nhIiqibrf8c2DEtERJXiqzg=", "requires": { "whatwg-fetch": "2.0.4" }, @@ -1355,13 +1355,13 @@ "@sindresorhus/is": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", - "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", + "integrity": "sha1-mgb08TfuhNffBGDB/bETX/psUP0=", "dev": true }, "@types/adal": { "version": "1.0.27", "resolved": "https://registry.npmjs.org/@types/adal/-/adal-1.0.27.tgz", - "integrity": "sha512-Dll0X5OdCgnqMhp/bH/XSjFpn1putDI9OVlw+LgmxOjZWKUQXOpHkGWbARNReeYBWmaEvWBVWkZG4yhfcCeOZQ==", + "integrity": "sha1-IL6zJsFDRRrkYsWvayUaAU/p4TI=", "dev": true, "requires": { "@types/angular": "*" @@ -1394,7 +1394,7 @@ "@types/chalk": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-2.2.0.tgz", - "integrity": "sha512-1zzPV9FDe1I/WHhRkf9SNgqtRJWZqrBWgu7JGveuHmmyR9CnAPCie2N/x+iHrgnpYBIcCJWHBoMRv2TRWktsvw==", + "integrity": "sha1-t/bkRvRRECnujj9DB1+1tz+6oLo=", "dev": true, "requires": { "chalk": "*" @@ -1403,7 +1403,7 @@ "@types/chart.js": { "version": "2.7.40", "resolved": "https://registry.npmjs.org/@types/chart.js/-/chart.js-2.7.40.tgz", - "integrity": "sha512-yC8Ff5vsHFTClGCWXoAmNCh33cNYfP2/yFANBLjLiso4jTKsLfQ0KQuBEuKxOWTRoOSLyT6v+ZYcvz0uonvvsA==" + "integrity": "sha1-ng+/6MIf7PHRVJZZ7eABKE3dY20=" }, "@types/cheerio": { "version": "0.22.7", @@ -1420,7 +1420,7 @@ "@types/enzyme": { "version": "2.8.7", "resolved": "https://registry.npmjs.org/@types/enzyme/-/enzyme-2.8.7.tgz", - "integrity": "sha512-/N2tCT2RIJwpPuC+98stnUXQmQ1w6dSJKW0hXYfk+xyVPyapAh4WqS2ZT0/MbX0pjkOg8qdax/u/yXdsGp/BeQ==", + "integrity": "sha1-mZ4PIgQSNCAgqCef89fu0rK0thg=", "dev": true, "requires": { "@types/cheerio": "*", @@ -1535,7 +1535,7 @@ "@types/log4js": { "version": "2.3.5", "resolved": "https://registry.npmjs.org/@types/log4js/-/log4js-2.3.5.tgz", - "integrity": "sha512-SwF8LkSHqHy9A8GQ67NAYJiGl8zzP4Qtx65Wa+IOxDGdMHxKeoQZjg7m2M1erIT6VK0DYHpu2aTbdLkdkuMHjw==", + "integrity": "sha1-TR5W2lPTwYIMCOnNUJLmjD4egi8=", "dev": true, "requires": { "log4js": "*" @@ -1553,13 +1553,13 @@ "@types/mime": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.0.tgz", - "integrity": "sha512-A2TAGbTFdBw9azHbpVd+/FkdW2T6msN1uct1O9bH3vTerEHKZhTXJUQXy+hNq1B0RagfU8U+KBdqiZpxjhOUQA==", + "integrity": "sha1-WnMG42fFObn2VDSZ3o3VGfrDeos=", "dev": true }, "@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "integrity": "sha1-PcoOPzOyAPx9ETnAzZbBJoyt/Z0=", "dev": true }, "@types/mocha": { @@ -1609,7 +1609,7 @@ "@types/react": { "version": "15.0.38", "resolved": "https://registry.npmjs.org/@types/react/-/react-15.0.38.tgz", - "integrity": "sha512-CkRB27L/kMDu7K20U0V7BwYK9/kPd9Im6Jlxv2vAEolYBvQy6JrSpPJsbZXtOk4MoDUomkct8Q7PNBUSLd0fmg==" + "integrity": "sha1-av6jGp/mYwSvR0EGujct2rpEmZU=" }, "@types/react-addons-shallow-compare": { "version": "0.14.17", @@ -1677,7 +1677,7 @@ "@types/semver": { "version": "5.3.33", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.3.33.tgz", - "integrity": "sha512-UwrBgjsRS8BSsckIEdrAhIAmdh0MJidtKTvD3S6tpMq6qHLY3uGaNYcRDUjPxpF4hOAOEbMNSXhhfxmNHB1QNQ==", + "integrity": "sha1-WOu2yMSOFh4k+JAZFecYSQDTQfc=", "dev": true }, "@types/serve-static": { @@ -1693,7 +1693,7 @@ "@types/sinon": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-2.3.4.tgz", - "integrity": "sha512-Up/XbOme6tWemIR2lVquqUlUUXvMEk2AGNo5C20dSpFK6snRUOEvy2aZt/QD85F1PVesFx3quRIm0e5/Hh9cLA==", + "integrity": "sha1-KzqoLfx5Hu/x2XC2V6d+r/8omf8=", "dev": true }, "@types/tapable": { @@ -1731,7 +1731,7 @@ "@types/uuid": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.0.0.tgz", - "integrity": "sha512-CGaBAcUB4o+YTaUBZ2VfBc7PcIZXwHflZs4FDtr5Kk7MpAl0PVfH7W/VqoHH+OAG41d9YSCV8eWDfz/KKqVm+A==", + "integrity": "sha1-vpOxS8+X9ZwHmp5YdUlgte/ZRsM=", "dev": true, "requires": { "@types/node": "*" @@ -1749,7 +1749,7 @@ "@types/webpack": { "version": "3.0.10", "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-3.0.10.tgz", - "integrity": "sha512-Xjv1QuWFCVwjxnpcgcdvtR6G4w0tCUpV1Mi5+LPN8w89a/qu8NVbTm1zhD7ZWzvvjE5fMtYNchFHcbjV3u2jyg==", + "integrity": "sha1-HSfbB98yEJ+MiCU1tUeq5CUv1T4=", "dev": true, "requires": { "@types/node": "*", @@ -1766,7 +1766,7 @@ "@types/webpack-stream": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/@types/webpack-stream/-/webpack-stream-3.2.7.tgz", - "integrity": "sha512-s+i5OFlyHkZloE12E69yUMWjj1m9nwcy/E6KiVieNiroQltPX27XY6S67rwdn9bewSNlqM/z0z8xjJ1loAO5WQ==", + "integrity": "sha1-bJ46SokZES3hfm0TC/K+lNwjM5g=", "dev": true, "requires": { "@types/node": "*", @@ -1788,7 +1788,7 @@ "@uifabric/icons": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@uifabric/icons/-/icons-5.8.0.tgz", - "integrity": "sha512-EUhKxYlIPJshg4fQvCNTYSk0p7RhzEWeEAJBV4sao1SKmN0/pZBnkLbDqWjU5VUfdwZZYiIdaLRpM+pyzhniZw==", + "integrity": "sha1-+35EdqiOW26h0SEWP5JLvDWgKyg=", "requires": { "@uifabric/styling": ">=5.30.1 <6.0.0", "tslib": "^1.7.1" @@ -1797,7 +1797,7 @@ "@uifabric/merge-styles": { "version": "5.17.1", "resolved": "https://registry.npmjs.org/@uifabric/merge-styles/-/merge-styles-5.17.1.tgz", - "integrity": "sha512-4/EtO6Ns7kNtKxC+6InShwVQeNQEDT5H8Ex7m/i4OrT9i7csje4YwBQPkkpm31qJwEZEyD7bbAwyLezI63sLhg==", + "integrity": "sha1-kyWBcGkBHvtfQl4P0WOpddmhKjw=", "requires": { "tslib": "^1.7.1" } @@ -1986,7 +1986,7 @@ "anymatch": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "integrity": "sha1-VT3Lj5HjyImEXf26NMd3IbkLnXo=", "dev": true, "requires": { "micromatch": "^2.1.5", @@ -2087,7 +2087,7 @@ "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=", "dev": true }, "archy": { @@ -2162,7 +2162,7 @@ "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==", + "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", "dev": true }, "arr-union": { @@ -2198,7 +2198,7 @@ "array-slice": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "integrity": "sha1-42jqFfibxwaff/uJrsOmx9SsItQ=", "dev": true }, "array-union": { @@ -2274,7 +2274,7 @@ "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "integrity": "sha1-5gtrDo8wG9l+U3UhW9pAbIURjAs=", "dev": true }, "assign-symbols": { @@ -2641,7 +2641,7 @@ "base": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", "dev": true, "requires": { "cache-base": "^1.0.1", @@ -2723,7 +2723,7 @@ "big.js": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "integrity": "sha1-pfwpi4G54Nyi5FiCR4S2XFK6WI4=", "dev": true }, "binary-extensions": { @@ -2799,7 +2799,7 @@ "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=", "dev": true }, "body-parser": { @@ -2838,7 +2838,7 @@ "bowser": { "version": "1.9.4", "resolved": "https://registry.npmjs.org/bowser/-/bowser-1.9.4.tgz", - "integrity": "sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ==", + "integrity": "sha1-iQxYooE6nTJDcEM0+oG5alwVDJo=", "dev": true }, "boxen": { @@ -2996,7 +2996,7 @@ "browserify-zlib": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "integrity": "sha1-KGlFnZqjviRf6P4sofRuLn9U1z8=", "dev": true, "requires": { "pako": "~1.0.5" @@ -3033,7 +3033,7 @@ "buffer-alloc": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "integrity": "sha1-iQ3ZDZI6hz4I4Q5f1RpX5bfM4Ow=", "dev": true, "requires": { "buffer-alloc-unsafe": "^1.1.0", @@ -3043,7 +3043,7 @@ "buffer-alloc-unsafe": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "integrity": "sha1-vX3CauKXLQ7aJTvgYdupkjScGfA=", "dev": true }, "buffer-crc32": { @@ -3085,7 +3085,7 @@ "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", "dev": true, "requires": { "collection-visit": "^1.0.0", @@ -3129,7 +3129,7 @@ "normalize-url": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", - "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "integrity": "sha1-g1qdoVUfom9w6SMpBpojqmV01+Y=", "dev": true, "requires": { "prepend-http": "^2.0.0", @@ -3230,7 +3230,7 @@ "caw": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/caw/-/caw-2.0.1.tgz", - "integrity": "sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==", + "integrity": "sha1-bDygcfwZRyCIPC3F2psHS/x+npU=", "dev": true, "requires": { "get-proxy": "^2.0.0", @@ -3288,7 +3288,7 @@ "chart.js": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-2.7.3.tgz", - "integrity": "sha512-3+7k/DbR92m6BsMUYP6M0dMsMVZpMnwkUyNSAbqolHKsbIzH2Q4LWVEHHYq7v0fmEV8whXE0DrjANulw9j2K5g==", + "integrity": "sha1-zbYWGIML8hbciH4vexs8IotzxX4=", "requires": { "chartjs-color": "^2.1.0", "moment": "^2.10.2" @@ -3313,7 +3313,7 @@ "chartjs-color-string": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/chartjs-color-string/-/chartjs-color-string-0.5.0.tgz", - "integrity": "sha512-amWNvCOXlOUYxZVDSa0YOab5K/lmEhbFNKI55PWc4mlv28BDzA7zaoQTGxSBgJMHIW+hGX8YUrvw/FH4LyhwSQ==", + "integrity": "sha1-jTdS2Fgdhmh8Nb/iy4CsUhPOuME=", "requires": { "color-name": "^1.0.0" } @@ -3393,7 +3393,7 @@ "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", "dev": true, "requires": { "inherits": "^2.0.1", @@ -3403,7 +3403,7 @@ "clap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", - "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", + "integrity": "sha1-TzZ0WzIAhJJVf0ZBLWbVDLmbzlE=", "dev": true, "requires": { "chalk": "^1.1.3" @@ -3439,7 +3439,7 @@ "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==", + "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", "dev": true, "requires": { "arr-union": "^3.1.0", @@ -3774,7 +3774,7 @@ "color": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/color/-/color-3.1.0.tgz", - "integrity": "sha512-CwyopLkuRYO5ei2EpzpIh6LqJMt6Mt+jZhO5VI5f/wJLZriXQE32/SSqzmrh+QB+AZT81Cj8yv+7zwToW8ahZg==", + "integrity": "sha1-2On7CWcyh1d0yEv5IoFd8DCND/w=", "requires": { "color-convert": "^1.9.1", "color-string": "^1.5.2" @@ -3796,7 +3796,7 @@ "color-string": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "integrity": "sha1-ybvF8BtYtUkvPWhXRZy2WQziBMw=", "requires": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" @@ -3805,7 +3805,7 @@ "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==", + "integrity": "sha1-k4NDeaHMmgxh+C9S8NBDIiUb1aI=", "dev": true }, "colormin": { @@ -4000,7 +4000,7 @@ "config-chain": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", - "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", + "integrity": "sha1-D96NCRIA616AjK8l/mGMAvSOTvo=", "dev": true, "requires": { "ini": "^1.3.4", @@ -4119,7 +4119,7 @@ "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=", "dev": true }, "convert-source-map": { @@ -4179,7 +4179,7 @@ "cosmiconfig": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", - "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", + "integrity": "sha1-YXPOvVb6wELB9DkO33r2wHx8uJI=", "dev": true, "requires": { "is-directory": "^0.3.1", @@ -4304,7 +4304,7 @@ "crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "integrity": "sha1-OWz58xN/A+S45TLFj2mCVOAPgOw=", "dev": true, "requires": { "browserify-cipher": "^1.0.0", @@ -4340,7 +4340,7 @@ "css-in-js-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-2.0.1.tgz", - "integrity": "sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA==", + "integrity": "sha1-O0crOYeHKRtHz+PkT+z92ekUupk=", "dev": true, "requires": { "hyphenate-style-name": "^1.0.2", @@ -4628,7 +4628,7 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", "dev": true, "requires": { "ms": "2.0.0" @@ -4649,7 +4649,7 @@ "decomment": { "version": "0.8.8", "resolved": "https://registry.npmjs.org/decomment/-/decomment-0.8.8.tgz", - "integrity": "sha512-xVbmniKld/kjjmoHjT0Ex35aa16zw29WEzSAflBcMawjqDtZlrR6wkSwYV0mwJYytDz8JEAYia5Pl8IJRXdWLg==", + "integrity": "sha1-g9ES/VqBLc7MCCPCUyuxenKZX2I=", "dev": true, "requires": { "esprima": "^4.0.0" @@ -4691,7 +4691,7 @@ "decompress-tar": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", - "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", + "integrity": "sha1-cYy9P8sWIJcW5womuE57pFkuWvE=", "dev": true, "requires": { "file-type": "^5.2.0", @@ -4710,7 +4710,7 @@ "decompress-tarbz2": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", - "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", + "integrity": "sha1-MIKluIDqQEOBY0nzeLVsUWvho5s=", "dev": true, "requires": { "decompress-tar": "^4.1.0", @@ -4723,7 +4723,7 @@ "file-type": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", - "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", + "integrity": "sha1-5QzXXTVv/tTjBtxPW89Sp5kDqRk=", "dev": true } } @@ -4731,7 +4731,7 @@ "decompress-targz": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", - "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", + "integrity": "sha1-wJvDXE0R894J8tLaU+neI+fOHu4=", "dev": true, "requires": { "decompress-tar": "^4.1.1", @@ -4989,7 +4989,7 @@ "domain-browser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "integrity": "sha1-PTH1AZGmdJ3RN1p/Ui6CPULlTto=", "dev": true }, "domelementtype": { @@ -5029,7 +5029,7 @@ "download": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/download/-/download-7.0.0.tgz", - "integrity": "sha512-0Fe/CAjKycx12IG9We9gYlLP03BEcWTpttg7P5mwfOiQTg584kpuHqP7F61RkUJM+mfEdEU9TJonm0PJp5rQLw==", + "integrity": "sha1-hxHwkXSxHY3tFIQNGIHj0FGQGVw=", "dev": true, "requires": { "caw": "^2.0.1", @@ -5048,7 +5048,7 @@ "got": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", - "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", + "integrity": "sha1-HSP2Q5Dpf3dsrFLluTbl9RTS6Tc=", "dev": true, "requires": { "@sindresorhus/is": "^0.7.0", @@ -5244,7 +5244,7 @@ "engine.io": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.5.tgz", - "integrity": "sha512-j1DWIcktw4hRwrv6nWx++5nFH2X64x16MAG2P0Lmi5Dvdfi3I+Jhc7JKJIdAmDJa+5aZ/imHV7dWRPy2Cqjh3A==", + "integrity": "sha1-Tr5edcbcEj3uSv3Obl/c7SHrk/Y=", "dev": true, "requires": { "accepts": "1.3.3", @@ -5275,7 +5275,7 @@ "engine.io-client": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.5.tgz", - "integrity": "sha512-AYTgHyeVUPitsseqjoedjhYJapNVoSPShbZ+tEUX9/73jgZ/Z3sUlJf9oYgdEBBdVhupUpUqSxH0kBCXlQnmZg==", + "integrity": "sha1-/n+2DLDc8vooWUiTKctZaN7esR8=", "dev": true, "requires": { "component-emitter": "1.2.1", @@ -5648,7 +5648,7 @@ "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", "dev": true, "requires": { "md5.js": "^1.3.4", @@ -6021,7 +6021,7 @@ "ext-list": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", - "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", + "integrity": "sha1-C5jmTtgvWs8PKTG6v2khLvUt3Tc=", "dev": true, "requires": { "mime-db": "^1.28.0" @@ -6030,7 +6030,7 @@ "ext-name": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", - "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", + "integrity": "sha1-cHgZgdGD7hXROZPIgiBFxQbI8KY=", "dev": true, "requires": { "ext-list": "^2.0.0", @@ -6054,7 +6054,7 @@ "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", "dev": true, "requires": { "array-unique": "^0.3.2", @@ -6193,7 +6193,7 @@ "file-type": { "version": "7.7.1", "resolved": "https://registry.npmjs.org/file-type/-/file-type-7.7.1.tgz", - "integrity": "sha512-bTrKkzzZI6wH+NXhyD3SOXtb2zXTw2SbwI2RxUlRcXVsnN7jNL5hJzVQLYv7FOQhxFkK4XWdAflEaWFpaLLWpQ==", + "integrity": "sha1-kcL17bjOcGiLm2ipDZMbu2yyH2U=", "dev": true }, "filename-regex": { @@ -6211,7 +6211,7 @@ "filenamify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-2.1.0.tgz", - "integrity": "sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==", + "integrity": "sha1-iPr0lfsbR6v9YSMAACoWIoxnfuk=", "dev": true, "requires": { "filename-reserved-regex": "^2.0.0", @@ -6439,7 +6439,7 @@ "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==", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -6450,7 +6450,7 @@ "fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "integrity": "sha1-a+Dem+mYzhavivwkSXue6bfM2a0=", "dev": true }, "fs-extra": { @@ -6475,7 +6475,7 @@ "fsevents": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", - "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "integrity": "sha1-9B3LGvJYKvNpLaNvxVy9jhBBxCY=", "dev": true, "optional": true, "requires": { @@ -7023,13 +7023,13 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", "dev": true }, "function.prototype.name": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.0.tgz", - "integrity": "sha512-Bs0VRrTz4ghD8pTmbJQD1mZ8A/mN0ur/jGz+A6FBxPDUPkm1tNfF6bhTYPA7i7aF4lZJVr+OXTNNrnnIl58Wfg==", + "integrity": "sha1-i9djzAr4YKhZzF1JOE10uTLNIyc=", "dev": true, "requires": { "define-properties": "^1.1.2", @@ -7095,7 +7095,7 @@ "get-proxy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz", - "integrity": "sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==", + "integrity": "sha1-NJ8rTZHUTE1NTpy6KtkBQ/rF75M=", "dev": true, "requires": { "npm-conf": "^1.1.0" @@ -7137,7 +7137,7 @@ "glamor": { "version": "2.20.40", "resolved": "https://registry.npmjs.org/glamor/-/glamor-2.20.40.tgz", - "integrity": "sha512-DNXCd+c14N9QF8aAKrfl4xakPk5FdcFwmH7sD0qnC0Pr7xoZ5W9yovhUrY/dJc3psfGGXC58vqQyRtuskyUJxA==", + "integrity": "sha1-9gZmA1e3zxjfrOcxrRos+pOBfwU=", "dev": true, "requires": { "fbjs": "^0.8.12", @@ -7300,7 +7300,7 @@ "global-modules": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "integrity": "sha1-bXcPDrUjrHgWTXK15xqIdyZcw+o=", "dev": true, "requires": { "global-prefix": "^1.0.1", @@ -8963,7 +8963,7 @@ "has-symbol-support-x": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", - "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", + "integrity": "sha1-FAn5i8ACR9pF2mfO4KNvKC/yZFU=", "dev": true }, "has-symbols": { @@ -8975,7 +8975,7 @@ "has-to-string-tag-x": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", - "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", + "integrity": "sha1-oEWrOD17SyASoAFIqwql8pAETU0=", "dev": true, "requires": { "has-symbol-support-x": "^1.4.1" @@ -9227,7 +9227,7 @@ "http-cache-semantics": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", - "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", + "integrity": "sha1-ObDhat2bYFvwqe89nar0hDtMrNI=", "dev": true }, "http-errors": { @@ -9358,7 +9358,7 @@ "ini": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "integrity": "sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc=", "dev": true }, "inline-style-prefixer": { @@ -9414,7 +9414,7 @@ "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==", + "integrity": "sha1-OV4a6EsR8mrReV5zwXN45IowFXY=", "dev": true, "requires": { "is-relative": "^1.0.0", @@ -9454,7 +9454,7 @@ "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", "dev": true }, "is-builtin-module": { @@ -9656,7 +9656,7 @@ "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==", + "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", "dev": true, "requires": { "isobject": "^3.0.1" @@ -9698,7 +9698,7 @@ "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==", + "integrity": "sha1-obtpNc6MXboei5dUubLcwCDiJg0=", "dev": true, "requires": { "is-unc-path": "^1.0.0" @@ -9745,7 +9745,7 @@ "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==", + "integrity": "sha1-1zHoiY7QkKEsNSrS6u1Qla0yLJ0=", "dev": true, "requires": { "unc-path-regex": "^0.1.2" @@ -9896,7 +9896,7 @@ "isurl": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", - "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "integrity": "sha1-sn9PSfPNqj6kSgpbfzRi5u3DnWc=", "dev": true, "requires": { "has-to-string-tag-x": "^1.2.0", @@ -9960,7 +9960,7 @@ "json-loader": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", - "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", + "integrity": "sha1-3KFKcCNf+C8KyaOr62DTN6NlGF0=", "dev": true }, "json-schema": { @@ -10191,7 +10191,7 @@ "karma-remap-coverage": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/karma-remap-coverage/-/karma-remap-coverage-0.1.5.tgz", - "integrity": "sha512-FM5h8eHcHbMMR+2INBUxD+4+wUbkCnobfn5uWprkLyj6Xcm2MRFQOuAJn9h2H13nNso6rk+QoNpHd5xCevlPOw==", + "integrity": "sha1-0uO7LdAK3NJWYDpwKwjDcTcPvBI=", "dev": true, "requires": { "remap-istanbul": "^0.10" @@ -10250,7 +10250,7 @@ "keyv": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", - "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", + "integrity": "sha1-RJI7o55osSp87H32wyaMAx8u83M=", "dev": true, "requires": { "json-buffer": "3.0.0" @@ -10259,7 +10259,7 @@ "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", "dev": true }, "klaw": { @@ -11018,7 +11018,7 @@ "make-dir": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "integrity": "sha1-ecEDO4BRW9bSTsmTPoYMp17ifww=", "dev": true, "requires": { "pify": "^3.0.0" @@ -11288,7 +11288,7 @@ "miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=", "dev": true, "requires": { "bn.js": "^4.0.0", @@ -11298,7 +11298,7 @@ "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=", "dev": true }, "mime-db": { @@ -11325,7 +11325,7 @@ "mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "integrity": "sha1-SSNTiHju9CBjy4o+OweYeBSHqxs=", "dev": true }, "minimalistic-assert": { @@ -11343,7 +11343,7 @@ "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -11608,7 +11608,7 @@ "no-case": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", "dev": true, "requires": { "lower-case": "^1.1.1" @@ -11992,7 +11992,7 @@ "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", "dev": true, "requires": { "hosted-git-info": "^2.1.4", @@ -12031,7 +12031,7 @@ "npm-conf": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", - "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", + "integrity": "sha1-JWzEe9DiGMJZxOlVC/QTvCGSr/k=", "dev": true, "requires": { "config-chain": "^1.1.11", @@ -12058,7 +12058,7 @@ "npmlog": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "integrity": "sha1-CKfyqL9zRgR3mp76StXMcXq7lUs=", "dev": true, "requires": { "are-we-there-yet": "~1.1.2", @@ -12197,7 +12197,7 @@ "object.assign": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "integrity": "sha1-lovxEA15Vrs8oIbwBvhGs7xACNo=", "dev": true, "requires": { "define-properties": "^1.1.2", @@ -12299,7 +12299,7 @@ "office-ui-fabric-react": { "version": "5.131.0", "resolved": "https://registry.npmjs.org/office-ui-fabric-react/-/office-ui-fabric-react-5.131.0.tgz", - "integrity": "sha512-QOYu1uf92qhTTIlBAj8teKvRpCmpliRZjynYtgeeUbDm4C4GtXdb/O1rPNFsfT0PNtPC8dCNeQ7/CXjQenUkyw==", + "integrity": "sha1-gITjrUljhRQS38FZNu6YFKZopZs=", "requires": { "@microsoft/load-themed-styles": "^1.7.13", "@uifabric/icons": ">=5.8.0 <6.0.0", @@ -12542,7 +12542,7 @@ "p-timeout": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", - "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", + "integrity": "sha1-2N0ZeVldLcATnh/ka4tkbLPN8Dg=", "dev": true, "requires": { "p-finally": "^1.0.0" @@ -12946,7 +12946,7 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", "dev": true, "requires": { "chalk": "^1.1.3", @@ -13250,7 +13250,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", "dev": true }, "supports-color": { @@ -13288,7 +13288,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", "dev": true }, "supports-color": { @@ -13326,7 +13326,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", "dev": true }, "supports-color": { @@ -13364,7 +13364,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", "dev": true }, "supports-color": { @@ -13517,7 +13517,7 @@ "private": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "integrity": "sha1-I4Hts2ifelPWUxkAYPz4ItLzaP8=", "dev": true }, "process": { @@ -13709,7 +13709,7 @@ "randombytes": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", - "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "integrity": "sha1-0wLFIpSFiISKjTAMkytEwkIx2oA=", "dev": true, "requires": { "safe-buffer": "^5.1.0" @@ -14014,7 +14014,7 @@ "regex-cache": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "integrity": "sha1-db3FiioUls7EihKDW8VMjVYjNt0=", "dev": true, "requires": { "is-equal-shallow": "^0.1.3" @@ -14043,7 +14043,7 @@ "registry-auth-token": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", - "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "integrity": "sha1-hR/UkDjuy1hpERFa+EUmDuyYPyA=", "dev": true, "requires": { "rc": "^1.1.6", @@ -14083,7 +14083,7 @@ "remap-istanbul": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/remap-istanbul/-/remap-istanbul-0.10.1.tgz", - "integrity": "sha512-gsNQXs5kJLhErICSyYhzVZ++C8LBW8dgwr874Y2QvzAUS75zBlD/juZgXs39nbYJ09fZDlX2AVLVJAY2jbFJoQ==", + "integrity": "sha1-OqWN1QIdSZ8zbTulvzu7kcG4jjc=", "dev": true, "requires": { "amdefine": "^1.0.0", @@ -14117,7 +14117,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", "dev": true }, "through2": { @@ -14168,7 +14168,7 @@ "replacestream": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/replacestream/-/replacestream-4.0.3.tgz", - "integrity": "sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA==", + "integrity": "sha1-PuV5gJK+Nksc2xSEMISSyz3/LzY=", "dev": true, "requires": { "escape-string-regexp": "^1.0.3", @@ -14438,7 +14438,7 @@ "scrollreveal": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/scrollreveal/-/scrollreveal-3.3.6.tgz", - "integrity": "sha512-5HiAtVqwffX18w/kqXkD+S54A0MoE4xLAwQcszEYGuy+EsRUoHsw1BhFpxGCcbTXIy5HMtj/qmLDbpQ+J3llig==", + "integrity": "sha1-ZZt78LoOJE3O2XisVUDAC0N3Pko=", "dev": true }, "scss-tokenizer": { @@ -14692,7 +14692,7 @@ "set-value": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "integrity": "sha1-ca5KiPD+77v1LR6mBPP7MV67YnQ=", "dev": true, "requires": { "extend-shallow": "^2.0.1", @@ -14740,7 +14740,7 @@ "shellwords": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "integrity": "sha1-1rkYHBpI05cyTISHHvvPxz/AZUs=", "dev": true }, "sigmund": { @@ -14805,7 +14805,7 @@ "slugify": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.3.1.tgz", - "integrity": "sha512-6BwyhjF5tG5P8s+0DPNyJmBSBePG6iMyhjvIW5zGdA3tFik9PtK+yNkZgTeiroCRGZYgkHftFA62tGVK1EI9Kw==", + "integrity": "sha1-9XISfoU1Mp+8bB7bdKuFa2GtfeI=", "dev": true }, "snapdragon": { @@ -14895,7 +14895,7 @@ "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==", + "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", "dev": true, "requires": { "define-property": "^1.0.0", @@ -14906,7 +14906,7 @@ "snapdragon-util": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", "dev": true, "requires": { "kind-of": "^3.2.0" @@ -15071,7 +15071,7 @@ "sonarqube-scanner": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/sonarqube-scanner/-/sonarqube-scanner-2.1.2.tgz", - "integrity": "sha512-4Sf01R7zOnR3YTofaQI5HH6UTz46l0kUov7cJvWmhD9Hi+U16komI/e61GjOyC2JrVrFiWqFsO/o15ceHbKd/Q==", + "integrity": "sha1-/YvGhXpQcXiwGT2j3pSdYJWX478=", "dev": true, "requires": { "download": "7.0.0", @@ -15247,7 +15247,7 @@ "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==", + "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", "dev": true, "requires": { "extend-shallow": "^3.0.0" @@ -15616,7 +15616,7 @@ "strip-dirs": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", - "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", + "integrity": "sha1-SYdzYmT8NEzyD2w0rKnRPR1O1sU=", "dev": true, "requires": { "is-natural-number": "^4.0.1" @@ -15646,7 +15646,7 @@ "strip-outer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", - "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "integrity": "sha1-sv0qv2YEudHmATBXGV34Nrip1jE=", "dev": true, "requires": { "escape-string-regexp": "^1.0.2" @@ -15700,7 +15700,7 @@ "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", "dev": true } } @@ -15731,7 +15731,7 @@ "tar-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "integrity": "sha1-jqVdqzeXIlPZqa+Q/c1VmuQ1xVU=", "dev": true, "requires": { "bl": "^1.0.0", @@ -15773,7 +15773,7 @@ "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==", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -16000,7 +16000,7 @@ "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", "dev": true, "requires": { "os-tmpdir": "~1.0.2" @@ -16030,7 +16030,7 @@ "to-buffer": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", + "integrity": "sha1-STvUj2LXxD/N7TE6A9ytsuEhOoA=", "dev": true }, "to-object-path": { @@ -16403,7 +16403,7 @@ "unbzip2-stream": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.1.tgz", - "integrity": "sha512-fIZnvdjblYs7Cru/xC6tCPVhz7JkYcVQQkePwMLyQELzYTds2Xn8QefPVnvdVhhZqubxNA1cASXEH5wcK0Bucw==", + "integrity": "sha1-eFTaUWIqfmNiQiEZY1eAO1UpZqE=", "dev": true, "requires": { "buffer": "^3.0.1", @@ -16750,7 +16750,7 @@ "useragent": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", - "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", + "integrity": "sha1-IX+UOtVAyyEoZYqyP8lg9qiMmXI=", "dev": true, "requires": { "lru-cache": "4.1.x", @@ -16832,7 +16832,7 @@ "validator": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/validator/-/validator-8.2.0.tgz", - "integrity": "sha512-Yw5wW34fSv5spzTXNkokD6S6/Oq92d8q/t14TqsS3fAiA1RYnxSFSIZ+CY3n6PGGRCq5HhJTSepQvFUS2QUDxA==", + "integrity": "sha1-PBI3KQ43CSNVNE/veMIxJJ2rd7k=", "dev": true }, "vary": { @@ -17084,7 +17084,7 @@ "os-locale": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "integrity": "sha1-QrwpAKa1uL0XN2yOiCtlr8zyS/I=", "dev": true, "requires": { "execa": "^0.7.0", @@ -17125,7 +17125,7 @@ "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", @@ -17182,7 +17182,7 @@ "webpack-dev-middleware": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", - "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", + "integrity": "sha1-+PwRIM47T8VoDO7LQ9d3lmshEF4=", "dev": true, "requires": { "memory-fs": "~0.4.1", @@ -17280,7 +17280,7 @@ "websocket-extensions": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "integrity": "sha1-XS/yKXcAPsaHpLhwc9+7rBRszyk=", "dev": true }, "whatwg-fetch": { @@ -17379,7 +17379,7 @@ "ws": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", - "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", + "integrity": "sha1-y9nm514J/F0skAFfIfDECHXg3VE=", "dev": true, "requires": { "options": ">=0.0.5", @@ -17508,7 +17508,7 @@ "z-schema": { "version": "3.18.4", "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-3.18.4.tgz", - "integrity": "sha512-DUOKC/IhbkdLKKiV89gw9DUauTV8U/8yJl1sjf6MtDmzevLKOF2duNJ495S3MFVjqZarr+qNGCPbkg4mu4PpLw==", + "integrity": "sha1-6oEysnlTPuYL4khaAvfj5CVBqaI=", "dev": true, "requires": { "commander": "^2.7.1", diff --git a/package.json b/package.json index 7a608843c..d43456599 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "color": "^3.1.0", "lodash": "4.17.4", "office-ui-fabric-react": "5.131.0", - "react-quill": "^1.3.3" + "react-quill": "1.3.3" }, "devDependencies": { "@microsoft/decorators": "~1.3.0", diff --git a/src/controls/richText/RichText.tsx b/src/controls/richText/RichText.tsx index ba7cfe4bd..ac4017afb 100644 --- a/src/controls/richText/RichText.tsx +++ b/src/controls/richText/RichText.tsx @@ -1,14 +1,12 @@ import * as React from 'react'; - -import { IRichTextProps, IRichTextState } from './RichText.types'; +import * as strings from 'ControlStrings'; +import 'react-quill/dist/quill.snow.css'; import RichTextPropertyPane from './RichTextPropertyPane'; import ReactQuill, { Quill } from 'react-quill'; -import 'react-quill/dist/quill.snow.css'; import styles from './RichText.module.scss'; -import { css } from 'office-ui-fabric-react/lib/Utilities'; +import { IRichTextProps, IRichTextState } from './RichText.types'; import { IconButton } from 'office-ui-fabric-react/lib/Button'; import { Guid } from '@microsoft/sp-core-library'; -import * as strings from 'ControlStrings'; import { TooltipHost } from 'office-ui-fabric-react/lib/Tooltip'; import { Dialog, DialogType, DialogFooter } from 'office-ui-fabric-react/lib/Dialog'; import { TextField } from 'office-ui-fabric-react/lib/TextField'; @@ -17,8 +15,6 @@ import { PrimaryButton, DefaultButton } from 'office-ui-fabric-react/lib/Button' import { Dropdown, IDropdownOption } from 'office-ui-fabric-react/lib/Dropdown'; import { Icon } from 'office-ui-fabric-react/lib/Icon'; import { elementContains } from 'office-ui-fabric-react/lib/Utilities'; - - import * as telemetry from '../../common/telemetry'; /** @@ -30,27 +26,78 @@ import * as telemetry from '../../common/telemetry'; * - Tables aren't supported yet. I'll gladly add table formatting support if users request it. */ export class RichText extends React.Component { - private _quillElem: ReactQuill = undefined; - private _wrapperRef = undefined; - private _propertyPaneRef: RichTextPropertyPane = undefined; - private _toolbarId = undefined; + private quillElem: ReactQuill = undefined; + private wrapperRef = undefined; + private propertyPaneRef: RichTextPropertyPane = undefined; + private toolbarId = undefined; + + private ddStyleOpts = [{ + key: 0, + text: strings.HeaderNormalText, + data: {} + }, { + key: 2, + text: strings.HeaderH2, + data: + { className: styles.toolbarButtonH2 } + }, { + key: 3, + text: strings.HeaderH3, + data: + { className: styles.toolbarButtonH3 } + }, { + key: 4, + text: strings.HeaderH4, + data: + { className: styles.toolbarButtonH4 } + }, { + key: 7, + text: strings.HeaderBlockQuote, + data: + { className: styles.toolbarButtonBlockQuote } + }]; + + private ddAlignOpts = [{ + key: 'left', + text: strings.AlignLeft, + data: { icon: 'AlignLeft' } + }, { + key: 'center', + text: strings.AlignCenter, + data: { icon: 'AlignCenter' } + }, { + key: 'right', + text: strings.AlignRight, + data: { icon: 'AlignRight' } + }]; + + private ddListOpts = [{ + key: 'bullet', + text: strings.ListBullet, + data: { icon: 'BulletedList' } + }, { + key: 'ordered', + text: strings.ListNumbered, + data: { icon: 'NumberedList' } + }]; /** - * Sets default properties - */ + * Sets default properties + */ public static defaultProps: Partial = { isEditMode: true, - showStyles: true, - showBold: true, - showItalic: true, - showUnderline: true, - showAlign: true, - showList: true, - showLink: true, - showMore: true + styleOptions: { + showStyles: true, + showBold: true, + showItalic: true, + showUnderline: true, + showAlign: true, + showList: true, + showLink: true, + showMore: true + } }; - constructor(props: IRichTextProps) { super(props); @@ -70,12 +117,8 @@ export class RichText extends React.Component { selectedUrl: undefined }; - // Prepare to handle clicking outside of the control - this._setWrapperRef = this._setWrapperRef.bind(this); - this._handleClickOutside = this._handleClickOutside.bind(this); - // Get a unique toolbar id - this._toolbarId = "toolbar_" + Guid.newGuid().toString(); + this.toolbarId = "toolbar_" + Guid.newGuid().toString(); } /** @@ -84,8 +127,8 @@ export class RichText extends React.Component { public componentDidMount() { // If we're in edit mode, attach the mouse down event if (this.props.isEditMode) { - document.addEventListener('click', this._handleClickOutside); - document.addEventListener('focus', this._handleClickOutside); + document.addEventListener('click', this.handleClickOutside); + document.addEventListener('focus', this.handleClickOutside); } } @@ -95,8 +138,8 @@ export class RichText extends React.Component { public componentWillUnmount() { // If we were in edit mode, remove the mouse down handler if (this.props.isEditMode) { - document.removeEventListener('click', this._handleClickOutside); - document.removeEventListener('focus', this._handleClickOutside); + document.removeEventListener('click', this.handleClickOutside); + document.removeEventListener('focus', this.handleClickOutside); } } @@ -109,18 +152,218 @@ export class RichText extends React.Component { public componentDidUpdate(prevProps: IRichTextProps, prevState: IRichTextState): void { // If we're going from non-edit to edit mode if (this.props.isEditMode && !prevProps.isEditMode) { - document.addEventListener('click', this._handleClickOutside); - document.addEventListener('focus', this._handleClickOutside); + document.addEventListener('click', this.handleClickOutside); + document.addEventListener('focus', this.handleClickOutside); } // If we're going from edit mode to non-edit mode if (!this.props.isEditMode && prevProps.isEditMode) { - document.removeEventListener('click', this._handleClickOutside); - document.removeEventListener('focus', this._handleClickOutside); + document.removeEventListener('click', this.handleClickOutside); + document.removeEventListener('focus', this.handleClickOutside); } } - /*** + /** + * Returns a handle to the Quill editor + */ + public getEditor = (): Quill => { + try { + return this.quillElem!.getEditor(); + } catch (error) { + return undefined; + } + } + + /** + * Render style option + * + * @param option + */ + private onRenderStyleOption (option: IDropdownOption): JSX.Element { + return ( + +
+ {option.text} +
+
+ ); + } + + /** + * Render the title of the style dropdown + * + * @param options + */ + private onRenderStyleTitle (options: IDropdownOption[]): JSX.Element { + const option = options[0]; + + return ( + +
+ {option.text} +
+
+ ); + } + + /** + * Render align option + * + * @param option + */ + private onRenderAlignOption (option: IDropdownOption): JSX.Element { + return ( + +
+
+
+ ); + } + + /** + * Render the list dropdown title + * + * @param options + */ + private onRenderListTitle (options: IDropdownOption[]): JSX.Element { + const option = options[0]; + + return ( + +
+
+
+ ); + } + + /** + * Render the title of the align dropdown + * + * @param options + */ + private onRenderAlignTitle (options: IDropdownOption[]): JSX.Element { + const option = options[0]; + + return ( + +
+
+
+ ); + } + + /** + * Render list dropdown option + * + * @param option + */ + private onRenderListOption (option: IDropdownOption): JSX.Element { + return ( + +
+
+
+ ); + } + + /** + * Render the list dropdown placeholder + */ + private onRenderListPlaceholder (): JSX.Element { + return ( + +
+
+
+ ); + } + + /** + * Renders the "Insert Link" dialog + */ + private renderLinkDialog = (): JSX.Element => { + return ( + + ); + } + + /** * Renders the Rich Text Editor */ public render(): React.ReactElement { @@ -130,32 +373,19 @@ export class RichText extends React.Component { // If we're not in edit mode, display read-only version of the html if (!isEditMode) { return ( -
+
); } // Okay, we're in edit mode. - const { - placeholder, - showStyles, - showBold, - showItalic, - showUnderline, - showAlign, - showList, - showLink, - showMore - } = this.props; + const { placeholder, styleOptions: { showStyles, showBold, showItalic, showUnderline, showAlign, showList, showLink, showMore } } = this.props; // Get a unique id for the toolbar const modules = { toolbar: { - container: "#" + this._toolbarId, + container: "#" + this.toolbarId, handlers: [ "link" // disable the link handler so we can add our own ] @@ -166,12 +396,12 @@ export class RichText extends React.Component { }; // Remove fonts and set Segoe UI as the main font - var font = Quill.import('formats/font'); + let font = Quill.import('formats/font'); font.whitelist = ['Segoe UI']; Quill.register(font, true); // Set headers and add blockquote capability - var header = Quill.import('formats/header'); + let header = Quill.import('formats/header'); header.tagName = [ 'H1', 'H2', @@ -182,8 +412,8 @@ export class RichText extends React.Component { 'blockquote']; Quill.register(header, true); - // Add the sharepoint font sizes - var SizeClass = Quill.import('formats/size'); + // Add the SharePoint font sizes + let SizeClass = Quill.import('formats/size'); SizeClass.whitelist = [ 'small', 'medium', @@ -198,423 +428,169 @@ export class RichText extends React.Component { Quill.register(SizeClass, true); return ( -
-
- {showStyles && - { return ; }} - selectedKey={this.state.formats.header !== undefined ? this.state.formats.header : 0} - options={[ - { - key: 0, - text: strings.HeaderNormalText, - data: {} - }, - { - key: 2, - text: strings.HeaderH2, - data: - { className: styles.toolbarButtonH2 } - }, - { - key: 3, - text: strings.HeaderH3, - data: - { className: styles.toolbarButtonH3 } - }, - { - key: 4, - text: strings.HeaderH4, - data: - { className: styles.toolbarButtonH4 } - }, - { - key: 7, - text: strings.HeaderBlockQuote, - data: - { className: styles.toolbarButtonBlockQuote } - } - ]} - onChanged={(item) => this._onChangeHeading(item)} - onRenderOption={(option: IDropdownOption): JSX.Element => { - return ( - -
- {option.text} -
-
- ); - }} - onRenderTitle={(options: IDropdownOption[]): JSX.Element => { - const option = options[0]; - - return ( - -
- {option.text} -
-
- ); - }} - /> +
this.wrapperRef = ref} className={`${styles.richtext && this.state.editing ? 'ql-active' : undefined} ${this.props.className}`}> +
+ { + showStyles && ( + } + selectedKey={this.state.formats.header || 0} + options={this.ddStyleOpts} + onChanged={this.onChangeHeading} + onRenderOption={this.onRenderStyleOption} + onRenderTitle={this.onRenderStyleTitle} + /> + ) } - {showBold && - - - this._onChangeBold()}> - - + { + showBold && ( + + + + ) } - {showItalic && - - - this._onChangeItalic()}> - - - + { + showItalic && ( + + + + ) } - {showUnderline && - - - this._onChangeUnderline()}> - + { + showUnderline && ( + + + ) } - {showAlign && - { return ; }} - selectedKey={this.state.formats.align !== undefined ? this.state.formats.align : 'left'} - options={[ - { - key: 'left', - text: strings.AlignLeft, - data: { icon: 'AlignLeft' } - }, - { - key: 'center', - text: strings.AlignCenter, - data: { icon: 'AlignCenter' } - }, - { - key: 'right', - text: strings.AlignRight, - data: { icon: 'AlignRight' } - } - ]} - onChanged={(item) => this._onChangeAlign(item)} - onRenderOption={(option: IDropdownOption): JSX.Element => { - return ( - -
-
-
- ); - }} - onRenderTitle={(options: IDropdownOption[]): JSX.Element => { - const option = options[0]; - - return ( - -
-
-
- ); - }} - /> + { + showAlign && ( + } + selectedKey={this.state.formats.align || 'left'} + options={this.ddAlignOpts} + onChanged={this.onChangeAlign} + onRenderOption={this.onRenderAlignOption} + onRenderTitle={this.onRenderAlignTitle} + /> + ) } - {showList && - { return ; }} - selectedKey={this.state.formats.list} - options={[ - { - key: 'bullet', - text: strings.ListBullet, - data: { icon: 'BulletedList' } - }, - { - key: 'ordered', - text: strings.ListNumbered, - data: { icon: 'NumberedList' } - } - ]} - // this option is not available yet - // notifyOnReselect={true} // allows re-selecting selected item to turn it off - onChanged={(item) => this._onChangeList(item)} - onRenderOption={(option: IDropdownOption): JSX.Element => { - return ( - -
-
-
- ); - }} - onRenderTitle={(options: IDropdownOption[]): JSX.Element => { - const option = options[0]; - - return ( - -
-
-
- ); - }} - onRenderPlaceHolder={(): JSX.Element => { - return ( - -
-
-
- ); - }} - /> + { + showList && ( + } + selectedKey={this.state.formats.list} + options={this.ddListOpts} + // this option is not available yet + // notifyOnReselect={true} // allows re-selecting selected item to turn it off + onChanged={this.onChangeList} + onRenderOption={this.onRenderListOption} + onRenderTitle={this.onRenderListTitle} + onRenderPlaceHolder={this.onRenderListPlaceholder} + /> + ) } - {showLink && - - this._showInsertLinkDialog()} - aria-describedby="link-richtextbutton" - iconProps={{ - iconName: 'Link' - }} /> - + { + showLink && ( + + + + ) } - {showMore && - - - this._handleShowMore()}> - - + { + showMore && ( + + + + ) }
- - this._handleChangeSelection(range, oldRange, source)} - onFocus={(range, source, editor) => - this._handleOnFocus(range, source, editor)} - /> - this._handleClosePanel()} - onLink={() => this._showInsertLinkDialog()} - /> - {this._renderLinkDialog()} + + + + + + { + this.renderLinkDialog() + }
); } /** - * Returns a handle to the Quill editor + * Style trigger events */ - public getEditor = (): Quill => { - try { - return this._quillElem!.getEditor(); - } catch (error) { - return undefined; - } - } - - private _onChangeBold = (): void => { + private onChangeBold = (): void => { const newBoldValue = !this.state.formats.bold; - this._applyFormat("bold", newBoldValue); + this.applyFormat("bold", newBoldValue); } - private _onChangeItalic = (): void => { + private onChangeItalic = (): void => { const newValue = !this.state.formats.italic; - this._applyFormat("italic", newValue); + this.applyFormat("italic", newValue); } - private _onChangeUnderline = (): void => { + private onChangeUnderline = (): void => { const newValue = !this.state.formats.underline; - this._applyFormat("underline", newValue); + this.applyFormat("underline", newValue); } - private _onChangeHeading = (item: IDropdownOption): void => { + private onChangeHeading = (item: IDropdownOption): void => { const newHeadingValue = item.key === 0 ? '' : item.key.toString(); - this._applyFormat("header", newHeadingValue); + this.applyFormat("header", newHeadingValue); } - private _onChangeAlign = (item: IDropdownOption): void => { + private onChangeAlign = (item: IDropdownOption): void => { const newAlignValue = item.key === 'left' ? false : item.key.toString(); - this._applyFormat("align", newAlignValue); + this.applyFormat("align", newAlignValue); } - private _onChangeList = (item: IDropdownOption): void => { + private onChangeList = (item: IDropdownOption): void => { // if we're already in list mode, toggle off const key = item.key; - const newAlignValue = (key === 'bullet' && this.state.formats.list === 'bullet') || - (key === 'numbered' && this.state.formats.list === 'numbered') - ? false : key; - this._applyFormat("list", newAlignValue); - } - - /** - * Renders the "Insert Link" dialog - */ - private _renderLinkDialog = (): JSX.Element => { - return (); + const newAlignValue = (key === 'bullet' && this.state.formats.list === 'bullet') || (key === 'numbered' && this.state.formats.list === 'numbered') ? false : key; + this.applyFormat("list", newAlignValue); } /** * Displays the insert link dialog */ - private _showInsertLinkDialog = () => { + private showInsertLinkDialog = () => { const quill = this.getEditor(); const range = quill.getSelection(); @@ -645,14 +621,14 @@ export class RichText extends React.Component { /** * Hides the insert link dialog */ - private _closeDialog = () => { + private closeDialog = () => { this.setState({ hideDialog: true }); } /** * When user enters the richtext editor, displays the border */ - private _handleOnFocus = (range, source, editor) => { + private handleOnFocus = (range, source, editor) => { if (!this.state.editing) { this.setState({ editing: true }); } @@ -661,16 +637,16 @@ export class RichText extends React.Component { /** * Called when user removes the link */ - private _handleRemoveLink = () => { + private handleRemoveLink = () => { const quill = this.getEditor(); quill.format('link', false); - this._closeDialog(); + this.closeDialog(); } /** * Called when user creates a new link */ - private _handleCreateLink = () => { + private handleCreateLink = () => { const quill = this.getEditor(); const range = this.state.selectedRange; const cursorPosition: number = range!.index; @@ -698,24 +674,20 @@ export class RichText extends React.Component { * @param name format name * @param value format value, or false to unset format */ - private _applyFormat(name: string, value: any) { + private applyFormat(name: string, value: any) { const quill = this.getEditor(); quill.format(name, value); - // we use a timeout to ensure that format has been applied - // and buttons are updated - setTimeout( - () => { - this._handleChangeSelection(quill.getSelection(), undefined, undefined); - }, - 100 - ); + // We use a timeout to ensure that format has been applied and buttons are updated + setTimeout(() => { + this.handleChangeSelection(quill.getSelection(), undefined, undefined); + }, 100); } /** * Called when richtext selection changes */ - private _handleChangeSelection = (range, oldRange, source) => { + private handleChangeSelection = (range, oldRange, source) => { const quill = this.getEditor(); try { if (quill) { @@ -734,8 +706,8 @@ export class RichText extends React.Component { formats: formats }); - if (this._propertyPaneRef && this.state.morePaneVisible) { - this._propertyPaneRef.onChangeSelection(range, oldRange, source); + if (this.propertyPaneRef && this.state.morePaneVisible) { + this.propertyPaneRef.onChangeSelection(range, oldRange, source); } } } catch (error) { @@ -746,21 +718,21 @@ export class RichText extends React.Component { /** * Called when user clicks on the close icon */ - private _handleClosePanel = (): void => { - this._closePanel(); + private handleClosePanel = (): void => { + this.closePanel(); } /** * Closes the panel */ - private _closePanel = (): void => { + private closePanel = (): void => { this.setState({ morePaneVisible: false }); } /** * Called when user clicks on the more button */ - private _handleShowMore = () => { + private handleShowMore = () => { this.setState({ morePaneVisible: !this.state.morePaneVisible }, () => { @@ -771,7 +743,7 @@ export class RichText extends React.Component { /** * Called when user changes the text of the editor */ - private _handleChange = (value: string) => { + private handleChange = (value: string) => { const { onChange } = this.props; // do we need to pass this to a handler? @@ -785,18 +757,11 @@ export class RichText extends React.Component { } } - /** - * Set the wrapper ref - */ - private _setWrapperRef(node) { - this._wrapperRef = node; - } - /** * Keeps track of whether we clicked outside the element */ - private _handleClickOutside(event) { - let outside: boolean = !elementContains(this._wrapperRef, event.target); + private handleClickOutside = (event) => { + let outside: boolean = !elementContains(this.wrapperRef, event.target); // Did we click outside? if (outside) { @@ -819,14 +784,14 @@ export class RichText extends React.Component { /** * Links to the quill reference */ - private _linkQuill = (e: any) => { - this._quillElem = e; + private linkQuill = (e: any) => { + this.quillElem = e; } /** * Links to the property pane element */ - private _linkPropertyPane = (e: any) => { - this._propertyPaneRef = e; + private linkPropertyPane = (e: any) => { + this.propertyPaneRef = e; } } diff --git a/src/controls/richText/RichText.types.ts b/src/controls/richText/RichText.types.ts index bdaff6803..11a34cccb 100644 --- a/src/controls/richText/RichText.types.ts +++ b/src/controls/richText/RichText.types.ts @@ -17,6 +17,24 @@ export interface IRichTextProps { */ placeholder? : string; + /** + * The HTML text containing the rich text + */ + value?: string; + + /** + * Style options + */ + styleOptions?: StyleOptions; + + /** + * Callback issued when the rich text changes. + * Returns the text that will be inserted in the rich text control. + */ + onChange?: (text: string) => string; +} + +export interface StyleOptions { /** * Indicates if we should show the Align button * @defaultvalue true @@ -67,17 +85,6 @@ export interface IRichTextProps { * @defaultvalue true */ showUnderline?: boolean; - - /** - * The HTML text containing the rich text - */ - value?: string; - - /** - * Callback issued when the rich text changes. - * Returns the text that will be inserted in the rich text control. - */ - onChange?: (text: string) => string; } export interface IRichTextState { diff --git a/src/controls/richText/RichTextPropertyPane.tsx b/src/controls/richText/RichTextPropertyPane.tsx index fefd5b5de..ba1380713 100644 --- a/src/controls/richText/RichTextPropertyPane.tsx +++ b/src/controls/richText/RichTextPropertyPane.tsx @@ -1,13 +1,12 @@ import * as React from 'react'; - -import { IRichTextPropertyPaneProps, IRichTextPropertyPaneState } from './RichTextPropertyPane.types'; +import * as strings from 'ControlStrings'; import styles from './RichTextPropertyPane.module.scss'; +import RteColorPicker from './RteColorPicker'; +import { IRichTextPropertyPaneProps, IRichTextPropertyPaneState } from './RichTextPropertyPane.types'; import { IconButton } from 'office-ui-fabric-react/lib/Button'; -import * as strings from 'ControlStrings'; import { Panel, PanelType } from 'office-ui-fabric-react/lib/Panel'; import { TooltipHost } from 'office-ui-fabric-react/lib/Tooltip'; import { Dropdown, IDropdownOption } from 'office-ui-fabric-react/lib/Dropdown'; -import RteColorPicker from './RteColorPicker'; import { ThemeColorHelper } from '../../common/utilities/ThemeColorHelper'; export default class RichTextPropertyPane extends React.Component { @@ -20,8 +19,13 @@ export default class RichTextPropertyPane extends React.Component { return ( - +
- {this._renderActionsGroup()} - {this._renderFontStylesGroup()} - {this._renderFontSizesGroup()} - {this._renderInlineStylesGroup()} - {this._renderColorStylesGroup()} + {this.renderActionsGroup()} + {this.renderFontStylesGroup()} + {this.renderFontSizesGroup()} + {this.renderInlineStylesGroup()} + {this.renderColorStylesGroup()}
{strings.ParagraphSectionTitle}
- {this._renderAlignmentStylesGroup()} - {this._renderListStylesGroup()} + {this.renderAlignmentStylesGroup()} + {this.renderListStylesGroup()}
{strings.HyperlinkSectionTitle}
- {this._renderHyperlinkStylesGroup()} + {this.renderHyperlinkStylesGroup()}
@@ -77,6 +80,9 @@ export default class RichTextPropertyPane extends React.Component { const quill = this.props.editor; if (quill === undefined || range === undefined) { @@ -91,515 +97,543 @@ export default class RichTextPropertyPane extends React.Component { - return
-
-
- - this._handleUndo()} - className={styles.propertyPaneButton} - aria-describedby="undo-propertyPaneButton" - iconProps={{ - iconName: 'Undo', - style: { - fontSize: '20px' - } - }} /> - - - this._handleRedo()} - className={styles.propertyPaneButton} - aria-describedby="redo-propertyPaneButton" - iconProps={{ - iconName: 'Redo', - style: { - fontSize: '20px' - } - }} /> - - - this._handleClearFormatting()} - className={styles.propertyPaneButton} - aria-describedby="clearFormatting-button-propertyPaneButton" - iconProps={{ - iconName: 'ClearFormatting', - style: { - fontSize: '20px' - } - }} /> - + /** + * Render the actions group + */ + private renderActionsGroup = (): JSX.Element => { + return ( +
+
+
+ + + + + + + + + + + +
-
; + ); } - private _renderFontStylesGroup = (): JSX.Element => { + /** + * Render font styles group + */ + private renderFontStylesGroup = (): JSX.Element => { const selectedHeader = this.state.formats!.header ? this.state.formats!.header : 0; - return
- this._onChangeHeading(item)} - /> -
; + return ( +
+ +
+ ); } - private _renderFontSizesGroup = (): JSX.Element => { + /** + * Render font size group + */ + private renderFontSizesGroup = (): JSX.Element => { // get the selected header const selectedSize = this.state.formats!.size ? this.state.formats!.size : 'large'; - return
- this._onChangeSize(item)} - /> -
; + return ( +
+ +
+ ); } - private _renderInlineStylesGroup = (): JSX.Element => { - return
-
-
- - this._applyFormat('bold', !this.state.formats!.bold)} - className={styles.propertyPaneButton} - aria-describedby="bold-propertyPaneButton" - iconProps={{ - iconName: 'Bold', - style: { - fontSize: '20px' - } - }} /> - - - this._applyFormat('italic', !this.state.formats!.italic)} - className={styles.propertyPaneButton} - aria-describedby="italic-propertyPaneButton" - iconProps={{ - iconName: 'Italic', - style: { - fontSize: '20px' - } - }} /> - - - this._applyFormat('underline', !this.state.formats!.underline)} - className={styles.propertyPaneButton} - aria-describedby="underline-propertyPaneButton" - iconProps={{ - iconName: 'Underline', - style: { - fontSize: '20px' - } - }} /> - - - this._applyFormat('strike', !this.state.formats!.strike)} - className={styles.propertyPaneButton} - aria-describedby="strikethrough-propertyPaneButton" - iconProps={{ - iconName: 'Strikethrough', - style: { - fontSize: '20px' - } - }} /> - - - this._applyFormat('script', this.state.formats!.script === 'super' ? '' : 'super')} - className={styles.propertyPaneButton} - aria-describedby="superscript-propertyPaneButton" - iconProps={{ - iconName: 'Superscript', - style: { - fontSize: '20px' - } - }} /> - - - this._applyFormat('script', this.state.formats!.script === 'sub' ? '' : 'sub')} - className={styles.propertyPaneButton} - aria-describedby="subscript-propertyPaneButton" - iconProps={{ - iconName: 'Subscript', - style: { - fontSize: '20px' - } - }} /> - + /** + * Render inline styles group + */ + private renderInlineStylesGroup = (): JSX.Element => { + return ( +
+
+
+ + this.applyFormat('bold', !this.state.formats!.bold)} + className={styles.propertyPaneButton} + aria-describedby="bold-propertyPaneButton" + iconProps={{ + iconName: 'Bold', + style: { + fontSize: '20px' + } + }} /> + + + + this.applyFormat('italic', !this.state.formats!.italic)} + className={styles.propertyPaneButton} + aria-describedby="italic-propertyPaneButton" + iconProps={{ + iconName: 'Italic', + style: { + fontSize: '20px' + } + }} /> + + + + this.applyFormat('underline', !this.state.formats!.underline)} + className={styles.propertyPaneButton} + aria-describedby="underline-propertyPaneButton" + iconProps={{ + iconName: 'Underline', + style: { + fontSize: '20px' + } + }} /> + + + + this.applyFormat('strike', !this.state.formats!.strike)} + className={styles.propertyPaneButton} + aria-describedby="strikethrough-propertyPaneButton" + iconProps={{ + iconName: 'Strikethrough', + style: { + fontSize: '20px' + } + }} /> + + + + this.applyFormat('script', this.state.formats!.script === 'super' ? '' : 'super')} + className={styles.propertyPaneButton} + aria-describedby="superscript-propertyPaneButton" + iconProps={{ + iconName: 'Superscript', + style: { + fontSize: '20px' + } + }} /> + + + + this.applyFormat('script', this.state.formats!.script === 'sub' ? '' : 'sub')} + className={styles.propertyPaneButton} + aria-describedby="subscript-propertyPaneButton" + iconProps={{ + iconName: 'Subscript', + style: { + fontSize: '20px' + } + }} /> + +
-
; + ); } - private _renderColorStylesGroup = (): JSX.Element => { + /** + * Render color styles group + */ + private renderColorStylesGroup = (): JSX.Element => { const color: string = this.state.formats.color || ThemeColorHelper.GetThemeColor(styles.NeutralPrimary); const backgroundColor: string = this.state.formats.background || "rgba(0, 0, 0, 0)"; - return
-
-
- this._handleFillColorChanged(fillColor)} - switchToDefaultColor={() => this._handleFillColorChanged(undefined)} - /> - this._handleHighlightColorChanged(highlightColor)} - switchToDefaultColor={() => this._handleHighlightColorChanged(undefined)} - previewColor={backgroundColor} - defaultButtonLabel={strings.NoColorHighlightColor} - selectedColor={backgroundColor} - id="highlightColor-propertyPaneButton" - /> + return ( +
+
+
+ this.handleFillColorChanged(undefined)} /> + + this.handleHighlightColorChanged(undefined)} + previewColor={backgroundColor} + defaultButtonLabel={strings.NoColorHighlightColor} + selectedColor={backgroundColor} + id="highlightColor-propertyPaneButton" + /> +
-
; + ); } - private _handleFillColorChanged = (color: string) => { - this._applyFormat('color', color); - } + /** + * Render alignment style groups + */ + private renderAlignmentStylesGroup = (): JSX.Element => { + return ( +
+
+
+ + this.applyFormat('align', 'left')} + className={styles.propertyPaneButton} + aria-describedby="left-propertyPaneButton" + iconProps={{ + iconName: 'AlignLeft', + style: { + fontSize: '20px' + } + }} /> + - private _handleHighlightColorChanged = (color: string) => { - this._applyFormat('background', color); - } + + this.applyFormat('align', 'center')} + className={styles.propertyPaneButton} + aria-describedby="center-propertyPaneButton" + iconProps={{ + iconName: 'AlignCenter', + style: { + fontSize: '20px' + } + }} /> + - private _renderAlignmentStylesGroup = (): JSX.Element => { - return
-
-
- - this._applyFormat('align', 'left')} - className={styles.propertyPaneButton} - aria-describedby="left-propertyPaneButton" - iconProps={{ - iconName: 'AlignLeft', - style: { - fontSize: '20px' - } - }} /> - - - this._applyFormat('align', 'center')} - className={styles.propertyPaneButton} - aria-describedby="center-propertyPaneButton" - iconProps={{ - iconName: 'AlignCenter', - style: { - fontSize: '20px' - } - }} /> - - - this._applyFormat('align', 'right')} - className={styles.propertyPaneButton} - aria-describedby="right-propertyPaneButton" - iconProps={{ - iconName: 'AlignRight', - style: { - fontSize: '20px' - } - }} /> - - - this._applyFormat('align', 'justify')} - className={styles.propertyPaneButton} - aria-describedby="justify-propertyPaneButton" - iconProps={{ - iconName: 'AlignJustify', - style: { - fontSize: '20px' - } - }} /> - - - this._applyFormat('script', this.state.formats!.script === 'super' ? '' : 'super')} - className={styles.propertyPaneButton} - aria-describedby="increaseindent-propertyPaneButton" - iconProps={{ - iconName: 'IncreaseIndentLegacy', - style: { - fontSize: '20px' - } - }} /> - - - this._applyFormat('script', this.state.formats!.script === 'sub' ? '' : 'sub')} - className={styles.propertyPaneButton} - aria-describedby="decreaseindent-propertyPaneButton" - iconProps={{ - iconName: 'DecreaseIndentLegacy', - style: { - fontSize: '20px' - } - }} /> - + + this.applyFormat('align', 'right')} + className={styles.propertyPaneButton} + aria-describedby="right-propertyPaneButton" + iconProps={{ + iconName: 'AlignRight', + style: { + fontSize: '20px' + } + }} /> + + + + this.applyFormat('align', 'justify')} + className={styles.propertyPaneButton} + aria-describedby="justify-propertyPaneButton" + iconProps={{ + iconName: 'AlignJustify', + style: { + fontSize: '20px' + } + }} /> + + + + this.applyFormat('script', this.state.formats!.script === 'super' ? '' : 'super')} + className={styles.propertyPaneButton} + aria-describedby="increaseindent-propertyPaneButton" + iconProps={{ + iconName: 'IncreaseIndentLegacy', + style: { + fontSize: '20px' + } + }} /> + + + + this.applyFormat('script', this.state.formats!.script === 'sub' ? '' : 'sub')} + className={styles.propertyPaneButton} + aria-describedby="decreaseindent-propertyPaneButton" + iconProps={{ + iconName: 'DecreaseIndentLegacy', + style: { + fontSize: '20px' + } + }} /> + +
-
; + ); } - private _renderListStylesGroup = (): JSX.Element => { + /** + * Render list styles group + */ + private renderListStylesGroup = (): JSX.Element => { return
- - this._applyFormat('list', 'bullet')} - className={styles.propertyPaneButton} - aria-describedby="bullet-propertyPaneButton" - iconProps={{ - iconName: 'BulletedList', - style: { - fontSize: '20px' - } - }} /> + + this.applyFormat('list', 'bullet')} + className={styles.propertyPaneButton} + aria-describedby="bullet-propertyPaneButton" + iconProps={{ + iconName: 'BulletedList', + style: { + fontSize: '20px' + } + }} /> - - this._applyFormat('list', 'ordered')} - className={styles.propertyPaneButton} - aria-describedby="ordered-propertyPaneButton" - iconProps={{ - iconName: 'NumberedList', - style: { - fontSize: '20px' - } - }} /> + + + this.applyFormat('list', 'ordered')} + className={styles.propertyPaneButton} + aria-describedby="ordered-propertyPaneButton" + iconProps={{ + iconName: 'NumberedList', + style: { + fontSize: '20px' + } + }} />
; } - private _renderHyperlinkStylesGroup = (): JSX.Element => { - return
-
-
- - this.props.onLink()} - className={styles.propertyPaneButton} - aria-describedby="link-propertyPaneButton" - iconProps={{ - iconName: 'Link', - style: { - fontSize: '20px' - } - }} /> - - - this._applyFormat('link', false)} - className={styles.propertyPaneButton} - aria-describedby="unlink-propertyPaneButton" - iconProps={{ - iconName: 'RemoveLink', - style: { - fontSize: '20px' - } - }} /> - + /** + * Render hyperlink styles group + */ + private renderHyperlinkStylesGroup = (): JSX.Element => { + return ( +
+
+
+ + this.props.onLink()} + className={styles.propertyPaneButton} + aria-describedby="link-propertyPaneButton" + iconProps={{ + iconName: 'Link', + style: { + fontSize: '20px' + } + }} /> + + + + this.applyFormat('link', false)} + className={styles.propertyPaneButton} + aria-describedby="unlink-propertyPaneButton" + iconProps={{ + iconName: 'RemoveLink', + style: { + fontSize: '20px' + } + }} /> + +
-
; + ); + } + + /** + * Handle fill color change + */ + private handleFillColorChanged = (color: string) => { + this.applyFormat('color', color); } - private _onChangeHeading = (item: IDropdownOption): void => { + /** + * Handle the hightlight color change + */ + private handleHighlightColorChanged = (color: string) => { + this.applyFormat('background', color); + } + + /** + * On heading change + */ + private onChangeHeading = (item: IDropdownOption): void => { const newHeadingValue = item.key === 0 ? '' : item.key.toString(); - this._applyFormat("header", newHeadingValue); + this.applyFormat("header", newHeadingValue); } - private _onChangeSize = (item: IDropdownOption): void => { + /** + * On size change + */ + private onChangeSize = (item: IDropdownOption): void => { const newSizeValue = item.key === 0 ? '' : item.key.toString(); - this._applyFormat("size", newSizeValue); + this.applyFormat("size", newSizeValue); } - private _applyFormat(name: string, value: any) { + /** + * Apply the new format + * + * @param name + * @param value + */ + private applyFormat(name: string, value: any) { const quill = this.props.editor; quill.format(name, value); - setTimeout( - () => { - this.onChangeSelection(quill.getSelection()); - }, - 100 - ); + setTimeout(() => { + this.onChangeSelection(quill.getSelection()); + }, 100); } - private _handleUndo = (): void => { + /** + * Handle the undo action + */ + private handleUndo = (): void => { const quill = this.props.editor; quill!.getModule("history")!.undo(); - setTimeout( - () => { - this.onChangeSelection(quill.getSelection()); - }, - 100 - ); + setTimeout(() => { + this.onChangeSelection(quill.getSelection()); + }, 100); } - private _handleClearFormatting = (): void => { + /** + * Handle the clear formatting action + */ + private handleClearFormatting = (): void => { const quill = this.props.editor; var range = quill.getSelection(); if (range) { if (range.length > 0) { quill.removeFormat(range.index, range.length); - setTimeout( - () => { - this.onChangeSelection(quill.getSelection()); - }, - 100 - ); + setTimeout(() => { + this.onChangeSelection(quill.getSelection()); + }, 100); } } } - private _handleRedo = (): void => { + /** + * Handle the redo action + */ + private handleRedo = (): void => { const quill = this.props.editor; quill!.getModule("history")!.redo(); - setTimeout( - () => { - this.onChangeSelection(quill.getSelection()); - }, - 100 - ); + setTimeout(() => { + this.onChangeSelection(quill.getSelection()); + }, 100); } - private _handleRenderNavigation = (): JSX.Element => { + /** + * Navigation render + */ + private handleRenderNavigation = (): JSX.Element => { return ( ); } diff --git a/src/controls/richText/RichTextPropertyPane.types.ts b/src/controls/richText/RichTextPropertyPane.types.ts index 129564945..d824e0467 100644 --- a/src/controls/richText/RichTextPropertyPane.types.ts +++ b/src/controls/richText/RichTextPropertyPane.types.ts @@ -1,4 +1,4 @@ -import ReactQuill, { Quill } from 'react-quill'; +import { Quill } from 'react-quill'; export interface IRichTextPropertyPaneProps { className?: string; diff --git a/src/controls/richText/RteColorPicker.tsx b/src/controls/richText/RteColorPicker.tsx index 0dd87f6e2..93fdb05d6 100644 --- a/src/controls/richText/RteColorPicker.tsx +++ b/src/controls/richText/RteColorPicker.tsx @@ -1,18 +1,17 @@ import * as React from 'react'; +import * as strings from 'ControlStrings'; import styles from './RteColorPicker.module.scss'; -import { css } from 'office-ui-fabric-react/lib/Utilities'; +import SwatchColorPickerGroup from './SwatchColorPickerGroup'; import { IRteColorPickerProps, IRteColorPickerState } from './RteColorPicker.types'; import { DefaultButton } from 'office-ui-fabric-react/lib/Button'; import { TooltipHost } from 'office-ui-fabric-react/lib/Tooltip'; import { Icon } from 'office-ui-fabric-react/lib/Icon'; import { Callout } from 'office-ui-fabric-react/lib/Callout'; -import SwatchColorPickerGroup from './SwatchColorPickerGroup'; import { ISwatchColor } from './SwatchColorPickerGroup.types'; -import * as strings from 'ControlStrings'; import { ThemeColorHelper } from '../../common/utilities/ThemeColorHelper'; export default class RteColorPicker extends React.Component { - private _wrapperRef: any = undefined; + private wrapperRef: any = undefined; constructor(props: IRteColorPickerProps) { super(props); @@ -22,101 +21,87 @@ export default class RteColorPicker extends React.Component { - const { - buttonLabel, - defaultButtonLabel, - fillThemeColor, - id, - previewColor - } = this.props; + const { buttonLabel, defaultButtonLabel, fillThemeColor, id, previewColor } = this.props; + return (
-
- - this._handleColorChanged(previewColor)} - > - - +
this.wrapperRef = ref}> + + this.handleColorChanged(previewColor)}> + +
{buttonLabel}
- +
-
); } - private _handleSwitchToDefault = () => { + /** + * Handle switch to default + */ + private handleSwitchToDefault = () => { this.setState({ isCalloutVisible: !this.state.isCalloutVisible }); this.props.switchToDefaultColor(); } - private _handleColorChanged = (color: string) => { + + /** + * Handle color change + */ + private handleColorChanged = (color: string) => { this.setState({ isCalloutVisible: !this.state.isCalloutVisible }); this.props.onColorChanged(color); } - private _getSwatchColorPickerGroup = (pickerGroup: string) => { + /** + * Get swatch color picker group + */ + private getSwatchColorPickerGroup = (pickerGroup: string) => { let groupName: string = undefined; switch (pickerGroup) { case "themeColors": @@ -138,48 +123,39 @@ export default class RteColorPicker extends React.Component this._handleColorChanged(color)} - groupColors={groupColors} - selectedColor={this.props.selectedColor} - />); - } - - private _linkWrapper = (e: any) => { - this._wrapperRef = e; + return ( + + ); } } diff --git a/src/controls/richText/SwatchColorPickerGroup.tsx b/src/controls/richText/SwatchColorPickerGroup.tsx index ebfcd1d25..86a790b78 100644 --- a/src/controls/richText/SwatchColorPickerGroup.tsx +++ b/src/controls/richText/SwatchColorPickerGroup.tsx @@ -1,6 +1,5 @@ import * as React from 'react'; import styles from './RteColorPicker.module.scss'; -import { css } from 'office-ui-fabric-react/lib/Utilities'; import { Label } from 'office-ui-fabric-react/lib/Label'; import { ISwatchColorPickerGroupState, ISwatchColorPickerGroupProps, ISwatchColor } from './SwatchColorPickerGroup.types'; import { FocusZone, FocusZoneDirection, FocusZoneTabbableElements } from 'office-ui-fabric-react/lib/FocusZone'; @@ -10,47 +9,47 @@ import { chunk } from '@microsoft/sp-lodash-subset'; export default class SwatchColorPickerGroup extends React.Component { public render(): React.ReactElement { const colorRows = chunk(this.props.groupColors, 5); + return (
- +
- + { colorRows.map((cr: ISwatchColor[], rowIndex: number) => { - return ( - {cr.map((gc: ISwatchColor, index: number) => { - return (); - - })} - ); + return ( + + { + cr.map((gc: ISwatchColor, index: number) => { + return ( + + ); + }) + } + + ); }) } @@ -63,7 +62,7 @@ export default class SwatchColorPickerGroup extends React.Component + + Date: Thu, 28 Mar 2019 13:33:44 +0100 Subject: [PATCH 19/42] Version updates + changelog --- CHANGELOG.JSON | 13 +++++++++++++ CHANGELOG.md | 10 ++++++++++ docs/documentation/docs/about/release-notes.md | 10 ++++++++++ package.json | 2 +- src/common/telemetry/version.ts | 2 +- 5 files changed, 35 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.JSON b/CHANGELOG.JSON index 9cc95bee9..ac6928e3f 100644 --- a/CHANGELOG.JSON +++ b/CHANGELOG.JSON @@ -1,5 +1,18 @@ { "versions": [ + { + "version": "1.13.0", + "changes": { + "new": [ + "`RichText`: New control added [#20](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/20)" + ], + "enhancements": [], + "fixes": [] + }, + "contributions": [ + "[Hugo Bernier](https://github.com/hugoabernier)" + ] + }, { "version": "1.12.0", "changes": { diff --git a/CHANGELOG.md b/CHANGELOG.md index 16f6eed39..47b144574 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Releases +## 1.13.0 + +### New control(s) + +- `RichText`: New control added [#20](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/20) + +### Contributors + +Special thanks to our contributor: [Hugo Bernier](https://github.com/hugoabernier). + ## 1.12.0 ### New control(s) diff --git a/docs/documentation/docs/about/release-notes.md b/docs/documentation/docs/about/release-notes.md index 16f6eed39..47b144574 100644 --- a/docs/documentation/docs/about/release-notes.md +++ b/docs/documentation/docs/about/release-notes.md @@ -1,5 +1,15 @@ # Releases +## 1.13.0 + +### New control(s) + +- `RichText`: New control added [#20](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/20) + +### Contributors + +Special thanks to our contributor: [Hugo Bernier](https://github.com/hugoabernier). + ## 1.12.0 ### New control(s) diff --git a/package.json b/package.json index d43456599..d16818eb0 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@pnp/spfx-controls-react", "description": "Reusable React controls for SharePoint Framework solutions", - "version": "1.12.0", + "version": "1.13.0", "engines": { "node": ">=0.10.0" }, diff --git a/src/common/telemetry/version.ts b/src/common/telemetry/version.ts index 8ab92fdb3..84492a6cf 100644 --- a/src/common/telemetry/version.ts +++ b/src/common/telemetry/version.ts @@ -1 +1 @@ -export const version: string = "1.12.0"; \ No newline at end of file +export const version: string = "1.13.0"; \ No newline at end of file From 4f2e1c8eed66298515b2d13621357bb12204d23f Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Thu, 28 Mar 2019 18:02:09 +0100 Subject: [PATCH 20/42] Documentation changes + sample update --- .../docs/controls/WebPartTitle.MoreLink.md | 39 ------------------- .../docs/controls/WebPartTitle.md | 34 +++++++++++++++- src/controls/webPartTitle/WebPartTitle.tsx | 19 ++++++--- .../controlsTest/components/ControlsTest.tsx | 8 +++- 4 files changed, 52 insertions(+), 48 deletions(-) delete mode 100644 docs/documentation/docs/controls/WebPartTitle.MoreLink.md diff --git a/docs/documentation/docs/controls/WebPartTitle.MoreLink.md b/docs/documentation/docs/controls/WebPartTitle.MoreLink.md deleted file mode 100644 index cdea79633..000000000 --- a/docs/documentation/docs/controls/WebPartTitle.MoreLink.md +++ /dev/null @@ -1,39 +0,0 @@ -# WebPartTitle: Adding a 'More' link - -It is quite common for SharePoint web parts to show a _See all_ option next to the web part title. - -You can achieve this look by using the `moreLink` prop. - -## The `moreLink` prop - -In order to render a hyperlink to the right of the web part title, you must specify the `moreLink` prop of the `WebPartTitle` component. - -To do so, you may pass the children elements you wish to render as the _See all_ link, as in the following example code: - -```TypeScript -See all - } /> -``` - -If you wish, you may pass a callback function instead, as per the following example code: - -```TypeScript - { - return (See all); - } - } /> -``` - -## The result - -The resulting web part title will look like the following: - -![More Link](../assets/webparttitle-morelink.png) diff --git a/docs/documentation/docs/controls/WebPartTitle.md b/docs/documentation/docs/controls/WebPartTitle.md index 188eb40a7..120218275 100644 --- a/docs/documentation/docs/controls/WebPartTitle.md +++ b/docs/documentation/docs/controls/WebPartTitle.md @@ -50,6 +50,38 @@ import { WebPartTitle } from "@pnp/spfx-controls-react/lib/WebPartTitle"; updateProperty={this.props.updateProperty} /> ``` +## Adding a "see all" link + +Since version `1.13.0` the WebPartTitle control has the ability to show a "see all" link by using the `moreLink` property. The property gives you the flexibility to render the link or component you want to show next to the web part title. + +You can do this as like in the following example code: + +```TypeScript +See all + } /> +``` + +If you wish, you may pass a callback function instead, as per the following example code: + +```TypeScript + { + return (See all); + } + } /> +``` + +The resulting web part title will look like the following: + +![More Link](../assets/webparttitle-morelink.png) + ## Implementation The WebPartTitle control can be configured with the following properties: @@ -61,6 +93,6 @@ The WebPartTitle control can be configured with the following properties: | updateProperty | Function | yes | Function that you can pass to update the title in the root web part. | | className | string | no | Optional property to specify a custom class that allows you to change the web part title style. | | placeholder | string | no | Optional property to specify a custom placeholder to display when the title is editable. | -| moreLink | Function or JSX.Element | no | Optional property to render a _See all_ link in the web part title. | +| moreLink | Function \| JSX.Element | no | Optional property to render a _See all_ link in the web part title. | ![](https://telemetry.sharepointpnp.com/sp-dev-fx-controls-react/wiki/controls/WebPartTitle) diff --git a/src/controls/webPartTitle/WebPartTitle.tsx b/src/controls/webPartTitle/WebPartTitle.tsx index 02fb6fd98..47f6bea31 100644 --- a/src/controls/webPartTitle/WebPartTitle.tsx +++ b/src/controls/webPartTitle/WebPartTitle.tsx @@ -2,7 +2,6 @@ import * as React from 'react'; import * as strings from 'ControlStrings'; import { DisplayMode } from '@microsoft/sp-core-library'; import styles from './WebPartTitle.module.scss'; -import { css } from 'office-ui-fabric-react/lib/Utilities'; import * as telemetry from '../../common/telemetry'; export interface IWebPartTitleProps { @@ -46,19 +45,27 @@ export class WebPartTitle extends React.Component { public render(): React.ReactElement { if (this.props.title || this.props.moreLink || this.props.displayMode === DisplayMode.Edit) { return ( -
+
{ - this.props.displayMode === DisplayMode.Edit && + this.props.displayMode === DisplayMode.Edit && ( + + ) } { this.props.displayMode !== DisplayMode.Edit && this.props.title && {this.props.title} }
- {this.props.moreLink && - {typeof this.props.moreLink === "function" ? this.props.moreLink() : this.props.moreLink} - } + { + this.props.moreLink && ( + + { + typeof this.props.moreLink === "function" ? this.props.moreLink() : this.props.moreLink + } + + ) + }
); } diff --git a/src/webparts/controlsTest/components/ControlsTest.tsx b/src/webparts/controlsTest/components/ControlsTest.tsx index bde388fd8..b582d1077 100644 --- a/src/webparts/controlsTest/components/ControlsTest.tsx +++ b/src/webparts/controlsTest/components/ControlsTest.tsx @@ -30,6 +30,7 @@ import { TermActionsDisplayStyle } from '../../../controls/taxonomyPicker'; import { TermLabelAction, TermActionsDisplayMode } from '../../../controls/taxonomyPicker/termActions'; import { ListItemAttachments } from '../../../ListItemAttachments'; import { RichText } from '../../../RichText'; +import { Link } from 'office-ui-fabric-react/lib/components/Link'; /** * Component that can be used to test out the React controls from this project @@ -245,8 +246,11 @@ export default class ControlsTest extends React.Component + title={this.props.title} + updateProperty={this.props.updateProperty} + moreLink={ + See all + } /> From 8456bcec6ffe6f12ff902a511ad2b962df43f6dd Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Thu, 28 Mar 2019 18:04:42 +0100 Subject: [PATCH 21/42] Updated changelog + documentation --- CHANGELOG.JSON | 4 +++- CHANGELOG.md | 4 ++++ docs/documentation/docs/about/release-notes.md | 4 ++++ docs/documentation/mkdocs.yml | 1 + 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.JSON b/CHANGELOG.JSON index ac6928e3f..fcc51d970 100644 --- a/CHANGELOG.JSON +++ b/CHANGELOG.JSON @@ -6,7 +6,9 @@ "new": [ "`RichText`: New control added [#20](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/20)" ], - "enhancements": [], + "enhancements": [ + "`WebPartTitle`: Added the ability to render a `see all` link or custom component [#228](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/228)" + ], "fixes": [] }, "contributions": [ diff --git a/CHANGELOG.md b/CHANGELOG.md index 47b144574..dfb04a168 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ - `RichText`: New control added [#20](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/20) +### Enhancements + +- `WebPartTitle`: Added the ability to render a `see all` link or custom component [#228](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/228) + ### Contributors Special thanks to our contributor: [Hugo Bernier](https://github.com/hugoabernier). diff --git a/docs/documentation/docs/about/release-notes.md b/docs/documentation/docs/about/release-notes.md index 47b144574..dfb04a168 100644 --- a/docs/documentation/docs/about/release-notes.md +++ b/docs/documentation/docs/about/release-notes.md @@ -6,6 +6,10 @@ - `RichText`: New control added [#20](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/20) +### Enhancements + +- `WebPartTitle`: Added the ability to render a `see all` link or custom component [#228](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/228) + ### Contributors Special thanks to our contributor: [Hugo Bernier](https://github.com/hugoabernier). diff --git a/docs/documentation/mkdocs.yml b/docs/documentation/mkdocs.yml index 9b4b7baa8..cb918a297 100644 --- a/docs/documentation/mkdocs.yml +++ b/docs/documentation/mkdocs.yml @@ -20,6 +20,7 @@ nav: - "ListView: add a contextual menu": 'controls/ListView.ContextualMenu.md' - Map: 'controls/Map.md' - Placeholder: 'controls/Placeholder.md' + - RichText: 'controls/RichText.md' - SiteBreadcrumb: 'controls/SiteBreadcrumb.md' - WebPartTitle: 'controls/WebPartTitle.md' - SecurityTrimmedControl: 'controls/SecurityTrimmedControl.md' From ee037d545e9fbfd604c69bb2e1f7788eb4f7701d Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Thu, 28 Mar 2019 20:20:48 +0100 Subject: [PATCH 22/42] #260 - Added support for PDF icon file type --- src/controls/fileTypeIcon/FileTypeIcon.tsx | 58 ++++++++++++++----- src/controls/fileTypeIcon/IFileTypeIcon.ts | 11 +++- .../controlsTest/components/ControlsTest.tsx | 3 + 3 files changed, 55 insertions(+), 17 deletions(-) diff --git a/src/controls/fileTypeIcon/FileTypeIcon.tsx b/src/controls/fileTypeIcon/FileTypeIcon.tsx index 0f79b9a33..e044f365f 100644 --- a/src/controls/fileTypeIcon/FileTypeIcon.tsx +++ b/src/controls/fileTypeIcon/FileTypeIcon.tsx @@ -1,12 +1,13 @@ import * as React from 'react'; import { findIndex } from '@microsoft/sp-lodash-subset'; -import { IFileTypeIconProps, ApplicationType, ApplicationIconList, IconType, IconSizes, ImageSize, IImageResult, ICON_GENERIC_16, ICON_GENERIC_48, ICON_GENERIC_96 } from './IFileTypeIcon'; +import { IFileTypeIconProps, ApplicationType, ApplicationIconList, IconType, IconSizes, ImageSize, IImageResult, ICON_GENERIC_16, ICON_GENERIC_48, ICON_GENERIC_96, ImageInformation } from './IFileTypeIcon'; import * as telemetry from '../../common/telemetry'; import { Icon, IconType as IconUIType } from 'office-ui-fabric-react/lib/components/Icon'; import * as styles from './FileTypeIcon.module.scss'; const ICON_GENERIC = 'Page'; const ICON_DEFAULT_SIZE = 'icon16'; +const ICON_CDN_URL = `https://spoprod-a.akamaihd.net/files/fabric/assets/item-types`; /** * File type icon component @@ -36,7 +37,7 @@ export class FileTypeIcon extends React.Component { // Check the known file extensions list const iconName = this._getIconByExtension(fileExtension.toLowerCase(), IconType.font); if (iconName !== null) { - className = iconName; + className = iconName.image; } } // Check if the application name has been provided @@ -44,7 +45,7 @@ export class FileTypeIcon extends React.Component { const application: ApplicationType = this.props.application; const iconName = this._getIconByApplicationType(application, IconType.font); if (iconName !== null) { - className = iconName; + className = iconName.image; } } @@ -57,7 +58,7 @@ export class FileTypeIcon extends React.Component { */ private _getIconImageName(): IImageResult { let size = ICON_DEFAULT_SIZE; - let image: string | null = null; + let imageInfo: ImageInformation = null; // Get the right icon size to display if (typeof this.props.size !== 'undefined' && this.props.size !== null) { @@ -70,17 +71,18 @@ export class FileTypeIcon extends React.Component { const path: string = this.props.path; const fileExtension: string = this._getFileExtension(path); // Get the image for the current file extension - image = this._getIconByExtension(fileExtension.toLowerCase(), IconType.image); + imageInfo = this._getIconByExtension(fileExtension.toLowerCase(), IconType.image); } // Check if the application name has been provided else if (typeof this.props.application !== 'undefined' && this.props.application !== null) { const application: ApplicationType = this.props.application; - image = this._getIconByApplicationType(application, IconType.image); + imageInfo = this._getIconByApplicationType(application, IconType.image); } return { - size: size, - image: image + size, + image: imageInfo && imageInfo.image ? imageInfo.image : null, + cdnFallback: imageInfo && imageInfo.cdnFallback ? imageInfo.cdnFallback : null }; } @@ -108,7 +110,7 @@ export class FileTypeIcon extends React.Component { * * @param extension File extension */ - private _getIconByExtension(extension: string, iconType: IconType): string { + private _getIconByExtension(extension: string, iconType: IconType): ImageInformation { // Find the application index by the provided extension const appIdx = findIndex(ApplicationIconList, item => { return item.extensions.indexOf(extension.toLowerCase()) !== -1; }); @@ -116,16 +118,25 @@ export class FileTypeIcon extends React.Component { if (appIdx !== -1) { // Check the type of icon, the image needs to get checked for the name if (iconType === IconType.font) { - return ApplicationIconList[appIdx].iconName; + return { + image: ApplicationIconList[appIdx].iconName, + cdnFallback: null + }; } else { const knownImgs = ApplicationIconList[appIdx].imageName; // Check if the file extension is known const imgIdx = knownImgs.indexOf(extension); if (imgIdx !== -1) { - return knownImgs[imgIdx]; + return { + image: knownImgs[imgIdx], + cdnFallback: ApplicationIconList[appIdx].cdnImageName || null + }; } else { // Return the first one if it was not known - return knownImgs[0]; + return { + image: knownImgs[0], + cdnFallback: ApplicationIconList[appIdx].cdnImageName || null + }; } } } @@ -138,7 +149,7 @@ export class FileTypeIcon extends React.Component { * * @param application */ - private _getIconByApplicationType(application: ApplicationType, iconType: IconType): string { + private _getIconByApplicationType(application: ApplicationType, iconType: IconType): ImageInformation { // Find the application index by the provided extension const appIdx = findIndex(ApplicationIconList, item => item.application === application); @@ -146,11 +157,22 @@ export class FileTypeIcon extends React.Component { if (appIdx !== -1) { const knownApp = ApplicationIconList[appIdx]; if (iconType === IconType.font) { - return knownApp.iconName; + return { + image: knownApp.iconName, + cdnFallback: null + }; } else { // Check if the application has a known list of image types if (knownApp.imageName.length > 0) { - return knownApp.imageName[0]; + return { + image: knownApp.imageName[0], + cdnFallback: null + }; + } else { + return { + image: null, + cdnFallback: knownApp.cdnImageName || null + }; } } } @@ -187,8 +209,12 @@ export class FileTypeIcon extends React.Component { // Return an image icon element const iconImage = this._getIconImageName(); // Check if the image was found, otherwise a generic image will be returned - if (typeof iconImage.image !== 'undefined' && iconImage.image !== null) { + if (iconImage.image) { iconElm = ; + } else if (iconImage.cdnFallback) { + const iconUrl = `${ICON_CDN_URL}/${iconImage.size.replace("icon", "")}/${iconImage.cdnFallback}.png`; + console.log(iconUrl); + iconElm = ; } else { // Return a generic image let imgElm = ; diff --git a/src/controls/fileTypeIcon/IFileTypeIcon.ts b/src/controls/fileTypeIcon/IFileTypeIcon.ts index 1bdf50023..99997e5ca 100644 --- a/src/controls/fileTypeIcon/IFileTypeIcon.ts +++ b/src/controls/fileTypeIcon/IFileTypeIcon.ts @@ -48,6 +48,7 @@ export interface IApplicationIcons { extensions: string[]; iconName: string; imageName: string[]; + cdnImageName?: string; } /** @@ -118,7 +119,8 @@ export const ApplicationIconList: IApplicationIcons[] = [ application: ApplicationType.PDF, extensions: ['pdf'], iconName: 'PDF', - imageName: [] + imageName: [], + cdnImageName: 'pdf' }, { application: ApplicationType.PowerApps, @@ -189,6 +191,13 @@ export interface IImageResult { size: string; image: string; + cdnFallback: string; +} + +export interface ImageInformation { + + image: string; + cdnFallback: string; } /** diff --git a/src/webparts/controlsTest/components/ControlsTest.tsx b/src/webparts/controlsTest/components/ControlsTest.tsx index b582d1077..22e06b835 100644 --- a/src/webparts/controlsTest/components/ControlsTest.tsx +++ b/src/webparts/controlsTest/components/ControlsTest.tsx @@ -419,10 +419,13 @@ export default class ControlsTest extends React.Component      +   +
Icon size tester: +
From 134bfec5827707635d6e461fc8c274547ec41c37 Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Thu, 28 Mar 2019 20:22:06 +0100 Subject: [PATCH 23/42] Updated the changelog --- CHANGELOG.JSON | 1 + CHANGELOG.md | 1 + docs/documentation/docs/about/release-notes.md | 1 + 3 files changed, 3 insertions(+) diff --git a/CHANGELOG.JSON b/CHANGELOG.JSON index fcc51d970..d79384162 100644 --- a/CHANGELOG.JSON +++ b/CHANGELOG.JSON @@ -7,6 +7,7 @@ "`RichText`: New control added [#20](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/20)" ], "enhancements": [ + "`FileTypeIcon`: Added support for PDF icon file types [#260](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/260)", "`WebPartTitle`: Added the ability to render a `see all` link or custom component [#228](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/228)" ], "fixes": [] diff --git a/CHANGELOG.md b/CHANGELOG.md index dfb04a168..470fbf48b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ ### Enhancements +- `FileTypeIcon`: Added support for PDF icon file types [#260](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/260) - `WebPartTitle`: Added the ability to render a `see all` link or custom component [#228](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/228) ### Contributors diff --git a/docs/documentation/docs/about/release-notes.md b/docs/documentation/docs/about/release-notes.md index dfb04a168..470fbf48b 100644 --- a/docs/documentation/docs/about/release-notes.md +++ b/docs/documentation/docs/about/release-notes.md @@ -8,6 +8,7 @@ ### Enhancements +- `FileTypeIcon`: Added support for PDF icon file types [#260](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/260) - `WebPartTitle`: Added the ability to render a `see all` link or custom component [#228](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/228) ### Contributors From c1bec924649f74deceb2a80dc2f36201e9fcc709 Mon Sep 17 00:00:00 2001 From: Hugo Bernier Date: Wed, 2 Jan 2019 08:22:03 -0500 Subject: [PATCH 24/42] Update RichText.md --- docs/documentation/docs/controls/RichText.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/documentation/docs/controls/RichText.md b/docs/documentation/docs/controls/RichText.md index 24c3ad1ea..9b565c350 100644 --- a/docs/documentation/docs/controls/RichText.md +++ b/docs/documentation/docs/controls/RichText.md @@ -67,6 +67,6 @@ The RichText control can be configured with the following properties: | showUnderline | boolean | no | Indicates whether to show the **Underline** toolbar button or not. Note that this option is indenpendent from the other `show___` options. I.e.: Setting `showBold` to `false` will disable the **Bold** toolbar, but will not disable it from the formatting pane. Default value is `true` | > Note that setting `showAlign`, `showBold`, `showItalic`, `showLink`, `showList`, `showStyles`, or -`showUnderline` to `false` does *not* remove the user's ability to apply the button's associated formatting -- it only hides the toolbar option. If `showMore` is `true`, the options will remain available in the formatting pane. To prevent users from applying specific formats, use the `onChange` handler to parse the rich text and remove the formatting as desired. +`showUnderline` to `false` does *not* remove the user's ability to apply the button's associated formatting -- it only hides the toolbar option. Also, if `showMore` is `true`, all options remain available in the formatting pane -- regardless whether they were turned off using `show___`. To prevent users from applying specific formats, use the `onChange` handler to parse the rich text and remove the formatting as desired. ![](https://telemetry.sharepointpnp.com/sp-dev-fx-controls-react/wiki/controls/RichText) From c1f44de65a8305ca6441fc5f2424e954fa3b57ef Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Fri, 29 Mar 2019 11:38:55 +0100 Subject: [PATCH 25/42] Updated changelog --- CHANGELOG.JSON | 4 +++- CHANGELOG.md | 3 ++- docs/documentation/docs/about/release-notes.md | 3 ++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.JSON b/CHANGELOG.JSON index d79384162..efdba7c30 100644 --- a/CHANGELOG.JSON +++ b/CHANGELOG.JSON @@ -4,6 +4,7 @@ "version": "1.13.0", "changes": { "new": [ + "`Progress`: New control added [#230](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/230)", "`RichText`: New control added [#20](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/20)" ], "enhancements": [ @@ -13,7 +14,8 @@ "fixes": [] }, "contributions": [ - "[Hugo Bernier](https://github.com/hugoabernier)" + "[Hugo Bernier](https://github.com/hugoabernier)", + "[Alex Terentiev](https://github.com/AJIXuMuK)" ] }, { diff --git a/CHANGELOG.md b/CHANGELOG.md index 470fbf48b..8c7352d2d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ ### New control(s) +- `Progress`: New control added [#230](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/230) - `RichText`: New control added [#20](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/20) ### Enhancements @@ -13,7 +14,7 @@ ### Contributors -Special thanks to our contributor: [Hugo Bernier](https://github.com/hugoabernier). +Special thanks to our contributors (in alphabetical order): [Hugo Bernier](https://github.com/hugoabernier), [Alex Terentiev](https://github.com/AJIXuMuK). ## 1.12.0 diff --git a/docs/documentation/docs/about/release-notes.md b/docs/documentation/docs/about/release-notes.md index 470fbf48b..8c7352d2d 100644 --- a/docs/documentation/docs/about/release-notes.md +++ b/docs/documentation/docs/about/release-notes.md @@ -4,6 +4,7 @@ ### New control(s) +- `Progress`: New control added [#230](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/230) - `RichText`: New control added [#20](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/20) ### Enhancements @@ -13,7 +14,7 @@ ### Contributors -Special thanks to our contributor: [Hugo Bernier](https://github.com/hugoabernier). +Special thanks to our contributors (in alphabetical order): [Hugo Bernier](https://github.com/hugoabernier), [Alex Terentiev](https://github.com/AJIXuMuK). ## 1.12.0 From 6d0526bd8ffcacbda47b8632c879b5cf9fe1515a Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Fri, 29 Mar 2019 11:43:14 +0100 Subject: [PATCH 26/42] Updated changelog --- CHANGELOG.JSON | 5 ++++- CHANGELOG.md | 6 +++++- docs/documentation/docs/about/release-notes.md | 6 +++++- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.JSON b/CHANGELOG.JSON index efdba7c30..395e16b69 100644 --- a/CHANGELOG.JSON +++ b/CHANGELOG.JSON @@ -11,9 +11,12 @@ "`FileTypeIcon`: Added support for PDF icon file types [#260](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/260)", "`WebPartTitle`: Added the ability to render a `see all` link or custom component [#228](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/228)" ], - "fixes": [] + "fixes": [ + "`ListView`: Updated documentation for the `iconFieldName` property [#245](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/245)" + ] }, "contributions": [ + "[Francis](https://github.com/PzKfWg)", "[Hugo Bernier](https://github.com/hugoabernier)", "[Alex Terentiev](https://github.com/AJIXuMuK)" ] diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c7352d2d..0dbc5c376 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,9 +12,13 @@ - `FileTypeIcon`: Added support for PDF icon file types [#260](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/260) - `WebPartTitle`: Added the ability to render a `see all` link or custom component [#228](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/228) +### Fixes + +- `ListView`: Updated documentation for the `iconFieldName` property [#245](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/245) + ### Contributors -Special thanks to our contributors (in alphabetical order): [Hugo Bernier](https://github.com/hugoabernier), [Alex Terentiev](https://github.com/AJIXuMuK). +Special thanks to our contributors (in alphabetical order): [Francis](https://github.com/PzKfWg), [Hugo Bernier](https://github.com/hugoabernier), [Alex Terentiev](https://github.com/AJIXuMuK). ## 1.12.0 diff --git a/docs/documentation/docs/about/release-notes.md b/docs/documentation/docs/about/release-notes.md index 8c7352d2d..0dbc5c376 100644 --- a/docs/documentation/docs/about/release-notes.md +++ b/docs/documentation/docs/about/release-notes.md @@ -12,9 +12,13 @@ - `FileTypeIcon`: Added support for PDF icon file types [#260](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/260) - `WebPartTitle`: Added the ability to render a `see all` link or custom component [#228](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/228) +### Fixes + +- `ListView`: Updated documentation for the `iconFieldName` property [#245](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/245) + ### Contributors -Special thanks to our contributors (in alphabetical order): [Hugo Bernier](https://github.com/hugoabernier), [Alex Terentiev](https://github.com/AJIXuMuK). +Special thanks to our contributors (in alphabetical order): [Francis](https://github.com/PzKfWg), [Hugo Bernier](https://github.com/hugoabernier), [Alex Terentiev](https://github.com/AJIXuMuK). ## 1.12.0 From 1c13600677490ada8ca3ab24bbe6ea99025ee6e2 Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Fri, 29 Mar 2019 11:47:15 +0100 Subject: [PATCH 27/42] Updated changelog --- CHANGELOG.JSON | 2 ++ CHANGELOG.md | 3 ++- docs/documentation/docs/about/release-notes.md | 3 ++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.JSON b/CHANGELOG.JSON index 395e16b69..2bfed82db 100644 --- a/CHANGELOG.JSON +++ b/CHANGELOG.JSON @@ -8,6 +8,7 @@ "`RichText`: New control added [#20](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/20)" ], "enhancements": [ + "Added `Lithuanian` localization [#247](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/247)", "`FileTypeIcon`: Added support for PDF icon file types [#260](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/260)", "`WebPartTitle`: Added the ability to render a `see all` link or custom component [#228](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/228)" ], @@ -18,6 +19,7 @@ "contributions": [ "[Francis](https://github.com/PzKfWg)", "[Hugo Bernier](https://github.com/hugoabernier)", + "[Tautvydas Duda](https://github.com/ltdu)", "[Alex Terentiev](https://github.com/AJIXuMuK)" ] }, diff --git a/CHANGELOG.md b/CHANGELOG.md index 0dbc5c376..607f3a2a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ ### Enhancements +- Added `Lithuanian` localization [#247](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/247) - `FileTypeIcon`: Added support for PDF icon file types [#260](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/260) - `WebPartTitle`: Added the ability to render a `see all` link or custom component [#228](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/228) @@ -18,7 +19,7 @@ ### Contributors -Special thanks to our contributors (in alphabetical order): [Francis](https://github.com/PzKfWg), [Hugo Bernier](https://github.com/hugoabernier), [Alex Terentiev](https://github.com/AJIXuMuK). +Special thanks to our contributors (in alphabetical order): [Francis](https://github.com/PzKfWg), [Hugo Bernier](https://github.com/hugoabernier), [Tautvydas Duda](https://github.com/ltdu), [Alex Terentiev](https://github.com/AJIXuMuK). ## 1.12.0 diff --git a/docs/documentation/docs/about/release-notes.md b/docs/documentation/docs/about/release-notes.md index 0dbc5c376..607f3a2a0 100644 --- a/docs/documentation/docs/about/release-notes.md +++ b/docs/documentation/docs/about/release-notes.md @@ -9,6 +9,7 @@ ### Enhancements +- Added `Lithuanian` localization [#247](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/247) - `FileTypeIcon`: Added support for PDF icon file types [#260](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/260) - `WebPartTitle`: Added the ability to render a `see all` link or custom component [#228](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/228) @@ -18,7 +19,7 @@ ### Contributors -Special thanks to our contributors (in alphabetical order): [Francis](https://github.com/PzKfWg), [Hugo Bernier](https://github.com/hugoabernier), [Alex Terentiev](https://github.com/AJIXuMuK). +Special thanks to our contributors (in alphabetical order): [Francis](https://github.com/PzKfWg), [Hugo Bernier](https://github.com/hugoabernier), [Tautvydas Duda](https://github.com/ltdu), [Alex Terentiev](https://github.com/AJIXuMuK). ## 1.12.0 From 29d0910d2ad459ad9e4154bf08aa25790479d421 Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Fri, 29 Mar 2019 11:52:00 +0100 Subject: [PATCH 28/42] Update changelog --- CHANGELOG.JSON | 1 + CHANGELOG.md | 1 + docs/documentation/docs/about/release-notes.md | 1 + 3 files changed, 3 insertions(+) diff --git a/CHANGELOG.JSON b/CHANGELOG.JSON index 2bfed82db..befce6754 100644 --- a/CHANGELOG.JSON +++ b/CHANGELOG.JSON @@ -8,6 +8,7 @@ "`RichText`: New control added [#20](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/20)" ], "enhancements": [ + "Retrieve the user its profile picture from SharePoint instead of Office 365 / Outlook [#248](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/248)", "Added `Lithuanian` localization [#247](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/247)", "`FileTypeIcon`: Added support for PDF icon file types [#260](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/260)", "`WebPartTitle`: Added the ability to render a `see all` link or custom component [#228](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/228)" diff --git a/CHANGELOG.md b/CHANGELOG.md index 607f3a2a0..345f18fd4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ ### Enhancements +- Retrieve the user its profile picture from SharePoint instead of Office 365 / Outlook [#248](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/248) - Added `Lithuanian` localization [#247](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/247) - `FileTypeIcon`: Added support for PDF icon file types [#260](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/260) - `WebPartTitle`: Added the ability to render a `see all` link or custom component [#228](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/228) diff --git a/docs/documentation/docs/about/release-notes.md b/docs/documentation/docs/about/release-notes.md index 607f3a2a0..345f18fd4 100644 --- a/docs/documentation/docs/about/release-notes.md +++ b/docs/documentation/docs/about/release-notes.md @@ -9,6 +9,7 @@ ### Enhancements +- Retrieve the user its profile picture from SharePoint instead of Office 365 / Outlook [#248](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/248) - Added `Lithuanian` localization [#247](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/247) - `FileTypeIcon`: Added support for PDF icon file types [#260](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/260) - `WebPartTitle`: Added the ability to render a `see all` link or custom component [#228](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/228) From 892b6241f3aca0abf33c3424daf35d609301e85d Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Fri, 29 Mar 2019 11:55:30 +0100 Subject: [PATCH 29/42] Updated changelog --- CHANGELOG.JSON | 2 ++ CHANGELOG.md | 3 ++- docs/documentation/docs/about/release-notes.md | 3 ++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.JSON b/CHANGELOG.JSON index befce6754..1999c2ef1 100644 --- a/CHANGELOG.JSON +++ b/CHANGELOG.JSON @@ -14,6 +14,7 @@ "`WebPartTitle`: Added the ability to render a `see all` link or custom component [#228](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/228)" ], "fixes": [ + "`ListItemAttachments`: Updated import statement reference in the documentation [#254](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/254)", "`ListView`: Updated documentation for the `iconFieldName` property [#245](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/245)" ] }, @@ -21,6 +22,7 @@ "[Francis](https://github.com/PzKfWg)", "[Hugo Bernier](https://github.com/hugoabernier)", "[Tautvydas Duda](https://github.com/ltdu)", + "[Özgür Ersoy](https://github.com/moersoy)", "[Alex Terentiev](https://github.com/AJIXuMuK)" ] }, diff --git a/CHANGELOG.md b/CHANGELOG.md index 345f18fd4..941361d76 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,11 +16,12 @@ ### Fixes +- `ListItemAttachments`: Updated import statement reference in the documentation [#254](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/254) - `ListView`: Updated documentation for the `iconFieldName` property [#245](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/245) ### Contributors -Special thanks to our contributors (in alphabetical order): [Francis](https://github.com/PzKfWg), [Hugo Bernier](https://github.com/hugoabernier), [Tautvydas Duda](https://github.com/ltdu), [Alex Terentiev](https://github.com/AJIXuMuK). +Special thanks to our contributors (in alphabetical order): [Francis](https://github.com/PzKfWg), [Hugo Bernier](https://github.com/hugoabernier), [Tautvydas Duda](https://github.com/ltdu), [Özgür Ersoy](https://github.com/moersoy), [Alex Terentiev](https://github.com/AJIXuMuK). ## 1.12.0 diff --git a/docs/documentation/docs/about/release-notes.md b/docs/documentation/docs/about/release-notes.md index 345f18fd4..941361d76 100644 --- a/docs/documentation/docs/about/release-notes.md +++ b/docs/documentation/docs/about/release-notes.md @@ -16,11 +16,12 @@ ### Fixes +- `ListItemAttachments`: Updated import statement reference in the documentation [#254](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/254) - `ListView`: Updated documentation for the `iconFieldName` property [#245](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/245) ### Contributors -Special thanks to our contributors (in alphabetical order): [Francis](https://github.com/PzKfWg), [Hugo Bernier](https://github.com/hugoabernier), [Tautvydas Duda](https://github.com/ltdu), [Alex Terentiev](https://github.com/AJIXuMuK). +Special thanks to our contributors (in alphabetical order): [Francis](https://github.com/PzKfWg), [Hugo Bernier](https://github.com/hugoabernier), [Tautvydas Duda](https://github.com/ltdu), [Özgür Ersoy](https://github.com/moersoy), [Alex Terentiev](https://github.com/AJIXuMuK). ## 1.12.0 From 9126ec462210aeacd8a96b7c2c2e10a6bb0a4d75 Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Fri, 29 Mar 2019 20:42:07 +0100 Subject: [PATCH 30/42] #21 - code refactoring + MaskTextField implemention --- .../docs/assets/DateTimePicker-12h.png | Bin 0 -> 2969 bytes .../docs/assets/DateTimePicker-24h.png | Bin 0 -> 2915 bytes .../docs/assets/DateTimePicker-dateOnly.png | Bin 0 -> 2022 bytes .../docs/controls/DateTimePicker.md | 88 +++++ docs/documentation/docs/index.md | 1 + docs/documentation/mkdocs.yml | 1 + src/DateTimePicker.ts | 1 + .../dateTimePicker/DateTimeConventions.ts | 21 ++ .../dateTimePicker/DateTimePicker.module.scss | 47 +++ .../dateTimePicker/DateTimePicker.tsx | 347 ++++++++++++++++++ .../dateTimePicker/DateTimePickerStrings.ts | 98 +++++ .../dateTimePicker/HoursComponent.tsx | 46 +++ .../dateTimePicker/IDateTimePickerProps.ts | 94 +++++ .../dateTimePicker/IDateTimePickerState.ts | 10 + .../dateTimePicker/IDateTimePickerStrings.ts | 9 + .../dateTimePicker/ITimeComponentProps.ts | 18 + .../dateTimePicker/MinutesComponent.tsx | 27 ++ .../dateTimePicker/SecondsComponent.tsx | 27 ++ src/controls/dateTimePicker/TimeHelper.ts | 58 +++ src/controls/dateTimePicker/index.ts | 6 + .../errorMessage/ErrorMessage.module.scss | 14 + src/controls/errorMessage/ErrorMessage.tsx | 27 ++ src/controls/progress/Progress.tsx | 12 +- src/index.ts | 1 + src/loc/en-us.ts | 48 ++- src/loc/fr-fr.ts | 50 ++- src/loc/mystrings.d.ts | 47 +++ src/loc/nl-nl.ts | 50 ++- src/loc/ru-ru.ts | 48 +++ .../controlsTest/components/ControlsTest.tsx | 105 ++++-- .../components/IControlsTestProps.ts | 1 + 31 files changed, 1273 insertions(+), 29 deletions(-) create mode 100644 docs/documentation/docs/assets/DateTimePicker-12h.png create mode 100644 docs/documentation/docs/assets/DateTimePicker-24h.png create mode 100644 docs/documentation/docs/assets/DateTimePicker-dateOnly.png create mode 100644 docs/documentation/docs/controls/DateTimePicker.md create mode 100644 src/DateTimePicker.ts create mode 100644 src/controls/dateTimePicker/DateTimeConventions.ts create mode 100644 src/controls/dateTimePicker/DateTimePicker.module.scss create mode 100644 src/controls/dateTimePicker/DateTimePicker.tsx create mode 100644 src/controls/dateTimePicker/DateTimePickerStrings.ts create mode 100644 src/controls/dateTimePicker/HoursComponent.tsx create mode 100644 src/controls/dateTimePicker/IDateTimePickerProps.ts create mode 100644 src/controls/dateTimePicker/IDateTimePickerState.ts create mode 100644 src/controls/dateTimePicker/IDateTimePickerStrings.ts create mode 100644 src/controls/dateTimePicker/ITimeComponentProps.ts create mode 100644 src/controls/dateTimePicker/MinutesComponent.tsx create mode 100644 src/controls/dateTimePicker/SecondsComponent.tsx create mode 100644 src/controls/dateTimePicker/TimeHelper.ts create mode 100644 src/controls/dateTimePicker/index.ts create mode 100644 src/controls/errorMessage/ErrorMessage.module.scss create mode 100644 src/controls/errorMessage/ErrorMessage.tsx diff --git a/docs/documentation/docs/assets/DateTimePicker-12h.png b/docs/documentation/docs/assets/DateTimePicker-12h.png new file mode 100644 index 0000000000000000000000000000000000000000..5372b8a9ba420ff1ffe2f45119fad6cd13e2f023 GIT binary patch literal 2969 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 J+S2#V-vJV7vmO8d literal 0 HcmV?d00001 diff --git a/docs/documentation/docs/assets/DateTimePicker-24h.png b/docs/documentation/docs/assets/DateTimePicker-24h.png new file mode 100644 index 0000000000000000000000000000000000000000..13672703618f391f6cfb75506748933ae4490e21 GIT binary patch literal 2915 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 Da*TEc literal 0 HcmV?d00001 diff --git a/docs/documentation/docs/assets/DateTimePicker-dateOnly.png b/docs/documentation/docs/assets/DateTimePicker-dateOnly.png new file mode 100644 index 0000000000000000000000000000000000000000..5158434678966091991738f816369fa1f097ad94 GIT binary patch literal 2022 zcma)-do7zrhpB4X1FX54d)I@9@MuXX-8Yya`Q&-<+PUC;Wi=Y2oxp*i8t zDl4ih0sx?FkF#|K02oesx09EZo}2*Xb!mc;oX^?-oF0uCX#w{K9Y6r6N>+0NB&|EnpoXzxe`y9L3%ibdBU23(DqLP3AL{nMi4u8maRt2ih<=w(<&s$}9d)W6c%CrNG?=-9U$ zHS3l@QS%;Xz6n=Y0I4YB9oni3{7?c3^SHfN)pttp*i6BQ_A2@!av1wf(SQ=ej~2gh z78bt7x}5o=AKOLOG2UOE>$nfJZZF>v@WPiD7#=6!`t90Sf7ji@#-UXqrt8^qNo{Qk zse7)6l((kDf0&&`;R+F0uD>^3$9j^|UQZOO`OsRQU9PTpds*C`&U^l+u2QJ~)-L_S zQ;X5ADxbF&8}tO}$J{f>OiwW0)?i3?Go#9-z~G`J$>RnB-Bqqm2`C%V2+XTPkyv#O zqgQ#CY~H0n$B(|d{JmL1eShD{8(U5%&kuE5+s<-tyc;XCWIUd9ZkTIepj*UG@yrKX zzYapRTl8?(t6V5ub7qRepVw$$4mRXQluqq&^?8nP6YEBc8%s^AZlw@vOz&HRKlbxx ztcR_A-k0-CbCcS7JPGTBtAv|td{`9n@|U(Anyz2ROPUs z>Qsl}%_cxAOk$W>M7gbTI)095Gc#Q?uISur#jjTH*zd~-`Pob@=*RgD8u`P>s({uw%j>e~V8ue6IECW25LEcmpuT2Meo+wvx5#VDI3CW5;f@VKyV2g&Q8dDd zv`S=|{WAwJg5hDVC9pX1@J3cM$k(;E7n+7`rCtw~b-$HQU~sQInb-R{MBb?Vj?ZWo z*}=F(#izIIzfPS{bAHUpUmF2SbrB#!GX}fCEAb&zih5hZStK=6Wcq!wUqfAEyuEBV~amDf5m?lo=?lg$g-gA zte(~Y49oS<@s*u*DgI6R7o(c*Iy7?(S=E+0f??{JtjYf3&MuSO_?d0=)w?o#by~8u z9OKS9GUf1TX7Wa)Lym7=`Em2KaAK3WN&|j}RX{AO_=no{NwZ{hPHQn`|N80X_w>5p zopVp=gi&^2_y#-~5Phw!BJqS``h|*dBM{P5xV6=<; zbtn4Dl9kr24f!!4Jm82s8;{swQfQ%fAmqn+D97=QXrl&`L-%Gm%shHaC|=BrI(~QP zed5U%JK{HfNCWy|VZ&+-)@yEr?>VnM>D?jNCS5RQ4@77SrP9>259={w6A@r393M+c zQ)n{jgIsC6bP?+SQcLi=Y;@&$rd?j*g<4eWs{8Sd--*RlOLg;;zX#euchg46NEnaN zx6GvGpehd((j5obGbBb(%GsmIh{8I5b&rAwy7%aHa%7fV%=h13?I`%7&?NRnQCb^0 zRzn=;prElpiz~$|R((3Mp}FA+y$q+WG-iMU{-^3KA6nTl?`m4qv$-N1#~*1&oM@e~ z&|Hfd%XeX7(-w{hVk$flggkenr7Z^36qi@+y*%@A;8di;v*sRjcX#T0Pwa|1< + +// Controlled + +``` + +## Implementation + +The `DateTimePicker` control can be configured with the following properties: + + +| Property | Type | Required | Description | +| ---- | ---- | ---- | ---- | +| label | string | no | Property field label displayed on top. | +| disabled | boolean | no | Specifies if the control is disabled or not. | +| formatDate | function | no | Defines a formatDate function that can override the output value in Date picker. | +| dateConvention | DateConvention | no | Defines the date convention to use. The default is date and time.| +| timeConvention | TimeConvention | no | Defines the time convention to use. The default value is the 24-hour clock convention. | +| firstDayOfWeek | DayOfWeek | no | Specify the first day of the week for your locale. | +| key | string | no | A unique key that indicates the identity of this control | +| onGetErrorMessage | function | no | The method is used to get the validation error message and determine whether the input value is valid or not. See [this documentation](https://dev.office.com/sharepoint/docs/spfx/web-parts/guidance/validate-web-part-property-values) to learn how to use it. | +| showGoToToday | boolean | no | Controls whether the "Go to today" link should be shown or not | +| isMonthPickerVisible | boolean | no | Controls whether the month picker is shown beside the day picker or hidden. | +| showMonthPickerAsOverlay | boolean | no | Show month picker on top of date picker when visible. | +| showWeekNumbers | boolean | no | Controls whether the calendar should show the week number (weeks 1 to 53) before each week row | +| strings | IDatePickerStrings | no | Localized strings to use in the DateTimePicker | +| value | Date | no | Default value of the DatePicker, if any | +| onChange | function | no | Callback issued when date or time is changed | +| showSeconds | boolean | no | Specifies, if seconds dropdown should be shown, defaults to false. | + +Enum `DateConvention` + +| Name | Description | +| ---- | ---- | +| DateTime | Shows the date and time picker | +| Date | Shows only the date picker | + +Enum `TimeConvention` + +| Name | Description | +| ---- | ---- | +| Hours12 | Specify the hours in 12-hours (AM / PM) time convention. | +| Hours24 | Specify the hours in 24-hours time convention. | + +Interface `IDateTimePickerStrings` extends [IDatePickerStrings](https://developer.microsoft.com/en-us/fabric#/components/datepicker) + +| Property | Type | Required | Description | +| ---- | ---- | ---- | ---- | +| dateLabel | string | no | Label for the date selector. | +| timeLabel | string | no | Label for the time of day selector. | +| timeSeparator | string | no | Separator between time of day components (hours, minutes, seconds). | +| amDesignator | string | no | Used as AM designator when 12-hour clock is used. | +| pmDesignator | string | no | Used as PM designator when 12-hour clock is used. | + +![](https://telemetry.sharepointpnp.com/sp-dev-fx-controls-react/wiki/controls/DateTimePicker) diff --git a/docs/documentation/docs/index.md b/docs/documentation/docs/index.md index 3d1a5be51..4557d214f 100644 --- a/docs/documentation/docs/index.md +++ b/docs/documentation/docs/index.md @@ -35,6 +35,7 @@ Once the package is installed, you will have to configure the resource file of t The following controls are currently available: - [Charts](./controls/ChartControls) (makes it easy to integrate [Chart.js](https://www.chartjs.org/) charts into web part) +- [DateTimePicker](./controls/DateTimePicker) (DateTime Picker) - [FileTypeIcon](./controls/FileTypeIcon) (Control that shows the icon of a specified file path or application) - [IFrameDialog](./controls/IFrameDialog) (renders a Dialog with an iframe as a content) - [ListItemPicker](./controls/ListItemPicker) (allows to select one or more items from a list) diff --git a/docs/documentation/mkdocs.yml b/docs/documentation/mkdocs.yml index 80019b0c2..596b95318 100644 --- a/docs/documentation/mkdocs.yml +++ b/docs/documentation/mkdocs.yml @@ -12,6 +12,7 @@ nav: - "Polar Area Chart": 'controls/charts/PolarAreaChart.md' - "Radar Chart": 'controls/charts/RadarChart.md' - "Scatter Chart": 'controls/charts/ScatterChart.md' + - DateTimePicker: 'controls/DateTimePicker.md' - FileTypeIcon: 'controls/FileTypeIcon.md' - IFrameDialog: 'controls/IFrameDialog.md' - IFramePanel: 'controls/IFramePanel.md' diff --git a/src/DateTimePicker.ts b/src/DateTimePicker.ts new file mode 100644 index 000000000..f0c29b319 --- /dev/null +++ b/src/DateTimePicker.ts @@ -0,0 +1 @@ +export * from './controls/dateTimePicker/index'; diff --git a/src/controls/dateTimePicker/DateTimeConventions.ts b/src/controls/dateTimePicker/DateTimeConventions.ts new file mode 100644 index 000000000..7c9309714 --- /dev/null +++ b/src/controls/dateTimePicker/DateTimeConventions.ts @@ -0,0 +1,21 @@ +export enum TimeConvention { + /** + * The 12-hour clock is a time convention in which the 24 hours of the day are + * divided into two periods: a.m. and p.m. + */ + Hours12 = 1, + /** + * The 24-hour clock is the convention of time keeping in which the day runs from midnight to + * midnight and is divided into 24 hours, indicated by the hours passed since midnight, from 0 to 23 + */ + Hours24 +} + +/** + * Time convention + */ +export enum DateConvention { + + DateTime = 1, + Date +} diff --git a/src/controls/dateTimePicker/DateTimePicker.module.scss b/src/controls/dateTimePicker/DateTimePicker.module.scss new file mode 100644 index 000000000..5983ec1ec --- /dev/null +++ b/src/controls/dateTimePicker/DateTimePicker.module.scss @@ -0,0 +1,47 @@ +.dateTimePicker { + + .container { + display: flex; + flex-direction: column; + + .hidden { + display: none; + } + + .row { + display: flex; + flex-direction: row; + justify-content: space-between; + + &.timeRow { + margin-top: 3px; + } + + .picker { + flex-grow: 1; + } + + .time { + flex-grow: 1; + display: flex; + flex-direction: row; + justify-content: space-between; + } + } + } + + .labelCell { + vertical-align: top; + min-width: 55px; + } + + .separator { + vertical-align: top; + padding-left: 5px; + padding-right: 5px; + } + + .fieldLabel { + margin-right: 10px; + } +} diff --git a/src/controls/dateTimePicker/DateTimePicker.tsx b/src/controls/dateTimePicker/DateTimePicker.tsx new file mode 100644 index 000000000..df91340a9 --- /dev/null +++ b/src/controls/dateTimePicker/DateTimePicker.tsx @@ -0,0 +1,347 @@ +import * as React from "react"; +import { isEqual } from '@microsoft/sp-lodash-subset'; +import { TimeConvention, DateConvention } from "./DateTimeConventions"; +import { DatePicker } from "office-ui-fabric-react/lib/DatePicker"; +import { Label } from "office-ui-fabric-react/lib/Label"; +import { IDropdownOption } from "office-ui-fabric-react/lib/Dropdown"; +import * as strings from "ControlStrings"; +import ErrorMessage from "../errorMessage/ErrorMessage"; +import styles from "./DateTimePicker.module.scss"; +import HoursComponent from "./HoursComponent"; +import MinutesComponent from "./MinutesComponent"; +import SecondsComponent from "./SecondsComponent"; +import * as telemetry from "../../common/telemetry"; +import { Async, css } from 'office-ui-fabric-react/lib/Utilities'; +import { IDateTimePickerProps, IDateTimePickerState, DateTimePickerStrings } from "."; +import { TimeHelper } from "./TimeHelper"; + +interface IDateComponents { + day: Date; + hours: number; + minutes: number; + seconds: number; +} + +/** + * Renders the controls for DateTimePicker component + */ +export class DateTimePicker extends React.Component { + private _latestValidateValue: number = NaN; + private async: Async; + private delayedValidate: (value: Date) => void; + + /** + * Constructor + */ + constructor(props: IDateTimePickerProps) { + super(props); + telemetry.track('ReactDateTimePicker', { + dateConvention: props.dateConvention ? DateConvention[props.dateConvention] : '', + formatDate: !!props.formatDate, + timeConvention: props.timeConvention ? TimeConvention[props.timeConvention] : '', + disabled: props.disabled + }); + + // Get the current date/time values + const { value = null } = this.props; + const { day, hours, minutes, seconds } = DateTimePicker.getDateComponents(value, props.dateConvention); + + // Set the current state + this.state = { + day, + hours, + minutes, + seconds, + errorMessage: '' + }; + + this.async = new Async(this); + this.delayedValidate = this.async.debounce(this.validate, props.deferredValidationTime); + } + + /** + * Called when the component will unmount + */ + public componentWillUnmount() { + this.async.dispose(); + } + + /** + * Called before the component receives new props, used for matching state with new props. + */ + public componentWillReceiveProps(nextProps: IDateTimePickerProps): void { + if (nextProps.value != null && !isEqual(nextProps.value, this.props.value)) { + const { day, hours, minutes, seconds } = DateTimePicker.getDateComponents(nextProps.value, this.props.dateConvention); + this.setState({ day, hours, minutes, seconds }); + } + } + + /** + * Get the components of a Date object matching the DateConvention settings + * @param date Date to extract components from + * @param dateConvention DateConvention to follow when extracting date components + */ + private static getDateComponents(date: Date, dateConvention: DateConvention): IDateComponents { + const day: Date | null = TimeHelper.cloneDate(date); + const hours: number = dateConvention !== DateConvention.Date && day !== null ? day.getHours() : 0; + const minutes: number = dateConvention !== DateConvention.Date && day !== null ? day.getMinutes() : 0; + const seconds: number = dateConvention !== DateConvention.Date && day !== null ? day.getSeconds() : 0; + if (day !== null) { + day.setHours(hours); + day.setMinutes(minutes); + day.setSeconds(seconds); + } + return { day, hours, minutes, seconds }; + } + + /** + * Function called when the DatePicker Office UI Fabric component selected date changed + */ + private onSelectDate = (date: Date): void => { + if (!TimeHelper.isValidDate(date)) { + return; + } + // Get hours, minutes and seconds from state or default to zero + const { hours = 0, minutes = 0, seconds = 0 } = this.state; + const day = TimeHelper.cloneDate(date); + day.setHours(hours); + day.setMinutes(minutes); + day.setSeconds(seconds); + this.setState({ day }, () => this.delayedValidate(this.state.day)); + } + + + + /** + * Function called when hours value have been changed + * @param element Hours dropdown value + */ + private dropdownHoursChanged = (value?: string): void => { + this.setState(({ day }) => { + const hoursSplit = value.split(" "); + const hoursValue = hoursSplit[0].length > 2 ? hoursSplit[0].substring(0, 2) : hoursSplit[0]; + let hours: number = parseInt(hoursValue); + if (isNaN(hours)) { + return; + } + + if (this.props.timeConvention !== TimeConvention.Hours24) { + if (hoursSplit[1] && hoursSplit[1].toLowerCase().indexOf("pm") !== -1) { + hours += 12; + if (hours === 24) { + hours = 0; + } + } + } + + if (hours > 23) { + return; + } + + const state: Partial = { hours }; + const date: Date = TimeHelper.cloneDate(day); + if (date) { + date.setHours(hours); + state.day = date; + } + return state; + }, () => this.delayedValidate(this.state.day)); + } + + /** + * Function called when minutes value have been changed + * @param element Minutes dropdown value + */ + private dropdownMinutesChanged = (value?: string): void => { + this.setState(({ day }) => { + const minutes: number = parseInt(value.length > 2 ? value.substring(0, 2) : value); + const state: Partial = { minutes }; + const date: Date = TimeHelper.cloneDate(day); + if (date) { + date.setMinutes(minutes); + state.day = date; + } + return state; + }, () => this.delayedValidate(this.state.day)); + } + + /** + * Function called when seconds value have been changed + * @param element Seconds dropdown value + */ + private dropdownSecondsChanged = (value?: string): void => { + this.setState(({ day }) => { + const seconds: number = parseInt(value.length > 2 ? value.substring(0, 2) : value); + const state: Partial = { seconds }; + const date: Date = TimeHelper.cloneDate(day); + if (date) { + date.setSeconds(seconds); + state.day = date; + } + return state; + }, () => this.delayedValidate(this.state.day)); + } + + /** + * Renders the control + */ + public render(): JSX.Element { + // use date value from props if it exists, otherwise use internal state + // if no dateConvention is set, default is DateConvention.DateTime + const { + label, + disabled, + timeConvention, + dateConvention = DateConvention.DateTime, + firstDayOfWeek, + isMonthPickerVisible = true, + showGoToToday, + showMonthPickerAsOverlay = false, + showWeekNumbers = false, + showSeconds = false, + formatDate, + value = this.state.day, + strings: dateStrings = new DateTimePickerStrings() // Defines the DatePicker control labels + } = this.props; + + const hours: number = value != null ? value.getHours() : this.state.hours; + const minutes: number = value != null ? value.getMinutes() : this.state.minutes; + const seconds: number = value != null ? value.getSeconds() : this.state.seconds; + + // Check if the time element needs to be rendered + let timeElm: JSX.Element =
; + + if (dateConvention === DateConvention.DateTime) { + timeElm = ( +
+
+ +
+
+ +
+ +
+ +
+ +
+ +
+ + { + showSeconds && ( +
+ +
+ ) + } + + { + showSeconds && ( +
+ +
+ ) + } +
+
); + } + + // Renders content + return ( +
+ { + label && + } + +
+
+
+ +
+ +
+ +
+
+ + {timeElm} +
+ + +
+ ); + } + + /** + * Validates the new custom field value + */ + private validate = (dateVal: Date): void => { + if (typeof this.props.onGetErrorMessage === 'undefined' || this.props.onGetErrorMessage === null) { + this.notifyAfterValidate(this.props.value, dateVal); + return; + } + + const timestamp = dateVal.getTime(); + + if (this._latestValidateValue === timestamp) { + return; + } + + this._latestValidateValue = timestamp; + + const result: string | PromiseLike = this.props.onGetErrorMessage(dateVal); + if (typeof result !== 'undefined') { + if (typeof result === 'string') { + if (result === '') { + this.notifyAfterValidate(this.props.value, dateVal); + } + + this.setState({ + errorMessage: result + }); + } else { + result.then((errorMessage: string) => { + if (typeof errorMessage === 'undefined' || errorMessage === '') { + this.notifyAfterValidate(this.props.value, dateVal); + } + + this.setState({ + errorMessage: errorMessage + }); + }); + } + } else { + this.notifyAfterValidate(this.props.value, dateVal); + } + } + + /** + * Notifies the parent Web Part of a property value change + */ + private notifyAfterValidate = (oldValue: Date, newValue: Date) => { + if (typeof this.props.onChange !== 'undefined' && this.props.onChange !== null && newValue !== null) { + this.props.onChange(newValue); + } + } +} diff --git a/src/controls/dateTimePicker/DateTimePickerStrings.ts b/src/controls/dateTimePicker/DateTimePickerStrings.ts new file mode 100644 index 000000000..aaec7e15f --- /dev/null +++ b/src/controls/dateTimePicker/DateTimePickerStrings.ts @@ -0,0 +1,98 @@ +import * as strings from 'ControlStrings'; +import { IDateTimePickerStrings } from '.'; + +/** + * Defines the labels of the DatePicker control (as months, days, etc.) + */ +export class DateTimePickerStrings implements IDateTimePickerStrings { + /** + * An array of strings for the full names of months. + * The array is 0-based, so months[0] should be the full name of January. + */ + public months: string[] = [ + strings.DatePickerMonthLongJanuary, + strings.DatePickerMonthLongFebruary, + strings.DatePickerMonthLongMarch, + strings.DatePickerMonthLongApril, + strings.DatePickerMonthLongMay, + strings.DatePickerMonthLongJune, + strings.DatePickerMonthLongJuly, + strings.DatePickerMonthLongAugust, + strings.DatePickerMonthLongSeptember, + strings.DatePickerMonthLongOctober, + strings.DatePickerMonthLongNovember, + strings.DatePickerMonthLongDecember + ]; + /** + * An array of strings for the short names of months. + * The array is 0-based, so shortMonths[0] should be the short name of January. + */ + public shortMonths: string[] = [ + strings.DatePickerMonthShortJanuary, + strings.DatePickerMonthShortFebruary, + strings.DatePickerMonthShortMarch, + strings.DatePickerMonthShortApril, + strings.DatePickerMonthShortMay, + strings.DatePickerMonthShortJune, + strings.DatePickerMonthShortJuly, + strings.DatePickerMonthShortAugust, + strings.DatePickerMonthShortSeptember, + strings.DatePickerMonthShortOctober, + strings.DatePickerMonthShortNovember, + strings.DatePickerMonthShortDecember + ]; + /** + * An array of strings for the full names of days of the week. + * The array is 0-based, so days[0] should be the full name of Sunday. + */ + public days: string[] = [ + strings.DatePickerDayLongSunday, + strings.DatePickerDayLongMonday, + strings.DatePickerDayLongTuesday, + strings.DatePickerDayLongWednesday, + strings.DatePickerDayLongThursday, + strings.DatePickerDayLongFriday, + strings.DatePickerDayLongSaturday + ]; + /** + * An array of strings for the initials of the days of the week. + * The array is 0-based, so days[0] should be the initial of Sunday. + */ + public shortDays: string[] = [ + strings.DatePickerDayShortSunday, + strings.DatePickerDayShortMonday, + strings.DatePickerDayShortTuesday, + strings.DatePickerDayShortWednesday, + strings.DatePickerDayShortThursday, + strings.DatePickerDayShortFriday, + strings.DatePickerDayShortSaturday + ]; + /** + * String to render for button to direct the user to today's date. + */ + public goToToday: string = strings.DatePickerGoToToday; + /** + * Error message to render for TextField if isRequired validation fails. + */ + public isRequiredErrorMessage: string = strings.DatePickerIsRequiredErrorMessage; + /** + * Error message to render for TextField if input date string parsing fails. + */ + public invalidInputErrorMessage: string = strings.DatePickerInvalidInputErrorMessage; + /** + * Error message to render for TextField if date boundary (minDate, maxDate) validation fails. + */ + public isOutOfBoundsErrorMessage: string = strings.DatePickerIsOutOfBoundsErrorMessage; + /** + * Label for the date selector. + */ + public dateLabel: string = strings.DateTimePickerDate; + /** + * Label for the time of day selector. + */ + public timeLabel: string = strings.DateTimePickerTime; + /** + * Separator between time of day components (hours, minutes, seconds). + */ + public timeSeparator: string = strings.DateTimePickerTimeSeparator; +} diff --git a/src/controls/dateTimePicker/HoursComponent.tsx b/src/controls/dateTimePicker/HoursComponent.tsx new file mode 100644 index 000000000..a338e6c9c --- /dev/null +++ b/src/controls/dateTimePicker/HoursComponent.tsx @@ -0,0 +1,46 @@ +import * as React from 'react'; +import { IHoursComponentProps } from './ITimeComponentProps'; +import { TimeConvention } from './DateTimeConventions'; +import { MaskedTextField } from 'office-ui-fabric-react/lib/TextField'; +import { TimeHelper } from './TimeHelper'; + +/** + * Hours component, this renders the hours dropdown + */ +export default class HoursComponent extends React.Component { + + public render(): JSX.Element { + return ( + { + let message = ""; + const hours: number = parseInt(value); + if (isNaN(hours)) { + message = "Incorrect hour value"; + } + + if (!message && this.props.timeConvention === TimeConvention.Hours24) { + message = hours > 23 ? "Incorrect hour value" : ""; + } else { + message = hours > 12 ? "Incorrect hour value" : ""; + } + + if (!message) { + this.props.onChange(value); + } + + return message; + }} /> + ); + } +} diff --git a/src/controls/dateTimePicker/IDateTimePickerProps.ts b/src/controls/dateTimePicker/IDateTimePickerProps.ts new file mode 100644 index 000000000..f68063027 --- /dev/null +++ b/src/controls/dateTimePicker/IDateTimePickerProps.ts @@ -0,0 +1,94 @@ +import { DayOfWeek } from 'office-ui-fabric-react/lib/utilities/dateValues/DateValues'; +import { TimeConvention, DateConvention } from './DateTimeConventions'; +import { IDateTimePickerStrings } from './IDateTimePickerStrings'; + +/** + * Public properties of the DateTimePicker custom field + * + */ +export interface IDateTimePickerProps { + + /** + * Property field label displayed on top + */ + label?: string; + /** + * Specify if the control needs to be disabled + */ + disabled?: boolean; + /** + * Defines a formatDate function to display the date of the custom Field. + * By defaut date.toDateString() is used. + */ + formatDate?: (date: Date) => string; + /** + * Defines the date convention to use. The default is date and time. + */ + dateConvention?: DateConvention; + /** + * Defines the time convention to use. The default value is the 24-hour clock convention. + */ + timeConvention?: TimeConvention; + /** + * Specify the first day of the week for your locale. + */ + firstDayOfWeek?: DayOfWeek; + /** + * An UNIQUE key indicates the identity of this control + */ + key?: string; + /** + * The method is used to get the validation error message and determine whether the input value is valid or not. + * + * When it returns string: + * - If valid, it returns empty string. + * - If invalid, it returns the error message string and the text field will + * show a red border and show an error message below the text field. + * + * When it returns Promise: + * - The resolved value is display as error message. + * - The rejected, the value is thrown away. + * + */ + onGetErrorMessage?: (value: Date) => string | Promise; + /** + * Custom Field will start to validate after users stop typing for `deferredValidationTime` milliseconds. + * Default value is 200. + */ + deferredValidationTime?: number; + /** + * Whether the "Go to today" link should be shown or not + */ + showGoToToday?: boolean; + /** + * Whether the month picker is shown beside the day picker or hidden. + * @defaultvalue true + */ + isMonthPickerVisible?: boolean; + /** + * Show month picker on top of date picker when visible. + * @defaultvalue false + */ + showMonthPickerAsOverlay?: boolean; + /** + * Whether the calendar should show the week number (weeks 1 to 53) before each week row + * @defaultvalue false + */ + showWeekNumbers?: boolean; + /** + * Default value of the DatePicker, if any + */ + value?: Date; + /** + * Callback issued when date/time is changed + */ + onChange?: (date: Date | null | undefined) => void; + /* + * Localized strings to use in the DateTimePicker. + */ + strings?: IDateTimePickerStrings; + /** + * Specifies, if seconds dropdown should be shown, defaults to false. + */ + showSeconds?: boolean; +} diff --git a/src/controls/dateTimePicker/IDateTimePickerState.ts b/src/controls/dateTimePicker/IDateTimePickerState.ts new file mode 100644 index 000000000..c1659a61b --- /dev/null +++ b/src/controls/dateTimePicker/IDateTimePickerState.ts @@ -0,0 +1,10 @@ +/** + * DateTimePicker state interface + */ +export interface IDateTimePickerState { + day?: Date; + hours?: number; + minutes?: number; + seconds?: number; + errorMessage?: string; +} diff --git a/src/controls/dateTimePicker/IDateTimePickerStrings.ts b/src/controls/dateTimePicker/IDateTimePickerStrings.ts new file mode 100644 index 000000000..05e370fa9 --- /dev/null +++ b/src/controls/dateTimePicker/IDateTimePickerStrings.ts @@ -0,0 +1,9 @@ +import { IDatePickerStrings } from 'office-ui-fabric-react/lib/DatePicker'; + +export interface IDateTimePickerStrings extends IDatePickerStrings { + dateLabel?: string; + timeLabel?: string; + timeSeparator?: string; + amDesignator?: string; + pmDesignator?: string; +} diff --git a/src/controls/dateTimePicker/ITimeComponentProps.ts b/src/controls/dateTimePicker/ITimeComponentProps.ts new file mode 100644 index 000000000..e5fd6f77e --- /dev/null +++ b/src/controls/dateTimePicker/ITimeComponentProps.ts @@ -0,0 +1,18 @@ +import { IDropdownOption } from 'office-ui-fabric-react/lib/components/Dropdown'; +import { TimeConvention } from './DateTimeConventions'; + +/** + * Time component properties interface + */ +export interface ITimeComponentProps { + disabled?: boolean; + value: number; + onChange: (value?: string) => void; +} + +/** + * Hours component property interface + */ +export interface IHoursComponentProps extends ITimeComponentProps { + timeConvention: TimeConvention; +} diff --git a/src/controls/dateTimePicker/MinutesComponent.tsx b/src/controls/dateTimePicker/MinutesComponent.tsx new file mode 100644 index 000000000..faf5e4f19 --- /dev/null +++ b/src/controls/dateTimePicker/MinutesComponent.tsx @@ -0,0 +1,27 @@ +import * as React from 'react'; +import { ITimeComponentProps } from './ITimeComponentProps'; +import { MaskedTextField } from 'office-ui-fabric-react/lib/TextField'; +import { TimeHelper } from './TimeHelper'; + +/** + * Minutes component, renders the minutes dropdown + */ +export default class MinutesComponent extends React.Component { + + public render(): JSX.Element { + return ( + { + this.props.onChange(value); + return ""; + }} + mask="59" + maskFormat={{ + '5': /[0-5]/, + '9': /[0-9]/ + }} /> + ); + } +} diff --git a/src/controls/dateTimePicker/SecondsComponent.tsx b/src/controls/dateTimePicker/SecondsComponent.tsx new file mode 100644 index 000000000..30c64b2bc --- /dev/null +++ b/src/controls/dateTimePicker/SecondsComponent.tsx @@ -0,0 +1,27 @@ +import * as React from 'react'; +import { ITimeComponentProps } from './ITimeComponentProps'; +import { MaskedTextField } from 'office-ui-fabric-react/lib/TextField'; +import { TimeHelper } from './TimeHelper'; + +/** + * Seconds component, renders the seconds dropdown + */ +export default class SecondsComponent extends React.Component { + + public render(): JSX.Element { + return ( + { + this.props.onChange(value); + return ""; + }} + mask="59" + maskFormat={{ + '5': /[0-5]/, + '9': /[0-9]/ + }} /> + ); + } +} diff --git a/src/controls/dateTimePicker/TimeHelper.ts b/src/controls/dateTimePicker/TimeHelper.ts new file mode 100644 index 000000000..c07df100e --- /dev/null +++ b/src/controls/dateTimePicker/TimeHelper.ts @@ -0,0 +1,58 @@ +import { TimeConvention } from "."; + +export class TimeHelper { + + /** + * Check if value is a valid date + * + * @param value + */ + public static isValidDate(value: any): value is Date { + return Object.prototype.toString.call(value) === '[object Date]' && !isNaN(value.getTime()); + } + + /** + * Clone the date + * + * @param date + */ + public static cloneDate(date: Date): Date { + return this.isValidDate(date) ? new Date(date.getTime()) : null; + } + + /** + * Suffix number with zero + */ + public static suffixZero(value: string, size: number = 2) { + while (value.length < size) { + value = `0${value}`; + } + return value; + } + + /** + * Format the hours value + * + * @param hours + * @param timeConvention + */ + public static hoursValue(hours: number, timeConvention: TimeConvention): string { + if (timeConvention === TimeConvention.Hours24) { + // 24 hours time convention + return this.suffixZero(hours.toString()); + } else { + // 12 hours time convention + if (hours === 0) { + return `12 AM`; + } else if (hours < 12) { + return `${this.suffixZero(hours.toString())} AM`; + } else { + if (hours === 12) { + return `12 PM`; + } else { + return `${this.suffixZero((hours % 12).toString())} PM`; + } + } + } + } +} diff --git a/src/controls/dateTimePicker/index.ts b/src/controls/dateTimePicker/index.ts new file mode 100644 index 000000000..f95d25f97 --- /dev/null +++ b/src/controls/dateTimePicker/index.ts @@ -0,0 +1,6 @@ +export * from './DateTimeConventions'; +export * from './IDateTimePickerProps'; +export * from './IDateTimePickerState'; +export * from './IDateTimePickerStrings'; +export * from './DateTimePickerStrings'; +export * from './DateTimePicker'; diff --git a/src/controls/errorMessage/ErrorMessage.module.scss b/src/controls/errorMessage/ErrorMessage.module.scss new file mode 100644 index 000000000..ab8391f80 --- /dev/null +++ b/src/controls/errorMessage/ErrorMessage.module.scss @@ -0,0 +1,14 @@ +.errorMessage { + font-size: 12px; + font-weight: 400; + color: #a80000; + margin: 0; + padding-top: 5px; + display: flex; + align-items: center; +} + +.errorIcon { + font-size: 14px; + margin-right: 5px; +} diff --git a/src/controls/errorMessage/ErrorMessage.tsx b/src/controls/errorMessage/ErrorMessage.tsx new file mode 100644 index 000000000..54ff8f5e7 --- /dev/null +++ b/src/controls/errorMessage/ErrorMessage.tsx @@ -0,0 +1,27 @@ +import * as React from 'react'; +import styles from './ErrorMessage.module.scss'; +import { Icon } from 'office-ui-fabric-react/lib/Icon'; + +export interface IFieldErrorMessageProps { + errorMessage: string; +} + +/** + * Component that shows an error message when something went wront with the property control + */ +export default class FieldErrorMessage extends React.Component { + public render(): JSX.Element { + if (this.props.errorMessage !== 'undefined' && this.props.errorMessage !== null && this.props.errorMessage !== '') { + return ( +
+

+ + {this.props.errorMessage} +

+
+ ); + } else { + return null; + } + } +} diff --git a/src/controls/progress/Progress.tsx b/src/controls/progress/Progress.tsx index f306962d5..762779129 100644 --- a/src/controls/progress/Progress.tsx +++ b/src/controls/progress/Progress.tsx @@ -1,9 +1,9 @@ import * as React from 'react'; -import { IProgressProps, IProgressAction, IActionProps, ProgressActionState, IProgressState } from './IProgress'; +import { IProgressProps, IProgressAction, ProgressActionState, IProgressState } from './IProgress'; import { Action } from './Action'; import { ProgressIndicator } from 'office-ui-fabric-react/lib/ProgressIndicator'; -import { css } from 'office-ui-fabric-react/lib/Utilities'; import styles from './Progress.module.scss'; +import * as telemetry from "../../common/telemetry"; /** * Component to show progress of multiple SEQUENTIALLY executed actions @@ -13,6 +13,8 @@ export class Progress extends React.Component { constructor(props: IProgressProps) { super(props); + telemetry.track('ReactProgress', {}); + this.state = { showLongRunningText: props.longRunningText && !props.longRunningTextDisplayDelay }; @@ -125,10 +127,10 @@ export class Progress extends React.Component { // progress indicator subtext is shown if showOverallProgress is set to true and there is a text to display (see if section above) // long running text is shown if there is a text and we waited needed delay time return ( -
+
{ (title || showOverallProgress || this.state.showLongRunningText) && ( -
+
{title}
{ @@ -150,7 +152,7 @@ export class Progress extends React.Component { ) } -
+
{actionEls}
diff --git a/src/index.ts b/src/index.ts index f3a0802d9..b750c85d9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -9,6 +9,7 @@ export * from './ListItemPicker'; export * from './ListItemAttachments'; export * from './ChartControl'; export * from './Progress'; +export * from './DateTimePicker'; export * from './IFrameDialog'; export * from './IFramePanel'; diff --git a/src/loc/en-us.ts b/src/loc/en-us.ts index ffc334ae6..6b790a9b2 100644 --- a/src/loc/en-us.ts +++ b/src/loc/en-us.ts @@ -162,6 +162,52 @@ define([], () => { StandardColorLightblue:"Light blue", StandardColorBlue:"Blue", StandardColorDarkblue:"Dark blue", - StandardColorPurple:"Purple" + StandardColorPurple:"Purple", + + DatePickerMonthLongJanuary: "January", + DatePickerMonthShortJanuary: "Jan", + DatePickerMonthLongFebruary: "February", + DatePickerMonthShortFebruary: "Feb", + DatePickerMonthLongMarch: "March", + DatePickerMonthShortMarch: "Mar", + DatePickerMonthLongApril: "April", + DatePickerMonthShortApril: "Apr", + DatePickerMonthLongMay: "May", + DatePickerMonthShortMay: "May", + DatePickerMonthLongJune: "June", + DatePickerMonthShortJune: "Jun", + DatePickerMonthLongJuly: "July", + DatePickerMonthShortJuly: "Jul", + DatePickerMonthLongAugust: "August", + DatePickerMonthShortAugust: "Aug", + DatePickerMonthLongSeptember: "September", + DatePickerMonthShortSeptember: "Sept", + DatePickerMonthLongOctober: "October", + DatePickerMonthShortOctober: "Oct", + DatePickerMonthLongNovember: "November", + DatePickerMonthShortNovember: "Nov", + DatePickerMonthLongDecember: "December", + DatePickerMonthShortDecember: "Dec", + DatePickerDayLongSunday: "Sunday", + DatePickerDayShortSunday: "Sun", + DatePickerDayLongMonday: "Monday", + DatePickerDayShortMonday: "Mon", + DatePickerDayLongTuesday: "Tuesday", + DatePickerDayShortTuesday: "Tue", + DatePickerDayLongWednesday: "Wednesday", + DatePickerDayShortWednesday: "Wed", + DatePickerDayLongThursday: "Thursday", + DatePickerDayShortThursday: "Thu", + DatePickerDayLongFriday: "Friday", + DatePickerDayShortFriday: "Fri", + DatePickerDayLongSaturday: "Saturday", + DatePickerDayShortSaturday: "Sat", + DatePickerGoToToday: "Today", + DatePickerIsRequiredErrorMessage: "", + DatePickerInvalidInputErrorMessage: "", + DatePickerIsOutOfBoundsErrorMessage: "", + DateTimePickerDate: "Date", + DateTimePickerTime: "Time", + DateTimePickerTimeSeparator: ":" }; }); diff --git a/src/loc/fr-fr.ts b/src/loc/fr-fr.ts index 12f810211..ccd4abcf8 100644 --- a/src/loc/fr-fr.ts +++ b/src/loc/fr-fr.ts @@ -81,6 +81,54 @@ define([], () => { ListItemAttachmentsloadingMessage: 'Uploading file ...', ListItemAttachmentslPlaceHolderIconText: 'List Item Attachment', ListItemAttachmentslPlaceHolderDescription: 'Please Add Attachment', - ListItemAttachmentslPlaceHolderButtonLabel: 'Add' + ListItemAttachmentslPlaceHolderButtonLabel: 'Add', + + DatePickerMonthLongJanuary: "Janvier", + DatePickerMonthShortJanuary: "Jan.", + DatePickerMonthLongFebruary: "Février", + DatePickerMonthShortFebruary: "Fev.", + DatePickerMonthLongMarch: "Mars", + DatePickerMonthShortMarch: "Mar.", + DatePickerMonthLongApril: "Avril", + DatePickerMonthShortApril: "Avr.", + DatePickerMonthLongMay: "Mai", + DatePickerMonthShortMay: "Mai", + DatePickerMonthLongJune: "Juin", + DatePickerMonthShortJune: "Juin", + DatePickerMonthLongJuly: "Juillet", + DatePickerMonthShortJuly: "Jul.", + DatePickerMonthLongAugust: "Août", + DatePickerMonthShortAugust: "Août", + DatePickerMonthLongSeptember: "Septembre", + DatePickerMonthShortSeptember: "Sept.", + DatePickerMonthLongOctober: "Octobre", + DatePickerMonthShortOctober: "Oct.", + DatePickerMonthLongNovember: "Novembre", + DatePickerMonthShortNovember: "Nov.", + DatePickerMonthLongDecember: "Decembre", + DatePickerMonthShortDecember: "Dec.", + DatePickerDayLongSunday: "Dimanche", + DatePickerDayShortSunday: "Dim", + DatePickerDayLongMonday: "Lundi", + DatePickerDayShortMonday: "Lun", + DatePickerDayLongTuesday: "Mardi", + DatePickerDayShortTuesday: "Mar", + DatePickerDayLongWednesday: "Mercredi", + DatePickerDayShortWednesday: "Mer", + DatePickerDayLongThursday: "Jeudi", + DatePickerDayShortThursday: "Jeu", + DatePickerDayLongFriday: "Vendredi", + DatePickerDayShortFriday: "Ven", + DatePickerDayLongSaturday: "Samedi", + DatePickerDayShortSaturday: "Sam", + DatePickerGoToToday: "Aujourd\'hui", + DatePickerIsRequiredErrorMessage: "", + DatePickerInvalidInputErrorMessage: "", + DatePickerIsOutOfBoundsErrorMessage: "", + DateTimePickerDate: "Date", + DateTimePickerTime: "Temps", + DateTimePickerTimeSeparator: ":", + AMDesignator: "AM", + PMDesignator: "PM" }; }); diff --git a/src/loc/mystrings.d.ts b/src/loc/mystrings.d.ts index 3b271f76e..6735907eb 100644 --- a/src/loc/mystrings.d.ts +++ b/src/loc/mystrings.d.ts @@ -135,6 +135,53 @@ declare interface IControlStrings { StandardColorBlue: string; StandardColorDarkblue: string; StandardColorPurple: string; + + // DateTime picker + DatePickerMonthLongJanuary: string; + DatePickerMonthShortJanuary: string; + DatePickerMonthLongFebruary: string; + DatePickerMonthShortFebruary: string; + DatePickerMonthLongMarch: string; + DatePickerMonthShortMarch: string; + DatePickerMonthLongApril: string; + DatePickerMonthShortApril: string; + DatePickerMonthLongMay: string; + DatePickerMonthShortMay: string; + DatePickerMonthLongJune: string; + DatePickerMonthShortJune: string; + DatePickerMonthLongJuly: string; + DatePickerMonthShortJuly: string; + DatePickerMonthLongAugust: string; + DatePickerMonthShortAugust: string; + DatePickerMonthLongSeptember: string; + DatePickerMonthShortSeptember: string; + DatePickerMonthLongOctober: string; + DatePickerMonthShortOctober: string; + DatePickerMonthLongNovember: string; + DatePickerMonthShortNovember: string; + DatePickerMonthLongDecember: string; + DatePickerMonthShortDecember: string; + DatePickerDayLongSunday: string; + DatePickerDayShortSunday: string; + DatePickerDayLongMonday: string; + DatePickerDayShortMonday: string; + DatePickerDayLongTuesday: string; + DatePickerDayShortTuesday: string; + DatePickerDayLongWednesday: string; + DatePickerDayShortWednesday: string; + DatePickerDayLongThursday: string; + DatePickerDayShortThursday: string; + DatePickerDayLongFriday: string; + DatePickerDayShortFriday: string; + DatePickerDayLongSaturday: string; + DatePickerDayShortSaturday: string; + DatePickerGoToToday: string; + DatePickerIsRequiredErrorMessage: string; + DatePickerInvalidInputErrorMessage: string; + DatePickerIsOutOfBoundsErrorMessage: string; + DateTimePickerDate: string; + DateTimePickerTime: string; + DateTimePickerTimeSeparator: string; } declare interface IDateTimeStrings { diff --git a/src/loc/nl-nl.ts b/src/loc/nl-nl.ts index 47a90567c..27863fd0a 100644 --- a/src/loc/nl-nl.ts +++ b/src/loc/nl-nl.ts @@ -81,6 +81,54 @@ define([], () => { genericNoResultsFoundText: 'Geen resultaten gevonden', - ListViewFilterLabel: "Filter de lijst" + ListViewFilterLabel: "Filter de lijst", + + DatePickerMonthLongJanuary: "Januari", + DatePickerMonthShortJanuary: "Jan", + DatePickerMonthLongFebruary: "Februari", + DatePickerMonthShortFebruary: "Feb", + DatePickerMonthLongMarch: "Maart", + DatePickerMonthShortMarch: "Maa", + DatePickerMonthLongApril: "April", + DatePickerMonthShortApril: "Apr", + DatePickerMonthLongMay: "Mei", + DatePickerMonthShortMay: "Mei", + DatePickerMonthLongJune: "Juni", + DatePickerMonthShortJune: "Jun", + DatePickerMonthLongJuly: "Juli", + DatePickerMonthShortJuly: "Jul", + DatePickerMonthLongAugust: "Augustus", + DatePickerMonthShortAugust: "Aug", + DatePickerMonthLongSeptember: "September", + DatePickerMonthShortSeptember: "Sept", + DatePickerMonthLongOctober: "Oktober", + DatePickerMonthShortOctober: "Okt", + DatePickerMonthLongNovember: "November", + DatePickerMonthShortNovember: "Nov", + DatePickerMonthLongDecember: "December", + DatePickerMonthShortDecember: "Dec", + DatePickerDayLongSunday: "Zondag", + DatePickerDayShortSunday: "Zon", + DatePickerDayLongMonday: "Maandag", + DatePickerDayShortMonday: "Maa", + DatePickerDayLongTuesday: "Dinsdag", + DatePickerDayShortTuesday: "Din", + DatePickerDayLongWednesday: "Woensdag", + DatePickerDayShortWednesday: "Woe", + DatePickerDayLongThursday: "Donderdag", + DatePickerDayShortThursday: "Don", + DatePickerDayLongFriday: "Vrijdag", + DatePickerDayShortFriday: "Vri", + DatePickerDayLongSaturday: "Zaterdag", + DatePickerDayShortSaturday: "Zat", + DatePickerGoToToday: "Vandaag", + DatePickerIsRequiredErrorMessage: "", + DatePickerInvalidInputErrorMessage: "", + DatePickerIsOutOfBoundsErrorMessage: "", + DateTimePickerDate: "Dag", + DateTimePickerTime: "Tijd", + DateTimePickerTimeSeparator: ":", + AMDesignator: "AM", + PMDesignator: "PM" }; }); diff --git a/src/loc/ru-ru.ts b/src/loc/ru-ru.ts index 6213fde37..9a468f466 100644 --- a/src/loc/ru-ru.ts +++ b/src/loc/ru-ru.ts @@ -82,5 +82,53 @@ define([], () => { ListItemAttachmentslPlaceHolderIconText: 'List Item Attachment', ListItemAttachmentslPlaceHolderDescription: 'Please Add Attachment', ListItemAttachmentslPlaceHolderButtonLabel: 'Add', + + DatePickerMonthLongJanuary: "Январь", + DatePickerMonthShortJanuary: "Янв", + DatePickerMonthLongFebruary: "Февраль", + DatePickerMonthShortFebruary: "Фев", + DatePickerMonthLongMarch: "Март", + DatePickerMonthShortMarch: "Мар", + DatePickerMonthLongApril: "Апрель", + DatePickerMonthShortApril: "Апр", + DatePickerMonthLongMay: "Май", + DatePickerMonthShortMay: "Май", + DatePickerMonthLongJune: "Июнь", + DatePickerMonthShortJune: "Июн", + DatePickerMonthLongJuly: "Июль", + DatePickerMonthShortJuly: "Июл", + DatePickerMonthLongAugust: "Август", + DatePickerMonthShortAugust: "Авг", + DatePickerMonthLongSeptember: "Сентябрь", + DatePickerMonthShortSeptember: "Сен", + DatePickerMonthLongOctober: "Октябрь", + DatePickerMonthShortOctober: "Окт", + DatePickerMonthLongNovember: "Ноябрь", + DatePickerMonthShortNovember: "Ноя", + DatePickerMonthLongDecember: "Декабрь", + DatePickerMonthShortDecember: "Дек", + DatePickerDayLongSunday: "Воскресенье", + DatePickerDayShortSunday: "Вс", + DatePickerDayLongMonday: "Понедельник", + DatePickerDayShortMonday: "Пн", + DatePickerDayLongTuesday: "Вторник", + DatePickerDayShortTuesday: "Вт", + DatePickerDayLongWednesday: "Среда", + DatePickerDayShortWednesday: "Ср", + DatePickerDayLongThursday: "Четверг", + DatePickerDayShortThursday: "Чт", + DatePickerDayLongFriday: "Пятница", + DatePickerDayShortFriday: "Пт", + DatePickerDayLongSaturday: "Суббота", + DatePickerDayShortSaturday: "Сб", + DatePickerGoToToday: "Сегодня", + DatePickerIsRequiredErrorMessage: "", + DatePickerInvalidInputErrorMessage: "", + DatePickerIsOutOfBoundsErrorMessage: "", + DateTimePickerDate: "Date", + DateTimePickerTime: "Time", + DateTimePickerTimeSeparator: ":", + AMDesignator: "AM", + PMDesignator: "PM" }; }); diff --git a/src/webparts/controlsTest/components/ControlsTest.tsx b/src/webparts/controlsTest/components/ControlsTest.tsx index 77ddfa4d5..0ff80b38f 100644 --- a/src/webparts/controlsTest/components/ControlsTest.tsx +++ b/src/webparts/controlsTest/components/ControlsTest.tsx @@ -20,6 +20,8 @@ import { Environment, EnvironmentType, DisplayMode } from '@microsoft/sp-core-li import { SecurityTrimmedControl, PermissionLevel } from '../../../SecurityTrimmedControl'; import { SPPermission } from '@microsoft/sp-page-context'; import { PeoplePicker, PrincipalType } from '../../../PeoplePicker'; +import { DayOfWeek } from 'office-ui-fabric-react/lib/utilities/dateValues/DateValues'; +import { DateTimePicker, DateConvention, TimeConvention } from '../../../DateTimePicker'; import { getItemClassNames } from 'office-ui-fabric-react/lib/components/ContextualMenu/ContextualMenu.classNames'; import { ListItemPicker } from "../../../ListItemPicker"; import { Map, ICoordinates, MapType } from '../../../Map'; @@ -50,7 +52,8 @@ export default class ControlsTest extends React.Component { + this.setState({ dateTimeValue }); + console.log("Selected Date/Time:", dateTimeValue.toLocaleString()); + } + /** * Selected lists change event * @param lists @@ -299,12 +311,18 @@ export default class ControlsTest extends React.ComponentSee all } /> + console.log("DateTimePicker value:", value)} /> + console.log("DateTimePicker value:", value)} /> + console.log("DateTimePicker value:", value)} /> + console.log("DateTimePicker value:", value)} /> + console.log("DateTimePicker value:", value)} /> + + itemId={1} + context={this.props.context} + disabled={false} /> + resolveDelay={200}/> + + + + + + + + + + + `${d.getFullYear()} - ${d.getMonth() + 1} - ${d.getDate()}`} + dateConvention={DateConvention.DateTime} + timeConvention={TimeConvention.Hours24} + firstDayOfWeek={DayOfWeek.Monday} + value={this.state.dateTimeValue} + onChange={this._onDateTimePickerChange} + isMonthPickerVisible={false} + showMonthPickerAsOverlay={true} + showWeekNumbers={true} + showSeconds={true} + /> + + + +
Field picker list data tester: - +
Services tester: - (term && term.Name && term.Name.toLowerCase() === "about us") }, - // new TermLabelAction("Get Labels") + // new TermLabelAction("Get Labels") ], termActionsDisplayMode: TermActionsDisplayMode.buttons, termActionsDisplayStyle: TermActionsDisplayStyle.textAndIcon @@ -595,15 +658,15 @@ export default class ControlsTest extends React.Component { this.setState({ iFramePanelOpened: true }); }} /> { this.setState({ iFramePanelOpened: false }); }} - iframeOnLoad={(iframe: any) => { console.log('iframe loaded'); }} - /> + url={iframeUrl} + type={PanelType.medium} + // height="300px" + headerText="iframe panel title" + closeButtonAriaLabel="Close" + isOpen={this.state.iFramePanelOpened} + onDismiss={() => { this.setState({ iFramePanelOpened: false }); }} + iframeOnLoad={(iframe: any) => { console.log('iframe loaded'); }} + />
diff --git a/src/webparts/controlsTest/components/IControlsTestProps.ts b/src/webparts/controlsTest/components/IControlsTestProps.ts index 93282b08e..119bce66d 100644 --- a/src/webparts/controlsTest/components/IControlsTestProps.ts +++ b/src/webparts/controlsTest/components/IControlsTestProps.ts @@ -21,4 +21,5 @@ export interface IControlsTestState { selectedList: string; progressActions: IProgressAction[]; currentProgressActionIndex?: number; + dateTimeValue: Date; } From 38c66547215098c73b891426103e59b9bf527262 Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Fri, 29 Mar 2019 20:49:44 +0100 Subject: [PATCH 31/42] Updated localization --- .../dateTimePicker/HoursComponent.tsx | 7 +-- src/loc/de-de.ts | 49 ++++++++++++++++++- src/loc/en-us.ts | 3 +- src/loc/fr-fr.ts | 3 +- src/loc/lt-lt.ts | 49 ++++++++++++++++++- src/loc/mystrings.d.ts | 1 + src/loc/nl-nl.ts | 3 +- src/loc/ru-ru.ts | 3 +- 8 files changed, 106 insertions(+), 12 deletions(-) diff --git a/src/controls/dateTimePicker/HoursComponent.tsx b/src/controls/dateTimePicker/HoursComponent.tsx index a338e6c9c..6482c220e 100644 --- a/src/controls/dateTimePicker/HoursComponent.tsx +++ b/src/controls/dateTimePicker/HoursComponent.tsx @@ -1,3 +1,4 @@ +import * as strings from 'ControlStrings'; import * as React from 'react'; import { IHoursComponentProps } from './ITimeComponentProps'; import { TimeConvention } from './DateTimeConventions'; @@ -26,13 +27,13 @@ export default class HoursComponent extends React.Component 23 ? "Incorrect hour value" : ""; + message = hours > 23 ? strings.DateTimePickerHourValueInvalid : ""; } else { - message = hours > 12 ? "Incorrect hour value" : ""; + message = hours > 12 ? strings.DateTimePickerHourValueInvalid : ""; } if (!message) { diff --git a/src/loc/de-de.ts b/src/loc/de-de.ts index ecd04b5cb..6e6e05296 100644 --- a/src/loc/de-de.ts +++ b/src/loc/de-de.ts @@ -81,6 +81,53 @@ define([], () => { ListItemAttachmentsloadingMessage: 'Uploading file ...', ListItemAttachmentslPlaceHolderIconText: 'List Item Attachment', ListItemAttachmentslPlaceHolderDescription: 'Please Add Attachment', - ListItemAttachmentslPlaceHolderButtonLabel: 'Add' + ListItemAttachmentslPlaceHolderButtonLabel: 'Add', + + DatePickerMonthLongJanuary: "January", + DatePickerMonthShortJanuary: "Jan", + DatePickerMonthLongFebruary: "February", + DatePickerMonthShortFebruary: "Feb", + DatePickerMonthLongMarch: "March", + DatePickerMonthShortMarch: "Mar", + DatePickerMonthLongApril: "April", + DatePickerMonthShortApril: "Apr", + DatePickerMonthLongMay: "May", + DatePickerMonthShortMay: "May", + DatePickerMonthLongJune: "June", + DatePickerMonthShortJune: "Jun", + DatePickerMonthLongJuly: "July", + DatePickerMonthShortJuly: "Jul", + DatePickerMonthLongAugust: "August", + DatePickerMonthShortAugust: "Aug", + DatePickerMonthLongSeptember: "September", + DatePickerMonthShortSeptember: "Sept", + DatePickerMonthLongOctober: "October", + DatePickerMonthShortOctober: "Oct", + DatePickerMonthLongNovember: "November", + DatePickerMonthShortNovember: "Nov", + DatePickerMonthLongDecember: "December", + DatePickerMonthShortDecember: "Dec", + DatePickerDayLongSunday: "Sunday", + DatePickerDayShortSunday: "Sun", + DatePickerDayLongMonday: "Monday", + DatePickerDayShortMonday: "Mon", + DatePickerDayLongTuesday: "Tuesday", + DatePickerDayShortTuesday: "Tue", + DatePickerDayLongWednesday: "Wednesday", + DatePickerDayShortWednesday: "Wed", + DatePickerDayLongThursday: "Thursday", + DatePickerDayShortThursday: "Thu", + DatePickerDayLongFriday: "Friday", + DatePickerDayShortFriday: "Fri", + DatePickerDayLongSaturday: "Saturday", + DatePickerDayShortSaturday: "Sat", + DatePickerGoToToday: "Today", + DatePickerIsRequiredErrorMessage: "", + DatePickerInvalidInputErrorMessage: "", + DatePickerIsOutOfBoundsErrorMessage: "", + DateTimePickerDate: "Date", + DateTimePickerTime: "Time", + DateTimePickerTimeSeparator: ":", + DateTimePickerHourValueInvalid: "Incorrect hour value" }; }); diff --git a/src/loc/en-us.ts b/src/loc/en-us.ts index 6b790a9b2..b25d5a394 100644 --- a/src/loc/en-us.ts +++ b/src/loc/en-us.ts @@ -208,6 +208,7 @@ define([], () => { DatePickerIsOutOfBoundsErrorMessage: "", DateTimePickerDate: "Date", DateTimePickerTime: "Time", - DateTimePickerTimeSeparator: ":" + DateTimePickerTimeSeparator: ":", + DateTimePickerHourValueInvalid: "Incorrect hour value" }; }); diff --git a/src/loc/fr-fr.ts b/src/loc/fr-fr.ts index ccd4abcf8..c040a78c9 100644 --- a/src/loc/fr-fr.ts +++ b/src/loc/fr-fr.ts @@ -128,7 +128,6 @@ define([], () => { DateTimePickerDate: "Date", DateTimePickerTime: "Temps", DateTimePickerTimeSeparator: ":", - AMDesignator: "AM", - PMDesignator: "PM" + DateTimePickerHourValueInvalid: "Incorrect hour value" }; }); diff --git a/src/loc/lt-lt.ts b/src/loc/lt-lt.ts index 1f322eeb9..0cdc9961c 100644 --- a/src/loc/lt-lt.ts +++ b/src/loc/lt-lt.ts @@ -80,6 +80,53 @@ define([], () => { mapsSearchButtonText: 'Paieška', mapsTitlePrefix: 'Žemėlapis', - ListViewFilterLabel: "Filtruoti" + ListViewFilterLabel: "Filtruoti", + + DatePickerMonthLongJanuary: "January", + DatePickerMonthShortJanuary: "Jan", + DatePickerMonthLongFebruary: "February", + DatePickerMonthShortFebruary: "Feb", + DatePickerMonthLongMarch: "March", + DatePickerMonthShortMarch: "Mar", + DatePickerMonthLongApril: "April", + DatePickerMonthShortApril: "Apr", + DatePickerMonthLongMay: "May", + DatePickerMonthShortMay: "May", + DatePickerMonthLongJune: "June", + DatePickerMonthShortJune: "Jun", + DatePickerMonthLongJuly: "July", + DatePickerMonthShortJuly: "Jul", + DatePickerMonthLongAugust: "August", + DatePickerMonthShortAugust: "Aug", + DatePickerMonthLongSeptember: "September", + DatePickerMonthShortSeptember: "Sept", + DatePickerMonthLongOctober: "October", + DatePickerMonthShortOctober: "Oct", + DatePickerMonthLongNovember: "November", + DatePickerMonthShortNovember: "Nov", + DatePickerMonthLongDecember: "December", + DatePickerMonthShortDecember: "Dec", + DatePickerDayLongSunday: "Sunday", + DatePickerDayShortSunday: "Sun", + DatePickerDayLongMonday: "Monday", + DatePickerDayShortMonday: "Mon", + DatePickerDayLongTuesday: "Tuesday", + DatePickerDayShortTuesday: "Tue", + DatePickerDayLongWednesday: "Wednesday", + DatePickerDayShortWednesday: "Wed", + DatePickerDayLongThursday: "Thursday", + DatePickerDayShortThursday: "Thu", + DatePickerDayLongFriday: "Friday", + DatePickerDayShortFriday: "Fri", + DatePickerDayLongSaturday: "Saturday", + DatePickerDayShortSaturday: "Sat", + DatePickerGoToToday: "Today", + DatePickerIsRequiredErrorMessage: "", + DatePickerInvalidInputErrorMessage: "", + DatePickerIsOutOfBoundsErrorMessage: "", + DateTimePickerDate: "Date", + DateTimePickerTime: "Time", + DateTimePickerTimeSeparator: ":", + DateTimePickerHourValueInvalid: "Incorrect hour value" }; }); diff --git a/src/loc/mystrings.d.ts b/src/loc/mystrings.d.ts index 6735907eb..6b1df38f5 100644 --- a/src/loc/mystrings.d.ts +++ b/src/loc/mystrings.d.ts @@ -182,6 +182,7 @@ declare interface IControlStrings { DateTimePickerDate: string; DateTimePickerTime: string; DateTimePickerTimeSeparator: string; + DateTimePickerHourValueInvalid: string; } declare interface IDateTimeStrings { diff --git a/src/loc/nl-nl.ts b/src/loc/nl-nl.ts index 27863fd0a..59558c21a 100644 --- a/src/loc/nl-nl.ts +++ b/src/loc/nl-nl.ts @@ -128,7 +128,6 @@ define([], () => { DateTimePickerDate: "Dag", DateTimePickerTime: "Tijd", DateTimePickerTimeSeparator: ":", - AMDesignator: "AM", - PMDesignator: "PM" + DateTimePickerHourValueInvalid: "Foute uur waarde" }; }); diff --git a/src/loc/ru-ru.ts b/src/loc/ru-ru.ts index 9a468f466..a84afc0d8 100644 --- a/src/loc/ru-ru.ts +++ b/src/loc/ru-ru.ts @@ -128,7 +128,6 @@ define([], () => { DateTimePickerDate: "Date", DateTimePickerTime: "Time", DateTimePickerTimeSeparator: ":", - AMDesignator: "AM", - PMDesignator: "PM" + DateTimePickerHourValueInvalid: "Incorrect hour value" }; }); From bb0c93a94231d0af1a74f93e634c8b49dd04ee78 Mon Sep 17 00:00:00 2001 From: Hugo Bernier Date: Tue, 2 Apr 2019 22:09:19 -0400 Subject: [PATCH 32/42] Calculates richtext toolbar top. Fixes #265. --- package-lock.json | 28 +++++++++++---- src/controls/richText/RichText.module.scss | 2 +- src/controls/richText/RichText.tsx | 41 ++++++++++++++-------- src/controls/richText/RichText.types.ts | 2 ++ 4 files changed, 50 insertions(+), 23 deletions(-) diff --git a/package-lock.json b/package-lock.json index 73616509b..287ad6c21 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6711,12 +6711,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -6731,17 +6733,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -6858,7 +6863,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -6870,6 +6876,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -6884,6 +6891,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -6891,12 +6899,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -6915,6 +6925,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -6995,7 +7006,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -7007,6 +7019,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -7128,6 +7141,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", diff --git a/src/controls/richText/RichText.module.scss b/src/controls/richText/RichText.module.scss index d2f0ab497..43509a801 100644 --- a/src/controls/richText/RichText.module.scss +++ b/src/controls/richText/RichText.module.scss @@ -230,7 +230,7 @@ } .ql-active .ql-toolbar { - display: block; + display: inline-flex; position: absolute; top: -28px; opacity: 1; diff --git a/src/controls/richText/RichText.tsx b/src/controls/richText/RichText.tsx index ac4017afb..b64614e22 100644 --- a/src/controls/richText/RichText.tsx +++ b/src/controls/richText/RichText.tsx @@ -17,6 +17,8 @@ import { Icon } from 'office-ui-fabric-react/lib/Icon'; import { elementContains } from 'office-ui-fabric-react/lib/Utilities'; import * as telemetry from '../../common/telemetry'; + +const TOOLBARPADDING: number = 28; /** * Creates a rich text editing control that mimics the out-of-the-box * SharePoint Rich Text control. @@ -26,10 +28,10 @@ import * as telemetry from '../../common/telemetry'; * - Tables aren't supported yet. I'll gladly add table formatting support if users request it. */ export class RichText extends React.Component { - private quillElem: ReactQuill = undefined; - private wrapperRef = undefined; - private propertyPaneRef: RichTextPropertyPane = undefined; - private toolbarId = undefined; + private _quillElem: ReactQuill = undefined; + private _wrapperRef: HTMLDivElement = undefined; + private _propertyPaneRef: RichTextPropertyPane = undefined; + private _toolbarId = undefined; private ddStyleOpts = [{ key: 0, @@ -114,11 +116,12 @@ export class RichText extends React.Component { insertUrl: undefined, insertUrlText: undefined, selectedText: undefined, - selectedUrl: undefined + selectedUrl: undefined, + wrapperTop: 0 }; // Get a unique toolbar id - this.toolbarId = "toolbar_" + Guid.newGuid().toString(); + this._toolbarId = "toolbar_" + Guid.newGuid().toString(); } /** @@ -130,6 +133,14 @@ export class RichText extends React.Component { document.addEventListener('click', this.handleClickOutside); document.addEventListener('focus', this.handleClickOutside); } + + const clientRect: ClientRect = this._wrapperRef.getBoundingClientRect(); + const parentClientRect: ClientRect = this._wrapperRef.parentElement.getBoundingClientRect(); + const toolbarTop: number = clientRect.top - parentClientRect.top - TOOLBARPADDING; + + this.setState({ + wrapperTop: toolbarTop + }); } /** @@ -168,7 +179,7 @@ export class RichText extends React.Component { */ public getEditor = (): Quill => { try { - return this.quillElem!.getEditor(); + return this._quillElem!.getEditor(); } catch (error) { return undefined; } @@ -385,7 +396,7 @@ export class RichText extends React.Component { // Get a unique id for the toolbar const modules = { toolbar: { - container: "#" + this.toolbarId, + container: "#" + this._toolbarId, handlers: [ "link" // disable the link handler so we can add our own ] @@ -428,8 +439,8 @@ export class RichText extends React.Component { Quill.register(SizeClass, true); return ( -
this.wrapperRef = ref} className={`${styles.richtext && this.state.editing ? 'ql-active' : undefined} ${this.props.className}`}> -
+
this._wrapperRef = ref} className={`${styles.richtext && this.state.editing ? 'ql-active' : undefined} ${this.props.className}`}> +
{ showStyles && ( { formats: formats }); - if (this.propertyPaneRef && this.state.morePaneVisible) { - this.propertyPaneRef.onChangeSelection(range, oldRange, source); + if (this._propertyPaneRef && this.state.morePaneVisible) { + this._propertyPaneRef.onChangeSelection(range, oldRange, source); } } } catch (error) { @@ -761,7 +772,7 @@ export class RichText extends React.Component { * Keeps track of whether we clicked outside the element */ private handleClickOutside = (event) => { - let outside: boolean = !elementContains(this.wrapperRef, event.target); + let outside: boolean = !elementContains(this._wrapperRef, event.target); // Did we click outside? if (outside) { @@ -785,13 +796,13 @@ export class RichText extends React.Component { * Links to the quill reference */ private linkQuill = (e: any) => { - this.quillElem = e; + this._quillElem = e; } /** * Links to the property pane element */ private linkPropertyPane = (e: any) => { - this.propertyPaneRef = e; + this._propertyPaneRef = e; } } diff --git a/src/controls/richText/RichText.types.ts b/src/controls/richText/RichText.types.ts index 11a34cccb..2cff70581 100644 --- a/src/controls/richText/RichText.types.ts +++ b/src/controls/richText/RichText.types.ts @@ -135,4 +135,6 @@ export interface IRichTextState { /** The text */ text: string; + + wrapperTop: number; } From 2ba15dc6a64763746eca11d75a6580da4d00f352 Mon Sep 17 00:00:00 2001 From: Fredrik Andreasson Date: Mon, 8 Apr 2019 09:56:55 +0200 Subject: [PATCH 33/42] * Extended functionality to folder and item-level --- .../ISecurityTrimmedControlProps.ts | 8 +++++ .../SecurityTrimmedControl.tsx | 32 ++++++++++++++++--- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/controls/securityTrimmedControl/ISecurityTrimmedControlProps.ts b/src/controls/securityTrimmedControl/ISecurityTrimmedControlProps.ts index 785c27ff1..f3bb29944 100644 --- a/src/controls/securityTrimmedControl/ISecurityTrimmedControlProps.ts +++ b/src/controls/securityTrimmedControl/ISecurityTrimmedControlProps.ts @@ -25,4 +25,12 @@ export interface ISecurityTrimmedControlProps { * The relative URL of the list or library. Required when you want to check permissions on remote list. */ relativeLibOrListUrl?: string; + /** + * Optional. Specify the name of a folder to check the user permissions against. Will be overridden if itemId is present. + */ + folderPath?: string; + /** + * Optional. Specify the ID of the item to check the user permissions against. Takes precedence over folder. + */ + itemId?: number; } diff --git a/src/controls/securityTrimmedControl/SecurityTrimmedControl.tsx b/src/controls/securityTrimmedControl/SecurityTrimmedControl.tsx index 9700a696a..24ca609e4 100644 --- a/src/controls/securityTrimmedControl/SecurityTrimmedControl.tsx +++ b/src/controls/securityTrimmedControl/SecurityTrimmedControl.tsx @@ -28,9 +28,11 @@ export class SecurityTrimmedControl extends React.Component data.json()); // Check if a result was retrieved if (result) { @@ -148,6 +150,28 @@ export class SecurityTrimmedControl extends React.Component Date: Mon, 8 Apr 2019 09:59:48 +0200 Subject: [PATCH 34/42] * Minor correction. --- .../securityTrimmedControl/SecurityTrimmedControl.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/controls/securityTrimmedControl/SecurityTrimmedControl.tsx b/src/controls/securityTrimmedControl/SecurityTrimmedControl.tsx index 24ca609e4..334533be3 100644 --- a/src/controls/securityTrimmedControl/SecurityTrimmedControl.tsx +++ b/src/controls/securityTrimmedControl/SecurityTrimmedControl.tsx @@ -72,7 +72,7 @@ export class SecurityTrimmedControl extends React.Component data.json()); // Check if a result was retrieved if (result) { @@ -115,7 +115,7 @@ export class SecurityTrimmedControl extends React.Component data.json()); // Check if a result was retrieved if (result) { From 20bace408b0b4275fdae37e9b7019348b08cf43f Mon Sep 17 00:00:00 2001 From: Fredrik Andreasson Date: Mon, 8 Apr 2019 10:51:32 +0200 Subject: [PATCH 35/42] Changed the name of the new function --- .../securityTrimmedControl/SecurityTrimmedControl.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/controls/securityTrimmedControl/SecurityTrimmedControl.tsx b/src/controls/securityTrimmedControl/SecurityTrimmedControl.tsx index 334533be3..016f555ff 100644 --- a/src/controls/securityTrimmedControl/SecurityTrimmedControl.tsx +++ b/src/controls/securityTrimmedControl/SecurityTrimmedControl.tsx @@ -115,7 +115,7 @@ export class SecurityTrimmedControl extends React.Component data.json()); // Check if a result was retrieved if (result) { @@ -150,7 +150,7 @@ export class SecurityTrimmedControl extends React.Component Date: Tue, 9 Apr 2019 10:21:16 +0200 Subject: [PATCH 36/42] Updated changelog --- CHANGELOG.JSON | 2 ++ CHANGELOG.md | 3 ++- docs/documentation/docs/about/release-notes.md | 3 ++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.JSON b/CHANGELOG.JSON index 1999c2ef1..475e69fba 100644 --- a/CHANGELOG.JSON +++ b/CHANGELOG.JSON @@ -5,6 +5,7 @@ "changes": { "new": [ "`Progress`: New control added [#230](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/230)", + "`DateTimePicker`: New control added [#21](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/21)", "`RichText`: New control added [#20](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/20)" ], "enhancements": [ @@ -23,6 +24,7 @@ "[Hugo Bernier](https://github.com/hugoabernier)", "[Tautvydas Duda](https://github.com/ltdu)", "[Özgür Ersoy](https://github.com/moersoy)", + "[Robert Lindström](https://github.com/robert-lindstrom)", "[Alex Terentiev](https://github.com/AJIXuMuK)" ] }, diff --git a/CHANGELOG.md b/CHANGELOG.md index 941361d76..a3bc2d00e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ ### New control(s) - `Progress`: New control added [#230](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/230) +- `DateTimePicker`: New control added [#21](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/21) - `RichText`: New control added [#20](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/20) ### Enhancements @@ -21,7 +22,7 @@ ### Contributors -Special thanks to our contributors (in alphabetical order): [Francis](https://github.com/PzKfWg), [Hugo Bernier](https://github.com/hugoabernier), [Tautvydas Duda](https://github.com/ltdu), [Özgür Ersoy](https://github.com/moersoy), [Alex Terentiev](https://github.com/AJIXuMuK). +Special thanks to our contributors (in alphabetical order): [Francis](https://github.com/PzKfWg), [Hugo Bernier](https://github.com/hugoabernier), [Tautvydas Duda](https://github.com/ltdu), [Özgür Ersoy](https://github.com/moersoy), [Robert Lindström](https://github.com/robert-lindstrom), [Alex Terentiev](https://github.com/AJIXuMuK). ## 1.12.0 diff --git a/docs/documentation/docs/about/release-notes.md b/docs/documentation/docs/about/release-notes.md index 941361d76..a3bc2d00e 100644 --- a/docs/documentation/docs/about/release-notes.md +++ b/docs/documentation/docs/about/release-notes.md @@ -5,6 +5,7 @@ ### New control(s) - `Progress`: New control added [#230](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/230) +- `DateTimePicker`: New control added [#21](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/21) - `RichText`: New control added [#20](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/20) ### Enhancements @@ -21,7 +22,7 @@ ### Contributors -Special thanks to our contributors (in alphabetical order): [Francis](https://github.com/PzKfWg), [Hugo Bernier](https://github.com/hugoabernier), [Tautvydas Duda](https://github.com/ltdu), [Özgür Ersoy](https://github.com/moersoy), [Alex Terentiev](https://github.com/AJIXuMuK). +Special thanks to our contributors (in alphabetical order): [Francis](https://github.com/PzKfWg), [Hugo Bernier](https://github.com/hugoabernier), [Tautvydas Duda](https://github.com/ltdu), [Özgür Ersoy](https://github.com/moersoy), [Robert Lindström](https://github.com/robert-lindstrom), [Alex Terentiev](https://github.com/AJIXuMuK). ## 1.12.0 From 3b8d8b97a116315adf74d283d873d9f8b3853ca6 Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Wed, 24 Apr 2019 19:57:43 +0200 Subject: [PATCH 37/42] Updated changelog --- CHANGELOG.JSON | 1 + CHANGELOG.md | 1 + docs/documentation/docs/about/release-notes.md | 1 + 3 files changed, 3 insertions(+) diff --git a/CHANGELOG.JSON b/CHANGELOG.JSON index 475e69fba..9f6b3a7a9 100644 --- a/CHANGELOG.JSON +++ b/CHANGELOG.JSON @@ -15,6 +15,7 @@ "`WebPartTitle`: Added the ability to render a `see all` link or custom component [#228](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/228)" ], "fixes": [ + "`RichText`: Fix for toolbar that appears at top of the page [#265](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/265)", "`ListItemAttachments`: Updated import statement reference in the documentation [#254](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/254)", "`ListView`: Updated documentation for the `iconFieldName` property [#245](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/245)" ] diff --git a/CHANGELOG.md b/CHANGELOG.md index a3bc2d00e..6e352e382 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ ### Fixes +- `RichText`: Fix for toolbar that appears at top of the page [#265](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/265) - `ListItemAttachments`: Updated import statement reference in the documentation [#254](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/254) - `ListView`: Updated documentation for the `iconFieldName` property [#245](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/245) diff --git a/docs/documentation/docs/about/release-notes.md b/docs/documentation/docs/about/release-notes.md index a3bc2d00e..6e352e382 100644 --- a/docs/documentation/docs/about/release-notes.md +++ b/docs/documentation/docs/about/release-notes.md @@ -17,6 +17,7 @@ ### Fixes +- `RichText`: Fix for toolbar that appears at top of the page [#265](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/265) - `ListItemAttachments`: Updated import statement reference in the documentation [#254](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/254) - `ListView`: Updated documentation for the `iconFieldName` property [#245](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/245) From 9d47d8c9865ae5a4e4be4d73009820b54a5705e9 Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Wed, 24 Apr 2019 20:53:17 +0200 Subject: [PATCH 38/42] #271 - Better implementation for the item and folder checks --- .../securityTrimmedControl/PermissionLevel.ts | 10 +- .../SecurityTrimmedControl.tsx | 115 ++++++++++-------- 2 files changed, 75 insertions(+), 50 deletions(-) diff --git a/src/controls/securityTrimmedControl/PermissionLevel.ts b/src/controls/securityTrimmedControl/PermissionLevel.ts index 907758ef6..7c30fbc81 100644 --- a/src/controls/securityTrimmedControl/PermissionLevel.ts +++ b/src/controls/securityTrimmedControl/PermissionLevel.ts @@ -17,5 +17,13 @@ export enum PermissionLevel { /** * Checks permissions on the specified list/library URL in combination with the site URL */ - remoteListOrLib + remoteListOrLib, + /** + * Check permissions on a specific item in a list/library + */ + remoteListItem, + /** + * Check permissions on a specific folder + */ + remoteFolder } diff --git a/src/controls/securityTrimmedControl/SecurityTrimmedControl.tsx b/src/controls/securityTrimmedControl/SecurityTrimmedControl.tsx index 016f555ff..7700ed1c9 100644 --- a/src/controls/securityTrimmedControl/SecurityTrimmedControl.tsx +++ b/src/controls/securityTrimmedControl/SecurityTrimmedControl.tsx @@ -62,6 +62,10 @@ export class SecurityTrimmedControl extends React.Component data.json()); - // Check if a result was retrieved - if (result) { - // Check if an error was retrieved - if (result.error) { - // Do not allow rendering when there was an error - this.setState({ - allowRender: false - }); - console.error(`Error retrieved while checking user's remote list or library permissions.`); - return; - } - - // Check the result high and low value are returned - if (typeof result.High !== "undefined" && typeof result.Low !== "undefined") { - // Create the permission mask - const permission = new SPPermission(result); - const hasPermissions = permission.hasAllPermissions(...permissions); - - this.setState({ - allowRender: hasPermissions - }); - return; - } - } else { - this.setState({ - allowRender: false - }); - console.error(`No result value was retrieved when checking the user's remote list or library permissions.`); - return; - } + const apiUrl = `${remoteSiteUrl}/_api/web/GetList(@listUrl)/EffectiveBasePermissions?@listUrl='${encodeURIComponent(relativeLibOrListUrl)}'`; + const hasPermissions = await this.checkRemotePermissions(apiUrl); + this.setState({ + allowRender: hasPermissions + }); } } - private getUrlByResource() { - const { remoteSiteUrl, relativeLibOrListUrl, folderPath, itemId } = this.props; - - // Check permission on a specific item. - if (itemId) { - const splitUrl = relativeLibOrListUrl.split('/'); - var lastSegment = splitUrl.pop() || splitUrl.pop(); // Trims trailing slash if it exists. - - return `${remoteSiteUrl}/_api/web/Lists/GetByTitle(@listTitle)/items(@itemId)/EffectiveBasePermissions?@listTitle='${encodeURIComponent(lastSegment)}'&@itemId='${itemId}'`; + /** + * Check permissions on item level + */ + private async checkRemoteListItem() { + const { remoteSiteUrl, relativeLibOrListUrl, permissions, itemId } = this.props; + // Check if all properties are provided + if (remoteSiteUrl && relativeLibOrListUrl && permissions && itemId) { + const apiUrl = `${remoteSiteUrl}/_api/web/GetList(@listUrl)/Items(${itemId})/EffectiveBasePermissions?@listUrl='${encodeURIComponent(relativeLibOrListUrl)}'`; + const hasPermissions = await this.checkRemotePermissions(apiUrl); + this.setState({ + allowRender: hasPermissions + }); } - // Check permission on a specific folder. - else if (folderPath) { - const folderByServerRelativeUrl: string = `${encodeURIComponent(relativeLibOrListUrl)}/${encodeURIComponent(folderPath)}`; + } - return `${remoteSiteUrl}/_api/web/GetFolderByServerRelativeUrl(@folderByServerRelativeUrl)/ListItemAllFields/EffectiveBasePermissions?@folderByServerRelativeUrl='${folderByServerRelativeUrl}'`; + /** + * Check permissions on folder + */ + private async checkRemoteFolder() { + const { remoteSiteUrl, relativeLibOrListUrl, permissions, folderPath } = this.props; + // Check if all properties are provided + if (remoteSiteUrl && relativeLibOrListUrl && permissions && folderPath) { + const folderByServerRelativeUrl: string = `${encodeURIComponent(relativeLibOrListUrl)}/${encodeURIComponent(folderPath)}`; + const apiUrl = `${remoteSiteUrl}/_api/web/GetFolderByServerRelativeUrl(@folderByServerRelativeUrl)/ListItemAllFields/EffectiveBasePermissions?@folderByServerRelativeUrl='${folderByServerRelativeUrl}'`; + const hasPermissions = await this.checkRemotePermissions(apiUrl); + this.setState({ + allowRender: hasPermissions + }); } - // Check permission on the list or library. - else { - return `${remoteSiteUrl}/_api/web/GetList(@listUrl)/EffectiveBasePermissions?@listUrl='${encodeURIComponent(relativeLibOrListUrl)}'`; + } + + /** + * Check the permissions + * + * @param apiUrl + */ + private async checkRemotePermissions(apiUrl: string) { + const { context, permissions } = this.props; + const data = await context.spHttpClient.get(apiUrl, SPHttpClient.configurations.v1); + // Check if a result was retrieved + if (data && data.ok) { + const result = await data.json(); + // Check if an error was retrieved + if (result.error) { + // Do not allow rendering when there was an error + console.error(`Error retrieved while checking permissions`); + return false; + } + + // Check the result high and low value are returned + if (typeof result.High !== "undefined" && typeof result.Low !== "undefined") { + // Create the permission mask + const permission = new SPPermission(result); + const hasPermissions = permission.hasAllPermissions(...permissions); + return hasPermissions; + } + } else { + console.error(`No result value was retrieved when checking the user's permissions.`); + return false; } } From 074ee834c5f24fbb7dc8e92a762b958098724458 Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Wed, 24 Apr 2019 21:02:21 +0200 Subject: [PATCH 39/42] Updated changelog + documentation --- CHANGELOG.JSON | 2 ++ CHANGELOG.md | 3 ++- docs/documentation/docs/about/release-notes.md | 3 ++- .../docs/controls/SecurityTrimmedControl.md | 10 ++++++++++ 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.JSON b/CHANGELOG.JSON index 9f6b3a7a9..627ccdb60 100644 --- a/CHANGELOG.JSON +++ b/CHANGELOG.JSON @@ -9,6 +9,7 @@ "`RichText`: New control added [#20](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/20)" ], "enhancements": [ + "`SecurityTrimmedControl`: Support for item and folder permission checks added [#271](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/271)", "Retrieve the user its profile picture from SharePoint instead of Office 365 / Outlook [#248](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/248)", "Added `Lithuanian` localization [#247](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/247)", "`FileTypeIcon`: Added support for PDF icon file types [#260](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/260)", @@ -22,6 +23,7 @@ }, "contributions": [ "[Francis](https://github.com/PzKfWg)", + "[Fredrik Andreasson](https://github.com/Varuuna)", "[Hugo Bernier](https://github.com/hugoabernier)", "[Tautvydas Duda](https://github.com/ltdu)", "[Özgür Ersoy](https://github.com/moersoy)", diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e352e382..e95c8f66e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ ### Enhancements +- `SecurityTrimmedControl`: Support for item and folder permission checks added [#271](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/271) - Retrieve the user its profile picture from SharePoint instead of Office 365 / Outlook [#248](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/248) - Added `Lithuanian` localization [#247](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/247) - `FileTypeIcon`: Added support for PDF icon file types [#260](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/260) @@ -23,7 +24,7 @@ ### Contributors -Special thanks to our contributors (in alphabetical order): [Francis](https://github.com/PzKfWg), [Hugo Bernier](https://github.com/hugoabernier), [Tautvydas Duda](https://github.com/ltdu), [Özgür Ersoy](https://github.com/moersoy), [Robert Lindström](https://github.com/robert-lindstrom), [Alex Terentiev](https://github.com/AJIXuMuK). +Special thanks to our contributors (in alphabetical order): [Francis](https://github.com/PzKfWg), [Fredrik Andreasson](https://github.com/Varuuna), [Hugo Bernier](https://github.com/hugoabernier), [Tautvydas Duda](https://github.com/ltdu), [Özgür Ersoy](https://github.com/moersoy), [Robert Lindström](https://github.com/robert-lindstrom), [Alex Terentiev](https://github.com/AJIXuMuK). ## 1.12.0 diff --git a/docs/documentation/docs/about/release-notes.md b/docs/documentation/docs/about/release-notes.md index 6e352e382..e95c8f66e 100644 --- a/docs/documentation/docs/about/release-notes.md +++ b/docs/documentation/docs/about/release-notes.md @@ -10,6 +10,7 @@ ### Enhancements +- `SecurityTrimmedControl`: Support for item and folder permission checks added [#271](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/271) - Retrieve the user its profile picture from SharePoint instead of Office 365 / Outlook [#248](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/248) - Added `Lithuanian` localization [#247](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/247) - `FileTypeIcon`: Added support for PDF icon file types [#260](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/260) @@ -23,7 +24,7 @@ ### Contributors -Special thanks to our contributors (in alphabetical order): [Francis](https://github.com/PzKfWg), [Hugo Bernier](https://github.com/hugoabernier), [Tautvydas Duda](https://github.com/ltdu), [Özgür Ersoy](https://github.com/moersoy), [Robert Lindström](https://github.com/robert-lindstrom), [Alex Terentiev](https://github.com/AJIXuMuK). +Special thanks to our contributors (in alphabetical order): [Francis](https://github.com/PzKfWg), [Fredrik Andreasson](https://github.com/Varuuna), [Hugo Bernier](https://github.com/hugoabernier), [Tautvydas Duda](https://github.com/ltdu), [Özgür Ersoy](https://github.com/moersoy), [Robert Lindström](https://github.com/robert-lindstrom), [Alex Terentiev](https://github.com/AJIXuMuK). ## 1.12.0 diff --git a/docs/documentation/docs/controls/SecurityTrimmedControl.md b/docs/documentation/docs/controls/SecurityTrimmedControl.md index 236a80ee4..563ccf3c5 100644 --- a/docs/documentation/docs/controls/SecurityTrimmedControl.md +++ b/docs/documentation/docs/controls/SecurityTrimmedControl.md @@ -68,5 +68,15 @@ The `SecurityTrimmedControl` can be configured with the following properties: | remoteSiteUrl | string | no | The URL of the remote site. Required when you want to check permissions on remote site or list. | | relativeLibOrListUrl | string | no | The relative URL of the list or library. Required when you want to check permissions on remote list. | +The `PermissionLevel` enum has the following values: + +| Value | Description | Required properties | +| ---- | ---- | ---- | +| currentWeb | Checks permissions on the current web | `context`, `permissions` | +| currentList | Checks permissions in the current loaded list | `context`, `permissions` | +| remoteWeb | Checks permissions on the specified site URL | `context`, `permissions`, `remoteSiteUrl` | +| remoteListOrLib | Checks permissions on the specified list/library URL in combination with the site URL | `context`, `permissions`, `remoteSiteUrl`, `relativeLibOrListUrl` | +| remoteListItem | Check permissions on a specific item in a list/library | `context`, `permissions`, `remoteSiteUrl`, `relativeLibOrListUrl`, `itemId` | +| remoteFolder | Check permissions on a specific folder | `context`, `permissions`, `remoteSiteUrl`, `relativeLibOrListUrl`, `folderPath` | ![](https://telemetry.sharepointpnp.com/sp-dev-fx-controls-react/wiki/controls/SecurityTrimmedControl) From 2d2d1fb42e95f6a58504acfed158259bf4978ff2 Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Wed, 24 Apr 2019 21:12:53 +0200 Subject: [PATCH 40/42] #275 - Fix for single quotes around the people picker class --- src/controls/peoplepicker/PeoplePickerComponent.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controls/peoplepicker/PeoplePickerComponent.tsx b/src/controls/peoplepicker/PeoplePickerComponent.tsx index 30289451c..8d3beedaa 100644 --- a/src/controls/peoplepicker/PeoplePickerComponent.tsx +++ b/src/controls/peoplepicker/PeoplePickerComponent.tsx @@ -193,7 +193,7 @@ export class PeoplePicker extends React.Component peoplePersonaMenu.text} - className={`'ms-PeoplePicker' ${this.props.peoplePickerCntrlclassName ? this.props.peoplePickerCntrlclassName : ''}`} + className={`ms-PeoplePicker ${this.props.peoplePickerCntrlclassName ? this.props.peoplePickerCntrlclassName : ''}`} key={'normal'} removeButtonAriaLabel={'Remove'} inputProps={{ From 672855041b3d10e7fa040965b46bc0e62a6e8685 Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Wed, 24 Apr 2019 21:13:46 +0200 Subject: [PATCH 41/42] Updated changelog --- CHANGELOG.JSON | 1 + CHANGELOG.md | 1 + docs/documentation/docs/about/release-notes.md | 1 + 3 files changed, 3 insertions(+) diff --git a/CHANGELOG.JSON b/CHANGELOG.JSON index 627ccdb60..54dc330b3 100644 --- a/CHANGELOG.JSON +++ b/CHANGELOG.JSON @@ -16,6 +16,7 @@ "`WebPartTitle`: Added the ability to render a `see all` link or custom component [#228](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/228)" ], "fixes": [ + "`PeoplePicker`: Fix for single quotes around the ms-peoplepicker class [#275](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/275)", "`RichText`: Fix for toolbar that appears at top of the page [#265](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/265)", "`ListItemAttachments`: Updated import statement reference in the documentation [#254](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/254)", "`ListView`: Updated documentation for the `iconFieldName` property [#245](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/245)" diff --git a/CHANGELOG.md b/CHANGELOG.md index e95c8f66e..814c609ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ ### Fixes +- `PeoplePicker`: Fix for single quotes around the ms-peoplepicker class [#275](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/275) - `RichText`: Fix for toolbar that appears at top of the page [#265](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/265) - `ListItemAttachments`: Updated import statement reference in the documentation [#254](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/254) - `ListView`: Updated documentation for the `iconFieldName` property [#245](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/245) diff --git a/docs/documentation/docs/about/release-notes.md b/docs/documentation/docs/about/release-notes.md index e95c8f66e..814c609ea 100644 --- a/docs/documentation/docs/about/release-notes.md +++ b/docs/documentation/docs/about/release-notes.md @@ -18,6 +18,7 @@ ### Fixes +- `PeoplePicker`: Fix for single quotes around the ms-peoplepicker class [#275](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/275) - `RichText`: Fix for toolbar that appears at top of the page [#265](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/265) - `ListItemAttachments`: Updated import statement reference in the documentation [#254](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/254) - `ListView`: Updated documentation for the `iconFieldName` property [#245](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/245) From 9cf0ba63f24245b1ca1138a189d49fa4747bb4fd Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Wed, 24 Apr 2019 21:41:26 +0200 Subject: [PATCH 42/42] Small fix for onChange event in RichText --- src/controls/richText/RichText.tsx | 2 +- src/webparts/controlsTest/components/ControlsTest.tsx | 6 ++++-- src/webparts/controlsTest/components/IControlsTestProps.ts | 1 + 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/controls/richText/RichText.tsx b/src/controls/richText/RichText.tsx index b64614e22..81fb66434 100644 --- a/src/controls/richText/RichText.tsx +++ b/src/controls/richText/RichText.tsx @@ -760,7 +760,7 @@ export class RichText extends React.Component { // do we need to pass this to a handler? if (onChange) { // yes, get the changed text from the handler - let newText: string = this.props.onChange(value); + let newText: string = onChange(value); this.setState({ text: newText }); } else { // no, write the text to the state diff --git a/src/webparts/controlsTest/components/ControlsTest.tsx b/src/webparts/controlsTest/components/ControlsTest.tsx index 0ff80b38f..80a1b8de0 100644 --- a/src/webparts/controlsTest/components/ControlsTest.tsx +++ b/src/webparts/controlsTest/components/ControlsTest.tsx @@ -40,6 +40,7 @@ import { Link } from 'office-ui-fabric-react/lib/components/Link'; */ export default class ControlsTest extends React.Component { private taxService: SPTermStorePickerService = null; + private richTextValue: string = null; constructor(props: IControlsTestProps) { super(props); @@ -53,7 +54,8 @@ export default class ControlsTest extends React.Component console.log("DateTimePicker value:", value)} /> console.log("DateTimePicker value:", value)} /> - + { this.richTextValue = value; return value; }} />
- this._handleColorChanged(gc.color)} - > - - -
+ this.handleColorChanged(gc.color)}> + + + + +