diff --git a/src/webui/src/App.scss b/src/webui/src/App.scss index 7121c4e6fe..2c24a68c92 100644 --- a/src/webui/src/App.scss +++ b/src/webui/src/App.scss @@ -26,9 +26,9 @@ } .content { - width: 89%; - min-width: 1024px; + width: 87%; margin: 0 auto; + min-width: 1200px; margin-top: 74px; margin-bottom: 30px; } diff --git a/src/webui/src/App.tsx b/src/webui/src/App.tsx index 08818e64be..c125e54838 100644 --- a/src/webui/src/App.tsx +++ b/src/webui/src/App.tsx @@ -4,6 +4,7 @@ import { COLUMN } from './static/const'; import { EXPERIMENT, TRIALS } from './static/datamodel'; import NavCon from './components/NavCon'; import MessageInfo from './components/modals/MessageInfo'; +import { TrialConfigButton } from './components/public-child/config/TrialConfigButton'; import './App.scss'; interface AppState { @@ -30,12 +31,13 @@ export const AppContext = React.createContext({ // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-unused-vars changeMetricGraphMode: (val: 'max' | 'min') => {}, // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-unused-vars - changeEntries: (val: string) => {} + changeEntries: (val: string) => {}, + // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-unused-vars + updateOverviewPage: () => {} }); class App extends React.Component<{}, AppState> { private timerId!: number | undefined; - private dataFormatimer!: number; private firstLoad: boolean = false; // when click refresh selector options constructor(props: {}) { super(props); @@ -60,35 +62,8 @@ class App extends React.Component<{}, AppState> { metricGraphMode: EXPERIMENT.optimizeMode === 'minimize' ? 'min' : 'max' })); this.timerId = window.setTimeout(this.refresh, this.state.interval * 100); - // final result is legal - // get a succeed trial,see final result data's format - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - this.dataFormatimer = window.setInterval(this.getFinalDataFormat, this.state.interval * 1000); } - getFinalDataFormat = (): void => { - for (let i = 0; this.state.isillegalFinal === false; i++) { - if (TRIALS.succeededTrials()[0] !== undefined && TRIALS.succeededTrials()[0].final !== undefined) { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const oneSucceedTrial = JSON.parse(JSON.parse(TRIALS.succeededTrials()[0].final!.data)); - if (typeof oneSucceedTrial === 'number' || oneSucceedTrial.hasOwnProperty('default')) { - window.clearInterval(this.dataFormatimer); - break; - } else { - // illegal final data - this.setState(() => ({ - isillegalFinal: true, - expWarningMessage: - 'WebUI support final result as number and dictornary includes default keys, your experiment final result is illegal, please check your data.' - })); - window.clearInterval(this.dataFormatimer); - } - } else { - break; - } - } - }; - changeInterval = (interval: number): void => { window.clearTimeout(this.timerId); if (interval === 0) { @@ -116,6 +91,12 @@ class App extends React.Component<{}, AppState> { this.setState({ bestTrialEntries: entries }); }; + updateOverviewPage = (): void => { + this.setState(state => ({ + experimentUpdateBroadcast: state.experimentUpdateBroadcast + 1 + })); + }; + shouldComponentUpdate(nextProps: any, nextState: AppState): boolean { if (!(nextState.isUpdate || nextState.isUpdate === undefined)) { nextState.isUpdate = true; @@ -155,6 +136,8 @@ class App extends React.Component<{}, AppState> { + {/* search space & config */} + {/* if api has error field, show error message */} {errorList.map( (item, key) => @@ -179,7 +162,8 @@ class App extends React.Component<{}, AppState> { metricGraphMode, changeMetricGraphMode: this.changeMetricGraphMode, bestTrialEntries, - changeEntries: this.changeEntries + changeEntries: this.changeEntries, + updateOverviewPage: this.updateOverviewPage }} > {this.props.children} diff --git a/src/webui/src/components/Overview.tsx b/src/webui/src/components/Overview.tsx index a875d2efaa..684a9317fe 100644 --- a/src/webui/src/components/Overview.tsx +++ b/src/webui/src/components/Overview.tsx @@ -1,42 +1,32 @@ import * as React from 'react'; -import { Stack, IStackTokens, Dropdown } from '@fluentui/react'; +import { Stack, Icon, Dropdown, DefaultButton } from '@fluentui/react'; import { EXPERIMENT, TRIALS } from '../static/datamodel'; import { Trial } from '../static/model/trial'; import { AppContext } from '../App'; -import { Title1 } from './overview/Title1'; -import SuccessTable from './overview/SuccessTable'; -import Progressed from './overview/Progress'; +import { Title } from './overview/Title'; +import SuccessTable from './overview/table/SuccessTable'; import Accuracy from './overview/Accuracy'; -import SearchSpace from './overview/SearchSpace'; -import { BasicInfo } from './overview/BasicInfo'; -import TrialInfo from './overview/TrialProfile'; -import '../static/style/overview.scss'; +import { ReBasicInfo } from './overview/experiment/BasicInfo'; +import { ExpDuration } from './overview/count/ExpDuration'; +import { ExpDurationContext } from './overview/count/ExpDurationContext'; +import { TrialCount } from './overview/count/TrialCount'; +import { Command } from './overview/experiment/Command'; +import { TitleContext } from './overview/TitleContext'; +import { itemStyle1, itemStyleSucceed, itemStyle2, entriesOption } from './overview/overviewConst'; +import '../static/style/overview/overview.scss'; import '../static/style/logPath.scss'; -const stackTokens: IStackTokens = { - childrenGap: 30 -}; - -const entriesOption = [ - { key: '10', text: 'Display top 10 trials' }, - { key: '20', text: 'Display top 20 trials' }, - { key: '30', text: 'Display top 30 trials' }, - { key: '50', text: 'Display top 50 trials' }, - { key: '100', text: 'Display top 100 trials' } -]; - interface OverviewState { trialConcurrency: number; } -export const TitleContext = React.createContext({ - text: '', - icon: '', - fontColor: '' +export const BestMetricContext = React.createContext({ + bestAccuracy: 0 }); class Overview extends React.Component<{}, OverviewState> { static contextType = AppContext; + context!: React.ContextType; constructor(props) { super(props); @@ -58,11 +48,6 @@ class Overview extends React.Component<{}, OverviewState> { changeMetricGraphMode('min'); }; - changeConcurrency = (val: number): void => { - this.setState({ trialConcurrency: val }); - }; - - // updateEntries = (event: React.FormEvent, item: IDropdownOption | undefined): void => { updateEntries = (event: React.FormEvent, item: any): void => { if (item !== undefined) { this.context.changeEntries(item.key); @@ -70,118 +55,125 @@ class Overview extends React.Component<{}, OverviewState> { }; render(): React.ReactNode { - const { trialConcurrency } = this.state; const bestTrials = this.findBestTrials(); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const bestAccuracy = bestTrials.length > 0 ? bestTrials[0].accuracy! : NaN; const accuracyGraphData = this.generateAccuracyGraph(bestTrials); const noDataMessage = bestTrials.length > 0 ? '' : 'No data'; + + const maxExecDuration = EXPERIMENT.profile.params.maxExecDuration; + const execDuration = EXPERIMENT.profile.execDuration; return ( {(value): React.ReactNode => { - const { experimentUpdateBroadcast, metricGraphMode, bestTrialEntries } = value; - const titleMaxbgcolor = metricGraphMode === 'max' ? '#333' : '#b3b3b3'; - const titleMinbgcolor = metricGraphMode === 'min' ? '#333' : '#b3b3b3'; + const { metricGraphMode, bestTrialEntries, updateOverviewPage } = value; + const maxActive = metricGraphMode === 'max' ? 'active' : ''; + const minActive = metricGraphMode === 'min' ? 'active' : ''; return (
- {/* status and experiment block */} - - - - - - - - - {/* status block */} - - - - - - - {/* experiment parameters search space tuner assessor... */} - - - +
+ {/* exp params */} +
+ + </TitleContext.Provider> - <Stack className='experiment'> - <SearchSpace searchSpace={EXPERIMENT.searchSpace} /> - </Stack> - </Stack.Item> - <Stack.Item grow styles={{ root: { width: 450 } }} className='bgNNI'> - <TitleContext.Provider value={{ text: 'Config', icon: '4.png', fontColor: '' }}> - <Title1 /> - </TitleContext.Provider> - <Stack className='experiment'> - {/* the scroll bar all the trial profile in the searchSpace div*/} - <div className='experiment searchSpace'> - <TrialInfo - experimentUpdateBroadcast={experimentUpdateBroadcast} - concurrency={trialConcurrency} - /> - </div> - </Stack> - </Stack.Item> - </Stack> - - <Stack style={{ backgroundColor: '#fff' }}> - <Stack horizontal className='top10bg' style={{ position: 'relative', height: 42 }}> - <div className='title' onClick={this.clickMaxTop}> - <TitleContext.Provider - value={{ - text: 'Top maximal trials', - icon: 'max.png', - fontColor: titleMaxbgcolor - }} - > - <Title1 /> + <BestMetricContext.Provider value={{ bestAccuracy: bestAccuracy }}> + <ReBasicInfo /> + </BestMetricContext.Provider> + </div> + {/* duration & trial numbers */} + <div className='overviewProgress'> + <div className='duration'> + <TitleContext.Provider value={{ text: 'Duration', icon: 'Timer' }}> + <Title /> </TitleContext.Provider> - </div> - <div className='title minTitle' onClick={this.clickMinTop}> - <TitleContext.Provider - value={{ - text: 'Top minimal trials', - icon: 'min.png', - fontColor: titleMinbgcolor - }} + <ExpDurationContext.Provider + value={{ maxExecDuration, execDuration, updateOverviewPage }} > - <Title1 /> - </TitleContext.Provider> - </div> - <div style={{ position: 'absolute', right: '2%', top: 8 }}> - <Dropdown - selectedKey={bestTrialEntries} - options={entriesOption} - onChange={this.updateEntries} - styles={{ root: { width: 170 } }} - /> + <ExpDuration /> + </ExpDurationContext.Provider> </div> - </Stack> - <Stack horizontal tokens={stackTokens}> - <div style={{ width: '40%', position: 'relative' }}> - <Accuracy - accuracyData={accuracyGraphData} - accNodata={noDataMessage} - height={404} - /> - </div> - <div style={{ width: '60%' }}> - <SuccessTable trialIds={bestTrials.map(trial => trial.info.id)} /> + <div className='empty' /> + <div className='trialCount'> + <TitleContext.Provider value={{ text: 'Trial numbers', icon: 'NumberSymbol' }}> + <Title /> + </TitleContext.Provider> + <ExpDurationContext.Provider + value={{ maxExecDuration, execDuration, updateOverviewPage }} + > + <TrialCount /> + </ExpDurationContext.Provider> </div> - </Stack> - </Stack> + </div> + {/* table */} + <div className='overviewTable'> + <Stack horizontal> + <div style={itemStyleSucceed}> + <TitleContext.Provider value={{ text: 'Top trials', icon: 'BulletedList' }}> + <Title /> + </TitleContext.Provider> + </div> + <div className='topTrialTitle'> + {/* <Stack horizontal horizontalAlign='space-between'> */} + <Stack horizontal horizontalAlign='end'> + <DefaultButton + onClick={this.clickMaxTop} + className={maxActive} + styles={{ root: { minWidth: 70, padding: 0 } }} + > + <Icon iconName='Market' /> + <span className='max'>Max</span> + </DefaultButton> + <div className='mincenter'> + <DefaultButton + onClick={this.clickMinTop} + className={minActive} + styles={{ root: { minWidth: 70, padding: 0 } }} + > + <Icon iconName='MarketDown' /> + <span className='max'>Min</span> + </DefaultButton> + </div> + <div> + <Stack horizontal> + <div className='chooseEntry'>Display top</div> + <div> + <Dropdown + selectedKey={bestTrialEntries} + options={entriesOption} + onChange={this.updateEntries} + styles={{ root: { width: 70 } }} + /> + </div> + </Stack> + </div> + </Stack> + </div> + </Stack> + <SuccessTable trialIds={bestTrials.map(trial => trial.info.id)} /> + </div> + <div className='overviewCommand'> + <Command /> + </div> + <div className='overviewChart'> + <Stack horizontal> + <div style={itemStyle1}> + <TitleContext.Provider + value={{ text: 'Trial metric chart', icon: 'HomeGroup' }} + > + <Title /> + </TitleContext.Provider> + </div> + <div style={itemStyle2}> + <Stack className='maxmin' horizontal> + <div className='circle' /> + <div>{`Top ${this.context.metricGraphMode}imal trials`}</div> + </Stack> + </div> + </Stack> + <Accuracy accuracyData={accuracyGraphData} accNodata={noDataMessage} height={380} /> + </div> + </div> </div> ); }} diff --git a/src/webui/src/components/TrialsDetail.tsx b/src/webui/src/components/TrialsDetail.tsx index b22d6d2841..b7d1b358cd 100644 --- a/src/webui/src/components/TrialsDetail.tsx +++ b/src/webui/src/components/TrialsDetail.tsx @@ -3,7 +3,8 @@ import { Stack, StackItem, Pivot, PivotItem, Dropdown, IDropdownOption, DefaultB import { EXPERIMENT, TRIALS } from '../static/datamodel'; import { Trial } from '../static/model/trial'; import { AppContext } from '../App'; -import { tableListIcon } from './buttons/Icon'; +import { Title } from './overview/Title'; +import { TitleContext } from './overview/TitleContext'; import DefaultPoint from './trial-detail/DefaultMetricPoint'; import Duration from './trial-detail/Duration'; import Para from './trial-detail/Para'; @@ -28,6 +29,7 @@ interface TrialDetailState { class TrialsDetail extends React.Component<{}, TrialDetailState> { static contextType = AppContext; + context!: React.ContextType<typeof AppContext>; public interAccuracy = 0; public interAllTableList = 2; @@ -142,10 +144,11 @@ class TrialsDetail extends React.Component<{}, TrialDetailState> { </Pivot> </div> {/* trial table list */} - <div style={{ backgroundColor: '#fff' }}> - <Stack horizontal className='panelTitle' style={{ marginTop: 10 }}> - <span style={{ marginRight: 12 }}>{tableListIcon}</span> - <span>Trial jobs</span> + <div className='bulletedList' style={{ marginTop: 18 }}> + <Stack className='title'> + <TitleContext.Provider value={{ text: 'Trial jobs', icon: 'BulletedList' }}> + <Title /> + </TitleContext.Provider> </Stack> <Stack horizontal className='allList'> <StackItem grow={50}> diff --git a/src/webui/src/components/buttons/Icon.tsx b/src/webui/src/components/buttons/Icon.tsx index 4d77758feb..b552de115d 100644 --- a/src/webui/src/components/buttons/Icon.tsx +++ b/src/webui/src/components/buttons/Icon.tsx @@ -11,11 +11,14 @@ const copy = <Icon iconName='Copy' />; const tableListIcon = <Icon iconName='BulletedList' />; const downLoadIcon = { iconName: 'Download' }; const infoIconAbout = { iconName: 'info' }; -const timeIcon = { iconName: 'Refresh' }; +const timeIcon = { iconName: 'ReminderTime' }; const disableUpdates = { iconName: 'DisableUpdates' }; const requency = { iconName: 'Timer' }; const closeTimer = { iconName: 'Blocked2' }; const LineChart = <Icon iconName='LineChart' />; +const Edit = <Icon iconName='Edit' />; +const CheckMark = <Icon iconName='CheckMark' />; +const Cancel = <Icon iconName='Cancel' />; export { infoIcon, @@ -31,5 +34,8 @@ export { disableUpdates, requency, closeTimer, - LineChart + LineChart, + Edit, + CheckMark, + Cancel }; diff --git a/src/webui/src/components/overview/Accuracy.tsx b/src/webui/src/components/overview/Accuracy.tsx index 2f2fd9253b..395e04d364 100644 --- a/src/webui/src/components/overview/Accuracy.tsx +++ b/src/webui/src/components/overview/Accuracy.tsx @@ -22,7 +22,7 @@ class Accuracy extends React.Component<AccuracyProps, {}> { render(): React.ReactNode { const { accNodata, accuracyData, height } = this.props; return ( - <div> + <div style={{ position: 'relative' }}> <ReactEcharts option={accuracyData} style={{ diff --git a/src/webui/src/components/overview/BasicInfo.tsx b/src/webui/src/components/overview/BasicInfo.tsx deleted file mode 100644 index 6ef6505191..0000000000 --- a/src/webui/src/components/overview/BasicInfo.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import React from 'react'; -import { Stack, TooltipHost } from '@fluentui/react'; -import { EXPERIMENT } from '../../static/datamodel'; -import { formatTimestamp } from '../../static/function'; - -export const BasicInfo = (): any => ( - <Stack horizontal horizontalAlign='space-between' className='main'> - <Stack.Item grow={3} className='padItem basic'> - <p>Name</p> - <div>{EXPERIMENT.profile.params.experimentName}</div> - </Stack.Item> - <Stack.Item grow={3} className='padItem basic'> - <p>ID</p> - <div>{EXPERIMENT.profile.id}</div> - </Stack.Item> - <Stack.Item grow={3} className='padItem basic'> - <p>Start time</p> - <div className='nowrap'>{formatTimestamp(EXPERIMENT.profile.startTime)}</div> - </Stack.Item> - <Stack.Item grow={3} className='padItem basic'> - <p>End time</p> - <div className='nowrap'>{formatTimestamp(EXPERIMENT.profile.endTime)}</div> - </Stack.Item> - <Stack.Item className='padItem basic'> - <p>Log directory</p> - <div className='nowrap'> - <TooltipHost - // Tooltip message content - content={EXPERIMENT.profile.logDir || 'unknown'} - calloutProps={{ gapSpace: 0 }} - styles={{ root: { display: 'inline-block' } }} - > - {/* show logDir */} - {EXPERIMENT.profile.logDir || 'unknown'} - </TooltipHost> - </div> - </Stack.Item> - <Stack.Item className='padItem basic'> - <p>Training platform</p> - <div className='nowrap'>{EXPERIMENT.profile.params.trainingServicePlatform}</div> - </Stack.Item> - </Stack> -); diff --git a/src/webui/src/components/overview/NumInput.tsx b/src/webui/src/components/overview/NumInput.tsx deleted file mode 100644 index 6264923aa6..0000000000 --- a/src/webui/src/components/overview/NumInput.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import * as React from 'react'; -import { Stack, PrimaryButton } from '@fluentui/react'; - -interface ConcurrencyInputProps { - value: number; - updateValue: (val: string) => void; -} - -interface ConcurrencyInputStates { - editting: boolean; -} - -class ConcurrencyInput extends React.Component<ConcurrencyInputProps, ConcurrencyInputStates> { - private input = React.createRef<HTMLInputElement>(); - - constructor(props: ConcurrencyInputProps) { - super(props); - this.state = { editting: false }; - } - - save = (): void => { - if (this.input.current !== null) { - this.props.updateValue(this.input.current.value); - this.setState({ editting: false }); - } - }; - - cancel = (): void => { - this.setState({ editting: false }); - }; - - edit = (): void => { - this.setState({ editting: true }); - }; - - render(): React.ReactNode { - if (this.state.editting) { - return ( - <Stack horizontal className='inputBox'> - <input - type='number' - className='concurrencyInput' - defaultValue={this.props.value.toString()} - ref={this.input} - /> - <PrimaryButton text='Save' onClick={this.save} /> - <PrimaryButton - text='Cancel' - style={{ display: 'inline-block', marginLeft: 1 }} - onClick={this.cancel} - /> - </Stack> - ); - } else { - return ( - <Stack horizontal className='inputBox'> - <input type='number' className='concurrencyInput' disabled={true} value={this.props.value} /> - <PrimaryButton text='Edit' onClick={this.edit} /> - </Stack> - ); - } - } -} - -export default ConcurrencyInput; diff --git a/src/webui/src/components/overview/Progress.tsx b/src/webui/src/components/overview/Progress.tsx deleted file mode 100644 index 4bc5139f0c..0000000000 --- a/src/webui/src/components/overview/Progress.tsx +++ /dev/null @@ -1,315 +0,0 @@ -import * as React from 'react'; -import { - Stack, - Callout, - Link, - IconButton, - FontWeights, - mergeStyleSets, - getId, - getTheme, - StackItem, - TooltipHost -} from '@fluentui/react'; -import axios from 'axios'; -import { MANAGER_IP, CONCURRENCYTOOLTIP } from '../../static/const'; -import { EXPERIMENT, TRIALS } from '../../static/datamodel'; -import { convertTime } from '../../static/function'; -import ConcurrencyInput from './NumInput'; -import ProgressBar from './ProgressItem'; -import LogDrawer from '../modals/LogPanel'; -import MessageInfo from '../modals/MessageInfo'; -import { infoIcon } from '../buttons/Icon'; -import '../../static/style/progress.scss'; -import '../../static/style/probar.scss'; -interface ProgressProps { - concurrency: number; - bestAccuracy: number; - changeConcurrency: (val: number) => void; - experimentUpdateBroadcast: number; -} - -interface ProgressState { - isShowLogDrawer: boolean; - isCalloutVisible?: boolean; - isShowSucceedInfo: boolean; - info: string; - typeInfo: string; -} - -const itemStyles: React.CSSProperties = { - height: 50, - width: 100 -}; -const theme = getTheme(); -const styles = mergeStyleSets({ - buttonArea: { - verticalAlign: 'top', - display: 'inline-block', - textAlign: 'center', - // margin: '0 100px', - minWidth: 30, - height: 30 - }, - callout: { - maxWidth: 300 - }, - header: { - padding: '18px 24px 12px' - }, - title: [ - theme.fonts.xLarge, - { - margin: 0, - color: theme.palette.neutralPrimary, - fontWeight: FontWeights.semilight - } - ], - inner: { - height: '100%', - padding: '0 24px 20px' - }, - actions: { - position: 'relative', - marginTop: 20, - width: '100%', - whiteSpace: 'nowrap' - }, - subtext: [ - theme.fonts.small, - { - margin: 0, - color: theme.palette.neutralPrimary, - fontWeight: FontWeights.semilight - } - ], - link: [ - theme.fonts.medium, - { - color: theme.palette.neutralPrimary - } - ] -}); - -class Progressed extends React.Component<ProgressProps, ProgressState> { - private menuButtonElement!: HTMLDivElement | null; - private labelId: string = getId('callout-label'); - private descriptionId: string = getId('callout-description'); - constructor(props: ProgressProps) { - super(props); - this.state = { - isShowLogDrawer: false, - isCalloutVisible: false, - isShowSucceedInfo: false, - info: '', - typeInfo: 'success' - }; - } - - hideSucceedInfo = (): void => { - this.setState(() => ({ isShowSucceedInfo: false })); - }; - - /** - * info: message content - * typeInfo: message type: success | error... - * continuousTime: show time, 2000ms - */ - showMessageInfo = (info: string, typeInfo: string): void => { - this.setState(() => ({ - info, - typeInfo, - isShowSucceedInfo: true - })); - setTimeout(this.hideSucceedInfo, 2000); - }; - - editTrialConcurrency = async (userInput: string): Promise<void> => { - if (!userInput.match(/^[1-9]\d*$/)) { - this.showMessageInfo('Please enter a positive integer!', 'error'); - return; - } - const newConcurrency = parseInt(userInput, 10); - if (newConcurrency === this.props.concurrency) { - this.showMessageInfo('Trial concurrency has not changed', 'error'); - return; - } - - const newProfile = Object.assign({}, EXPERIMENT.profile); - newProfile.params.trialConcurrency = newConcurrency; - - // rest api, modify trial concurrency value - try { - const res = await axios.put(`${MANAGER_IP}/experiment`, newProfile, { - // eslint-disable-next-line @typescript-eslint/camelcase - params: { update_type: 'TRIAL_CONCURRENCY' } - }); - if (res.status === 200) { - this.showMessageInfo('Successfully updated trial concurrency', 'success'); - // NOTE: should we do this earlier in favor of poor networks? - this.props.changeConcurrency(newConcurrency); - } - } catch (error) { - if (error.response && error.response.data.error) { - this.showMessageInfo(`Failed to update trial concurrency\n${error.response.data.error}`, 'error'); - } else if (error.response) { - this.showMessageInfo( - `Failed to update trial concurrency\nServer responsed ${error.response.status}`, - 'error' - ); - } else if (error.message) { - this.showMessageInfo(`Failed to update trial concurrency\n${error.message}`, 'error'); - } else { - this.showMessageInfo(`Failed to update trial concurrency\nUnknown error`, 'error'); - } - } - }; - - isShowDrawer = (): void => { - this.setState({ isShowLogDrawer: true }); - }; - - closeDrawer = (): void => { - this.setState({ isShowLogDrawer: false }); - }; - - onDismiss = (): void => { - this.setState({ isCalloutVisible: false }); - }; - - onShow = (): void => { - this.setState({ isCalloutVisible: true }); - }; - - render(): React.ReactNode { - const { bestAccuracy } = this.props; - const { isShowLogDrawer, isCalloutVisible, isShowSucceedInfo, info, typeInfo } = this.state; - - const count = TRIALS.countStatus(); - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const stoppedCount = count.get('USER_CANCELED')! + count.get('SYS_CANCELED')! + count.get('EARLY_STOPPED')!; - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const bar2 = count.get('RUNNING')! + count.get('SUCCEEDED')! + count.get('FAILED')! + stoppedCount; - // support type [0, 1], not 98% - const bar2Percent = bar2 / EXPERIMENT.profile.params.maxTrialNum; - const percent = EXPERIMENT.profile.execDuration / EXPERIMENT.profile.params.maxExecDuration; - const remaining = convertTime(EXPERIMENT.profile.params.maxExecDuration - EXPERIMENT.profile.execDuration); - const maxDuration = convertTime(EXPERIMENT.profile.params.maxExecDuration); - const maxTrialNum = EXPERIMENT.profile.params.maxTrialNum; - const execDuration = convertTime(EXPERIMENT.profile.execDuration); - - return ( - <Stack className='progress' id='barBack'> - <Stack className='basic lineBasic'> - <p>Status</p> - <Stack horizontal className='status'> - <span className={`${EXPERIMENT.status} status-text`}>{EXPERIMENT.status}</span> - {EXPERIMENT.status === 'ERROR' ? ( - <div> - <div className={styles.buttonArea} ref={(val): any => (this.menuButtonElement = val)}> - <IconButton - iconProps={{ iconName: 'info' }} - onClick={isCalloutVisible ? this.onDismiss : this.onShow} - /> - </div> - {isCalloutVisible && ( - <Callout - className={styles.callout} - ariaLabelledBy={this.labelId} - ariaDescribedBy={this.descriptionId} - role='alertdialog' - gapSpace={0} - target={this.menuButtonElement} - onDismiss={this.onDismiss} - setInitialFocus={true} - > - <div className={styles.header}> - <p className={styles.title} id={this.labelId}> - Error - </p> - </div> - <div className={styles.inner}> - <p className={styles.subtext} id={this.descriptionId}> - {EXPERIMENT.error} - </p> - <div className={styles.actions}> - <Link className={styles.link} onClick={this.isShowDrawer}> - Learn about - </Link> - </div> - </div> - </Callout> - )} - </div> - ) : null} - </Stack> - </Stack> - <ProgressBar - who='Duration' - percent={percent} - description={execDuration} - bgclass={EXPERIMENT.status} - maxString={`Max duration: ${maxDuration}`} - /> - <ProgressBar - who='Trial numbers' - percent={bar2Percent} - description={bar2.toString()} - bgclass={EXPERIMENT.status} - maxString={`Max trial number: ${maxTrialNum}`} - /> - <Stack className='basic colorOfbasic mess' horizontal> - <StackItem grow={50}> - <p>Best metric</p> - <div>{isNaN(bestAccuracy) ? 'N/A' : bestAccuracy.toFixed(6)}</div> - </StackItem> - <StackItem> - {isShowSucceedInfo && <MessageInfo className='info' typeInfo={typeInfo} info={info} />} - </StackItem> - </Stack> - <Stack horizontal horizontalAlign='space-between' className='mess'> - <span style={itemStyles} className='basic colorOfbasic'> - <p>Spent</p> - <div>{execDuration}</div> - </span> - <span style={itemStyles} className='basic colorOfbasic'> - <p>Remaining</p> - <div className='time'>{remaining}</div> - </span> - <span style={itemStyles}> - {/* modify concurrency */} - <TooltipHost content={CONCURRENCYTOOLTIP}> - <p className='cursor'> - Concurrency<span className='progress-info'>{infoIcon}</span> - </p> - </TooltipHost> - <ConcurrencyInput value={this.props.concurrency} updateValue={this.editTrialConcurrency} /> - </span> - <span style={itemStyles} className='basic colorOfbasic'></span> - </Stack> - <Stack horizontal horizontalAlign='space-between' className='mess'> - <div style={itemStyles} className='basic colorOfbasic'> - <p>Running</p> - <div>{count.get('RUNNING')}</div> - </div> - <div style={itemStyles} className='basic colorOfbasic'> - <p>Succeeded</p> - <div>{count.get('SUCCEEDED')}</div> - </div> - <div style={itemStyles} className='basic'> - <p>Stopped</p> - <div>{stoppedCount}</div> - </div> - <div style={itemStyles} className='basic'> - <p>Failed</p> - <div>{count.get('FAILED')}</div> - </div> - </Stack> - {/* learn about click -> default active key is dispatcher. */} - {isShowLogDrawer ? <LogDrawer closeDrawer={this.closeDrawer} activeTab='dispatcher' /> : null} - </Stack> - ); - } -} - -export default Progressed; diff --git a/src/webui/src/components/overview/ProgressItem.tsx b/src/webui/src/components/overview/ProgressItem.tsx deleted file mode 100644 index 849171bb57..0000000000 --- a/src/webui/src/components/overview/ProgressItem.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import * as React from 'react'; -import { Stack, StackItem, ProgressIndicator } from '@fluentui/react'; - -interface ProItemProps { - who: string; - percent: number; - description: string; - maxString: string; - bgclass: string; -} - -class ProgressBar extends React.Component<ProItemProps, {}> { - constructor(props: ProItemProps) { - super(props); - } - - render(): React.ReactNode { - const { who, percent, description, maxString, bgclass } = this.props; - return ( - <div> - <Stack horizontal className={`probar ${bgclass}`}> - <div className='name'>{who}</div> - <div className='showProgress' style={{ width: '78%' }}> - <ProgressIndicator barHeight={30} percentComplete={percent} /> - <Stack horizontal className='boundary'> - <StackItem grow={30}>0</StackItem> - <StackItem className='right' grow={70}> - {maxString} - </StackItem> - </Stack> - </div> - <div className='description' style={{ width: '22%' }}> - {description} - </div> - </Stack> - <br /> - </div> - ); - } -} - -export default ProgressBar; diff --git a/src/webui/src/components/overview/SearchSpace.tsx b/src/webui/src/components/overview/SearchSpace.tsx deleted file mode 100644 index 9532f8b812..0000000000 --- a/src/webui/src/components/overview/SearchSpace.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import * as React from 'react'; -import MonacoEditor from 'react-monaco-editor'; -import { MONACO } from '../../static/const'; - -interface SearchspaceProps { - searchSpace: object; -} - -class SearchSpace extends React.Component<SearchspaceProps, {}> { - constructor(props: SearchspaceProps) { - super(props); - } - - render(): React.ReactNode { - const { searchSpace } = this.props; - return ( - <div className='searchSpace'> - <MonacoEditor - height='361' - language='json' - theme='vs-light' - value={JSON.stringify(searchSpace, null, 2)} - options={MONACO} - /> - </div> - ); - } -} - -export default SearchSpace; diff --git a/src/webui/src/components/overview/Title.tsx b/src/webui/src/components/overview/Title.tsx new file mode 100644 index 0000000000..06367c049d --- /dev/null +++ b/src/webui/src/components/overview/Title.tsx @@ -0,0 +1,16 @@ +import React from 'react'; +import { Stack, Icon, initializeIcons } from '@fluentui/react'; +import { TitleContext } from './TitleContext'; +import '../../static/style/overview/overviewTitle.scss'; +initializeIcons(); + +export const Title = (): any => ( + <TitleContext.Consumer> + {(value): React.ReactNode => ( + <Stack horizontal className='panelTitle'> + <Icon iconName={value.icon} /> + <span>{value.text}</span> + </Stack> + )} + </TitleContext.Consumer> +); diff --git a/src/webui/src/components/overview/Title1.tsx b/src/webui/src/components/overview/Title1.tsx deleted file mode 100644 index dd89dd8fa0..0000000000 --- a/src/webui/src/components/overview/Title1.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import * as React from 'react'; -import { Stack } from '@fluentui/react'; -import { TitleContext } from '../Overview'; -import '../../static/style/overviewTitle.scss'; - -export const Title1 = (): any => ( - <TitleContext.Consumer> - {(value): React.ReactNode => ( - <Stack horizontal className='panelTitle'> - <img src={require(`../../static/img/icon/${value.icon}`)} alt='icon' /> - <span style={{ color: value.fontColor }}>{value.text}</span> - </Stack> - )} - </TitleContext.Consumer> -); diff --git a/src/webui/src/components/overview/TitleContext.tsx b/src/webui/src/components/overview/TitleContext.tsx new file mode 100644 index 0000000000..5f7a1b8e27 --- /dev/null +++ b/src/webui/src/components/overview/TitleContext.tsx @@ -0,0 +1,6 @@ +import * as React from 'react'; + +export const TitleContext = React.createContext({ + text: '', + icon: '' +}); diff --git a/src/webui/src/components/overview/TrialProfile.tsx b/src/webui/src/components/overview/TrialProfile.tsx deleted file mode 100644 index 6c49ad4907..0000000000 --- a/src/webui/src/components/overview/TrialProfile.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import * as React from 'react'; -import MonacoEditor from 'react-monaco-editor'; -import { MONACO } from '../../static/const'; -import { EXPERIMENT } from '../../static/datamodel'; - -interface TrialInfoProps { - experimentUpdateBroadcast: number; - concurrency: number; -} - -class TrialInfo extends React.Component<TrialInfoProps, {}> { - constructor(props: TrialInfoProps) { - super(props); - } - - render(): React.ReactNode { - const blacklist = [ - 'id', - 'logDir', - 'startTime', - 'endTime', - 'experimentName', - 'searchSpace', - 'trainingServicePlatform' - ]; - const filter = (key: string, val: any): any => { - if (key === 'trialConcurrency') { - return this.props.concurrency; - } - return blacklist.includes(key) ? undefined : val; - }; - const profile = JSON.stringify(EXPERIMENT.profile, filter, 2); - - return ( - <div className='profile'> - <MonacoEditor - width='100%' - height='361' - language='json' - theme='vs-light' - value={profile} - options={MONACO} - /> - </div> - ); - } -} - -export default TrialInfo; diff --git a/src/webui/src/components/overview/count/EditExperimentParam.tsx b/src/webui/src/components/overview/count/EditExperimentParam.tsx new file mode 100644 index 0000000000..8b422e3fb8 --- /dev/null +++ b/src/webui/src/components/overview/count/EditExperimentParam.tsx @@ -0,0 +1,147 @@ +import React, { useState, useCallback, useContext } from 'react'; +import axios from 'axios'; +import { EXPERIMENT } from '../../../static/datamodel'; +import { EditExpeParamContext } from './context'; +import { MANAGER_IP } from '../../../static/const'; +import { convertTimeToSecond } from '../../../static/function'; +import { Edit, CheckMark, Cancel } from '../../buttons/Icon'; +import MessageInfo from '../../modals/MessageInfo'; +import '../../../static/style/overview/count.scss'; + +const DurationInputRef = React.createRef<HTMLInputElement>(); + +export const EditExperimentParam = (): any => { + const [isShowPencil, setShowPencil] = useState(true); + const [isShowSucceedInfo, setShowSucceedInfo] = useState(false); + const [typeInfo, setTypeInfo] = useState(''); + const [info, setInfo] = useState(''); + const showPencil = useCallback(() => { + setShowPencil(true); + }, []); + const hidePencil = useCallback(() => { + setShowPencil(false); + }, []); + const showSucceedInfo = useCallback(() => setShowSucceedInfo(true), []); + const hideSucceedInfo = useCallback(() => { + setShowSucceedInfo(false); + }, []); + const { title, field, editType, maxExecDuration, maxTrialNum, trialConcurrency, updateOverviewPage } = useContext( + EditExpeParamContext + ); + let defaultVal = ''; + let editVal = ''; + if (title === 'Max duration') { + defaultVal = maxExecDuration; + editVal = maxExecDuration; + } else if (title === 'Max trial numbers') { + defaultVal = maxTrialNum.toString(); + editVal = maxTrialNum.toString(); + } else { + defaultVal = trialConcurrency.toString(); + editVal = trialConcurrency.toString(); + } + const [editInputVal, setEditValInput] = useState(editVal); + + function setInputVal(event: any): void { + setEditValInput(event.target.value); + } + + function cancelEdit(): void { + setEditValInput(defaultVal); + showPencil(); + } + + async function confirmEdit(): Promise<void> { + const isMaxDuration = title === 'Max duration'; + const newProfile = Object.assign({}, EXPERIMENT.profile); + let beforeParam = ''; + if (!isMaxDuration && !editInputVal.match(/^[1-9]\d*$/)) { + showMessageInfo('Please enter a positive integer!', 'error'); + return; + } + if (isMaxDuration) { + beforeParam = maxExecDuration; + } else if (title === 'Max trial numbers') { + beforeParam = maxTrialNum.toString(); + } else { + beforeParam = trialConcurrency.toString(); + } + if (editInputVal === beforeParam) { + showMessageInfo(`Trial ${field} has not changed`, 'error'); + return; + } + if (isMaxDuration) { + newProfile.params[field] = convertTimeToSecond(editInputVal); + } else { + newProfile.params[field] = parseInt(editInputVal, 10); + } + // rest api, modify trial concurrency value + try { + const res = await axios.put(`${MANAGER_IP}/experiment`, newProfile, { + // eslint-disable-next-line @typescript-eslint/camelcase + params: { update_type: editType } + }); + if (res.status === 200) { + showMessageInfo(`Successfully updated ${field}`, 'success'); + } + } catch (error) { + if (error.response && error.response.data.error) { + showMessageInfo(`Failed to update trial ${field}\n${error.response.data.error}`, 'error'); + } else if (error.response) { + showMessageInfo(`Failed to update trial ${field}\nServer responsed ${error.response.status}`, 'error'); + } else if (error.message) { + showMessageInfo(`Failed to update trial ${field}\n${error.message}`, 'error'); + } else { + showMessageInfo(`Failed to update trial ${field}\nUnknown error`, 'error'); + } + } + showPencil(); + updateOverviewPage(); + } + + function showMessageInfo(info: string, typeInfo: string): any { + setInfo(info); + setTypeInfo(typeInfo); + showSucceedInfo(); + setTimeout(hideSucceedInfo, 2000); + } + + return ( + <EditExpeParamContext.Consumer> + {(value): React.ReactNode => { + return ( + <React.Fragment> + <p>{value.title}</p> + <div> + <input + className={`${value.field} durationInput`} + ref={DurationInputRef} + disabled={isShowPencil ? true : false} + value={editInputVal} + onChange={setInputVal} + /> + {isShowPencil && ( + <span className='edit' onClick={hidePencil}> + {Edit} + </span> + )} + + {!isShowPencil && ( + <span className='series'> + <span className='confirm' onClick={confirmEdit}> + {CheckMark} + </span> + <span className='cancel' onClick={cancelEdit}> + {Cancel} + </span> + </span> + )} + + {isShowSucceedInfo && <MessageInfo className='info' typeInfo={typeInfo} info={info} />} + </div> + </React.Fragment> + ); + }} + </EditExpeParamContext.Consumer> + ); +}; diff --git a/src/webui/src/components/overview/count/ExpDuration.tsx b/src/webui/src/components/overview/count/ExpDuration.tsx new file mode 100644 index 0000000000..177f405e03 --- /dev/null +++ b/src/webui/src/components/overview/count/ExpDuration.tsx @@ -0,0 +1,54 @@ +import React from 'react'; +import { Stack, TooltipHost, ProgressIndicator } from '@fluentui/react'; +import { EXPERIMENT } from '../../../static/datamodel'; +import { CONTROLTYPE } from '../../../static/const'; +import { convertDuration } from '../../../static/function'; +import { EditExperimentParam } from './EditExperimentParam'; +import { ExpDurationContext } from './ExpDurationContext'; +import { EditExpeParamContext } from './context'; +import '../../../static/style/overview/count.scss'; +const itemStyle1: React.CSSProperties = { + width: '62%', + height: 80 +}; +const itemStyle2: React.CSSProperties = { + width: '63%', + height: 80, + textAlign: 'right' +}; + +export const ExpDuration = (): any => ( + <ExpDurationContext.Consumer> + {(value): React.ReactNode => { + const { maxExecDuration, execDuration, updateOverviewPage } = value; + const tooltip = maxExecDuration - execDuration; + const maxExecDurationStr = convertDuration(maxExecDuration); + const percent = execDuration / maxExecDuration; + return ( + <Stack horizontal className='ExpDuration'> + <div style={itemStyle1}> + <TooltipHost content={`${convertDuration(tooltip)} remaining`}> + <ProgressIndicator percentComplete={percent} barHeight={15} /> + </TooltipHost> + </div> + <div style={itemStyle2}> + <Stack horizontal></Stack> + <EditExpeParamContext.Provider + value={{ + editType: CONTROLTYPE[0], + field: 'maxExecDuration', + title: 'Max duration', + maxExecDuration: maxExecDurationStr, + maxTrialNum: EXPERIMENT.profile.params.maxTrialNum, + trialConcurrency: EXPERIMENT.profile.params.trialConcurrency, + updateOverviewPage + }} + > + <EditExperimentParam /> + </EditExpeParamContext.Provider> + </div> + </Stack> + ); + }} + </ExpDurationContext.Consumer> +); diff --git a/src/webui/src/components/overview/count/ExpDurationContext.tsx b/src/webui/src/components/overview/count/ExpDurationContext.tsx new file mode 100644 index 0000000000..eb8e4fd796 --- /dev/null +++ b/src/webui/src/components/overview/count/ExpDurationContext.tsx @@ -0,0 +1,7 @@ +import React from 'react'; +export const ExpDurationContext = React.createContext({ + maxExecDuration: 0, + execDuration: 0, + // eslint-disable-next-line @typescript-eslint/no-empty-function + updateOverviewPage: (): void => {} +}); diff --git a/src/webui/src/components/overview/count/TrialCount.tsx b/src/webui/src/components/overview/count/TrialCount.tsx new file mode 100644 index 0000000000..95d245a6c4 --- /dev/null +++ b/src/webui/src/components/overview/count/TrialCount.tsx @@ -0,0 +1,107 @@ +import * as React from 'react'; +import { Stack, TooltipHost, ProgressIndicator } from '@fluentui/react'; +import { EXPERIMENT, TRIALS } from '../../../static/datamodel'; +import { CONTROLTYPE } from '../../../static/const'; +import { EditExperimentParam } from './EditExperimentParam'; +import { EditExpeParamContext } from './context'; +import { ExpDurationContext } from './ExpDurationContext'; + +const itemStyles: React.CSSProperties = { + width: '62%' +}; + +const itemStyle2: React.CSSProperties = { + width: '63%', + textAlign: 'right' +}; + +const itemStyle1: React.CSSProperties = { + width: '30%', + height: 50 +}; +const itemRunning: React.CSSProperties = { + width: '42%', + height: 56 +}; + +export const TrialCount = (): any => { + const count = TRIALS.countStatus(); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const stoppedCount = count.get('USER_CANCELED')! + count.get('SYS_CANCELED')! + count.get('EARLY_STOPPED')!; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const bar2 = count.get('RUNNING')! + count.get('SUCCEEDED')! + count.get('FAILED')! + stoppedCount; + // support type [0, 1], not 98% + const bar2Percent = bar2 / EXPERIMENT.profile.params.maxTrialNum; + return ( + <ExpDurationContext.Consumer> + {(value): React.ReactNode => { + const { updateOverviewPage } = value; + return ( + <React.Fragment> + <Stack horizontal horizontalAlign='space-between' className='ExpDuration'> + <div style={itemStyles}> + <TooltipHost content={bar2.toString()}> + <ProgressIndicator percentComplete={bar2Percent} barHeight={15} /> + </TooltipHost> + <Stack horizontal className='mess'> + <div style={itemRunning} className='basic'> + <p>Running</p> + <div>{count.get('RUNNING')}</div> + </div> + <div style={itemStyle1} className='basic'> + <p>Failed</p> + <div>{count.get('FAILED')}</div> + </div> + <div style={itemStyle1} className='basic'> + <p>Stopped</p> + <div>{stoppedCount}</div> + </div> + </Stack> + <Stack horizontal horizontalAlign='space-between' className='mess'> + <div style={itemStyle1} className='basic'> + <p>Succeeded</p> + <div>{count.get('SUCCEEDED')}</div> + </div> + + <div style={itemStyle1} className='basic'> + <p>Waiting</p> + <div>{count.get('WAITING')}</div> + </div> + </Stack> + </div> + <div style={itemStyle2}> + <EditExpeParamContext.Provider + value={{ + title: 'Max trial numbers', + field: 'maxTrialNum', + editType: CONTROLTYPE[1], + maxExecDuration: '', + maxTrialNum: EXPERIMENT.profile.params.maxTrialNum, + trialConcurrency: EXPERIMENT.profile.params.trialConcurrency, + updateOverviewPage + }} + > + <EditExperimentParam /> + </EditExpeParamContext.Provider> + <EditExpeParamContext.Provider + value={{ + title: 'Concurrency', + field: 'trialConcurrency', + editType: CONTROLTYPE[2], + // maxExecDuration: EXPERIMENT.profile.params.maxExecDuration, + maxExecDuration: '', + maxTrialNum: EXPERIMENT.profile.params.maxTrialNum, + trialConcurrency: EXPERIMENT.profile.params.trialConcurrency, + updateOverviewPage + }} + > + <EditExperimentParam /> + </EditExpeParamContext.Provider> + </div> + </Stack> + </React.Fragment> + ); + }} + </ExpDurationContext.Consumer> + ); +}; diff --git a/src/webui/src/components/overview/count/context.tsx b/src/webui/src/components/overview/count/context.tsx new file mode 100644 index 0000000000..7d11f8008c --- /dev/null +++ b/src/webui/src/components/overview/count/context.tsx @@ -0,0 +1,17 @@ +import React from 'react'; +/*** + * const CONTROLTYPE = ['MAX_EXEC_DURATION', 'MAX_TRIAL_NUM', 'TRIAL_CONCURRENCY', 'SEARCH_SPACE']; + * [0], 'MAX_EXEC_DURATION', params.maxExecDuration + * [1], 'MAX_TRIAL_NUM', params.maxTrialNum + * [2], 'TRIAL_CONCURRENCY', params.trialConcurrency + */ +export const EditExpeParamContext = React.createContext({ + editType: '', + field: '', + title: '', + maxExecDuration: '', + maxTrialNum: 0, + trialConcurrency: 0, + // eslint-disable-next-line @typescript-eslint/no-empty-function + updateOverviewPage: (): void => {} +}); diff --git a/src/webui/src/components/overview/experiment/BasicInfo.tsx b/src/webui/src/components/overview/experiment/BasicInfo.tsx new file mode 100644 index 0000000000..470582dfac --- /dev/null +++ b/src/webui/src/components/overview/experiment/BasicInfo.tsx @@ -0,0 +1,98 @@ +import React, { useState, useCallback } from 'react'; +import { Stack, Callout, Link, IconButton } from '@fluentui/react'; +import LogDrawer from '../../modals/LogPanel'; +import { EXPERIMENT } from '../../../static/datamodel'; +import { formatTimestamp } from '../../../static/function'; +import { useId } from '@uifabric/react-hooks'; +import { BestMetricContext } from '../../Overview'; +import { styles } from './basicInfoStyles'; +import '../../../static/style/progress/progress.scss'; +import '../../../static/style/progress/probar.scss'; + +export const ReBasicInfo = (): any => { + const labelId: string = useId('callout-label'); + const descriptionId: string = useId('callout-description'); + const ref = React.createRef<HTMLDivElement>(); + const [isCalloutVisible, setCalloutVisible] = useState(false); + const [isShowLogDrawer, setShowLogDrawer] = useState(false); + const onDismiss = useCallback(() => setCalloutVisible(false), []); + const showCallout = useCallback(() => setCalloutVisible(true), []); + + const closeLogDrawer = useCallback(() => setShowLogDrawer(false), []); + const ShowLogDrawer = useCallback(() => setShowLogDrawer(true), []); + + return ( + <div> + <div className='basic'> + <p>ID: {EXPERIMENT.profile.id}</p> + <div>{EXPERIMENT.profile.params.experimentName}</div> + </div> + <div className='basic'> + <Stack className='basic'> + <p>Status</p> + <Stack horizontal className='status'> + <span className={`${EXPERIMENT.status} status-text`}>{EXPERIMENT.status}</span> + {EXPERIMENT.status === 'ERROR' ? ( + <div> + <div className={styles.buttonArea} ref={ref}> + <IconButton + iconProps={{ iconName: 'info' }} + onClick={isCalloutVisible ? onDismiss : showCallout} + /> + </div> + {isCalloutVisible && ( + <Callout + className={styles.callout} + ariaLabelledBy={labelId} + ariaDescribedBy={descriptionId} + role='alertdialog' + gapSpace={0} + target={ref} + onDismiss={onDismiss} + setInitialFocus={true} + > + <div className={styles.header}> + <p className={styles.title} id={labelId}> + Error + </p> + </div> + <div className={styles.inner}> + <p className={styles.subtext} id={descriptionId}> + {EXPERIMENT.error} + </p> + <div className={styles.actions}> + <Link className={styles.link} onClick={ShowLogDrawer}> + Learn about + </Link> + </div> + </div> + </Callout> + )} + </div> + ) : null} + </Stack> + </Stack> + </div> + <div className='basic'> + <BestMetricContext.Consumer> + {(value): React.ReactNode => ( + <Stack> + <p>Best metric</p> + <div>{isNaN(value.bestAccuracy) ? 'N/A' : value.bestAccuracy.toFixed(6)}</div> + </Stack> + )} + </BestMetricContext.Consumer> + </div> + <div className='basic'> + <p>Start time</p> + <div className='nowrap'>{formatTimestamp(EXPERIMENT.profile.startTime)}</div> + </div> + <div className='basic'> + <p>End time</p> + <div className='nowrap'>{formatTimestamp(EXPERIMENT.profile.endTime)}</div> + </div> + {/* learn about click -> default active key is dispatcher. */} + {isShowLogDrawer ? <LogDrawer closeDrawer={closeLogDrawer} activeTab='dispatcher' /> : null} + </div> + ); +}; diff --git a/src/webui/src/components/overview/experiment/Command.tsx b/src/webui/src/components/overview/experiment/Command.tsx new file mode 100644 index 0000000000..675cfdb74a --- /dev/null +++ b/src/webui/src/components/overview/experiment/Command.tsx @@ -0,0 +1,63 @@ +import React from 'react'; +import { TooltipHost, Stack } from '@fluentui/react'; +import { EXPERIMENT } from '../../../static/datamodel'; +import '../../../static/style/overview/command.scss'; + +export const Command = (): any => { + const clusterMetaData = EXPERIMENT.profile.params.clusterMetaData; + const tuner = EXPERIMENT.profile.params.tuner; + const advisor = EXPERIMENT.profile.params.advisor; + const assessor = EXPERIMENT.profile.params.assessor; + let title = ''; + let builtinName = ''; + let trialCommand = 'unknown'; + if (tuner !== undefined) { + title = title.concat('Tuner'); + if (tuner.builtinTunerName !== undefined) { + builtinName = builtinName.concat(tuner.builtinTunerName); + } + } + if (advisor !== undefined) { + title = title.concat('/ Assessor'); + if (advisor.builtinAdvisorName !== undefined) { + builtinName = builtinName.concat(advisor.builtinAdvisorName); + } + } + if (assessor !== undefined) { + title = title.concat('/ Addvisor'); + if (assessor.builtinAssessorName !== undefined) { + builtinName = builtinName.concat(assessor.builtinAssessorName); + } + } + if (clusterMetaData !== undefined) { + for (const item of clusterMetaData) { + if (item.key === 'command') { + trialCommand = item.value; + } + } + } + return ( + <div className='command basic'> + <div className='command1'> + <p>Training platform</p> + <div className='nowrap'>{EXPERIMENT.profile.params.trainingServicePlatform}</div> + <p className='lineMargin'>{title}</p> + <div className='nowrap'>{builtinName}</div> + </div> + <Stack className='command2'> + <p>Log directory</p> + <div className='nowrap'> + <TooltipHost content={EXPERIMENT.profile.logDir || 'unknown'} className='nowrap'> + {EXPERIMENT.profile.logDir || 'unknown'} + </TooltipHost> + </div> + <p className='lineMargin'>Trial command</p> + <div className='nowrap'> + <TooltipHost content={trialCommand || 'unknown'} className='nowrap'> + {trialCommand || 'unknown'} + </TooltipHost> + </div> + </Stack> + </div> + ); +}; diff --git a/src/webui/src/components/overview/experiment/basicInfoStyles.ts b/src/webui/src/components/overview/experiment/basicInfoStyles.ts new file mode 100644 index 0000000000..05c9f819bc --- /dev/null +++ b/src/webui/src/components/overview/experiment/basicInfoStyles.ts @@ -0,0 +1,52 @@ +import { FontWeights, mergeStyleSets, getTheme } from '@fluentui/react'; + +const theme = getTheme(); + +export const styles = mergeStyleSets({ + buttonArea: { + verticalAlign: 'top', + display: 'inline-block', + textAlign: 'center', + // margin: '0 100px', + minWidth: 30, + height: 30 + }, + callout: { + maxWidth: 300 + }, + header: { + padding: '18px 24px 12px' + }, + title: [ + theme.fonts.xLarge, + { + margin: 0, + color: theme.palette.neutralPrimary, + fontWeight: FontWeights.semilight + } + ], + inner: { + height: '100%', + padding: '0 24px 20px' + }, + actions: { + position: 'relative', + marginTop: 20, + width: '100%', + whiteSpace: 'nowrap' + }, + subtext: [ + theme.fonts.small, + { + margin: 0, + color: theme.palette.neutralPrimary, + fontWeight: FontWeights.semilight + } + ], + link: [ + theme.fonts.medium, + { + color: theme.palette.neutralPrimary + } + ] +}); diff --git a/src/webui/src/components/overview/overviewConst.ts b/src/webui/src/components/overview/overviewConst.ts new file mode 100644 index 0000000000..b188f39dbb --- /dev/null +++ b/src/webui/src/components/overview/overviewConst.ts @@ -0,0 +1,21 @@ +const itemStyle1: React.CSSProperties = { + width: '75%' +}; +const itemStyleSucceed: React.CSSProperties = { + width: '28%' +}; + +const itemStyle2: React.CSSProperties = { + height: 38 +}; + +// top trials entries +const entriesOption = [ + { key: '10', text: '10' }, + { key: '20', text: '20' }, + { key: '30', text: '30' }, + { key: '50', text: '40' }, + { key: '100', text: '100' } +]; + +export { itemStyle1, itemStyleSucceed, itemStyle2, entriesOption }; diff --git a/src/webui/src/components/overview/Details.tsx b/src/webui/src/components/overview/table/Details.tsx similarity index 94% rename from src/webui/src/components/overview/Details.tsx rename to src/webui/src/components/overview/table/Details.tsx index 65407b7965..bf11ddb789 100644 --- a/src/webui/src/components/overview/Details.tsx +++ b/src/webui/src/components/overview/table/Details.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { DetailsRow, IDetailsRowBaseProps } from '@fluentui/react'; -import OpenRow from '../public-child/OpenRow'; +import OpenRow from '../../public-child/OpenRow'; interface DetailsProps { detailsProps: IDetailsRowBaseProps; diff --git a/src/webui/src/components/overview/SuccessTable.tsx b/src/webui/src/components/overview/table/SuccessTable.tsx similarity index 75% rename from src/webui/src/components/overview/SuccessTable.tsx rename to src/webui/src/components/overview/table/SuccessTable.tsx index 67c3ae8908..0f78b544f2 100644 --- a/src/webui/src/components/overview/SuccessTable.tsx +++ b/src/webui/src/components/overview/table/SuccessTable.tsx @@ -1,12 +1,13 @@ import * as React from 'react'; import { DetailsList, IDetailsListProps, IColumn } from '@fluentui/react'; -import DefaultMetric from '../public-child/DefaultMetric'; +import DefaultMetric from '../../public-child/DefaultMetric'; import Details from './Details'; -import { convertDuration } from '../../static/function'; -import { TRIALS } from '../../static/datamodel'; -import { DETAILTABS } from '../stateless-component/NNItabs'; -import '../../static/style/succTable.scss'; -import '../../static/style/openRow.scss'; +import { convertDuration } from '../../../static/function'; +import { TRIALS } from '../../../static/datamodel'; +import { DETAILTABS } from '../../stateless-component/NNItabs'; +import '../../../static/style/succTable.scss'; +import '../../../static/style/tableStatus.css'; +import '../../../static/style/openRow.scss'; interface SuccessTableProps { trialIds: string[]; @@ -15,12 +16,17 @@ interface SuccessTableProps { interface SuccessTableState { columns: IColumn[]; source: Array<any>; + innerWidth: number; } class SuccessTable extends React.Component<SuccessTableProps, SuccessTableState> { constructor(props: SuccessTableProps) { super(props); - this.state = { columns: this.columns, source: TRIALS.table(this.props.trialIds) }; + this.state = { + columns: this.columns, + source: TRIALS.table(this.props.trialIds), + innerWidth: window.innerWidth + }; } private onRenderRow: IDetailsListProps['onRenderRow'] = props => { @@ -70,8 +76,8 @@ class SuccessTable extends React.Component<SuccessTableProps, SuccessTableState> name: 'Trial No.', key: 'sequenceId', fieldName: 'sequenceId', // required! - minWidth: 60, - maxWidth: 120, + minWidth: (window.innerWidth * 0.333 - 150) / 5, + maxWidth: (window.innerWidth * 0.333 - 150) / 5, isResizable: true, data: 'number', onColumnClick: this.onColumnClick @@ -80,8 +86,8 @@ class SuccessTable extends React.Component<SuccessTableProps, SuccessTableState> name: 'ID', key: 'id', fieldName: 'id', - minWidth: 80, - maxWidth: 100, + minWidth: (window.innerWidth * 0.333 - 150) / 5, + maxWidth: (window.innerWidth * 0.333 - 150) / 5, isResizable: true, className: 'tableHead leftTitle', data: 'string', @@ -90,8 +96,8 @@ class SuccessTable extends React.Component<SuccessTableProps, SuccessTableState> { name: 'Duration', key: 'duration', - minWidth: 100, - maxWidth: 210, + minWidth: (window.innerWidth * 0.333 - 150) / 5, + maxWidth: (window.innerWidth * 0.333 - 150) / 5, isResizable: true, fieldName: 'duration', data: 'number', @@ -105,8 +111,8 @@ class SuccessTable extends React.Component<SuccessTableProps, SuccessTableState> { name: 'Status', key: 'status', - minWidth: 140, - maxWidth: 210, + minWidth: (window.innerWidth * 0.333 - 150) / 5, + maxWidth: (window.innerWidth * 0.333 - 150) / 5, isResizable: true, fieldName: 'status', onRender: (item: any): React.ReactNode => { @@ -117,8 +123,8 @@ class SuccessTable extends React.Component<SuccessTableProps, SuccessTableState> name: 'Default metric', key: 'accuracy', fieldName: 'accuracy', - minWidth: 120, - maxWidth: 360, + minWidth: (window.innerWidth * 0.333 - 200) / 5, + // maxWidth: (window.innerWidth * 0.333 - 150) / 5, isResizable: true, data: 'number', onColumnClick: this.onColumnClick, @@ -128,6 +134,17 @@ class SuccessTable extends React.Component<SuccessTableProps, SuccessTableState> } ]; + setInnerWidth = (): void => { + this.setState(() => ({ innerWidth: window.innerWidth })); + }; + + componentDidMount(): void { + window.addEventListener('resize', this.setInnerWidth); + } + componentWillUnmount(): void { + window.removeEventListener('resize', this.setInnerWidth); + } + componentDidUpdate(prevProps: SuccessTableProps): void { if (this.props.trialIds !== prevProps.trialIds) { const { trialIds } = this.props; @@ -138,7 +155,6 @@ class SuccessTable extends React.Component<SuccessTableProps, SuccessTableState> render(): React.ReactNode { const { columns, source } = this.state; const isNoneData = source.length === 0 ? true : false; - return ( <div id='succTable'> <DetailsList diff --git a/src/webui/src/components/public-child/OpenRow.tsx b/src/webui/src/components/public-child/OpenRow.tsx index b54b24aa5d..459ae54801 100644 --- a/src/webui/src/components/public-child/OpenRow.tsx +++ b/src/webui/src/components/public-child/OpenRow.tsx @@ -8,7 +8,7 @@ import JSONTree from 'react-json-tree'; import PaiTrialLog from '../public-child/PaiTrialLog'; import TrialLog from '../public-child/TrialLog'; import MessageInfo from '../modals/MessageInfo'; -import '../../static/style/overview.scss'; +import '../../static/style/overview/overview.scss'; import '../../static/style/copyParameter.scss'; import '../../static/style/openRow.scss'; diff --git a/src/webui/src/components/public-child/config/TrialConfigButton.tsx b/src/webui/src/components/public-child/config/TrialConfigButton.tsx new file mode 100644 index 0000000000..59abafb0c2 --- /dev/null +++ b/src/webui/src/components/public-child/config/TrialConfigButton.tsx @@ -0,0 +1,27 @@ +import React, { useState, useCallback } from 'react'; +import { DefaultButton, Stack } from '@fluentui/react'; +import TrialConfigPanel from './TrialConfigPanel'; +import '../../../static/style/overview/config.scss'; + +export const TrialConfigButton = (): any => { + const [isShowConfigPanel, setShowConfigPanle] = useState(false); + const [activeTab, setActiveTab] = useState('1'); + const hideConfigPanel = useCallback(() => setShowConfigPanle(false), []); + const showTrialConfigpPanel = useCallback(() => { + setShowConfigPanle(true); + setActiveTab('config'); + }, []); + const showSearchSpacePanel = useCallback(() => { + setShowConfigPanle(true); + setActiveTab('search space'); + }, []); + return ( + <React.Fragment> + <Stack className='config'> + <DefaultButton text='Config' onClick={showTrialConfigpPanel} /> + <DefaultButton text='Search space' onClick={showSearchSpacePanel} /> + </Stack> + {isShowConfigPanel && <TrialConfigPanel hideConfigPanel={hideConfigPanel} activeTab={activeTab} />} + </React.Fragment> + ); +}; diff --git a/src/webui/src/components/public-child/config/TrialConfigPanel.tsx b/src/webui/src/components/public-child/config/TrialConfigPanel.tsx new file mode 100644 index 0000000000..f7487d95e7 --- /dev/null +++ b/src/webui/src/components/public-child/config/TrialConfigPanel.tsx @@ -0,0 +1,104 @@ +import * as React from 'react'; +import { Stack, Panel, Pivot, PivotItem, PrimaryButton } from '@fluentui/react'; +import { EXPERIMENT } from '../../../static/datamodel'; +import MonacoEditor from 'react-monaco-editor'; +import { MONACO } from '../../../static/const'; +import { convertDuration } from '../../../static/function'; +import { prettyStringify } from '../../../static/json_util'; +import lodash from 'lodash'; +import '../../../static/style/logDrawer.scss'; + +interface LogDrawerProps { + hideConfigPanel: () => void; + activeTab?: string; +} + +interface LogDrawerState { + panelInnerHeight: number; +} + +class TrialConfigPanel extends React.Component<LogDrawerProps, LogDrawerState> { + constructor(props: LogDrawerProps) { + super(props); + + this.state = { + panelInnerHeight: window.innerHeight + }; + } + + setLogDrawerHeight(): void { + this.setState(() => ({ panelInnerHeight: window.innerHeight })); + } + + async componentDidMount(): Promise<void> { + window.addEventListener('resize', this.setLogDrawerHeight); + } + + componentWillUnmount(): void { + window.removeEventListener('resize', this.setLogDrawerHeight); + } + + render(): React.ReactNode { + const { hideConfigPanel, activeTab } = this.props; + const { panelInnerHeight } = this.state; + // [marginTop 16px] + [Search space 46px] + + // button[height: 32px, marginTop: 45px, marginBottom: 25px] + [padding-bottom: 20px] + const monacoEditorHeight = panelInnerHeight - 184; + const blacklist = [ + 'id', + 'logDir', + 'startTime', + 'endTime', + 'experimentName', + 'searchSpace', + 'trainingServicePlatform' + ]; + const filter = (key: string, val: any): any => { + return blacklist.includes(key) ? undefined : val; + }; + const profile = lodash.cloneDeep(EXPERIMENT.profile); + profile.execDuration = convertDuration(profile.execDuration); + profile.params.maxExecDuration = convertDuration(profile.params.maxExecDuration); + const showProfile = JSON.stringify(profile, filter, 2); + return ( + <Stack> + <Panel + isOpen={true} + hasCloseButton={false} + isFooterAtBottom={true} + isLightDismiss={true} + onLightDismissClick={hideConfigPanel} + > + <div className='log-tab-body'> + <Pivot initialSelectedKey={activeTab} style={{ minHeight: 190, paddingTop: '16px' }}> + <PivotItem headerText='Search space' itemKey='search space'> + <MonacoEditor + height={monacoEditorHeight} + language='json' + theme='vs-light' + value={prettyStringify(EXPERIMENT.searchSpace, 300, 2)} + options={MONACO} + /> + </PivotItem> + <PivotItem headerText='Config' itemKey='config'> + <div className='profile'> + <MonacoEditor + width='100%' + height={monacoEditorHeight} + language='json' + theme='vs-light' + value={showProfile} + options={MONACO} + /> + </div> + </PivotItem> + </Pivot> + </div> + <PrimaryButton text='Close' className='configClose' onClick={hideConfigPanel} /> + </Panel> + </Stack> + ); + } +} + +export default TrialConfigPanel; diff --git a/src/webui/src/components/stateless-component/NNItabs.tsx b/src/webui/src/components/stateless-component/NNItabs.tsx index a733da4fdd..36156f35e6 100644 --- a/src/webui/src/components/stateless-component/NNItabs.tsx +++ b/src/webui/src/components/stateless-component/NNItabs.tsx @@ -15,7 +15,7 @@ const DETAILTABS = ( const NNILOGO = ( <NavLink to={'/oview'}> - <img src={require('../../static/img/logo2.png')} alt='NNI logo' style={{ height: 40 }} /> + <img src={require('../../static/img/logo.png')} alt='NNI logo' style={{ height: 40 }} /> </NavLink> ); diff --git a/src/webui/src/components/trial-detail/TableList.tsx b/src/webui/src/components/trial-detail/TableList.tsx index 47687f7142..a5200d81a6 100644 --- a/src/webui/src/components/trial-detail/TableList.tsx +++ b/src/webui/src/components/trial-detail/TableList.tsx @@ -23,7 +23,7 @@ import { MANAGER_IP, COLUMNPro } from '../../static/const'; import { convertDuration, formatTimestamp, intermediateGraphOption, parseMetrics } from '../../static/function'; import { EXPERIMENT, TRIALS } from '../../static/datamodel'; import { TableRecord, TrialJobInfo } from '../../static/interface'; -const Details = lazy(() => import('../overview/Details')); +const Details = lazy(() => import('../overview/table/Details')); const ChangeColumnComponent = lazy(() => import('../modals/ChangeColumnComponent')); const Compare = lazy(() => import('../modals/Compare')); const KillJob = lazy(() => import('../modals/Killjob')); diff --git a/src/webui/src/index.tsx b/src/webui/src/index.tsx index 50e4ec0521..11de0f1fc6 100644 --- a/src/webui/src/index.tsx +++ b/src/webui/src/index.tsx @@ -5,13 +5,20 @@ import { BrowserRouter as Router, Route, Switch, Redirect } from 'react-router-d const Overview = lazy(() => import('./components/Overview')); const TrialsDetail = lazy(() => import('./components/TrialsDetail')); import './index.css'; +import './static/style/loading.scss'; import * as serviceWorker from './serviceWorker'; ReactDOM.render( <Router> <App> <Switch> - <Suspense fallback={null}> + <Suspense + fallback={ + <div className='loading'> + <img src={require('./static/img/loading.gif')} /> + </div> + } + > <Route path='/oview' component={Overview} /> <Route path='/detail' component={TrialsDetail} /> <Route path='/' render={(): React.ReactNode => <Redirect to={{ pathname: '/oview' }} />} /> diff --git a/src/webui/src/static/const.ts b/src/webui/src/static/const.ts index f35826b5e0..ddd8c76093 100644 --- a/src/webui/src/static/const.ts +++ b/src/webui/src/static/const.ts @@ -15,7 +15,7 @@ const trialJobStatus = [ 'SYS_CANCELED', 'EARLY_STOPPED' ]; -const CONTROLTYPE = ['SEARCH_SPACE', 'TRIAL_CONCURRENCY', 'MAX_EXEC_DURATION']; +const CONTROLTYPE = ['MAX_EXEC_DURATION', 'MAX_TRIAL_NUM', 'TRIAL_CONCURRENCY', 'SEARCH_SPACE']; const MONACO = { readOnly: true, automaticLayout: true, diff --git a/src/webui/src/static/function.ts b/src/webui/src/static/function.ts index 58729f9c3c..813fa7ad81 100644 --- a/src/webui/src/static/function.ts +++ b/src/webui/src/static/function.ts @@ -29,25 +29,53 @@ const convertTime = (num: number): string => { } }; +const convertTimeToSecond = (str: string): number => { + let seconds = 0; + let d, h, m; + if (str.includes('d')) { + [d, str] = str.split('d'); + seconds += parseInt(d) * 24 * 3600; + } + if (str.includes('h')) { + [h, str] = str.split('h'); + seconds += parseInt(h) * 3600; + } + if (str.includes('m')) { + [m, str] = str.split('m'); + seconds += parseInt(m) * 60; + } + if (str) { + seconds += parseInt(str.split('s')[0]); + } + return seconds; +}; + // trial's duration, accurate to seconds for example 10min 30s -const convertDuration = (num: number): string => { - if (num < 1) { - return '0s'; +const convertDuration = (seconds: number): string => { + let str = ''; + + const d = Math.floor(seconds / (24 * 3600)); + if (d > 0) { + str += `${d}d `; } - const hour = Math.floor(num / 3600); - const minute = Math.floor((num / 60) % 60); - const second = Math.floor(num % 60); - const result: string[] = []; - if (hour > 0) { - result.push(`${hour}h`); + seconds -= d * 24 * 3600; + + const h = Math.floor(seconds / 3600); + if (h > 0) { + str += `${h}h `; } - if (minute > 0) { - result.push(`${minute}min`); + seconds -= h * 3600; + + const m = Math.floor(seconds / 60); + if (m > 0) { + str += `${m}m `; } - if (second > 0) { - result.push(`${second}s`); + seconds -= m * 60; + + if (seconds > 0) { + str += `${Math.floor(seconds)}s`; } - return result.join(' '); + return str ? str : '0s'; }; function parseMetrics(metricData: string): any { @@ -246,6 +274,7 @@ function formatComplexTypeValue(value: any): string | number { export { convertTime, convertDuration, + convertTimeToSecond, getFinalResult, getFinal, downFile, diff --git a/src/webui/src/static/img/icon/1.png b/src/webui/src/static/img/icon/1.png deleted file mode 100644 index bb16591ccf..0000000000 Binary files a/src/webui/src/static/img/icon/1.png and /dev/null differ diff --git a/src/webui/src/static/img/icon/10.png b/src/webui/src/static/img/icon/10.png deleted file mode 100644 index 73d482d77d..0000000000 Binary files a/src/webui/src/static/img/icon/10.png and /dev/null differ diff --git a/src/webui/src/static/img/icon/11.png b/src/webui/src/static/img/icon/11.png deleted file mode 100644 index 8d2da0c764..0000000000 Binary files a/src/webui/src/static/img/icon/11.png and /dev/null differ diff --git a/src/webui/src/static/img/icon/2.png b/src/webui/src/static/img/icon/2.png deleted file mode 100644 index 7a830558aa..0000000000 Binary files a/src/webui/src/static/img/icon/2.png and /dev/null differ diff --git a/src/webui/src/static/img/icon/3.png b/src/webui/src/static/img/icon/3.png deleted file mode 100644 index 9a70d1622d..0000000000 Binary files a/src/webui/src/static/img/icon/3.png and /dev/null differ diff --git a/src/webui/src/static/img/icon/4.png b/src/webui/src/static/img/icon/4.png deleted file mode 100644 index daa7101860..0000000000 Binary files a/src/webui/src/static/img/icon/4.png and /dev/null differ diff --git a/src/webui/src/static/img/icon/5.png b/src/webui/src/static/img/icon/5.png deleted file mode 100644 index 7026fc4905..0000000000 Binary files a/src/webui/src/static/img/icon/5.png and /dev/null differ diff --git a/src/webui/src/static/img/icon/6.png b/src/webui/src/static/img/icon/6.png deleted file mode 100644 index 0cfaef4ba6..0000000000 Binary files a/src/webui/src/static/img/icon/6.png and /dev/null differ diff --git a/src/webui/src/static/img/icon/7.png b/src/webui/src/static/img/icon/7.png deleted file mode 100644 index 43b2a85943..0000000000 Binary files a/src/webui/src/static/img/icon/7.png and /dev/null differ diff --git a/src/webui/src/static/img/icon/8.png b/src/webui/src/static/img/icon/8.png deleted file mode 100644 index db0140f614..0000000000 Binary files a/src/webui/src/static/img/icon/8.png and /dev/null differ diff --git a/src/webui/src/static/img/icon/9.png b/src/webui/src/static/img/icon/9.png deleted file mode 100644 index 8072740a9e..0000000000 Binary files a/src/webui/src/static/img/icon/9.png and /dev/null differ diff --git a/src/webui/src/static/img/icon/download.png b/src/webui/src/static/img/icon/download.png deleted file mode 100644 index 4182f1a70e..0000000000 Binary files a/src/webui/src/static/img/icon/download.png and /dev/null differ diff --git a/src/webui/src/static/img/icon/issue.png b/src/webui/src/static/img/icon/issue.png deleted file mode 100644 index 0966645fc7..0000000000 Binary files a/src/webui/src/static/img/icon/issue.png and /dev/null differ diff --git a/src/webui/src/static/img/icon/max.png b/src/webui/src/static/img/icon/max.png deleted file mode 100644 index f32d9d55f4..0000000000 Binary files a/src/webui/src/static/img/icon/max.png and /dev/null differ diff --git a/src/webui/src/static/img/icon/min.png b/src/webui/src/static/img/icon/min.png deleted file mode 100644 index 4a19000c25..0000000000 Binary files a/src/webui/src/static/img/icon/min.png and /dev/null differ diff --git a/src/webui/src/static/img/icon/ques.png b/src/webui/src/static/img/icon/ques.png deleted file mode 100644 index baf4d0a45e..0000000000 Binary files a/src/webui/src/static/img/icon/ques.png and /dev/null differ diff --git a/src/webui/src/static/img/loading.gif b/src/webui/src/static/img/loading.gif new file mode 100644 index 0000000000..624dd9f7c4 Binary files /dev/null and b/src/webui/src/static/img/loading.gif differ diff --git a/src/webui/src/static/img/logo.png b/src/webui/src/static/img/logo.png index 20dd992b66..4015dbc8ae 100644 Binary files a/src/webui/src/static/img/logo.png and b/src/webui/src/static/img/logo.png differ diff --git a/src/webui/src/static/img/logo2.png b/src/webui/src/static/img/logo2.png deleted file mode 100644 index 4015dbc8ae..0000000000 Binary files a/src/webui/src/static/img/logo2.png and /dev/null differ diff --git a/src/webui/src/static/style/loading.scss b/src/webui/src/static/style/loading.scss new file mode 100644 index 0000000000..4b845c47b9 --- /dev/null +++ b/src/webui/src/static/style/loading.scss @@ -0,0 +1,12 @@ +.loading { + width: 80%; + height: 100%; + margin: 0 auto; + + img { + width: 40%; + position: fixed; + top: 30%; + left: 30%; + } +} diff --git a/src/webui/src/static/style/logDrawer.scss b/src/webui/src/static/style/logDrawer.scss index d4dcca201d..d4c3aaf240 100644 --- a/src/webui/src/static/style/logDrawer.scss +++ b/src/webui/src/static/style/logDrawer.scss @@ -28,3 +28,7 @@ text-align: right; } } + +.configClose { + margin: 45px 0 25px 0; +} diff --git a/src/webui/src/static/style/overview.scss b/src/webui/src/static/style/overview.scss deleted file mode 100644 index 7a42427b9d..0000000000 --- a/src/webui/src/static/style/overview.scss +++ /dev/null @@ -1,67 +0,0 @@ - -/* new style */ -.overMessage { - height: 446px; -} - -.blockPadding { - padding: 10px 20px; -} - -.commonTableStyle { - padding: 15px 20px; - height: 100%; - min-width: 500px; - overflow-y: auto; -} - -.padItem { - padding: 10px 20px 0 20px; -} - -.searchSpace { - line-height: 22px; - font-size: 14px; - padding: 15px 0; - color: #212121; - width: 95%; -} - -.nowrap { - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; -} - -.main { - margin: 9px 0; -} - -.profile { - pre { - overflow: inherit; - } -} - -.link { - margin-bottom: 10px; -} - -.info { - position: relative; - top: 15px; - left: 10px; - - span { - color: #333; - font-size: 14px; - } -} - -/* overview-succeed-graph */ -.showMess { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); -} diff --git a/src/webui/src/static/style/overview/command.scss b/src/webui/src/static/style/overview/command.scss new file mode 100644 index 0000000000..4f18b8d1e9 --- /dev/null +++ b/src/webui/src/static/style/overview/command.scss @@ -0,0 +1,30 @@ +.command { + width: 100%; + + >div { + display: inline-block; + } + + .command1 { + width: 46%; + + p { + margin-top: 0; + } + } + + .command2 { + width: 54%; + + p { + margin-top: 0; + } + } + + .command1, + .command2 { + .lineMargin { + margin-top: 20px; + } + } +} diff --git a/src/webui/src/static/style/overview/config.scss b/src/webui/src/static/style/overview/config.scss new file mode 100644 index 0000000000..56aaaeecae --- /dev/null +++ b/src/webui/src/static/style/overview/config.scss @@ -0,0 +1,24 @@ +.config { + position: fixed; + right: 0; + z-index: 1000; + + .ms-Button--default { + padding: 0; + margin: 0 0 15px 0; + border-radius: 18px 0 0 18px; + border: 1px solid #ccc; + color: #0573bc; + } + + .ms-Button--default:hover { + background-color: orangered; + color: #fff; + } +} + +.ms-Fabric { + .ms-Panel-commands { + margin: 0; + } +} diff --git a/src/webui/src/static/style/overview/count.scss b/src/webui/src/static/style/overview/count.scss new file mode 100644 index 0000000000..972a0d83dd --- /dev/null +++ b/src/webui/src/static/style/overview/count.scss @@ -0,0 +1,57 @@ +$seriesIconMargin: 13px; + +.ExpDuration { + margin-top: 28px; + + span:hover { + cursor: pointer; + } +} + +.durationInput { + width: 42px; + height: 32px; + padding-right: 5px; + text-align: right; + outline: none; + border: none; + border-bottom: 1px solid #ccc; +} + +.maxExecDuration { + width: 74px; +} + +.series { + i { + font-size: 20px; + font-weight: 700; + } + + .confirm { + margin: 0 $seriesIconMargin; + + i { + color: green; + } + } +} + +.cancel i { + color: red; +} + +.edit i { + margin-left: 4px; +} + +.overview input:disabled { + background: transparent; + border: none; +} + +.info { + position: absolute; + z-index: 999; + left: 0; +} diff --git a/src/webui/src/static/style/overview/overview.scss b/src/webui/src/static/style/overview/overview.scss new file mode 100644 index 0000000000..28f4dbc874 --- /dev/null +++ b/src/webui/src/static/style/overview/overview.scss @@ -0,0 +1,126 @@ +$boxPadding: 20px 42px; + +.wrapper { + display: grid; + grid-template-columns: repeat(8, 1fr); + grid-auto-rows: 82px; + grid-gap: 18px; + + >div { + background: #fff; + padding: $boxPadding; + border-radius: 20px; + box-sizing: border-box; + } + + .overviewProgress { + grid-column: 2 / 5; + grid-row: 1 / 5; + display: grid; + grid-auto-rows: 70px; + padding: 0; + background: transparent; + + .duration, + .trialCount { + background: #fff; + padding: $boxPadding; + border-radius: 20px; + box-sizing: border-box; + + /* for alert message tooltip position */ + position: relative; + } + + .duration { + // grid-row: 1 / 3; + height: 136px; + } + + .trialCount { + margin-top: 14px; + height: 228px; + } + } +} + +.overviewBasicInfo { + grid-column-start: 1; + grid-row: 1 / 5; + z-index: 2; +} + +.basic { + line-height: 21px; + font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; + + p { + font-size: 14px; + color: #8f8f8f; + margin-top: 20px; + } + + div { + font-size: 16px; + color: #484848; + } + + .nowrap { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } +} + +.overviewTable { + grid-column: 5 / 9; + grid-row: 1 / 10; + overflow: hidden; + + .topTrialTitle { + width: 72%; + } + + .active { + background: #f3f2f1; + } + + .max { + margin-left: 7px; + } + + .mincenter { + margin: 0 13px 0 10px; + } + + .chooseEntry { + margin-right: 10px; + line-height: 30px; + } +} + +.overviewCommand, +.overviewChart { + grid-column: 1 / 5; +} + +.overviewCommand { + height: 144px; + overflow: hidden; +} +$circle: 10px; +$bgblue: #0071bc; + +.overviewChart { + grid-row: 7 / 11; + margin-top: -38px; + + .circle { + width: $circle; + height: $circle; + border-radius: 50%; + background-color: $bgblue; + margin-top: 6px; + margin-right: 18px; + } +} diff --git a/src/webui/src/static/style/overviewTitle.scss b/src/webui/src/static/style/overview/overviewTitle.scss similarity index 69% rename from src/webui/src/static/style/overviewTitle.scss rename to src/webui/src/static/style/overview/overviewTitle.scss index c080c8e271..f2638285f5 100644 --- a/src/webui/src/static/style/overviewTitle.scss +++ b/src/webui/src/static/style/overview/overviewTitle.scss @@ -1,14 +1,8 @@ -$iconPaddingVal: 14px; +$iconPaddingVal: 20px; .panelTitle { - font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; - width: 100%; - height: 38px; - padding: 4px $iconPaddingVal; - box-sizing: border-box; - img { - height: 22px; + height: 23px; /* (38 - 22 ) / 2 */ margin-top: 8px; @@ -21,11 +15,11 @@ $iconPaddingVal: 14px; font-size: 18px; font-weight: 600; color: #333; - line-height: 38px; } i { font-size: 24px; + margin-right: 20px; color: #545454; } } @@ -45,7 +39,7 @@ $iconPaddingVal: 14px; } .minTitle { - margin-right: $iconPaddingVal; + // margin-right: $iconPaddingVal; border-right: 2px solid #fff; } diff --git a/src/webui/src/static/style/probar.scss b/src/webui/src/static/style/probar.scss deleted file mode 100644 index fcf1ca2a14..0000000000 --- a/src/webui/src/static/style/probar.scss +++ /dev/null @@ -1,61 +0,0 @@ -#barBack { - /* status: 'INITIALIZED' | 'RUNNING' | 'ERROR' | 'STOPPING' | 'STOPPED' | 'DONE' */ - - /* status: 'TUNER_NO_MORE_TRIAL' | 'NO_MORE_TRIAL' */ - .RUNNING, - .STOPPING, - .INITIALIZED, - .NO_MORE_TRIAL, - .TUNER_NO_MORE_TRIAL { - /* specific status color */ - color: #0071bc; - - /* progress- duration & trial numbers span */ - .ms-ProgressIndicator-progressBar { - background-color: #0071bc; - } - } - - .DONE, - .STOPPED { - color: #009245; - - .ms-ProgressIndicator-progressBar { - background-color: #009245; - } - } - - .ERROR { - color: #eb0716; - - .ms-ProgressIndicator-progressBar { - background-color: #eb0716; - } - } -} - -.errorBtn { - margin-left: 15px; - display: inline-block; - width: 18px; - height: 18px; - line-height: 18px; - text-align: center; - font-size: 14px; - border: 1px solid #4d4d4d; - border-radius: 50%; - background-color: #4d4d4d; - color: #fff; -} - -.errorBtn:hover { - cursor: pointer; -} - -.errors { - width: 240px; - font-size: 14px; - color: #212121; - word-wrap: break-word; - word-break: normal; -} diff --git a/src/webui/src/static/style/progress.scss b/src/webui/src/static/style/progress.scss deleted file mode 100644 index f6c5b25010..0000000000 --- a/src/webui/src/static/style/progress.scss +++ /dev/null @@ -1,124 +0,0 @@ -.progress { - margin: 15px 17px; - - .status { - color: #0573bc; - font-size: 20px; - font-weight: 600; - margin-top: 5px; - - .status-text { - display: inline-block; - line-height: 30px; - } - } - - .probar { - width: 100%; - height: 34px; - margin-top: 15px; - - .showProgress { - width: 300px; - height: 30px; - } - - .name { - width: 178px; - box-sizing: border-box; - line-height: 30px; - text-align: center; - color: #fff; - background-color: #999; - border: 2px solid #e6e6e6; - border-top-left-radius: 12px; - border-bottom-left-radius: 12px; - } - - .boundary { - width: 100%; - line-height: 24px; - font-size: 12px; - color: #212121; - - .right { - text-align: right; - } - } - - .description { - line-height: 34px; - margin-left: 6px; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - } - } - - &-info { - margin-left: 4px; - position: relative; - top: 2px; - } -} - -/* basic experiment message style */ -.basic { - line-height: 24px; - font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; - - p { - font-size: 14px; - color: #212121; - } - - div { - font-size: 16px; - color: #0573bc; - } -} - -.colorOfbasic { - div { - color: #0573bc; - } - - .time { - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - } -} - -.mess { - margin: 10px 0; -} - -.inputBox { - height: 32px; - margin-top: 5px; - - .concurrencyInput { - width: 40px; - padding-left: 8px; - outline: none; - border: 1px solid #ccc; - } -} - -.lineBasic { - padding-bottom: 14px; - border-bottom: 1px solid #ccc; -} - -/* office-fabric-ui progressIndicator */ -.ms-ProgressIndicator-itemProgress { - padding: 0; - border: 2px solid #e6e6e6; - border-radius: 0 12px 12px 0 !important; -} - -.cursor, -.cursor:hover { - cursor: pointer; -} diff --git a/src/webui/src/static/style/progress/probar.scss b/src/webui/src/static/style/progress/probar.scss new file mode 100644 index 0000000000..274a568e36 --- /dev/null +++ b/src/webui/src/static/style/progress/probar.scss @@ -0,0 +1,33 @@ +/* status: 'INITIALIZED' | 'RUNNING' | 'ERROR' | 'STOPPING' | 'STOPPED' | 'DONE' */ + +/* status: 'TUNER_NO_MORE_TRIAL' | 'NO_MORE_TRIAL' */ +.RUNNING, +.STOPPING, +.INITIALIZED, +.NO_MORE_TRIAL, +.TUNER_NO_MORE_TRIAL { + /* specific status color */ + color: #0071bc; + + /* progress- duration & trial numbers span */ + .ms-ProgressIndicator-progressBar { + background-color: #0071bc; + } +} + +.DONE, +.STOPPED { + color: #009245; + + .ms-ProgressIndicator-progressBar { + background-color: #009245; + } +} + +.ERROR { + color: #eb0716; + + .ms-ProgressIndicator-progressBar { + background-color: #eb0716; + } +} diff --git a/src/webui/src/static/style/progress/progress.scss b/src/webui/src/static/style/progress/progress.scss new file mode 100644 index 0000000000..1ba496c15b --- /dev/null +++ b/src/webui/src/static/style/progress/progress.scss @@ -0,0 +1,70 @@ + +.status { + color: #0573bc; + font-size: 20px; + font-weight: 600; + margin-top: 5px; + + .status-text { + display: inline-block; + line-height: 30px; + } +} + +.probar { + width: 100%; + height: 34px; + margin-top: 15px; + + .showProgress { + width: 300px; + height: 30px; + } + + .name { + width: 178px; + box-sizing: border-box; + line-height: 30px; + text-align: center; + color: #fff; + background-color: #999; + border: 2px solid #e6e6e6; + border-top-left-radius: 12px; + border-bottom-left-radius: 12px; + } + + .boundary { + width: 100%; + line-height: 24px; + font-size: 12px; + color: #212121; + + .right { + text-align: right; + } + } + + .description { + line-height: 34px; + margin-left: 6px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } +} + +.inputBox { + height: 32px; + margin-top: 5px; +} + +/* office-fabric-ui progressIndicator */ +.ms-ProgressIndicator-itemProgress { + padding: 0; + border: 2px solid #e6e6e6; +} + +.cursor, +.cursor:hover { + cursor: pointer; +} diff --git a/src/webui/src/static/style/succTable.scss b/src/webui/src/static/style/succTable.scss index 86b89e3ff9..791fd46bb8 100644 --- a/src/webui/src/static/style/succTable.scss +++ b/src/webui/src/static/style/succTable.scss @@ -1,12 +1,13 @@ #succTable { - height: 404px; - overflow: auto; + min-height: 400px; + max-height: 1000px; + overflow-y: auto; position: relative; .succTable-tooltip { position: absolute; top: 40%; - left: 17%; + left: 5%; .link { margin-left: 15px; diff --git a/src/webui/src/static/style/trialsDetail.scss b/src/webui/src/static/style/trialsDetail.scss index 24e97b5c93..72f665e944 100644 --- a/src/webui/src/static/style/trialsDetail.scss +++ b/src/webui/src/static/style/trialsDetail.scss @@ -57,6 +57,14 @@ } /* table list all */ +.bulletedList { + background: #fff; + + .title { + margin-top: 18px; + margin-left: 14px; + } +} #tableList { width: 96%; diff --git a/src/webui/yarn.lock b/src/webui/yarn.lock index 235cda2f82..92522a004a 100644 --- a/src/webui/yarn.lock +++ b/src/webui/yarn.lock @@ -1163,68 +1163,66 @@ resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-9.0.1.tgz#c27b391d8457d1e893f1eddeaf5e5412d12ffbb5" integrity sha512-6It2EVfGskxZCQhuykrfnALg7oVeiI6KclWSmGDqB0AiInVrTGB9Jp9i4/Ad21u9Jde/voVQz6eFX/eSg/UsPA== -"@fluentui/date-time-utilities@^7.8.0": - version "7.8.0" - resolved "https://registry.yarnpkg.com/@fluentui/date-time-utilities/-/date-time-utilities-7.8.0.tgz#4fe384a19aba3508492e9d17680fba76a21a6144" - integrity sha512-qzlTp3t+PghebJsLK9JwZr91qBRZ/fOml8TQCIjdtsEn4mH6/ciCwir7Fj8iOEkwwTC0iKsEr1jfsITtJKWSmA== +"@fluentui/date-time-utilities@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@fluentui/date-time-utilities/-/date-time-utilities-7.9.0.tgz#4c8570b3af8bc654963ecb034d0fd100010e7d6d" + integrity sha512-D8p5WWeonqRO1EgIvo7WSlX1rcm87r2VQd62zTJPQImx8rpwc77CRI+iAvfxyVHRZMdt4Qk6Jq99dUaudPWaZw== dependencies: - "@uifabric/set-version" "^7.0.22" + "@uifabric/set-version" "^7.0.23" tslib "^1.10.0" -"@fluentui/keyboard-key@^0.2.11": - version "0.2.11" - resolved "https://registry.yarnpkg.com/@fluentui/keyboard-key/-/keyboard-key-0.2.11.tgz#97cbea8641c144ac5230fae0daf6e10c4f4228d4" - integrity sha512-4iG5vNlRD3PrLaMfDTimHNOP1x6V3Dad0fXOwtvBBMsfdySPE9zlY+G+0aqCFcgjymOriFOk0ANZVBpK7XrnTg== +"@fluentui/dom-utilities@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@fluentui/dom-utilities/-/dom-utilities-1.1.1.tgz#b0bbab665fe726f245800bb9e7883b1ceb54248b" + integrity sha512-w40gi8fzCpwa7U8cONiuu8rszPStkVOL/weDf5pCbYEb1gdaV7MDPSNkgM6IV0Kz+k017noDgK9Fv4ru1Dwz1g== dependencies: + "@uifabric/set-version" "^7.0.23" tslib "^1.10.0" -"@fluentui/react-focus@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@fluentui/react-focus/-/react-focus-7.16.0.tgz#51e5d4b22fbe91d557115b4c9402a64214b784ec" - integrity sha512-TwB4Av7ID70ejisDIGkCZGKOxlquSazr6W+9Jv1JQAvsBLuj5XOspFJH4/Igjniw1LeO9QmAvFZeh/XRShiObw== +"@fluentui/keyboard-key@^0.2.12": + version "0.2.12" + resolved "https://registry.yarnpkg.com/@fluentui/keyboard-key/-/keyboard-key-0.2.12.tgz#74eddf4657c164193b6c8855746e691af466441a" + integrity sha512-t3yIbbPKJubb22vQ/FIWwS9vFAzaPYzFxKWPHVWLtxs/P+5yL+LD3B16DRtYreWAdl9CZvEbos58ChLZ0KHwSQ== dependencies: - "@fluentui/keyboard-key" "^0.2.11" - "@uifabric/merge-styles" "^7.18.0" - "@uifabric/set-version" "^7.0.22" - "@uifabric/styling" "^7.16.0" - "@uifabric/utilities" "^7.31.0" tslib "^1.10.0" -"@fluentui/react-icons@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@fluentui/react-icons/-/react-icons-0.3.0.tgz#4acc45e0ecef69860e15d161f26363a6e711282a" - integrity sha512-QDrIhLUpkxM5q5bFE4pkweJJsfaNswdfDoc+X6cmr22Dii+anDFTpOcePEJiTtILxdlEmH0968OcZ4BGZF/joQ== +"@fluentui/react-focus@^7.16.10": + version "7.16.10" + resolved "https://registry.yarnpkg.com/@fluentui/react-focus/-/react-focus-7.16.10.tgz#e82e0719f48877bfc7220d359db4859c4d10b99d" + integrity sha512-+4aP36KjD2RrijRBr6aPYNiBm9M9+33DOHpAdcE0K93TToLIlQ/WIwZGDNbM/6dPFD6vgUj+ya5rvfy6sbibjw== dependencies: - "@microsoft/load-themed-styles" "^1.10.26" - "@uifabric/set-version" "^7.0.22" - "@uifabric/utilities" "^7.31.0" + "@fluentui/keyboard-key" "^0.2.12" + "@uifabric/merge-styles" "^7.19.1" + "@uifabric/set-version" "^7.0.23" + "@uifabric/styling" "^7.16.10" + "@uifabric/utilities" "^7.32.4" tslib "^1.10.0" -"@fluentui/react-window-provider@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@fluentui/react-window-provider/-/react-window-provider-0.3.0.tgz#6dc90a9826306816ddb5b2961e48546c1cb3d93f" - integrity sha512-zHeH1PAmoFB3OkgU8f51E3oGHrL/CjuvdPBlb1SGpByUGNihAgH/CwvJohV9z0yPDkq+chfNUmxWA/oDVpbh6Q== +"@fluentui/react-window-provider@^0.3.3": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@fluentui/react-window-provider/-/react-window-provider-0.3.3.tgz#2950c4e19b28f24079d0e9d6a7a7e4d5b79ad115" + integrity sha512-MVPf2hqOQ17LAZsuvGcr3oOHksAskUm+fCYdXFhbVoAgsCDVTIuH6i8XgHFd6YjBtzjZmI4+k/3NTQfDqBX8EQ== dependencies: - "@uifabric/set-version" "^7.0.22" + "@uifabric/set-version" "^7.0.23" tslib "^1.10.0" "@fluentui/react@^7.135.0": - version "7.137.1" - resolved "https://registry.yarnpkg.com/@fluentui/react/-/react-7.137.1.tgz#c69878285de5397ec8b50917b9129e50ac3c91c0" - integrity sha512-u9qlBobDBjqwOK3vN7N7NoS53RuPXvcpVMOaK5oPRBMdCTsEDcK9pZj/OrKDSGVKmnPRGpoAdNAgsx34QaOfyQ== + version "7.145.0" + resolved "https://registry.yarnpkg.com/@fluentui/react/-/react-7.145.0.tgz#d9ff288cbaf13a61c5d0d36d19eaa693519e4e4c" + integrity sha512-RNYTWwRQhIFKoMHmDkMLF48KcH91brHV/WXCEboIxsmtHm4HyYVG4Zpjib6UG2XOS1zk9sBefHao/zTx3pdG8Q== dependencies: - "@uifabric/set-version" "^7.0.22" - office-ui-fabric-react "^7.137.1" + "@uifabric/set-version" "^7.0.23" + office-ui-fabric-react "^7.145.0" tslib "^1.10.0" -"@fluentui/theme@^0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@fluentui/theme/-/theme-0.2.0.tgz#15e7536e4b8bbbe96132687ef76921687af4200c" - integrity sha512-L5OwqymTdxTVwBa3ifkQLF1A3YU6WMkMTk6PFIMfOonjt8LJ3yMMqZgz+KQR3sF/tzgy4wzW4oBmrxtTfJS2EQ== +"@fluentui/theme@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@fluentui/theme/-/theme-1.3.0.tgz#15a65c6ff20c11a1a7550919b1a71b9c922e9255" + integrity sha512-OVN3yPdJShOGhTakalI5DC9+8myOhLPKzY/ZlICnNoKhh7cbPVrvdCnv2fLcDyZYMQg0CnB3oAaghBHiIW3jmA== dependencies: - "@uifabric/merge-styles" "^7.18.0" - "@uifabric/set-version" "^7.0.22" - "@uifabric/utilities" "^7.31.0" + "@uifabric/merge-styles" "^7.19.1" + "@uifabric/set-version" "^7.0.23" + "@uifabric/utilities" "^7.32.4" tslib "^1.10.0" "@hapi/address@2.x.x": @@ -1416,10 +1414,10 @@ "@types/istanbul-reports" "^1.1.1" "@types/yargs" "^13.0.0" -"@jest/types@^26.3.0": - version "26.3.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.3.0.tgz#97627bf4bdb72c55346eef98e3b3f7ddc4941f71" - integrity sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ== +"@jest/types@^26.5.2": + version "26.5.2" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.5.2.tgz#44c24f30c8ee6c7f492ead9ec3f3c62a5289756d" + integrity sha512-QDs5d0gYiyetI8q+2xWdkixVQMklReZr4ltw7GFDtb4fuJIBCE6mzj2LnitGqCuAlLap6wPyb8fpoHgwZz5fdg== dependencies: "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" @@ -1428,9 +1426,9 @@ chalk "^4.0.0" "@microsoft/load-themed-styles@^1.10.26": - version "1.10.90" - resolved "https://registry.yarnpkg.com/@microsoft/load-themed-styles/-/load-themed-styles-1.10.90.tgz#b9bfc10a9bfe3098efefcc3f842991ca6a029dd8" - integrity sha512-nJaQ6Yij68+GeaSt5ZgK70l5dn2aNGlc9EeES2B054anZTmmBhfaGpciIoSyPZrOg6PSAJjGWTXwd1ovMKOk1w== + version "1.10.108" + resolved "https://registry.yarnpkg.com/@microsoft/load-themed-styles/-/load-themed-styles-1.10.108.tgz#29dfb22e75a50e46a64cb338e2dc680b395f5f01" + integrity sha512-ETEADhZJwttKGPABitB7lDD/22ULL8AG1SKrn9uhYxjF1w1IaS6YS/yCPlDVALeh20zF8LJEEZ2MGb7DgVVYUw== "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" @@ -1585,9 +1583,9 @@ loader-utils "^1.1.0" "@types/babel__core@^7.1.0": - version "7.1.9" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.9.tgz#77e59d438522a6fb898fa43dc3455c6e72f3963d" - integrity sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw== + version "7.1.10" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.10.tgz#ca58fc195dd9734e77e57c6f2df565623636ab40" + integrity sha512-x8OM8XzITIMyiwl5Vmo2B1cR1S1Ipkyv4mdlbJjMa1lmuKvKY9FrBbEANIaMlnWn5Rf7uO+rC/VgYabNkE17Hw== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -1596,252 +1594,242 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.1" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.1.tgz#4901767b397e8711aeb99df8d396d7ba7b7f0e04" - integrity sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew== + version "7.6.2" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.2.tgz#f3d71178e187858f7c45e30380f8f1b7415a12d8" + integrity sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" - integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== + version "7.0.3" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.3.tgz#b8aaeba0a45caca7b56a5de9459872dde3727214" + integrity sha512-uCoznIPDmnickEi6D0v11SBpW0OuVqHJCa7syXqQHy5uktSCreIlt0iglsCnmvz8yCb38hGcWeseA8cWJSwv5Q== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.0.14" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.14.tgz#e99da8c075d4fb098c774ba65dabf7dc9954bd13" - integrity sha512-8w9szzKs14ZtBVuP6Wn7nMLRJ0D6dfB0VEBEyRgxrZ/Ln49aNMykrghM2FaNn4FJRzNppCSa0Rv9pBRM5Xc3wg== + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.15.tgz#db9e4238931eb69ef8aab0ad6523d4d4caa39d03" + integrity sha512-Pzh9O3sTK8V6I1olsXpCfj2k/ygO2q1X0vhhnDrEQyYLHZesWz+zMZMVcwXLCYf0U36EtmyYaFGPfXlTtDHe3A== dependencies: "@babel/types" "^7.3.0" -"@types/color-name@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" - integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== - -"@types/d3-array@*": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-2.0.0.tgz#a0d63a296a2d8435a9ec59393dcac746c6174a96" - integrity sha512-rGqfPVowNDTszSFvwoZIXvrPG7s/qKzm9piCRIH6xwTTRu7pPZ3ootULFnPkTt74B6i5lN0FpLQL24qGOw1uZA== - "@types/d3-array@^1": version "1.2.7" resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-1.2.7.tgz#34dc654d34fc058c41c31dbca1ed68071a8fcc17" integrity sha512-51vHWuUyDOi+8XuwPrTw3cFqyh2Slg9y8COYkRfjCPG9TfYqY0hoNPzv/8BrcAy0FeQBzqEo/D/8Nk2caOQJnA== -"@types/d3-axis@*": - version "1.0.12" - resolved "https://registry.yarnpkg.com/@types/d3-axis/-/d3-axis-1.0.12.tgz#8c124edfcc02f3b3a9cdaa2a28b8a20341401799" - integrity sha512-BZISgSD5M8TgURyNtcPAmUB9sk490CO1Thb6/gIn0WZTt3Y50IssX+2Z0vTccoqZksUDTep0b+o4ofXslvNbqg== +"@types/d3-axis@^1": + version "1.0.14" + resolved "https://registry.yarnpkg.com/@types/d3-axis/-/d3-axis-1.0.14.tgz#4ff27eb94fab10efbda6c972e1fbb26ea696655b" + integrity sha512-wZAKX/dtFT5t5iuCaiU0QL0BWB19TE6h7C7kgfBVyoka7zidQWvf8E9zQTJ5bNPBQxd0+JmplNqwy1M8O8FOjA== dependencies: - "@types/d3-selection" "*" + "@types/d3-selection" "^1" -"@types/d3-brush@*": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/d3-brush/-/d3-brush-1.1.1.tgz#906875ce42db22fc9cde6d1fb2808f17ecd2ea93" - integrity sha512-Exx14trm/q2cskHyMjCrdDllOQ35r1/pmZXaOIt8bBHwYNk722vWY3VxHvN0jdFFX7p2iL3+gD+cGny/aEmhlw== +"@types/d3-brush@^1": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@types/d3-brush/-/d3-brush-1.1.4.tgz#0b5cc9c57476d0144b991228b44664e08494b7f3" + integrity sha512-2t8CgWaha9PsPdSZJ9m6Jl4awqf3DGIXek2e7gfheyfP2R0a/18MX+wuLHx+LyI1Ad7lxDsPWcswKD0XhQEjmg== dependencies: - "@types/d3-selection" "*" + "@types/d3-selection" "^1" -"@types/d3-chord@*": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@types/d3-chord/-/d3-chord-1.0.9.tgz#ccc5de03ff079025491b7aa6b750670a140b45ae" - integrity sha512-UA6lI9CVW5cT5Ku/RV4hxoFn4mKySHm7HEgodtfRthAj1lt9rKZEPon58vyYfk+HIAm33DtJJgZwMXy2QgyPXw== +"@types/d3-chord@^1": + version "1.0.10" + resolved "https://registry.yarnpkg.com/@types/d3-chord/-/d3-chord-1.0.10.tgz#4c14ca40f61b89a3c615d63f5a34fcc81390805c" + integrity sha512-U6YojfET6ITL1/bUJo+/Lh3pMV9XPAfOWwbshl3y3RlgAX9VO/Bxa13IMAylZIDY4VsA3Gkh29kZP1AcAeyoYA== "@types/d3-collection@*": version "1.0.8" resolved "https://registry.yarnpkg.com/@types/d3-collection/-/d3-collection-1.0.8.tgz#aa9552c570a96e33c132e0fd20e331f64baa9dd5" integrity sha512-y5lGlazdc0HNO0F3UUX2DPE7OmYvd9Kcym4hXwrJcNUkDaypR5pX+apuMikl9LfTxKItJsY9KYvzBulpCKyvuQ== -"@types/d3-color@*": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-1.2.2.tgz#80cf7cfff7401587b8f89307ba36fe4a576bc7cf" - integrity sha512-6pBxzJ8ZP3dYEQ4YjQ+NVbQaOflfgXq/JbDiS99oLobM2o72uAST4q6yPxHv6FOTCRC/n35ktuo8pvw/S4M7sw== +"@types/d3-color@^1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-1.4.1.tgz#0d9746c84dfef28807b2989eed4f37b2575e1f33" + integrity sha512-xkPLi+gbgUU9ED6QX4g6jqYL2KCB0/3AlM+ncMGqn49OgH0gFMY/ITGqPF8HwEiLzJaC+2L0I+gNwBgABv1Pvg== -"@types/d3-contour@*": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@types/d3-contour/-/d3-contour-1.3.0.tgz#1a408b121fa5e341f715e3055303ef3079fc7eb0" - integrity sha512-AUCUIjEnC5lCGBM9hS+MryRaFLIrPls4Rbv6ktqbd+TK/RXZPwOy9rtBWmGpbeXcSOYCJTUDwNJuEnmYPJRxHQ== +"@types/d3-contour@^1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@types/d3-contour/-/d3-contour-1.3.1.tgz#589dc3eec14168eea7e31edd1e3bbe246cc9d626" + integrity sha512-wWwsM/3NfKTRBdH00cSf+XlsaHlNTkvH66PgDedobyvKQZ4sJrXXpr16LXvDnAal4B67v8JGrWDgyx6dqqKLuQ== dependencies: - "@types/d3-array" "*" + "@types/d3-array" "^1" "@types/geojson" "*" -"@types/d3-dispatch@*": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@types/d3-dispatch/-/d3-dispatch-1.0.8.tgz#eaeb2ad089d6a0d2685dfa2f2cbbfb7509aae014" - integrity sha512-lCDtqoYez0TgFN3FljBXrz2icqeSzD0gufGook6DPBia+NOh2TBfogjHIsmNa/a+ZOewlHtq4cgLY80O1uLymw== +"@types/d3-dispatch@^1": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@types/d3-dispatch/-/d3-dispatch-1.0.9.tgz#c5a180f1e251de853b399cfbfbb6dd7f8bf842ae" + integrity sha512-zJ44YgjqALmyps+II7b1mZLhrtfV/FOxw9owT87mrweGWcg+WK5oiJX2M3SYJ0XUAExBduarysfgbR11YxzojQ== -"@types/d3-drag@*": - version "1.2.3" - resolved "https://registry.yarnpkg.com/@types/d3-drag/-/d3-drag-1.2.3.tgz#d8ddccca28e939e9c689bea6f40a937e48c39051" - integrity sha512-rWB5SPvkYVxW3sqUxHOJUZwifD0KqvKwvt1bhNqcLpW6Azsd0BJgRNcyVW8GAferaAk5r8dzeZnf9zKlg9+xMQ== +"@types/d3-drag@^1": + version "1.2.5" + resolved "https://registry.yarnpkg.com/@types/d3-drag/-/d3-drag-1.2.5.tgz#0b1b852cb41577075aa625ae6149379ea6c34dfd" + integrity sha512-7NeTnfolst1Js3Vs7myctBkmJWu6DMI3k597AaHUX98saHjHWJ6vouT83UrpE+xfbSceHV+8A0JgxuwgqgmqWw== dependencies: - "@types/d3-selection" "*" + "@types/d3-selection" "^1" -"@types/d3-dsv@*": - version "1.0.36" - resolved "https://registry.yarnpkg.com/@types/d3-dsv/-/d3-dsv-1.0.36.tgz#e91129d7c02b1b814838d001e921e8b9a67153d0" - integrity sha512-jbIWQ27QJcBNMZbQv0NSQMHnBDCmxghAxePxgyiPH1XPCRkOsTBei7jcdi3fDrUCGpCV3lKrSZFSlOkhUQVClA== +"@types/d3-dsv@^1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@types/d3-dsv/-/d3-dsv-1.2.1.tgz#1524fee9f19d689c2f76aa0e24e230762bf96994" + integrity sha512-LLmJmjiqp/fTNEdij5bIwUJ6P6TVNk5hKM9/uk5RPO2YNgEu9XvKO0dJ7Iqd3psEdmZN1m7gB1bOsjr4HmO2BA== -"@types/d3-ease@*": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@types/d3-ease/-/d3-ease-1.0.9.tgz#1dd849bd7edef6426e915e220ed9970db5ea4e04" - integrity sha512-U5ADevQ+W6fy32FVZZC9EXallcV/Mi12A5Tkd0My5MrC7T8soMQEhlDAg88XUWm0zoCQlB4XV0en/24LvuDB4Q== +"@types/d3-ease@^1": + version "1.0.10" + resolved "https://registry.yarnpkg.com/@types/d3-ease/-/d3-ease-1.0.10.tgz#09910e8558439b6038a7ed620650e510394ffa6d" + integrity sha512-fMFTCzd8DOwruE9zlu2O8ci5ct+U5jkGcDS+cH+HCidnJlDs0MZ+TuSVCFtEzh4E5MasItwy+HvgoFtxPHa5Cw== -"@types/d3-fetch@*": - version "1.1.5" - resolved "https://registry.yarnpkg.com/@types/d3-fetch/-/d3-fetch-1.1.5.tgz#51601f79dd4653b5d84e6a3176d78145e065db5e" - integrity sha512-o9c0ItT5/Gl3wbNuVpzRnYX1t3RghzeWAjHUVLuyZJudiTxC4f/fC0ZPFWLQ2lVY8pAMmxpV8TJ6ETYCgPeI3A== +"@types/d3-fetch@^1": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@types/d3-fetch/-/d3-fetch-1.2.2.tgz#b93bfe248b8b761af82f4dac57959c989f67da3e" + integrity sha512-rtFs92GugtV/NpiJQd0WsmGLcg52tIL0uF0bKbbJg231pR9JEb6HT4AUwrtuLq3lOeKdLBhsjV14qb0pMmd0Aw== dependencies: - "@types/d3-dsv" "*" + "@types/d3-dsv" "^1" -"@types/d3-force@*": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@types/d3-force/-/d3-force-1.2.1.tgz#c28803ea36fe29788db69efa0ad6c2dc09544e83" - integrity sha512-jqK+I36uz4kTBjyk39meed5y31Ab+tXYN/x1dn3nZEus9yOHCLc+VrcIYLc/aSQ0Y7tMPRlIhLetulME76EiiA== +"@types/d3-force@^1": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@types/d3-force/-/d3-force-1.2.2.tgz#6337a146dbdf2781f5dde5bb491a646fd03d7bc4" + integrity sha512-TN7KO7sk0tJauedIt0q20RQRFo4V3v97pJKO/TDK40X3LaPM1aXRM2+zFF+nRMtseEiszg4KffudhjR8a3+4cg== -"@types/d3-format@*": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@types/d3-format/-/d3-format-1.3.1.tgz#35bf88264bd6bcda39251165bb827f67879c4384" - integrity sha512-KAWvReOKMDreaAwOjdfQMm0HjcUMlQG47GwqdVKgmm20vTd2pucj0a70c3gUSHrnsmo6H2AMrkBsZU2UhJLq8A== +"@types/d3-format@^1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@types/d3-format/-/d3-format-1.4.1.tgz#1e657a219e4b1e3931508a610d570bdec8ecdd9d" + integrity sha512-ss9G2snEKmp2In5Z3T0Jpqv8QaDBc2xHltBw83KjnV5B5w+Iwphbvq5ph/Xnu4d03fmmsdt+o1aWch379rxIbA== -"@types/d3-geo@*": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@types/d3-geo/-/d3-geo-1.11.1.tgz#e96ec91f16221d87507fec66b2cc889f52d2493e" - integrity sha512-Ox8WWOG3igDRoep/dNsGbOiSJYdUG3ew/6z0ETvHyAtXZVBjOE0S96zSSmzgl0gqQ3RdZjn2eeJOj9oRcMZPkQ== +"@types/d3-geo@^1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@types/d3-geo/-/d3-geo-1.12.1.tgz#bec8692ffee9f60e18483af9008f92d4a8428118" + integrity sha512-8+gyGFyMCXIHtnMNKQDT++tZ4XYFXgiP5NK7mcv34aYXA16GQFiBBITjKzxghpO8QNVceOd9rUn1JY92WLNGQw== dependencies: "@types/geojson" "*" -"@types/d3-hierarchy@*": - version "1.1.6" - resolved "https://registry.yarnpkg.com/@types/d3-hierarchy/-/d3-hierarchy-1.1.6.tgz#4c017521900813ea524c9ecb8d7985ec26a9ad9a" - integrity sha512-vvSaIDf/Ov0o3KwMT+1M8+WbnnlRiGjlGD5uvk83a1mPCTd/E5x12bUJ/oP55+wUY/4Kb5kc67rVpVGJ2KUHxg== +"@types/d3-hierarchy@^1": + version "1.1.7" + resolved "https://registry.yarnpkg.com/@types/d3-hierarchy/-/d3-hierarchy-1.1.7.tgz#14a57b0539f8929015f8ad96490de50a16211040" + integrity sha512-fvht6DOYKzqmXjMb/+xfgkmrWM4SD7rMA/ZbM+gGwr9ZTuIDfky95J8CARtaJo/ExeWyS0xGVdL2gqno2zrQ0Q== -"@types/d3-interpolate@*": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-1.3.1.tgz#1c280511f622de9b0b47d463fa55f9a4fd6f5fc8" - integrity sha512-z8Zmi08XVwe8e62vP6wcA+CNuRhpuUU5XPEfqpG0hRypDE5BWNthQHB1UNWWDB7ojCbGaN4qBdsWp5kWxhT1IQ== +"@types/d3-interpolate@^1": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-1.4.2.tgz#88902a205f682773a517612299a44699285eed7b" + integrity sha512-ylycts6llFf8yAEs1tXzx2loxxzDZHseuhPokrqKprTQSTcD3JbJI1omZP1rphsELZO3Q+of3ff0ZS7+O6yVzg== dependencies: - "@types/d3-color" "*" + "@types/d3-color" "^1" -"@types/d3-path@*": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-1.0.8.tgz#48e6945a8ff43ee0a1ce85c8cfa2337de85c7c79" - integrity sha512-AZGHWslq/oApTAHu9+yH/Bnk63y9oFOMROtqPAtxl5uB6qm1x2lueWdVEjsjjV3Qc2+QfuzKIwIR5MvVBakfzA== +"@types/d3-path@^1": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-1.0.9.tgz#73526b150d14cd96e701597cbf346cfd1fd4a58c" + integrity sha512-NaIeSIBiFgSC6IGUBjZWcscUJEq7vpVu7KthHN8eieTV9d9MqkSOZLH4chq1PmcKy06PNe3axLeKmRIyxJ+PZQ== -"@types/d3-polygon@*": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@types/d3-polygon/-/d3-polygon-1.0.7.tgz#7b3947aa2d48287ff535230d3d396668ab17bfdf" - integrity sha512-Xuw0eSjQQKs8jTiNbntWH0S+Xp+JyhqxmQ0YAQ3rDu6c3kKMFfgsaGN7Jv5u3zG6yVX/AsLP/Xs/QRjmi9g43Q== +"@types/d3-polygon@^1": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@types/d3-polygon/-/d3-polygon-1.0.8.tgz#127ee83fccda5bf57384011da90f31367fea1530" + integrity sha512-1TOJPXCBJC9V3+K3tGbTqD/CsqLyv/YkTXAcwdsZzxqw5cvpdnCuDl42M4Dvi8XzMxZNCT9pL4ibrK2n4VmAcw== -"@types/d3-quadtree@*": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@types/d3-quadtree/-/d3-quadtree-1.0.7.tgz#8e29464ff5b326f6612c1428d9362b4b35de2b70" - integrity sha512-0ajFawWicfjsaCLh6NzxOyVDYhQAmMFbsiI3MPGLInorauHFEh9/Cl6UHNf+kt/J1jfoxKY/ZJaKAoDpbvde5Q== +"@types/d3-quadtree@^1": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@types/d3-quadtree/-/d3-quadtree-1.0.8.tgz#980998eb20d5e1c1494089ad9a8466a0e98825a7" + integrity sha512-FuqYiexeSQZlc+IcGAVK8jSJKDFKHcSf/jx8rqJUUVx6rzv7ecQiXKyatrLHHh3W4CAvgNeVI23JKgk4+x2wFg== -"@types/d3-random@*": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@types/d3-random/-/d3-random-1.1.2.tgz#6f77e8b7bb64ac393f92d33fe8f71038bc4f3cde" - integrity sha512-Jui+Zn28pQw/3EayPKaN4c/PqTvqNbIPjHkgIIFnxne1FdwNjfHtAIsZIBMKlquQNrrMjFzCrlF2gPs3xckqaA== +"@types/d3-random@^1": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@types/d3-random/-/d3-random-1.1.3.tgz#8f7fdc23f92d1561e0694eb49567e8ab50537a19" + integrity sha512-XXR+ZbFCoOd4peXSMYJzwk0/elP37WWAzS/DG+90eilzVbUSsgKhBcWqylGWe+lA2ubgr7afWAOBaBxRgMUrBQ== -"@types/d3-scale-chromatic@*": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz#315367557d51b823bec848614fac095325613fc3" - integrity sha512-9/D7cOBKdZdTCPc6re0HeSUFBM0aFzdNdmYggUWT9SRRiYSOa6Ys2xdTwHKgc1WS3gGfwTMatBOdWCS863REsg== +"@types/d3-scale-chromatic@^1": + version "1.5.1" + resolved "https://registry.yarnpkg.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-1.5.1.tgz#e2b7c3401e5c13809f831911eb820e444f4fc67a" + integrity sha512-7FtJYrmXTEWLykShjYhoGuDNR/Bda0+tstZMkFj4RRxUEryv16AGh3be21tqg84B6KfEwiZyEpBcTyPyU+GWjg== -"@types/d3-scale@*": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-2.2.0.tgz#e5987a2857365823eb26ed5eb21bc566c4dcf1c0" - integrity sha512-oQFanN0/PiR2oySHfj+zAAkK1/p4LD32Nt1TMVmzk+bYHk7vgIg/iTXQWitp1cIkDw4LMdcgvO63wL+mNs47YA== +"@types/d3-scale@^2": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-2.2.4.tgz#ca0d4b84d2f88fe058480f81354d14041a667b96" + integrity sha512-wkQXT+IfgfAnKB5rtS1qMJg3FS32r1rVFHvqtiqk8pX8o5aQR3VwX1P7ErHjzNIicTlkWsaMiUTrYB+E75HFeA== dependencies: - "@types/d3-time" "*" + "@types/d3-time" "^1" -"@types/d3-selection@*": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@types/d3-selection/-/d3-selection-1.4.2.tgz#72dcd61a3aeb9ce3e8d443e3bef7685ffea3413f" - integrity sha512-ksY8UxvTXpzD91Dy3D9zZg98yF2ZEPMKJd8ZQJlZt1QH3Xxr08s6fESEdC2l0Kbe6Xd9VhaoJX06cRaMR1lEnA== +"@types/d3-selection@^1": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@types/d3-selection/-/d3-selection-1.4.3.tgz#36928bbe64eb8e0bbcbaa01fb05c21ff6c71fa93" + integrity sha512-GjKQWVZO6Sa96HiKO6R93VBE8DUW+DDkFpIMf9vpY5S78qZTlRRSNUsHr/afDpF7TvLDV7VxrUFOWW7vdIlYkA== -"@types/d3-shape@*": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-1.3.2.tgz#a41d9d6b10d02e221696b240caf0b5d0f5a588ec" - integrity sha512-LtD8EaNYCaBRzHzaAiIPrfcL3DdIysc81dkGlQvv7WQP3+YXV7b0JJTtR1U3bzeRieS603KF4wUo+ZkJVenh8w== +"@types/d3-shape@^1": + version "1.3.4" + resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-1.3.4.tgz#5a6d8c3026ba8e8a1a985bda8da40acfc9b7b079" + integrity sha512-fxmOjs+UqNQGpztD5BOo+KriE0jLFrBP4Ct++0QExv/xfDOT1cpcMxgsZ+5qPmnR0t+GjbwAe1Um1PHpv3G4oA== dependencies: - "@types/d3-path" "*" + "@types/d3-path" "^1" -"@types/d3-time-format@*": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@types/d3-time-format/-/d3-time-format-2.1.1.tgz#dd2c79ec4575f1355484ab6b10407824668eba42" - integrity sha512-tJSyXta8ZyJ52wDDHA96JEsvkbL6jl7wowGmuf45+fAkj5Y+SQOnz0N7/H68OWmPshPsAaWMQh+GAws44IzH3g== +"@types/d3-time-format@^2": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@types/d3-time-format/-/d3-time-format-2.3.1.tgz#87a30e4513b9d1d53b920327a361f87255bf3372" + integrity sha512-fck0Z9RGfIQn3GJIEKVrp15h9m6Vlg0d5XXeiE/6+CQiBmMDZxfR21XtjEPuDeg7gC3bBM0SdieA5XF3GW1wKA== -"@types/d3-time@*": - version "1.0.10" - resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-1.0.10.tgz#d338c7feac93a98a32aac875d1100f92c7b61f4f" - integrity sha512-aKf62rRQafDQmSiv1NylKhIMmznsjRN+MnXRXTqHoqm0U/UZzVpdrtRnSIfdiLS616OuC1soYeX1dBg2n1u8Xw== +"@types/d3-time@^1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-1.1.1.tgz#6cf3a4242c3bbac00440dfb8ba7884f16bedfcbf" + integrity sha512-ULX7LoqXTCYtM+tLYOaeAJK7IwCT+4Gxlm2MaH0ErKLi07R5lh8NHCAyWcDkCCmx1AfRcBEV6H9QE9R25uP7jw== -"@types/d3-timer@*": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@types/d3-timer/-/d3-timer-1.0.9.tgz#aed1bde0cf18920d33f5d44839d73de393633fd3" - integrity sha512-WvfJ3LFxBbWjqRGz9n7GJt08RrTHPJDVsIwwoCMROlqF+iDacYiAFjf9oqnq0mXpb2juA2N/qjKP+MKdal3YNQ== +"@types/d3-timer@^1": + version "1.0.10" + resolved "https://registry.yarnpkg.com/@types/d3-timer/-/d3-timer-1.0.10.tgz#329c51c2c931f44ed0acff78b8c84571acf0ed21" + integrity sha512-ZnAbquVqy+4ZjdW0cY6URp+qF/AzTVNda2jYyOzpR2cPT35FTXl78s15Bomph9+ckOiI1TtkljnWkwbIGAb6rg== -"@types/d3-transition@*": - version "1.1.6" - resolved "https://registry.yarnpkg.com/@types/d3-transition/-/d3-transition-1.1.6.tgz#7e52da29749d874866cc803fad13925713a372da" - integrity sha512-/F+O2r4oz4G9ATIH3cuSCMGphAnl7VDx7SbENEK0NlI/FE8Jx2oiIrv0uTrpg7yF/AmuWbqp7AGdEHAPIh24Gg== +"@types/d3-transition@^1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@types/d3-transition/-/d3-transition-1.3.1.tgz#5d658eea2db17684daa04eda81d7db9824d3463f" + integrity sha512-U9CpMlTL/NlqdGXBlHYxTZwbmy/vN1cFv8TuAIFPX+xOW/1iChbeJBY2xmINhDQfkGJbgkH4IovafCwI1ZDrgg== dependencies: - "@types/d3-selection" "*" + "@types/d3-selection" "^1" "@types/d3-voronoi@*": version "1.1.9" resolved "https://registry.yarnpkg.com/@types/d3-voronoi/-/d3-voronoi-1.1.9.tgz#7bbc210818a3a5c5e0bafb051420df206617c9e5" integrity sha512-DExNQkaHd1F3dFPvGA/Aw2NGyjMln6E9QzsiqOcBgnE+VInYnFBHBBySbZQts6z6xD+5jTfKCP7M4OqMyVjdwQ== -"@types/d3-zoom@*": - version "1.7.5" - resolved "https://registry.yarnpkg.com/@types/d3-zoom/-/d3-zoom-1.7.5.tgz#1fd7f3497a10f8cfaaefcf2f879767ec775fc3a3" - integrity sha512-G0lpZjlvmv+fI2/dg2whWFbUUmMC3dy4xoeaGOXnaUmOSnms1q9QtlkRq5MXZt1/7LcKwzgmKdEjPVLVq5dH5Q== +"@types/d3-zoom@^1": + version "1.8.2" + resolved "https://registry.yarnpkg.com/@types/d3-zoom/-/d3-zoom-1.8.2.tgz#187d33f9ffa59811ce93b2eacd32d92c1ef03f16" + integrity sha512-rU0LirorUxkLxEHSzkFs7pPC0KWsxRGc0sHrxEDR0/iQq+7/xpNkKuuOOwthlgvOtpOvtTLJ2JFOD6Kr0Si4Uw== dependencies: - "@types/d3-interpolate" "*" - "@types/d3-selection" "*" + "@types/d3-interpolate" "^1" + "@types/d3-selection" "^1" "@types/d3@^5.7.2": - version "5.7.2" - resolved "https://registry.yarnpkg.com/@types/d3/-/d3-5.7.2.tgz#52235eb71a1d3ca171d6dca52a58f5ccbe0254cc" - integrity sha512-7/wClB8ycneWGy3jdvLfXKTd5SoTg9hji7IdJ0RuO9xTY54YpJ8zlcFADcXhY1J3kCBwxp+/1jeN6a5OMwgYOw== + version "5.16.3" + resolved "https://registry.yarnpkg.com/@types/d3/-/d3-5.16.3.tgz#265d506a1b61f558084f2c660f8dd2c93a6d16c8" + integrity sha512-s3wrhYhu25XZQ5p1hI9gEMSX5bx7lg9hAmi0+i5r3v75Gz1zRTgB2Q0psx+SO+4K0AO/PPJ1pnHCz64pANN/4w== dependencies: "@types/d3-array" "^1" - "@types/d3-axis" "*" - "@types/d3-brush" "*" - "@types/d3-chord" "*" + "@types/d3-axis" "^1" + "@types/d3-brush" "^1" + "@types/d3-chord" "^1" "@types/d3-collection" "*" - "@types/d3-color" "*" - "@types/d3-contour" "*" - "@types/d3-dispatch" "*" - "@types/d3-drag" "*" - "@types/d3-dsv" "*" - "@types/d3-ease" "*" - "@types/d3-fetch" "*" - "@types/d3-force" "*" - "@types/d3-format" "*" - "@types/d3-geo" "*" - "@types/d3-hierarchy" "*" - "@types/d3-interpolate" "*" - "@types/d3-path" "*" - "@types/d3-polygon" "*" - "@types/d3-quadtree" "*" - "@types/d3-random" "*" - "@types/d3-scale" "*" - "@types/d3-scale-chromatic" "*" - "@types/d3-selection" "*" - "@types/d3-shape" "*" - "@types/d3-time" "*" - "@types/d3-time-format" "*" - "@types/d3-timer" "*" - "@types/d3-transition" "*" + "@types/d3-color" "^1" + "@types/d3-contour" "^1" + "@types/d3-dispatch" "^1" + "@types/d3-drag" "^1" + "@types/d3-dsv" "^1" + "@types/d3-ease" "^1" + "@types/d3-fetch" "^1" + "@types/d3-force" "^1" + "@types/d3-format" "^1" + "@types/d3-geo" "^1" + "@types/d3-hierarchy" "^1" + "@types/d3-interpolate" "^1" + "@types/d3-path" "^1" + "@types/d3-polygon" "^1" + "@types/d3-quadtree" "^1" + "@types/d3-random" "^1" + "@types/d3-scale" "^2" + "@types/d3-scale-chromatic" "^1" + "@types/d3-selection" "^1" + "@types/d3-shape" "^1" + "@types/d3-time" "^1" + "@types/d3-time-format" "^2" + "@types/d3-timer" "^1" + "@types/d3-transition" "^1" "@types/d3-voronoi" "*" - "@types/d3-zoom" "*" + "@types/d3-zoom" "^1" "@types/eslint-visitor-keys@^1.0.0": version "1.0.0" @@ -1910,14 +1898,14 @@ integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY= "@types/node@*": - version "14.10.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.10.1.tgz#cc323bad8e8a533d4822f45ce4e5326f36e42177" - integrity sha512-aYNbO+FZ/3KGeQCEkNhHFRIzBOUgc7QvcVNKXbfnhDkSfwUv91JsQQa10rDgKSTSLkXZ1UIyPe4FJJNVgw1xWQ== + version "14.11.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.11.7.tgz#4d9673b8331ce262628ea89d9ef3964b6c1e5489" + integrity sha512-hSEXknS4KiayUdZ7401J/T6eykXHJkDEipnyQMJ4/GstK4kWjbHnwXlcpvIWfPKiEH1JU96DkbzJ1nHRmpmKLw== "@types/node@^10.14.2": - version "10.17.32" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.32.tgz#4ef6ff8b842ea0eb3fcbc4331489f4ae64036fa8" - integrity sha512-EUq+cjH/3KCzQHikGnNbWAGe548IFLSm93Vl8xA7EuYEEATiyOVDyEVuGkowL7c9V69FF/RiZSAOCFPApMs/ig== + version "10.17.38" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.38.tgz#951dc5ba517af0381bd8134636f93bcd93ae3e1b" + integrity sha512-pIQORpqlV+QwNix8K1lMmyS7fp80MkQruXp3eMCYAliS3Z1RMYkd4Wf22+iaKLffkngtlIkhiuXOdwLq1zrclg== "@types/normalize-package-data@^2.4.0": version "2.4.0" @@ -1947,9 +1935,9 @@ "@types/react" "*" "@types/react@*", "@types/react@^15.x || ^16.x": - version "16.9.49" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.49.tgz#09db021cf8089aba0cdb12a49f8021a69cce4872" - integrity sha512-DtLFjSj0OYAdVLBbyjhuV9CdGVHCkHn2R+xr3XkBvK2rS1Y1tkc14XSGjYgm5Fjjr90AxH9tiSzc1pCFMGO06g== + version "16.9.51" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.51.tgz#f8aa51ffa9996f1387f63686696d9b59713d2b60" + integrity sha512-lQa12IyO+DMlnSZ3+AGHRUiUcpK47aakMMoBG8f7HGxJT8Yfe+WE128HIXaHOHVPReAW0oDS3KAI0JI2DDe1PQ== dependencies: "@types/prop-types" "*" csstype "^3.0.2" @@ -1978,16 +1966,16 @@ integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== "@types/yargs@^13.0.0": - version "13.0.10" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.10.tgz#e77bf3fc73c781d48c2eb541f87c453e321e5f4b" - integrity sha512-MU10TSgzNABgdzKvQVW1nuuT+sgBMWeXNc3XOs5YXV5SDAK+PPja2eUuBNB9iqElu03xyEDqlnGw0jgl4nbqGQ== + version "13.0.11" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.11.tgz#def2f0c93e4bdf2c61d7e34899b17e34be28d3b1" + integrity sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ== dependencies: "@types/yargs-parser" "*" "@types/yargs@^15.0.0": - version "15.0.5" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.5.tgz#947e9a6561483bdee9adffc983e91a6902af8b79" - integrity sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w== + version "15.0.8" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.8.tgz#7644904cad7427eb704331ea9bf1ee5499b82e23" + integrity sha512-b0BYzFUzBpOhPjpl1wtAHU994jBeKF4TKVlT7ssFv44T617XNcPdRoG4AzHLVshLzlrF7i3lTelH7UbuNYV58Q== dependencies: "@types/yargs-parser" "*" @@ -2034,70 +2022,71 @@ semver "^7.3.2" tsutils "^3.17.1" -"@uifabric/foundation@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@uifabric/foundation/-/foundation-7.9.0.tgz#b7d8333e1c972a22336bfde747fc9f07df24f05c" - integrity sha512-4gdPwx0HV59aWvPKIw6yIje60CYwJZmTJsdLRXqh8Np1tWp2EsbA8U/IHQL1V91rEN0DlQhASqCDFhfQoD1jUw== +"@uifabric/foundation@^7.9.10": + version "7.9.10" + resolved "https://registry.yarnpkg.com/@uifabric/foundation/-/foundation-7.9.10.tgz#3855fe1490e20eb2ac5c8bfb428d7488dd6989bf" + integrity sha512-DeKN+beoqn6HsMW+Ezici1umj7j8aaNykOhLjqg11XRevJh7ifKQOrpePXM+m13B2VAdm2nPyfO3d7eYFvu7Zw== dependencies: - "@uifabric/merge-styles" "^7.18.0" - "@uifabric/set-version" "^7.0.22" - "@uifabric/styling" "^7.16.0" - "@uifabric/utilities" "^7.31.0" + "@uifabric/merge-styles" "^7.19.1" + "@uifabric/set-version" "^7.0.23" + "@uifabric/styling" "^7.16.10" + "@uifabric/utilities" "^7.32.4" tslib "^1.10.0" -"@uifabric/icons@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@uifabric/icons/-/icons-7.5.0.tgz#49b54b1d2eb235073b824f702fbf895676103012" - integrity sha512-RINA9VkajlCnlwEBbqiwLBaaGn38Bf9UvjOuwrrja4B9lclLeQzZuGrG/kp7CnDtIO+LC19OYl/7E3jW7yIihA== +"@uifabric/icons@^7.5.9": + version "7.5.9" + resolved "https://registry.yarnpkg.com/@uifabric/icons/-/icons-7.5.9.tgz#08f5772a0eb7e224fda3434dd3ab29143f21517a" + integrity sha512-kiFw2hm2++OwcVT8ZkHm/UIsyA+4CXBgttmtMaEXMB6/VSt6mfAc+3gs0ehnfXbrBTLUIM9omxXUrrtULSWLTw== dependencies: - "@uifabric/set-version" "^7.0.22" - "@uifabric/styling" "^7.16.0" + "@uifabric/set-version" "^7.0.23" + "@uifabric/styling" "^7.16.10" tslib "^1.10.0" -"@uifabric/merge-styles@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@uifabric/merge-styles/-/merge-styles-7.18.0.tgz#66c5d0e0a4ce03791d0ff356634b51ae1de4e36a" - integrity sha512-805WIbN7lAJATXKxZjjRbIgN7raRMwWYWeDkJJ52PCPuCesOvbpdr0GkH8rC6GQ7EB0MB7YM2i6Fiye7SFewbw== +"@uifabric/merge-styles@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@uifabric/merge-styles/-/merge-styles-7.19.1.tgz#446b3da48ce9925d1649edd0fc232221974b00c9" + integrity sha512-yqUwmk62Kgu216QNPE9vOfS3h0kiSbTvoqM5QcZi+IzpqsBOlzZx3A9Er9UiDaqHRd5lsYF5pO/jeUULmBWF/A== dependencies: - "@uifabric/set-version" "^7.0.22" + "@uifabric/set-version" "^7.0.23" tslib "^1.10.0" -"@uifabric/react-hooks@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@uifabric/react-hooks/-/react-hooks-7.13.0.tgz#fc1da8da1d337ebc52b7e032d6053d953fbc15d3" - integrity sha512-A7K0YFHHr10hB/txsqpPX6PhNhHEv8U7JpY3O81oqlZwSsHroJklQdd897JkAYJUUR+gWe2kQyXkkcaMDdqXjg== +"@uifabric/react-hooks@^7.13.6": + version "7.13.6" + resolved "https://registry.yarnpkg.com/@uifabric/react-hooks/-/react-hooks-7.13.6.tgz#0626791fe283b235b8ddfedc51f693b50b2792b6" + integrity sha512-DvfphxrTsjo3oYioRZ0D8mXdpxWQhhIHeWk1cfdq0MVGqRyKM+cm++9pJpvItFvnTNba38jzKdggqRSUWi+clg== dependencies: - "@fluentui/react-window-provider" "^0.3.0" - "@uifabric/set-version" "^7.0.22" - "@uifabric/utilities" "^7.31.0" + "@fluentui/react-window-provider" "^0.3.3" + "@uifabric/set-version" "^7.0.23" + "@uifabric/utilities" "^7.32.4" tslib "^1.10.0" -"@uifabric/set-version@^7.0.22": - version "7.0.22" - resolved "https://registry.yarnpkg.com/@uifabric/set-version/-/set-version-7.0.22.tgz#f2d5235bb10927a7024b23ccef52070371349dbb" - integrity sha512-IG35UNJNxqI7NC2eYuobGTD+v4W0VHQcC3bYd5Na9EgoC9jVgguS8n6EXUtP/lC1vJEYEyPEZdVwhPxKw4F4Sw== +"@uifabric/set-version@^7.0.23": + version "7.0.23" + resolved "https://registry.yarnpkg.com/@uifabric/set-version/-/set-version-7.0.23.tgz#bfe10b6ba17a2518704cca856bdba8adbc11ffb0" + integrity sha512-9E+YKtnH2kyMKnK9XZZsqyM8OCxEJIIfxtaThTlQpYOzrWAGJxQADFbZ7+Usi0U2xHnWNPFROjq+B9ocEzhqMA== dependencies: tslib "^1.10.0" -"@uifabric/styling@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@uifabric/styling/-/styling-7.16.0.tgz#428226d184965d549ebbd110ac33e115b3136b6f" - integrity sha512-yO404ws8Wl4fjBwG4T58TFJjeU/K+SpWJ4w+WeNMDlJcYe4zXaWn2lbOJtKtQiMl324RAEjFSOuNkXzPb0uOGQ== +"@uifabric/styling@^7.16.10": + version "7.16.10" + resolved "https://registry.yarnpkg.com/@uifabric/styling/-/styling-7.16.10.tgz#c9f25c4a269b2a75214928376088dbbd20820e65" + integrity sha512-qhTJME41VM63paw690xp9SxD3NJP7a4YGUQTifLU0q2GM0e7AMQVDPQ+Cd8Fv9YBS1lJKHi069hVRwSfBejlwg== dependencies: - "@fluentui/theme" "^0.2.0" + "@fluentui/theme" "^1.3.0" "@microsoft/load-themed-styles" "^1.10.26" - "@uifabric/merge-styles" "^7.18.0" - "@uifabric/set-version" "^7.0.22" - "@uifabric/utilities" "^7.31.0" + "@uifabric/merge-styles" "^7.19.1" + "@uifabric/set-version" "^7.0.23" + "@uifabric/utilities" "^7.32.4" tslib "^1.10.0" -"@uifabric/utilities@^7.31.0": - version "7.31.0" - resolved "https://registry.yarnpkg.com/@uifabric/utilities/-/utilities-7.31.0.tgz#600ea931b643c7cbcc38d6466748379227d4fbc7" - integrity sha512-m4Yeyn4gyW7xS8LvOnCesokPModYS2YuE9GQmO++MDZ/vC5RRNlvlyktUZDuxCZ84cNCiXyTQ8nImBaPGnxHVQ== +"@uifabric/utilities@^7.32.4": + version "7.32.4" + resolved "https://registry.yarnpkg.com/@uifabric/utilities/-/utilities-7.32.4.tgz#6e784c29101742196da69d0b60e63cf193c10c71" + integrity sha512-IKZc03uyfTrgcCGSPAUWfFl9CyxzpSrxrYwAuO4NgDEySdOlkYBRwsRUh6UwWfM+sJdhg7Y3nupzNU3VSC/arg== dependencies: - "@uifabric/merge-styles" "^7.18.0" - "@uifabric/set-version" "^7.0.22" + "@fluentui/dom-utilities" "^1.1.1" + "@uifabric/merge-styles" "^7.19.1" + "@uifabric/set-version" "^7.0.23" prop-types "^15.7.2" tslib "^1.10.0" @@ -2312,9 +2301,9 @@ acorn@^5.2.1, acorn@^5.5.3: integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== acorn@^6.0.1, acorn@^6.0.4, acorn@^6.0.5, acorn@^6.0.7: - version "6.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" - integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== address@1.1.2, address@^1.0.1: version "1.1.2" @@ -2427,11 +2416,10 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" - integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: - "@types/color-name" "^1.1.1" color-convert "^2.0.1" ansicolors@~0.3.2: @@ -3139,13 +3127,13 @@ browserslist@4.7.0: node-releases "^1.1.29" browserslist@^4.0.0, browserslist@^4.1.1, browserslist@^4.12.0, browserslist@^4.4.2, browserslist@^4.5.2, browserslist@^4.8.5: - version "4.14.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.2.tgz#1b3cec458a1ba87588cc5e9be62f19b6d48813ce" - integrity sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw== + version "4.14.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.5.tgz#1c751461a102ddc60e40993639b709be7f2c4015" + integrity sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA== dependencies: - caniuse-lite "^1.0.30001125" - electron-to-chromium "^1.3.564" - escalade "^3.0.2" + caniuse-lite "^1.0.30001135" + electron-to-chromium "^1.3.571" + escalade "^3.1.0" node-releases "^1.1.61" bser@2.1.1: @@ -3349,10 +3337,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000939, caniuse-lite@^1.0.30000989, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001125: - version "1.0.30001129" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001129.tgz#e6514b94c0ef50f98cf7476daa91228ddd2ef7bc" - integrity sha512-9945fTVKS810DZITpsAbuhQG7Lam0tEfVbZlsBaCFZaszepbryrArS05PWmJSBQ6mta+v9iz0pUIAbW1eBILIg== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000939, caniuse-lite@^1.0.30000989, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001135: + version "1.0.30001146" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001146.tgz#c61fcb1474520c1462913689201fb292ba6f447c" + integrity sha512-VAy5RHDfTJhpxnDdp2n40GPPLp3KqNrXz1QqFv4J64HvArKs8nuNMOWkB3ICOaBTU/Aj4rYAo/ytdQDDFF/Pug== capture-exit@^2.0.0: version "2.0.0" @@ -4133,9 +4121,9 @@ css-what@2.1: integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== css-what@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.3.0.tgz#10fec696a9ece2e591ac772d759aacabac38cd39" - integrity sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg== + version "3.4.1" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.1.tgz#81cb70b609e4b1351b1e54cbc90fd9c54af86e2e" + integrity sha512-wHOppVDKl4vTAOWzJt5Ek37Sgd9qq1Bmj/T1OjvicWbU5W7ru7Pqbn0Jdqii3Drx/h+dixHKXNhZYx7blthL7g== cssdb@^4.3.0: version "4.4.0" @@ -4557,13 +4545,13 @@ debug@^3.1.0, debug@^3.1.1, debug@^3.2.5: ms "^2.1.1" debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + version "4.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" + integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== dependencies: - ms "^2.1.1" + ms "2.1.2" -debuglog@^1.0.1: +debuglog@*, debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= @@ -4741,10 +4729,10 @@ diff-sequences@^24.9.0: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew== -diff-sequences@^26.3.0: - version "26.3.0" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.3.0.tgz#62a59b1b29ab7fd27cef2a33ae52abe73042d0a2" - integrity sha512-5j5vdRcw3CNctePNYN0Wy2e/JbWT6cAYnXv5OuqPhDpyCGc0uLu2TK0zOCJWNB9kOIfYMSpIulRaDgIi4HJ6Ig== +diff-sequences@^26.5.0: + version "26.5.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.5.0.tgz#ef766cf09d43ed40406611f11c6d8d9dd8b2fefd" + integrity sha512-ZXx86srb/iYy6jG71k++wBN9P9J05UNQ5hQHQd9MtMPvcqXPx/vKU69jfHV637D00Q2gSgPk2D+jSx3l1lDW/Q== diffie-hellman@^5.0.0: version "5.0.3" @@ -4954,10 +4942,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.247, electron-to-chromium@^1.3.564: - version "1.3.567" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.567.tgz#7a404288952ac990e447a7a86470d460ea953b8f" - integrity sha512-1aKkw0Hha1Bw9JA5K5PT5eFXC/TXbkJvUfNSNEciPUMgSIsRJZM1hF2GUEAGZpAbgvd8En21EA+Lv820KOhvqA== +electron-to-chromium@^1.3.247, electron-to-chromium@^1.3.571: + version "1.3.578" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.578.tgz#e6671936f4571a874eb26e2e833aa0b2c0b776e0" + integrity sha512-z4gU6dA1CbBJsAErW5swTGAaU2TBzc2mPAonJb00zqW1rOraDo2zfBMDRvaz9cVic+0JEZiYbHWPw/fTaZlG2Q== elliptic@^6.5.3: version "6.5.3" @@ -5063,37 +5051,37 @@ error-ex@^1.2.0, error-ex@^1.3.1: is-arrayish "^0.2.1" es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.5: - version "1.17.6" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" - integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw== + version "1.17.7" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.7.tgz#a4de61b2f66989fc7421676c1cb9787573ace54c" + integrity sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g== dependencies: es-to-primitive "^1.2.1" function-bind "^1.1.1" has "^1.0.3" has-symbols "^1.0.1" - is-callable "^1.2.0" - is-regex "^1.1.0" - object-inspect "^1.7.0" + is-callable "^1.2.2" + is-regex "^1.1.1" + object-inspect "^1.8.0" object-keys "^1.1.1" - object.assign "^4.1.0" + object.assign "^4.1.1" string.prototype.trimend "^1.0.1" string.prototype.trimstart "^1.0.1" -es-abstract@^1.18.0-next.0: - version "1.18.0-next.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.0.tgz#b302834927e624d8e5837ed48224291f2c66e6fc" - integrity sha512-elZXTZXKn51hUBdJjSZGYRujuzilgXo8vSPQzjGYXLvSlGiCo8VO8ZGV3kjo9a0WNJJ57hENagwbtlRuHuzkcQ== +es-abstract@^1.18.0-next.0, es-abstract@^1.18.0-next.1: + version "1.18.0-next.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz#6e3a0a4bda717e5023ab3b8e90bec36108d22c68" + integrity sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA== dependencies: es-to-primitive "^1.2.1" function-bind "^1.1.1" has "^1.0.3" has-symbols "^1.0.1" - is-callable "^1.2.0" + is-callable "^1.2.2" is-negative-zero "^2.0.0" is-regex "^1.1.1" object-inspect "^1.8.0" object-keys "^1.1.1" - object.assign "^4.1.0" + object.assign "^4.1.1" string.prototype.trimend "^1.0.1" string.prototype.trimstart "^1.0.1" @@ -5118,10 +5106,10 @@ es6-promisify@^5.0.0: dependencies: es6-promise "^4.0.3" -escalade@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.0.2.tgz#6a580d70edb87880f22b4c91d0d56078df6962c4" - integrity sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ== +escalade@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.0.tgz#e8e2d7c7a8b76f6ee64c2181d6b8151441602d4e" + integrity sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig== escape-html@~1.0.3: version "1.0.3" @@ -5146,9 +5134,9 @@ escodegen@^1.11.0, escodegen@^1.9.1: source-map "~0.6.1" eslint-config-prettier@^6.1.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz#f6d2238c1290d01c859a8b5c1f7d352a0b0da8b1" - integrity sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA== + version "6.12.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.12.0.tgz#9eb2bccff727db1c52104f0b49e87ea46605a0d2" + integrity sha512-9jWPlFlgNwRUYVoujvWTQ1aMO8o6648r+K7qU7K5Jmkbyqav1fuEZC0COYpGBxyiAJb65Ra9hrmFx19xRGwXWw== dependencies: get-stdin "^6.0.0" @@ -6704,7 +6692,7 @@ import-local@^2.0.0: pkg-dir "^3.0.0" resolve-cwd "^2.0.0" -imurmurhash@^0.1.4: +imurmurhash@*, imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= @@ -6922,10 +6910,10 @@ is-buffer@^2.0.0: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== -is-callable@^1.1.4, is-callable@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.1.tgz#4d1e21a4f437509d25ce55f8184350771421c96d" - integrity sha512-wliAfSzx6V+6WfMOmus1xy0XvSgf/dlStkvTfq7F0g4bOIW0PSUbnyse3NhDwdyYS1ozfUtAAySqTws3z9Eqgg== +is-callable@^1.1.4, is-callable@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" + integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA== is-ci@^1.0.10: version "1.2.1" @@ -7151,7 +7139,7 @@ is-redirect@^1.0.0: resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= -is-regex@^1.0.4, is-regex@^1.1.0, is-regex@^1.1.1: +is-regex@^1.0.4, is-regex@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== @@ -7366,14 +7354,14 @@ jest-config@^24.9.0: realpath-native "^1.1.0" jest-diff@*: - version "26.4.2" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.4.2.tgz#a1b7b303bcc534aabdb3bd4a7caf594ac059f5aa" - integrity sha512-6T1XQY8U28WH0Z5rGpQ+VqZSZz8EN8rZcBtfvXaOkbwxIEeRre6qnuZQlbY1AJ4MKDxQF8EkrCvK+hL/VkyYLQ== + version "26.5.2" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.5.2.tgz#8e26cb32dc598e8b8a1b9deff55316f8313c8053" + integrity sha512-HCSWDUGwsov5oTlGzrRM+UPJI/Dpqi9jzeV0fdRNi3Ch5bnoXhnyJMmVg2juv9081zLIy3HGPI5mcuGgXM2xRA== dependencies: chalk "^4.0.0" - diff-sequences "^26.3.0" + diff-sequences "^26.5.0" jest-get-type "^26.3.0" - pretty-format "^26.4.2" + pretty-format "^26.5.2" jest-diff@^24.9.0: version "24.9.0" @@ -8279,6 +8267,11 @@ lockfile@^1.0.4: dependencies: signal-exit "^3.0.2" +lodash._baseindexof@*: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz#fe52b53a1c6761e42618d654e4a25789ed61822c" + integrity sha1-/lK1OhxnYeQmGNZU5KJXie1hgiw= + lodash._baseuniq@~4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8" @@ -8287,11 +8280,33 @@ lodash._baseuniq@~4.6.0: lodash._createset "~4.0.0" lodash._root "~3.0.0" +lodash._bindcallback@*: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" + integrity sha1-5THCdkTPi1epnhftlbNcdIeJOS4= + +lodash._cacheindexof@*: + version "3.0.2" + resolved "https://registry.yarnpkg.com/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz#3dc69ac82498d2ee5e3ce56091bafd2adc7bde92" + integrity sha1-PcaayCSY0u5ePOVgkbr9Ktx73pI= + +lodash._createcache@*: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash._createcache/-/lodash._createcache-3.1.2.tgz#56d6a064017625e79ebca6b8018e17440bdcf093" + integrity sha1-VtagZAF2JeeevKa4AY4XRAvc8JM= + dependencies: + lodash._getnative "^3.0.0" + lodash._createset@~4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26" integrity sha1-D0ZZ+7CddRlPqeK4imZE02PJ/iY= +lodash._getnative@*, lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U= + lodash._reinterpolate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" @@ -8322,6 +8337,11 @@ lodash.memoize@^4.1.2: resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= +lodash.restparam@*: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU= + lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" @@ -8661,11 +8681,16 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.44.0, "mime-db@>= 1.43.0 < 2": +mime-db@1.44.0: version "1.44.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== +"mime-db@>= 1.43.0 < 2": + version "1.45.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea" + integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w== + mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: version "2.1.27" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" @@ -8796,9 +8821,9 @@ mixin-object@^2.0.1: minimist "^1.2.5" monaco-editor-webpack-plugin@^1.8.1: - version "1.9.0" - resolved "https://registry.yarnpkg.com/monaco-editor-webpack-plugin/-/monaco-editor-webpack-plugin-1.9.0.tgz#5b547281b9f404057dc5d8c5722390df9ac90be6" - integrity sha512-tOiiToc94E1sb50BgZ8q8WK/bxus77SRrwCqIpAB5er3cpX78SULbEBY4YPOB8kDolOzKRt30WIHG/D6gz69Ww== + version "1.9.1" + resolved "https://registry.yarnpkg.com/monaco-editor-webpack-plugin/-/monaco-editor-webpack-plugin-1.9.1.tgz#eb4bbb1c5e5bfb554541c1ae1542e74c2a9f43fd" + integrity sha512-x7fx1w3i/uwZERIgztHAAK3VQMsL8+ku0lFXXbO81hKDg8IieACqjGEa2mqEueg0c/fX+wd0oI+75wB19KJAsA== dependencies: loader-utils "^1.2.3" @@ -8829,7 +8854,7 @@ ms@2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== -ms@^2.0.0, ms@^2.1.1: +ms@2.1.2, ms@^2.0.0, ms@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== @@ -9388,18 +9413,18 @@ object-hash@^1.1.4: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== -object-inspect@^1.7.0, object-inspect@^1.8.0: +object-inspect@^1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== object-is@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.2.tgz#c5d2e87ff9e119f78b7a088441519e2eec1573b6" - integrity sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ== + version "1.1.3" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.3.tgz#2e3b9e65560137455ee3bd62aec4d90a2ea1cc81" + integrity sha512-teyqLvFWzLkq5B9ki8FVWA902UER2qkxmdA4nLf+wjOLAWgxzCWZNCxpDq9MvE8MmhWNr+I8w3BN49Vx36Y6Xg== dependencies: define-properties "^1.1.3" - es-abstract "^1.17.5" + es-abstract "^1.18.0-next.1" object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" @@ -9413,7 +9438,7 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.1.0: +object.assign@^4.1.0, object.assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.1.tgz#303867a666cdd41936ecdedfb1f8f3e32a478cdd" integrity sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA== @@ -9463,23 +9488,22 @@ obuf@^1.0.0, obuf@^1.1.2: resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== -office-ui-fabric-react@^7.137.1: - version "7.137.1" - resolved "https://registry.yarnpkg.com/office-ui-fabric-react/-/office-ui-fabric-react-7.137.1.tgz#58b3c1d2254afb3d7ab1f780cf1fb6929c42fafe" - integrity sha512-6m1M9m5psaJqhWwroVp1L0G8q66scLMsQRi+gQ/fY3f75ipGSABGeQ86d4P0ilKaYcLVYIzosocPIZKLbBVpnQ== +office-ui-fabric-react@^7.145.0: + version "7.145.0" + resolved "https://registry.yarnpkg.com/office-ui-fabric-react/-/office-ui-fabric-react-7.145.0.tgz#e86a5fa08a2a3528f2a692bec88ea55c76b238b3" + integrity sha512-+eAo/bZpnTXmirwsPZxIbPhjQk+C34f0W/8tAHYWYASrRio9DWWDB0PRsSGUNrn1QubWxjudW294fovkewPeAQ== dependencies: - "@fluentui/date-time-utilities" "^7.8.0" - "@fluentui/react-focus" "^7.16.0" - "@fluentui/react-icons" "^0.3.0" - "@fluentui/react-window-provider" "^0.3.0" + "@fluentui/date-time-utilities" "^7.9.0" + "@fluentui/react-focus" "^7.16.10" + "@fluentui/react-window-provider" "^0.3.3" "@microsoft/load-themed-styles" "^1.10.26" - "@uifabric/foundation" "^7.9.0" - "@uifabric/icons" "^7.5.0" - "@uifabric/merge-styles" "^7.18.0" - "@uifabric/react-hooks" "^7.13.0" - "@uifabric/set-version" "^7.0.22" - "@uifabric/styling" "^7.16.0" - "@uifabric/utilities" "^7.31.0" + "@uifabric/foundation" "^7.9.10" + "@uifabric/icons" "^7.5.9" + "@uifabric/merge-styles" "^7.19.1" + "@uifabric/react-hooks" "^7.13.6" + "@uifabric/set-version" "^7.0.23" + "@uifabric/styling" "^7.16.10" + "@uifabric/utilities" "^7.32.4" prop-types "^15.7.2" tslib "^1.10.0" @@ -10018,9 +10042,9 @@ postcss-browser-comments@^2.0.0: postcss "^7.0.2" postcss-calc@^7.0.1: - version "7.0.4" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.4.tgz#5e177ddb417341e6d4a193c5d9fd8ada79094f8b" - integrity sha512-0I79VRAd1UTkaHzY9w83P39YGO/M3bG7/tNLrHGEunBolfoGM0hSjrGvjoeaj0JE/zIw5GsI2KZ0UwDJqv5hjw== + version "7.0.5" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.5.tgz#f8a6e99f12e619c2ebc23cf6c486fdc15860933e" + integrity sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg== dependencies: postcss "^7.0.27" postcss-selector-parser "^6.0.2" @@ -10237,9 +10261,9 @@ postcss-less@^3.1.4: postcss "^7.0.14" postcss-load-config@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.0.tgz#c84d692b7bb7b41ddced94ee62e8ab31b417b003" - integrity sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q== + version "2.1.2" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.2.tgz#c5ea504f2c4aef33c7359a34de3573772ad7502a" + integrity sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw== dependencies: cosmiconfig "^5.0.0" import-cwd "^2.0.0" @@ -10643,13 +10667,14 @@ postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: uniq "^1.0.1" postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" - integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== + version "6.0.4" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz#56075a1380a04604c38b063ea7767a129af5c2b3" + integrity sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw== dependencies: cssesc "^3.0.0" indexes-of "^1.0.1" uniq "^1.0.1" + util-deprecate "^1.0.2" postcss-svgo@^4.0.2: version "4.0.2" @@ -10694,19 +10719,10 @@ postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: indexes-of "^1.0.1" uniq "^1.0.1" -postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: - version "7.0.32" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d" - integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw== - dependencies: - chalk "^2.4.2" - source-map "^0.6.1" - supports-color "^6.1.0" - -postcss@^7.0.21, postcss@^7.0.26: - version "7.0.34" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.34.tgz#f2baf57c36010df7de4009940f21532c16d65c20" - integrity sha512-H/7V2VeNScX9KE83GDrDZNiGT1m2H+UTnlinIzhjlLX9hfMUn1mHNnGeX81a1c8JSBdBvqk7c2ZOG6ZPn5itGw== +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.35" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24" + integrity sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg== dependencies: chalk "^2.4.2" source-map "^0.6.1" @@ -10757,12 +10773,12 @@ pretty-format@^24.9.0: ansi-styles "^3.2.0" react-is "^16.8.4" -pretty-format@^26.4.2: - version "26.4.2" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.4.2.tgz#d081d032b398e801e2012af2df1214ef75a81237" - integrity sha512-zK6Gd8zDsEiVydOCGLkoBoZuqv8VTiHyAbKznXe/gaph/DAeZOmit9yMfgIz5adIgAMMs5XfoYSwAX3jcCO1tA== +pretty-format@^26.5.2: + version "26.5.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.5.2.tgz#5d896acfdaa09210683d34b6dc0e6e21423cd3e1" + integrity sha512-VizyV669eqESlkOikKJI8Ryxl/kPpbdLwNdPs2GrbQs18MpySB5S0Yo0N7zkg2xTRiFq4CFw8ct5Vg4a0xP0og== dependencies: - "@jest/types" "^26.3.0" + "@jest/types" "^26.5.2" ansi-regex "^5.0.0" ansi-styles "^4.0.0" react-is "^16.12.0" @@ -10944,9 +10960,9 @@ qs@~6.5.2: integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== query-string@^6.8.2: - version "6.13.2" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.13.2.tgz#3585aa9412c957cbd358fd5eaca7466f05586dda" - integrity sha512-BMmDaUiLDFU1hlM38jTFcRt7HYiGP/zt1sRzrIWm5zpeEuO1rkbPS0ELI3uehoLuuhHDCS8u8lhFN3fEN4JzPQ== + version "6.13.5" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.13.5.tgz#99e95e2fb7021db90a6f373f990c0c814b3812d8" + integrity sha512-svk3xg9qHR39P3JlHuD7g3nRnyay5mHbrPctEBDUxUkHRifPHXJDhBUycdCC0NBjXoDf44Gb+IsOZL1Uwn8M/Q== dependencies: decode-uri-component "^0.2.0" split-on-first "^1.0.0" @@ -11158,9 +11174,9 @@ react-router@5.2.0, react-router@^5.2.0: tiny-warning "^1.0.0" react-table@^7.0.0-rc.15: - version "7.5.0" - resolved "https://registry.yarnpkg.com/react-table/-/react-table-7.5.0.tgz#87326d92cdffbbf970f49b395bcafc3f84989ddf" - integrity sha512-hLsbNqLJkkYiATVteM8mthP8y5vnLPB2qdi9FeGZjsvb2m5vxj6cavIgk35oulvBmYD6Kox0HFfI332HPZpC7w== + version "7.5.2" + resolved "https://registry.yarnpkg.com/react-table/-/react-table-7.5.2.tgz#d82ceee3d4d40b119159bce1708f084a95d3435c" + integrity sha512-qiceR/gQUOBsO/q1z1wZ3RbRvkRt39Gbzo631HiPuWmo+eTmTgaXDqLGzCmU+bOr81PB6kDxXhoWQR8hiWaUJA== react@^0.13.3: version "0.13.3" @@ -11458,9 +11474,9 @@ regexpp@^3.0.0: integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== regexpu-core@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" - integrity sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ== + version "4.7.1" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6" + integrity sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ== dependencies: regenerate "^1.4.0" regenerate-unicode-properties "^8.2.0" @@ -11899,9 +11915,9 @@ select-hose@^2.0.0: integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= selfsigned@^1.9.1: - version "1.10.7" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.7.tgz#da5819fd049d5574f28e88a9bcc6dbc6e6f3906b" - integrity sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA== + version "1.10.8" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.8.tgz#0d17208b7d12c33f8eac85c41835f27fc3d81a30" + integrity sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w== dependencies: node-forge "0.9.0" @@ -12677,9 +12693,9 @@ stylelint-config-standard@^20.0.0: stylelint-config-recommended "^3.0.0" stylelint@^13.7.0: - version "13.7.1" - resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-13.7.1.tgz#bee97ee78d778a3f1dbe3f7397b76414973e263e" - integrity sha512-qzqazcyRxrSRdmFuO0/SZOJ+LyCxYy0pwcvaOBBnl8/2VfHSMrtNIE+AnyJoyq6uKb+mt+hlgmVrvVi6G6XHfQ== + version "13.7.2" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-13.7.2.tgz#6f3c58eea4077680ed0ceb0d064b22b100970486" + integrity sha512-mmieorkfmO+ZA6CNDu1ic9qpt4tFvH2QUB7vqXgrMVHe5ENU69q7YDq0YUg/UHLuCsZOWhUAvcMcLzLDIERzSg== dependencies: "@stylelint/postcss-css-in-js" "^0.37.2" "@stylelint/postcss-markdown" "^0.36.1" @@ -13095,9 +13111,9 @@ ts-pnp@^1.0.0: integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" - integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== + version "1.14.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.0.tgz#d624983f3e2c5e0b55307c3dd6c86acd737622c6" + integrity sha512-+Zw5lu0D9tvBMjGP8LpvMb0u2WW2QV3y+D8mO6J+cNzCYIN4sVy43Bf9vl92nqFahutN0I8zHa7cc4vihIshnw== tsutils@^3.17.1: version "3.17.1" @@ -13418,7 +13434,7 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -util-deprecate@^1.0.1, util-deprecate@~1.0.1: +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=