From 975996ef625612295f56d81da1b3009a86b2795f Mon Sep 17 00:00:00 2001 From: Nikita Manovich Date: Tue, 18 May 2021 17:17:29 +0300 Subject: [PATCH 001/123] Updated the version and CHANGELOG.md for 1.5.0-alpha --- CHANGELOG.md | 26 ++++++++++++++++++++++++++ cvat/__init__.py | 2 +- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 349498e357d..78445bd6785 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,32 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.5.0] - Unreleased + +### Added + +- + +### Changed + +- + +### Deprecated + +- + +### Removed + +- + +### Fixed + +- + +### Security + +- + ## [1.4.0] - 2021-05-18 ### Added diff --git a/cvat/__init__.py b/cvat/__init__.py index 2207f0e7c18..de9048d03cb 100644 --- a/cvat/__init__.py +++ b/cvat/__init__.py @@ -4,6 +4,6 @@ from cvat.utils.version import get_version -VERSION = (1, 4, 0, 'final', 0) +VERSION = (1, 5, 0, 'alpha', 0) __version__ = get_version(VERSION) From 6f52ef30e411c3d9624beead4fe7405c2e283fe8 Mon Sep 17 00:00:00 2001 From: Boris Sekachev Date: Wed, 19 May 2021 10:16:04 +0300 Subject: [PATCH 002/123] Support of context images for 2D tasks (#3122) --- CHANGELOG.md | 6 +- cvat-core/package-lock.json | 2 +- cvat-core/package.json | 2 +- cvat-core/src/frames.js | 22 ++- cvat-core/src/server-proxy.js | 6 +- cvat-ui/package-lock.json | 2 +- cvat-ui/package.json | 2 +- cvat-ui/src/actions/annotation-actions.ts | 33 ++-- .../annotation-page/canvas/canvas-wrapper.tsx | 7 +- .../canvas/canvas-wrapper3D.tsx | 20 +-- .../context-image/context-image.tsx | 74 ++++++++ .../control-visibility-observer.tsx | 2 +- .../standard-workspace/styles.scss | 54 +++++- .../context-image/context-image.tsx | 34 ---- .../controls-side-bar/controls-side-bar.tsx | 13 +- .../controls-side-bar/photo-context.tsx | 37 ---- .../standard3D-workspace/styles.scss | 161 ----------------- .../annotation-page/top-bar/top-bar.tsx | 1 - .../canvas/canvas-wrapper3D.tsx | 13 +- .../controls-side-bar/controls-side-bar.tsx | 23 +-- cvat-ui/src/reducers/annotation-reducer.ts | 62 +++++-- cvat-ui/src/reducers/interfaces.ts | 6 +- cvat-ui/src/reducers/notifications-reducer.ts | 16 ++ cvat/apps/engine/media_extractors.py | 77 +------- cvat/apps/engine/serializers.py | 1 + cvat/apps/engine/task.py | 42 ++--- cvat/apps/engine/views.py | 31 ++-- ...56_canvas3d_functionality_basic_actions.js | 18 +- ...nality_control_button_mouse_interaction.js | 1 - utils/dataset_manifest/core.py | 7 +- utils/dataset_manifest/create.py | 33 ++-- utils/dataset_manifest/utils.py | 164 +++++++++++++++++- 32 files changed, 483 insertions(+), 489 deletions(-) create mode 100644 cvat-ui/src/components/annotation-page/standard-workspace/context-image/context-image.tsx delete mode 100644 cvat-ui/src/components/annotation-page/standard3D-workspace/context-image/context-image.tsx delete mode 100644 cvat-ui/src/components/annotation-page/standard3D-workspace/controls-side-bar/photo-context.tsx diff --git a/CHANGELOG.md b/CHANGELOG.md index 78445bd6785..65c9ec5f2c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,11 +9,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added -- +- Support of context images for 2D image tasks () ### Changed -- +- Updated manifest format, added meta with related images () ### Deprecated @@ -111,7 +111,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fixed filters select overflow () - Fixed tasks in project auto annotation () - Cuboids are missed in annotations statistics () -- The list of files attached to the task is not displayed () - A couple of css-related issues (top bar disappear, wrong arrow position on collapse elements) () - Issue with point region doesn't work in Firefox () - Fixed cuboid perspective change () diff --git a/cvat-core/package-lock.json b/cvat-core/package-lock.json index 5fecc13095c..2bdc1118032 100644 --- a/cvat-core/package-lock.json +++ b/cvat-core/package-lock.json @@ -1,6 +1,6 @@ { "name": "cvat-core", - "version": "3.12.1", + "version": "3.13.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/cvat-core/package.json b/cvat-core/package.json index a04727d57bc..e5e482fde5c 100644 --- a/cvat-core/package.json +++ b/cvat-core/package.json @@ -1,6 +1,6 @@ { "name": "cvat-core", - "version": "3.12.1", + "version": "3.13.0", "description": "Part of Computer Vision Tool which presents an interface for client-side integration", "main": "babel.config.js", "scripts": { diff --git a/cvat-core/src/frames.js b/cvat-core/src/frames.js index bd1009ef720..478b6c6569f 100644 --- a/cvat-core/src/frames.js +++ b/cvat-core/src/frames.js @@ -19,7 +19,15 @@ */ class FrameData { constructor({ - width, height, name, taskID, frameNumber, startFrame, stopFrame, decodeForward, + width, + height, + name, + taskID, + frameNumber, + startFrame, + stopFrame, + decodeForward, + has_related_context: hasRelatedContext, }) { Object.defineProperties( this, @@ -72,6 +80,18 @@ value: frameNumber, writable: false, }, + /** + * True if some context images are associated with this frame + * @name hasRelatedContext + * @type {boolean} + * @memberof module:API.cvat.classes.FrameData + * @readonly + * @instance + */ + hasRelatedContext: { + value: hasRelatedContext, + writable: false, + }, startFrame: { value: startFrame, writable: false, diff --git a/cvat-core/src/server-proxy.js b/cvat-core/src/server-proxy.js index f3627d4ec2f..cf31969a302 100644 --- a/cvat-core/src/server-proxy.js +++ b/cvat-core/src/server-proxy.js @@ -756,11 +756,7 @@ }, ); } catch (errorData) { - const code = errorData.response ? errorData.response.status : errorData.code; - throw new ServerError( - `Could not get Image Context of the frame for the task ${tid} from the server`, - code, - ); + throw generateError(errorData); } return response.data; diff --git a/cvat-ui/package-lock.json b/cvat-ui/package-lock.json index ae3f43c1a90..c2a48c19580 100644 --- a/cvat-ui/package-lock.json +++ b/cvat-ui/package-lock.json @@ -1,6 +1,6 @@ { "name": "cvat-ui", - "version": "1.19.1", + "version": "1.20.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/cvat-ui/package.json b/cvat-ui/package.json index ceda7cb074c..f15cd39389f 100644 --- a/cvat-ui/package.json +++ b/cvat-ui/package.json @@ -1,6 +1,6 @@ { "name": "cvat-ui", - "version": "1.19.1", + "version": "1.20.0", "description": "CVAT single-page application", "main": "src/index.tsx", "scripts": { diff --git a/cvat-ui/src/actions/annotation-actions.ts b/cvat-ui/src/actions/annotation-actions.ts index 898306a0aea..0dd6eb55b9d 100644 --- a/cvat-ui/src/actions/annotation-actions.ts +++ b/cvat-ui/src/actions/annotation-actions.ts @@ -196,6 +196,8 @@ export enum AnnotationActionTypes { GET_PREDICTIONS_SUCCESS = 'GET_PREDICTIONS_SUCCESS', HIDE_SHOW_CONTEXT_IMAGE = 'HIDE_SHOW_CONTEXT_IMAGE', GET_CONTEXT_IMAGE = 'GET_CONTEXT_IMAGE', + GET_CONTEXT_IMAGE_SUCCESS = 'GET_CONTEXT_IMAGE_SUCCESS', + GET_CONTEXT_IMAGE_FAILED = 'GET_CONTEXT_IMAGE_FAILED', } export function saveLogsAsync(): ThunkAction { @@ -715,6 +717,7 @@ export function changeFrameAsync(toFrame: number, fillBuffer?: boolean, frameSte number: state.annotation.player.frame.number, data: state.annotation.player.frame.data, filename: state.annotation.player.frame.filename, + hasRelatedContext: state.annotation.player.frame.hasRelatedContext, delay: state.annotation.player.frame.delay, changeTime: state.annotation.player.frame.changeTime, states: state.annotation.annotations.states, @@ -766,6 +769,7 @@ export function changeFrameAsync(toFrame: number, fillBuffer?: boolean, frameSte number: toFrame, data, filename: data.filename, + hasRelatedContext: data.hasRelatedContext, states, minZ, maxZ, @@ -1031,6 +1035,7 @@ export function getJobAsync(tid: number, jid: number, initialFrame: number, init states, frameNumber, frameFilename: frameData.filename, + frameHasRelatedContext: frameData.hasRelatedContext, frameData, colors, filters, @@ -1636,31 +1641,23 @@ export function getContextImage(): ThunkAction { return async (dispatch: ActionCreator): Promise => { const state: CombinedState = getStore().getState(); const { instance: job } = state.annotation.job; - const { frame, contextImage } = state.annotation.player; + const { number: frameNumber } = state.annotation.player.frame; try { - const context = await job.frames.contextImage(job.task.id, frame.number); - const loaded = true; - const contextImageHide = contextImage.hidden; dispatch({ type: AnnotationActionTypes.GET_CONTEXT_IMAGE, - payload: { - context, - loaded, - contextImageHide, - }, + payload: {}, + }); + + const contextImageData = await job.frames.contextImage(job.task.id, frameNumber); + dispatch({ + type: AnnotationActionTypes.GET_CONTEXT_IMAGE_SUCCESS, + payload: { contextImageData }, }); } catch (error) { - const context = ''; - const loaded = true; - const contextImageHide = contextImage.hidden; dispatch({ - type: AnnotationActionTypes.GET_CONTEXT_IMAGE, - payload: { - context, - loaded, - contextImageHide, - }, + type: AnnotationActionTypes.GET_CONTEXT_IMAGE_FAILED, + payload: { error }, }); } }; diff --git a/cvat-ui/src/components/annotation-page/canvas/canvas-wrapper.tsx b/cvat-ui/src/components/annotation-page/canvas/canvas-wrapper.tsx index 5909816adfa..595613d56dd 100644 --- a/cvat-ui/src/components/annotation-page/canvas/canvas-wrapper.tsx +++ b/cvat-ui/src/components/annotation-page/canvas/canvas-wrapper.tsx @@ -18,6 +18,7 @@ import getCore from 'cvat-core-wrapper'; import consts from 'consts'; import CVATTooltip from 'components/common/cvat-tooltip'; import ImageSetupsContent from './image-setups-content'; +import ContextImage from '../standard-workspace/context-image/context-image'; const cvat = getCore(); @@ -773,12 +774,12 @@ export default class CanvasWrapperComponent extends React.PureComponent { maxZLayer, curZLayer, minZLayer, - onSwitchZLayer, - onAddZLayer, keyMap, switchableAutomaticBordering, automaticBordering, onSwitchAutomaticBordering, + onSwitchZLayer, + onAddZLayer, } = this.props; const preventDefault = (event: KeyboardEvent | undefined): void => { @@ -817,6 +818,8 @@ export default class CanvasWrapperComponent extends React.PureComponent { }} /> + + }> diff --git a/cvat-ui/src/components/annotation-page/canvas/canvas-wrapper3D.tsx b/cvat-ui/src/components/annotation-page/canvas/canvas-wrapper3D.tsx index 654cbb13496..823a62fa5ee 100644 --- a/cvat-ui/src/components/annotation-page/canvas/canvas-wrapper3D.tsx +++ b/cvat-ui/src/components/annotation-page/canvas/canvas-wrapper3D.tsx @@ -14,20 +14,16 @@ import { Workspace } from 'reducers/interfaces'; import { CAMERA_ACTION, Canvas3d, MouseInteraction, ViewType, } from 'cvat-canvas3d-wrapper'; -import ContextImage from '../standard3D-workspace/context-image/context-image'; -import CVATTooltip from '../../common/cvat-tooltip'; +import ContextImage from 'components/annotation-page/standard-workspace/context-image/context-image'; +import CVATTooltip from 'components/common/cvat-tooltip'; interface Props { canvasInstance: Canvas3d; jobInstance: any; frameData: any; curZLayer: number; - contextImageHide: boolean; - loaded: boolean; - data: string; annotations: any[]; onSetupCanvas: () => void; - getContextImage(): void; onResetCanvas(): void; workspace: Workspace; animateID: any; @@ -119,9 +115,7 @@ const CanvasWrapperComponent = (props: Props): ReactElement => { const sideView = useRef(null); const frontView = useRef(null); - const { - frameData, contextImageHide, getContextImage, loaded, data, annotations, curZLayer, - } = props; + const { frameData, annotations, curZLayer } = props; const onCanvasSetup = (): void => { const { onSetupCanvas } = props; @@ -345,13 +339,7 @@ const CanvasWrapperComponent = (props: Props): ReactElement => { return ( - + state.annotation.player.frame); + const { data: contextImageData, hidden: contextImageHidden, fetching: contextImageFetching } = useSelector( + (state: CombinedState) => state.annotation.player.contextImage, + ); + const [requested, setRequested] = useState(false); + + useEffect(() => { + if (requested) { + setRequested(false); + } + }, [frame]); + + useEffect(() => { + if (hasRelatedContext && !contextImageHidden && !requested) { + dispatch(getContextImage()); + setRequested(true); + } + }, [contextImageHidden, requested, hasRelatedContext]); + + if (!hasRelatedContext) { + return null; + } + + return ( +
+
+ {contextImageFetching ? : null} + {contextImageHidden ? ( + + dispatch(hideShowContextImage(false))} + /> + + ) : ( + <> + dispatch(hideShowContextImage(true))} + /> + { + notification.error({ + message: 'Could not display context image', + description: `Source is ${ + contextImageData === null ? 'empty' : contextImageData.slice(0, 100) + }`, + }); + }} + className='cvat-context-image' + /> + + )} +
+ ); +} diff --git a/cvat-ui/src/components/annotation-page/standard-workspace/controls-side-bar/control-visibility-observer.tsx b/cvat-ui/src/components/annotation-page/standard-workspace/controls-side-bar/control-visibility-observer.tsx index c900c306666..54e99d0438c 100644 --- a/cvat-ui/src/components/annotation-page/standard-workspace/controls-side-bar/control-visibility-observer.tsx +++ b/cvat-ui/src/components/annotation-page/standard-workspace/controls-side-bar/control-visibility-observer.tsx @@ -41,7 +41,7 @@ export function ExtraControlsControl(): JSX.Element { > ); diff --git a/cvat-ui/src/components/annotation-page/standard-workspace/styles.scss b/cvat-ui/src/components/annotation-page/standard-workspace/styles.scss index 81c60a53fde..86e819ffa4f 100644 --- a/cvat-ui/src/components/annotation-page/standard-workspace/styles.scss +++ b/cvat-ui/src/components/annotation-page/standard-workspace/styles.scss @@ -8,6 +8,55 @@ height: 100%; } +.cvat-context-image-wrapper { + height: auto; + width: $grid-unit-size * 32; + position: absolute; + top: $grid-unit-size; + right: $grid-unit-size; + z-index: 100; + background: black; + display: flex; + flex-direction: column; + justify-content: space-between; + user-select: none; + + > .cvat-context-image-wrapper-header { + height: $grid-unit-size * 4; + width: 100%; + z-index: 101; + background: rgba(0, 0, 0, 0.2); + position: absolute; + top: 0; + left: 0; + } + + > .ant-image { + margin: $grid-unit-size / 2; + } + + > span { + position: absolute; + font-size: 18px; + top: 7px; + right: 7px; + z-index: 102; + color: white; + + &:hover { + > svg { + transform: scale(1.2); + } + } + } +} + +.cvat-context-image { + width: 100%; + height: auto; + display: block; +} + .cvat-objects-sidebar-sider { top: 0; right: 0; @@ -56,8 +105,7 @@ .cvat-issue-control, .cvat-tools-control, .cvat-extra-controls-control, -.cvat-opencv-control, -.cvat-context-image-control { +.cvat-opencv-control { border-radius: 3.3px; transform: scale(0.65); padding: 2px; @@ -76,7 +124,7 @@ } } -.cvat-extra-controls-control { +.cvat-antd-icon-control { > svg { width: 40px; height: 40px; diff --git a/cvat-ui/src/components/annotation-page/standard3D-workspace/context-image/context-image.tsx b/cvat-ui/src/components/annotation-page/standard3D-workspace/context-image/context-image.tsx deleted file mode 100644 index cdb114d728b..00000000000 --- a/cvat-ui/src/components/annotation-page/standard3D-workspace/context-image/context-image.tsx +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (C) 2021 Intel Corporation -// -// SPDX-License-Identifier: MIT - -import React, { useEffect } from 'react'; - -interface Props { - frame: number; - contextImageHide: boolean; - loaded: boolean; - data: string; - getContextImage(): void; -} - -export default function ContextImage(props: Props): JSX.Element { - const { - contextImageHide, loaded, data, getContextImage, - } = props; - - useEffect(() => { - if (!contextImageHide && !loaded) { - getContextImage(); - } - }, [contextImageHide, loaded]); - - if (!contextImageHide && data !== '') { - return ( -
- Context not available -
- ); - } - return null; -} diff --git a/cvat-ui/src/components/annotation-page/standard3D-workspace/controls-side-bar/controls-side-bar.tsx b/cvat-ui/src/components/annotation-page/standard3D-workspace/controls-side-bar/controls-side-bar.tsx index 304f8ebbbbf..985bc66927c 100644 --- a/cvat-ui/src/components/annotation-page/standard3D-workspace/controls-side-bar/controls-side-bar.tsx +++ b/cvat-ui/src/components/annotation-page/standard3D-workspace/controls-side-bar/controls-side-bar.tsx @@ -9,20 +9,15 @@ import { Canvas3d as Canvas } from 'cvat-canvas3d-wrapper'; import CursorControl from './cursor-control'; import MoveControl from './move-control'; import DrawCuboidControl from './draw-cuboid-control'; -import PhotoContextControl from './photo-context'; interface Props { canvasInstance: Canvas; activeControl: ActiveControl; normalizedKeyMap: Record; - contextImageHide: boolean; - hideShowContextImage: (hidden: boolean) => void; } export default function ControlsSideBarComponent(props: Props): JSX.Element { - const { - canvasInstance, activeControl, normalizedKeyMap, contextImageHide, hideShowContextImage, - } = props; + const { canvasInstance, activeControl, normalizedKeyMap } = props; return ( @@ -37,12 +32,6 @@ export default function ControlsSideBarComponent(props: Props): JSX.Element { canvasInstance={canvasInstance} isDrawing={activeControl === ActiveControl.DRAW_CUBOID} /> - ); } diff --git a/cvat-ui/src/components/annotation-page/standard3D-workspace/controls-side-bar/photo-context.tsx b/cvat-ui/src/components/annotation-page/standard3D-workspace/controls-side-bar/photo-context.tsx deleted file mode 100644 index 3a7f1c6c5f2..00000000000 --- a/cvat-ui/src/components/annotation-page/standard3D-workspace/controls-side-bar/photo-context.tsx +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (C) 2021 Intel Corporation -// -// SPDX-License-Identifier: MIT - -import React from 'react'; -import CameraIcon from '@ant-design/icons/CameraOutlined'; - -import CVATTooltip from 'components/common/cvat-tooltip'; -import { Canvas3d as Canvas } from 'cvat-canvas3d-wrapper'; -import { ActiveControl } from 'reducers/interfaces'; - -interface Props { - canvasInstance: Canvas; - activeControl: ActiveControl; - hideShowContextImage: (hidden: boolean) => void; - contextImageHide: boolean; -} - -function PhotoContextControl(props: Props): JSX.Element { - const { activeControl, contextImageHide, hideShowContextImage } = props; - - return ( - - { - hideShowContextImage(!contextImageHide); - }} - /> - - ); -} - -export default React.memo(PhotoContextControl); diff --git a/cvat-ui/src/components/annotation-page/standard3D-workspace/styles.scss b/cvat-ui/src/components/annotation-page/standard3D-workspace/styles.scss index ad321301bf7..f58af1d2bc9 100644 --- a/cvat-ui/src/components/annotation-page/standard3D-workspace/styles.scss +++ b/cvat-ui/src/components/annotation-page/standard3D-workspace/styles.scss @@ -4,173 +4,12 @@ @import 'base.scss'; -.cvat-standard-workspace.ant-layout { - height: 100%; -} - -.cvat-contextImage { - width: $grid-unit-size * 32; - position: absolute; - background: $border-color-3; - top: $grid-unit-size; - right: $grid-unit-size; - z-index: 100; - border-radius: $grid-unit-size; - border: 1px solid $border-color-3; - display: flex; - flex-direction: column; - justify-content: space-between; - padding: $grid-unit-size/2; -} - -.cvat-contextImage-show { - max-width: 100%; - max-height: 100%; -} - -.cvat-contextImage-loading { - text-align: center; -} - -.cvat-objects-sidebar-filter-input { - width: calc(100% - 35px); -} - -.cvat-objects-sidebar-sider { - top: 0; - right: 0; - left: auto; - background-color: $background-color-2; - border-left: 1px solid $border-color-1; - border-bottom: 1px solid $border-color-1; - border-radius: $grid-unit-size/2 0 0 $grid-unit-size/2; - z-index: 2; -} - -.cvat-objects-sidebar { - height: 100%; -} - -.cvat-rotate-canvas-controls-right > svg { - transform: scaleX(-1); -} - -.cvat-canvas-controls-sidebar { - background-color: $background-color-2; - border-right: 1px solid $border-color-1; - - > div { - > i { - border-radius: 3.3px; - transform: scale(0.65); - padding: $grid-unit-size/4; - - &:hover { - background: $header-color; - transform: scale(0.75); - } - - &:active { - transform: scale(0.65); - } - - > svg { - transform: scale(0.8); - } - } - } -} - -.cvat-active-canvas-control { - background: $header-color; - transform: scale(0.75); -} - -.cvat-rotate-canvas-controls-left, -.cvat-rotate-canvas-controls-right { - transform: scale(0.65); - border-radius: $grid-unit-size/2; - - &:hover { - transform: scale(0.75); - } - - &:active { - transform: scale(0.65); - } -} - -.cvat-rotate-canvas-controls > .ant-popover-content > .ant-popover-inner > div > .ant-popover-inner-content { - padding: 0; -} - -.cvat-draw-shape-popover, -.cvat-tools-control-popover { - > .ant-popover-content > .ant-popover-inner > div > .ant-popover-inner-content { - padding: 0; - } -} - -.cvat-tools-track-button, -.cvat-tools-interact-button { - width: 100%; - margin-top: $grid-unit-size; -} - -.cvat-draw-shape-popover-points-selector { - width: 100%; -} - -.cvat-tools-control-popover-content { - width: fit-content; - padding: $grid-unit-size; - border-radius: $grid-unit-size/2; - background: $background-color-2; -} - -.cvat-draw-shape-popover-content { - padding: $grid-unit-size; - border-radius: $grid-unit-size/2; - background: $background-color-2; - width: 270px; - - > div { - margin-top: $grid-unit-size/2; - } - - > div:nth-child(3) > div > div { - width: 100%; - } - - > div:last-child { - span { - width: 100%; - } - - button { - width: 100%; - - &:nth-child(1) { - border-radius: $grid-unit-size/2 0 0 $grid-unit-size/2; - } - - &:nth-child(2) { - border-radius: 0 $grid-unit-size/2 $grid-unit-size/2 0; - } - } - } -} - .cvat-canvas-container-overflow { overflow: hidden; width: 100%; height: 100%; } -.cvat-control-side-bar-icon-size { - font-size: $grid-unit-size * 5; -} - .cvat-canvas3d-perspective { height: 100%; width: 100%; diff --git a/cvat-ui/src/components/annotation-page/top-bar/top-bar.tsx b/cvat-ui/src/components/annotation-page/top-bar/top-bar.tsx index cae83c7c39d..d64c338a2e0 100644 --- a/cvat-ui/src/components/annotation-page/top-bar/top-bar.tsx +++ b/cvat-ui/src/components/annotation-page/top-bar/top-bar.tsx @@ -57,7 +57,6 @@ interface Props { onUndoClick(): void; onRedoClick(): void; jobInstance: any; - hideShowContextImage(): any; } export default function AnnotationTopBarComponent(props: Props): JSX.Element { diff --git a/cvat-ui/src/containers/annotation-page/canvas/canvas-wrapper3D.tsx b/cvat-ui/src/containers/annotation-page/canvas/canvas-wrapper3D.tsx index f65bd054047..bcb328ad6e9 100644 --- a/cvat-ui/src/containers/annotation-page/canvas/canvas-wrapper3D.tsx +++ b/cvat-ui/src/containers/annotation-page/canvas/canvas-wrapper3D.tsx @@ -5,7 +5,7 @@ import { connect } from 'react-redux'; import CanvasWrapperComponent from 'components/annotation-page/canvas/canvas-wrapper3D'; -import { confirmCanvasReady, getContextImage, resetCanvas } from 'actions/annotation-actions'; +import { confirmCanvasReady, resetCanvas } from 'actions/annotation-actions'; import { CombinedState } from 'reducers/interfaces'; @@ -16,15 +16,11 @@ interface StateToProps { jobInstance: any; frameData: any; curZLayer: number; - contextImageHide: boolean; - loaded: boolean; - data: string; annotations: any[]; } interface DispatchToProps { onSetupCanvas(): void; - getContextImage(): void; onResetCanvas(): void; } @@ -35,7 +31,6 @@ function mapStateToProps(state: CombinedState): StateToProps { job: { instance: jobInstance }, player: { frame: { data: frameData }, - contextImage: { hidden: contextImageHide, data, loaded }, }, annotations: { states: annotations, @@ -49,9 +44,6 @@ function mapStateToProps(state: CombinedState): StateToProps { jobInstance, frameData, curZLayer, - contextImageHide, - loaded, - data, annotations, }; } @@ -61,9 +53,6 @@ function mapDispatchToProps(dispatch: any): DispatchToProps { onSetupCanvas(): void { dispatch(confirmCanvasReady()); }, - getContextImage(): void { - dispatch(getContextImage()); - }, onResetCanvas(): void { dispatch(resetCanvas()); }, diff --git a/cvat-ui/src/containers/annotation-page/standard3D-workspace/controls-side-bar/controls-side-bar.tsx b/cvat-ui/src/containers/annotation-page/standard3D-workspace/controls-side-bar/controls-side-bar.tsx index 59d6b7d2b2b..a54c496a953 100644 --- a/cvat-ui/src/containers/annotation-page/standard3D-workspace/controls-side-bar/controls-side-bar.tsx +++ b/cvat-ui/src/containers/annotation-page/standard3D-workspace/controls-side-bar/controls-side-bar.tsx @@ -2,11 +2,10 @@ // // SPDX-License-Identifier: MIT -import { KeyMap } from 'utils/mousetrap-react'; import { connect } from 'react-redux'; +import { KeyMap } from 'utils/mousetrap-react'; import { Canvas } from 'cvat-canvas-wrapper'; -import { hideShowContextImage } from 'actions/annotation-actions'; import ControlsSideBarComponent from 'components/annotation-page/standard3D-workspace/controls-side-bar/controls-side-bar'; import { ActiveControl, CombinedState } from 'reducers/interfaces'; @@ -15,21 +14,13 @@ interface StateToProps { activeControl: ActiveControl; keyMap: KeyMap; normalizedKeyMap: Record; - contextImageHide: boolean; loaded: boolean; } -interface DispatchToProps { - hideShowContextImage(hidden: boolean): void; -} - function mapStateToProps(state: CombinedState): StateToProps { const { annotation: { canvas: { instance: canvasInstance, activeControl }, - player: { - contextImage: { hidden: contextImageHide, loaded }, - }, }, shortcuts: { keyMap, normalizedKeyMap }, } = state; @@ -39,17 +30,7 @@ function mapStateToProps(state: CombinedState): StateToProps { activeControl, normalizedKeyMap, keyMap, - contextImageHide, - loaded, - }; -} - -function dispatchToProps(dispatch: any): DispatchToProps { - return { - hideShowContextImage(hidden: boolean): void { - dispatch(hideShowContextImage(hidden)); - }, }; } -export default connect(mapStateToProps, dispatchToProps)(ControlsSideBarComponent); +export default connect(mapStateToProps)(ControlsSideBarComponent); diff --git a/cvat-ui/src/reducers/annotation-reducer.ts b/cvat-ui/src/reducers/annotation-reducer.ts index 22426c4f2d7..927845db45f 100644 --- a/cvat-ui/src/reducers/annotation-reducer.ts +++ b/cvat-ui/src/reducers/annotation-reducer.ts @@ -51,6 +51,7 @@ const defaultState: AnnotationState = { number: 0, filename: '', data: null, + hasRelatedContext: false, fetching: false, delay: 0, changeTime: null, @@ -58,8 +59,8 @@ const defaultState: AnnotationState = { playing: false, frameAngles: [], contextImage: { - loaded: false, - data: '', + fetching: false, + data: null, hidden: false, }, }, @@ -145,6 +146,7 @@ export default (state = defaultState, action: AnyAction): AnnotationState => { openTime, frameNumber: number, frameFilename: filename, + frameHasRelatedContext, colors, filters, frameData: data, @@ -189,6 +191,7 @@ export default (state = defaultState, action: AnyAction): AnnotationState => { frame: { ...state.player.frame, filename, + hasRelatedContext: frameHasRelatedContext, number, data, }, @@ -226,11 +229,6 @@ export default (state = defaultState, action: AnyAction): AnnotationState => { ...state.player.frame, fetching: false, }, - contextImage: { - loaded: false, - data: '', - hidden: state.player.contextImage.hidden, - }, }, }; } @@ -252,7 +250,16 @@ export default (state = defaultState, action: AnyAction): AnnotationState => { } case AnnotationActionTypes.CHANGE_FRAME_SUCCESS: { const { - number, data, filename, states, minZ, maxZ, curZ, delay, changeTime, + number, + data, + filename, + hasRelatedContext, + states, + minZ, + maxZ, + curZ, + delay, + changeTime, } = action.payload; const activatedStateID = states @@ -268,6 +275,7 @@ export default (state = defaultState, action: AnyAction): AnnotationState => { frame: { data, filename, + hasRelatedContext, number, fetching: false, changeTime, @@ -275,7 +283,7 @@ export default (state = defaultState, action: AnyAction): AnnotationState => { }, contextImage: { ...state.player.contextImage, - loaded: false, + data: null, }, }, annotations: { @@ -1170,30 +1178,52 @@ export default (state = defaultState, action: AnyAction): AnnotationState => { } case AnnotationActionTypes.HIDE_SHOW_CONTEXT_IMAGE: { const { hidden } = action.payload; - const { loaded, data } = state.player.contextImage; return { ...state, player: { ...state.player, contextImage: { - loaded, - data, + ...state.player.contextImage, hidden, }, }, }; } case AnnotationActionTypes.GET_CONTEXT_IMAGE: { - const { context, loaded } = action.payload; + return { + ...state, + player: { + ...state.player, + contextImage: { + ...state.player.contextImage, + fetching: true, + }, + }, + }; + } + case AnnotationActionTypes.GET_CONTEXT_IMAGE_SUCCESS: { + const { contextImageData } = action.payload; return { ...state, player: { ...state.player, contextImage: { - loaded, - data: context, - hidden: state.player.contextImage.hidden, + ...state.player.contextImage, + fetching: false, + data: contextImageData, + }, + }, + }; + } + case AnnotationActionTypes.GET_CONTEXT_IMAGE_FAILED: { + return { + ...state, + player: { + ...state.player, + contextImage: { + ...state.player.contextImage, + fetching: false, }, }, }; diff --git a/cvat-ui/src/reducers/interfaces.ts b/cvat-ui/src/reducers/interfaces.ts index 4ddeb301135..2f067ecae8c 100644 --- a/cvat-ui/src/reducers/interfaces.ts +++ b/cvat-ui/src/reducers/interfaces.ts @@ -269,6 +269,7 @@ export interface NotificationsState { saving: null | ErrorState; jobFetching: null | ErrorState; frameFetching: null | ErrorState; + contextImageFetching: null | ErrorState; changingLabelColor: null | ErrorState; updating: null | ErrorState; creating: null | ErrorState; @@ -417,6 +418,7 @@ export interface AnnotationState { frame: { number: number; filename: string; + hasRelatedContext: boolean; data: any | null; fetching: boolean; delay: number; @@ -425,8 +427,8 @@ export interface AnnotationState { playing: boolean; frameAngles: number[]; contextImage: { - loaded: boolean; - data: string; + fetching: boolean; + data: string | null; hidden: boolean; }; }; diff --git a/cvat-ui/src/reducers/notifications-reducer.ts b/cvat-ui/src/reducers/notifications-reducer.ts index 497117be072..ae424729391 100644 --- a/cvat-ui/src/reducers/notifications-reducer.ts +++ b/cvat-ui/src/reducers/notifications-reducer.ts @@ -69,6 +69,7 @@ const defaultState: NotificationsState = { saving: null, jobFetching: null, frameFetching: null, + contextImageFetching: null, changingLabelColor: null, updating: null, creating: null, @@ -689,6 +690,21 @@ export default function (state = defaultState, action: AnyAction): Notifications }, }; } + case AnnotationActionTypes.GET_CONTEXT_IMAGE_FAILED: { + return { + ...state, + errors: { + ...state.errors, + annotation: { + ...state.errors.annotation, + contextImageFetching: { + message: 'Could not fetch context image from the server', + reason: action.payload.error, + }, + }, + }, + }; + } case AnnotationActionTypes.SAVE_ANNOTATIONS_FAILED: { return { ...state, diff --git a/cvat/apps/engine/media_extractors.py b/cvat/apps/engine/media_extractors.py index dda3956e5b7..ffa58deb2de 100644 --- a/cvat/apps/engine/media_extractors.py +++ b/cvat/apps/engine/media_extractors.py @@ -9,7 +9,6 @@ import io import itertools import struct -import re from abc import ABC, abstractmethod from contextlib import closing @@ -112,6 +111,10 @@ def __iter__(self): for i in range(self._start, self._stop, self._step): yield (self.get_image(i), self.get_path(i), i) + def filter(self, callback): + source_path = list(filter(callback, self._source_path)) + ImageListReader.__init__(self, source_path, step=self._step, start=self._start, stop=self._stop) + def get_path(self, i): return self._source_path[i] @@ -199,7 +202,7 @@ def __init__(self, source_path, step=1, start=0, stop=None): self._zip_source = zipfile.ZipFile(source_path[0], mode='a') self.extract_dir = source_path[1] if len(source_path) > 1 else None file_list = [f for f in self._zip_source.namelist() if files_to_ignore(f) and get_mime(f) == 'image'] - super().__init__(file_list, step, start, stop) + super().__init__(file_list, step=step, start=start, stop=stop) def __del__(self): self._zip_source.close() @@ -759,66 +762,6 @@ def process_files(self, root, actual_path, files): self.image_files[file_name] = file_path return pcd_files - def validate_velodyne_points(self, *args): - root, actual_path, files = args - velodyne_files = self.process_files(root, actual_path, files) - related_path = os.path.split(os.path.split(root)[0])[0] - - path_list = [re.search(r'image_\d.*', path, re.IGNORECASE) for path in os.listdir(related_path) if - os.path.isdir(os.path.join(related_path, path))] - - for path_ in path_list: - if path_: - path = os.path.join(path_.group(), "data") - path = os.path.abspath(os.path.join(related_path, path)) - - files = [file for file in os.listdir(path) if - os.path.isfile(os.path.abspath(os.path.join(path, file)))] - for file in files: - - f_name = file.split(".")[0] - if velodyne_files.get(f_name, None): - self.related_files[velodyne_files[f_name]].append( - os.path.abspath(os.path.join(path, file))) - - def validate_pointcloud(self, *args): - root, actual_path, files = args - pointcloud_files = self.process_files(root, actual_path, files) - related_path = root.rsplit("/pointcloud", 1)[0] - related_images_path = os.path.join(related_path, "related_images") - - if os.path.isdir(related_images_path): - paths = [path for path in os.listdir(related_images_path) if - os.path.isdir(os.path.abspath(os.path.join(related_images_path, path)))] - - for k in pointcloud_files: - for path in paths: - - if k == path.rsplit("_", 1)[0]: - file_path = os.path.abspath(os.path.join(related_images_path, path)) - files = [file for file in os.listdir(file_path) if - os.path.isfile(os.path.join(file_path, file))] - for related_image in files: - self.related_files[pointcloud_files[k]].append(os.path.join(file_path, related_image)) - - def validate_default(self, *args): - root, actual_path, files = args - pcd_files = self.process_files(root, actual_path, files) - if len(list(pcd_files.keys())): - - for image in self.image_files.keys(): - if pcd_files.get(image, None): - self.related_files[pcd_files[image]].append(self.image_files[image]) - - current_directory_name = os.path.split(root) - - if len(pcd_files.keys()) == 1: - pcd_name = list(pcd_files.keys())[0].rsplit(".", 1)[0] - if current_directory_name[1] == pcd_name: - for related_image in self.image_files.values(): - if root == os.path.split(related_image)[0]: - self.related_files[pcd_files[pcd_name]].append(related_image) - def validate(self): """ Validate the directory structure for kitty and point cloud format. @@ -830,15 +773,7 @@ def validate(self): if not files_to_ignore(root): continue - if root.endswith("data"): - if os.path.split(os.path.split(root)[0])[1] == "velodyne_points": - self.validate_velodyne_points(root, actual_path, files) - - elif os.path.split(root)[-1] == "pointcloud": - self.validate_pointcloud(root, actual_path, files) - - else: - self.validate_default(root, actual_path, files) + self.process_files(root, actual_path, files) if len(self.related_files.keys()): self.dimension = DimensionType.DIM_3D diff --git a/cvat/apps/engine/serializers.py b/cvat/apps/engine/serializers.py index dfbe4fa6280..6e0cacc8dd0 100644 --- a/cvat/apps/engine/serializers.py +++ b/cvat/apps/engine/serializers.py @@ -545,6 +545,7 @@ class FrameMetaSerializer(serializers.Serializer): width = serializers.IntegerField() height = serializers.IntegerField() name = serializers.CharField(max_length=1024) + has_related_context = serializers.BooleanField() class PluginsSerializer(serializers.Serializer): GIT_INTEGRATION = serializers.BooleanField() diff --git a/cvat/apps/engine/task.py b/cvat/apps/engine/task.py index e24865c7369..656c3527fce 100644 --- a/cvat/apps/engine/task.py +++ b/cvat/apps/engine/task.py @@ -7,6 +7,7 @@ import os import sys import rq +import re import shutil from traceback import print_exception from urllib import parse as urlparse @@ -19,6 +20,7 @@ from cvat.apps.engine.models import DimensionType from utils.dataset_manifest import ImageManifestManager, VideoManifestManager from utils.dataset_manifest.core import VideoManifestValidator +from utils.dataset_manifest.utils import detect_related_images import django_rq from django.conf import settings @@ -273,10 +275,14 @@ def _create_thread(tid, data): start=db_data.start_frame, stop=data['stop_frame'], dimension=DimensionType.DIM_3D, - ) extractor.add_files(validate_dimension.converted_files) + related_images = {} + if isinstance(extractor, MEDIA_TYPES['image']['extractor']): + extractor.filter(lambda x: not re.search(r'(^|{0})related_images{0}'.format(os.sep), x)) + related_images = detect_related_images(extractor.absolute_source_paths, upload_dir) + db_task.mode = task_mode db_data.compressed_chunk_type = models.DataChoice.VIDEO if task_mode == 'interpolation' and not data['use_zip_chunks'] else models.DataChoice.IMAGESET db_data.original_chunk_type = models.DataChoice.VIDEO if task_mode == 'interpolation' else models.DataChoice.IMAGESET @@ -394,13 +400,14 @@ def _update_status(msg): base_msg = str(ex) if isinstance(ex, AssertionError) \ else "Uploaded video does not support a quick way of task creating." _update_status("{} The task will be created using the old method".format(base_msg)) - else:# images, archive, pdf + else: # images, archive, pdf db_data.size = len(extractor) manifest = ImageManifestManager(db_data.get_manifest_path()) if not manifest_file: if db_task.dimension == DimensionType.DIM_2D: meta_info = manifest.prepare_meta( sources=extractor.absolute_source_paths, + meta={ k: {'related_images': related_images[k] } for k in related_images }, data_dir=upload_dir ) content = meta_info.content @@ -410,6 +417,7 @@ def _update_status(msg): name, ext = os.path.splitext(os.path.relpath(source, upload_dir)) content.append({ 'name': name, + 'meta': { 'related_images': related_images[''.join((name, ext))] }, 'extension': ext }) manifest.create(content) @@ -465,27 +473,15 @@ def _update_status(msg): update_progress(progress) if db_task.mode == 'annotation': - if validate_dimension.dimension == DimensionType.DIM_2D: - models.Image.objects.bulk_create(db_images) - else: - related_file = [] - for image_data in db_images: - image_model = models.Image( - data=image_data.data, - path=image_data.path, - frame=image_data.frame, - width=image_data.width, - height=image_data.height - ) - - image_model.save() - image_data = models.Image.objects.get(id=image_model.id) - - if validate_dimension.related_files.get(image_data.path, None): - for related_image_file in validate_dimension.related_files[image_data.path]: - related_file.append( - RelatedFile(data=db_data, primary_image_id=image_data.id, path=related_image_file)) - RelatedFile.objects.bulk_create(related_file) + models.Image.objects.bulk_create(db_images) + created_images = models.Image.objects.filter(data_id=db_data.id) + + db_related_files = [ + RelatedFile(data=image.data, primary_image=image, path=os.path.join(upload_dir, related_file_path)) + for image in created_images + for related_file_path in related_images.get(image.path, []) + ] + RelatedFile.objects.bulk_create(db_related_files) db_images = [] else: models.Video.objects.create( diff --git a/cvat/apps/engine/views.py b/cvat/apps/engine/views.py index 89751952066..db79c232444 100644 --- a/cvat/apps/engine/views.py +++ b/cvat/apps/engine/views.py @@ -42,7 +42,7 @@ from cvat.apps.engine.frame_provider import FrameProvider from cvat.apps.engine.models import ( Job, StatusChoice, Task, Project, Review, Issue, - Comment, StorageMethodChoice, ReviewStatus, StorageChoice, DimensionType, Image + Comment, StorageMethodChoice, ReviewStatus, StorageChoice, Image ) from cvat.apps.engine.serializers import ( AboutSerializer, AnnotationFileSerializer, BasicUserSerializer, @@ -487,21 +487,17 @@ def data(self, request, pk): return sendfile(request, frame_provider.get_preview()) elif data_type == 'context_image': - if db_task.dimension == DimensionType.DIM_3D: - data_id = int(data_id) - image = Image.objects.get(data_id=db_task.data_id, frame=data_id) - for i in image.related_files.all(): - path = os.path.realpath(str(i.path)) - image = cv2.imread(path) - success, result = cv2.imencode('.JPEG', image) - if not success: - raise Exception("Failed to encode image to '%s' format" % (".jpeg")) - return HttpResponse(io.BytesIO(result.tobytes()), content_type="image/jpeg") - return Response(data='No context image related to the frame', - status=status.HTTP_404_NOT_FOUND) - else: - return Response(data='Only 3D tasks support context images', - status=status.HTTP_400_BAD_REQUEST) + data_id = int(data_id) + image = Image.objects.get(data_id=db_data.id, frame=data_id) + for i in image.related_files.all(): + path = os.path.realpath(str(i.path)) + image = cv2.imread(path) + success, result = cv2.imencode('.JPEG', image) + if not success: + raise Exception('Failed to encode image to ".jpeg" format') + return HttpResponse(io.BytesIO(result.tobytes()), content_type='image/jpeg') + return Response(data='No context image related to the frame', + status=status.HTTP_404_NOT_FOUND) else: return Response(data='unknown data type {}.'.format(data_type), status=status.HTTP_400_BAD_REQUEST) except APIException as e: @@ -636,7 +632,7 @@ def _get_rq_response(queue, job_id): @action(detail=True, methods=['GET'], serializer_class=DataMetaSerializer, url_path='data/meta') def data_info(request, pk): - db_task = models.Task.objects.prefetch_related('data__images').select_related('data__video').get(pk=pk) + db_task = models.Task.objects.prefetch_related('data__images__related_files').select_related('data__video').get(pk=pk) if hasattr(db_task.data, 'video'): media = [db_task.data.video] @@ -647,6 +643,7 @@ def data_info(request, pk): 'width': item.width, 'height': item.height, 'name': item.path, + 'has_related_context': hasattr(item, 'related_files') and bool(len(item.related_files.all())) } for item in media] db_data = db_task.data diff --git a/tests/cypress/integration/canvas3d_functionality/case_56_canvas3d_functionality_basic_actions.js b/tests/cypress/integration/canvas3d_functionality/case_56_canvas3d_functionality_basic_actions.js index ef0584318dc..7bb279711f4 100644 --- a/tests/cypress/integration/canvas3d_functionality/case_56_canvas3d_functionality_basic_actions.js +++ b/tests/cypress/integration/canvas3d_functionality/case_56_canvas3d_functionality_basic_actions.js @@ -57,10 +57,10 @@ context('Canvas 3D functionality. Basic actions.', () => { } function testContextImage() { - cy.get('.cvat-contextImage-show').should('exist').and('be.visible'); - cy.get('[data-icon="camera"]').click(); // Context image hide - cy.get('.cvat-contextImage-show').should('not.exist'); - cy.get('[data-icon="camera"]').click(); // Context image show + cy.get('.cvat-context-image-wrapper img').should('exist').and('be.visible'); + cy.get('.cvat-context-image-switcher').click(); // Context image hide + cy.get('.cvat-context-image-wrapper img').should('not.exist'); + cy.get('.cvat-context-image-switcher').click(); // Context image show } function testControlButtonTooltip(button, expectedTooltipText) { @@ -104,9 +104,11 @@ context('Canvas 3D functionality. Basic actions.', () => { cy.get('.cvat-canvas3d-topview').should('exist').and('be.visible'); cy.get('.cvat-canvas3d-sideview').should('exist').and('be.visible'); cy.get('.cvat-canvas3d-frontview').should('exist').and('be.visible'); - cy.get('.cvat-canvas-controls-sidebar').find('[role="img"]').then(($controlButtons) => { - expect($controlButtons.length).to.be.equal(4); - }); + cy.get('.cvat-canvas-controls-sidebar') + .find('[role="img"]') + .then(($controlButtons) => { + expect($controlButtons.length).to.be.equal(3); + }); cy.get('.cvat-canvas-controls-sidebar') .should('exist') .and('be.visible') @@ -114,12 +116,10 @@ context('Canvas 3D functionality. Basic actions.', () => { cy.get('.cvat-move-control').should('exist').and('be.visible'); cy.get('.cvat-cursor-control').should('exist').and('be.visible'); cy.get('.cvat-draw-cuboid-control').should('exist').and('be.visible'); - cy.get('.cvat-context-image-control').should('exist').and('be.visible'); }); [ ['.cvat-move-control', 'Move the image'], ['.cvat-cursor-control', 'Cursor [Esc]'], - ['.cvat-context-image-control', 'Photo context show/hide'] ].forEach(([button, tooltip]) => { testControlButtonTooltip(button, tooltip); }); diff --git a/tests/cypress/integration/canvas3d_functionality/case_63_canvas3d_functionality_control_button_mouse_interaction.js b/tests/cypress/integration/canvas3d_functionality/case_63_canvas3d_functionality_control_button_mouse_interaction.js index 34c6845d8a5..34ccdde44f0 100644 --- a/tests/cypress/integration/canvas3d_functionality/case_63_canvas3d_functionality_control_button_mouse_interaction.js +++ b/tests/cypress/integration/canvas3d_functionality/case_63_canvas3d_functionality_control_button_mouse_interaction.js @@ -34,7 +34,6 @@ context('Canvas 3D functionality. Control button. Mouse interaction.', () => { before(() => { cy.openTaskJob(taskName); - cy.get('.cvat-contextImage-show').should('be.visible'); }); describe(`Testing case "${caseId}"`, () => { diff --git a/utils/dataset_manifest/core.py b/utils/dataset_manifest/core.py index edb68fb21af..7a82f8eace2 100644 --- a/utils/dataset_manifest/core.py +++ b/utils/dataset_manifest/core.py @@ -145,8 +145,9 @@ def __iter__(self): class DatasetImagesReader: - def __init__(self, sources, is_sorted=True, use_image_hash=False, *args, **kwargs): + def __init__(self, sources, meta=None, is_sorted=True, use_image_hash=False, *args, **kwargs): self._sources = sources if is_sorted else sorted(sources) + self._meta = meta self._content = [] self._data_dir = kwargs.get('data_dir', None) self._use_image_hash = use_image_hash @@ -163,6 +164,8 @@ def __iter__(self): 'width': img.width, 'height': img.height, } + if self._meta and img_name in self._meta: + image_properties['meta'] = self._meta[img_name] if self._use_image_hash: image_properties['checksum'] = md5_hash(img) yield image_properties @@ -177,7 +180,7 @@ def content(self): class _Manifest: FILE_NAME = 'manifest.jsonl' - VERSION = '1.0' + VERSION = '1.1' def __init__(self, path, is_created=False): assert path, 'A path to manifest file not found' diff --git a/utils/dataset_manifest/create.py b/utils/dataset_manifest/create.py index 680052f0cf8..c54b1b5d0da 100644 --- a/utils/dataset_manifest/create.py +++ b/utils/dataset_manifest/create.py @@ -2,21 +2,12 @@ # # SPDX-License-Identifier: MIT import argparse -import mimetypes import os import sys +import re from glob import glob -def _define_data_type(media): - media_type, _ = mimetypes.guess_type(media) - if media_type: - return media_type.split('/')[0] - -def _is_video(media_file): - return _define_data_type(media_file) == 'video' - -def _is_image(media_file): - return _define_data_type(media_file) == 'image' +from utils import detect_related_images, is_image, is_video def get_args(): parser = argparse.ArgumentParser() @@ -33,7 +24,7 @@ def main(): manifest_directory = os.path.abspath(args.output_dir) os.makedirs(manifest_directory, exist_ok=True) - source = os.path.abspath(args.source) + source = os.path.abspath(os.path.expanduser(args.source)) sources = [] if not os.path.isfile(source): # directory/pattern with images @@ -41,7 +32,7 @@ def main(): if os.path.isdir(source): data_dir = source for root, _, files in os.walk(source): - sources.extend([os.path.join(root, f) for f in files if _is_image(f)]) + sources.extend([os.path.join(root, f) for f in files if is_image(f)]) else: items = source.lstrip('/').split('/') position = 0 @@ -56,18 +47,28 @@ def main(): data_dir = source.split(items[position])[0] except Exception as ex: sys.exit(str(ex)) - sources = list(filter(_is_image, glob(source, recursive=True))) + sources = list(filter(is_image, glob(source, recursive=True))) + + sources = list(filter(lambda x: 'related_images{}'.format(os.sep) not in x, sources)) + + # If the source is a glob expression, we need additional processing + abs_root = source + while abs_root and re.search('[*?\[\]]', abs_root): + abs_root = os.path.split(abs_root)[0] + + related_images = detect_related_images(sources, abs_root) + meta = { k: {'related_images': related_images[k] } for k in related_images } try: assert len(sources), 'A images was not found' manifest = ImageManifestManager(manifest_path=manifest_directory) - meta_info = manifest.prepare_meta(sources=sources, is_sorted=False, + meta_info = manifest.prepare_meta(sources=sources, meta=meta, is_sorted=False, use_image_hash=True, data_dir=data_dir) manifest.create(meta_info) except Exception as ex: sys.exit(str(ex)) else: # video try: - assert _is_video(source), 'You can specify a video path or a directory/pattern with images' + assert is_video(source), 'You can specify a video path or a directory/pattern with images' manifest = VideoManifestManager(manifest_path=manifest_directory) try: meta_info = manifest.prepare_meta(media_file=source, force=args.force) diff --git a/utils/dataset_manifest/utils.py b/utils/dataset_manifest/utils.py index c5e9feeac1d..09690add975 100644 --- a/utils/dataset_manifest/utils.py +++ b/utils/dataset_manifest/utils.py @@ -1,7 +1,10 @@ # Copyright (C) 2021 Intel Corporation # # SPDX-License-Identifier: MIT +import os +import re import hashlib +import mimetypes import cv2 as cv from av import VideoFrame @@ -21,4 +24,163 @@ def rotate_image(image, angle): def md5_hash(frame): if isinstance(frame, VideoFrame): frame = frame.to_image() - return hashlib.md5(frame.tobytes()).hexdigest() # nosec \ No newline at end of file + return hashlib.md5(frame.tobytes()).hexdigest() # nosec + +def _define_data_type(media): + return mimetypes.guess_type(media)[0] + +def is_video(media_file): + data_type = _define_data_type(media_file) + return data_type is not None and data_type.startswith('video') + +def is_image(media_file): + data_type = _define_data_type(media_file) + return data_type is not None and data_type.startswith('image') and \ + not data_type.startswith('image/svg') + + +def _list_and_join(root): + files = os.listdir(root) + for f in files: + yield os.path.join(root, f) + +def _prepare_context_list(files, base_dir): + return sorted(map(lambda x: os.path.relpath(x, base_dir), filter(is_image, files))) + +# Expected 2D format is: +# data/ +# 00001.png +# related_images/ +# 00001_png/ +# context_image_1.jpeg +# context_image_2.png +def _detect_related_images_2D(image_paths, root_path): + related_images = {} + latest_dirname = '' + related_images_exist = False + + for image_path in sorted(image_paths): + rel_image_path = os.path.relpath(image_path, root_path) + dirname = os.path.dirname(image_path) + related_images_dirname = os.path.join(dirname, 'related_images') + related_images[rel_image_path] = [] + + if latest_dirname == dirname and not related_images_exist: + continue + elif latest_dirname != dirname: + # Update some data applicable for a subset of paths (within the current dirname) + latest_dirname = dirname + related_images_exist = os.path.isdir(related_images_dirname) + + if related_images_exist: + related_images_dirname = os.path.join( + related_images_dirname, '_'.join(os.path.basename(image_path).rsplit('.', 1)) + ) + + if os.path.isdir(related_images_dirname): + related_images[rel_image_path] = _prepare_context_list(_list_and_join(related_images_dirname), root_path) + return related_images + +# Possible 3D formats are: +# velodyne_points/ +# data/ +# image_01.bin +# IMAGE_00 # any number? +# data/ +# image_01.png + +# pointcloud/ +# 00001.pcd +# related_images/ +# 00001_pcd/ +# image_01.png # or other image + +# Default formats +# Option 1 +# data/ +# image.pcd +# image.png + +# Option 2 +# data/ +# image_1/ +# image_1.pcd +# context_1.png +# context_2.jpg +def _detect_related_images_3D(image_paths, root_path): + related_images = {} + latest_dirname = '' + dirname_files = [] + related_images_exist = False + velodyne_context_images_dirs = [] + + for image_path in sorted(image_paths): + rel_image_path = os.path.relpath(image_path, root_path) + name = os.path.splitext(os.path.basename(image_path))[0] + dirname = os.path.dirname(image_path) + related_images_dirname = os.path.normpath(os.path.join(dirname, '..', 'related_images')) + related_images[rel_image_path] = [] + + if latest_dirname != dirname: + # Update some data applicable for a subset of paths (within the current dirname) + latest_dirname = dirname + related_images_exist = os.path.isdir(related_images_dirname) + dirname_files = list(filter(lambda x: x != image_path, _list_and_join(dirname))) + velodyne_context_images_dirs = [directory for directory + in _list_and_join(os.path.normpath(os.path.join(dirname, '..', '..'))) + if os.path.isdir(os.path.join(directory, 'data')) and re.search(r'image_\d.*', directory, re.IGNORECASE) + ] + + if os.path.basename(dirname) == name: + # default format (option 2) + related_images[rel_image_path].extend(_prepare_context_list(dirname_files, root_path)) + + filtered_dirname_files = list(filter(lambda x: os.path.splitext(os.path.basename(x))[0] == name, dirname_files)) + if len(filtered_dirname_files): + # default format (option 1) + related_images[rel_image_path].extend(_prepare_context_list(filtered_dirname_files, root_path)) + + if related_images_exist: + related_images_dirname = os.path.join( + related_images_dirname, '_'.join(os.path.basename(image_path).rsplit('.', 1)) + ) + if os.path.isdir(related_images_dirname): + related_images[rel_image_path].extend( + _prepare_context_list(_list_and_join(related_images_dirname), root_path) + ) + + if dirname.endswith(os.path.join('velodyne_points', 'data')): + # velodynepoints format + for context_images_dir in velodyne_context_images_dirs: + context_files = _list_and_join(os.path.join(context_images_dir, 'data')) + context_files = list( + filter(lambda x: os.path.splitext(os.path.basename(x))[0] == name, context_files) + ) + related_images[rel_image_path].extend( + _prepare_context_list(context_files, root_path) + ) + + related_images[rel_image_path].sort() + return related_images + +# This function is expected to be called only for images tasks +# image_path is expected to be a list of absolute path to images +# root_path is expected to be a string (dataset root) +def detect_related_images(image_paths, root_path): + data_are_2d = False + data_are_3d = False + + # First of all need to define data type we are working with + for image_path in image_paths: + # .bin files are expected to be converted to .pcd before this code + if os.path.splitext(image_path)[1].lower() == '.pcd': + data_are_3d = True + else: + data_are_2d = True + assert not (data_are_3d and data_are_2d), 'Combined data types 2D and 3D are not supported' + + if data_are_2d: + return _detect_related_images_2D(image_paths, root_path) + elif data_are_3d: + return _detect_related_images_3D(image_paths, root_path) + return {} From e0f10d7b7f67da5283c6e5283d4723d99a2d932a Mon Sep 17 00:00:00 2001 From: Boris Sekachev Date: Wed, 19 May 2021 11:43:22 +0300 Subject: [PATCH 003/123] Support of context images for 2D tasks (Missed commits) (#3213) * Fixed bug with not filtering file itself in some 3D cases * Added else branch to avoid dublication context images in some cases --- utils/dataset_manifest/utils.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/utils/dataset_manifest/utils.py b/utils/dataset_manifest/utils.py index 09690add975..e5987782997 100644 --- a/utils/dataset_manifest/utils.py +++ b/utils/dataset_manifest/utils.py @@ -125,20 +125,23 @@ def _detect_related_images_3D(image_paths, root_path): # Update some data applicable for a subset of paths (within the current dirname) latest_dirname = dirname related_images_exist = os.path.isdir(related_images_dirname) - dirname_files = list(filter(lambda x: x != image_path, _list_and_join(dirname))) + dirname_files = list(_list_and_join(dirname)) velodyne_context_images_dirs = [directory for directory in _list_and_join(os.path.normpath(os.path.join(dirname, '..', '..'))) if os.path.isdir(os.path.join(directory, 'data')) and re.search(r'image_\d.*', directory, re.IGNORECASE) ] - if os.path.basename(dirname) == name: + filtered_dirname_files = list(filter(lambda x: x != image_path, dirname_files)) + if len(filtered_dirname_files) and os.path.basename(dirname) == name: # default format (option 2) - related_images[rel_image_path].extend(_prepare_context_list(dirname_files, root_path)) - - filtered_dirname_files = list(filter(lambda x: os.path.splitext(os.path.basename(x))[0] == name, dirname_files)) - if len(filtered_dirname_files): - # default format (option 1) related_images[rel_image_path].extend(_prepare_context_list(filtered_dirname_files, root_path)) + else: + filtered_dirname_files = list( + filter(lambda x: os.path.splitext(os.path.basename(x))[0] == name, filtered_dirname_files) + ) + if len(filtered_dirname_files): + # default format (option 1) + related_images[rel_image_path].extend(_prepare_context_list(filtered_dirname_files, root_path)) if related_images_exist: related_images_dirname = os.path.join( From a2df499f504b638ed9a582ad68b6e8e7c59b3a98 Mon Sep 17 00:00:00 2001 From: Dmitry Kalinin Date: Thu, 20 May 2021 12:43:59 +0300 Subject: [PATCH 004/123] Task moving between projects (#3164) --- CHANGELOG.md | 1 + cvat-core/package-lock.json | 2 +- cvat-core/package.json | 2 +- cvat-core/src/common.js | 32 +++ cvat-core/src/server-proxy.js | 4 +- cvat-core/src/session.js | 42 ++-- cvat-ui/src/actions/tasks-actions.ts | 44 +++++ cvat-ui/src/base.scss | 1 + .../components/actions-menu/actions-menu.tsx | 2 + .../components/actions-menu/load-submenu.tsx | 7 +- .../attribute-annotation-sidebar.tsx | 2 +- .../create-task-page/project-search-field.tsx | 11 +- .../move-task-modal/label-mapper-item.tsx | 84 ++++++++ .../move-task-modal/move-task-modal.tsx | 163 ++++++++++++++++ .../components/move-task-modal/styles.scss | 34 ++++ .../src/components/task-page/task-page.tsx | 4 +- .../src/components/tasks-page/task-list.tsx | 4 +- .../containers/actions-menu/actions-menu.tsx | 18 +- .../annotation-page/top-bar/top-bar.tsx | 1 + cvat-ui/src/reducers/interfaces.ts | 6 + cvat-ui/src/reducers/notifications-reducer.ts | 34 ++++ cvat-ui/src/reducers/tasks-reducer.ts | 16 +- cvat/apps/engine/serializers.py | 73 ++++++- cvat/apps/engine/tests/test_rest_api.py | 184 ++++++++++++++++++ 24 files changed, 726 insertions(+), 45 deletions(-) create mode 100644 cvat-ui/src/components/move-task-modal/label-mapper-item.tsx create mode 100644 cvat-ui/src/components/move-task-modal/move-task-modal.tsx create mode 100644 cvat-ui/src/components/move-task-modal/styles.scss diff --git a/CHANGELOG.md b/CHANGELOG.md index 65c9ec5f2c2..328e058bef5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,6 +39,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Hotkeys to switch a label of existing object or to change default label (for objects created with N) () - A script to convert some kinds of DICOM files to regular images () - Helm chart prototype () +- Initial implementation of moving tasks between projects () ### Changed diff --git a/cvat-core/package-lock.json b/cvat-core/package-lock.json index 2bdc1118032..776e8b2b84e 100644 --- a/cvat-core/package-lock.json +++ b/cvat-core/package-lock.json @@ -1,6 +1,6 @@ { "name": "cvat-core", - "version": "3.13.0", + "version": "3.12.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/cvat-core/package.json b/cvat-core/package.json index e5e482fde5c..9ed6e5e7cf0 100644 --- a/cvat-core/package.json +++ b/cvat-core/package.json @@ -1,6 +1,6 @@ { "name": "cvat-core", - "version": "3.13.0", + "version": "3.12.3", "description": "Part of Computer Vision Tool which presents an interface for client-side integration", "main": "babel.config.js", "scripts": { diff --git a/cvat-core/src/common.js b/cvat-core/src/common.js index 80134d06f0b..ca30481d790 100644 --- a/cvat-core/src/common.js +++ b/cvat-core/src/common.js @@ -104,6 +104,37 @@ } negativeIDGenerator.start = -1; + class FieldUpdateTrigger { + constructor(initialFields) { + const data = { ...initialFields }; + + Object.defineProperties( + this, + Object.freeze({ + ...Object.assign( + {}, + ...Array.from(Object.keys(data), (key) => ({ + [key]: { + get: () => data[key], + set: (value) => { + data[key] = value; + }, + enumerable: true, + }, + })), + ), + reset: { + value: () => { + Object.keys(data).forEach((key) => { + data[key] = false; + }); + }, + }, + }), + ); + } + } + module.exports = { isBoolean, isInteger, @@ -114,5 +145,6 @@ negativeIDGenerator, checkExclusiveFields, camelToSnake, + FieldUpdateTrigger, }; })(); diff --git a/cvat-core/src/server-proxy.js b/cvat-core/src/server-proxy.js index cf31969a302..d2b63a9b11b 100644 --- a/cvat-core/src/server-proxy.js +++ b/cvat-core/src/server-proxy.js @@ -1082,7 +1082,9 @@ const closureId = Date.now(); predictAnnotations.latestRequest.id = closureId; - const predicate = () => !predictAnnotations.latestRequest.fetching || predictAnnotations.latestRequest.id !== closureId; + const predicate = () => ( + !predictAnnotations.latestRequest.fetching || predictAnnotations.latestRequest.id !== closureId + ); if (predictAnnotations.latestRequest.fetching) { waitFor(5, predicate).then(() => { if (predictAnnotations.latestRequest.id !== closureId) { diff --git a/cvat-core/src/session.js b/cvat-core/src/session.js index daaee04a21a..49dcb565f6f 100644 --- a/cvat-core/src/session.js +++ b/cvat-core/src/session.js @@ -16,6 +16,7 @@ const User = require('./user'); const Issue = require('./issue'); const Review = require('./review'); + const { FieldUpdateTrigger } = require('./common'); function buildDublicatedAPI(prototype) { Object.defineProperties(prototype, { @@ -734,11 +735,11 @@ task: undefined, }; - let updatedFields = { + const updatedFields = new FieldUpdateTrigger({ assignee: false, reviewer: false, status: false, - }; + }); for (const property in data) { if (Object.prototype.hasOwnProperty.call(data, property)) { @@ -865,9 +866,6 @@ }, __updatedFields: { get: () => updatedFields, - set: (fields) => { - updatedFields = fields; - }, }, }), ); @@ -1040,13 +1038,14 @@ dimension: undefined, }; - let updatedFields = { + const updatedFields = new FieldUpdateTrigger({ name: false, assignee: false, bug_tracker: false, subset: false, labels: false, - }; + project_id: false, + }); for (const property in data) { if (Object.prototype.hasOwnProperty.call(data, property) && property in initialData) { @@ -1126,11 +1125,18 @@ * @name projectId * @type {integer|null} * @memberof module:API.cvat.classes.Task - * @readonly * @instance */ projectId: { get: () => data.project_id, + set: (projectId) => { + if (!Number.isInteger(projectId) || projectId <= 0) { + throw new ArgumentError('Value must be a positive integer'); + } + + updatedFields.project_id = true; + data.project_id = projectId; + }, }, /** * @name status @@ -1558,9 +1564,6 @@ }, __updatedFields: { get: () => updatedFields, - set: (fields) => { - updatedFields = fields; - }, }, }), ); @@ -1721,11 +1724,7 @@ await serverProxy.jobs.save(this.id, jobData); - this.__updatedFields = { - status: false, - assignee: false, - reviewer: false, - }; + this.__updatedFields.reset(); return this; } @@ -2000,6 +1999,9 @@ case 'subset': taskData.subset = this.subset; break; + case 'project_id': + taskData.project_id = this.projectId; + break; case 'labels': taskData.labels = [...this._internalData.labels.map((el) => el.toJSON())]; break; @@ -2011,13 +2013,7 @@ await serverProxy.tasks.saveTask(this.id, taskData); - this.updatedFields = { - assignee: false, - name: false, - bugTracker: false, - subset: false, - labels: false, - }; + this.__updatedFields.reset(); return this; } diff --git a/cvat-ui/src/actions/tasks-actions.ts b/cvat-ui/src/actions/tasks-actions.ts index 3dcf75bcfbc..cdb993cd1cb 100644 --- a/cvat-ui/src/actions/tasks-actions.ts +++ b/cvat-ui/src/actions/tasks-actions.ts @@ -35,6 +35,7 @@ export enum TasksActionTypes { UPDATE_TASK_SUCCESS = 'UPDATE_TASK_SUCCESS', UPDATE_TASK_FAILED = 'UPDATE_TASK_FAILED', HIDE_EMPTY_TASKS = 'HIDE_EMPTY_TASKS', + SWITCH_MOVE_TASK_MODAL_VISIBLE = 'SWITCH_MOVE_TASK_MODAL_VISIBLE', } function getTasks(): AnyAction { @@ -519,3 +520,46 @@ export function hideEmptyTasks(hideEmpty: boolean): AnyAction { return action; } + +export function switchMoveTaskModalVisible(visible: boolean, taskId: number | null = null): AnyAction { + const action = { + type: TasksActionTypes.SWITCH_MOVE_TASK_MODAL_VISIBLE, + payload: { + taskId, + visible, + }, + }; + + return action; +} + +interface LabelMap { + label_id: number; + new_label_name: string | null; + clear_attributes: boolean; +} + +export function moveTaskToProjectAsync( + taskInstance: any, + projectId: any, + labelMap: LabelMap[], +): ThunkAction, {}, {}, AnyAction> { + return async (dispatch: ActionCreator): Promise => { + dispatch(updateTask()); + try { + // eslint-disable-next-line no-param-reassign + taskInstance.labels = labelMap.map((mapper) => { + const [label] = taskInstance.labels.filter((_label: any) => mapper.label_id === _label.id); + label.name = mapper.new_label_name; + return label; + }); + // eslint-disable-next-line no-param-reassign + taskInstance.projectId = projectId; + await taskInstance.save(); + const [task] = await cvat.tasks.get({ id: taskInstance.id }); + dispatch(updateTaskSuccess(task, task.id)); + } catch (error) { + dispatch(updateTaskFailed(error, taskInstance)); + } + }; +} diff --git a/cvat-ui/src/base.scss b/cvat-ui/src/base.scss index 9ef0e0ac60c..4097dbe0469 100644 --- a/cvat-ui/src/base.scss +++ b/cvat-ui/src/base.scss @@ -13,6 +13,7 @@ $layout-lg-grid-color: rgba(0, 0, 0, 0.15); $header-color: #d8d8d8; $text-color: #303030; +$text-color-secondary: rgba(0, 0, 0, 0.45); $hover-menu-color: rgba(24, 144, 255, 0.05); $completed-progress-color: #61c200; $inprogress-progress-color: #1890ff; diff --git a/cvat-ui/src/components/actions-menu/actions-menu.tsx b/cvat-ui/src/components/actions-menu/actions-menu.tsx index 52e0f05bcb1..eed1db75756 100644 --- a/cvat-ui/src/components/actions-menu/actions-menu.tsx +++ b/cvat-ui/src/components/actions-menu/actions-menu.tsx @@ -33,6 +33,7 @@ export enum Actions { EXPORT_TASK_DATASET = 'export_task_dataset', DELETE_TASK = 'delete_task', RUN_AUTO_ANNOTATION = 'run_auto_annotation', + MOVE_TASK_TO_PROJECT = 'move_task_to_project', OPEN_BUG_TRACKER = 'open_bug_tracker', } @@ -128,6 +129,7 @@ export default function ActionsMenuComponent(props: Props): JSX.Element { Automatic annotation
+ Move to project Delete ); diff --git a/cvat-ui/src/components/actions-menu/load-submenu.tsx b/cvat-ui/src/components/actions-menu/load-submenu.tsx index 347ddbfaa2e..6f72a7c14cd 100644 --- a/cvat-ui/src/components/actions-menu/load-submenu.tsx +++ b/cvat-ui/src/components/actions-menu/load-submenu.tsx @@ -47,7 +47,12 @@ export default function LoadSubmenu(props: Props): JSX.Element { return false; }} > -
", "gi") - * returns: ["test"] - */ -showdown.helper.matchRecursiveRegExp = function (str, left, right, flags) { - 'use strict'; - - var matchPos = rgxFindMatchPos (str, left, right, flags), - results = []; - - for (var i = 0; i < matchPos.length; ++i) { - results.push([ - str.slice(matchPos[i].wholeMatch.start, matchPos[i].wholeMatch.end), - str.slice(matchPos[i].match.start, matchPos[i].match.end), - str.slice(matchPos[i].left.start, matchPos[i].left.end), - str.slice(matchPos[i].right.start, matchPos[i].right.end) - ]); - } - return results; -}; - -/** - * - * @param {string} str - * @param {string|function} replacement - * @param {string} left - * @param {string} right - * @param {string} flags - * @returns {string} - */ -showdown.helper.replaceRecursiveRegExp = function (str, replacement, left, right, flags) { - 'use strict'; - - if (!showdown.helper.isFunction(replacement)) { - var repStr = replacement; - replacement = function () { - return repStr; - }; - } - - var matchPos = rgxFindMatchPos(str, left, right, flags), - finalStr = str, - lng = matchPos.length; - - if (lng > 0) { - var bits = []; - if (matchPos[0].wholeMatch.start !== 0) { - bits.push(str.slice(0, matchPos[0].wholeMatch.start)); - } - for (var i = 0; i < lng; ++i) { - bits.push( - replacement( - str.slice(matchPos[i].wholeMatch.start, matchPos[i].wholeMatch.end), - str.slice(matchPos[i].match.start, matchPos[i].match.end), - str.slice(matchPos[i].left.start, matchPos[i].left.end), - str.slice(matchPos[i].right.start, matchPos[i].right.end) - ) - ); - if (i < lng - 1) { - bits.push(str.slice(matchPos[i].wholeMatch.end, matchPos[i + 1].wholeMatch.start)); - } - } - if (matchPos[lng - 1].wholeMatch.end < str.length) { - bits.push(str.slice(matchPos[lng - 1].wholeMatch.end)); - } - finalStr = bits.join(''); - } - return finalStr; -}; - -/** - * Returns the index within the passed String object of the first occurrence of the specified regex, - * starting the search at fromIndex. Returns -1 if the value is not found. - * - * @param {string} str string to search - * @param {RegExp} regex Regular expression to search - * @param {int} [fromIndex = 0] Index to start the search - * @returns {Number} - * @throws InvalidArgumentError - */ -showdown.helper.regexIndexOf = function (str, regex, fromIndex) { - 'use strict'; - if (!showdown.helper.isString(str)) { - throw 'InvalidArgumentError: first parameter of showdown.helper.regexIndexOf function must be a string'; - } - if (regex instanceof RegExp === false) { - throw 'InvalidArgumentError: second parameter of showdown.helper.regexIndexOf function must be an instance of RegExp'; - } - var indexOf = str.substring(fromIndex || 0).search(regex); - return (indexOf >= 0) ? (indexOf + (fromIndex || 0)) : indexOf; -}; - -/** - * Splits the passed string object at the defined index, and returns an array composed of the two substrings - * @param {string} str string to split - * @param {int} index index to split string at - * @returns {[string,string]} - * @throws InvalidArgumentError - */ -showdown.helper.splitAtIndex = function (str, index) { - 'use strict'; - if (!showdown.helper.isString(str)) { - throw 'InvalidArgumentError: first parameter of showdown.helper.regexIndexOf function must be a string'; - } - return [str.substring(0, index), str.substring(index)]; -}; - -/** - * Obfuscate an e-mail address through the use of Character Entities, - * transforming ASCII characters into their equivalent decimal or hex entities. - * - * Since it has a random component, subsequent calls to this function produce different results - * - * @param {string} mail - * @returns {string} - */ -showdown.helper.encodeEmailAddress = function (mail) { - 'use strict'; - var encode = [ - function (ch) { - return '&#' + ch.charCodeAt(0) + ';'; - }, - function (ch) { - return '&#x' + ch.charCodeAt(0).toString(16) + ';'; - }, - function (ch) { - return ch; - } - ]; - - mail = mail.replace(/./g, function (ch) { - if (ch === '@') { - // this *must* be encoded. I insist. - ch = encode[Math.floor(Math.random() * 2)](ch); - } else { - var r = Math.random(); - // roughly 10% raw, 45% hex, 45% dec - ch = ( - r > 0.9 ? encode[2](ch) : r > 0.45 ? encode[1](ch) : encode[0](ch) - ); - } - return ch; - }); - - return mail; -}; - -/** - * POLYFILLS - */ -// use this instead of builtin is undefined for IE8 compatibility -if (typeof(console) === 'undefined') { - console = { - warn: function (msg) { - 'use strict'; - alert(msg); - }, - log: function (msg) { - 'use strict'; - alert(msg); - }, - error: function (msg) { - 'use strict'; - throw msg; - } - }; -} - -/** - * Common regexes. - * We declare some common regexes to improve performance - */ -showdown.helper.regexes = { - asteriskDashAndColon: /([*_:~])/g -}; - -/** - * EMOJIS LIST - */ -showdown.helper.emojis = { - '+1':'\ud83d\udc4d', - '-1':'\ud83d\udc4e', - '100':'\ud83d\udcaf', - '1234':'\ud83d\udd22', - '1st_place_medal':'\ud83e\udd47', - '2nd_place_medal':'\ud83e\udd48', - '3rd_place_medal':'\ud83e\udd49', - '8ball':'\ud83c\udfb1', - 'a':'\ud83c\udd70\ufe0f', - 'ab':'\ud83c\udd8e', - 'abc':'\ud83d\udd24', - 'abcd':'\ud83d\udd21', - 'accept':'\ud83c\ude51', - 'aerial_tramway':'\ud83d\udea1', - 'airplane':'\u2708\ufe0f', - 'alarm_clock':'\u23f0', - 'alembic':'\u2697\ufe0f', - 'alien':'\ud83d\udc7d', - 'ambulance':'\ud83d\ude91', - 'amphora':'\ud83c\udffa', - 'anchor':'\u2693\ufe0f', - 'angel':'\ud83d\udc7c', - 'anger':'\ud83d\udca2', - 'angry':'\ud83d\ude20', - 'anguished':'\ud83d\ude27', - 'ant':'\ud83d\udc1c', - 'apple':'\ud83c\udf4e', - 'aquarius':'\u2652\ufe0f', - 'aries':'\u2648\ufe0f', - 'arrow_backward':'\u25c0\ufe0f', - 'arrow_double_down':'\u23ec', - 'arrow_double_up':'\u23eb', - 'arrow_down':'\u2b07\ufe0f', - 'arrow_down_small':'\ud83d\udd3d', - 'arrow_forward':'\u25b6\ufe0f', - 'arrow_heading_down':'\u2935\ufe0f', - 'arrow_heading_up':'\u2934\ufe0f', - 'arrow_left':'\u2b05\ufe0f', - 'arrow_lower_left':'\u2199\ufe0f', - 'arrow_lower_right':'\u2198\ufe0f', - 'arrow_right':'\u27a1\ufe0f', - 'arrow_right_hook':'\u21aa\ufe0f', - 'arrow_up':'\u2b06\ufe0f', - 'arrow_up_down':'\u2195\ufe0f', - 'arrow_up_small':'\ud83d\udd3c', - 'arrow_upper_left':'\u2196\ufe0f', - 'arrow_upper_right':'\u2197\ufe0f', - 'arrows_clockwise':'\ud83d\udd03', - 'arrows_counterclockwise':'\ud83d\udd04', - 'art':'\ud83c\udfa8', - 'articulated_lorry':'\ud83d\ude9b', - 'artificial_satellite':'\ud83d\udef0', - 'astonished':'\ud83d\ude32', - 'athletic_shoe':'\ud83d\udc5f', - 'atm':'\ud83c\udfe7', - 'atom_symbol':'\u269b\ufe0f', - 'avocado':'\ud83e\udd51', - 'b':'\ud83c\udd71\ufe0f', - 'baby':'\ud83d\udc76', - 'baby_bottle':'\ud83c\udf7c', - 'baby_chick':'\ud83d\udc24', - 'baby_symbol':'\ud83d\udebc', - 'back':'\ud83d\udd19', - 'bacon':'\ud83e\udd53', - 'badminton':'\ud83c\udff8', - 'baggage_claim':'\ud83d\udec4', - 'baguette_bread':'\ud83e\udd56', - 'balance_scale':'\u2696\ufe0f', - 'balloon':'\ud83c\udf88', - 'ballot_box':'\ud83d\uddf3', - 'ballot_box_with_check':'\u2611\ufe0f', - 'bamboo':'\ud83c\udf8d', - 'banana':'\ud83c\udf4c', - 'bangbang':'\u203c\ufe0f', - 'bank':'\ud83c\udfe6', - 'bar_chart':'\ud83d\udcca', - 'barber':'\ud83d\udc88', - 'baseball':'\u26be\ufe0f', - 'basketball':'\ud83c\udfc0', - 'basketball_man':'\u26f9\ufe0f', - 'basketball_woman':'\u26f9\ufe0f‍\u2640\ufe0f', - 'bat':'\ud83e\udd87', - 'bath':'\ud83d\udec0', - 'bathtub':'\ud83d\udec1', - 'battery':'\ud83d\udd0b', - 'beach_umbrella':'\ud83c\udfd6', - 'bear':'\ud83d\udc3b', - 'bed':'\ud83d\udecf', - 'bee':'\ud83d\udc1d', - 'beer':'\ud83c\udf7a', - 'beers':'\ud83c\udf7b', - 'beetle':'\ud83d\udc1e', - 'beginner':'\ud83d\udd30', - 'bell':'\ud83d\udd14', - 'bellhop_bell':'\ud83d\udece', - 'bento':'\ud83c\udf71', - 'biking_man':'\ud83d\udeb4', - 'bike':'\ud83d\udeb2', - 'biking_woman':'\ud83d\udeb4‍\u2640\ufe0f', - 'bikini':'\ud83d\udc59', - 'biohazard':'\u2623\ufe0f', - 'bird':'\ud83d\udc26', - 'birthday':'\ud83c\udf82', - 'black_circle':'\u26ab\ufe0f', - 'black_flag':'\ud83c\udff4', - 'black_heart':'\ud83d\udda4', - 'black_joker':'\ud83c\udccf', - 'black_large_square':'\u2b1b\ufe0f', - 'black_medium_small_square':'\u25fe\ufe0f', - 'black_medium_square':'\u25fc\ufe0f', - 'black_nib':'\u2712\ufe0f', - 'black_small_square':'\u25aa\ufe0f', - 'black_square_button':'\ud83d\udd32', - 'blonde_man':'\ud83d\udc71', - 'blonde_woman':'\ud83d\udc71‍\u2640\ufe0f', - 'blossom':'\ud83c\udf3c', - 'blowfish':'\ud83d\udc21', - 'blue_book':'\ud83d\udcd8', - 'blue_car':'\ud83d\ude99', - 'blue_heart':'\ud83d\udc99', - 'blush':'\ud83d\ude0a', - 'boar':'\ud83d\udc17', - 'boat':'\u26f5\ufe0f', - 'bomb':'\ud83d\udca3', - 'book':'\ud83d\udcd6', - 'bookmark':'\ud83d\udd16', - 'bookmark_tabs':'\ud83d\udcd1', - 'books':'\ud83d\udcda', - 'boom':'\ud83d\udca5', - 'boot':'\ud83d\udc62', - 'bouquet':'\ud83d\udc90', - 'bowing_man':'\ud83d\ude47', - 'bow_and_arrow':'\ud83c\udff9', - 'bowing_woman':'\ud83d\ude47‍\u2640\ufe0f', - 'bowling':'\ud83c\udfb3', - 'boxing_glove':'\ud83e\udd4a', - 'boy':'\ud83d\udc66', - 'bread':'\ud83c\udf5e', - 'bride_with_veil':'\ud83d\udc70', - 'bridge_at_night':'\ud83c\udf09', - 'briefcase':'\ud83d\udcbc', - 'broken_heart':'\ud83d\udc94', - 'bug':'\ud83d\udc1b', - 'building_construction':'\ud83c\udfd7', - 'bulb':'\ud83d\udca1', - 'bullettrain_front':'\ud83d\ude85', - 'bullettrain_side':'\ud83d\ude84', - 'burrito':'\ud83c\udf2f', - 'bus':'\ud83d\ude8c', - 'business_suit_levitating':'\ud83d\udd74', - 'busstop':'\ud83d\ude8f', - 'bust_in_silhouette':'\ud83d\udc64', - 'busts_in_silhouette':'\ud83d\udc65', - 'butterfly':'\ud83e\udd8b', - 'cactus':'\ud83c\udf35', - 'cake':'\ud83c\udf70', - 'calendar':'\ud83d\udcc6', - 'call_me_hand':'\ud83e\udd19', - 'calling':'\ud83d\udcf2', - 'camel':'\ud83d\udc2b', - 'camera':'\ud83d\udcf7', - 'camera_flash':'\ud83d\udcf8', - 'camping':'\ud83c\udfd5', - 'cancer':'\u264b\ufe0f', - 'candle':'\ud83d\udd6f', - 'candy':'\ud83c\udf6c', - 'canoe':'\ud83d\udef6', - 'capital_abcd':'\ud83d\udd20', - 'capricorn':'\u2651\ufe0f', - 'car':'\ud83d\ude97', - 'card_file_box':'\ud83d\uddc3', - 'card_index':'\ud83d\udcc7', - 'card_index_dividers':'\ud83d\uddc2', - 'carousel_horse':'\ud83c\udfa0', - 'carrot':'\ud83e\udd55', - 'cat':'\ud83d\udc31', - 'cat2':'\ud83d\udc08', - 'cd':'\ud83d\udcbf', - 'chains':'\u26d3', - 'champagne':'\ud83c\udf7e', - 'chart':'\ud83d\udcb9', - 'chart_with_downwards_trend':'\ud83d\udcc9', - 'chart_with_upwards_trend':'\ud83d\udcc8', - 'checkered_flag':'\ud83c\udfc1', - 'cheese':'\ud83e\uddc0', - 'cherries':'\ud83c\udf52', - 'cherry_blossom':'\ud83c\udf38', - 'chestnut':'\ud83c\udf30', - 'chicken':'\ud83d\udc14', - 'children_crossing':'\ud83d\udeb8', - 'chipmunk':'\ud83d\udc3f', - 'chocolate_bar':'\ud83c\udf6b', - 'christmas_tree':'\ud83c\udf84', - 'church':'\u26ea\ufe0f', - 'cinema':'\ud83c\udfa6', - 'circus_tent':'\ud83c\udfaa', - 'city_sunrise':'\ud83c\udf07', - 'city_sunset':'\ud83c\udf06', - 'cityscape':'\ud83c\udfd9', - 'cl':'\ud83c\udd91', - 'clamp':'\ud83d\udddc', - 'clap':'\ud83d\udc4f', - 'clapper':'\ud83c\udfac', - 'classical_building':'\ud83c\udfdb', - 'clinking_glasses':'\ud83e\udd42', - 'clipboard':'\ud83d\udccb', - 'clock1':'\ud83d\udd50', - 'clock10':'\ud83d\udd59', - 'clock1030':'\ud83d\udd65', - 'clock11':'\ud83d\udd5a', - 'clock1130':'\ud83d\udd66', - 'clock12':'\ud83d\udd5b', - 'clock1230':'\ud83d\udd67', - 'clock130':'\ud83d\udd5c', - 'clock2':'\ud83d\udd51', - 'clock230':'\ud83d\udd5d', - 'clock3':'\ud83d\udd52', - 'clock330':'\ud83d\udd5e', - 'clock4':'\ud83d\udd53', - 'clock430':'\ud83d\udd5f', - 'clock5':'\ud83d\udd54', - 'clock530':'\ud83d\udd60', - 'clock6':'\ud83d\udd55', - 'clock630':'\ud83d\udd61', - 'clock7':'\ud83d\udd56', - 'clock730':'\ud83d\udd62', - 'clock8':'\ud83d\udd57', - 'clock830':'\ud83d\udd63', - 'clock9':'\ud83d\udd58', - 'clock930':'\ud83d\udd64', - 'closed_book':'\ud83d\udcd5', - 'closed_lock_with_key':'\ud83d\udd10', - 'closed_umbrella':'\ud83c\udf02', - 'cloud':'\u2601\ufe0f', - 'cloud_with_lightning':'\ud83c\udf29', - 'cloud_with_lightning_and_rain':'\u26c8', - 'cloud_with_rain':'\ud83c\udf27', - 'cloud_with_snow':'\ud83c\udf28', - 'clown_face':'\ud83e\udd21', - 'clubs':'\u2663\ufe0f', - 'cocktail':'\ud83c\udf78', - 'coffee':'\u2615\ufe0f', - 'coffin':'\u26b0\ufe0f', - 'cold_sweat':'\ud83d\ude30', - 'comet':'\u2604\ufe0f', - 'computer':'\ud83d\udcbb', - 'computer_mouse':'\ud83d\uddb1', - 'confetti_ball':'\ud83c\udf8a', - 'confounded':'\ud83d\ude16', - 'confused':'\ud83d\ude15', - 'congratulations':'\u3297\ufe0f', - 'construction':'\ud83d\udea7', - 'construction_worker_man':'\ud83d\udc77', - 'construction_worker_woman':'\ud83d\udc77‍\u2640\ufe0f', - 'control_knobs':'\ud83c\udf9b', - 'convenience_store':'\ud83c\udfea', - 'cookie':'\ud83c\udf6a', - 'cool':'\ud83c\udd92', - 'policeman':'\ud83d\udc6e', - 'copyright':'\u00a9\ufe0f', - 'corn':'\ud83c\udf3d', - 'couch_and_lamp':'\ud83d\udecb', - 'couple':'\ud83d\udc6b', - 'couple_with_heart_woman_man':'\ud83d\udc91', - 'couple_with_heart_man_man':'\ud83d\udc68‍\u2764\ufe0f‍\ud83d\udc68', - 'couple_with_heart_woman_woman':'\ud83d\udc69‍\u2764\ufe0f‍\ud83d\udc69', - 'couplekiss_man_man':'\ud83d\udc68‍\u2764\ufe0f‍\ud83d\udc8b‍\ud83d\udc68', - 'couplekiss_man_woman':'\ud83d\udc8f', - 'couplekiss_woman_woman':'\ud83d\udc69‍\u2764\ufe0f‍\ud83d\udc8b‍\ud83d\udc69', - 'cow':'\ud83d\udc2e', - 'cow2':'\ud83d\udc04', - 'cowboy_hat_face':'\ud83e\udd20', - 'crab':'\ud83e\udd80', - 'crayon':'\ud83d\udd8d', - 'credit_card':'\ud83d\udcb3', - 'crescent_moon':'\ud83c\udf19', - 'cricket':'\ud83c\udfcf', - 'crocodile':'\ud83d\udc0a', - 'croissant':'\ud83e\udd50', - 'crossed_fingers':'\ud83e\udd1e', - 'crossed_flags':'\ud83c\udf8c', - 'crossed_swords':'\u2694\ufe0f', - 'crown':'\ud83d\udc51', - 'cry':'\ud83d\ude22', - 'crying_cat_face':'\ud83d\ude3f', - 'crystal_ball':'\ud83d\udd2e', - 'cucumber':'\ud83e\udd52', - 'cupid':'\ud83d\udc98', - 'curly_loop':'\u27b0', - 'currency_exchange':'\ud83d\udcb1', - 'curry':'\ud83c\udf5b', - 'custard':'\ud83c\udf6e', - 'customs':'\ud83d\udec3', - 'cyclone':'\ud83c\udf00', - 'dagger':'\ud83d\udde1', - 'dancer':'\ud83d\udc83', - 'dancing_women':'\ud83d\udc6f', - 'dancing_men':'\ud83d\udc6f‍\u2642\ufe0f', - 'dango':'\ud83c\udf61', - 'dark_sunglasses':'\ud83d\udd76', - 'dart':'\ud83c\udfaf', - 'dash':'\ud83d\udca8', - 'date':'\ud83d\udcc5', - 'deciduous_tree':'\ud83c\udf33', - 'deer':'\ud83e\udd8c', - 'department_store':'\ud83c\udfec', - 'derelict_house':'\ud83c\udfda', - 'desert':'\ud83c\udfdc', - 'desert_island':'\ud83c\udfdd', - 'desktop_computer':'\ud83d\udda5', - 'male_detective':'\ud83d\udd75\ufe0f', - 'diamond_shape_with_a_dot_inside':'\ud83d\udca0', - 'diamonds':'\u2666\ufe0f', - 'disappointed':'\ud83d\ude1e', - 'disappointed_relieved':'\ud83d\ude25', - 'dizzy':'\ud83d\udcab', - 'dizzy_face':'\ud83d\ude35', - 'do_not_litter':'\ud83d\udeaf', - 'dog':'\ud83d\udc36', - 'dog2':'\ud83d\udc15', - 'dollar':'\ud83d\udcb5', - 'dolls':'\ud83c\udf8e', - 'dolphin':'\ud83d\udc2c', - 'door':'\ud83d\udeaa', - 'doughnut':'\ud83c\udf69', - 'dove':'\ud83d\udd4a', - 'dragon':'\ud83d\udc09', - 'dragon_face':'\ud83d\udc32', - 'dress':'\ud83d\udc57', - 'dromedary_camel':'\ud83d\udc2a', - 'drooling_face':'\ud83e\udd24', - 'droplet':'\ud83d\udca7', - 'drum':'\ud83e\udd41', - 'duck':'\ud83e\udd86', - 'dvd':'\ud83d\udcc0', - 'e-mail':'\ud83d\udce7', - 'eagle':'\ud83e\udd85', - 'ear':'\ud83d\udc42', - 'ear_of_rice':'\ud83c\udf3e', - 'earth_africa':'\ud83c\udf0d', - 'earth_americas':'\ud83c\udf0e', - 'earth_asia':'\ud83c\udf0f', - 'egg':'\ud83e\udd5a', - 'eggplant':'\ud83c\udf46', - 'eight_pointed_black_star':'\u2734\ufe0f', - 'eight_spoked_asterisk':'\u2733\ufe0f', - 'electric_plug':'\ud83d\udd0c', - 'elephant':'\ud83d\udc18', - 'email':'\u2709\ufe0f', - 'end':'\ud83d\udd1a', - 'envelope_with_arrow':'\ud83d\udce9', - 'euro':'\ud83d\udcb6', - 'european_castle':'\ud83c\udff0', - 'european_post_office':'\ud83c\udfe4', - 'evergreen_tree':'\ud83c\udf32', - 'exclamation':'\u2757\ufe0f', - 'expressionless':'\ud83d\ude11', - 'eye':'\ud83d\udc41', - 'eye_speech_bubble':'\ud83d\udc41‍\ud83d\udde8', - 'eyeglasses':'\ud83d\udc53', - 'eyes':'\ud83d\udc40', - 'face_with_head_bandage':'\ud83e\udd15', - 'face_with_thermometer':'\ud83e\udd12', - 'fist_oncoming':'\ud83d\udc4a', - 'factory':'\ud83c\udfed', - 'fallen_leaf':'\ud83c\udf42', - 'family_man_woman_boy':'\ud83d\udc6a', - 'family_man_boy':'\ud83d\udc68‍\ud83d\udc66', - 'family_man_boy_boy':'\ud83d\udc68‍\ud83d\udc66‍\ud83d\udc66', - 'family_man_girl':'\ud83d\udc68‍\ud83d\udc67', - 'family_man_girl_boy':'\ud83d\udc68‍\ud83d\udc67‍\ud83d\udc66', - 'family_man_girl_girl':'\ud83d\udc68‍\ud83d\udc67‍\ud83d\udc67', - 'family_man_man_boy':'\ud83d\udc68‍\ud83d\udc68‍\ud83d\udc66', - 'family_man_man_boy_boy':'\ud83d\udc68‍\ud83d\udc68‍\ud83d\udc66‍\ud83d\udc66', - 'family_man_man_girl':'\ud83d\udc68‍\ud83d\udc68‍\ud83d\udc67', - 'family_man_man_girl_boy':'\ud83d\udc68‍\ud83d\udc68‍\ud83d\udc67‍\ud83d\udc66', - 'family_man_man_girl_girl':'\ud83d\udc68‍\ud83d\udc68‍\ud83d\udc67‍\ud83d\udc67', - 'family_man_woman_boy_boy':'\ud83d\udc68‍\ud83d\udc69‍\ud83d\udc66‍\ud83d\udc66', - 'family_man_woman_girl':'\ud83d\udc68‍\ud83d\udc69‍\ud83d\udc67', - 'family_man_woman_girl_boy':'\ud83d\udc68‍\ud83d\udc69‍\ud83d\udc67‍\ud83d\udc66', - 'family_man_woman_girl_girl':'\ud83d\udc68‍\ud83d\udc69‍\ud83d\udc67‍\ud83d\udc67', - 'family_woman_boy':'\ud83d\udc69‍\ud83d\udc66', - 'family_woman_boy_boy':'\ud83d\udc69‍\ud83d\udc66‍\ud83d\udc66', - 'family_woman_girl':'\ud83d\udc69‍\ud83d\udc67', - 'family_woman_girl_boy':'\ud83d\udc69‍\ud83d\udc67‍\ud83d\udc66', - 'family_woman_girl_girl':'\ud83d\udc69‍\ud83d\udc67‍\ud83d\udc67', - 'family_woman_woman_boy':'\ud83d\udc69‍\ud83d\udc69‍\ud83d\udc66', - 'family_woman_woman_boy_boy':'\ud83d\udc69‍\ud83d\udc69‍\ud83d\udc66‍\ud83d\udc66', - 'family_woman_woman_girl':'\ud83d\udc69‍\ud83d\udc69‍\ud83d\udc67', - 'family_woman_woman_girl_boy':'\ud83d\udc69‍\ud83d\udc69‍\ud83d\udc67‍\ud83d\udc66', - 'family_woman_woman_girl_girl':'\ud83d\udc69‍\ud83d\udc69‍\ud83d\udc67‍\ud83d\udc67', - 'fast_forward':'\u23e9', - 'fax':'\ud83d\udce0', - 'fearful':'\ud83d\ude28', - 'feet':'\ud83d\udc3e', - 'female_detective':'\ud83d\udd75\ufe0f‍\u2640\ufe0f', - 'ferris_wheel':'\ud83c\udfa1', - 'ferry':'\u26f4', - 'field_hockey':'\ud83c\udfd1', - 'file_cabinet':'\ud83d\uddc4', - 'file_folder':'\ud83d\udcc1', - 'film_projector':'\ud83d\udcfd', - 'film_strip':'\ud83c\udf9e', - 'fire':'\ud83d\udd25', - 'fire_engine':'\ud83d\ude92', - 'fireworks':'\ud83c\udf86', - 'first_quarter_moon':'\ud83c\udf13', - 'first_quarter_moon_with_face':'\ud83c\udf1b', - 'fish':'\ud83d\udc1f', - 'fish_cake':'\ud83c\udf65', - 'fishing_pole_and_fish':'\ud83c\udfa3', - 'fist_raised':'\u270a', - 'fist_left':'\ud83e\udd1b', - 'fist_right':'\ud83e\udd1c', - 'flags':'\ud83c\udf8f', - 'flashlight':'\ud83d\udd26', - 'fleur_de_lis':'\u269c\ufe0f', - 'flight_arrival':'\ud83d\udeec', - 'flight_departure':'\ud83d\udeeb', - 'floppy_disk':'\ud83d\udcbe', - 'flower_playing_cards':'\ud83c\udfb4', - 'flushed':'\ud83d\ude33', - 'fog':'\ud83c\udf2b', - 'foggy':'\ud83c\udf01', - 'football':'\ud83c\udfc8', - 'footprints':'\ud83d\udc63', - 'fork_and_knife':'\ud83c\udf74', - 'fountain':'\u26f2\ufe0f', - 'fountain_pen':'\ud83d\udd8b', - 'four_leaf_clover':'\ud83c\udf40', - 'fox_face':'\ud83e\udd8a', - 'framed_picture':'\ud83d\uddbc', - 'free':'\ud83c\udd93', - 'fried_egg':'\ud83c\udf73', - 'fried_shrimp':'\ud83c\udf64', - 'fries':'\ud83c\udf5f', - 'frog':'\ud83d\udc38', - 'frowning':'\ud83d\ude26', - 'frowning_face':'\u2639\ufe0f', - 'frowning_man':'\ud83d\ude4d‍\u2642\ufe0f', - 'frowning_woman':'\ud83d\ude4d', - 'middle_finger':'\ud83d\udd95', - 'fuelpump':'\u26fd\ufe0f', - 'full_moon':'\ud83c\udf15', - 'full_moon_with_face':'\ud83c\udf1d', - 'funeral_urn':'\u26b1\ufe0f', - 'game_die':'\ud83c\udfb2', - 'gear':'\u2699\ufe0f', - 'gem':'\ud83d\udc8e', - 'gemini':'\u264a\ufe0f', - 'ghost':'\ud83d\udc7b', - 'gift':'\ud83c\udf81', - 'gift_heart':'\ud83d\udc9d', - 'girl':'\ud83d\udc67', - 'globe_with_meridians':'\ud83c\udf10', - 'goal_net':'\ud83e\udd45', - 'goat':'\ud83d\udc10', - 'golf':'\u26f3\ufe0f', - 'golfing_man':'\ud83c\udfcc\ufe0f', - 'golfing_woman':'\ud83c\udfcc\ufe0f‍\u2640\ufe0f', - 'gorilla':'\ud83e\udd8d', - 'grapes':'\ud83c\udf47', - 'green_apple':'\ud83c\udf4f', - 'green_book':'\ud83d\udcd7', - 'green_heart':'\ud83d\udc9a', - 'green_salad':'\ud83e\udd57', - 'grey_exclamation':'\u2755', - 'grey_question':'\u2754', - 'grimacing':'\ud83d\ude2c', - 'grin':'\ud83d\ude01', - 'grinning':'\ud83d\ude00', - 'guardsman':'\ud83d\udc82', - 'guardswoman':'\ud83d\udc82‍\u2640\ufe0f', - 'guitar':'\ud83c\udfb8', - 'gun':'\ud83d\udd2b', - 'haircut_woman':'\ud83d\udc87', - 'haircut_man':'\ud83d\udc87‍\u2642\ufe0f', - 'hamburger':'\ud83c\udf54', - 'hammer':'\ud83d\udd28', - 'hammer_and_pick':'\u2692', - 'hammer_and_wrench':'\ud83d\udee0', - 'hamster':'\ud83d\udc39', - 'hand':'\u270b', - 'handbag':'\ud83d\udc5c', - 'handshake':'\ud83e\udd1d', - 'hankey':'\ud83d\udca9', - 'hatched_chick':'\ud83d\udc25', - 'hatching_chick':'\ud83d\udc23', - 'headphones':'\ud83c\udfa7', - 'hear_no_evil':'\ud83d\ude49', - 'heart':'\u2764\ufe0f', - 'heart_decoration':'\ud83d\udc9f', - 'heart_eyes':'\ud83d\ude0d', - 'heart_eyes_cat':'\ud83d\ude3b', - 'heartbeat':'\ud83d\udc93', - 'heartpulse':'\ud83d\udc97', - 'hearts':'\u2665\ufe0f', - 'heavy_check_mark':'\u2714\ufe0f', - 'heavy_division_sign':'\u2797', - 'heavy_dollar_sign':'\ud83d\udcb2', - 'heavy_heart_exclamation':'\u2763\ufe0f', - 'heavy_minus_sign':'\u2796', - 'heavy_multiplication_x':'\u2716\ufe0f', - 'heavy_plus_sign':'\u2795', - 'helicopter':'\ud83d\ude81', - 'herb':'\ud83c\udf3f', - 'hibiscus':'\ud83c\udf3a', - 'high_brightness':'\ud83d\udd06', - 'high_heel':'\ud83d\udc60', - 'hocho':'\ud83d\udd2a', - 'hole':'\ud83d\udd73', - 'honey_pot':'\ud83c\udf6f', - 'horse':'\ud83d\udc34', - 'horse_racing':'\ud83c\udfc7', - 'hospital':'\ud83c\udfe5', - 'hot_pepper':'\ud83c\udf36', - 'hotdog':'\ud83c\udf2d', - 'hotel':'\ud83c\udfe8', - 'hotsprings':'\u2668\ufe0f', - 'hourglass':'\u231b\ufe0f', - 'hourglass_flowing_sand':'\u23f3', - 'house':'\ud83c\udfe0', - 'house_with_garden':'\ud83c\udfe1', - 'houses':'\ud83c\udfd8', - 'hugs':'\ud83e\udd17', - 'hushed':'\ud83d\ude2f', - 'ice_cream':'\ud83c\udf68', - 'ice_hockey':'\ud83c\udfd2', - 'ice_skate':'\u26f8', - 'icecream':'\ud83c\udf66', - 'id':'\ud83c\udd94', - 'ideograph_advantage':'\ud83c\ude50', - 'imp':'\ud83d\udc7f', - 'inbox_tray':'\ud83d\udce5', - 'incoming_envelope':'\ud83d\udce8', - 'tipping_hand_woman':'\ud83d\udc81', - 'information_source':'\u2139\ufe0f', - 'innocent':'\ud83d\ude07', - 'interrobang':'\u2049\ufe0f', - 'iphone':'\ud83d\udcf1', - 'izakaya_lantern':'\ud83c\udfee', - 'jack_o_lantern':'\ud83c\udf83', - 'japan':'\ud83d\uddfe', - 'japanese_castle':'\ud83c\udfef', - 'japanese_goblin':'\ud83d\udc7a', - 'japanese_ogre':'\ud83d\udc79', - 'jeans':'\ud83d\udc56', - 'joy':'\ud83d\ude02', - 'joy_cat':'\ud83d\ude39', - 'joystick':'\ud83d\udd79', - 'kaaba':'\ud83d\udd4b', - 'key':'\ud83d\udd11', - 'keyboard':'\u2328\ufe0f', - 'keycap_ten':'\ud83d\udd1f', - 'kick_scooter':'\ud83d\udef4', - 'kimono':'\ud83d\udc58', - 'kiss':'\ud83d\udc8b', - 'kissing':'\ud83d\ude17', - 'kissing_cat':'\ud83d\ude3d', - 'kissing_closed_eyes':'\ud83d\ude1a', - 'kissing_heart':'\ud83d\ude18', - 'kissing_smiling_eyes':'\ud83d\ude19', - 'kiwi_fruit':'\ud83e\udd5d', - 'koala':'\ud83d\udc28', - 'koko':'\ud83c\ude01', - 'label':'\ud83c\udff7', - 'large_blue_circle':'\ud83d\udd35', - 'large_blue_diamond':'\ud83d\udd37', - 'large_orange_diamond':'\ud83d\udd36', - 'last_quarter_moon':'\ud83c\udf17', - 'last_quarter_moon_with_face':'\ud83c\udf1c', - 'latin_cross':'\u271d\ufe0f', - 'laughing':'\ud83d\ude06', - 'leaves':'\ud83c\udf43', - 'ledger':'\ud83d\udcd2', - 'left_luggage':'\ud83d\udec5', - 'left_right_arrow':'\u2194\ufe0f', - 'leftwards_arrow_with_hook':'\u21a9\ufe0f', - 'lemon':'\ud83c\udf4b', - 'leo':'\u264c\ufe0f', - 'leopard':'\ud83d\udc06', - 'level_slider':'\ud83c\udf9a', - 'libra':'\u264e\ufe0f', - 'light_rail':'\ud83d\ude88', - 'link':'\ud83d\udd17', - 'lion':'\ud83e\udd81', - 'lips':'\ud83d\udc44', - 'lipstick':'\ud83d\udc84', - 'lizard':'\ud83e\udd8e', - 'lock':'\ud83d\udd12', - 'lock_with_ink_pen':'\ud83d\udd0f', - 'lollipop':'\ud83c\udf6d', - 'loop':'\u27bf', - 'loud_sound':'\ud83d\udd0a', - 'loudspeaker':'\ud83d\udce2', - 'love_hotel':'\ud83c\udfe9', - 'love_letter':'\ud83d\udc8c', - 'low_brightness':'\ud83d\udd05', - 'lying_face':'\ud83e\udd25', - 'm':'\u24c2\ufe0f', - 'mag':'\ud83d\udd0d', - 'mag_right':'\ud83d\udd0e', - 'mahjong':'\ud83c\udc04\ufe0f', - 'mailbox':'\ud83d\udceb', - 'mailbox_closed':'\ud83d\udcea', - 'mailbox_with_mail':'\ud83d\udcec', - 'mailbox_with_no_mail':'\ud83d\udced', - 'man':'\ud83d\udc68', - 'man_artist':'\ud83d\udc68‍\ud83c\udfa8', - 'man_astronaut':'\ud83d\udc68‍\ud83d\ude80', - 'man_cartwheeling':'\ud83e\udd38‍\u2642\ufe0f', - 'man_cook':'\ud83d\udc68‍\ud83c\udf73', - 'man_dancing':'\ud83d\udd7a', - 'man_facepalming':'\ud83e\udd26‍\u2642\ufe0f', - 'man_factory_worker':'\ud83d\udc68‍\ud83c\udfed', - 'man_farmer':'\ud83d\udc68‍\ud83c\udf3e', - 'man_firefighter':'\ud83d\udc68‍\ud83d\ude92', - 'man_health_worker':'\ud83d\udc68‍\u2695\ufe0f', - 'man_in_tuxedo':'\ud83e\udd35', - 'man_judge':'\ud83d\udc68‍\u2696\ufe0f', - 'man_juggling':'\ud83e\udd39‍\u2642\ufe0f', - 'man_mechanic':'\ud83d\udc68‍\ud83d\udd27', - 'man_office_worker':'\ud83d\udc68‍\ud83d\udcbc', - 'man_pilot':'\ud83d\udc68‍\u2708\ufe0f', - 'man_playing_handball':'\ud83e\udd3e‍\u2642\ufe0f', - 'man_playing_water_polo':'\ud83e\udd3d‍\u2642\ufe0f', - 'man_scientist':'\ud83d\udc68‍\ud83d\udd2c', - 'man_shrugging':'\ud83e\udd37‍\u2642\ufe0f', - 'man_singer':'\ud83d\udc68‍\ud83c\udfa4', - 'man_student':'\ud83d\udc68‍\ud83c\udf93', - 'man_teacher':'\ud83d\udc68‍\ud83c\udfeb', - 'man_technologist':'\ud83d\udc68‍\ud83d\udcbb', - 'man_with_gua_pi_mao':'\ud83d\udc72', - 'man_with_turban':'\ud83d\udc73', - 'tangerine':'\ud83c\udf4a', - 'mans_shoe':'\ud83d\udc5e', - 'mantelpiece_clock':'\ud83d\udd70', - 'maple_leaf':'\ud83c\udf41', - 'martial_arts_uniform':'\ud83e\udd4b', - 'mask':'\ud83d\ude37', - 'massage_woman':'\ud83d\udc86', - 'massage_man':'\ud83d\udc86‍\u2642\ufe0f', - 'meat_on_bone':'\ud83c\udf56', - 'medal_military':'\ud83c\udf96', - 'medal_sports':'\ud83c\udfc5', - 'mega':'\ud83d\udce3', - 'melon':'\ud83c\udf48', - 'memo':'\ud83d\udcdd', - 'men_wrestling':'\ud83e\udd3c‍\u2642\ufe0f', - 'menorah':'\ud83d\udd4e', - 'mens':'\ud83d\udeb9', - 'metal':'\ud83e\udd18', - 'metro':'\ud83d\ude87', - 'microphone':'\ud83c\udfa4', - 'microscope':'\ud83d\udd2c', - 'milk_glass':'\ud83e\udd5b', - 'milky_way':'\ud83c\udf0c', - 'minibus':'\ud83d\ude90', - 'minidisc':'\ud83d\udcbd', - 'mobile_phone_off':'\ud83d\udcf4', - 'money_mouth_face':'\ud83e\udd11', - 'money_with_wings':'\ud83d\udcb8', - 'moneybag':'\ud83d\udcb0', - 'monkey':'\ud83d\udc12', - 'monkey_face':'\ud83d\udc35', - 'monorail':'\ud83d\ude9d', - 'moon':'\ud83c\udf14', - 'mortar_board':'\ud83c\udf93', - 'mosque':'\ud83d\udd4c', - 'motor_boat':'\ud83d\udee5', - 'motor_scooter':'\ud83d\udef5', - 'motorcycle':'\ud83c\udfcd', - 'motorway':'\ud83d\udee3', - 'mount_fuji':'\ud83d\uddfb', - 'mountain':'\u26f0', - 'mountain_biking_man':'\ud83d\udeb5', - 'mountain_biking_woman':'\ud83d\udeb5‍\u2640\ufe0f', - 'mountain_cableway':'\ud83d\udea0', - 'mountain_railway':'\ud83d\ude9e', - 'mountain_snow':'\ud83c\udfd4', - 'mouse':'\ud83d\udc2d', - 'mouse2':'\ud83d\udc01', - 'movie_camera':'\ud83c\udfa5', - 'moyai':'\ud83d\uddff', - 'mrs_claus':'\ud83e\udd36', - 'muscle':'\ud83d\udcaa', - 'mushroom':'\ud83c\udf44', - 'musical_keyboard':'\ud83c\udfb9', - 'musical_note':'\ud83c\udfb5', - 'musical_score':'\ud83c\udfbc', - 'mute':'\ud83d\udd07', - 'nail_care':'\ud83d\udc85', - 'name_badge':'\ud83d\udcdb', - 'national_park':'\ud83c\udfde', - 'nauseated_face':'\ud83e\udd22', - 'necktie':'\ud83d\udc54', - 'negative_squared_cross_mark':'\u274e', - 'nerd_face':'\ud83e\udd13', - 'neutral_face':'\ud83d\ude10', - 'new':'\ud83c\udd95', - 'new_moon':'\ud83c\udf11', - 'new_moon_with_face':'\ud83c\udf1a', - 'newspaper':'\ud83d\udcf0', - 'newspaper_roll':'\ud83d\uddde', - 'next_track_button':'\u23ed', - 'ng':'\ud83c\udd96', - 'no_good_man':'\ud83d\ude45‍\u2642\ufe0f', - 'no_good_woman':'\ud83d\ude45', - 'night_with_stars':'\ud83c\udf03', - 'no_bell':'\ud83d\udd15', - 'no_bicycles':'\ud83d\udeb3', - 'no_entry':'\u26d4\ufe0f', - 'no_entry_sign':'\ud83d\udeab', - 'no_mobile_phones':'\ud83d\udcf5', - 'no_mouth':'\ud83d\ude36', - 'no_pedestrians':'\ud83d\udeb7', - 'no_smoking':'\ud83d\udead', - 'non-potable_water':'\ud83d\udeb1', - 'nose':'\ud83d\udc43', - 'notebook':'\ud83d\udcd3', - 'notebook_with_decorative_cover':'\ud83d\udcd4', - 'notes':'\ud83c\udfb6', - 'nut_and_bolt':'\ud83d\udd29', - 'o':'\u2b55\ufe0f', - 'o2':'\ud83c\udd7e\ufe0f', - 'ocean':'\ud83c\udf0a', - 'octopus':'\ud83d\udc19', - 'oden':'\ud83c\udf62', - 'office':'\ud83c\udfe2', - 'oil_drum':'\ud83d\udee2', - 'ok':'\ud83c\udd97', - 'ok_hand':'\ud83d\udc4c', - 'ok_man':'\ud83d\ude46‍\u2642\ufe0f', - 'ok_woman':'\ud83d\ude46', - 'old_key':'\ud83d\udddd', - 'older_man':'\ud83d\udc74', - 'older_woman':'\ud83d\udc75', - 'om':'\ud83d\udd49', - 'on':'\ud83d\udd1b', - 'oncoming_automobile':'\ud83d\ude98', - 'oncoming_bus':'\ud83d\ude8d', - 'oncoming_police_car':'\ud83d\ude94', - 'oncoming_taxi':'\ud83d\ude96', - 'open_file_folder':'\ud83d\udcc2', - 'open_hands':'\ud83d\udc50', - 'open_mouth':'\ud83d\ude2e', - 'open_umbrella':'\u2602\ufe0f', - 'ophiuchus':'\u26ce', - 'orange_book':'\ud83d\udcd9', - 'orthodox_cross':'\u2626\ufe0f', - 'outbox_tray':'\ud83d\udce4', - 'owl':'\ud83e\udd89', - 'ox':'\ud83d\udc02', - 'package':'\ud83d\udce6', - 'page_facing_up':'\ud83d\udcc4', - 'page_with_curl':'\ud83d\udcc3', - 'pager':'\ud83d\udcdf', - 'paintbrush':'\ud83d\udd8c', - 'palm_tree':'\ud83c\udf34', - 'pancakes':'\ud83e\udd5e', - 'panda_face':'\ud83d\udc3c', - 'paperclip':'\ud83d\udcce', - 'paperclips':'\ud83d\udd87', - 'parasol_on_ground':'\u26f1', - 'parking':'\ud83c\udd7f\ufe0f', - 'part_alternation_mark':'\u303d\ufe0f', - 'partly_sunny':'\u26c5\ufe0f', - 'passenger_ship':'\ud83d\udef3', - 'passport_control':'\ud83d\udec2', - 'pause_button':'\u23f8', - 'peace_symbol':'\u262e\ufe0f', - 'peach':'\ud83c\udf51', - 'peanuts':'\ud83e\udd5c', - 'pear':'\ud83c\udf50', - 'pen':'\ud83d\udd8a', - 'pencil2':'\u270f\ufe0f', - 'penguin':'\ud83d\udc27', - 'pensive':'\ud83d\ude14', - 'performing_arts':'\ud83c\udfad', - 'persevere':'\ud83d\ude23', - 'person_fencing':'\ud83e\udd3a', - 'pouting_woman':'\ud83d\ude4e', - 'phone':'\u260e\ufe0f', - 'pick':'\u26cf', - 'pig':'\ud83d\udc37', - 'pig2':'\ud83d\udc16', - 'pig_nose':'\ud83d\udc3d', - 'pill':'\ud83d\udc8a', - 'pineapple':'\ud83c\udf4d', - 'ping_pong':'\ud83c\udfd3', - 'pisces':'\u2653\ufe0f', - 'pizza':'\ud83c\udf55', - 'place_of_worship':'\ud83d\uded0', - 'plate_with_cutlery':'\ud83c\udf7d', - 'play_or_pause_button':'\u23ef', - 'point_down':'\ud83d\udc47', - 'point_left':'\ud83d\udc48', - 'point_right':'\ud83d\udc49', - 'point_up':'\u261d\ufe0f', - 'point_up_2':'\ud83d\udc46', - 'police_car':'\ud83d\ude93', - 'policewoman':'\ud83d\udc6e‍\u2640\ufe0f', - 'poodle':'\ud83d\udc29', - 'popcorn':'\ud83c\udf7f', - 'post_office':'\ud83c\udfe3', - 'postal_horn':'\ud83d\udcef', - 'postbox':'\ud83d\udcee', - 'potable_water':'\ud83d\udeb0', - 'potato':'\ud83e\udd54', - 'pouch':'\ud83d\udc5d', - 'poultry_leg':'\ud83c\udf57', - 'pound':'\ud83d\udcb7', - 'rage':'\ud83d\ude21', - 'pouting_cat':'\ud83d\ude3e', - 'pouting_man':'\ud83d\ude4e‍\u2642\ufe0f', - 'pray':'\ud83d\ude4f', - 'prayer_beads':'\ud83d\udcff', - 'pregnant_woman':'\ud83e\udd30', - 'previous_track_button':'\u23ee', - 'prince':'\ud83e\udd34', - 'princess':'\ud83d\udc78', - 'printer':'\ud83d\udda8', - 'purple_heart':'\ud83d\udc9c', - 'purse':'\ud83d\udc5b', - 'pushpin':'\ud83d\udccc', - 'put_litter_in_its_place':'\ud83d\udeae', - 'question':'\u2753', - 'rabbit':'\ud83d\udc30', - 'rabbit2':'\ud83d\udc07', - 'racehorse':'\ud83d\udc0e', - 'racing_car':'\ud83c\udfce', - 'radio':'\ud83d\udcfb', - 'radio_button':'\ud83d\udd18', - 'radioactive':'\u2622\ufe0f', - 'railway_car':'\ud83d\ude83', - 'railway_track':'\ud83d\udee4', - 'rainbow':'\ud83c\udf08', - 'rainbow_flag':'\ud83c\udff3\ufe0f‍\ud83c\udf08', - 'raised_back_of_hand':'\ud83e\udd1a', - 'raised_hand_with_fingers_splayed':'\ud83d\udd90', - 'raised_hands':'\ud83d\ude4c', - 'raising_hand_woman':'\ud83d\ude4b', - 'raising_hand_man':'\ud83d\ude4b‍\u2642\ufe0f', - 'ram':'\ud83d\udc0f', - 'ramen':'\ud83c\udf5c', - 'rat':'\ud83d\udc00', - 'record_button':'\u23fa', - 'recycle':'\u267b\ufe0f', - 'red_circle':'\ud83d\udd34', - 'registered':'\u00ae\ufe0f', - 'relaxed':'\u263a\ufe0f', - 'relieved':'\ud83d\ude0c', - 'reminder_ribbon':'\ud83c\udf97', - 'repeat':'\ud83d\udd01', - 'repeat_one':'\ud83d\udd02', - 'rescue_worker_helmet':'\u26d1', - 'restroom':'\ud83d\udebb', - 'revolving_hearts':'\ud83d\udc9e', - 'rewind':'\u23ea', - 'rhinoceros':'\ud83e\udd8f', - 'ribbon':'\ud83c\udf80', - 'rice':'\ud83c\udf5a', - 'rice_ball':'\ud83c\udf59', - 'rice_cracker':'\ud83c\udf58', - 'rice_scene':'\ud83c\udf91', - 'right_anger_bubble':'\ud83d\uddef', - 'ring':'\ud83d\udc8d', - 'robot':'\ud83e\udd16', - 'rocket':'\ud83d\ude80', - 'rofl':'\ud83e\udd23', - 'roll_eyes':'\ud83d\ude44', - 'roller_coaster':'\ud83c\udfa2', - 'rooster':'\ud83d\udc13', - 'rose':'\ud83c\udf39', - 'rosette':'\ud83c\udff5', - 'rotating_light':'\ud83d\udea8', - 'round_pushpin':'\ud83d\udccd', - 'rowing_man':'\ud83d\udea3', - 'rowing_woman':'\ud83d\udea3‍\u2640\ufe0f', - 'rugby_football':'\ud83c\udfc9', - 'running_man':'\ud83c\udfc3', - 'running_shirt_with_sash':'\ud83c\udfbd', - 'running_woman':'\ud83c\udfc3‍\u2640\ufe0f', - 'sa':'\ud83c\ude02\ufe0f', - 'sagittarius':'\u2650\ufe0f', - 'sake':'\ud83c\udf76', - 'sandal':'\ud83d\udc61', - 'santa':'\ud83c\udf85', - 'satellite':'\ud83d\udce1', - 'saxophone':'\ud83c\udfb7', - 'school':'\ud83c\udfeb', - 'school_satchel':'\ud83c\udf92', - 'scissors':'\u2702\ufe0f', - 'scorpion':'\ud83e\udd82', - 'scorpius':'\u264f\ufe0f', - 'scream':'\ud83d\ude31', - 'scream_cat':'\ud83d\ude40', - 'scroll':'\ud83d\udcdc', - 'seat':'\ud83d\udcba', - 'secret':'\u3299\ufe0f', - 'see_no_evil':'\ud83d\ude48', - 'seedling':'\ud83c\udf31', - 'selfie':'\ud83e\udd33', - 'shallow_pan_of_food':'\ud83e\udd58', - 'shamrock':'\u2618\ufe0f', - 'shark':'\ud83e\udd88', - 'shaved_ice':'\ud83c\udf67', - 'sheep':'\ud83d\udc11', - 'shell':'\ud83d\udc1a', - 'shield':'\ud83d\udee1', - 'shinto_shrine':'\u26e9', - 'ship':'\ud83d\udea2', - 'shirt':'\ud83d\udc55', - 'shopping':'\ud83d\udecd', - 'shopping_cart':'\ud83d\uded2', - 'shower':'\ud83d\udebf', - 'shrimp':'\ud83e\udd90', - 'signal_strength':'\ud83d\udcf6', - 'six_pointed_star':'\ud83d\udd2f', - 'ski':'\ud83c\udfbf', - 'skier':'\u26f7', - 'skull':'\ud83d\udc80', - 'skull_and_crossbones':'\u2620\ufe0f', - 'sleeping':'\ud83d\ude34', - 'sleeping_bed':'\ud83d\udecc', - 'sleepy':'\ud83d\ude2a', - 'slightly_frowning_face':'\ud83d\ude41', - 'slightly_smiling_face':'\ud83d\ude42', - 'slot_machine':'\ud83c\udfb0', - 'small_airplane':'\ud83d\udee9', - 'small_blue_diamond':'\ud83d\udd39', - 'small_orange_diamond':'\ud83d\udd38', - 'small_red_triangle':'\ud83d\udd3a', - 'small_red_triangle_down':'\ud83d\udd3b', - 'smile':'\ud83d\ude04', - 'smile_cat':'\ud83d\ude38', - 'smiley':'\ud83d\ude03', - 'smiley_cat':'\ud83d\ude3a', - 'smiling_imp':'\ud83d\ude08', - 'smirk':'\ud83d\ude0f', - 'smirk_cat':'\ud83d\ude3c', - 'smoking':'\ud83d\udeac', - 'snail':'\ud83d\udc0c', - 'snake':'\ud83d\udc0d', - 'sneezing_face':'\ud83e\udd27', - 'snowboarder':'\ud83c\udfc2', - 'snowflake':'\u2744\ufe0f', - 'snowman':'\u26c4\ufe0f', - 'snowman_with_snow':'\u2603\ufe0f', - 'sob':'\ud83d\ude2d', - 'soccer':'\u26bd\ufe0f', - 'soon':'\ud83d\udd1c', - 'sos':'\ud83c\udd98', - 'sound':'\ud83d\udd09', - 'space_invader':'\ud83d\udc7e', - 'spades':'\u2660\ufe0f', - 'spaghetti':'\ud83c\udf5d', - 'sparkle':'\u2747\ufe0f', - 'sparkler':'\ud83c\udf87', - 'sparkles':'\u2728', - 'sparkling_heart':'\ud83d\udc96', - 'speak_no_evil':'\ud83d\ude4a', - 'speaker':'\ud83d\udd08', - 'speaking_head':'\ud83d\udde3', - 'speech_balloon':'\ud83d\udcac', - 'speedboat':'\ud83d\udea4', - 'spider':'\ud83d\udd77', - 'spider_web':'\ud83d\udd78', - 'spiral_calendar':'\ud83d\uddd3', - 'spiral_notepad':'\ud83d\uddd2', - 'spoon':'\ud83e\udd44', - 'squid':'\ud83e\udd91', - 'stadium':'\ud83c\udfdf', - 'star':'\u2b50\ufe0f', - 'star2':'\ud83c\udf1f', - 'star_and_crescent':'\u262a\ufe0f', - 'star_of_david':'\u2721\ufe0f', - 'stars':'\ud83c\udf20', - 'station':'\ud83d\ude89', - 'statue_of_liberty':'\ud83d\uddfd', - 'steam_locomotive':'\ud83d\ude82', - 'stew':'\ud83c\udf72', - 'stop_button':'\u23f9', - 'stop_sign':'\ud83d\uded1', - 'stopwatch':'\u23f1', - 'straight_ruler':'\ud83d\udccf', - 'strawberry':'\ud83c\udf53', - 'stuck_out_tongue':'\ud83d\ude1b', - 'stuck_out_tongue_closed_eyes':'\ud83d\ude1d', - 'stuck_out_tongue_winking_eye':'\ud83d\ude1c', - 'studio_microphone':'\ud83c\udf99', - 'stuffed_flatbread':'\ud83e\udd59', - 'sun_behind_large_cloud':'\ud83c\udf25', - 'sun_behind_rain_cloud':'\ud83c\udf26', - 'sun_behind_small_cloud':'\ud83c\udf24', - 'sun_with_face':'\ud83c\udf1e', - 'sunflower':'\ud83c\udf3b', - 'sunglasses':'\ud83d\ude0e', - 'sunny':'\u2600\ufe0f', - 'sunrise':'\ud83c\udf05', - 'sunrise_over_mountains':'\ud83c\udf04', - 'surfing_man':'\ud83c\udfc4', - 'surfing_woman':'\ud83c\udfc4‍\u2640\ufe0f', - 'sushi':'\ud83c\udf63', - 'suspension_railway':'\ud83d\ude9f', - 'sweat':'\ud83d\ude13', - 'sweat_drops':'\ud83d\udca6', - 'sweat_smile':'\ud83d\ude05', - 'sweet_potato':'\ud83c\udf60', - 'swimming_man':'\ud83c\udfca', - 'swimming_woman':'\ud83c\udfca‍\u2640\ufe0f', - 'symbols':'\ud83d\udd23', - 'synagogue':'\ud83d\udd4d', - 'syringe':'\ud83d\udc89', - 'taco':'\ud83c\udf2e', - 'tada':'\ud83c\udf89', - 'tanabata_tree':'\ud83c\udf8b', - 'taurus':'\u2649\ufe0f', - 'taxi':'\ud83d\ude95', - 'tea':'\ud83c\udf75', - 'telephone_receiver':'\ud83d\udcde', - 'telescope':'\ud83d\udd2d', - 'tennis':'\ud83c\udfbe', - 'tent':'\u26fa\ufe0f', - 'thermometer':'\ud83c\udf21', - 'thinking':'\ud83e\udd14', - 'thought_balloon':'\ud83d\udcad', - 'ticket':'\ud83c\udfab', - 'tickets':'\ud83c\udf9f', - 'tiger':'\ud83d\udc2f', - 'tiger2':'\ud83d\udc05', - 'timer_clock':'\u23f2', - 'tipping_hand_man':'\ud83d\udc81‍\u2642\ufe0f', - 'tired_face':'\ud83d\ude2b', - 'tm':'\u2122\ufe0f', - 'toilet':'\ud83d\udebd', - 'tokyo_tower':'\ud83d\uddfc', - 'tomato':'\ud83c\udf45', - 'tongue':'\ud83d\udc45', - 'top':'\ud83d\udd1d', - 'tophat':'\ud83c\udfa9', - 'tornado':'\ud83c\udf2a', - 'trackball':'\ud83d\uddb2', - 'tractor':'\ud83d\ude9c', - 'traffic_light':'\ud83d\udea5', - 'train':'\ud83d\ude8b', - 'train2':'\ud83d\ude86', - 'tram':'\ud83d\ude8a', - 'triangular_flag_on_post':'\ud83d\udea9', - 'triangular_ruler':'\ud83d\udcd0', - 'trident':'\ud83d\udd31', - 'triumph':'\ud83d\ude24', - 'trolleybus':'\ud83d\ude8e', - 'trophy':'\ud83c\udfc6', - 'tropical_drink':'\ud83c\udf79', - 'tropical_fish':'\ud83d\udc20', - 'truck':'\ud83d\ude9a', - 'trumpet':'\ud83c\udfba', - 'tulip':'\ud83c\udf37', - 'tumbler_glass':'\ud83e\udd43', - 'turkey':'\ud83e\udd83', - 'turtle':'\ud83d\udc22', - 'tv':'\ud83d\udcfa', - 'twisted_rightwards_arrows':'\ud83d\udd00', - 'two_hearts':'\ud83d\udc95', - 'two_men_holding_hands':'\ud83d\udc6c', - 'two_women_holding_hands':'\ud83d\udc6d', - 'u5272':'\ud83c\ude39', - 'u5408':'\ud83c\ude34', - 'u55b6':'\ud83c\ude3a', - 'u6307':'\ud83c\ude2f\ufe0f', - 'u6708':'\ud83c\ude37\ufe0f', - 'u6709':'\ud83c\ude36', - 'u6e80':'\ud83c\ude35', - 'u7121':'\ud83c\ude1a\ufe0f', - 'u7533':'\ud83c\ude38', - 'u7981':'\ud83c\ude32', - 'u7a7a':'\ud83c\ude33', - 'umbrella':'\u2614\ufe0f', - 'unamused':'\ud83d\ude12', - 'underage':'\ud83d\udd1e', - 'unicorn':'\ud83e\udd84', - 'unlock':'\ud83d\udd13', - 'up':'\ud83c\udd99', - 'upside_down_face':'\ud83d\ude43', - 'v':'\u270c\ufe0f', - 'vertical_traffic_light':'\ud83d\udea6', - 'vhs':'\ud83d\udcfc', - 'vibration_mode':'\ud83d\udcf3', - 'video_camera':'\ud83d\udcf9', - 'video_game':'\ud83c\udfae', - 'violin':'\ud83c\udfbb', - 'virgo':'\u264d\ufe0f', - 'volcano':'\ud83c\udf0b', - 'volleyball':'\ud83c\udfd0', - 'vs':'\ud83c\udd9a', - 'vulcan_salute':'\ud83d\udd96', - 'walking_man':'\ud83d\udeb6', - 'walking_woman':'\ud83d\udeb6‍\u2640\ufe0f', - 'waning_crescent_moon':'\ud83c\udf18', - 'waning_gibbous_moon':'\ud83c\udf16', - 'warning':'\u26a0\ufe0f', - 'wastebasket':'\ud83d\uddd1', - 'watch':'\u231a\ufe0f', - 'water_buffalo':'\ud83d\udc03', - 'watermelon':'\ud83c\udf49', - 'wave':'\ud83d\udc4b', - 'wavy_dash':'\u3030\ufe0f', - 'waxing_crescent_moon':'\ud83c\udf12', - 'wc':'\ud83d\udebe', - 'weary':'\ud83d\ude29', - 'wedding':'\ud83d\udc92', - 'weight_lifting_man':'\ud83c\udfcb\ufe0f', - 'weight_lifting_woman':'\ud83c\udfcb\ufe0f‍\u2640\ufe0f', - 'whale':'\ud83d\udc33', - 'whale2':'\ud83d\udc0b', - 'wheel_of_dharma':'\u2638\ufe0f', - 'wheelchair':'\u267f\ufe0f', - 'white_check_mark':'\u2705', - 'white_circle':'\u26aa\ufe0f', - 'white_flag':'\ud83c\udff3\ufe0f', - 'white_flower':'\ud83d\udcae', - 'white_large_square':'\u2b1c\ufe0f', - 'white_medium_small_square':'\u25fd\ufe0f', - 'white_medium_square':'\u25fb\ufe0f', - 'white_small_square':'\u25ab\ufe0f', - 'white_square_button':'\ud83d\udd33', - 'wilted_flower':'\ud83e\udd40', - 'wind_chime':'\ud83c\udf90', - 'wind_face':'\ud83c\udf2c', - 'wine_glass':'\ud83c\udf77', - 'wink':'\ud83d\ude09', - 'wolf':'\ud83d\udc3a', - 'woman':'\ud83d\udc69', - 'woman_artist':'\ud83d\udc69‍\ud83c\udfa8', - 'woman_astronaut':'\ud83d\udc69‍\ud83d\ude80', - 'woman_cartwheeling':'\ud83e\udd38‍\u2640\ufe0f', - 'woman_cook':'\ud83d\udc69‍\ud83c\udf73', - 'woman_facepalming':'\ud83e\udd26‍\u2640\ufe0f', - 'woman_factory_worker':'\ud83d\udc69‍\ud83c\udfed', - 'woman_farmer':'\ud83d\udc69‍\ud83c\udf3e', - 'woman_firefighter':'\ud83d\udc69‍\ud83d\ude92', - 'woman_health_worker':'\ud83d\udc69‍\u2695\ufe0f', - 'woman_judge':'\ud83d\udc69‍\u2696\ufe0f', - 'woman_juggling':'\ud83e\udd39‍\u2640\ufe0f', - 'woman_mechanic':'\ud83d\udc69‍\ud83d\udd27', - 'woman_office_worker':'\ud83d\udc69‍\ud83d\udcbc', - 'woman_pilot':'\ud83d\udc69‍\u2708\ufe0f', - 'woman_playing_handball':'\ud83e\udd3e‍\u2640\ufe0f', - 'woman_playing_water_polo':'\ud83e\udd3d‍\u2640\ufe0f', - 'woman_scientist':'\ud83d\udc69‍\ud83d\udd2c', - 'woman_shrugging':'\ud83e\udd37‍\u2640\ufe0f', - 'woman_singer':'\ud83d\udc69‍\ud83c\udfa4', - 'woman_student':'\ud83d\udc69‍\ud83c\udf93', - 'woman_teacher':'\ud83d\udc69‍\ud83c\udfeb', - 'woman_technologist':'\ud83d\udc69‍\ud83d\udcbb', - 'woman_with_turban':'\ud83d\udc73‍\u2640\ufe0f', - 'womans_clothes':'\ud83d\udc5a', - 'womans_hat':'\ud83d\udc52', - 'women_wrestling':'\ud83e\udd3c‍\u2640\ufe0f', - 'womens':'\ud83d\udeba', - 'world_map':'\ud83d\uddfa', - 'worried':'\ud83d\ude1f', - 'wrench':'\ud83d\udd27', - 'writing_hand':'\u270d\ufe0f', - 'x':'\u274c', - 'yellow_heart':'\ud83d\udc9b', - 'yen':'\ud83d\udcb4', - 'yin_yang':'\u262f\ufe0f', - 'yum':'\ud83d\ude0b', - 'zap':'\u26a1\ufe0f', - 'zipper_mouth_face':'\ud83e\udd10', - 'zzz':'\ud83d\udca4', - - /* special emojis :P */ - 'octocat': '', - 'showdown': '' -}; - -/** - * Created by Estevao on 31-05-2015. - */ - -/** - * Showdown Converter class - * @class - * @param {object} [converterOptions] - * @returns {Converter} - */ -showdown.Converter = function (converterOptions) { - 'use strict'; - - var - /** - * Options used by this converter - * @private - * @type {{}} - */ - options = {}, - - /** - * Language extensions used by this converter - * @private - * @type {Array} - */ - langExtensions = [], - - /** - * Output modifiers extensions used by this converter - * @private - * @type {Array} - */ - outputModifiers = [], - - /** - * Event listeners - * @private - * @type {{}} - */ - listeners = {}, - - /** - * The flavor set in this converter - */ - setConvFlavor = setFlavor, - - /** - * Metadata of the document - * @type {{parsed: {}, raw: string, format: string}} - */ - metadata = { - parsed: {}, - raw: '', - format: '' - }; - - _constructor(); - - /** - * Converter constructor - * @private - */ - function _constructor () { - converterOptions = converterOptions || {}; - - for (var gOpt in globalOptions) { - if (globalOptions.hasOwnProperty(gOpt)) { - options[gOpt] = globalOptions[gOpt]; - } - } - - // Merge options - if (typeof converterOptions === 'object') { - for (var opt in converterOptions) { - if (converterOptions.hasOwnProperty(opt)) { - options[opt] = converterOptions[opt]; - } - } - } else { - throw Error('Converter expects the passed parameter to be an object, but ' + typeof converterOptions + - ' was passed instead.'); - } - - if (options.extensions) { - showdown.helper.forEach(options.extensions, _parseExtension); - } - } - - /** - * Parse extension - * @param {*} ext - * @param {string} [name=''] - * @private - */ - function _parseExtension (ext, name) { - - name = name || null; - // If it's a string, the extension was previously loaded - if (showdown.helper.isString(ext)) { - ext = showdown.helper.stdExtName(ext); - name = ext; - - // LEGACY_SUPPORT CODE - if (showdown.extensions[ext]) { - console.warn('DEPRECATION WARNING: ' + ext + ' is an old extension that uses a deprecated loading method.' + - 'Please inform the developer that the extension should be updated!'); - legacyExtensionLoading(showdown.extensions[ext], ext); - return; - // END LEGACY SUPPORT CODE - - } else if (!showdown.helper.isUndefined(extensions[ext])) { - ext = extensions[ext]; - - } else { - throw Error('Extension "' + ext + '" could not be loaded. It was either not found or is not a valid extension.'); - } - } - - if (typeof ext === 'function') { - ext = ext(); - } - - if (!showdown.helper.isArray(ext)) { - ext = [ext]; - } - - var validExt = validate(ext, name); - if (!validExt.valid) { - throw Error(validExt.error); - } - - for (var i = 0; i < ext.length; ++i) { - switch (ext[i].type) { - - case 'lang': - langExtensions.push(ext[i]); - break; - - case 'output': - outputModifiers.push(ext[i]); - break; - } - if (ext[i].hasOwnProperty('listeners')) { - for (var ln in ext[i].listeners) { - if (ext[i].listeners.hasOwnProperty(ln)) { - listen(ln, ext[i].listeners[ln]); - } - } - } - } - - } - - /** - * LEGACY_SUPPORT - * @param {*} ext - * @param {string} name - */ - function legacyExtensionLoading (ext, name) { - if (typeof ext === 'function') { - ext = ext(new showdown.Converter()); - } - if (!showdown.helper.isArray(ext)) { - ext = [ext]; - } - var valid = validate(ext, name); - - if (!valid.valid) { - throw Error(valid.error); - } - - for (var i = 0; i < ext.length; ++i) { - switch (ext[i].type) { - case 'lang': - langExtensions.push(ext[i]); - break; - case 'output': - outputModifiers.push(ext[i]); - break; - default:// should never reach here - throw Error('Extension loader error: Type unrecognized!!!'); - } - } - } - - /** - * Listen to an event - * @param {string} name - * @param {function} callback - */ - function listen (name, callback) { - if (!showdown.helper.isString(name)) { - throw Error('Invalid argument in converter.listen() method: name must be a string, but ' + typeof name + ' given'); - } - - if (typeof callback !== 'function') { - throw Error('Invalid argument in converter.listen() method: callback must be a function, but ' + typeof callback + ' given'); - } - - if (!listeners.hasOwnProperty(name)) { - listeners[name] = []; - } - listeners[name].push(callback); - } - - function rTrimInputText (text) { - var rsp = text.match(/^\s*/)[0].length, - rgx = new RegExp('^\\s{0,' + rsp + '}', 'gm'); - return text.replace(rgx, ''); - } - - /** - * Dispatch an event - * @private - * @param {string} evtName Event name - * @param {string} text Text - * @param {{}} options Converter Options - * @param {{}} globals - * @returns {string} - */ - this._dispatch = function dispatch (evtName, text, options, globals) { - if (listeners.hasOwnProperty(evtName)) { - for (var ei = 0; ei < listeners[evtName].length; ++ei) { - var nText = listeners[evtName][ei](evtName, text, this, options, globals); - if (nText && typeof nText !== 'undefined') { - text = nText; - } - } - } - return text; - }; - - /** - * Listen to an event - * @param {string} name - * @param {function} callback - * @returns {showdown.Converter} - */ - this.listen = function (name, callback) { - listen(name, callback); - return this; - }; - - /** - * Converts a markdown string into HTML - * @param {string} text - * @returns {*} - */ - this.makeHtml = function (text) { - //check if text is not falsy - if (!text) { - return text; - } - - var globals = { - gHtmlBlocks: [], - gHtmlMdBlocks: [], - gHtmlSpans: [], - gUrls: {}, - gTitles: {}, - gDimensions: {}, - gListLevel: 0, - hashLinkCounts: {}, - langExtensions: langExtensions, - outputModifiers: outputModifiers, - converter: this, - ghCodeBlocks: [], - metadata: { - parsed: {}, - raw: '', - format: '' - } - }; - - // This lets us use ¨ trema as an escape char to avoid md5 hashes - // The choice of character is arbitrary; anything that isn't - // magic in Markdown will work. - text = text.replace(/¨/g, '¨T'); - - // Replace $ with ¨D - // RegExp interprets $ as a special character - // when it's in a replacement string - text = text.replace(/\$/g, '¨D'); - - // Standardize line endings - text = text.replace(/\r\n/g, '\n'); // DOS to Unix - text = text.replace(/\r/g, '\n'); // Mac to Unix - - // Stardardize line spaces (nbsp causes trouble in older browsers and some regex flavors) - text = text.replace(/\u00A0/g, ' '); - - if (options.smartIndentationFix) { - text = rTrimInputText(text); - } - - // Make sure text begins and ends with a couple of newlines: - text = '\n\n' + text + '\n\n'; - - // detab - text = showdown.subParser('detab')(text, options, globals); - - /** - * Strip any lines consisting only of spaces and tabs. - * This makes subsequent regexs easier to write, because we can - * match consecutive blank lines with /\n+/ instead of something - * contorted like /[ \t]*\n+/ - */ - text = text.replace(/^[ \t]+$/mg, ''); - - //run languageExtensions - showdown.helper.forEach(langExtensions, function (ext) { - text = showdown.subParser('runExtension')(ext, text, options, globals); - }); - - // run the sub parsers - text = showdown.subParser('metadata')(text, options, globals); - text = showdown.subParser('hashPreCodeTags')(text, options, globals); - text = showdown.subParser('githubCodeBlocks')(text, options, globals); - text = showdown.subParser('hashHTMLBlocks')(text, options, globals); - text = showdown.subParser('hashCodeTags')(text, options, globals); - text = showdown.subParser('stripLinkDefinitions')(text, options, globals); - text = showdown.subParser('blockGamut')(text, options, globals); - text = showdown.subParser('unhashHTMLSpans')(text, options, globals); - text = showdown.subParser('unescapeSpecialChars')(text, options, globals); - - // attacklab: Restore dollar signs - text = text.replace(/¨D/g, '$$'); - - // attacklab: Restore tremas - text = text.replace(/¨T/g, '¨'); - - // render a complete html document instead of a partial if the option is enabled - text = showdown.subParser('completeHTMLDocument')(text, options, globals); - - // Run output modifiers - showdown.helper.forEach(outputModifiers, function (ext) { - text = showdown.subParser('runExtension')(ext, text, options, globals); - }); - - // update metadata - metadata = globals.metadata; - return text; - }; - - /** - * Set an option of this Converter instance - * @param {string} key - * @param {*} value - */ - this.setOption = function (key, value) { - options[key] = value; - }; - - /** - * Get the option of this Converter instance - * @param {string} key - * @returns {*} - */ - this.getOption = function (key) { - return options[key]; - }; - - /** - * Get the options of this Converter instance - * @returns {{}} - */ - this.getOptions = function () { - return options; - }; - - /** - * Add extension to THIS converter - * @param {{}} extension - * @param {string} [name=null] - */ - this.addExtension = function (extension, name) { - name = name || null; - _parseExtension(extension, name); - }; - - /** - * Use a global registered extension with THIS converter - * @param {string} extensionName Name of the previously registered extension - */ - this.useExtension = function (extensionName) { - _parseExtension(extensionName); - }; - - /** - * Set the flavor THIS converter should use - * @param {string} name - */ - this.setFlavor = function (name) { - if (!flavor.hasOwnProperty(name)) { - throw Error(name + ' flavor was not found'); - } - var preset = flavor[name]; - setConvFlavor = name; - for (var option in preset) { - if (preset.hasOwnProperty(option)) { - options[option] = preset[option]; - } - } - }; - - /** - * Get the currently set flavor of this converter - * @returns {string} - */ - this.getFlavor = function () { - return setConvFlavor; - }; - - /** - * Remove an extension from THIS converter. - * Note: This is a costly operation. It's better to initialize a new converter - * and specify the extensions you wish to use - * @param {Array} extension - */ - this.removeExtension = function (extension) { - if (!showdown.helper.isArray(extension)) { - extension = [extension]; - } - for (var a = 0; a < extension.length; ++a) { - var ext = extension[a]; - for (var i = 0; i < langExtensions.length; ++i) { - if (langExtensions[i] === ext) { - langExtensions[i].splice(i, 1); - } - } - for (var ii = 0; ii < outputModifiers.length; ++i) { - if (outputModifiers[ii] === ext) { - outputModifiers[ii].splice(i, 1); - } - } - } - }; - - /** - * Get all extension of THIS converter - * @returns {{language: Array, output: Array}} - */ - this.getAllExtensions = function () { - return { - language: langExtensions, - output: outputModifiers - }; - }; - - /** - * Get the metadata of the previously parsed document - * @param raw - * @returns {string|{}} - */ - this.getMetadata = function (raw) { - if (raw) { - return metadata.raw; - } else { - return metadata.parsed; - } - }; - - /** - * Get the metadata format of the previously parsed document - * @returns {string} - */ - this.getMetadataFormat = function () { - return metadata.format; - }; - - /** - * Private: set a single key, value metadata pair - * @param {string} key - * @param {string} value - */ - this._setMetadataPair = function (key, value) { - metadata.parsed[key] = value; - }; - - /** - * Private: set metadata format - * @param {string} format - */ - this._setMetadataFormat = function (format) { - metadata.format = format; - }; - - /** - * Private: set metadata raw text - * @param {string} raw - */ - this._setMetadataRaw = function (raw) { - metadata.raw = raw; - }; -}; - -/** - * Turn Markdown link shortcuts into XHTML tags. - */ -showdown.subParser('anchors', function (text, options, globals) { - 'use strict'; - - text = globals.converter._dispatch('anchors.before', text, options, globals); - - var writeAnchorTag = function (wholeMatch, linkText, linkId, url, m5, m6, title) { - if (showdown.helper.isUndefined(title)) { - title = ''; - } - linkId = linkId.toLowerCase(); - - // Special case for explicit empty url - if (wholeMatch.search(/\(? ?(['"].*['"])?\)$/m) > -1) { - url = ''; - } else if (!url) { - if (!linkId) { - // lower-case and turn embedded newlines into spaces - linkId = linkText.toLowerCase().replace(/ ?\n/g, ' '); - } - url = '#' + linkId; - - if (!showdown.helper.isUndefined(globals.gUrls[linkId])) { - url = globals.gUrls[linkId]; - if (!showdown.helper.isUndefined(globals.gTitles[linkId])) { - title = globals.gTitles[linkId]; - } - } else { - return wholeMatch; - } - } - - //url = showdown.helper.escapeCharacters(url, '*_', false); // replaced line to improve performance - url = url.replace(showdown.helper.regexes.asteriskDashAndColon, showdown.helper.escapeCharactersCallback); - - var result = ''; - - return result; - }; - - // First, handle reference-style links: [link text] [id] - text = text.replace(/\[((?:\[[^\]]*]|[^\[\]])*)] ?(?:\n *)?\[(.*?)]()()()()/g, writeAnchorTag); - - // Next, inline-style links: [link text](url "optional title") - // cases with crazy urls like ./image/cat1).png - text = text.replace(/\[((?:\[[^\]]*]|[^\[\]])*)]()[ \t]*\([ \t]?<([^>]*)>(?:[ \t]*((["'])([^"]*?)\5))?[ \t]?\)/g, - writeAnchorTag); - - // normal cases - text = text.replace(/\[((?:\[[^\]]*]|[^\[\]])*)]()[ \t]*\([ \t]??(?:[ \t]*((["'])([^"]*?)\5))?[ \t]?\)/g, - writeAnchorTag); - - // handle reference-style shortcuts: [link text] - // These must come last in case you've also got [link test][1] - // or [link test](/foo) - text = text.replace(/\[([^\[\]]+)]()()()()()/g, writeAnchorTag); - - // Lastly handle GithubMentions if option is enabled - if (options.ghMentions) { - text = text.replace(/(^|\s)(\\)?(@([a-z\d\-]+))(?=[.!?;,[\]()]|\s|$)/gmi, function (wm, st, escape, mentions, username) { - if (escape === '\\') { - return st + mentions; - } - - //check if options.ghMentionsLink is a string - if (!showdown.helper.isString(options.ghMentionsLink)) { - throw new Error('ghMentionsLink option must be a string'); - } - var lnk = options.ghMentionsLink.replace(/\{u}/g, username), - target = ''; - if (options.openLinksInNewWindow) { - target = ' target="¨E95Eblank"'; - } - return st + '' + mentions + ''; - }); - } - - text = globals.converter._dispatch('anchors.after', text, options, globals); - return text; -}); - -// url allowed chars [a-z\d_.~:/?#[]@!$&'()*+,;=-] - -var simpleURLRegex = /([*~_]+|\b)(((https?|ftp|dict):\/\/|www\.)[^'">\s]+?\.[^'">\s]+?)()(\1)?(?=\s|$)(?!["<>])/gi, - simpleURLRegex2 = /([*~_]+|\b)(((https?|ftp|dict):\/\/|www\.)[^'">\s]+\.[^'">\s]+?)([.!?,()\[\]])?(\1)?(?=\s|$)(?!["<>])/gi, - delimUrlRegex = /()<(((https?|ftp|dict):\/\/|www\.)[^'">\s]+)()>()/gi, - simpleMailRegex = /(^|\s)(?:mailto:)?([A-Za-z0-9!#$%&'*+-/=?^_`{|}~.]+@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)(?=$|\s)/gmi, - delimMailRegex = /<()(?:mailto:)?([-.\w]+@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi, - - replaceLink = function (options) { - 'use strict'; - return function (wm, leadingMagicChars, link, m2, m3, trailingPunctuation, trailingMagicChars) { - link = link.replace(showdown.helper.regexes.asteriskDashAndColon, showdown.helper.escapeCharactersCallback); - var lnkTxt = link, - append = '', - target = '', - lmc = leadingMagicChars || '', - tmc = trailingMagicChars || ''; - if (/^www\./i.test(link)) { - link = link.replace(/^www\./i, 'http://www.'); - } - if (options.excludeTrailingPunctuationFromURLs && trailingPunctuation) { - append = trailingPunctuation; - } - if (options.openLinksInNewWindow) { - target = ' target="¨E95Eblank"'; - } - return lmc + '' + lnkTxt + '' + append + tmc; - }; - }, - - replaceMail = function (options, globals) { - 'use strict'; - return function (wholeMatch, b, mail) { - var href = 'mailto:'; - b = b || ''; - mail = showdown.subParser('unescapeSpecialChars')(mail, options, globals); - if (options.encodeEmails) { - href = showdown.helper.encodeEmailAddress(href + mail); - mail = showdown.helper.encodeEmailAddress(mail); - } else { - href = href + mail; - } - return b + '' + mail + ''; - }; - }; - -showdown.subParser('autoLinks', function (text, options, globals) { - 'use strict'; - - text = globals.converter._dispatch('autoLinks.before', text, options, globals); - - text = text.replace(delimUrlRegex, replaceLink(options)); - text = text.replace(delimMailRegex, replaceMail(options, globals)); - - text = globals.converter._dispatch('autoLinks.after', text, options, globals); - - return text; -}); - -showdown.subParser('simplifiedAutoLinks', function (text, options, globals) { - 'use strict'; - - if (!options.simplifiedAutoLink) { - return text; - } - - text = globals.converter._dispatch('simplifiedAutoLinks.before', text, options, globals); - - if (options.excludeTrailingPunctuationFromURLs) { - text = text.replace(simpleURLRegex2, replaceLink(options)); - } else { - text = text.replace(simpleURLRegex, replaceLink(options)); - } - text = text.replace(simpleMailRegex, replaceMail(options, globals)); - - text = globals.converter._dispatch('simplifiedAutoLinks.after', text, options, globals); - - return text; -}); - -/** - * These are all the transformations that form block-level - * tags like paragraphs, headers, and list items. - */ -showdown.subParser('blockGamut', function (text, options, globals) { - 'use strict'; - - text = globals.converter._dispatch('blockGamut.before', text, options, globals); - - // we parse blockquotes first so that we can have headings and hrs - // inside blockquotes - text = showdown.subParser('blockQuotes')(text, options, globals); - text = showdown.subParser('headers')(text, options, globals); - - // Do Horizontal Rules: - text = showdown.subParser('horizontalRule')(text, options, globals); - - text = showdown.subParser('lists')(text, options, globals); - text = showdown.subParser('codeBlocks')(text, options, globals); - text = showdown.subParser('tables')(text, options, globals); - - // We already ran _HashHTMLBlocks() before, in Markdown(), but that - // was to escape raw HTML in the original Markdown source. This time, - // we're escaping the markup we've just created, so that we don't wrap - //

tags around block-level tags. - text = showdown.subParser('hashHTMLBlocks')(text, options, globals); - text = showdown.subParser('paragraphs')(text, options, globals); - - text = globals.converter._dispatch('blockGamut.after', text, options, globals); - - return text; -}); - -showdown.subParser('blockQuotes', function (text, options, globals) { - 'use strict'; - - text = globals.converter._dispatch('blockQuotes.before', text, options, globals); - - // add a couple extra lines after the text and endtext mark - text = text + '\n\n'; - - var rgx = /(^ {0,3}>[ \t]?.+\n(.+\n)*\n*)+/gm; - - if (options.splitAdjacentBlockquotes) { - rgx = /^ {0,3}>[\s\S]*?(?:\n\n)/gm; - } - - text = text.replace(rgx, function (bq) { - // attacklab: hack around Konqueror 3.5.4 bug: - // "----------bug".replace(/^-/g,"") == "bug" - bq = bq.replace(/^[ \t]*>[ \t]?/gm, ''); // trim one level of quoting - - // attacklab: clean up hack - bq = bq.replace(/¨0/g, ''); - - bq = bq.replace(/^[ \t]+$/gm, ''); // trim whitespace-only lines - bq = showdown.subParser('githubCodeBlocks')(bq, options, globals); - bq = showdown.subParser('blockGamut')(bq, options, globals); // recurse - - bq = bq.replace(/(^|\n)/g, '$1 '); - // These leading spaces screw with

 content, so we need to fix that:
-    bq = bq.replace(/(\s*
[^\r]+?<\/pre>)/gm, function (wholeMatch, m1) {
-      var pre = m1;
-      // attacklab: hack around Konqueror 3.5.4 bug:
-      pre = pre.replace(/^  /mg, '¨0');
-      pre = pre.replace(/¨0/g, '');
-      return pre;
-    });
-
-    return showdown.subParser('hashBlock')('
\n' + bq + '\n
', options, globals); - }); - - text = globals.converter._dispatch('blockQuotes.after', text, options, globals); - return text; -}); - -/** - * Process Markdown `
` blocks.
- */
-showdown.subParser('codeBlocks', function (text, options, globals) {
-  'use strict';
-
-  text = globals.converter._dispatch('codeBlocks.before', text, options, globals);
-
-  // sentinel workarounds for lack of \A and \Z, safari\khtml bug
-  text += '¨0';
-
-  var pattern = /(?:\n\n|^)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=¨0))/g;
-  text = text.replace(pattern, function (wholeMatch, m1, m2) {
-    var codeblock = m1,
-        nextChar = m2,
-        end = '\n';
-
-    codeblock = showdown.subParser('outdent')(codeblock, options, globals);
-    codeblock = showdown.subParser('encodeCode')(codeblock, options, globals);
-    codeblock = showdown.subParser('detab')(codeblock, options, globals);
-    codeblock = codeblock.replace(/^\n+/g, ''); // trim leading newlines
-    codeblock = codeblock.replace(/\n+$/g, ''); // trim trailing newlines
-
-    if (options.omitExtraWLInCodeBlocks) {
-      end = '';
-    }
-
-    codeblock = '
' + codeblock + end + '
'; - - return showdown.subParser('hashBlock')(codeblock, options, globals) + nextChar; - }); - - // strip sentinel - text = text.replace(/¨0/, ''); - - text = globals.converter._dispatch('codeBlocks.after', text, options, globals); - return text; -}); - -/** - * - * * Backtick quotes are used for spans. - * - * * You can use multiple backticks as the delimiters if you want to - * include literal backticks in the code span. So, this input: - * - * Just type ``foo `bar` baz`` at the prompt. - * - * Will translate to: - * - *

Just type foo `bar` baz at the prompt.

- * - * There's no arbitrary limit to the number of backticks you - * can use as delimters. If you need three consecutive backticks - * in your code, use four for delimiters, etc. - * - * * You can use spaces to get literal backticks at the edges: - * - * ... type `` `bar` `` ... - * - * Turns to: - * - * ... type `bar` ... - */ -showdown.subParser('codeSpans', function (text, options, globals) { - 'use strict'; - - text = globals.converter._dispatch('codeSpans.before', text, options, globals); - - if (typeof(text) === 'undefined') { - text = ''; - } - text = text.replace(/(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/gm, - function (wholeMatch, m1, m2, m3) { - var c = m3; - c = c.replace(/^([ \t]*)/g, ''); // leading whitespace - c = c.replace(/[ \t]*$/g, ''); // trailing whitespace - c = showdown.subParser('encodeCode')(c, options, globals); - c = m1 + '' + c + ''; - c = showdown.subParser('hashHTMLSpans')(c, options, globals); - return c; - } - ); - - text = globals.converter._dispatch('codeSpans.after', text, options, globals); - return text; -}); - -/** - * Turn Markdown link shortcuts into XHTML tags. - */ -showdown.subParser('completeHTMLDocument', function (text, options, globals) { - 'use strict'; - - if (!options.completeHTMLDocument) { - return text; - } - - text = globals.converter._dispatch('completeHTMLDocument.before', text, options, globals); - - var doctype = 'html', - doctypeParsed = '\n', - title = '', - charset = '\n', - lang = '', - metadata = ''; - - if (typeof globals.metadata.parsed.doctype !== 'undefined') { - doctypeParsed = '\n'; - doctype = globals.metadata.parsed.doctype.toString().toLowerCase(); - if (doctype === 'html' || doctype === 'html5') { - charset = ''; - } - } - - for (var meta in globals.metadata.parsed) { - if (globals.metadata.parsed.hasOwnProperty(meta)) { - switch (meta.toLowerCase()) { - case 'doctype': - break; - - case 'title': - title = '' + globals.metadata.parsed.title + '\n'; - break; - - case 'charset': - if (doctype === 'html' || doctype === 'html5') { - charset = '\n'; - } else { - charset = '\n'; - } - break; - - case 'language': - case 'lang': - lang = ' lang="' + globals.metadata.parsed[meta] + '"'; - metadata += '\n'; - break; - - default: - metadata += '\n'; - } - } - } - - text = doctypeParsed + '\n\n' + title + charset + metadata + '\n\n' + text.trim() + '\n\n'; - - text = globals.converter._dispatch('completeHTMLDocument.after', text, options, globals); - return text; -}); - -/** - * Convert all tabs to spaces - */ -showdown.subParser('detab', function (text, options, globals) { - 'use strict'; - text = globals.converter._dispatch('detab.before', text, options, globals); - - // expand first n-1 tabs - text = text.replace(/\t(?=\t)/g, ' '); // g_tab_width - - // replace the nth with two sentinels - text = text.replace(/\t/g, '¨A¨B'); - - // use the sentinel to anchor our regex so it doesn't explode - text = text.replace(/¨B(.+?)¨A/g, function (wholeMatch, m1) { - var leadingText = m1, - numSpaces = 4 - leadingText.length % 4; // g_tab_width - - // there *must* be a better way to do this: - for (var i = 0; i < numSpaces; i++) { - leadingText += ' '; - } - - return leadingText; - }); - - // clean up sentinels - text = text.replace(/¨A/g, ' '); // g_tab_width - text = text.replace(/¨B/g, ''); - - text = globals.converter._dispatch('detab.after', text, options, globals); - return text; -}); - -showdown.subParser('ellipsis', function (text, options, globals) { - 'use strict'; - - text = globals.converter._dispatch('ellipsis.before', text, options, globals); - - text = text.replace(/\.\.\./g, '…'); - - text = globals.converter._dispatch('ellipsis.after', text, options, globals); - - return text; -}); - -/** - * These are all the transformations that occur *within* block-level - * tags like paragraphs, headers, and list items. - */ -showdown.subParser('emoji', function (text, options, globals) { - 'use strict'; - - if (!options.emoji) { - return text; - } - - text = globals.converter._dispatch('emoji.before', text, options, globals); - - var emojiRgx = /:([\S]+?):/g; - - text = text.replace(emojiRgx, function (wm, emojiCode) { - if (showdown.helper.emojis.hasOwnProperty(emojiCode)) { - return showdown.helper.emojis[emojiCode]; - } - return wm; - }); - - text = globals.converter._dispatch('emoji.after', text, options, globals); - - return text; -}); - -/** - * Smart processing for ampersands and angle brackets that need to be encoded. - */ -showdown.subParser('encodeAmpsAndAngles', function (text, options, globals) { - 'use strict'; - text = globals.converter._dispatch('encodeAmpsAndAngles.before', text, options, globals); - - // Ampersand-encoding based entirely on Nat Irons's Amputator MT plugin: - // http://bumppo.net/projects/amputator/ - text = text.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/g, '&'); - - // Encode naked <'s - text = text.replace(/<(?![a-z\/?$!])/gi, '<'); - - // Encode < - text = text.replace(/ - text = text.replace(/>/g, '>'); - - text = globals.converter._dispatch('encodeAmpsAndAngles.after', text, options, globals); - return text; -}); - -/** - * Returns the string, with after processing the following backslash escape sequences. - * - * attacklab: The polite way to do this is with the new escapeCharacters() function: - * - * text = escapeCharacters(text,"\\",true); - * text = escapeCharacters(text,"`*_{}[]()>#+-.!",true); - * - * ...but we're sidestepping its use of the (slow) RegExp constructor - * as an optimization for Firefox. This function gets called a LOT. - */ -showdown.subParser('encodeBackslashEscapes', function (text, options, globals) { - 'use strict'; - text = globals.converter._dispatch('encodeBackslashEscapes.before', text, options, globals); - - text = text.replace(/\\(\\)/g, showdown.helper.escapeCharactersCallback); - text = text.replace(/\\([`*_{}\[\]()>#+.!~=|-])/g, showdown.helper.escapeCharactersCallback); - - text = globals.converter._dispatch('encodeBackslashEscapes.after', text, options, globals); - return text; -}); - -/** - * Encode/escape certain characters inside Markdown code runs. - * The point is that in code, these characters are literals, - * and lose their special Markdown meanings. - */ -showdown.subParser('encodeCode', function (text, options, globals) { - 'use strict'; - - text = globals.converter._dispatch('encodeCode.before', text, options, globals); - - // Encode all ampersands; HTML entities are not - // entities within a Markdown code span. - text = text - .replace(/&/g, '&') - // Do the angle bracket song and dance: - .replace(//g, '>') - // Now, escape characters that are magic in Markdown: - .replace(/([*_{}\[\]\\=~-])/g, showdown.helper.escapeCharactersCallback); - - text = globals.converter._dispatch('encodeCode.after', text, options, globals); - return text; -}); - -/** - * Within tags -- meaning between < and > -- encode [\ ` * _ ~ =] so they - * don't conflict with their use in Markdown for code, italics and strong. - */ -showdown.subParser('escapeSpecialCharsWithinTagAttributes', function (text, options, globals) { - 'use strict'; - text = globals.converter._dispatch('escapeSpecialCharsWithinTagAttributes.before', text, options, globals); - - // Build a regex to find HTML tags. - var tags = /<\/?[a-z\d_:-]+(?:[\s]+[\s\S]+?)?>/gi, - comments = /-]|-[^>])(?:[^-]|-[^-])*)--)>/gi; - - text = text.replace(tags, function (wholeMatch) { - return wholeMatch - .replace(/(.)<\/?code>(?=.)/g, '$1`') - .replace(/([\\`*_~=|])/g, showdown.helper.escapeCharactersCallback); - }); - - text = text.replace(comments, function (wholeMatch) { - return wholeMatch - .replace(/([\\`*_~=|])/g, showdown.helper.escapeCharactersCallback); - }); - - text = globals.converter._dispatch('escapeSpecialCharsWithinTagAttributes.after', text, options, globals); - return text; -}); - -/** - * Handle github codeblocks prior to running HashHTML so that - * HTML contained within the codeblock gets escaped properly - * Example: - * ```ruby - * def hello_world(x) - * puts "Hello, #{x}" - * end - * ``` - */ -showdown.subParser('githubCodeBlocks', function (text, options, globals) { - 'use strict'; - - // early exit if option is not enabled - if (!options.ghCodeBlocks) { - return text; - } - - text = globals.converter._dispatch('githubCodeBlocks.before', text, options, globals); - - text += '¨0'; - - text = text.replace(/(?:^|\n)(```+|~~~+)([^\s`~]*)\n([\s\S]*?)\n\1/g, function (wholeMatch, delim, language, codeblock) { - var end = (options.omitExtraWLInCodeBlocks) ? '' : '\n'; - - // First parse the github code block - codeblock = showdown.subParser('encodeCode')(codeblock, options, globals); - codeblock = showdown.subParser('detab')(codeblock, options, globals); - codeblock = codeblock.replace(/^\n+/g, ''); // trim leading newlines - codeblock = codeblock.replace(/\n+$/g, ''); // trim trailing whitespace - - codeblock = '
' + codeblock + end + '
'; - - codeblock = showdown.subParser('hashBlock')(codeblock, options, globals); - - // Since GHCodeblocks can be false positives, we need to - // store the primitive text and the parsed text in a global var, - // and then return a token - return '\n\n¨G' + (globals.ghCodeBlocks.push({text: wholeMatch, codeblock: codeblock}) - 1) + 'G\n\n'; - }); - - // attacklab: strip sentinel - text = text.replace(/¨0/, ''); - - return globals.converter._dispatch('githubCodeBlocks.after', text, options, globals); -}); - -showdown.subParser('hashBlock', function (text, options, globals) { - 'use strict'; - text = globals.converter._dispatch('hashBlock.before', text, options, globals); - text = text.replace(/(^\n+|\n+$)/g, ''); - text = '\n\n¨K' + (globals.gHtmlBlocks.push(text) - 1) + 'K\n\n'; - text = globals.converter._dispatch('hashBlock.after', text, options, globals); - return text; -}); - -/** - * Hash and escape elements that should not be parsed as markdown - */ -showdown.subParser('hashCodeTags', function (text, options, globals) { - 'use strict'; - text = globals.converter._dispatch('hashCodeTags.before', text, options, globals); - - var repFunc = function (wholeMatch, match, left, right) { - var codeblock = left + showdown.subParser('encodeCode')(match, options, globals) + right; - return '¨C' + (globals.gHtmlSpans.push(codeblock) - 1) + 'C'; - }; - - // Hash naked - text = showdown.helper.replaceRecursiveRegExp(text, repFunc, ']*>', '', 'gim'); - - text = globals.converter._dispatch('hashCodeTags.after', text, options, globals); - return text; -}); - -showdown.subParser('hashElement', function (text, options, globals) { - 'use strict'; - - return function (wholeMatch, m1) { - var blockText = m1; - - // Undo double lines - blockText = blockText.replace(/\n\n/g, '\n'); - blockText = blockText.replace(/^\n/, ''); - - // strip trailing blank lines - blockText = blockText.replace(/\n+$/g, ''); - - // Replace the element text with a marker ("¨KxK" where x is its key) - blockText = '\n\n¨K' + (globals.gHtmlBlocks.push(blockText) - 1) + 'K\n\n'; - - return blockText; - }; -}); - -showdown.subParser('hashHTMLBlocks', function (text, options, globals) { - 'use strict'; - text = globals.converter._dispatch('hashHTMLBlocks.before', text, options, globals); - - var blockTags = [ - 'pre', - 'div', - 'h1', - 'h2', - 'h3', - 'h4', - 'h5', - 'h6', - 'blockquote', - 'table', - 'dl', - 'ol', - 'ul', - 'script', - 'noscript', - 'form', - 'fieldset', - 'iframe', - 'math', - 'style', - 'section', - 'header', - 'footer', - 'nav', - 'article', - 'aside', - 'address', - 'audio', - 'canvas', - 'figure', - 'hgroup', - 'output', - 'video', - 'p' - ], - repFunc = function (wholeMatch, match, left, right) { - var txt = wholeMatch; - // check if this html element is marked as markdown - // if so, it's contents should be parsed as markdown - if (left.search(/\bmarkdown\b/) !== -1) { - txt = left + globals.converter.makeHtml(match) + right; - } - return '\n\n¨K' + (globals.gHtmlBlocks.push(txt) - 1) + 'K\n\n'; - }; - - if (options.backslashEscapesHTMLTags) { - // encode backslash escaped HTML tags - text = text.replace(/\\<(\/?[^>]+?)>/g, function (wm, inside) { - return '<' + inside + '>'; - }); - } - - // hash HTML Blocks - for (var i = 0; i < blockTags.length; ++i) { - - var opTagPos, - rgx1 = new RegExp('^ {0,3}(<' + blockTags[i] + '\\b[^>]*>)', 'im'), - patLeft = '<' + blockTags[i] + '\\b[^>]*>', - patRight = ''; - // 1. Look for the first position of the first opening HTML tag in the text - while ((opTagPos = showdown.helper.regexIndexOf(text, rgx1)) !== -1) { - - // if the HTML tag is \ escaped, we need to escape it and break - - - //2. Split the text in that position - var subTexts = showdown.helper.splitAtIndex(text, opTagPos), - //3. Match recursively - newSubText1 = showdown.helper.replaceRecursiveRegExp(subTexts[1], repFunc, patLeft, patRight, 'im'); - - // prevent an infinite loop - if (newSubText1 === subTexts[1]) { - break; - } - text = subTexts[0].concat(newSubText1); - } - } - // HR SPECIAL CASE - text = text.replace(/(\n {0,3}(<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g, - showdown.subParser('hashElement')(text, options, globals)); - - // Special case for standalone HTML comments - text = showdown.helper.replaceRecursiveRegExp(text, function (txt) { - return '\n\n¨K' + (globals.gHtmlBlocks.push(txt) - 1) + 'K\n\n'; - }, '^ {0,3}', 'gm'); - - // PHP and ASP-style processor instructions ( and <%...%>) - text = text.replace(/(?:\n\n)( {0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g, - showdown.subParser('hashElement')(text, options, globals)); - - text = globals.converter._dispatch('hashHTMLBlocks.after', text, options, globals); - return text; -}); - -/** - * Hash span elements that should not be parsed as markdown - */ -showdown.subParser('hashHTMLSpans', function (text, options, globals) { - 'use strict'; - text = globals.converter._dispatch('hashHTMLSpans.before', text, options, globals); - - function hashHTMLSpan (html) { - return '¨C' + (globals.gHtmlSpans.push(html) - 1) + 'C'; - } - - // Hash Self Closing tags - text = text.replace(/<[^>]+?\/>/gi, function (wm) { - return hashHTMLSpan(wm); - }); - - // Hash tags without properties - text = text.replace(/<([^>]+?)>[\s\S]*?<\/\1>/g, function (wm) { - return hashHTMLSpan(wm); - }); - - // Hash tags with properties - text = text.replace(/<([^>]+?)\s[^>]+?>[\s\S]*?<\/\1>/g, function (wm) { - return hashHTMLSpan(wm); - }); - - // Hash self closing tags without /> - text = text.replace(/<[^>]+?>/gi, function (wm) { - return hashHTMLSpan(wm); - }); - - /*showdown.helper.matchRecursiveRegExp(text, ']*>', '', 'gi');*/ - - text = globals.converter._dispatch('hashHTMLSpans.after', text, options, globals); - return text; -}); - -/** - * Unhash HTML spans - */ -showdown.subParser('unhashHTMLSpans', function (text, options, globals) { - 'use strict'; - text = globals.converter._dispatch('unhashHTMLSpans.before', text, options, globals); - - for (var i = 0; i < globals.gHtmlSpans.length; ++i) { - var repText = globals.gHtmlSpans[i], - // limiter to prevent infinite loop (assume 10 as limit for recurse) - limit = 0; - - while (/¨C(\d+)C/.test(repText)) { - var num = RegExp.$1; - repText = repText.replace('¨C' + num + 'C', globals.gHtmlSpans[num]); - if (limit === 10) { - console.error('maximum nesting of 10 spans reached!!!'); - break; - } - ++limit; - } - text = text.replace('¨C' + i + 'C', repText); - } - - text = globals.converter._dispatch('unhashHTMLSpans.after', text, options, globals); - return text; -}); - -/** - * Hash and escape
 elements that should not be parsed as markdown
- */
-showdown.subParser('hashPreCodeTags', function (text, options, globals) {
-  'use strict';
-  text = globals.converter._dispatch('hashPreCodeTags.before', text, options, globals);
-
-  var repFunc = function (wholeMatch, match, left, right) {
-    // encode html entities
-    var codeblock = left + showdown.subParser('encodeCode')(match, options, globals) + right;
-    return '\n\n¨G' + (globals.ghCodeBlocks.push({text: wholeMatch, codeblock: codeblock}) - 1) + 'G\n\n';
-  };
-
-  // Hash 

-  text = showdown.helper.replaceRecursiveRegExp(text, repFunc, '^ {0,3}]*>\\s*]*>', '^ {0,3}\\s*
', 'gim'); - - text = globals.converter._dispatch('hashPreCodeTags.after', text, options, globals); - return text; -}); - -showdown.subParser('headers', function (text, options, globals) { - 'use strict'; - - text = globals.converter._dispatch('headers.before', text, options, globals); - - var headerLevelStart = (isNaN(parseInt(options.headerLevelStart))) ? 1 : parseInt(options.headerLevelStart), - - // Set text-style headers: - // Header 1 - // ======== - // - // Header 2 - // -------- - // - setextRegexH1 = (options.smoothLivePreview) ? /^(.+)[ \t]*\n={2,}[ \t]*\n+/gm : /^(.+)[ \t]*\n=+[ \t]*\n+/gm, - setextRegexH2 = (options.smoothLivePreview) ? /^(.+)[ \t]*\n-{2,}[ \t]*\n+/gm : /^(.+)[ \t]*\n-+[ \t]*\n+/gm; - - text = text.replace(setextRegexH1, function (wholeMatch, m1) { - - var spanGamut = showdown.subParser('spanGamut')(m1, options, globals), - hID = (options.noHeaderId) ? '' : ' id="' + headerId(m1) + '"', - hLevel = headerLevelStart, - hashBlock = '' + spanGamut + ''; - return showdown.subParser('hashBlock')(hashBlock, options, globals); - }); - - text = text.replace(setextRegexH2, function (matchFound, m1) { - var spanGamut = showdown.subParser('spanGamut')(m1, options, globals), - hID = (options.noHeaderId) ? '' : ' id="' + headerId(m1) + '"', - hLevel = headerLevelStart + 1, - hashBlock = '' + spanGamut + ''; - return showdown.subParser('hashBlock')(hashBlock, options, globals); - }); - - // atx-style headers: - // # Header 1 - // ## Header 2 - // ## Header 2 with closing hashes ## - // ... - // ###### Header 6 - // - var atxStyle = (options.requireSpaceBeforeHeadingText) ? /^(#{1,6})[ \t]+(.+?)[ \t]*#*\n+/gm : /^(#{1,6})[ \t]*(.+?)[ \t]*#*\n+/gm; - - text = text.replace(atxStyle, function (wholeMatch, m1, m2) { - var hText = m2; - if (options.customizedHeaderId) { - hText = m2.replace(/\s?\{([^{]+?)}\s*$/, ''); - } - - var span = showdown.subParser('spanGamut')(hText, options, globals), - hID = (options.noHeaderId) ? '' : ' id="' + headerId(m2) + '"', - hLevel = headerLevelStart - 1 + m1.length, - header = '' + span + ''; - - return showdown.subParser('hashBlock')(header, options, globals); - }); - - function headerId (m) { - var title, - prefix; - - // It is separate from other options to allow combining prefix and customized - if (options.customizedHeaderId) { - var match = m.match(/\{([^{]+?)}\s*$/); - if (match && match[1]) { - m = match[1]; - } - } - - title = m; - - // Prefix id to prevent causing inadvertent pre-existing style matches. - if (showdown.helper.isString(options.prefixHeaderId)) { - prefix = options.prefixHeaderId; - } else if (options.prefixHeaderId === true) { - prefix = 'section-'; - } else { - prefix = ''; - } - - if (!options.rawPrefixHeaderId) { - title = prefix + title; - } - - if (options.ghCompatibleHeaderId) { - title = title - .replace(/ /g, '-') - // replace previously escaped chars (&, ¨ and $) - .replace(/&/g, '') - .replace(/¨T/g, '') - .replace(/¨D/g, '') - // replace rest of the chars (&~$ are repeated as they might have been escaped) - // borrowed from github's redcarpet (some they should produce similar results) - .replace(/[&+$,\/:;=?@"#{}|^¨~\[\]`\\*)(%.!'<>]/g, '') - .toLowerCase(); - } else if (options.rawHeaderId) { - title = title - .replace(/ /g, '-') - // replace previously escaped chars (&, ¨ and $) - .replace(/&/g, '&') - .replace(/¨T/g, '¨') - .replace(/¨D/g, '$') - // replace " and ' - .replace(/["']/g, '-') - .toLowerCase(); - } else { - title = title - .replace(/[^\w]/g, '') - .toLowerCase(); - } - - if (options.rawPrefixHeaderId) { - title = prefix + title; - } - - if (globals.hashLinkCounts[title]) { - title = title + '-' + (globals.hashLinkCounts[title]++); - } else { - globals.hashLinkCounts[title] = 1; - } - return title; - } - - text = globals.converter._dispatch('headers.after', text, options, globals); - return text; -}); - -/** - * Turn Markdown link shortcuts into XHTML
tags. - */ -showdown.subParser('horizontalRule', function (text, options, globals) { - 'use strict'; - text = globals.converter._dispatch('horizontalRule.before', text, options, globals); - - var key = showdown.subParser('hashBlock')('
', options, globals); - text = text.replace(/^ {0,2}( ?-){3,}[ \t]*$/gm, key); - text = text.replace(/^ {0,2}( ?\*){3,}[ \t]*$/gm, key); - text = text.replace(/^ {0,2}( ?_){3,}[ \t]*$/gm, key); - - text = globals.converter._dispatch('horizontalRule.after', text, options, globals); - return text; -}); - -/** - * Turn Markdown image shortcuts into tags. - */ -showdown.subParser('images', function (text, options, globals) { - 'use strict'; - - text = globals.converter._dispatch('images.before', text, options, globals); - - var inlineRegExp = /!\[([^\]]*?)][ \t]*()\([ \t]??(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(["'])([^"]*?)\6)?[ \t]?\)/g, - crazyRegExp = /!\[([^\]]*?)][ \t]*()\([ \t]?<([^>]*)>(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(?:(["'])([^"]*?)\6))?[ \t]?\)/g, - base64RegExp = /!\[([^\]]*?)][ \t]*()\([ \t]??(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(["'])([^"]*?)\6)?[ \t]?\)/g, - referenceRegExp = /!\[([^\]]*?)] ?(?:\n *)?\[([\s\S]*?)]()()()()()/g, - refShortcutRegExp = /!\[([^\[\]]+)]()()()()()/g; - - function writeImageTagBase64 (wholeMatch, altText, linkId, url, width, height, m5, title) { - url = url.replace(/\s/g, ''); - return writeImageTag (wholeMatch, altText, linkId, url, width, height, m5, title); - } - - function writeImageTag (wholeMatch, altText, linkId, url, width, height, m5, title) { - - var gUrls = globals.gUrls, - gTitles = globals.gTitles, - gDims = globals.gDimensions; - - linkId = linkId.toLowerCase(); - - if (!title) { - title = ''; - } - // Special case for explicit empty url - if (wholeMatch.search(/\(? ?(['"].*['"])?\)$/m) > -1) { - url = ''; - - } else if (url === '' || url === null) { - if (linkId === '' || linkId === null) { - // lower-case and turn embedded newlines into spaces - linkId = altText.toLowerCase().replace(/ ?\n/g, ' '); - } - url = '#' + linkId; - - if (!showdown.helper.isUndefined(gUrls[linkId])) { - url = gUrls[linkId]; - if (!showdown.helper.isUndefined(gTitles[linkId])) { - title = gTitles[linkId]; - } - if (!showdown.helper.isUndefined(gDims[linkId])) { - width = gDims[linkId].width; - height = gDims[linkId].height; - } - } else { - return wholeMatch; - } - } - - altText = altText - .replace(/"/g, '"') - //altText = showdown.helper.escapeCharacters(altText, '*_', false); - .replace(showdown.helper.regexes.asteriskDashAndColon, showdown.helper.escapeCharactersCallback); - //url = showdown.helper.escapeCharacters(url, '*_', false); - url = url.replace(showdown.helper.regexes.asteriskDashAndColon, showdown.helper.escapeCharactersCallback); - var result = '' + altText + 'x "optional title") - - // base64 encoded images - text = text.replace(base64RegExp, writeImageTagBase64); - - // cases with crazy urls like ./image/cat1).png - text = text.replace(crazyRegExp, writeImageTag); - - // normal cases - text = text.replace(inlineRegExp, writeImageTag); - - // handle reference-style shortcuts: ![img text] - text = text.replace(refShortcutRegExp, writeImageTag); - - text = globals.converter._dispatch('images.after', text, options, globals); - return text; -}); - -showdown.subParser('italicsAndBold', function (text, options, globals) { - 'use strict'; - - text = globals.converter._dispatch('italicsAndBold.before', text, options, globals); - - // it's faster to have 3 separate regexes for each case than have just one - // because of backtracing, in some cases, it could lead to an exponential effect - // called "catastrophic backtrace". Ominous! - - function parseInside (txt, left, right) { - /* - if (options.simplifiedAutoLink) { - txt = showdown.subParser('simplifiedAutoLinks')(txt, options, globals); - } - */ - return left + txt + right; - } - - // Parse underscores - if (options.literalMidWordUnderscores) { - text = text.replace(/\b___(\S[\s\S]*)___\b/g, function (wm, txt) { - return parseInside (txt, '', ''); - }); - text = text.replace(/\b__(\S[\s\S]*)__\b/g, function (wm, txt) { - return parseInside (txt, '', ''); - }); - text = text.replace(/\b_(\S[\s\S]*?)_\b/g, function (wm, txt) { - return parseInside (txt, '', ''); - }); - } else { - text = text.replace(/___(\S[\s\S]*?)___/g, function (wm, m) { - return (/\S$/.test(m)) ? parseInside (m, '', '') : wm; - }); - text = text.replace(/__(\S[\s\S]*?)__/g, function (wm, m) { - return (/\S$/.test(m)) ? parseInside (m, '', '') : wm; - }); - text = text.replace(/_([^\s_][\s\S]*?)_/g, function (wm, m) { - // !/^_[^_]/.test(m) - test if it doesn't start with __ (since it seems redundant, we removed it) - return (/\S$/.test(m)) ? parseInside (m, '', '') : wm; - }); - } - - // Now parse asterisks - if (options.literalMidWordAsterisks) { - text = text.replace(/([^*]|^)\B\*\*\*(\S[\s\S]+?)\*\*\*\B(?!\*)/g, function (wm, lead, txt) { - return parseInside (txt, lead + '', ''); - }); - text = text.replace(/([^*]|^)\B\*\*(\S[\s\S]+?)\*\*\B(?!\*)/g, function (wm, lead, txt) { - return parseInside (txt, lead + '', ''); - }); - text = text.replace(/([^*]|^)\B\*(\S[\s\S]+?)\*\B(?!\*)/g, function (wm, lead, txt) { - return parseInside (txt, lead + '', ''); - }); - } else { - text = text.replace(/\*\*\*(\S[\s\S]*?)\*\*\*/g, function (wm, m) { - return (/\S$/.test(m)) ? parseInside (m, '', '') : wm; - }); - text = text.replace(/\*\*(\S[\s\S]*?)\*\*/g, function (wm, m) { - return (/\S$/.test(m)) ? parseInside (m, '', '') : wm; - }); - text = text.replace(/\*([^\s*][\s\S]*?)\*/g, function (wm, m) { - // !/^\*[^*]/.test(m) - test if it doesn't start with ** (since it seems redundant, we removed it) - return (/\S$/.test(m)) ? parseInside (m, '', '') : wm; - }); - } - - - text = globals.converter._dispatch('italicsAndBold.after', text, options, globals); - return text; -}); - -/** - * Form HTML ordered (numbered) and unordered (bulleted) lists. - */ -showdown.subParser('lists', function (text, options, globals) { - 'use strict'; - - /** - * Process the contents of a single ordered or unordered list, splitting it - * into individual list items. - * @param {string} listStr - * @param {boolean} trimTrailing - * @returns {string} - */ - function processListItems (listStr, trimTrailing) { - // The $g_list_level global keeps track of when we're inside a list. - // Each time we enter a list, we increment it; when we leave a list, - // we decrement. If it's zero, we're not in a list anymore. - // - // We do this because when we're not inside a list, we want to treat - // something like this: - // - // I recommend upgrading to version - // 8. Oops, now this line is treated - // as a sub-list. - // - // As a single paragraph, despite the fact that the second line starts - // with a digit-period-space sequence. - // - // Whereas when we're inside a list (or sub-list), that line will be - // treated as the start of a sub-list. What a kludge, huh? This is - // an aspect of Markdown's syntax that's hard to parse perfectly - // without resorting to mind-reading. Perhaps the solution is to - // change the syntax rules such that sub-lists must start with a - // starting cardinal number; e.g. "1." or "a.". - globals.gListLevel++; - - // trim trailing blank lines: - listStr = listStr.replace(/\n{2,}$/, '\n'); - - // attacklab: add sentinel to emulate \z - listStr += '¨0'; - - var rgx = /(\n)?(^ {0,3})([*+-]|\d+[.])[ \t]+((\[(x|X| )?])?[ \t]*[^\r]+?(\n{1,2}))(?=\n*(¨0| {0,3}([*+-]|\d+[.])[ \t]+))/gm, - isParagraphed = (/\n[ \t]*\n(?!¨0)/.test(listStr)); - - // Since version 1.5, nesting sublists requires 4 spaces (or 1 tab) indentation, - // which is a syntax breaking change - // activating this option reverts to old behavior - if (options.disableForced4SpacesIndentedSublists) { - rgx = /(\n)?(^ {0,3})([*+-]|\d+[.])[ \t]+((\[(x|X| )?])?[ \t]*[^\r]+?(\n{1,2}))(?=\n*(¨0|\2([*+-]|\d+[.])[ \t]+))/gm; - } - - listStr = listStr.replace(rgx, function (wholeMatch, m1, m2, m3, m4, taskbtn, checked) { - checked = (checked && checked.trim() !== ''); - - var item = showdown.subParser('outdent')(m4, options, globals), - bulletStyle = ''; - - // Support for github tasklists - if (taskbtn && options.tasklists) { - bulletStyle = ' class="task-list-item" style="list-style-type: none;"'; - item = item.replace(/^[ \t]*\[(x|X| )?]/m, function () { - var otp = '
  • a
  • - // instead of: - //
    • - - a
    - // So, to prevent it, we will put a marker (¨A)in the beginning of the line - // Kind of hackish/monkey patching, but seems more effective than overcomplicating the list parser - item = item.replace(/^([-*+]|\d\.)[ \t]+[\S\n ]*/g, function (wm2) { - return '¨A' + wm2; - }); - - // m1 - Leading line or - // Has a double return (multi paragraph) or - // Has sublist - if (m1 || (item.search(/\n{2,}/) > -1)) { - item = showdown.subParser('githubCodeBlocks')(item, options, globals); - item = showdown.subParser('blockGamut')(item, options, globals); - } else { - // Recursion for sub-lists: - item = showdown.subParser('lists')(item, options, globals); - item = item.replace(/\n$/, ''); // chomp(item) - item = showdown.subParser('hashHTMLBlocks')(item, options, globals); - - // Colapse double linebreaks - item = item.replace(/\n\n+/g, '\n\n'); - if (isParagraphed) { - item = showdown.subParser('paragraphs')(item, options, globals); - } else { - item = showdown.subParser('spanGamut')(item, options, globals); - } - } - - // now we need to remove the marker (¨A) - item = item.replace('¨A', ''); - // we can finally wrap the line in list item tags - item = '' + item + '\n'; - - return item; - }); - - // attacklab: strip sentinel - listStr = listStr.replace(/¨0/g, ''); - - globals.gListLevel--; - - if (trimTrailing) { - listStr = listStr.replace(/\s+$/, ''); - } - - return listStr; - } - - function styleStartNumber (list, listType) { - // check if ol and starts by a number different than 1 - if (listType === 'ol') { - var res = list.match(/^ *(\d+)\./); - if (res && res[1] !== '1') { - return ' start="' + res[1] + '"'; - } - } - return ''; - } - - /** - * Check and parse consecutive lists (better fix for issue #142) - * @param {string} list - * @param {string} listType - * @param {boolean} trimTrailing - * @returns {string} - */ - function parseConsecutiveLists (list, listType, trimTrailing) { - // check if we caught 2 or more consecutive lists by mistake - // we use the counterRgx, meaning if listType is UL we look for OL and vice versa - var olRgx = (options.disableForced4SpacesIndentedSublists) ? /^ ?\d+\.[ \t]/gm : /^ {0,3}\d+\.[ \t]/gm, - ulRgx = (options.disableForced4SpacesIndentedSublists) ? /^ ?[*+-][ \t]/gm : /^ {0,3}[*+-][ \t]/gm, - counterRxg = (listType === 'ul') ? olRgx : ulRgx, - result = ''; - - if (list.search(counterRxg) !== -1) { - (function parseCL (txt) { - var pos = txt.search(counterRxg), - style = styleStartNumber(list, listType); - if (pos !== -1) { - // slice - result += '\n\n<' + listType + style + '>\n' + processListItems(txt.slice(0, pos), !!trimTrailing) + '\n'; - - // invert counterType and listType - listType = (listType === 'ul') ? 'ol' : 'ul'; - counterRxg = (listType === 'ul') ? olRgx : ulRgx; - - //recurse - parseCL(txt.slice(pos)); - } else { - result += '\n\n<' + listType + style + '>\n' + processListItems(txt, !!trimTrailing) + '\n'; - } - })(list); - } else { - var style = styleStartNumber(list, listType); - result = '\n\n<' + listType + style + '>\n' + processListItems(list, !!trimTrailing) + '\n'; - } - - return result; - } - - /** Start of list parsing **/ - text = globals.converter._dispatch('lists.before', text, options, globals); - // add sentinel to hack around khtml/safari bug: - // http://bugs.webkit.org/show_bug.cgi?id=11231 - text += '¨0'; - - if (globals.gListLevel) { - text = text.replace(/^(( {0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(¨0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm, - function (wholeMatch, list, m2) { - var listType = (m2.search(/[*+-]/g) > -1) ? 'ul' : 'ol'; - return parseConsecutiveLists(list, listType, true); - } - ); - } else { - text = text.replace(/(\n\n|^\n?)(( {0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(¨0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm, - function (wholeMatch, m1, list, m3) { - var listType = (m3.search(/[*+-]/g) > -1) ? 'ul' : 'ol'; - return parseConsecutiveLists(list, listType, false); - } - ); - } - - // strip sentinel - text = text.replace(/¨0/, ''); - text = globals.converter._dispatch('lists.after', text, options, globals); - return text; -}); - -/** - * Parse metadata at the top of the document - */ -showdown.subParser('metadata', function (text, options, globals) { - 'use strict'; - - if (!options.metadata) { - return text; - } - - text = globals.converter._dispatch('metadata.before', text, options, globals); - - function parseMetadataContents (content) { - // raw is raw so it's not changed in any way - globals.metadata.raw = content; - - // escape chars forbidden in html attributes - // double quotes - content = content - // ampersand first - .replace(/&/g, '&') - // double quotes - .replace(/"/g, '"'); - - content = content.replace(/\n {4}/g, ' '); - content.replace(/^([\S ]+): +([\s\S]+?)$/gm, function (wm, key, value) { - globals.metadata.parsed[key] = value; - return ''; - }); - } - - text = text.replace(/^\s*«««+(\S*?)\n([\s\S]+?)\n»»»+\n/, function (wholematch, format, content) { - parseMetadataContents(content); - return '¨M'; - }); - - text = text.replace(/^\s*---+(\S*?)\n([\s\S]+?)\n---+\n/, function (wholematch, format, content) { - if (format) { - globals.metadata.format = format; - } - parseMetadataContents(content); - return '¨M'; - }); - - text = text.replace(/¨M/g, ''); - - text = globals.converter._dispatch('metadata.after', text, options, globals); - return text; -}); - -/** - * Remove one level of line-leading tabs or spaces - */ -showdown.subParser('outdent', function (text, options, globals) { - 'use strict'; - text = globals.converter._dispatch('outdent.before', text, options, globals); - - // attacklab: hack around Konqueror 3.5.4 bug: - // "----------bug".replace(/^-/g,"") == "bug" - text = text.replace(/^(\t|[ ]{1,4})/gm, '¨0'); // attacklab: g_tab_width - - // attacklab: clean up hack - text = text.replace(/¨0/g, ''); - - text = globals.converter._dispatch('outdent.after', text, options, globals); - return text; -}); - -/** - * - */ -showdown.subParser('paragraphs', function (text, options, globals) { - 'use strict'; - - text = globals.converter._dispatch('paragraphs.before', text, options, globals); - // Strip leading and trailing lines: - text = text.replace(/^\n+/g, ''); - text = text.replace(/\n+$/g, ''); - - var grafs = text.split(/\n{2,}/g), - grafsOut = [], - end = grafs.length; // Wrap

    tags - - for (var i = 0; i < end; i++) { - var str = grafs[i]; - // if this is an HTML marker, copy it - if (str.search(/¨(K|G)(\d+)\1/g) >= 0) { - grafsOut.push(str); - - // test for presence of characters to prevent empty lines being parsed - // as paragraphs (resulting in undesired extra empty paragraphs) - } else if (str.search(/\S/) >= 0) { - str = showdown.subParser('spanGamut')(str, options, globals); - str = str.replace(/^([ \t]*)/g, '

    '); - str += '

    '; - grafsOut.push(str); - } - } - - /** Unhashify HTML blocks */ - end = grafsOut.length; - for (i = 0; i < end; i++) { - var blockText = '', - grafsOutIt = grafsOut[i], - codeFlag = false; - // if this is a marker for an html block... - // use RegExp.test instead of string.search because of QML bug - while (/¨(K|G)(\d+)\1/.test(grafsOutIt)) { - var delim = RegExp.$1, - num = RegExp.$2; - - if (delim === 'K') { - blockText = globals.gHtmlBlocks[num]; - } else { - // we need to check if ghBlock is a false positive - if (codeFlag) { - // use encoded version of all text - blockText = showdown.subParser('encodeCode')(globals.ghCodeBlocks[num].text, options, globals); - } else { - blockText = globals.ghCodeBlocks[num].codeblock; - } - } - blockText = blockText.replace(/\$/g, '$$$$'); // Escape any dollar signs - - grafsOutIt = grafsOutIt.replace(/(\n\n)?¨(K|G)\d+\2(\n\n)?/, blockText); - // Check if grafsOutIt is a pre->code - if (/^]*>\s*]*>/.test(grafsOutIt)) { - codeFlag = true; - } - } - grafsOut[i] = grafsOutIt; - } - text = grafsOut.join('\n'); - // Strip leading and trailing lines: - text = text.replace(/^\n+/g, ''); - text = text.replace(/\n+$/g, ''); - return globals.converter._dispatch('paragraphs.after', text, options, globals); -}); - -/** - * Run extension - */ -showdown.subParser('runExtension', function (ext, text, options, globals) { - 'use strict'; - - if (ext.filter) { - text = ext.filter(text, globals.converter, options); - - } else if (ext.regex) { - // TODO remove this when old extension loading mechanism is deprecated - var re = ext.regex; - if (!(re instanceof RegExp)) { - re = new RegExp(re, 'g'); - } - text = text.replace(re, ext.replace); - } - - return text; -}); - -/** - * These are all the transformations that occur *within* block-level - * tags like paragraphs, headers, and list items. - */ -showdown.subParser('spanGamut', function (text, options, globals) { - 'use strict'; - - text = globals.converter._dispatch('spanGamut.before', text, options, globals); - text = showdown.subParser('codeSpans')(text, options, globals); - text = showdown.subParser('escapeSpecialCharsWithinTagAttributes')(text, options, globals); - text = showdown.subParser('encodeBackslashEscapes')(text, options, globals); - - // Process anchor and image tags. Images must come first, - // because ![foo][f] looks like an anchor. - text = showdown.subParser('images')(text, options, globals); - text = showdown.subParser('anchors')(text, options, globals); - - // Make links out of things like `` - // Must come after anchors, because you can use < and > - // delimiters in inline links like [this](). - text = showdown.subParser('autoLinks')(text, options, globals); - text = showdown.subParser('simplifiedAutoLinks')(text, options, globals); - text = showdown.subParser('emoji')(text, options, globals); - text = showdown.subParser('underline')(text, options, globals); - text = showdown.subParser('italicsAndBold')(text, options, globals); - text = showdown.subParser('strikethrough')(text, options, globals); - text = showdown.subParser('ellipsis')(text, options, globals); - - // we need to hash HTML tags inside spans - text = showdown.subParser('hashHTMLSpans')(text, options, globals); - - // now we encode amps and angles - text = showdown.subParser('encodeAmpsAndAngles')(text, options, globals); - - // Do hard breaks - if (options.simpleLineBreaks) { - // GFM style hard breaks - // only add line breaks if the text does not contain a block (special case for lists) - if (!/\n\n¨K/.test(text)) { - text = text.replace(/\n+/g, '
    \n'); - } - } else { - // Vanilla hard breaks - text = text.replace(/ +\n/g, '
    \n'); - } - - text = globals.converter._dispatch('spanGamut.after', text, options, globals); - return text; -}); - -showdown.subParser('strikethrough', function (text, options, globals) { - 'use strict'; - - function parseInside (txt) { - if (options.simplifiedAutoLink) { - txt = showdown.subParser('simplifiedAutoLinks')(txt, options, globals); - } - return '' + txt + ''; - } - - if (options.strikethrough) { - text = globals.converter._dispatch('strikethrough.before', text, options, globals); - text = text.replace(/(?:~){2}([\s\S]+?)(?:~){2}/g, function (wm, txt) { return parseInside(txt); }); - text = globals.converter._dispatch('strikethrough.after', text, options, globals); - } - - return text; -}); - -/** - * Strips link definitions from text, stores the URLs and titles in - * hash references. - * Link defs are in the form: ^[id]: url "optional title" - */ -showdown.subParser('stripLinkDefinitions', function (text, options, globals) { - 'use strict'; - - var regex = /^ {0,3}\[(.+)]:[ \t]*\n?[ \t]*\s]+)>?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*\n?[ \t]*(?:(\n*)["|'(](.+?)["|')][ \t]*)?(?:\n+|(?=¨0))/gm, - base64Regex = /^ {0,3}\[(.+)]:[ \t]*\n?[ \t]*?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*\n?[ \t]*(?:(\n*)["|'(](.+?)["|')][ \t]*)?(?:\n\n|(?=¨0)|(?=\n\[))/gm; - - // attacklab: sentinel workarounds for lack of \A and \Z, safari\khtml bug - text += '¨0'; - - var replaceFunc = function (wholeMatch, linkId, url, width, height, blankLines, title) { - linkId = linkId.toLowerCase(); - if (url.match(/^data:.+?\/.+?;base64,/)) { - // remove newlines - globals.gUrls[linkId] = url.replace(/\s/g, ''); - } else { - globals.gUrls[linkId] = showdown.subParser('encodeAmpsAndAngles')(url, options, globals); // Link IDs are case-insensitive - } - - if (blankLines) { - // Oops, found blank lines, so it's not a title. - // Put back the parenthetical statement we stole. - return blankLines + title; - - } else { - if (title) { - globals.gTitles[linkId] = title.replace(/"|'/g, '"'); - } - if (options.parseImgDimensions && width && height) { - globals.gDimensions[linkId] = { - width: width, - height: height - }; - } - } - // Completely remove the definition from the text - return ''; - }; - - // first we try to find base64 link references - text = text.replace(base64Regex, replaceFunc); - - text = text.replace(regex, replaceFunc); - - // attacklab: strip sentinel - text = text.replace(/¨0/, ''); - - return text; -}); - -showdown.subParser('tables', function (text, options, globals) { - 'use strict'; - - if (!options.tables) { - return text; - } - - var tableRgx = /^ {0,3}\|?.+\|.+\n {0,3}\|?[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*:?[ \t]*(?:[-=]){2,}[\s\S]+?(?:\n\n|¨0)/gm, - //singeColTblRgx = /^ {0,3}\|.+\|\n {0,3}\|[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*\n(?: {0,3}\|.+\|\n)+(?:\n\n|¨0)/gm; - singeColTblRgx = /^ {0,3}\|.+\|[ \t]*\n {0,3}\|[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*\n( {0,3}\|.+\|[ \t]*\n)*(?:\n|¨0)/gm; - - function parseStyles (sLine) { - if (/^:[ \t]*--*$/.test(sLine)) { - return ' style="text-align:left;"'; - } else if (/^--*[ \t]*:[ \t]*$/.test(sLine)) { - return ' style="text-align:right;"'; - } else if (/^:[ \t]*--*[ \t]*:$/.test(sLine)) { - return ' style="text-align:center;"'; - } else { - return ''; - } - } - - function parseHeaders (header, style) { - var id = ''; - header = header.trim(); - // support both tablesHeaderId and tableHeaderId due to error in documentation so we don't break backwards compatibility - if (options.tablesHeaderId || options.tableHeaderId) { - id = ' id="' + header.replace(/ /g, '_').toLowerCase() + '"'; - } - header = showdown.subParser('spanGamut')(header, options, globals); - - return '' + header + '\n'; - } - - function parseCells (cell, style) { - var subText = showdown.subParser('spanGamut')(cell, options, globals); - return '' + subText + '\n'; - } - - function buildTable (headers, cells) { - var tb = '\n\n\n', - tblLgn = headers.length; - - for (var i = 0; i < tblLgn; ++i) { - tb += headers[i]; - } - tb += '\n\n\n'; - - for (i = 0; i < cells.length; ++i) { - tb += '\n'; - for (var ii = 0; ii < tblLgn; ++ii) { - tb += cells[i][ii]; - } - tb += '\n'; - } - tb += '\n
    \n'; - return tb; - } - - function parseTable (rawTable) { - var i, tableLines = rawTable.split('\n'); - - for (i = 0; i < tableLines.length; ++i) { - // strip wrong first and last column if wrapped tables are used - if (/^ {0,3}\|/.test(tableLines[i])) { - tableLines[i] = tableLines[i].replace(/^ {0,3}\|/, ''); - } - if (/\|[ \t]*$/.test(tableLines[i])) { - tableLines[i] = tableLines[i].replace(/\|[ \t]*$/, ''); - } - // parse code spans first, but we only support one line code spans - tableLines[i] = showdown.subParser('codeSpans')(tableLines[i], options, globals); - } - - var rawHeaders = tableLines[0].split('|').map(function (s) { return s.trim();}), - rawStyles = tableLines[1].split('|').map(function (s) { return s.trim();}), - rawCells = [], - headers = [], - styles = [], - cells = []; - - tableLines.shift(); - tableLines.shift(); - - for (i = 0; i < tableLines.length; ++i) { - if (tableLines[i].trim() === '') { - continue; - } - rawCells.push( - tableLines[i] - .split('|') - .map(function (s) { - return s.trim(); - }) - ); - } - - if (rawHeaders.length < rawStyles.length) { - return rawTable; - } - - for (i = 0; i < rawStyles.length; ++i) { - styles.push(parseStyles(rawStyles[i])); - } - - for (i = 0; i < rawHeaders.length; ++i) { - if (showdown.helper.isUndefined(styles[i])) { - styles[i] = ''; - } - headers.push(parseHeaders(rawHeaders[i], styles[i])); - } - - for (i = 0; i < rawCells.length; ++i) { - var row = []; - for (var ii = 0; ii < headers.length; ++ii) { - if (showdown.helper.isUndefined(rawCells[i][ii])) { - - } - row.push(parseCells(rawCells[i][ii], styles[ii])); - } - cells.push(row); - } - - return buildTable(headers, cells); - } - - text = globals.converter._dispatch('tables.before', text, options, globals); - - // find escaped pipe characters - text = text.replace(/\\(\|)/g, showdown.helper.escapeCharactersCallback); - - // parse multi column tables - text = text.replace(tableRgx, parseTable); - - // parse one column tables - text = text.replace(singeColTblRgx, parseTable); - - text = globals.converter._dispatch('tables.after', text, options, globals); - - return text; -}); - -showdown.subParser('underline', function (text, options, globals) { - 'use strict'; - - if (!options.underline) { - return text; - } - - text = globals.converter._dispatch('underline.before', text, options, globals); - - if (options.literalMidWordUnderscores) { - text = text.replace(/\b_?__(\S[\s\S]*)___?\b/g, function (wm, txt) { - return '' + txt + ''; - }); - } else { - text = text.replace(/_?__(\S[\s\S]*?)___?/g, function (wm, m) { - return (/\S$/.test(m)) ? '' + m + '' : wm; - }); - } - - // escape remaining underscores to prevent them being parsed by italic and bold - text = text.replace(/(_)/g, showdown.helper.escapeCharactersCallback); - - text = globals.converter._dispatch('underline.after', text, options, globals); - - return text; -}); - -/** - * Swap back in all the special characters we've hidden. - */ -showdown.subParser('unescapeSpecialChars', function (text, options, globals) { - 'use strict'; - text = globals.converter._dispatch('unescapeSpecialChars.before', text, options, globals); - - text = text.replace(/¨E(\d+)E/g, function (wholeMatch, m1) { - var charCodeToReplace = parseInt(m1); - return String.fromCharCode(charCodeToReplace); - }); - - text = globals.converter._dispatch('unescapeSpecialChars.after', text, options, globals); - return text; -}); - -var root = this; - -// AMD Loader -if (typeof define === 'function' && define.amd) { - define(function () { - 'use strict'; - return showdown; - }); - -// CommonJS/nodeJS Loader -} else if (typeof module !== 'undefined' && module.exports) { - module.exports = showdown; - -// Regular Browser loader -} else { - root.showdown = showdown; -} -}).call(this); - -//# sourceMappingURL=showdown.js.map diff --git a/cvat/apps/documentation/static/documentation/js/3rdparty/showdown.js.map b/cvat/apps/documentation/static/documentation/js/3rdparty/showdown.js.map deleted file mode 100644 index 8909ebb38e3..00000000000 --- a/cvat/apps/documentation/static/documentation/js/3rdparty/showdown.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../src/options.js","../src/showdown.js","../src/helpers.js","../src/converter.js","../src/subParsers/anchors.js","../src/subParsers/autoLinks.js","../src/subParsers/blockGamut.js","../src/subParsers/blockQuotes.js","../src/subParsers/codeBlocks.js","../src/subParsers/codeSpans.js","../src/subParsers/completeHTMLDocument.js","../src/subParsers/detab.js","../src/subParsers/ellipsis.js","../src/subParsers/emoji.js","../src/subParsers/encodeAmpsAndAngles.js","../src/subParsers/encodeBackslashEscapes.js","../src/subParsers/encodeCode.js","../src/subParsers/escapeSpecialCharsWithinTagAttributes.js","../src/subParsers/githubCodeBlocks.js","../src/subParsers/hashBlock.js","../src/subParsers/hashCodeTags.js","../src/subParsers/hashElement.js","../src/subParsers/hashHTMLBlocks.js","../src/subParsers/hashHTMLSpans.js","../src/subParsers/hashPreCodeTags.js","../src/subParsers/headers.js","../src/subParsers/horizontalRule.js","../src/subParsers/images.js","../src/subParsers/italicsAndBold.js","../src/subParsers/lists.js","../src/subParsers/metadata.js","../src/subParsers/outdent.js","../src/subParsers/paragraphs.js","../src/subParsers/runExtension.js","../src/subParsers/spanGamut.js","../src/subParsers/strikethrough.js","../src/subParsers/stripLinkDefinitions.js","../src/subParsers/tables.js","../src/subParsers/underline.js","../src/subParsers/unescapeSpecialChars.js","../src/loader.js"],"names":[],"mappings":";;AAAA,GAAG;AACH,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;AAClC,CAAC,EAAE;AACH;AACA,QAAQ,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAClC,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf;AACA,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;AACxB,IAAI,uBAAuB,CAAC,CAAC,CAAC;AAC9B,MAAM,YAAY,CAAC,CAAC,KAAK,CAAC;AAC1B,MAAM,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE;AACxE,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AACrB,IAAI,EAAE;AACN,IAAI,UAAU,CAAC,CAAC,CAAC;AACjB,MAAM,YAAY,CAAC,CAAC,KAAK,CAAC;AAC1B,MAAM,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE;AAClD,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AACrB,IAAI,EAAE;AACN,IAAI,cAAc,CAAC,CAAC,CAAC;AACrB,MAAM,YAAY,CAAC,CAAC,KAAK,CAAC;AAC1B,MAAM,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,EAAE;AAC9K,MAAM,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;AACpB,IAAI,EAAE;AACN,IAAI,iBAAiB,CAAC,CAAC,CAAC;AACxB,MAAM,YAAY,CAAC,CAAC,KAAK,CAAC;AAC1B,MAAM,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,GAAG;AACvL,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AACrB,IAAI,EAAE;AACN,IAAI,oBAAoB,CAAC,CAAC,CAAC;AAC3B,MAAM,YAAY,CAAC,CAAC,KAAK,CAAC;AAC1B,MAAM,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG;AACpJ,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AACrB,IAAI,EAAE;AACN,IAAI,WAAW,CAAC,CAAC,CAAC;AAClB,MAAM,YAAY,CAAC,CAAC,KAAK,CAAC;AAC1B,MAAM,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE;AAC3K,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AACrB,IAAI,EAAE;AACN,IAAI,gBAAgB,CAAC,CAAC,CAAC;AACvB,MAAM,YAAY,CAAC,CAAC,KAAK,CAAC;AAC1B,MAAM,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE;AAChD,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AACrB,IAAI,EAAE;AACN,IAAI,kBAAkB,CAAC,CAAC,CAAC;AACzB,MAAM,YAAY,CAAC,CAAC,KAAK,CAAC;AAC1B,MAAM,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE;AACtD,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AACrB,IAAI,EAAE;AACN,IAAI,kBAAkB,CAAC,CAAC,CAAC;AACzB,MAAM,YAAY,CAAC,CAAC,KAAK,CAAC;AAC1B,MAAM,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE;AACjD,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AACrB,IAAI,EAAE;AACN,IAAI,kCAAkC,CAAC,CAAC,CAAC;AACzC,MAAM,YAAY,CAAC,CAAC,KAAK,CAAC;AAC1B,MAAM,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE;AACtF,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AACrB,IAAI,EAAE;AACN,IAAI,yBAAyB,CAAC,CAAC,CAAC;AAChC,MAAM,YAAY,CAAC,CAAC,KAAK,CAAC;AAC1B,MAAM,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE;AACnE,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AACrB,IAAI,EAAE;AACN,IAAI,uBAAuB,CAAC,CAAC,CAAC;AAC9B,MAAM,YAAY,CAAC,CAAC,KAAK,CAAC;AAC1B,MAAM,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE;AAC/D,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AACrB,IAAI,EAAE;AACN,IAAI,aAAa,CAAC,CAAC,CAAC;AACpB,MAAM,YAAY,CAAC,CAAC,KAAK,CAAC;AAC1B,MAAM,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,OAAO,EAAE;AACpD,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AACrB,IAAI,EAAE;AACN,IAAI,MAAM,CAAC,CAAC,CAAC;AACb,MAAM,YAAY,CAAC,CAAC,KAAK,CAAC;AAC1B,MAAM,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE;AAC7C,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AACrB,IAAI,EAAE;AACN,IAAI,cAAc,CAAC,CAAC,CAAC;AACrB,MAAM,YAAY,CAAC,CAAC,KAAK,CAAC;AAC1B,MAAM,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE;AAC7C,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AACrB,IAAI,EAAE;AACN,IAAI,YAAY,CAAC,CAAC,CAAC;AACnB,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC;AACzB,MAAM,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;AAC7D,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AACrB,IAAI,EAAE;AACN,IAAI,SAAS,CAAC,CAAC,CAAC;AAChB,MAAM,YAAY,CAAC,CAAC,KAAK,CAAC;AAC1B,MAAM,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE;AACnD,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AACrB,IAAI,EAAE;AACN,IAAI,iBAAiB,CAAC,CAAC,CAAC;AACxB,MAAM,YAAY,CAAC,CAAC,KAAK,CAAC;AAC1B,MAAM,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE;AAClF,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AACrB,IAAI,EAAE;AACN,IAAI,mBAAmB,CAAC,CAAC,CAAC;AAC1B,MAAM,YAAY,CAAC,CAAC,KAAK,CAAC;AAC1B,MAAM,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE;AACrE,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AACrB,IAAI,EAAE;AACN,IAAI,oCAAoC,CAAC,CAAC,CAAC;AAC3C,MAAM,YAAY,CAAC,CAAC,KAAK,CAAC;AAC1B,MAAM,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE;AACvF,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AACrB,IAAI,EAAE;AACN,IAAI,gBAAgB,CAAC,CAAC,CAAC;AACvB,MAAM,YAAY,CAAC,CAAC,KAAK,CAAC;AAC1B,MAAM,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG;AACnE,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AACrB,IAAI,EAAE;AACN,IAAI,6BAA6B,CAAC,CAAC,CAAC;AACpC,MAAM,YAAY,CAAC,CAAC,KAAK,CAAC;AAC1B,MAAM,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG;AAChG,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AACrB,IAAI,EAAE;AACN,IAAI,UAAU,CAAC,CAAC,CAAC;AACjB,MAAM,YAAY,CAAC,CAAC,KAAK,CAAC;AAC1B,MAAM,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;AAC9C,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AACrB,IAAI,EAAE;AACN,IAAI,cAAc,CAAC,CAAC,CAAC;AACrB,MAAM,YAAY,CAAC,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG;AAC7C,MAAM,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,GAAG;AAC5G,MAAM,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;AACpB,IAAI,EAAE;AACN,IAAI,YAAY,CAAC,CAAC,CAAC;AACnB,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC;AACzB,MAAM,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE;AAC7J,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AACrB,IAAI,EAAE;AACN,IAAI,oBAAoB,CAAC,CAAC,CAAC;AAC3B,MAAM,YAAY,CAAC,CAAC,KAAK,CAAC;AAC1B,MAAM,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE;AACnD,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AACrB,IAAI,EAAE;AACN,IAAI,wBAAwB,CAAC,CAAC,CAAC;AAC/B,MAAM,YAAY,CAAC,CAAC,KAAK,CAAC;AAC1B,MAAM,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG;AACzE,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AACrB,IAAI,EAAE;AACN,IAAI,KAAK,CAAC,CAAC,CAAC;AACZ,MAAM,YAAY,CAAC,CAAC,KAAK,CAAC;AAC1B,MAAM,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG;AACzE,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AACrB,IAAI,EAAE;AACN,IAAI,SAAS,CAAC,CAAC,CAAC;AAChB,MAAM,YAAY,CAAC,CAAC,KAAK,CAAC;AAC1B,MAAM,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,IAAI;AACnM,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AACrB,IAAI,EAAE;AACN,IAAI,oBAAoB,CAAC,CAAC,CAAC;AAC3B,MAAM,YAAY,CAAC,CAAC,KAAK,CAAC;AAC1B,MAAM,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE;AACtG,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AACrB,IAAI,EAAE;AACN,IAAI,QAAQ,CAAC,CAAC,CAAC;AACf,MAAM,YAAY,CAAC,CAAC,KAAK,CAAC;AAC1B,MAAM,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS;AACnJ,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AACrB,IAAI,EAAE;AACN,IAAI,wBAAwB,CAAC,CAAC,CAAC;AAC/B,MAAM,YAAY,CAAC,CAAC,KAAK,CAAC;AAC1B,MAAM,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE;AACtD,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AACrB,IAAI,CAAC;AACL,EAAE,EAAE;AACJ,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AACzB,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,GAAG;AACtD,EAAE,CAAC;AACH,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;AACf,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;AACnC,IAAI,EAAE,CAAC,CAAC,cAAc,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,CAAC;AAC7C,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,EAAE,YAAY,CAAC;AAClD,IAAI,CAAC;AACL,EAAE,CAAC;AACH,EAAE,MAAM,CAAC,GAAG,CAAC;AACb,CAAC;AACD;AACA,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;AAC1B,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE;AACrC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG;AACf,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;AAC5B,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,CAAC;AACtC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACtB,IAAI,CAAC;AACL,EAAE,CAAC;AACH,EAAE,MAAM,CAAC,GAAG,CAAC;AACb,CAAC;;AC/LD,GAAG;AACH,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;AAClC,CAAC,EAAE;AACH;AACA,EAAE,CAAC,OAAO,CAAC,UAAU;AACrB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG;AAClB,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG;AACjB,IAAI,UAAU,CAAC,CAAC,CAAC,GAAG;AACpB,IAAI,aAAa,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE;AACzC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE;AAC1B,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;AACd,MAAM,MAAM,CAAC,CAAC,CAAC;AACf,QAAQ,uBAAuB,CAAC,cAAc,IAAI,CAAC;AACnD,QAAQ,kBAAkB,CAAC,mBAAmB,IAAI,CAAC;AACnD,QAAQ,kCAAkC,CAAC,GAAG,IAAI,CAAC;AACnD,QAAQ,yBAAyB,CAAC,YAAY,IAAI,CAAC;AACnD,QAAQ,aAAa,CAAC,wBAAwB,IAAI,CAAC;AACnD,QAAQ,MAAM,CAAC,+BAA+B,IAAI,CAAC;AACnD,QAAQ,cAAc,CAAC,uBAAuB,IAAI,CAAC;AACnD,QAAQ,YAAY,CAAC,yBAAyB,IAAI,CAAC;AACnD,QAAQ,SAAS,CAAC,4BAA4B,IAAI,CAAC;AACnD,QAAQ,oCAAoC,CAAC,CAAC,IAAI,CAAC;AACnD,QAAQ,gBAAgB,CAAC,qBAAqB,IAAI,CAAC;AACnD,QAAQ,6BAA6B,CAAC,QAAQ,IAAI,CAAC;AACnD,QAAQ,oBAAoB,CAAC,iBAAiB,IAAI,CAAC;AACnD,QAAQ,UAAU,CAAC,2BAA2B,IAAI,CAAC;AACnD,QAAQ,wBAAwB,CAAC,aAAa,IAAI,CAAC;AACnD,QAAQ,KAAK,CAAC,gCAAgC,IAAI,CAAC;AACnD,QAAQ,wBAAwB,CAAC,aAAa,IAAI;AAClD,MAAM,EAAE;AACR,MAAM,QAAQ,CAAC,CAAC,CAAC;AACjB,QAAQ,UAAU,CAAC,2BAA2B,IAAI,CAAC;AACnD,QAAQ,YAAY,CAAC,yBAAyB,KAAK;AACnD,MAAM,EAAE;AACR,MAAM,KAAK,CAAC,CAAC,CAAC;AACd,QAAQ,uBAAuB,CAAC,cAAc,IAAI,CAAC;AACnD,QAAQ,kBAAkB,CAAC,mBAAmB,IAAI,CAAC;AACnD,QAAQ,kBAAkB,CAAC,mBAAmB,IAAI,CAAC;AACnD,QAAQ,kCAAkC,CAAC,GAAG,IAAI,CAAC;AACnD,QAAQ,yBAAyB,CAAC,YAAY,IAAI,CAAC;AACnD,QAAQ,aAAa,CAAC,wBAAwB,IAAI,CAAC;AACnD,QAAQ,MAAM,CAAC,+BAA+B,IAAI,CAAC;AACnD,QAAQ,cAAc,CAAC,uBAAuB,IAAI,CAAC;AACnD,QAAQ,YAAY,CAAC,yBAAyB,IAAI,CAAC;AACnD,QAAQ,SAAS,CAAC,4BAA4B,IAAI,CAAC;AACnD,QAAQ,iBAAiB,CAAC,oBAAoB,IAAI,CAAC;AACnD,QAAQ,gBAAgB,CAAC,qBAAqB,IAAI,CAAC;AACnD,QAAQ,6BAA6B,CAAC,QAAQ,IAAI,CAAC;AACnD,QAAQ,UAAU,CAAC,2BAA2B,KAAK,CAAC;AACpD,QAAQ,YAAY,CAAC,yBAAyB,IAAI;AAClD,MAAM,EAAE;AACR,MAAM,OAAO,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE;AACpC,MAAM,KAAK,CAAC,CAAC,YAAY,EAAE;AAC3B,IAAI,EAAE;AACN;AACA,GAAG;AACH,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS;AACnB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI;AACb,CAAC,EAAE;AACH,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG;AACrB;AACA,GAAG;AACH,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI;AAC3B,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI;AACb,CAAC,EAAE;AACH,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG;AACzB;AACA,GAAG;AACH,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM;AACtB,CAAC,CAAC,CAAC,CAAC,MAAM;AACV,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG;AACtB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK;AACnB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC;AACtB,CAAC,EAAE;AACH,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAC5C,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC7B,EAAE,MAAM,CAAC,IAAI,CAAC;AACd,EAAE;AACF;AACA,GAAG;AACH,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM;AACtB,CAAC,CAAC,CAAC,CAAC,MAAM;AACV,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG;AACtB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG;AACf,CAAC,EAAE;AACH,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACrC,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf,EAAE,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE;AAC5B,EAAE;AACF;AACA,GAAG;AACH,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO;AACzB,CAAC,CAAC,CAAC,CAAC,MAAM;AACV,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI;AAChB,CAAC,EAAE;AACH,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACnC,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf,EAAE,MAAM,CAAC,aAAa,CAAC;AACvB,EAAE;AACF;AACA,GAAG;AACH,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM;AAC7C,CAAC,CAAC,CAAC,CAAC,MAAM;AACV,CAAC,EAAE;AACH,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACrC,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf,EAAE,aAAa,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE;AACvC,EAAE;AACF;AACA,GAAG;AACH,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO;AAChD,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI;AACvB,CAAC,EAAE;AACH,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACtC,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;AACrC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG;AAChD,EAAE,CAAC;AACH,EAAE,QAAQ,CAAC,YAAY,GAAG;AAC1B,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE;AAC5B,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;AACnB,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9B,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;AACxC,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE;AAC7C,IAAI,CAAC;AACL,EAAE,CAAC;AACH,EAAE;AACF;AACA,GAAG;AACH,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM;AAC/B,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;AACpB,CAAC,EAAE;AACH,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAClC,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf,EAAE,MAAM,CAAC,SAAS,CAAC;AACnB,EAAE;AACF;AACA,GAAG;AACH,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK;AACvF,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM;AAC1C,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC;AAC1B,CAAC,EAAE;AACH,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7C,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;AACpC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;AACxB,EAAE,CAAC;AACH,EAAE;AACF;AACA,GAAG;AACH,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO;AAC1B,CAAC,CAAC,CAAC,CAAC,MAAM;AACV,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;AACjC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI;AAChB,CAAC,EAAE;AACH,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAChD,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE;AAChC,EAAE;AACF;AACA,GAAG;AACH,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;AACzB,CAAC,CAAC;AACF,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS;AACrD,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;AAC/C,CAAC,CAAC,CAAC,CAAC,MAAM;AACV,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI;AACvB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3B,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG;AACf,CAAC,EAAE;AACH,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5C,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;AACvC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;AACtC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3B,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;AACZ,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;AACzC,QAAQ,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE;AAC7B,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;AACd,QAAQ,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,IAAI;AACpE,MAAM,CAAC;AACP,IAAI,CAAC;AACL,EAAE,CAAC;AACH,EAAE;AACF;AACA,GAAG;AACH,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS;AACjC,CAAC,CAAC,CAAC,CAAC,MAAM;AACV,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI;AACvB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,GAAG;AAChC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG;AACf,CAAC,EAAE;AACH,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3C,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf;AACA,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;AACxC,IAAI,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG;AACvD,EAAE,CAAC;AACH;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE;AAC1C;AACA,EAAE,EAAE,CAAC,MAAM;AACX,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC;AACzC,IAAI,EAAE,CAAC,EAAE,UAAU,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;AAC3C,MAAM,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,IAAI;AACrE,IAAI,CAAC;AACL,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE;AAC5B;AACA,IAAI,EAAE,CAAC,MAAM;AACb,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AACV,IAAI,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ;AACrD,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACpC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG;AAClB,IAAI,CAAC;AACL;AACA,IAAI,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK;AACnC,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AACxC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE;AAClB,IAAI,CAAC;AACL;AACA,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE;AAC7C;AACA,IAAI,EAAE,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;AAC/B,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAC7B,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;AACZ,MAAM,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,EAAE;AACxC,IAAI,CAAC;AACL,EAAE,CAAC;AACH,EAAE;AACF;AACA,GAAG;AACH,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU;AACjC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI;AAChB,CAAC,EAAE;AACH,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACzC,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf,EAAE,MAAM,CAAC,UAAU,CAAC;AACpB,EAAE;AACF;AACA,GAAG;AACH,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS;AACtB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI;AACvB,CAAC,EAAE;AACH,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5C,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE;AAC1B,EAAE;AACF;AACA,GAAG;AACH,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU;AACzB,CAAC,EAAE;AACH,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACxC,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG;AAClB,EAAE;AACF;AACA,GAAG;AACH,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS;AACrB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS;AAC3B,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI;AACvB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE;AAC7C,CAAC,EAAE;AACH,QAAQ,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACrC,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf;AACA,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE;AAC3F,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;AACb,QAAQ,KAAK,CAAC,CAAC,IAAI,CAAC;AACpB,QAAQ,KAAK,CAAC,CAAC,EAAE;AACjB,MAAM,EAAE;AACR;AACA,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;AAC5C,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE;AAC5B,EAAE,CAAC;AACH;AACA,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC9C,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;AACxD,QAAQ,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE;AAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AAClC,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AACxB,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;AAC9E,MAAM,MAAM,CAAC,GAAG,CAAC;AACjB,IAAI,CAAC;AACL;AACA,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;AAC9C,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AACxB,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;AAClG,MAAM,MAAM,CAAC,GAAG,CAAC;AACjB,IAAI,CAAC;AACL;AACA,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG;AACjD;AACA,IAAI,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI;AAC/B,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC9B,MAAM,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;AAC/B,IAAI,CAAC;AACL;AACA,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAC1B,MAAM,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE;AACjC,IAAI,CAAC;AACL;AACA,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACtE,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AACxB,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,GAAG;AAC9H,MAAM,MAAM,CAAC,GAAG,CAAC;AACjB,IAAI,CAAC;AACL;AACA,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC9B,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;AACvD,QAAQ,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AAC1B,QAAQ,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,SAAS,GAAG;AACxG,QAAQ,MAAM,CAAC,GAAG,CAAC;AACnB,MAAM,CAAC;AACP,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;AACZ,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;AAC9F,QAAQ,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AAC1B,QAAQ,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE;AAC9G,QAAQ,MAAM,CAAC,GAAG,CAAC;AACnB,MAAM,CAAC;AACP,IAAI,CAAC;AACL;AACA,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACxB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AAC9C,QAAQ,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AAC1B,QAAQ,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;AAC9G,QAAQ,MAAM,CAAC,GAAG,CAAC;AACnB,MAAM,CAAC;AACP,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACrC,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC,CAAC;AAC/C,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACxD,YAAY,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AAC9B,YAAY,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACvH,cAAc,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;AAC/E,YAAY,MAAM,CAAC,GAAG,CAAC;AACvB,UAAU,CAAC;AACX,QAAQ,CAAC;AACT,MAAM,CAAC;AACP,IAAI,CAAC;AACL;AACA,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AACrB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC7C,QAAQ,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AAC1B,QAAQ,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;AACjG,QAAQ,MAAM,CAAC,GAAG,CAAC;AACnB,MAAM,CAAC;AACP,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3B,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;AAChD,QAAQ,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG;AAC/C,MAAM,CAAC;AACP,MAAM,EAAE,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;AAC3C,QAAQ,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AAC1B,QAAQ,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;AAChI,QAAQ,MAAM,CAAC,GAAG,CAAC;AACnB,MAAM,CAAC;AACP,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;AACrD,QAAQ,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AAC1B,QAAQ,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE;AAC/F,QAAQ,MAAM,CAAC,GAAG,CAAC;AACnB,MAAM,CAAC;AACP,IAAI,CAAC;AACL,EAAE,CAAC;AACH,EAAE,MAAM,CAAC,GAAG,CAAC;AACb,CAAC;AACD;AACA,GAAG;AACH,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS;AACrB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG;AACtB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;AACrB,CAAC,EAAE;AACH,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7C,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf;AACA,EAAE,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE;AAC9C,EAAE,EAAE,CAAC,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;AACjC,IAAI,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE;AAC1C,IAAI,MAAM,CAAC,KAAK,CAAC;AACjB,EAAE,CAAC;AACH,EAAE,MAAM,CAAC,IAAI,CAAC;AACd,EAAE;;AC3XF,GAAG;AACH,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS;AAC9B,CAAC,EAAE;AACH;AACA,EAAE,CAAC,EAAE,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,CAAC,CAAC;AACzC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG;AACvB,CAAC;AACD;AACA,GAAG;AACH,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM;AACzB,CAAC,CAAC,CAAC,CAAC,MAAM;AACV,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;AACrB,CAAC,EAAE;AACH,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzC,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE;AACxD,EAAE;AACF;AACA,GAAG;AACH,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ;AAC7B,CAAC,CAAC,CAAC,CAAC,MAAM;AACV,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACf,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;AACrB,CAAC,EAAE;AACH,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3C,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;AACnB,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,QAAQ,GAAG;AAC/D,EAAE;AACF;AACA,GAAG;AACH,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ;AAC1B,CAAC,CAAC,CAAC,CAAC,MAAM;AACV,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACf,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;AACrB,CAAC,EAAE;AACH,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACxC,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE;AAC1B,EAAE;AACF;AACA,GAAG;AACH,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS;AAC9B,CAAC,CAAC,CAAC,CAAC,MAAM;AACV,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC;AACvC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE;AAC7E,CAAC,EAAE;AACH,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAChD,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE;AACtC,EAAE;AACF;AACA,GAAG;AACH,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ;AAC1B,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;AACzD,CAAC,CAAC,CAAC,CAAC,MAAM;AACV,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG;AACjB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM;AAC9F,CAAC,EAAE;AACH,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AACpD,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO;AAC5B,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC;AACzC,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,GAAG;AAC7C,EAAE,CAAC;AACH;AACA,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC9C,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,GAAG;AAClD,EAAE,CAAC;AACH;AACA,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC9C,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,GAAG;AACjE,EAAE,CAAC;AACH;AACA,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC1C,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE;AAC1B,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AAC5C,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAC1C,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE;AAC/B,IAAI,CAAC;AACL,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AACzC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3B,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;AACrC,QAAQ,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE;AACvC,MAAM,CAAC;AACP,IAAI,CAAC;AACL,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AACV,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,GAAG;AAC9E,EAAE,CAAC;AACH,EAAE;AACF;AACA,GAAG;AACH,CAAC,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI;AAC/B,CAAC,CAAC,CAAC,CAAC,MAAM;AACV,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI;AACnC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;AACpB,CAAC,EAAE;AACH,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3C,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,WAAW,GAAG;AAC1E,EAAE;AACF;AACA,QAAQ,CAAC,wBAAwB,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACpD,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE;AAC1C,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;AACvC,CAAC;AACD;AACA,GAAG;AACH,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO;AACzE,CAAC,CAAC,CAAC,CAAC,MAAM;AACV,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,UAAU;AAC7B,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE;AACrB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;AACpB,CAAC,EAAE;AACH,QAAQ,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,CAAC,wBAAwB,CAAC;AACpE;AACA,GAAG;AACH,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM;AAChC,CAAC,CAAC,CAAC,CAAC,MAAM;AACV,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI;AACvB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa;AAChC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,cAAc;AAClC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG;AAC/B,CAAC,EAAE;AACH,QAAQ,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;AACnF,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI;AAC1D,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI;AAC/C,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK;AAC/E;AACA,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;AACvB,IAAI,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC;AACvC,EAAE,CAAC;AACH;AACA,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG;AAC3C,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,wBAAwB,EAAE;AACvD;AACA,EAAE,MAAM,CAAC,IAAI,CAAC;AACd,EAAE;AACF;AACA,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAC1D,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG;AACtB,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9B,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK;AACpE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK;AAChD,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG;AACf,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC;AAC1B;AACA,EAAE,EAAE,CAAC,CAAC;AACN,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACV,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;AAC/B,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACzB,QAAQ,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACrB,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1B,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;AAClC,QAAQ,CAAC;AACT,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrB,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACnB,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;AACtC,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACrB,YAAY,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;AACzC,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;AAC5C,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE;AAC9C,YAAY,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;AAChD,UAAU,EAAE;AACZ,UAAU,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE;AACxB,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACnB,YAAY,MAAM,CAAC,GAAG,CAAC;AACvB,UAAU,CAAC;AACX,QAAQ,CAAC;AACT,MAAM,CAAC;AACP,IAAI,CAAC;AACL,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG;AACnC;AACA,EAAE,MAAM,CAAC,GAAG,CAAC;AACb,EAAE;AACF;AACA,GAAG;AACH,CAAC,CAAC,CAAC,oBAAoB;AACvB,CAAC,CAAC;AACF,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC;AAChD,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO;AACd,CAAC,CAAC;AACF,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS;AAChE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK;AAChE,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;AAClE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG;AAC7D,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG;AAC5D,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC;AAC9D,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS;AAC9D,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;AAChE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU;AAC/D,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;AACzD,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK;AAC1D,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK;AAChE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;AAChE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI;AAC/B,CAAC,CAAC;AACF,CAAC,CAAC,CAAC,QAAQ,CAAC;AACZ,CAAC,CAAC,CAAC,oBAAoB,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,MAAM;AAC7C,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE;AACd,CAAC,CAAC,CAAC,oBAAoB,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;AACxD,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG;AAC7B,CAAC,CAAC,CAAC,oBAAoB,GAAG,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE;AACpF,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE;AACpB,CAAC,EAAE;AACH,QAAQ,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3E,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf;AACA,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE;AAC3D,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG;AACnB;AACA,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7C,IAAI,OAAO,CAAC,IAAI,EAAE;AAClB,MAAM,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,EAAE;AAC1E,MAAM,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,EAAE;AAChE,MAAM,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE;AAC9D,MAAM,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC;AAC/D,IAAI,GAAG;AACP,EAAE,CAAC;AACH,EAAE,MAAM,CAAC,OAAO,CAAC;AACjB,EAAE;AACF;AACA,GAAG;AACH,CAAC,CAAC;AACF,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG;AACtB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW;AACvC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI;AACvB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK;AACxB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK;AACxB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;AACpB,CAAC,EAAE;AACH,QAAQ,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAC1F,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf;AACA,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;AACjD,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC;AAC7B,IAAI,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC/B,MAAM,MAAM,CAAC,MAAM,CAAC;AACpB,IAAI,EAAE;AACN,EAAE,CAAC;AACH;AACA,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE;AAC1D,MAAM,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC;AACrB,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;AAC5B;AACA,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChB,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG;AAClB,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7C,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC,KAAK,GAAG;AAC5D,IAAI,CAAC;AACL,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,IAAI,CAAC,IAAI,CAAC;AAChB,QAAQ,WAAW,CAAC;AACpB,UAAU,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,EAAE;AAC9E,UAAU,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,EAAE;AACpE,UAAU,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE;AAClE,UAAU,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC;AACnE,QAAQ,CAAC;AACT,MAAM,EAAE;AACR,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACxB,QAAQ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,KAAK,GAAG;AAC3F,MAAM,CAAC;AACP,IAAI,CAAC;AACL,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AACxD,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,GAAG;AAC7D,IAAI,CAAC;AACL,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK;AAC7B,EAAE,CAAC;AACH,EAAE,MAAM,CAAC,QAAQ,CAAC;AAClB,EAAE;AACF;AACA,GAAG;AACH,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC;AACpG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1E,CAAC,CAAC;AACF,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM;AACvC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,MAAM;AACrD,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM;AACzD,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;AACpB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,oBAAoB;AAC/B,CAAC,EAAE;AACH,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AACjE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;AACvC,IAAI,KAAK,CAAC,CAAC,oBAAoB,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE;AAC5G,EAAE,CAAC;AACH,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AAC1C,IAAI,KAAK,CAAC,CAAC,oBAAoB,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE;AAC1H,EAAE,CAAC;AACH,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE;AAC5D,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;AACjE,EAAE;AACF;AACA,GAAG;AACH,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU;AAC5G,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK;AACtC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;AAC9C,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;AAC7B,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,oBAAoB;AAC/B,CAAC,EAAE;AACH,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AACtD,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;AACvC,IAAI,KAAK,CAAC,CAAC,oBAAoB,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE;AAC5G,EAAE,CAAC;AACH,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,GAAG;AACzD,EAAE;AACF;AACA,GAAG;AACH,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC;AACrE,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC/E,CAAC,CAAC;AACF,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO;AAC/F,CAAC,CAAC;AACF,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI;AACvB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;AACpB,CAAC,EAAE;AACH,QAAQ,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACtD,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAChB,IAAI,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACnB,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;AAC3C,IAAI,EAAE;AACN,IAAI,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACnB,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;AACzD,IAAI,EAAE;AACN,IAAI,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACnB,MAAM,MAAM,CAAC,EAAE,CAAC;AAChB,IAAI,CAAC;AACL,EAAE,EAAE;AACJ;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3C,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACrB,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AAC1C,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE;AACrD,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;AACZ,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG;AAC5B,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;AAC1C,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;AACZ,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC;AAC1E,MAAM,EAAE;AACR,IAAI,CAAC;AACL,IAAI,MAAM,CAAC,EAAE,CAAC;AACd,EAAE,GAAG;AACL;AACA,EAAE,MAAM,CAAC,IAAI,CAAC;AACd,EAAE;AACF;AACA,GAAG;AACH,CAAC,CAAC,CAAC,SAAS;AACZ,CAAC,EAAE;AACH,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa;AACjE,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;AACtC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AACb,IAAI,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1B,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE;AACnB,MAAM,KAAK,CAAC,GAAG,EAAE;AACjB,IAAI,EAAE;AACN,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACzB,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE;AACnB,MAAM,KAAK,CAAC,GAAG,EAAE;AACjB,IAAI,EAAE;AACN,IAAI,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3B,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE;AACnB,MAAM,KAAK,CAAC,GAAG,CAAC;AAChB,IAAI,CAAC;AACL,EAAE,EAAE;AACJ,CAAC;AACD;AACA,GAAG;AACH,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;AAClB,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,WAAW;AACxD,CAAC,EAAE;AACH,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC3B,EAAE,oBAAoB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;AACnC,EAAE;AACF;AACA,GAAG;AACH,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI;AACd,CAAC,EAAE;AACH,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAC1B,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE;AACtB,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE;AACtB,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,eAAe,IAAI,KAAK,CAAC,KAAK,EAAE;AACnC,EAAE,CAAC,eAAe,IAAI,KAAK,CAAC,KAAK,EAAE;AACnC,EAAE,CAAC,eAAe,IAAI,KAAK,CAAC,KAAK,EAAE;AACnC,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,EAAE,IAAI,KAAK,CAAC,KAAK,EAAE;AACtB,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,WAAW,IAAI,KAAK,EAAE;AACzB,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,iBAAiB,IAAI,KAAK,EAAE;AAC/B,EAAE,CAAC,eAAe,IAAI,KAAK,EAAE;AAC7B,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,EAAE;AACpC,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,kBAAkB,IAAI,KAAK,CAAC,KAAK,EAAE;AACtC,EAAE,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,EAAE;AACpC,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,EAAE;AACpC,EAAE,CAAC,iBAAiB,IAAI,KAAK,CAAC,KAAK,EAAE;AACrC,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,EAAE;AACpC,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,EAAE;AACpC,EAAE,CAAC,iBAAiB,IAAI,KAAK,CAAC,KAAK,EAAE;AACrC,EAAE,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,EAAE;AACpC,EAAE,CAAC,uBAAuB,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3C,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,iBAAiB,IAAI,KAAK,CAAC,KAAK,EAAE;AACrC,EAAE,CAAC,oBAAoB,IAAI,KAAK,CAAC,KAAK,EAAE;AACxC,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,qBAAqB,IAAI,KAAK,CAAC,KAAK,EAAE;AACzC,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACrD,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACjD,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,kBAAkB,IAAI,KAAK,CAAC,KAAK,EAAE;AACtC,EAAE,CAAC,yBAAyB,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7C,EAAE,CAAC,mBAAmB,IAAI,KAAK,CAAC,KAAK,EAAE;AACvC,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,kBAAkB,IAAI,KAAK,CAAC,KAAK,EAAE;AACtC,EAAE,CAAC,mBAAmB,IAAI,KAAK,CAAC,KAAK,EAAE;AACvC,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACjD,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACjD,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,eAAe,IAAI,KAAK,CAAC,KAAK,EAAE;AACnC,EAAE,CAAC,eAAe,IAAI,KAAK,CAAC,KAAK,EAAE;AACnC,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,qBAAqB,IAAI,KAAK,CAAC,KAAK,EAAE;AACzC,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,iBAAiB,IAAI,KAAK,CAAC,KAAK,EAAE;AACrC,EAAE,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,EAAE;AACpC,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,wBAAwB,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5C,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,kBAAkB,IAAI,KAAK,CAAC,KAAK,EAAE;AACtC,EAAE,CAAC,mBAAmB,IAAI,KAAK,CAAC,KAAK,EAAE;AACvC,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,mBAAmB,IAAI,KAAK,CAAC,KAAK,EAAE;AACvC,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,EAAE,IAAI,KAAK,CAAC,KAAK,EAAE;AACtB,EAAE,CAAC,MAAM,IAAI,KAAK,EAAE;AACpB,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,0BAA0B,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9C,EAAE,CAAC,wBAAwB,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5C,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,iBAAiB,IAAI,KAAK,CAAC,KAAK,EAAE;AACrC,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,EAAE,IAAI,KAAK,CAAC,KAAK,EAAE;AACtB,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,kBAAkB,IAAI,KAAK,CAAC,KAAK,EAAE;AACtC,EAAE,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,EAAE;AACpC,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,oBAAoB,IAAI,KAAK,CAAC,KAAK,EAAE;AACxC,EAAE,CAAC,eAAe,IAAI,KAAK,CAAC,KAAK,EAAE;AACnC,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,oBAAoB,IAAI,KAAK,CAAC,KAAK,EAAE;AACxC,EAAE,CAAC,6BAA6B,IAAI,KAAK,EAAE;AAC3C,EAAE,CAAC,eAAe,IAAI,KAAK,CAAC,KAAK,EAAE;AACnC,EAAE,CAAC,eAAe,IAAI,KAAK,CAAC,KAAK,EAAE;AACnC,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,eAAe,IAAI,KAAK,CAAC,KAAK,EAAE;AACnC,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,uBAAuB,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3C,EAAE,CAAC,yBAAyB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAC9D,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,iBAAiB,IAAI,KAAK,CAAC,KAAK,EAAE;AACrC,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,2BAA2B,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/C,EAAE,CAAC,yBAAyB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAC/E,EAAE,CAAC,6BAA6B,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACnF,EAAE,CAAC,kBAAkB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACzF,EAAE,CAAC,oBAAoB,IAAI,KAAK,CAAC,KAAK,EAAE;AACxC,EAAE,CAAC,sBAAsB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAC7F,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,eAAe,IAAI,KAAK,CAAC,KAAK,EAAE;AACnC,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,eAAe,IAAI,KAAK,CAAC,KAAK,EAAE;AACnC,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,eAAe,IAAI,KAAK,CAAC,KAAK,EAAE;AACnC,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,UAAU,IAAI,KAAK,EAAE;AACxB,EAAE,CAAC,iBAAiB,IAAI,KAAK,CAAC,KAAK,EAAE;AACrC,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAChD,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,eAAe,IAAI,KAAK,CAAC,KAAK,EAAE;AACnC,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,EAAE;AACpC,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,EAAE;AACpC,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE;AACxC,EAAE,CAAC,+BAA+B,IAAI,KAAK,CAAC,KAAK,EAAE;AACnD,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,qBAAqB,IAAI,KAAK,CAAC,KAAK,EAAE;AACzC,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,eAAe,IAAI,KAAK,CAAC,KAAK,EAAE;AACnC,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,wBAAwB,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5C,EAAE,CAAC,qBAAqB,IAAI,KAAK,CAAC,KAAK,EAAE;AACzC,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,mBAAmB,IAAI,KAAK,CAAC,KAAK,EAAE;AACvC,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,eAAe,IAAI,KAAK,CAAC,KAAK,EAAE;AACnC,EAAE,CAAC,oBAAoB,IAAI,KAAK,CAAC,KAAK,EAAE;AACxC,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,iBAAiB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACtD,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,sBAAsB,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1C,EAAE,CAAC,qBAAqB,IAAI,KAAK,CAAC,KAAK,EAAE;AACzC,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,oBAAoB,IAAI,KAAK,CAAC,KAAK,EAAE;AACxC,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACnD,EAAE,CAAC,kBAAkB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACxE,EAAE,CAAC,eAAe,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACpD,EAAE,CAAC,mBAAmB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACzE,EAAE,CAAC,oBAAoB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAC1E,EAAE,CAAC,kBAAkB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACxE,EAAE,CAAC,sBAAsB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAC7F,EAAE,CAAC,mBAAmB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACzE,EAAE,CAAC,uBAAuB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAC9F,EAAE,CAAC,wBAAwB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAC/F,EAAE,CAAC,wBAAwB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAC/F,EAAE,CAAC,qBAAqB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAC3E,EAAE,CAAC,yBAAyB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAChG,EAAE,CAAC,0BAA0B,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACjG,EAAE,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACrD,EAAE,CAAC,oBAAoB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAC1E,EAAE,CAAC,iBAAiB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACtD,EAAE,CAAC,qBAAqB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAC3E,EAAE,CAAC,sBAAsB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAC5E,EAAE,CAAC,sBAAsB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAC5E,EAAE,CAAC,0BAA0B,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACjG,EAAE,CAAC,uBAAuB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAC7E,EAAE,CAAC,2BAA2B,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAClG,EAAE,CAAC,4BAA4B,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACnG,EAAE,CAAC,YAAY,IAAI,KAAK,EAAE;AAC1B,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAC3D,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,KAAK,IAAI,KAAK,EAAE;AACnB,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,kBAAkB,IAAI,KAAK,CAAC,KAAK,EAAE;AACtC,EAAE,CAAC,4BAA4B,IAAI,KAAK,CAAC,KAAK,EAAE;AAChD,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,qBAAqB,IAAI,KAAK,CAAC,KAAK,EAAE;AACzC,EAAE,CAAC,WAAW,IAAI,KAAK,EAAE;AACzB,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,EAAE;AACpC,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,oBAAoB,IAAI,KAAK,CAAC,KAAK,EAAE;AACxC,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,EAAE;AACpC,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACjD,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,mBAAmB,IAAI,KAAK,CAAC,KAAK,EAAE;AACvC,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,oBAAoB,IAAI,KAAK,CAAC,KAAK,EAAE;AACxC,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE;AACrC,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACxD,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,gBAAgB,IAAI,KAAK,EAAE;AAC9B,EAAE,CAAC,aAAa,IAAI,KAAK,EAAE;AAC3B,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAChD,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAChD,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,eAAe,IAAI,KAAK,EAAE;AAC7B,EAAE,CAAC,iBAAiB,IAAI,KAAK,CAAC,KAAK,EAAE;AACrC,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,IAAI,IAAI,KAAK,EAAE;AAClB,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,EAAE;AACpC,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,EAAE;AACpC,EAAE,CAAC,mBAAmB,IAAI,KAAK,EAAE;AACjC,EAAE,CAAC,iBAAiB,IAAI,KAAK,CAAC,KAAK,EAAE;AACrC,EAAE,CAAC,uBAAuB,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3C,EAAE,CAAC,gBAAgB,IAAI,KAAK,EAAE;AAC9B,EAAE,CAAC,sBAAsB,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1C,EAAE,CAAC,eAAe,IAAI,KAAK,EAAE;AAC7B,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,eAAe,IAAI,KAAK,CAAC,KAAK,EAAE;AACnC,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,sBAAsB,IAAI,KAAK,EAAE;AACpC,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,iBAAiB,IAAI,KAAK,CAAC,KAAK,EAAE;AACrC,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,SAAS,IAAI,KAAK,EAAE;AACvB,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,EAAE,IAAI,KAAK,CAAC,KAAK,EAAE;AACtB,EAAE,CAAC,mBAAmB,IAAI,KAAK,CAAC,KAAK,EAAE;AACvC,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,iBAAiB,IAAI,KAAK,CAAC,KAAK,EAAE;AACrC,EAAE,CAAC,kBAAkB,IAAI,KAAK,CAAC,KAAK,EAAE;AACtC,EAAE,CAAC,kBAAkB,IAAI,KAAK,CAAC,KAAK,EAAE;AACtC,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,eAAe,IAAI,KAAK,CAAC,KAAK,EAAE;AACnC,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,eAAe,IAAI,KAAK,CAAC,KAAK,EAAE;AACnC,EAAE,CAAC,eAAe,IAAI,KAAK,CAAC,KAAK,EAAE;AACnC,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,mBAAmB,IAAI,KAAK,CAAC,KAAK,EAAE;AACvC,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,oBAAoB,IAAI,KAAK,CAAC,KAAK,EAAE;AACxC,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,iBAAiB,IAAI,KAAK,CAAC,KAAK,EAAE;AACrC,EAAE,CAAC,kBAAkB,IAAI,KAAK,CAAC,KAAK,EAAE;AACtC,EAAE,CAAC,oBAAoB,IAAI,KAAK,CAAC,KAAK,EAAE;AACxC,EAAE,CAAC,iBAAiB,IAAI,KAAK,CAAC,KAAK,EAAE;AACrC,EAAE,CAAC,2BAA2B,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/C,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,EAAE;AACpC,EAAE,CAAC,yBAAyB,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7C,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,iBAAiB,IAAI,KAAK,CAAC,KAAK,EAAE;AACrC,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,IAAI,IAAI,KAAK,EAAE;AAClB,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE;AACrB,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,iBAAiB,IAAI,KAAK,CAAC,KAAK,EAAE;AACrC,EAAE,CAAC,oBAAoB,IAAI,KAAK,CAAC,KAAK,EAAE;AACxC,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAC/C,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAClD,EAAE,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACrD,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAC7C,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,eAAe,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACpD,EAAE,CAAC,kBAAkB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACvD,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAC/C,EAAE,CAAC,eAAe,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACpD,EAAE,CAAC,iBAAiB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACtD,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAC9C,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACjD,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACjD,EAAE,CAAC,iBAAiB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACtD,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAC9C,EAAE,CAAC,oBAAoB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACzD,EAAE,CAAC,sBAAsB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAC3D,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAClD,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAClD,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAC/C,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAChD,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAChD,EAAE,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACrD,EAAE,CAAC,mBAAmB,IAAI,KAAK,CAAC,KAAK,EAAE;AACvC,EAAE,CAAC,eAAe,IAAI,KAAK,CAAC,KAAK,EAAE;AACnC,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,iBAAiB,IAAI,KAAK,CAAC,KAAK,EAAE;AACrC,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,oBAAoB,IAAI,KAAK,CAAC,KAAK,EAAE;AACxC,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAChD,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAClD,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,EAAE;AACpC,EAAE,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,EAAE;AACpC,EAAE,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,EAAE;AACpC,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,QAAQ,IAAI,KAAK,EAAE;AACtB,EAAE,CAAC,mBAAmB,IAAI,KAAK,CAAC,KAAK,EAAE;AACvC,EAAE,CAAC,qBAAqB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAC1D,EAAE,CAAC,iBAAiB,IAAI,KAAK,CAAC,KAAK,EAAE;AACrC,EAAE,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,EAAE;AACpC,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,EAAE;AACpC,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,2BAA2B,IAAI,KAAK,EAAE;AACzC,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,kBAAkB,IAAI,KAAK,CAAC,KAAK,EAAE;AACtC,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,iBAAiB,IAAI,KAAK,EAAE;AAC/B,EAAE,CAAC,EAAE,IAAI,KAAK,CAAC,KAAK,EAAE;AACtB,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAChD,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,EAAE;AACpC,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,EAAE;AACpC,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,GAAG,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACrC,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,8BAA8B,IAAI,KAAK,CAAC,KAAK,EAAE;AAClD,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE;AACrB,EAAE,CAAC,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,EAAE,IAAI,KAAK,CAAC,KAAK,EAAE;AACtB,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAC3C,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,EAAE,IAAI,KAAK,CAAC,KAAK,EAAE;AACtB,EAAE,CAAC,EAAE,IAAI,KAAK,CAAC,KAAK,EAAE;AACtB,EAAE,CAAC,mBAAmB,IAAI,KAAK,CAAC,KAAK,EAAE;AACvC,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,mBAAmB,IAAI,KAAK,CAAC,KAAK,EAAE;AACvC,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,EAAE;AACpC,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,SAAS,IAAI,KAAK,EAAE;AACvB,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,EAAE,IAAI,KAAK,CAAC,KAAK,EAAE;AACtB,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,iBAAiB,IAAI,KAAK,EAAE;AAC/B,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,qBAAqB,IAAI,KAAK,CAAC,KAAK,EAAE;AACzC,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,EAAE;AACpC,EAAE,CAAC,YAAY,IAAI,KAAK,EAAE;AAC1B,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,eAAe,IAAI,KAAK,CAAC,KAAK,EAAE;AACnC,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,IAAI,IAAI,KAAK,EAAE;AAClB,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,EAAE;AACpC,EAAE,CAAC,kBAAkB,IAAI,KAAK,CAAC,KAAK,EAAE;AACtC,EAAE,CAAC,oBAAoB,IAAI,KAAK,EAAE;AAClC,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAChD,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAChD,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,qBAAqB,IAAI,KAAK,EAAE;AACnC,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,uBAAuB,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3C,EAAE,CAAC,QAAQ,IAAI,KAAK,EAAE;AACtB,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACvD,EAAE,CAAC,mBAAmB,IAAI,KAAK,CAAC,KAAK,EAAE;AACvC,EAAE,CAAC,gCAAgC,IAAI,KAAK,CAAC,KAAK,EAAE;AACpD,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,kBAAkB,IAAI,KAAK,CAAC,KAAK,EAAE;AACtC,EAAE,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACrD,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,aAAa,IAAI,KAAK,EAAE;AAC3B,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,eAAe,IAAI,KAAK,CAAC,KAAK,EAAE;AACnC,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,oBAAoB,IAAI,KAAK,EAAE;AAClC,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,EAAE;AACpC,EAAE,CAAC,MAAM,IAAI,KAAK,EAAE;AACpB,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,kBAAkB,IAAI,KAAK,CAAC,KAAK,EAAE;AACtC,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACjD,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,uBAAuB,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3C,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAClD,EAAE,CAAC,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,mBAAmB,IAAI,KAAK,CAAC,KAAK,EAAE;AACvC,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,aAAa,IAAI,KAAK,EAAE;AAC3B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,eAAe,IAAI,KAAK,CAAC,KAAK,EAAE;AACnC,EAAE,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,EAAE;AACpC,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,KAAK,IAAI,KAAK,EAAE;AACnB,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,oBAAoB,IAAI,KAAK,CAAC,KAAK,EAAE;AACxC,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,sBAAsB,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1C,EAAE,CAAC,qBAAqB,IAAI,KAAK,CAAC,KAAK,EAAE;AACzC,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,kBAAkB,IAAI,KAAK,CAAC,KAAK,EAAE;AACtC,EAAE,CAAC,oBAAoB,IAAI,KAAK,CAAC,KAAK,EAAE;AACxC,EAAE,CAAC,kBAAkB,IAAI,KAAK,CAAC,KAAK,EAAE;AACtC,EAAE,CAAC,uBAAuB,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3C,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,iBAAiB,IAAI,KAAK,CAAC,KAAK,EAAE;AACrC,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,QAAQ,IAAI,KAAK,EAAE;AACtB,EAAE,CAAC,eAAe,IAAI,KAAK,CAAC,KAAK,EAAE;AACnC,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,eAAe,IAAI,KAAK,CAAC,KAAK,EAAE;AACnC,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,iBAAiB,IAAI,KAAK,CAAC,KAAK,EAAE;AACrC,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,iBAAiB,IAAI,KAAK,CAAC,KAAK,EAAE;AACrC,EAAE,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,EAAE;AACpC,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,WAAW,IAAI,KAAK,EAAE;AACzB,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,SAAS,IAAI,KAAK,EAAE;AACvB,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,EAAE;AACpC,EAAE,CAAC,4BAA4B,IAAI,KAAK,CAAC,KAAK,EAAE;AAChD,EAAE,CAAC,4BAA4B,IAAI,KAAK,CAAC,KAAK,EAAE;AAChD,EAAE,CAAC,iBAAiB,IAAI,KAAK,CAAC,KAAK,EAAE;AACrC,EAAE,CAAC,iBAAiB,IAAI,KAAK,CAAC,KAAK,EAAE;AACrC,EAAE,CAAC,sBAAsB,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1C,EAAE,CAAC,qBAAqB,IAAI,KAAK,CAAC,KAAK,EAAE;AACzC,EAAE,CAAC,sBAAsB,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1C,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,sBAAsB,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1C,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAClD,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,kBAAkB,IAAI,KAAK,CAAC,KAAK,EAAE;AACtC,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACnD,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,kBAAkB,IAAI,KAAK,CAAC,KAAK,EAAE;AACtC,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,eAAe,IAAI,KAAK,CAAC,KAAK,EAAE;AACnC,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,WAAW,IAAI,KAAK,EAAE;AACzB,EAAE,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACrD,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,EAAE,IAAI,KAAK,CAAC,KAAK,EAAE;AACtB,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,uBAAuB,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3C,EAAE,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,EAAE;AACpC,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,EAAE,IAAI,KAAK,CAAC,KAAK,EAAE;AACtB,EAAE,CAAC,yBAAyB,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7C,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,qBAAqB,IAAI,KAAK,CAAC,KAAK,EAAE;AACzC,EAAE,CAAC,uBAAuB,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3C,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,EAAE,IAAI,KAAK,CAAC,KAAK,EAAE;AACtB,EAAE,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,EAAE;AACpC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE;AACrB,EAAE,CAAC,sBAAsB,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1C,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,EAAE,IAAI,KAAK,CAAC,KAAK,EAAE;AACtB,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAClD,EAAE,CAAC,oBAAoB,IAAI,KAAK,CAAC,KAAK,EAAE;AACxC,EAAE,CAAC,mBAAmB,IAAI,KAAK,CAAC,KAAK,EAAE;AACvC,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE;AAC/B,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,oBAAoB,IAAI,KAAK,CAAC,KAAK,EAAE;AACxC,EAAE,CAAC,EAAE,IAAI,KAAK,CAAC,KAAK,EAAE;AACtB,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,kBAAkB,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE;AAC5C,EAAE,CAAC,oBAAoB,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAC/D,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,eAAe,IAAI,KAAK,CAAC,KAAK,EAAE;AACnC,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,gBAAgB,IAAI,KAAK,EAAE;AAC9B,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE;AACpC,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,kBAAkB,IAAI,KAAK,CAAC,KAAK,EAAE;AACtC,EAAE,CAAC,yBAAyB,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7C,EAAE,CAAC,mBAAmB,IAAI,KAAK,CAAC,KAAK,EAAE;AACvC,EAAE,CAAC,kBAAkB,IAAI,KAAK,CAAC,KAAK,EAAE;AACtC,EAAE,CAAC,mBAAmB,IAAI,KAAK,CAAC,KAAK,EAAE;AACvC,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE;AACjC,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACxB,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACjD,EAAE,CAAC,eAAe,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACpD,EAAE,CAAC,kBAAkB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACvD,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAC/C,EAAE,CAAC,iBAAiB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACtD,EAAE,CAAC,oBAAoB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACzD,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACjD,EAAE,CAAC,iBAAiB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACtD,EAAE,CAAC,mBAAmB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACxD,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAChD,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACnD,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACnD,EAAE,CAAC,mBAAmB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACxD,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAChD,EAAE,CAAC,sBAAsB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAC3D,EAAE,CAAC,wBAAwB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAC7D,EAAE,CAAC,eAAe,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACpD,EAAE,CAAC,eAAe,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACpD,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACjD,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAClD,EAAE,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AAClD,EAAE,CAAC,kBAAkB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACvD,EAAE,CAAC,iBAAiB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACtD,EAAE,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAClC,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,EAAE,CAAC,eAAe,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;AACpD,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE;AAC7B,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3B,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC1B,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,CAAC,IAAI,KAAK,EAAE;AACf,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE;AAChC,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB,EAAE,CAAC,iBAAiB,IAAI,KAAK,CAAC,KAAK,EAAE;AACrC,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AACvB;AACA,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;AACzB,EAAE,CAAC,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,sJAAsJ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,mCAAmC,CAAC,wBAAwB,CAAC,MAAM,CAAC,oCAAoC,CAAC,kBAAkB,CAAC,qDAAqD,EAAE,kGAAkG,CAAC,kBAAkB,CAAC,KAAK,CAAC,YAAY,CAAC,gBAAgB,CAAC,gDAAgD,CAAC,YAAY,EAAE,MAAM,CAAC,4LAA4L,CAAC,QAAQ,CAAC,2CAA2C,CAAC,CAAC,CAAC,EAAE,CAAC,iCAAiC,CAAC,4CAA4C,CAAC,4BAA4B,CAAC,aAAa,CAAC,2BAA2B,CAAC,2CAA2C,CAAC,2BAA2B,CAAC,wDAAwD,CAAC,CAAC,CAAC,kBAAkB,EAAE,+EAA+E,CAAC,2EAA2E,CAAC,oBAAoB,CAAC,kHAAkH,CAAC,qBAAqB,CAAC,kEAAkE,CAAC,IAAI,CAAC,2BAA2B,CAAC,8CAA8C,CAAC,EAAE,CAAC,WAAW,CAAC,YAAY,CAAC,eAAe,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC,uIAAuI,EAAE,0CAA0C,CAAC,2CAA2C,CAAC,MAAM,CAAC,4DAA4D,CAAC,OAAO,CAAC,eAAe,CAAC,kCAAkC,CAAC,QAAQ,CAAC,EAAE,CAAC,qEAAqE,CAAC,OAAO,CAAC,sCAAsC,CAAC,KAAK,CAAC,8CAA8C,CAAC,QAAQ,CAAC,SAAS,CAAC,8CAA8C,CAAC,wCAAwC,CAAC,+CAA+C,CAAC,cAAc,CAAC,wBAAwB,CAAC,0KAA0K,CAAC,sBAAsB,CAAC,wBAAwB,CAAC,yDAAyD,CAAC,qEAAqE,CAAC,eAAe,CAAC,8BAA8B,CAAC,mBAAmB,CAAC,6BAA6B,CAAC,4BAA4B,CAAC,uDAAuD,CAAC,EAAE,CAAC,oGAAoG,CAAC,6LAA6L,EAAE,6CAA6C,CAAC,qFAAqF,CAAC,8EAA8E,CAAC,mCAAmC,CAAC,cAAc,CAAC,QAAQ,CAAC,oCAAoC,CAAC,sCAAsC,CAAC,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC,2GAA2G,CAAC,uCAAuC,CAAC,uBAAuB,CAAC,yCAAyC,EAAE,wDAAwD,CAAC,EAAE,CAAC,qBAAqB,CAAC,mCAAmC,CAAC,+BAA+B,CAAC,KAAK,CAAC,WAAW,CAAC,oFAAoF,CAAC,oHAAoH,CAAC,SAAS,CAAC,iBAAiB,CAAC,4JAA4J,CAAC,0HAA0H,CAAC,sCAAsC,CAAC,kCAAkC,CAAC,sCAAsC,CAAC,mCAAmC,CAAC,sCAAsC,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,yCAAyC,CAAC,CAAC,CAAC,yBAAyB,CAAC,+EAA+E,EAAE,mGAAmG,CAAC,GAAG,CAAC,CAAC,CAAC,2BAA2B,CAAC,wBAAwB,CAAC,GAAG,CAAC,gBAAgB,CAAC,aAAa,CAAC,8BAA8B,IAAI;AACplK,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,6NAA6N,CAAC,EAAE,CAAC,2DAA2D,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC,CAAC,8DAA8D,CAAC,MAAM,CAAC,yKAAyK,CAAC,cAAc,CAAC,sBAAsB,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,SAAS,CAAC,4BAA4B,CAAC,EAAE,CAAC,iCAAiC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,uCAAuC,CAAC,GAAG,EAAE,8CAA8C,CAAC,EAAE,CAAC,OAAO,CAAC,4CAA4C,EAAE,CAAC,EAAE,yBAAyB,CAAC,cAAc,CAAC,eAAe,CAAC,+DAA+D,CAAC,yJAAyJ,CAAC,kDAAkD,CAAC,6DAA6D,CAAC,wDAAwD,CAAC,uCAAuC,CAAC,eAAe,CAAC,+EAA+E,CAAC,mBAAmB,CAAC,gCAAgC,CAAC,mEAAmE,CAAC,4CAA4C,CAAC,IAAI,CAAC,iBAAiB,CAAC,qCAAqC,CAAC,+BAA+B,CAAC,iFAAiF,CAAC,sCAAsC,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,+HAA+H,CAAC,+GAA+G,CAAC,UAAU,CAAC,cAAc,CAAC,uEAAuE,CAAC,kCAAkC,CAAC,0BAA0B,CAAC,KAAK,CAAC,EAAE,CAAC,WAAW,CAAC,4BAA4B,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,oBAAoB,CAAC,KAAK,CAAC,wHAAwH,CAAC,0CAA0C,CAAC,UAAU,CAAC,gEAAgE,CAAC,kFAAkF,CAAC,aAAa,CAAC,2CAA2C,CAAC,yBAAyB,EAAE,8FAA8F,CAAC,QAAQ,CAAC,QAAQ,CAAC,0BAA0B,CAAC,8BAA8B,CAAC,qCAAqC,CAAC,oBAAoB,CAAC,WAAW,CAAC,mBAAmB,CAAC,mBAAmB,CAAC,4BAA4B,CAAC,4BAA4B,GAAG,4BAA4B,CAAC,6CAA6C,CAAC,iEAAiE,EAAE,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,kBAAkB,CAAC,0CAA0C,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,mCAAmC,CAAC,iBAAiB,CAAC,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,qBAAqB,CAAC,EAAE,CAAC,0BAA0B,CAAC,IAAI,CAAC,cAAc,CAAC,yBAAyB,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,qEAAqE,CAAC,4CAA4C,CAAC,mJAAmJ,CAAC,2FAA2F,CAAC,+5BAA+5B,CAAC,uQAAuQ,CAAC,+FAA+F,CAAC,mJAAmJ,CAAC,uHAAuH,CAAC,+DAA+D,CAAC,2CAA2C,CAAC,2BAA2B,CAAC,2BAA2B,CAAC,+aAA+a,CAAC,uKAAuK,CAAC,+HAA+H,CAAC,+OAA+O,CAAC,uIAAuI,CAAC,+VAA+V,CAAC,mEAAmE,CAAC,+NAA+N,CAAC,2HAA2H,CAAC,2LAA2L,CAAC,uGAAuG,CAAC,uVAAuV,CAAC,uGAAuG,CAAC,+OAA+O,CAAC,uEAAuE,CAAC,+cAA+c,CAAC,+DAA+D,CAAC,uHAAuH,CAAC,uEAAuE,CAAC,mCAAmC,CAAC,mEAAmE,CAAC,2EAA2E,CAAC,+zfAA+zf,CAAC,gCAAgC,CAAC,6BAA6B,CAAC,mBAAmB,CAAC,OAAO,CAAC,4DAA4D,CAAC,UAAU,CAAC,2JAA2J,CAAC,UAAU,CAAC,iBAAiB,CAAC,yBAAyB,CAAC,uDAAuD,CAAC,QAAQ,CAAC,sDAAsD,CAAC,iBAAiB,CAAC,qBAAqB,CAAC,SAAS,CAAC,qDAAqD,CAAC,kCAAkC,CAAC,6DAA6D,CAAC,aAAa,CAAC,oIAAoI,CAAC,6CAA6C,CAAC,aAAa,CAAC,6DAA6D,CAAC,GAAG,CAAC,eAAe,CAAC,8BAA8B,CAAC,OAAO,CAAC,EAAE,CAAC,uBAAuB,CAAC,yFAAyF,CAAC,6BAA6B,CAAC,kBAAkB,CAAC,0CAA0C,IAAI;AACv40B,EAAE;;AC1hDF,GAAG;AACH,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;AACpC,CAAC,EAAE;AACH;AACA,GAAG;AACH,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK;AAC3B,CAAC,CAAC,CAAC,CAAC,KAAK;AACT,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC;AACrC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC;AACvB,CAAC,EAAE;AACH,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC;AAClD,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf;AACA,EAAE,GAAG;AACL,MAAM,GAAG;AACT,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS;AACvC,OAAO,CAAC,CAAC,CAAC,OAAO;AACjB,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI;AACnB,OAAO,EAAE;AACT,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG;AACnB;AACA,MAAM,GAAG;AACT,OAAO,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS;AACnD,OAAO,CAAC,CAAC,CAAC,OAAO;AACjB,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC;AACtB,OAAO,EAAE;AACT,MAAM,cAAc,CAAC,CAAC,CAAC,GAAG;AAC1B;AACA,MAAM,GAAG;AACT,OAAO,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS;AAC3D,OAAO,CAAC,CAAC,CAAC,OAAO;AACjB,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC;AACtB,OAAO,EAAE;AACT,MAAM,eAAe,CAAC,CAAC,CAAC,GAAG;AAC3B;AACA,MAAM,GAAG;AACT,OAAO,CAAC,CAAC,KAAK,CAAC,SAAS;AACxB,OAAO,CAAC,CAAC,CAAC,OAAO;AACjB,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI;AACnB,OAAO,EAAE;AACT,MAAM,SAAS,CAAC,CAAC,CAAC,GAAG;AACrB;AACA,MAAM,GAAG;AACT,OAAO,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS;AACzC,OAAO,EAAE;AACT,MAAM,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC;AAChC;AACA,IAAI,GAAG;AACP,KAAK,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ;AAC/B,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE;AACxD,KAAK,EAAE;AACP,MAAM,QAAQ,CAAC,CAAC,CAAC,CAAC;AAClB,QAAQ,MAAM,CAAC,CAAC,GAAG;AACnB,QAAQ,GAAG,CAAC,CAAC,GAAG;AAChB,QAAQ,MAAM,CAAC,CAAC,EAAE;AAClB,MAAM,EAAE;AACR;AACA,EAAE,YAAY,GAAG;AACjB;AACA,EAAE,GAAG;AACL,GAAG,CAAC,CAAC,SAAS,CAAC,WAAW;AAC1B,GAAG,CAAC,CAAC,CAAC,OAAO;AACb,GAAG,EAAE;AACL,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;AAC5B,IAAI,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,CAAC,EAAE,CAAC,GAAG;AAC9C;AACA,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;AACrC,MAAM,EAAE,CAAC,CAAC,aAAa,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;AAC/C,QAAQ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,EAAE;AAC5C,MAAM,CAAC;AACP,IAAI,CAAC;AACL;AACA,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO;AACpB,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AAC/C,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC;AACzC,QAAQ,EAAE,CAAC,CAAC,gBAAgB,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,CAAC;AACnD,UAAU,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,EAAE;AAC/C,QAAQ,CAAC;AACT,MAAM,CAAC;AACP,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;AACZ,MAAM,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAC5G,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI;AAC9B,IAAI,CAAC;AACL;AACA,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;AAC7B,MAAM,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,eAAe,EAAE;AACnE,IAAI,CAAC;AACL,EAAE,CAAC;AACH;AACA,EAAE,GAAG;AACL,GAAG,CAAC,CAAC,KAAK,CAAC,SAAS;AACpB,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG;AACnB,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI;AAC9B,GAAG,CAAC,CAAC,CAAC,OAAO;AACb,GAAG,EAAE;AACL,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACxC;AACA,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;AACxB,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM;AAC5D,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;AACxC,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;AAC5C,MAAM,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;AACjB;AACA,MAAM,EAAE,CAAC,cAAc,CAAC,IAAI;AAC5B,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC;AACrC,QAAQ,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;AACpH,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,IAAI;AAC/E,QAAQ,sBAAsB,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE;AAC9D,QAAQ,MAAM,CAAC;AACf,MAAM,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI;AAChC;AACA,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC;AACjE,QAAQ,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE;AAC9B;AACA,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;AACd,QAAQ,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,IAAI;AACzH,MAAM,CAAC;AACP,IAAI,CAAC;AACL;AACA,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACpC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG;AAClB,IAAI,CAAC;AACL;AACA,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AACxC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE;AAClB,IAAI,CAAC;AACL;AACA,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE;AACvC,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AAC1B,MAAM,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE;AAClC,IAAI,CAAC;AACL;AACA,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1C,MAAM,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAC5B;AACA,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE;AACpB,UAAU,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG;AACtC,UAAU,KAAK,CAAC;AAChB;AACA,QAAQ,IAAI,CAAC,CAAC,MAAM,EAAE;AACtB,UAAU,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG;AACvC,UAAU,KAAK,CAAC;AAChB,MAAM,CAAC;AACP,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,EAAE,SAAS,GAAG,CAAC,CAAC;AAC/C,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;AAC1C,UAAU,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC,CAAC;AACpD,YAAY,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,GAAG;AAC7C,UAAU,CAAC;AACX,QAAQ,CAAC;AACT,MAAM,CAAC;AACP,IAAI,CAAC;AACL;AACA,EAAE,CAAC;AACH;AACA,EAAE,GAAG;AACL,GAAG,CAAC,CAAC,cAAc;AACnB,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG;AACnB,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI;AACzB,GAAG,EAAE;AACL,EAAE,QAAQ,CAAC,sBAAsB,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/C,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACpC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,IAAI;AAC1C,IAAI,CAAC;AACL,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AACxC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE;AAClB,IAAI,CAAC;AACL,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE;AACpC;AACA,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;AACvB,MAAM,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE;AAC/B,IAAI,CAAC;AACL;AACA,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1C,MAAM,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAC5B,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE;AACpB,UAAU,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG;AACtC,UAAU,KAAK,CAAC;AAChB,QAAQ,IAAI,CAAC,CAAC,MAAM,EAAE;AACtB,UAAU,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG;AACvC,UAAU,KAAK,CAAC;AAChB,QAAQ,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI;AAC1C,UAAU,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,YAAY,MAAM;AACtE,MAAM,CAAC;AACP,IAAI,CAAC;AACL,EAAE,CAAC;AACH;AACA,EAAE,GAAG;AACL,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK;AACvB,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI;AACzB,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,QAAQ;AAC/B,GAAG,EAAE;AACL,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AACpC,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;AAC1C,MAAM,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG;AACzH,IAAI,CAAC;AACL;AACA,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACzC,MAAM,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG;AACnI,IAAI,CAAC;AACL;AACA,IAAI,EAAE,CAAC,EAAE,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;AAC1C,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG;AAC3B,IAAI,CAAC;AACL,IAAI,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE;AACnC,EAAE,CAAC;AACH;AACA,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAClC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;AAC3C,QAAQ,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG;AACtD,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI;AACjC,EAAE,CAAC;AACH;AACA,EAAE,GAAG;AACL,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK;AACtB,GAAG,CAAC,CAAC,CAAC,OAAO;AACb,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI;AACvC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI;AAC9B,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO;AAC1C,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO;AACxB,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;AACtB,GAAG,EAAE;AACL,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACxE,IAAI,EAAE,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC;AAC5C,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAC9D,QAAQ,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAClF,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;AACpD,UAAU,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;AACvB,QAAQ,CAAC;AACT,MAAM,CAAC;AACP,IAAI,CAAC;AACL,IAAI,MAAM,CAAC,IAAI,CAAC;AAChB,EAAE,EAAE;AACJ;AACA,EAAE,GAAG;AACL,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK;AACvB,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI;AACzB,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,QAAQ;AAC/B,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;AAClC,GAAG,EAAE;AACL,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC3C,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;AAC3B,IAAI,MAAM,CAAC,IAAI,CAAC;AAChB,EAAE,EAAE;AACJ;AACA,EAAE,GAAG;AACL,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI;AACzC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI;AACzB,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG;AACjB,GAAG,EAAE;AACL,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACnC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK;AAChC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAChB,MAAM,MAAM,CAAC,IAAI,CAAC;AAClB,IAAI,CAAC;AACL;AACA,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACnB,MAAM,WAAW,CAAC,KAAK,GAAG;AAC1B,MAAM,aAAa,CAAC,GAAG,GAAG;AAC1B,MAAM,UAAU,CAAC,MAAM,GAAG;AAC1B,MAAM,KAAK,CAAC,WAAW,GAAG;AAC1B,MAAM,OAAO,CAAC,SAAS,GAAG;AAC1B,MAAM,WAAW,CAAC,KAAK,GAAG;AAC1B,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;AACzB,MAAM,cAAc,CAAC,EAAE,GAAG;AAC1B,MAAM,cAAc,CAAC,EAAE,cAAc,CAAC;AACtC,MAAM,eAAe,CAAC,CAAC,eAAe,CAAC;AACvC,MAAM,SAAS,CAAC,OAAO,IAAI,CAAC;AAC5B,MAAM,YAAY,CAAC,IAAI,GAAG;AAC1B,MAAM,QAAQ,CAAC,CAAC,CAAC;AACjB,QAAQ,MAAM,CAAC,CAAC,GAAG;AACnB,QAAQ,GAAG,CAAC,CAAC,GAAG;AAChB,QAAQ,MAAM,CAAC,CAAC,EAAE;AAClB,MAAM,CAAC;AACP,IAAI,EAAE;AACN;AACA,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM;AACrE,IAAI,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChE,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;AACnC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG;AACpC;AACA,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACxB,IAAI,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS;AACjD,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM;AACxC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG;AACrC;AACA,IAAI,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO;AAC/B,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI;AACtD,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI;AACpD;AACA,IAAI,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;AAC7F,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG;AACxC;AACA,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC;AACtC,MAAM,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE;AAClC,IAAI,CAAC;AACL;AACA,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC;AAChE,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;AAClC;AACA,IAAI,EAAE,CAAC,KAAK;AACZ,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC/D;AACA,IAAI,GAAG;AACP,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AAC1D,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG;AACnE,KAAK,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,SAAS;AACpE,KAAK,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;AACjC,KAAK,EAAE;AACP,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI;AAC1C;AACA,IAAI,EAAE,GAAG,CAAC,kBAAkB;AAC5B,IAAI,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5D,MAAM,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,YAAY,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC7E,IAAI,GAAG;AACP;AACA,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO;AAC1B,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAClE,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,eAAe,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACzE,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC1E,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACxE,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,YAAY,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACtE,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,oBAAoB,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC9E,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACpE,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,eAAe,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACzE,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,oBAAoB,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC9E;AACA,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK;AACtC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM;AACrC;AACA,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,MAAM;AAChC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK;AACpC;AACA,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO;AACpF,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,oBAAoB,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC9E;AACA,IAAI,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS;AAC3B,IAAI,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7D,MAAM,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,YAAY,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC7E,IAAI,GAAG;AACP;AACA,IAAI,EAAE,CAAC,MAAM,CAAC,QAAQ;AACtB,IAAI,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;AAChC,IAAI,MAAM,CAAC,IAAI,CAAC;AAChB,EAAE,EAAE;AACJ;AACA,EAAE,GAAG;AACL,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ;AAC7C,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG;AACxB,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK;AACrB,GAAG,EAAE;AACL,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAC1C,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACzB,EAAE,EAAE;AACJ;AACA,EAAE,GAAG;AACL,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ;AAC9C,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG;AACxB,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG;AACjB,GAAG,EAAE;AACL,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACnC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE;AACxB,EAAE,EAAE;AACJ;AACA,EAAE,GAAG;AACL,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ;AAC/C,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI;AAClB,GAAG,EAAE;AACL,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACjC,IAAI,MAAM,CAAC,OAAO,CAAC;AACnB,EAAE,EAAE;AACJ;AACA,EAAE,GAAG;AACL,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS;AACpC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS;AAC1B,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AAChC,GAAG,EAAE;AACL,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAClD,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;AACxB,IAAI,eAAe,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE;AACrC,EAAE,EAAE;AACJ;AACA,EAAE,GAAG;AACL,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS;AAC1D,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS;AAC9E,GAAG,EAAE;AACL,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;AAChD,IAAI,eAAe,CAAC,aAAa,EAAE;AACnC,EAAE,EAAE;AACJ;AACA,EAAE,GAAG;AACL,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG;AAC7C,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI;AACzB,GAAG,EAAE;AACL,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACpC,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;AACvC,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG;AAClD,IAAI,CAAC;AACL,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE;AAC9B,IAAI,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC;AACzB,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;AAChC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;AAC1C,QAAQ,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE;AACzC,MAAM,CAAC;AACP,IAAI,CAAC;AACL,EAAE,EAAE;AACJ;AACA,EAAE,GAAG;AACL,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS;AACnD,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;AACtB,GAAG,EAAE;AACL,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAChC,IAAI,MAAM,CAAC,aAAa,CAAC;AACzB,EAAE,EAAE;AACJ;AACA,EAAE,GAAG;AACL,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;AAC7C,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS;AAChF,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG;AAC/C,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS;AAC7B,GAAG,EAAE;AACL,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AAC/C,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;AAC9C,MAAM,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE;AAC9B,IAAI,CAAC;AACL,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAChD,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE;AAC7B,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACvD,QAAQ,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AACxC,UAAU,cAAc,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;AACzC,QAAQ,CAAC;AACT,MAAM,CAAC;AACP,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1D,QAAQ,EAAE,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1C,UAAU,eAAe,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;AAC3C,QAAQ,CAAC;AACT,MAAM,CAAC;AACP,IAAI,CAAC;AACL,EAAE,EAAE;AACJ;AACA,EAAE,GAAG;AACL,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS;AACxC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE;AAChD,GAAG,EAAE;AACL,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACvC,IAAI,MAAM,CAAC,CAAC;AACZ,MAAM,QAAQ,CAAC,CAAC,cAAc,CAAC;AAC/B,MAAM,MAAM,CAAC,CAAC,eAAe;AAC7B,IAAI,EAAE;AACN,EAAE,EAAE;AACJ;AACA,EAAE,GAAG;AACL,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ;AACvD,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG;AACf,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,IAAI;AACzB,GAAG,EAAE;AACL,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACrC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACd,MAAM,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;AAC1B,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;AACZ,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;AAC7B,IAAI,CAAC;AACL,EAAE,EAAE;AACJ;AACA,EAAE,GAAG;AACL,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ;AAC9D,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;AACtB,GAAG,EAAE;AACL,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACxC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;AAC3B,EAAE,EAAE;AACJ;AACA,EAAE,GAAG;AACL,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI;AACnD,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG;AACxB,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK;AAC1B,GAAG,EAAE;AACL,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AACjD,IAAI,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACjC,EAAE,EAAE;AACJ;AACA,EAAE,GAAG;AACL,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM;AACjC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM;AAC3B,GAAG,EAAE;AACL,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/C,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;AAC7B,EAAE,EAAE;AACJ;AACA,EAAE,GAAG;AACL,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI;AACnC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG;AACxB,GAAG,EAAE;AACL,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACzC,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;AACvB,EAAE,EAAE;AACJ,EAAE;;AC/eF,GAAG;AACH,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACpD,CAAC,EAAE;AACH,QAAQ,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACjE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC/E;AACA,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AACpF,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;AAC7C,MAAM,KAAK,CAAC,CAAC,CAAC,GAAG;AACjB,IAAI,CAAC;AACL,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,GAAG;AAClC;AACA,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG;AAC1C,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACjE,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG;AACf,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;AACtB,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AACpB,QAAQ,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM;AAC5D,QAAQ,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,GAAG,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG;AAC9D,MAAM,CAAC;AACP,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;AACzB;AACA,MAAM,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AAChE,QAAQ,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE;AACpC,QAAQ,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;AACpE,UAAU,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE;AAC1C,QAAQ,CAAC;AACT,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;AACd,QAAQ,MAAM,CAAC,UAAU,CAAC;AAC1B,MAAM,CAAC;AACP,IAAI,CAAC;AACL;AACA,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,WAAW;AACvG,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,wBAAwB,EAAE;AAC9G;AACA,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI;AACzC;AACA,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AACzC,MAAM,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI;AAC5C,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,WAAW;AAC7G,MAAM,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,wBAAwB,EAAE;AACpH,MAAM,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;AACzC,IAAI,CAAC;AACL;AACA,IAAI,EAAE,CAAC,sBAAsB,CAAC,IAAI,CAAC,OAAO;AAC1C,IAAI,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI;AAC1D,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;AAC1D,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC;AAClB,MAAM,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,SAAS,GAAG;AACvC,IAAI,CAAC;AACL;AACA,IAAI,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG;AACtC;AACA,IAAI,MAAM,CAAC,MAAM,CAAC;AAClB,EAAE,EAAE;AACJ;AACA,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;AAC1D,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,6BAA6B,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,cAAc,EAAE;AACjG;AACA,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE;AAChE,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG;AACjD,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,gCAAgC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AACnH,IAAI,cAAc,EAAE;AACpB;AACA,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK;AACjB,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,gCAAgC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAC3I,sBAAsB,cAAc,EAAE;AACtC;AACA,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AAClD,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AAChE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;AACzB,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,0BAA0B,CAAC,CAAC,CAAC,cAAc,EAAE;AAClE;AACA,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO;AACtD,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;AAC3B,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,uBAAuB,CAAC,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC7H,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC5B,QAAQ,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC7B,MAAM,CAAC;AACP;AACA,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM;AACnD,MAAM,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;AAC9D,QAAQ,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG;AAClE,MAAM,CAAC;AACP,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;AAClE,UAAU,MAAM,CAAC,CAAC,CAAC,GAAG;AACtB,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC;AACzC,QAAQ,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,SAAS,GAAG;AACxC,MAAM,CAAC;AACP,MAAM,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG;AAC7E,IAAI,GAAG;AACP,EAAE,CAAC;AACH;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC9E,EAAE,MAAM,CAAC,IAAI,CAAC;AACd,GAAG;;ACjGH,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,sBAAsB;AAClD;AACA,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,EAAE,GAAG,CAAC,IAAI,OAAO,GAAG,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;AACpH,IAAI,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,EAAE,GAAG,CAAC,IAAI,OAAO,GAAG,SAAS,CAAC,UAAU,CAAC,qBAAqB,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;AAChI,IAAI,aAAa,GAAG,CAAC,CAAC,OAAO,KAAK,EAAE,GAAG,CAAC,IAAI,OAAO,GAAG,SAAS,CAAC,SAAS,EAAE,CAAC;AAC5E,IAAI,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC;AAC1H,IAAI,cAAc,EAAE,CAAC,CAAC,OAAO,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;AACtF;AACA,IAAI,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACtC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE;AACnB,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,mBAAmB,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC;AACtG,QAAQ,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,wBAAwB,EAAE;AACpH,QAAQ,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1B,YAAY,MAAM,CAAC,CAAC,CAAC,GAAG;AACxB,YAAY,MAAM,CAAC,CAAC,CAAC,GAAG;AACxB,YAAY,GAAG,IAAI,CAAC,CAAC,iBAAiB,CAAC,EAAE,CAAC,GAAG;AAC7C,YAAY,GAAG,IAAI,CAAC,CAAC,kBAAkB,CAAC,EAAE,CAAC,GAAG;AAC9C,QAAQ,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AACnC,UAAU,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,IAAI;AACxD,QAAQ,CAAC;AACT,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,kCAAkC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC;AAChF,UAAU,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC;AACvC,QAAQ,CAAC;AACT,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC;AAC3C,UAAU,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,SAAS,GAAG;AAC1C,QAAQ,CAAC;AACT,QAAQ,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;AAC9F,MAAM,EAAE;AACR,IAAI,EAAE;AACN;AACA,IAAI,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/C,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE;AACnB,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7C,QAAQ,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG;AAC7B,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG;AACpB,QAAQ,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,oBAAoB,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAClF,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;AACnC,UAAU,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE;AACjE,UAAU,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,kBAAkB,CAAC,IAAI,EAAE;AAC1D,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC;AAChB,UAAU,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7B,QAAQ,CAAC;AACT,QAAQ,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG;AAC7D,MAAM,EAAE;AACR,IAAI,EAAE;AACN;AACA,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACnE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACjF;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,WAAW,CAAC,OAAO,GAAG;AAC3D,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,OAAO,GAAG;AACrE;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAChF;AACA,EAAE,MAAM,CAAC,IAAI,CAAC;AACd,GAAG;AACH;AACA,QAAQ,CAAC,SAAS,EAAE,mBAAmB,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAC7E,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf;AACA,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;AACpC,IAAI,MAAM,CAAC,IAAI,CAAC;AAChB,EAAE,CAAC;AACH;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,mBAAmB,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC3F;AACA,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC,CAAC;AACnD,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,WAAW,CAAC,OAAO,GAAG;AAC/D,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AACV,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,WAAW,CAAC,OAAO,GAAG;AAC9D,EAAE,CAAC;AACH,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,OAAO,GAAG;AACtE;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,mBAAmB,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC1F;AACA,EAAE,MAAM,CAAC,IAAI,CAAC;AACd,GAAG;;AC9EH,GAAG;AACH,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK;AAC1D,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;AACjD,CAAC,EAAE;AACH,QAAQ,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACpE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAClF;AACA,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG;AACpE,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW;AACvB,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,WAAW,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACnE,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC/D;AACA,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC;AACzB,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACtE;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC7D,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAClE,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC9D;AACA,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,QAAQ,GAAG,CAAC,GAAG,CAAC,IAAI;AACrE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AACvE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI;AACxE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;AACtC,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACtE,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAClE;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACjF;AACA,EAAE,MAAM,CAAC,IAAI,CAAC;AACd,GAAG;;AC/BH,QAAQ,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACrE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACnF;AACA,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI;AAC7D,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;AACvB;AACA,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;AAChD;AACA,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC,CAAC;AACzC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AACvC,EAAE,CAAC;AACH;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1C,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAClD,IAAI,EAAE,CAAC,WAAW,GAAG,EAAE,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC;AACjD,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO;AACzE;AACA,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI;AAC/B,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;AAC/B;AACA,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK;AACpE,IAAI,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,gBAAgB,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACtE,IAAI,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,UAAU,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,OAAO;AAC3E;AACA,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG;AACvC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC;AAC7E,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7E,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AACnB,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AACpD,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG;AACvC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;AACnC,MAAM,MAAM,CAAC,GAAG,CAAC;AACjB,IAAI,GAAG;AACP;AACA,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,KAAK,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,GAAG,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACxG,EAAE,GAAG;AACL;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAClF,EAAE,MAAM,CAAC,IAAI,CAAC;AACd,GAAG;;ACzCH,GAAG;AACH,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC;AACzC,CAAC,EAAE;AACH,QAAQ,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACpE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAClF;AACA,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG;AACjE,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AACf;AACA,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACnF,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9D,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;AACvB,QAAQ,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;AACtB,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;AACnB;AACA,IAAI,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC3E,IAAI,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,UAAU,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC9E,IAAI,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,KAAK,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACzE,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ;AACxE,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ;AACzE;AACA,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC,CAAC;AAC1C,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG;AACf,IAAI,CAAC;AACL;AACA,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG;AAClE;AACA,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AACnF,EAAE,GAAG;AACL;AACA,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ;AACnB,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC,IAAI;AAChC;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACjF,EAAE,MAAM,CAAC,IAAI,CAAC;AACd,GAAG;;ACrCH,GAAG;AACH,CAAC,CAAC;AACF,CAAC,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC;AACzD,CAAC,CAAC;AACF,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;AACvE,CAAC,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;AAClE,CAAC,CAAC;AACF,CAAC,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC;AACrD,CAAC,CAAC;AACF,CAAC,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;AAC3B,CAAC,CAAC;AACF,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;AACrE,CAAC,CAAC;AACF,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG;AAC/D,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS;AACnE,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC;AACjD,CAAC,CAAC;AACF,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;AAChE,CAAC,CAAC;AACF,CAAC,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG;AACnC,CAAC,CAAC;AACF,CAAC,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;AAClB,CAAC,CAAC;AACF,CAAC,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG;AAC1C,CAAC,EAAE;AACH,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACnE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACjF;AACA,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;AACrC,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG;AACd,EAAE,CAAC;AACH,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,mBAAmB,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;AAC5D,IAAI,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACvC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACjB,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU;AAC5D,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU;AAC3D,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAChE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG;AACxC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACnE,MAAM,MAAM,CAAC,CAAC,CAAC;AACf,IAAI,CAAC;AACL,EAAE,EAAE;AACJ;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAChF,EAAE,MAAM,CAAC,IAAI,CAAC;AACd,GAAG;;AC/CH,GAAG;AACH,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACpD,CAAC,EAAE;AACH,QAAQ,CAAC,SAAS,EAAE,oBAAoB,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAC9E,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf;AACA,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC;AACtC,IAAI,MAAM,CAAC,IAAI,CAAC;AAChB,EAAE,CAAC;AACH;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,oBAAoB,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC5F;AACA,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;AACvB,MAAM,aAAa,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE;AAC1C,MAAM,KAAK,CAAC,CAAC,CAAC,GAAG;AACjB,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE;AAC3C,MAAM,IAAI,CAAC,CAAC,CAAC,GAAG;AAChB,MAAM,QAAQ,CAAC,CAAC,CAAC,GAAG;AACpB;AACA,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;AAC/D,IAAI,aAAa,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;AAC5E,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,GAAG,WAAW,GAAG;AACvE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;AACpD,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI;AACzC,IAAI,CAAC;AACL,EAAE,CAAC;AACH;AACA,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AAC7C,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;AACvD,MAAM,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;AACnC,QAAQ,IAAI,CAAC,CAAC,OAAO,EAAE;AACvB,UAAU,KAAK,CAAC;AAChB;AACA,QAAQ,IAAI,CAAC,CAAC,KAAK,EAAE;AACrB,UAAU,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE;AAC5E,UAAU,KAAK,CAAC;AAChB;AACA,QAAQ,IAAI,CAAC,CAAC,OAAO,EAAE;AACvB,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;AAC1D,YAAY,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE;AACnF,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC;AAClB,YAAY,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE;AAClG,UAAU,CAAC;AACX,UAAU,KAAK,CAAC;AAChB;AACA,QAAQ,IAAI,CAAC,CAAC,QAAQ,EAAE;AACxB,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE;AACpB,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;AACjE,UAAU,QAAQ,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE;AACrG,UAAU,KAAK,CAAC;AAChB;AACA,QAAQ,OAAO,CAAC;AAChB,UAAU,QAAQ,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE;AACrG,MAAM,CAAC;AACP,IAAI,CAAC;AACL,EAAE,CAAC;AACH;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG;AAChJ;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,oBAAoB,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC3F,EAAE,MAAM,CAAC,IAAI,CAAC;AACd,GAAG;;AC7DH,GAAG;AACH,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM;AAC7B,CAAC,EAAE;AACH,QAAQ,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/D,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC7E;AACA,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;AAC1B,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,WAAW;AAC1D;AACA,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS;AACvC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG;AACrC;AACA,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO;AAC/D,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC/D,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;AACzB,QAAQ,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW;AAC/D;AACA,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;AAC/C,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACzC,MAAM,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;AACzB,IAAI,CAAC;AACL;AACA,IAAI,MAAM,CAAC,WAAW,CAAC;AACvB,EAAE,GAAG;AACL;AACA,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS;AACvB,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,WAAW;AACrD,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;AACjC;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC5E,EAAE,MAAM,CAAC,IAAI,CAAC;AACd,GAAG;;AChCH,QAAQ,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAClE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAChF;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC,KAAK;AACtC;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC/E;AACA,EAAE,MAAM,CAAC,IAAI,CAAC;AACd,GAAG;;ACVH,GAAG;AACH,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,KAAK;AACpE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;AACjD,CAAC,EAAE;AACH,QAAQ,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/D,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf;AACA,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AACvB,IAAI,MAAM,CAAC,IAAI,CAAC;AAChB,EAAE,CAAC;AACH;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC7E;AACA,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC/B;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AAC1D,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC,CAAC;AAC3D,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE;AAC/C,IAAI,CAAC;AACL,IAAI,MAAM,CAAC,EAAE,CAAC;AACd,EAAE,GAAG;AACL;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC5E;AACA,EAAE,MAAM,CAAC,IAAI,CAAC;AACd,GAAG;;ACzBH,GAAG;AACH,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC;AAC9E,CAAC,EAAE;AACH,QAAQ,CAAC,SAAS,EAAE,mBAAmB,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAC7E,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,mBAAmB,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC3F;AACA,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,CAAC;AAC1E,EAAE,EAAE,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC;AAC1C,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,SAAS,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI;AACrE;AACA,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AACrB,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI;AACnD;AACA,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;AACb,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI;AACpC;AACA,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;AACb,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI;AACpC;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,mBAAmB,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC1F,EAAE,MAAM,CAAC,IAAI,CAAC;AACd,GAAG;;ACtBH,GAAG;AACH,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC;AACtF,CAAC,CAAC;AACF,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,QAAQ,CAAC;AACpF,CAAC,CAAC;AACF,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,MAAM,IAAI,EAAE;AAC9C,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,IAAI,CAAC,cAAc,IAAI,EAAE;AAC3D,CAAC,CAAC;AACF,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,WAAW;AACrE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;AACpE,CAAC,EAAE;AACH,QAAQ,CAAC,SAAS,EAAE,sBAAsB,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAChF,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,sBAAsB,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC9F;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,wBAAwB,EAAE;AAC3E,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,wBAAwB,EAAE;AAC/F;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,sBAAsB,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC7F,EAAE,MAAM,CAAC,IAAI,CAAC;AACd,GAAG;;ACpBH,GAAG;AACH,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;AAC9D,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC5D,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;AAC5C,CAAC,EAAE;AACH,QAAQ,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACpE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAClF;AACA,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG;AACjD,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;AAC1C,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI;AACb,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG;AAC3B,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;AACzC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG;AAC1B,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG;AAC1B,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC;AACvD,IAAI,CAAC,OAAO,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,wBAAwB,EAAE;AAC7E;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACjF,EAAE,MAAM,CAAC,IAAI,CAAC;AACd,GAAG;;ACtBH,GAAG;AACH,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI;AACzE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;AAC1E,CAAC,EAAE;AACH,QAAQ,CAAC,SAAS,EAAE,qCAAqC,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/F,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,qCAAqC,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC7G;AACA,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACrC,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;AACxD,MAAM,QAAQ,CAAC,CAAC,CAAC,6CAA6C,EAAE,CAAC;AACjE;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;AACnD,IAAI,MAAM,CAAC,UAAU;AACrB,MAAM,CAAC,OAAO,SAAS,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG;AAC3C,MAAM,CAAC,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,wBAAwB,EAAE;AAC1E,EAAE,GAAG;AACL;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;AACvD,IAAI,MAAM,CAAC,UAAU;AACrB,MAAM,CAAC,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,wBAAwB,EAAE;AAC1E,EAAE,GAAG;AACL;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,qCAAqC,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC5G,EAAE,MAAM,CAAC,IAAI,CAAC;AACd,GAAG;;ACzBH,GAAG;AACH,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI;AAC7D,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ;AAC5D,CAAC,CAAC,CAAC,OAAO,CAAC;AACX,CAAC,CAAC,CAAC,GAAG,IAAI;AACV,CAAC,CAAC,KAAK,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;AACzB,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE;AAC3B,CAAC,CAAC,KAAK,GAAG;AACV,CAAC,CAAC,CAAC,GAAG;AACN,CAAC,EAAE;AACH,QAAQ,CAAC,SAAS,EAAE,gBAAgB,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAC1E,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf;AACA,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO;AACxC,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;AAC9B,IAAI,MAAM,CAAC,IAAI,CAAC;AAChB,EAAE,CAAC;AACH;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,gBAAgB,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACxF;AACA,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AACf;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,QAAQ,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AAC3H,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;AAC5D;AACA,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK;AACxC,IAAI,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,UAAU,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC9E,IAAI,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,KAAK,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACzE,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ;AACxE,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU;AAC3E;AACA,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG;AACjJ;AACA,IAAI,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC7E;AACA,IAAI,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE;AAC5D,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;AACpE,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;AAC9B,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;AAC1G,EAAE,GAAG;AACL;AACA,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,QAAQ;AAC9B,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC,IAAI;AAChC;AACA,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,gBAAgB,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACvF,GAAG;;AC7CH,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACnE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACjF,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;AAC1C,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;AACnE,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAChF,EAAE,MAAM,CAAC,IAAI,CAAC;AACd,GAAG;;ACPH,GAAG;AACH,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ;AACxE,CAAC,EAAE;AACH,QAAQ,CAAC,SAAS,EAAE,YAAY,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACtE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,YAAY,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACpF;AACA,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3D,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,UAAU,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC7F,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;AACjE,EAAE,EAAE;AACJ;AACA,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;AACtB,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG;AACnG;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,YAAY,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACnF,EAAE,MAAM,CAAC,IAAI,CAAC;AACd,GAAG;;ACjBH,QAAQ,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACrE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf;AACA,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACpC,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;AACvB;AACA,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK;AACxB,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG;AACjD,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI;AAC7C;AACA,IAAI,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK;AACjC,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI;AAC/C;AACA,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC;AACzE,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;AAC/E;AACA,IAAI,MAAM,CAAC,SAAS,CAAC;AACrB,EAAE,EAAE;AACJ,GAAG;;AClBH,QAAQ,CAAC,SAAS,EAAE,cAAc,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACxE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,cAAc,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACtF;AACA,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AACnB,QAAQ,CAAC,GAAG,EAAE;AACd,QAAQ,CAAC,GAAG,EAAE;AACd,QAAQ,CAAC,EAAE,EAAE;AACb,QAAQ,CAAC,EAAE,EAAE;AACb,QAAQ,CAAC,EAAE,EAAE;AACb,QAAQ,CAAC,EAAE,EAAE;AACb,QAAQ,CAAC,EAAE,EAAE;AACb,QAAQ,CAAC,EAAE,EAAE;AACb,QAAQ,CAAC,UAAU,EAAE;AACrB,QAAQ,CAAC,KAAK,EAAE;AAChB,QAAQ,CAAC,EAAE,EAAE;AACb,QAAQ,CAAC,EAAE,EAAE;AACb,QAAQ,CAAC,EAAE,EAAE;AACb,QAAQ,CAAC,MAAM,EAAE;AACjB,QAAQ,CAAC,QAAQ,EAAE;AACnB,QAAQ,CAAC,IAAI,EAAE;AACf,QAAQ,CAAC,QAAQ,EAAE;AACnB,QAAQ,CAAC,MAAM,EAAE;AACjB,QAAQ,CAAC,IAAI,EAAE;AACf,QAAQ,CAAC,KAAK,EAAE;AAChB,QAAQ,CAAC,OAAO,EAAE;AAClB,QAAQ,CAAC,MAAM,EAAE;AACjB,QAAQ,CAAC,MAAM,EAAE;AACjB,QAAQ,CAAC,GAAG,EAAE;AACd,QAAQ,CAAC,OAAO,EAAE;AAClB,QAAQ,CAAC,KAAK,EAAE;AAChB,QAAQ,CAAC,OAAO,EAAE;AAClB,QAAQ,CAAC,KAAK,EAAE;AAChB,QAAQ,CAAC,MAAM,EAAE;AACjB,QAAQ,CAAC,MAAM,EAAE;AACjB,QAAQ,CAAC,MAAM,EAAE;AACjB,QAAQ,CAAC,MAAM,EAAE;AACjB,QAAQ,CAAC,KAAK,EAAE;AAChB,QAAQ,CAAC,CAAC,CAAC;AACX,MAAM,EAAE;AACR,MAAM,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3D,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC;AAC7B,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ;AAC3D,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ;AAC5D,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,UAAU,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACjE,QAAQ,CAAC;AACT,QAAQ,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;AACxE,MAAM,EAAE;AACR;AACA,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC,CAAC;AACzC,IAAI,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI;AACzC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,kBAAkB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AACnE,MAAM,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG;AACtC,IAAI,GAAG;AACP,EAAE,CAAC;AACH;AACA,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM;AACrB,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC9C;AACA,IAAI,GAAG,CAAC,QAAQ,CAAC;AACjB,QAAQ,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG;AAC/E,QAAQ,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ;AACpD,QAAQ,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;AAC7C,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI;AAC/E,IAAI,KAAK,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1E;AACA,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK;AACrE;AACA;AACA,MAAM,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ;AAC1C,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;AAClE,MAAM,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW;AAC5B,UAAU,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG;AAC9G;AACA,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI;AACjC,MAAM,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;AACxC,QAAQ,KAAK,CAAC;AACd,MAAM,CAAC;AACP,MAAM,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,WAAW,EAAE;AAC7C,IAAI,CAAC;AACL,EAAE,CAAC;AACH,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI;AACpB,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAC1E,IAAI,QAAQ,CAAC,SAAS,EAAE,WAAW,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,GAAG;AAC/D;AACA,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ;AAC9C,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACtE,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;AACpE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG;AACjC;AACA,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ;AACnE,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAC/E,IAAI,QAAQ,CAAC,SAAS,EAAE,WAAW,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,GAAG;AAC/D;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,cAAc,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACrF,EAAE,MAAM,CAAC,IAAI,CAAC;AACd,GAAG;;ACjGH,GAAG;AACH,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ;AAC3D,CAAC,EAAE;AACH,QAAQ,CAAC,SAAS,EAAE,aAAa,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACvE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,aAAa,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACrF;AACA,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAChC,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;AAC5D,EAAE,CAAC;AACH;AACA,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI;AAC3B,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACrD,IAAI,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE;AAC5B,EAAE,GAAG;AACL;AACA,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU;AACjC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAClE,IAAI,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE;AAC5B,EAAE,GAAG;AACL;AACA,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU;AAC9B,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1E,IAAI,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE;AAC5B,EAAE,GAAG;AACL;AACA,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;AACtC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACnD,IAAI,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE;AAC5B,EAAE,GAAG;AACL;AACA,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,EAAE,KAAK;AACpF;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,aAAa,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACpF,EAAE,MAAM,CAAC,IAAI,CAAC;AACd,GAAG;AACH;AACA,GAAG;AACH,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK;AACpB,CAAC,EAAE;AACH,QAAQ,CAAC,SAAS,EAAE,eAAe,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACzE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,eAAe,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACvF;AACA,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACvD,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE;AACxC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC;AAC5E,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAClB;AACA,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;AACtC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AAC1B,MAAM,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,GAAG;AAC3E,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AACzB,QAAQ,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,MAAM;AAChE,QAAQ,KAAK,CAAC;AACd,MAAM,CAAC;AACP,MAAM,EAAE,KAAK,CAAC;AACd,IAAI,CAAC;AACL,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE;AACjD,EAAE,CAAC;AACH;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,eAAe,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACtF,EAAE,MAAM,CAAC,IAAI,CAAC;AACd,GAAG;;AC/DH,GAAG;AACH,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ;AAC7E,CAAC,EAAE;AACH,QAAQ,CAAC,SAAS,EAAE,eAAe,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACzE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,eAAe,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACvF;AACA,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3D,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ;AAC3B,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,UAAU,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC7F,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;AAC1G,EAAE,EAAE;AACJ;AACA,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC;AACrB,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG;AAC5I;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,eAAe,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACtF,EAAE,MAAM,CAAC,IAAI,CAAC;AACd,GAAG;;AClBH,QAAQ,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACjE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC/E;AACA,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE;AAC9G;AACA,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;AAC5B,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;AACb,EAAE,EAAE,CAAC,QAAQ;AACb,EAAE,EAAE;AACJ,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;AACb,EAAE,EAAE,CAAC,QAAQ;AACb,EAAE,EAAE;AACJ,MAAM,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;AACnH,MAAM,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;AACnH;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAChE;AACA,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC1E,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;AACvE,QAAQ,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC;AAClC,QAAQ,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI;AACjF,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACxE,EAAE,GAAG;AACL;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAChE,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC1E,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;AACvE,QAAQ,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;AACtC,QAAQ,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI;AACjF,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACxE,EAAE,GAAG;AACL;AACA,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC;AACvB,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;AAChB,EAAE,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;AACjB,EAAE,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AACxC,EAAE,EAAE,EAAE,GAAG;AACT,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;AACrB,EAAE,EAAE;AACJ,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;AACrI;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC/D,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACnB,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;AACrC,MAAM,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI;AACnD,IAAI,CAAC;AACL;AACA,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACxE,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;AACvE,QAAQ,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC;AAClD,QAAQ,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI;AACzE;AACA,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACrE,EAAE,GAAG;AACL;AACA,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzB,IAAI,GAAG,CAAC,KAAK,CAAC;AACd,QAAQ,MAAM,CAAC;AACf;AACA,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU;AACjF,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;AACrC,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,cAAc,CAAC,KAAK;AAC7C,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;AAC9B,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE;AACrB,MAAM,CAAC;AACP,IAAI,CAAC;AACL;AACA,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACd;AACA,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;AAC3E,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;AAC3D,MAAM,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC;AACtC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AACjD,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG;AAC1B,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;AACZ,MAAM,MAAM,CAAC,CAAC,CAAC,GAAG;AAClB,IAAI,CAAC;AACL;AACA,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC;AACrC,MAAM,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;AAC7B,IAAI,CAAC;AACL;AACA,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC;AACvC,MAAM,KAAK,CAAC,CAAC,CAAC,KAAK;AACnB,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;AAC3B,QAAQ,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;AACxD,QAAQ,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG;AAC9B,QAAQ,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG;AAC3B,QAAQ,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG;AAC3B,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;AACvF,QAAQ,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;AACtF,QAAQ,CAAC,OAAO,wCAAwC,CAAC,CAAC,CAAC,GAAG;AAC9D,QAAQ,CAAC,WAAW,GAAG;AACvB,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;AACrC,MAAM,KAAK,CAAC,CAAC,CAAC,KAAK;AACnB,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;AAC3B,QAAQ,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;AACxD,QAAQ,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI;AAC/B,QAAQ,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;AAC5B,QAAQ,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;AAC5B,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAC1B,QAAQ,CAAC,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI;AAC9B,QAAQ,CAAC,WAAW,GAAG;AACvB,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;AACZ,MAAM,KAAK,CAAC,CAAC,CAAC,KAAK;AACnB,QAAQ,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG;AAC9B,QAAQ,CAAC,WAAW,GAAG;AACvB,IAAI,CAAC;AACL;AACA,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC;AACpC,MAAM,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;AAC7B,IAAI,CAAC;AACL;AACA,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC;AACxC,MAAM,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,KAAK;AAC9D,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;AACZ,MAAM,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACxC,IAAI,CAAC;AACL,IAAI,MAAM,CAAC,KAAK,CAAC;AACjB,EAAE,CAAC;AACH;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC9E,EAAE,MAAM,CAAC,IAAI,CAAC;AACd,GAAG;;AC7HH,GAAG;AACH,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACpD,CAAC,EAAE;AACH,QAAQ,CAAC,SAAS,EAAE,cAAc,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACxE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,cAAc,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACtF;AACA,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,KAAK,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACxE,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE;AACxD,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE;AACzD,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE;AACxD;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,cAAc,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACrF,EAAE,MAAM,CAAC,IAAI,CAAC;AACd,GAAG;;ACdH,GAAG;AACH,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC,EAAE;AACH,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAChE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC9E;AACA,EAAE,GAAG,CAAC,YAAY,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AACnL,MAAM,WAAW,OAAO,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAC/J,MAAM,YAAY,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,UAAU,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAC/L,MAAM,eAAe,GAAG,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;AAC7E,MAAM,iBAAiB,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC;AACtD;AACA,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7F,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;AACjC,IAAI,MAAM,CAAC,aAAa,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE;AACtF,EAAE,CAAC;AACH;AACA,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AACvF;AACA,IAAI,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;AAChC,QAAQ,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;AAClC,QAAQ,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;AACtC;AACA,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,GAAG;AAClC;AACA,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;AACjB,MAAM,KAAK,CAAC,CAAC,CAAC,GAAG;AACjB,IAAI,CAAC;AACL,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG;AAC1C,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACjE,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG;AACf;AACA,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5C,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7C,QAAQ,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM;AAC5D,QAAQ,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,GAAG,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG;AAC7D,MAAM,CAAC;AACP,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;AACzB;AACA,MAAM,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AACxD,QAAQ,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE;AAC5B,QAAQ,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;AAC5D,UAAU,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE;AAClC,QAAQ,CAAC;AACT,QAAQ,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AAC1D,UAAU,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC;AACtC,UAAU,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC;AACxC,QAAQ,CAAC;AACT,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;AACd,QAAQ,MAAM,CAAC,UAAU,CAAC;AAC1B,MAAM,CAAC;AACP,IAAI,CAAC;AACL;AACA,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO;AACrB,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG;AAC9B,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE;AACvE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,wBAAwB,EAAE;AACvG,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE;AAC/D,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,wBAAwB,EAAE;AAC9G,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;AAChE;AACA,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAChB,MAAM,KAAK,CAAC,CAAC,CAAC,KAAK;AACnB,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG;AAChC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE;AACrE,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,wBAAwB,EAAE;AACzG,MAAM,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;AACzC,IAAI,CAAC;AACL;AACA,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;AAC1B,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAChD,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AAClD;AACA,MAAM,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;AACzC,MAAM,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI;AAC3C,IAAI,CAAC;AACL;AACA,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;AACpB;AACA,IAAI,MAAM,CAAC,MAAM,CAAC;AAClB,EAAE,CAAC;AACH;AACA,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;AAClE,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,aAAa,EAAE;AACtD;AACA,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE;AACrF;AACA,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM;AAC1B,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,mBAAmB,EAAE;AACzD;AACA,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG;AACjD,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,aAAa,EAAE;AAClD;AACA,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK;AACjB,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,aAAa,EAAE;AACnD;AACA,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC;AAClD,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,aAAa,EAAE;AACxD;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC7E,EAAE,MAAM,CAAC,IAAI,CAAC;AACd,GAAG;;ACvGH,QAAQ,CAAC,SAAS,EAAE,cAAc,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACxE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,cAAc,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACtF;AACA,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;AAC5E,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM;AAClF,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC;AAC9C;AACA,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3C,IAAI,EAAE;AACN,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;AACrC,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,mBAAmB,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC7E,IAAI,CAAC;AACL,IAAI,EAAE;AACN,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;AAC9B,EAAE,CAAC;AACH;AACA,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW;AACtB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC,CAAC;AAC1C,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACtE,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,MAAM,IAAI;AACjE,IAAI,GAAG;AACP,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACpE,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,GAAG,MAAM,IAAI;AACxD,IAAI,GAAG;AACP,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACnE,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,EAAE,IAAI;AAChD,IAAI,GAAG;AACP,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AACV,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACjE,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AACtF,IAAI,GAAG;AACP,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/D,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7E,IAAI,GAAG;AACP,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACjE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;AACvG,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AACrE,IAAI,GAAG;AACP,EAAE,CAAC;AACH;AACA,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS;AACxB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC,CAAC;AACxC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACjG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,MAAM,IAAI;AACxE,IAAI,GAAG;AACP,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7F,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,GAAG,MAAM,IAAI;AAC/D,IAAI,GAAG;AACP,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACzF,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,EAAE,IAAI;AACvD,IAAI,GAAG;AACP,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AACV,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACvE,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AACtF,IAAI,GAAG;AACP,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACnE,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7E,IAAI,GAAG;AACP,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACnE,MAAM,EAAE,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;AACxG,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AACrE,IAAI,GAAG;AACP,EAAE,CAAC;AACH;AACA;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,cAAc,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACrF,EAAE,MAAM,CAAC,IAAI,CAAC;AACd,GAAG;;ACrEH,GAAG;AACH,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC;AAC/D,CAAC,EAAE;AACH,QAAQ,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/D,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf;AACA,EAAE,GAAG;AACL,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,EAAE;AAC7E,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;AAChC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO;AAC5B,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY;AAClC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;AACtB,GAAG,EAAE;AACL,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;AACrD,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACxE,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACxE,IAAI,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;AAC/D,IAAI,EAAE;AACN,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK;AACxE,IAAI,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;AAC3B,IAAI,EAAE;AACN,IAAI,EAAE,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO;AAC1C,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO;AAC3C,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,IAAI,EAAE;AACN,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM;AAC1E,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;AAC1C,IAAI,EAAE;AACN,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AACxE,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE;AACtE,IAAI,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS;AACpE,IAAI,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;AACpE,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACpE,IAAI,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG;AACnD,IAAI,OAAO,CAAC,UAAU,GAAG;AACzB;AACA,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;AACjC,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG;AAC/C;AACA,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;AAC5C,IAAI,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AACpB;AACA,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;AACjI,QAAQ,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG;AAC3D;AACA,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC;AACpF,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM;AACxC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ;AACrD,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC,CAAC;AACvD,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;AAC3H,IAAI,CAAC;AACL;AACA,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAC5F,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI;AACnD;AACA,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACrE,UAAU,WAAW,CAAC,CAAC,CAAC,GAAG;AAC3B;AACA,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS;AACrC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;AACzC,QAAQ,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI;AAC/E,QAAQ,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAChE,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,MAAM,IAAI;AACxH,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACxB,YAAY,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE;AAC9B,UAAU,CAAC;AACX,UAAU,GAAG,CAAC,EAAE,CAAC,IAAI;AACrB,UAAU,MAAM,CAAC,GAAG,CAAC;AACrB,QAAQ,GAAG;AACX,MAAM,CAAC;AACP;AACA,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG;AACnB,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5B,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;AACjE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAC9C,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;AACpB,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC;AAChC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI;AACjF,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM;AACxG,MAAM,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1E,QAAQ,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAC1B,MAAM,GAAG;AACT;AACA,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AAC7B,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE;AACjD,MAAM,EAAE,CAAC,GAAG,CAAC,OAAO;AACpB,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC/C,QAAQ,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC9E,QAAQ,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACxE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;AACd,QAAQ,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;AACnC,QAAQ,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACnE,QAAQ,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;AACtD,QAAQ,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC5E;AACA,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU;AACpC,QAAQ,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG;AAC9C,QAAQ,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;AAC5B,UAAU,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC1E,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC;AAChB,UAAU,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACzE,QAAQ,CAAC;AACT,MAAM,CAAC;AACP;AACA,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAC9C,MAAM,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC,IAAI;AACpC,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;AACvD,MAAM,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;AAC3D;AACA,MAAM,MAAM,CAAC,IAAI,CAAC;AAClB,IAAI,GAAG;AACP;AACA,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,QAAQ;AAChC,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;AACzC;AACA,IAAI,OAAO,CAAC,UAAU,GAAG;AACzB;AACA,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;AACvB,MAAM,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI;AAC5C,IAAI,CAAC;AACL;AACA,IAAI,MAAM,CAAC,OAAO,CAAC;AACnB,EAAE,CAAC;AACH;AACA,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC9C,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAC1D,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC5B,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,OAAO;AACzC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAClC,QAAQ,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;AACzC,MAAM,CAAC;AACP,IAAI,CAAC;AACL,IAAI,MAAM,CAAC,GAAG;AACd,EAAE,CAAC;AACH;AACA,EAAE,GAAG;AACL,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC;AAClE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI;AACzB,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ;AAC7B,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY;AAClC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;AACtB,GAAG,EAAE;AACL,EAAE,QAAQ,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;AACjE,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO;AAChE,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK;AACrF,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAC3G,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAC3G,QAAQ,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AACzD,QAAQ,MAAM,CAAC,CAAC,CAAC,GAAG;AACpB;AACA,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/B,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE;AACzC,YAAY,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;AACrD,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzB,UAAU,EAAE,CAAC,KAAK;AAClB,UAAU,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;AACvI;AACA,UAAU,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ;AAC5C,UAAU,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;AACvD,UAAU,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AAC3D;AACA,UAAU,EAAE,OAAO;AACnB,UAAU,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG;AAClC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC;AAChB,UAAU,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;AACzH,QAAQ,CAAC;AACT,MAAM,GAAG,IAAI,EAAE;AACf,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;AACZ,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;AACnD,MAAM,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;AACrH,IAAI,CAAC;AACL;AACA,IAAI,MAAM,CAAC,MAAM,CAAC;AAClB,EAAE,CAAC;AACH;AACA,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG;AAC/B,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC7E,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;AAClD,EAAE,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK;AACjD,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AACf;AACA,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;AAC3B,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;AACpH,MAAM,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACvC,QAAQ,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;AAChE,QAAQ,MAAM,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE;AAC3D,MAAM,CAAC;AACP,IAAI,EAAE;AACN,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AACV,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;AAC9H,MAAM,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3C,QAAQ,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;AAChE,QAAQ,MAAM,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE;AAC5D,MAAM,CAAC;AACP,IAAI,EAAE;AACN,EAAE,CAAC;AACH;AACA,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ;AACnB,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC,IAAI;AAChC,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC5E,EAAE,MAAM,CAAC,IAAI,CAAC;AACd,GAAG;;AC1MH,GAAG;AACH,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ;AAC5C,CAAC,EAAE;AACH,QAAQ,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAClE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf;AACA,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC1B,IAAI,MAAM,CAAC,IAAI,CAAC;AAChB,EAAE,CAAC;AACH;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAChF;AACA,EAAE,QAAQ,CAAC,qBAAqB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAC5C,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG;AAChD,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;AACnC;AACA,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU;AAChD,IAAI,EAAE,CAAC,MAAM,CAAC,MAAM;AACpB,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO;AACrB,MAAM,EAAE,CAAC,SAAS,CAAC,KAAK;AACxB,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG;AAC7B,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM;AACtB,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI;AAC/B;AACA,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG;AAC9C,IAAI,OAAO,CAAC,OAAO,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAC5E,MAAM,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC3C,MAAM,MAAM,CAAC,GAAG;AAChB,IAAI,GAAG;AACP,EAAE,CAAC;AACH;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACpG,IAAI,qBAAqB,CAAC,OAAO,EAAE;AACnC,IAAI,MAAM,CAAC,EAAE,CAAC,EAAE;AAChB,EAAE,GAAG;AACL;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACpG,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AACjB,MAAM,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;AACvC,IAAI,CAAC;AACL,IAAI,qBAAqB,CAAC,OAAO,EAAE;AACnC,IAAI,MAAM,CAAC,EAAE,CAAC,EAAE;AAChB,EAAE,GAAG;AACL;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;AACjC;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC/E,EAAE,MAAM,CAAC,IAAI,CAAC;AACd,GAAG;;AChDH,GAAG;AACH,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM;AAClD,CAAC,EAAE;AACH,QAAQ,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACjE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC/E;AACA,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAChD,EAAE,EAAE,CAAC,WAAW,GAAG,EAAE,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC;AAC/C,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,WAAW;AAC1E;AACA,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI;AAC7B,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;AACjC;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC9E,EAAE,MAAM,CAAC,IAAI,CAAC;AACd,GAAG;;AChBH,GAAG;AACH,CAAC,CAAC;AACF,CAAC,EAAE;AACH,QAAQ,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACpE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAClF,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;AACtC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;AACnC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI;AACnC;AACA,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;AACpC,MAAM,QAAQ,CAAC,CAAC,CAAC,GAAG;AACpB,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;AAC1C;AACA,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACjC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE;AACvB,IAAI,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE;AACzC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5C,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE;AACzB;AACA,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM;AAC1E,IAAI,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC;AACpE,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACvC,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACnE,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI;AAC7C,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG;AACpB,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE;AACzB,IAAI,CAAC;AACL,EAAE,CAAC;AACH;AACA,EAAE,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;AAC9B,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;AACxB,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAC7B,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG;AACvB,QAAQ,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE;AACjC,QAAQ,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;AACzB,IAAI,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,GAAG;AAC/C,IAAI,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG;AAClE,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;AAC9C,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AAC5B,UAAU,GAAG,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AAC5B;AACA,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC1B,QAAQ,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE;AAC7C,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;AACd,QAAQ,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ;AAC1D,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AACvB,UAAU,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI;AAC5C,UAAU,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACzG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC;AAChB,UAAU,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,EAAE,SAAS,CAAC;AAC1D,QAAQ,CAAC;AACT,MAAM,CAAC;AACP,MAAM,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK;AAC9E;AACA,MAAM,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE;AAC9E,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI;AAC3C,MAAM,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;AAC7D,QAAQ,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;AACxB,MAAM,CAAC;AACP,IAAI,CAAC;AACL,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;AAC7B,EAAE,CAAC;AACH,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,GAAG;AAC7B,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;AACtC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;AACnC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI;AACnC,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACjF,GAAG;;ACrEH,GAAG;AACH,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS;AAChB,CAAC,EAAE;AACH,QAAQ,CAAC,SAAS,EAAE,YAAY,EAAE,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAC3E,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf;AACA,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AACnB,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE;AACxD;AACA,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AACzB,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,UAAU;AAC1E,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;AACvB,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;AAClC,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG;AAC/B,IAAI,CAAC;AACL,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE;AACzC,EAAE,CAAC;AACH;AACA,EAAE,MAAM,CAAC,IAAI,CAAC;AACd,GAAG;;ACnBH,GAAG;AACH,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,KAAK;AACpE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;AACjD,CAAC,EAAE;AACH,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACnE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACjF,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACjE,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,qCAAqC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC7F,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,sBAAsB,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC9E;AACA,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;AAC3D,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC;AAC5C,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC9D,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC/D;AACA,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,GAAG,GAAG;AAC1D,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACzD,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,GAAG,GAAG;AACnD,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACjE,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,mBAAmB,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC3E,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC7D,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACjE,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACtE,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,aAAa,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACrE,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAChE;AACA,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK;AAC3C,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,aAAa,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACrE;AACA,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM;AAClC,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,mBAAmB,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC3E;AACA,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM;AACnB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC;AACjC,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM;AAC5B,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;AACzF,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AAC/B,MAAM,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG;AAC9C,IAAI,CAAC;AACL,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AACV,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM;AAC1B,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG;AAC9C,EAAE,CAAC;AACH;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAChF,EAAE,MAAM,CAAC,IAAI,CAAC;AACd,GAAG;;AChDH,QAAQ,CAAC,SAAS,EAAE,aAAa,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACvE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf;AACA,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9B,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;AACrC,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,mBAAmB,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC7E,IAAI,CAAC;AACL,IAAI,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG;AACpC,EAAE,CAAC;AACH;AACA,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;AAC9B,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,aAAa,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACvF,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,GAAG;AACxG,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,aAAa,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACtF,EAAE,CAAC;AACH;AACA,EAAE,MAAM,CAAC,IAAI,CAAC;AACd,GAAG;;ACjBH,GAAG;AACH,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;AACnE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;AACnB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;AACzD,CAAC,EAAE;AACH,QAAQ,CAAC,SAAS,EAAE,oBAAoB,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAC9E,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf;AACA,EAAE,GAAG,CAAC,KAAK,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;AACtL,MAAM,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,UAAU,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;AAChO;AACA,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG;AAC5E,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AACf;AACA,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAC1F,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,GAAG;AAClC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,UAAU,MAAM,IAAI,CAAC,CAAC;AAC9C,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ;AACxB,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;AACrD,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;AACZ,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,mBAAmB,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW;AACjI,IAAI,CAAC;AACL;AACA,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;AACrB,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;AACtD,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC;AACvD,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC;AAChC;AACA,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;AACZ,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAClB,QAAQ,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI;AAClE,MAAM,CAAC;AACP,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;AAC1D,QAAQ,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AACvC,UAAU,KAAK,CAAC,EAAE,KAAK,CAAC;AACxB,UAAU,MAAM,CAAC,CAAC,MAAM;AACxB,QAAQ,EAAE;AACV,MAAM,CAAC;AACP,IAAI,CAAC;AACL,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI;AACrD,IAAI,MAAM,CAAC,GAAG;AACd,EAAE,EAAE;AACJ;AACA,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU;AAChD,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE;AAChD;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE;AAC1C;AACA,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,QAAQ;AAC9B,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC,IAAI;AAChC;AACA,EAAE,MAAM,CAAC,IAAI,CAAC;AACd,GAAG;;ACpDH,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAChE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf;AACA,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AACxB,IAAI,MAAM,CAAC,IAAI,CAAC;AAChB,EAAE,CAAC;AACH;AACA,EAAE,GAAG,CAAC,QAAQ,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;AAC9I,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;AACnI,MAAM,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;AAC3I;AACA,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAChC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;AACrC,MAAM,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI;AACzC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;AAClD,MAAM,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI;AAC1C,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;AACnD,MAAM,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI;AAC3C,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;AACZ,MAAM,MAAM,CAAC,GAAG;AAChB,IAAI,CAAC;AACL,EAAE,CAAC;AACH;AACA,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AACzC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG;AAChB,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,GAAG;AAC3B,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,aAAa;AAC5H,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;AAC1D,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI;AACnE,IAAI,CAAC;AACL,IAAI,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACvE;AACA,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;AACzD,EAAE,CAAC;AACH;AACA,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AACrC,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC1E,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;AACrD,EAAE,CAAC;AACH;AACA,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AACxC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;AACxC,QAAQ,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;AAChC;AACA,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACtC,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE;AACvB,IAAI,CAAC;AACL,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE;AACvC;AACA,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACxC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE;AACrB,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3C,QAAQ,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE;AAC3B,MAAM,CAAC;AACP,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;AACtB,IAAI,CAAC;AACL,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;AACjC,IAAI,MAAM,CAAC,EAAE,CAAC;AACd,EAAE,CAAC;AACH;AACA,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AAClC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,GAAG;AAC7C;AACA,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7C,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI;AACrE,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC;AAC5C,QAAQ,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI;AAC/D,MAAM,CAAC;AACP,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC;AAC5C,QAAQ,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI;AAC/D,MAAM,CAAC;AACP,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK;AACxE,MAAM,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACvF,IAAI,CAAC;AACL;AACA,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM;AACpF,QAAQ,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM;AACnF,QAAQ,QAAQ,CAAC,CAAC,CAAC,GAAG;AACtB,QAAQ,OAAO,CAAC,CAAC,CAAC,GAAG;AACrB,QAAQ,MAAM,CAAC,CAAC,CAAC,GAAG;AACpB,QAAQ,KAAK,CAAC,CAAC,CAAC,GAAG;AACnB;AACA,IAAI,UAAU,CAAC,KAAK,GAAG;AACvB,IAAI,UAAU,CAAC,KAAK,GAAG;AACvB;AACA,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7C,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACxC,QAAQ,QAAQ,CAAC;AACjB,MAAM,CAAC;AACP,MAAM,QAAQ,CAAC,IAAI,CAAC;AACpB,QAAQ,UAAU,CAAC,CAAC,CAAC;AACrB,UAAU,CAAC,KAAK,KAAK;AACrB,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7B,YAAY,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG;AAC5B,UAAU,EAAE;AACZ,MAAM,EAAE;AACR,IAAI,CAAC;AACL;AACA,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/C,MAAM,MAAM,CAAC,QAAQ,CAAC;AACtB,IAAI,CAAC;AACL;AACA,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC5C,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,IAAI;AAC7C,IAAI,CAAC;AACL;AACA,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7C,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;AACnD,QAAQ,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG;AACvB,MAAM,CAAC;AACP,MAAM,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI;AAC3D,IAAI,CAAC;AACL;AACA,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC3C,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;AACnB,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AACnD,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;AAC3D;AACA,QAAQ,CAAC;AACT,QAAQ,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI;AAC1D,MAAM,CAAC;AACP,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE;AACtB,IAAI,CAAC;AACL;AACA,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE;AACtC,EAAE,CAAC;AACH;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC9E;AACA,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU;AACjC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,wBAAwB,EAAE;AAC3E;AACA,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM;AAC9B,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,UAAU,EAAE;AAC5C;AACA,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM;AAC5B,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,UAAU,EAAE;AAClD;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC7E;AACA,EAAE,MAAM,CAAC,IAAI,CAAC;AACd,GAAG;;AC7IH,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACnE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf;AACA,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;AAC3B,IAAI,MAAM,CAAC,IAAI,CAAC;AAChB,EAAE,CAAC;AACH;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACjF;AACA,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC,CAAC;AAC1C,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACxE,MAAM,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG;AAClC,IAAI,GAAG;AACP,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AACV,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACnE,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACvD,IAAI,GAAG;AACP,EAAE,CAAC;AACH;AACA,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI;AACjF,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,wBAAwB,EAAE;AACxE;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAChF;AACA,EAAE,MAAM,CAAC,IAAI,CAAC;AACd,GAAG;;ACzBH,GAAG;AACH,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC;AACxD,CAAC,EAAE;AACH,QAAQ,CAAC,SAAS,EAAE,oBAAoB,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAC9E,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;AACf,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,oBAAoB,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC5F;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9D,IAAI,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE;AACzC,IAAI,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,iBAAiB,EAAE;AAClD,EAAE,GAAG;AACL;AACA,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,oBAAoB,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC3F,EAAE,MAAM,CAAC,IAAI,CAAC;AACd,GAAG;;ACdH,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAChB;AACA,EAAE,CAAC,GAAG,CAAC,MAAM;AACb,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AACjD,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACtB,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AACjB,IAAI,MAAM,CAAC,QAAQ,CAAC;AACpB,EAAE,GAAG;AACL;AACA,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM;AACzB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;AAC7D,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC5B;AACA,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM;AACzB,CAAC,CAAC,IAAI,CAAC,CAAC;AACR,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC3B,CAAC","file":"showdown.js","sourcesContent":["/**\n * Created by Tivie on 13-07-2015.\n */\n\nfunction getDefaultOpts (simple) {\n 'use strict';\n\n var defaultOptions = {\n omitExtraWLInCodeBlocks: {\n defaultValue: false,\n describe: 'Omit the default extra whiteline added to code blocks',\n type: 'boolean'\n },\n noHeaderId: {\n defaultValue: false,\n describe: 'Turn on/off generated header id',\n type: 'boolean'\n },\n prefixHeaderId: {\n defaultValue: false,\n describe: 'Add a prefix to the generated header ids. Passing a string will prefix that string to the header id. Setting to true will add a generic \\'section-\\' prefix',\n type: 'string'\n },\n rawPrefixHeaderId: {\n defaultValue: false,\n describe: 'Setting this option to true will prevent showdown from modifying the prefix. This might result in malformed IDs (if, for instance, the \" char is used in the prefix)',\n type: 'boolean'\n },\n ghCompatibleHeaderId: {\n defaultValue: false,\n describe: 'Generate header ids compatible with github style (spaces are replaced with dashes, a bunch of non alphanumeric chars are removed)',\n type: 'boolean'\n },\n rawHeaderId: {\n defaultValue: false,\n describe: 'Remove only spaces, \\' and \" from generated header ids (including prefixes), replacing them with dashes (-). WARNING: This might result in malformed ids',\n type: 'boolean'\n },\n headerLevelStart: {\n defaultValue: false,\n describe: 'The header blocks level start',\n type: 'integer'\n },\n parseImgDimensions: {\n defaultValue: false,\n describe: 'Turn on/off image dimension parsing',\n type: 'boolean'\n },\n simplifiedAutoLink: {\n defaultValue: false,\n describe: 'Turn on/off GFM autolink style',\n type: 'boolean'\n },\n excludeTrailingPunctuationFromURLs: {\n defaultValue: false,\n describe: 'Excludes trailing punctuation from links generated with autoLinking',\n type: 'boolean'\n },\n literalMidWordUnderscores: {\n defaultValue: false,\n describe: 'Parse midword underscores as literal underscores',\n type: 'boolean'\n },\n literalMidWordAsterisks: {\n defaultValue: false,\n describe: 'Parse midword asterisks as literal asterisks',\n type: 'boolean'\n },\n strikethrough: {\n defaultValue: false,\n describe: 'Turn on/off strikethrough support',\n type: 'boolean'\n },\n tables: {\n defaultValue: false,\n describe: 'Turn on/off tables support',\n type: 'boolean'\n },\n tablesHeaderId: {\n defaultValue: false,\n describe: 'Add an id to table headers',\n type: 'boolean'\n },\n ghCodeBlocks: {\n defaultValue: true,\n describe: 'Turn on/off GFM fenced code blocks support',\n type: 'boolean'\n },\n tasklists: {\n defaultValue: false,\n describe: 'Turn on/off GFM tasklist support',\n type: 'boolean'\n },\n smoothLivePreview: {\n defaultValue: false,\n describe: 'Prevents weird effects in live previews due to incomplete input',\n type: 'boolean'\n },\n smartIndentationFix: {\n defaultValue: false,\n description: 'Tries to smartly fix indentation in es6 strings',\n type: 'boolean'\n },\n disableForced4SpacesIndentedSublists: {\n defaultValue: false,\n description: 'Disables the requirement of indenting nested sublists by 4 spaces',\n type: 'boolean'\n },\n simpleLineBreaks: {\n defaultValue: false,\n description: 'Parses simple line breaks as
    (GFM Style)',\n type: 'boolean'\n },\n requireSpaceBeforeHeadingText: {\n defaultValue: false,\n description: 'Makes adding a space between `#` and the header text mandatory (GFM Style)',\n type: 'boolean'\n },\n ghMentions: {\n defaultValue: false,\n description: 'Enables github @mentions',\n type: 'boolean'\n },\n ghMentionsLink: {\n defaultValue: 'https://github.com/{u}',\n description: 'Changes the link generated by @mentions. Only applies if ghMentions option is enabled.',\n type: 'string'\n },\n encodeEmails: {\n defaultValue: true,\n description: 'Encode e-mail addresses through the use of Character Entities, transforming ASCII e-mail addresses into its equivalent decimal entities',\n type: 'boolean'\n },\n openLinksInNewWindow: {\n defaultValue: false,\n description: 'Open all links in new windows',\n type: 'boolean'\n },\n backslashEscapesHTMLTags: {\n defaultValue: false,\n description: 'Support for HTML Tag escaping. ex: \\
    foo\\
    ',\n type: 'boolean'\n },\n emoji: {\n defaultValue: false,\n description: 'Enable emoji support. Ex: `this is a :smile: emoji`',\n type: 'boolean'\n },\n underline: {\n defaultValue: false,\n description: 'Enable support for underline. Syntax is double or triple underscores: `__underline word__`. With this option enabled, underscores no longer parses into `` and ``',\n type: 'boolean'\n },\n completeHTMLDocument: {\n defaultValue: false,\n description: 'Outputs a complete html document, including ``, `` and `` tags',\n type: 'boolean'\n },\n metadata: {\n defaultValue: false,\n description: 'Enable support for document metadata (defined at the top of the document between `«««` and `»»»` or between `---` and `---`).',\n type: 'boolean'\n },\n splitAdjacentBlockquotes: {\n defaultValue: false,\n description: 'Split adjacent blockquote blocks',\n type: 'boolean'\n }\n };\n if (simple === false) {\n return JSON.parse(JSON.stringify(defaultOptions));\n }\n var ret = {};\n for (var opt in defaultOptions) {\n if (defaultOptions.hasOwnProperty(opt)) {\n ret[opt] = defaultOptions[opt].defaultValue;\n }\n }\n return ret;\n}\n\nfunction allOptionsOn () {\n 'use strict';\n var options = getDefaultOpts(true),\n ret = {};\n for (var opt in options) {\n if (options.hasOwnProperty(opt)) {\n ret[opt] = true;\n }\n }\n return ret;\n}\n","/**\n * Created by Tivie on 06-01-2015.\n */\n\n// Private properties\nvar showdown = {},\n parsers = {},\n extensions = {},\n globalOptions = getDefaultOpts(true),\n setFlavor = 'vanilla',\n flavor = {\n github: {\n omitExtraWLInCodeBlocks: true,\n simplifiedAutoLink: true,\n excludeTrailingPunctuationFromURLs: true,\n literalMidWordUnderscores: true,\n strikethrough: true,\n tables: true,\n tablesHeaderId: true,\n ghCodeBlocks: true,\n tasklists: true,\n disableForced4SpacesIndentedSublists: true,\n simpleLineBreaks: true,\n requireSpaceBeforeHeadingText: true,\n ghCompatibleHeaderId: true,\n ghMentions: true,\n backslashEscapesHTMLTags: true,\n emoji: true,\n splitAdjacentBlockquotes: true\n },\n original: {\n noHeaderId: true,\n ghCodeBlocks: false\n },\n ghost: {\n omitExtraWLInCodeBlocks: true,\n parseImgDimensions: true,\n simplifiedAutoLink: true,\n excludeTrailingPunctuationFromURLs: true,\n literalMidWordUnderscores: true,\n strikethrough: true,\n tables: true,\n tablesHeaderId: true,\n ghCodeBlocks: true,\n tasklists: true,\n smoothLivePreview: true,\n simpleLineBreaks: true,\n requireSpaceBeforeHeadingText: true,\n ghMentions: false,\n encodeEmails: true\n },\n vanilla: getDefaultOpts(true),\n allOn: allOptionsOn()\n };\n\n/**\n * helper namespace\n * @type {{}}\n */\nshowdown.helper = {};\n\n/**\n * TODO LEGACY SUPPORT CODE\n * @type {{}}\n */\nshowdown.extensions = {};\n\n/**\n * Set a global option\n * @static\n * @param {string} key\n * @param {*} value\n * @returns {showdown}\n */\nshowdown.setOption = function (key, value) {\n 'use strict';\n globalOptions[key] = value;\n return this;\n};\n\n/**\n * Get a global option\n * @static\n * @param {string} key\n * @returns {*}\n */\nshowdown.getOption = function (key) {\n 'use strict';\n return globalOptions[key];\n};\n\n/**\n * Get the global options\n * @static\n * @returns {{}}\n */\nshowdown.getOptions = function () {\n 'use strict';\n return globalOptions;\n};\n\n/**\n * Reset global options to the default values\n * @static\n */\nshowdown.resetOptions = function () {\n 'use strict';\n globalOptions = getDefaultOpts(true);\n};\n\n/**\n * Set the flavor showdown should use as default\n * @param {string} name\n */\nshowdown.setFlavor = function (name) {\n 'use strict';\n if (!flavor.hasOwnProperty(name)) {\n throw Error(name + ' flavor was not found');\n }\n showdown.resetOptions();\n var preset = flavor[name];\n setFlavor = name;\n for (var option in preset) {\n if (preset.hasOwnProperty(option)) {\n globalOptions[option] = preset[option];\n }\n }\n};\n\n/**\n * Get the currently set flavor\n * @returns {string}\n */\nshowdown.getFlavor = function () {\n 'use strict';\n return setFlavor;\n};\n\n/**\n * Get the options of a specified flavor. Returns undefined if the flavor was not found\n * @param {string} name Name of the flavor\n * @returns {{}|undefined}\n */\nshowdown.getFlavorOptions = function (name) {\n 'use strict';\n if (flavor.hasOwnProperty(name)) {\n return flavor[name];\n }\n};\n\n/**\n * Get the default options\n * @static\n * @param {boolean} [simple=true]\n * @returns {{}}\n */\nshowdown.getDefaultOptions = function (simple) {\n 'use strict';\n return getDefaultOpts(simple);\n};\n\n/**\n * Get or set a subParser\n *\n * subParser(name) - Get a registered subParser\n * subParser(name, func) - Register a subParser\n * @static\n * @param {string} name\n * @param {function} [func]\n * @returns {*}\n */\nshowdown.subParser = function (name, func) {\n 'use strict';\n if (showdown.helper.isString(name)) {\n if (typeof func !== 'undefined') {\n parsers[name] = func;\n } else {\n if (parsers.hasOwnProperty(name)) {\n return parsers[name];\n } else {\n throw Error('SubParser named ' + name + ' not registered!');\n }\n }\n }\n};\n\n/**\n * Gets or registers an extension\n * @static\n * @param {string} name\n * @param {object|function=} ext\n * @returns {*}\n */\nshowdown.extension = function (name, ext) {\n 'use strict';\n\n if (!showdown.helper.isString(name)) {\n throw Error('Extension \\'name\\' must be a string');\n }\n\n name = showdown.helper.stdExtName(name);\n\n // Getter\n if (showdown.helper.isUndefined(ext)) {\n if (!extensions.hasOwnProperty(name)) {\n throw Error('Extension named ' + name + ' is not registered!');\n }\n return extensions[name];\n\n // Setter\n } else {\n // Expand extension if it's wrapped in a function\n if (typeof ext === 'function') {\n ext = ext();\n }\n\n // Ensure extension is an array\n if (!showdown.helper.isArray(ext)) {\n ext = [ext];\n }\n\n var validExtension = validate(ext, name);\n\n if (validExtension.valid) {\n extensions[name] = ext;\n } else {\n throw Error(validExtension.error);\n }\n }\n};\n\n/**\n * Gets all extensions registered\n * @returns {{}}\n */\nshowdown.getAllExtensions = function () {\n 'use strict';\n return extensions;\n};\n\n/**\n * Remove an extension\n * @param {string} name\n */\nshowdown.removeExtension = function (name) {\n 'use strict';\n delete extensions[name];\n};\n\n/**\n * Removes all extensions\n */\nshowdown.resetExtensions = function () {\n 'use strict';\n extensions = {};\n};\n\n/**\n * Validate extension\n * @param {array} extension\n * @param {string} name\n * @returns {{valid: boolean, error: string}}\n */\nfunction validate (extension, name) {\n 'use strict';\n\n var errMsg = (name) ? 'Error in ' + name + ' extension->' : 'Error in unnamed extension',\n ret = {\n valid: true,\n error: ''\n };\n\n if (!showdown.helper.isArray(extension)) {\n extension = [extension];\n }\n\n for (var i = 0; i < extension.length; ++i) {\n var baseMsg = errMsg + ' sub-extension ' + i + ': ',\n ext = extension[i];\n if (typeof ext !== 'object') {\n ret.valid = false;\n ret.error = baseMsg + 'must be an object, but ' + typeof ext + ' given';\n return ret;\n }\n\n if (!showdown.helper.isString(ext.type)) {\n ret.valid = false;\n ret.error = baseMsg + 'property \"type\" must be a string, but ' + typeof ext.type + ' given';\n return ret;\n }\n\n var type = ext.type = ext.type.toLowerCase();\n\n // normalize extension type\n if (type === 'language') {\n type = ext.type = 'lang';\n }\n\n if (type === 'html') {\n type = ext.type = 'output';\n }\n\n if (type !== 'lang' && type !== 'output' && type !== 'listener') {\n ret.valid = false;\n ret.error = baseMsg + 'type ' + type + ' is not recognized. Valid values: \"lang/language\", \"output/html\" or \"listener\"';\n return ret;\n }\n\n if (type === 'listener') {\n if (showdown.helper.isUndefined(ext.listeners)) {\n ret.valid = false;\n ret.error = baseMsg + '. Extensions of type \"listener\" must have a property called \"listeners\"';\n return ret;\n }\n } else {\n if (showdown.helper.isUndefined(ext.filter) && showdown.helper.isUndefined(ext.regex)) {\n ret.valid = false;\n ret.error = baseMsg + type + ' extensions must define either a \"regex\" property or a \"filter\" method';\n return ret;\n }\n }\n\n if (ext.listeners) {\n if (typeof ext.listeners !== 'object') {\n ret.valid = false;\n ret.error = baseMsg + '\"listeners\" property must be an object but ' + typeof ext.listeners + ' given';\n return ret;\n }\n for (var ln in ext.listeners) {\n if (ext.listeners.hasOwnProperty(ln)) {\n if (typeof ext.listeners[ln] !== 'function') {\n ret.valid = false;\n ret.error = baseMsg + '\"listeners\" property must be an hash of [event name]: [callback]. listeners.' + ln +\n ' must be a function but ' + typeof ext.listeners[ln] + ' given';\n return ret;\n }\n }\n }\n }\n\n if (ext.filter) {\n if (typeof ext.filter !== 'function') {\n ret.valid = false;\n ret.error = baseMsg + '\"filter\" must be a function, but ' + typeof ext.filter + ' given';\n return ret;\n }\n } else if (ext.regex) {\n if (showdown.helper.isString(ext.regex)) {\n ext.regex = new RegExp(ext.regex, 'g');\n }\n if (!(ext.regex instanceof RegExp)) {\n ret.valid = false;\n ret.error = baseMsg + '\"regex\" property must either be a string or a RegExp object, but ' + typeof ext.regex + ' given';\n return ret;\n }\n if (showdown.helper.isUndefined(ext.replace)) {\n ret.valid = false;\n ret.error = baseMsg + '\"regex\" extensions must implement a replace string or function';\n return ret;\n }\n }\n }\n return ret;\n}\n\n/**\n * Validate extension\n * @param {object} ext\n * @returns {boolean}\n */\nshowdown.validateExtension = function (ext) {\n 'use strict';\n\n var validateExtension = validate(ext, null);\n if (!validateExtension.valid) {\n console.warn(validateExtension.error);\n return false;\n }\n return true;\n};\n","/**\n * showdownjs helper functions\n */\n\nif (!showdown.hasOwnProperty('helper')) {\n showdown.helper = {};\n}\n\n/**\n * Check if var is string\n * @static\n * @param {string} a\n * @returns {boolean}\n */\nshowdown.helper.isString = function (a) {\n 'use strict';\n return (typeof a === 'string' || a instanceof String);\n};\n\n/**\n * Check if var is a function\n * @static\n * @param {*} a\n * @returns {boolean}\n */\nshowdown.helper.isFunction = function (a) {\n 'use strict';\n var getType = {};\n return a && getType.toString.call(a) === '[object Function]';\n};\n\n/**\n * isArray helper function\n * @static\n * @param {*} a\n * @returns {boolean}\n */\nshowdown.helper.isArray = function (a) {\n 'use strict';\n return Array.isArray(a);\n};\n\n/**\n * Check if value is undefined\n * @static\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n */\nshowdown.helper.isUndefined = function (value) {\n 'use strict';\n return typeof value === 'undefined';\n};\n\n/**\n * ForEach helper function\n * Iterates over Arrays and Objects (own properties only)\n * @static\n * @param {*} obj\n * @param {function} callback Accepts 3 params: 1. value, 2. key, 3. the original array/object\n */\nshowdown.helper.forEach = function (obj, callback) {\n 'use strict';\n // check if obj is defined\n if (showdown.helper.isUndefined(obj)) {\n throw new Error('obj param is required');\n }\n\n if (showdown.helper.isUndefined(callback)) {\n throw new Error('callback param is required');\n }\n\n if (!showdown.helper.isFunction(callback)) {\n throw new Error('callback param must be a function/closure');\n }\n\n if (typeof obj.forEach === 'function') {\n obj.forEach(callback);\n } else if (showdown.helper.isArray(obj)) {\n for (var i = 0; i < obj.length; i++) {\n callback(obj[i], i, obj);\n }\n } else if (typeof (obj) === 'object') {\n for (var prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n callback(obj[prop], prop, obj);\n }\n }\n } else {\n throw new Error('obj does not seem to be an array or an iterable object');\n }\n};\n\n/**\n * Standardidize extension name\n * @static\n * @param {string} s extension name\n * @returns {string}\n */\nshowdown.helper.stdExtName = function (s) {\n 'use strict';\n return s.replace(/[_?*+\\/\\\\.^-]/g, '').replace(/\\s/g, '').toLowerCase();\n};\n\nfunction escapeCharactersCallback (wholeMatch, m1) {\n 'use strict';\n var charCodeToEscape = m1.charCodeAt(0);\n return '¨E' + charCodeToEscape + 'E';\n}\n\n/**\n * Callback used to escape characters when passing through String.replace\n * @static\n * @param {string} wholeMatch\n * @param {string} m1\n * @returns {string}\n */\nshowdown.helper.escapeCharactersCallback = escapeCharactersCallback;\n\n/**\n * Escape characters in a string\n * @static\n * @param {string} text\n * @param {string} charsToEscape\n * @param {boolean} afterBackslash\n * @returns {XML|string|void|*}\n */\nshowdown.helper.escapeCharacters = function (text, charsToEscape, afterBackslash) {\n 'use strict';\n // First we have to escape the escape characters so that\n // we can build a character class out of them\n var regexString = '([' + charsToEscape.replace(/([\\[\\]\\\\])/g, '\\\\$1') + '])';\n\n if (afterBackslash) {\n regexString = '\\\\\\\\' + regexString;\n }\n\n var regex = new RegExp(regexString, 'g');\n text = text.replace(regex, escapeCharactersCallback);\n\n return text;\n};\n\nvar rgxFindMatchPos = function (str, left, right, flags) {\n 'use strict';\n var f = flags || '',\n g = f.indexOf('g') > -1,\n x = new RegExp(left + '|' + right, 'g' + f.replace(/g/g, '')),\n l = new RegExp(left, f.replace(/g/g, '')),\n pos = [],\n t, s, m, start, end;\n\n do {\n t = 0;\n while ((m = x.exec(str))) {\n if (l.test(m[0])) {\n if (!(t++)) {\n s = x.lastIndex;\n start = s - m[0].length;\n }\n } else if (t) {\n if (!--t) {\n end = m.index + m[0].length;\n var obj = {\n left: {start: start, end: s},\n match: {start: s, end: m.index},\n right: {start: m.index, end: end},\n wholeMatch: {start: start, end: end}\n };\n pos.push(obj);\n if (!g) {\n return pos;\n }\n }\n }\n }\n } while (t && (x.lastIndex = s));\n\n return pos;\n};\n\n/**\n * matchRecursiveRegExp\n *\n * (c) 2007 Steven Levithan \n * MIT License\n *\n * Accepts a string to search, a left and right format delimiter\n * as regex patterns, and optional regex flags. Returns an array\n * of matches, allowing nested instances of left/right delimiters.\n * Use the \"g\" flag to return all matches, otherwise only the\n * first is returned. Be careful to ensure that the left and\n * right format delimiters produce mutually exclusive matches.\n * Backreferences are not supported within the right delimiter\n * due to how it is internally combined with the left delimiter.\n * When matching strings whose format delimiters are unbalanced\n * to the left or right, the output is intentionally as a\n * conventional regex library with recursion support would\n * produce, e.g. \"<\" and \">\" both produce [\"x\"] when using\n * \"<\" and \">\" as the delimiters (both strings contain a single,\n * balanced instance of \"\").\n *\n * examples:\n * matchRecursiveRegExp(\"test\", \"\\\\(\", \"\\\\)\")\n * returns: []\n * matchRecursiveRegExp(\">>t<>\", \"<\", \">\", \"g\")\n * returns: [\"t<>\", \"\"]\n * matchRecursiveRegExp(\"
    test
    \", \"]*>\", \"\", \"gi\")\n * returns: [\"test\"]\n */\nshowdown.helper.matchRecursiveRegExp = function (str, left, right, flags) {\n 'use strict';\n\n var matchPos = rgxFindMatchPos (str, left, right, flags),\n results = [];\n\n for (var i = 0; i < matchPos.length; ++i) {\n results.push([\n str.slice(matchPos[i].wholeMatch.start, matchPos[i].wholeMatch.end),\n str.slice(matchPos[i].match.start, matchPos[i].match.end),\n str.slice(matchPos[i].left.start, matchPos[i].left.end),\n str.slice(matchPos[i].right.start, matchPos[i].right.end)\n ]);\n }\n return results;\n};\n\n/**\n *\n * @param {string} str\n * @param {string|function} replacement\n * @param {string} left\n * @param {string} right\n * @param {string} flags\n * @returns {string}\n */\nshowdown.helper.replaceRecursiveRegExp = function (str, replacement, left, right, flags) {\n 'use strict';\n\n if (!showdown.helper.isFunction(replacement)) {\n var repStr = replacement;\n replacement = function () {\n return repStr;\n };\n }\n\n var matchPos = rgxFindMatchPos(str, left, right, flags),\n finalStr = str,\n lng = matchPos.length;\n\n if (lng > 0) {\n var bits = [];\n if (matchPos[0].wholeMatch.start !== 0) {\n bits.push(str.slice(0, matchPos[0].wholeMatch.start));\n }\n for (var i = 0; i < lng; ++i) {\n bits.push(\n replacement(\n str.slice(matchPos[i].wholeMatch.start, matchPos[i].wholeMatch.end),\n str.slice(matchPos[i].match.start, matchPos[i].match.end),\n str.slice(matchPos[i].left.start, matchPos[i].left.end),\n str.slice(matchPos[i].right.start, matchPos[i].right.end)\n )\n );\n if (i < lng - 1) {\n bits.push(str.slice(matchPos[i].wholeMatch.end, matchPos[i + 1].wholeMatch.start));\n }\n }\n if (matchPos[lng - 1].wholeMatch.end < str.length) {\n bits.push(str.slice(matchPos[lng - 1].wholeMatch.end));\n }\n finalStr = bits.join('');\n }\n return finalStr;\n};\n\n/**\n * Returns the index within the passed String object of the first occurrence of the specified regex,\n * starting the search at fromIndex. Returns -1 if the value is not found.\n *\n * @param {string} str string to search\n * @param {RegExp} regex Regular expression to search\n * @param {int} [fromIndex = 0] Index to start the search\n * @returns {Number}\n * @throws InvalidArgumentError\n */\nshowdown.helper.regexIndexOf = function (str, regex, fromIndex) {\n 'use strict';\n if (!showdown.helper.isString(str)) {\n throw 'InvalidArgumentError: first parameter of showdown.helper.regexIndexOf function must be a string';\n }\n if (regex instanceof RegExp === false) {\n throw 'InvalidArgumentError: second parameter of showdown.helper.regexIndexOf function must be an instance of RegExp';\n }\n var indexOf = str.substring(fromIndex || 0).search(regex);\n return (indexOf >= 0) ? (indexOf + (fromIndex || 0)) : indexOf;\n};\n\n/**\n * Splits the passed string object at the defined index, and returns an array composed of the two substrings\n * @param {string} str string to split\n * @param {int} index index to split string at\n * @returns {[string,string]}\n * @throws InvalidArgumentError\n */\nshowdown.helper.splitAtIndex = function (str, index) {\n 'use strict';\n if (!showdown.helper.isString(str)) {\n throw 'InvalidArgumentError: first parameter of showdown.helper.regexIndexOf function must be a string';\n }\n return [str.substring(0, index), str.substring(index)];\n};\n\n/**\n * Obfuscate an e-mail address through the use of Character Entities,\n * transforming ASCII characters into their equivalent decimal or hex entities.\n *\n * Since it has a random component, subsequent calls to this function produce different results\n *\n * @param {string} mail\n * @returns {string}\n */\nshowdown.helper.encodeEmailAddress = function (mail) {\n 'use strict';\n var encode = [\n function (ch) {\n return '&#' + ch.charCodeAt(0) + ';';\n },\n function (ch) {\n return '&#x' + ch.charCodeAt(0).toString(16) + ';';\n },\n function (ch) {\n return ch;\n }\n ];\n\n mail = mail.replace(/./g, function (ch) {\n if (ch === '@') {\n // this *must* be encoded. I insist.\n ch = encode[Math.floor(Math.random() * 2)](ch);\n } else {\n var r = Math.random();\n // roughly 10% raw, 45% hex, 45% dec\n ch = (\n r > 0.9 ? encode[2](ch) : r > 0.45 ? encode[1](ch) : encode[0](ch)\n );\n }\n return ch;\n });\n\n return mail;\n};\n\n/**\n * POLYFILLS\n */\n// use this instead of builtin is undefined for IE8 compatibility\nif (typeof(console) === 'undefined') {\n console = {\n warn: function (msg) {\n 'use strict';\n alert(msg);\n },\n log: function (msg) {\n 'use strict';\n alert(msg);\n },\n error: function (msg) {\n 'use strict';\n throw msg;\n }\n };\n}\n\n/**\n * Common regexes.\n * We declare some common regexes to improve performance\n */\nshowdown.helper.regexes = {\n asteriskDashAndColon: /([*_:~])/g\n};\n\n/**\n * EMOJIS LIST\n */\nshowdown.helper.emojis = {\n '+1':'\\ud83d\\udc4d',\n '-1':'\\ud83d\\udc4e',\n '100':'\\ud83d\\udcaf',\n '1234':'\\ud83d\\udd22',\n '1st_place_medal':'\\ud83e\\udd47',\n '2nd_place_medal':'\\ud83e\\udd48',\n '3rd_place_medal':'\\ud83e\\udd49',\n '8ball':'\\ud83c\\udfb1',\n 'a':'\\ud83c\\udd70\\ufe0f',\n 'ab':'\\ud83c\\udd8e',\n 'abc':'\\ud83d\\udd24',\n 'abcd':'\\ud83d\\udd21',\n 'accept':'\\ud83c\\ude51',\n 'aerial_tramway':'\\ud83d\\udea1',\n 'airplane':'\\u2708\\ufe0f',\n 'alarm_clock':'\\u23f0',\n 'alembic':'\\u2697\\ufe0f',\n 'alien':'\\ud83d\\udc7d',\n 'ambulance':'\\ud83d\\ude91',\n 'amphora':'\\ud83c\\udffa',\n 'anchor':'\\u2693\\ufe0f',\n 'angel':'\\ud83d\\udc7c',\n 'anger':'\\ud83d\\udca2',\n 'angry':'\\ud83d\\ude20',\n 'anguished':'\\ud83d\\ude27',\n 'ant':'\\ud83d\\udc1c',\n 'apple':'\\ud83c\\udf4e',\n 'aquarius':'\\u2652\\ufe0f',\n 'aries':'\\u2648\\ufe0f',\n 'arrow_backward':'\\u25c0\\ufe0f',\n 'arrow_double_down':'\\u23ec',\n 'arrow_double_up':'\\u23eb',\n 'arrow_down':'\\u2b07\\ufe0f',\n 'arrow_down_small':'\\ud83d\\udd3d',\n 'arrow_forward':'\\u25b6\\ufe0f',\n 'arrow_heading_down':'\\u2935\\ufe0f',\n 'arrow_heading_up':'\\u2934\\ufe0f',\n 'arrow_left':'\\u2b05\\ufe0f',\n 'arrow_lower_left':'\\u2199\\ufe0f',\n 'arrow_lower_right':'\\u2198\\ufe0f',\n 'arrow_right':'\\u27a1\\ufe0f',\n 'arrow_right_hook':'\\u21aa\\ufe0f',\n 'arrow_up':'\\u2b06\\ufe0f',\n 'arrow_up_down':'\\u2195\\ufe0f',\n 'arrow_up_small':'\\ud83d\\udd3c',\n 'arrow_upper_left':'\\u2196\\ufe0f',\n 'arrow_upper_right':'\\u2197\\ufe0f',\n 'arrows_clockwise':'\\ud83d\\udd03',\n 'arrows_counterclockwise':'\\ud83d\\udd04',\n 'art':'\\ud83c\\udfa8',\n 'articulated_lorry':'\\ud83d\\ude9b',\n 'artificial_satellite':'\\ud83d\\udef0',\n 'astonished':'\\ud83d\\ude32',\n 'athletic_shoe':'\\ud83d\\udc5f',\n 'atm':'\\ud83c\\udfe7',\n 'atom_symbol':'\\u269b\\ufe0f',\n 'avocado':'\\ud83e\\udd51',\n 'b':'\\ud83c\\udd71\\ufe0f',\n 'baby':'\\ud83d\\udc76',\n 'baby_bottle':'\\ud83c\\udf7c',\n 'baby_chick':'\\ud83d\\udc24',\n 'baby_symbol':'\\ud83d\\udebc',\n 'back':'\\ud83d\\udd19',\n 'bacon':'\\ud83e\\udd53',\n 'badminton':'\\ud83c\\udff8',\n 'baggage_claim':'\\ud83d\\udec4',\n 'baguette_bread':'\\ud83e\\udd56',\n 'balance_scale':'\\u2696\\ufe0f',\n 'balloon':'\\ud83c\\udf88',\n 'ballot_box':'\\ud83d\\uddf3',\n 'ballot_box_with_check':'\\u2611\\ufe0f',\n 'bamboo':'\\ud83c\\udf8d',\n 'banana':'\\ud83c\\udf4c',\n 'bangbang':'\\u203c\\ufe0f',\n 'bank':'\\ud83c\\udfe6',\n 'bar_chart':'\\ud83d\\udcca',\n 'barber':'\\ud83d\\udc88',\n 'baseball':'\\u26be\\ufe0f',\n 'basketball':'\\ud83c\\udfc0',\n 'basketball_man':'\\u26f9\\ufe0f',\n 'basketball_woman':'\\u26f9\\ufe0f‍\\u2640\\ufe0f',\n 'bat':'\\ud83e\\udd87',\n 'bath':'\\ud83d\\udec0',\n 'bathtub':'\\ud83d\\udec1',\n 'battery':'\\ud83d\\udd0b',\n 'beach_umbrella':'\\ud83c\\udfd6',\n 'bear':'\\ud83d\\udc3b',\n 'bed':'\\ud83d\\udecf',\n 'bee':'\\ud83d\\udc1d',\n 'beer':'\\ud83c\\udf7a',\n 'beers':'\\ud83c\\udf7b',\n 'beetle':'\\ud83d\\udc1e',\n 'beginner':'\\ud83d\\udd30',\n 'bell':'\\ud83d\\udd14',\n 'bellhop_bell':'\\ud83d\\udece',\n 'bento':'\\ud83c\\udf71',\n 'biking_man':'\\ud83d\\udeb4',\n 'bike':'\\ud83d\\udeb2',\n 'biking_woman':'\\ud83d\\udeb4‍\\u2640\\ufe0f',\n 'bikini':'\\ud83d\\udc59',\n 'biohazard':'\\u2623\\ufe0f',\n 'bird':'\\ud83d\\udc26',\n 'birthday':'\\ud83c\\udf82',\n 'black_circle':'\\u26ab\\ufe0f',\n 'black_flag':'\\ud83c\\udff4',\n 'black_heart':'\\ud83d\\udda4',\n 'black_joker':'\\ud83c\\udccf',\n 'black_large_square':'\\u2b1b\\ufe0f',\n 'black_medium_small_square':'\\u25fe\\ufe0f',\n 'black_medium_square':'\\u25fc\\ufe0f',\n 'black_nib':'\\u2712\\ufe0f',\n 'black_small_square':'\\u25aa\\ufe0f',\n 'black_square_button':'\\ud83d\\udd32',\n 'blonde_man':'\\ud83d\\udc71',\n 'blonde_woman':'\\ud83d\\udc71‍\\u2640\\ufe0f',\n 'blossom':'\\ud83c\\udf3c',\n 'blowfish':'\\ud83d\\udc21',\n 'blue_book':'\\ud83d\\udcd8',\n 'blue_car':'\\ud83d\\ude99',\n 'blue_heart':'\\ud83d\\udc99',\n 'blush':'\\ud83d\\ude0a',\n 'boar':'\\ud83d\\udc17',\n 'boat':'\\u26f5\\ufe0f',\n 'bomb':'\\ud83d\\udca3',\n 'book':'\\ud83d\\udcd6',\n 'bookmark':'\\ud83d\\udd16',\n 'bookmark_tabs':'\\ud83d\\udcd1',\n 'books':'\\ud83d\\udcda',\n 'boom':'\\ud83d\\udca5',\n 'boot':'\\ud83d\\udc62',\n 'bouquet':'\\ud83d\\udc90',\n 'bowing_man':'\\ud83d\\ude47',\n 'bow_and_arrow':'\\ud83c\\udff9',\n 'bowing_woman':'\\ud83d\\ude47‍\\u2640\\ufe0f',\n 'bowling':'\\ud83c\\udfb3',\n 'boxing_glove':'\\ud83e\\udd4a',\n 'boy':'\\ud83d\\udc66',\n 'bread':'\\ud83c\\udf5e',\n 'bride_with_veil':'\\ud83d\\udc70',\n 'bridge_at_night':'\\ud83c\\udf09',\n 'briefcase':'\\ud83d\\udcbc',\n 'broken_heart':'\\ud83d\\udc94',\n 'bug':'\\ud83d\\udc1b',\n 'building_construction':'\\ud83c\\udfd7',\n 'bulb':'\\ud83d\\udca1',\n 'bullettrain_front':'\\ud83d\\ude85',\n 'bullettrain_side':'\\ud83d\\ude84',\n 'burrito':'\\ud83c\\udf2f',\n 'bus':'\\ud83d\\ude8c',\n 'business_suit_levitating':'\\ud83d\\udd74',\n 'busstop':'\\ud83d\\ude8f',\n 'bust_in_silhouette':'\\ud83d\\udc64',\n 'busts_in_silhouette':'\\ud83d\\udc65',\n 'butterfly':'\\ud83e\\udd8b',\n 'cactus':'\\ud83c\\udf35',\n 'cake':'\\ud83c\\udf70',\n 'calendar':'\\ud83d\\udcc6',\n 'call_me_hand':'\\ud83e\\udd19',\n 'calling':'\\ud83d\\udcf2',\n 'camel':'\\ud83d\\udc2b',\n 'camera':'\\ud83d\\udcf7',\n 'camera_flash':'\\ud83d\\udcf8',\n 'camping':'\\ud83c\\udfd5',\n 'cancer':'\\u264b\\ufe0f',\n 'candle':'\\ud83d\\udd6f',\n 'candy':'\\ud83c\\udf6c',\n 'canoe':'\\ud83d\\udef6',\n 'capital_abcd':'\\ud83d\\udd20',\n 'capricorn':'\\u2651\\ufe0f',\n 'car':'\\ud83d\\ude97',\n 'card_file_box':'\\ud83d\\uddc3',\n 'card_index':'\\ud83d\\udcc7',\n 'card_index_dividers':'\\ud83d\\uddc2',\n 'carousel_horse':'\\ud83c\\udfa0',\n 'carrot':'\\ud83e\\udd55',\n 'cat':'\\ud83d\\udc31',\n 'cat2':'\\ud83d\\udc08',\n 'cd':'\\ud83d\\udcbf',\n 'chains':'\\u26d3',\n 'champagne':'\\ud83c\\udf7e',\n 'chart':'\\ud83d\\udcb9',\n 'chart_with_downwards_trend':'\\ud83d\\udcc9',\n 'chart_with_upwards_trend':'\\ud83d\\udcc8',\n 'checkered_flag':'\\ud83c\\udfc1',\n 'cheese':'\\ud83e\\uddc0',\n 'cherries':'\\ud83c\\udf52',\n 'cherry_blossom':'\\ud83c\\udf38',\n 'chestnut':'\\ud83c\\udf30',\n 'chicken':'\\ud83d\\udc14',\n 'children_crossing':'\\ud83d\\udeb8',\n 'chipmunk':'\\ud83d\\udc3f',\n 'chocolate_bar':'\\ud83c\\udf6b',\n 'christmas_tree':'\\ud83c\\udf84',\n 'church':'\\u26ea\\ufe0f',\n 'cinema':'\\ud83c\\udfa6',\n 'circus_tent':'\\ud83c\\udfaa',\n 'city_sunrise':'\\ud83c\\udf07',\n 'city_sunset':'\\ud83c\\udf06',\n 'cityscape':'\\ud83c\\udfd9',\n 'cl':'\\ud83c\\udd91',\n 'clamp':'\\ud83d\\udddc',\n 'clap':'\\ud83d\\udc4f',\n 'clapper':'\\ud83c\\udfac',\n 'classical_building':'\\ud83c\\udfdb',\n 'clinking_glasses':'\\ud83e\\udd42',\n 'clipboard':'\\ud83d\\udccb',\n 'clock1':'\\ud83d\\udd50',\n 'clock10':'\\ud83d\\udd59',\n 'clock1030':'\\ud83d\\udd65',\n 'clock11':'\\ud83d\\udd5a',\n 'clock1130':'\\ud83d\\udd66',\n 'clock12':'\\ud83d\\udd5b',\n 'clock1230':'\\ud83d\\udd67',\n 'clock130':'\\ud83d\\udd5c',\n 'clock2':'\\ud83d\\udd51',\n 'clock230':'\\ud83d\\udd5d',\n 'clock3':'\\ud83d\\udd52',\n 'clock330':'\\ud83d\\udd5e',\n 'clock4':'\\ud83d\\udd53',\n 'clock430':'\\ud83d\\udd5f',\n 'clock5':'\\ud83d\\udd54',\n 'clock530':'\\ud83d\\udd60',\n 'clock6':'\\ud83d\\udd55',\n 'clock630':'\\ud83d\\udd61',\n 'clock7':'\\ud83d\\udd56',\n 'clock730':'\\ud83d\\udd62',\n 'clock8':'\\ud83d\\udd57',\n 'clock830':'\\ud83d\\udd63',\n 'clock9':'\\ud83d\\udd58',\n 'clock930':'\\ud83d\\udd64',\n 'closed_book':'\\ud83d\\udcd5',\n 'closed_lock_with_key':'\\ud83d\\udd10',\n 'closed_umbrella':'\\ud83c\\udf02',\n 'cloud':'\\u2601\\ufe0f',\n 'cloud_with_lightning':'\\ud83c\\udf29',\n 'cloud_with_lightning_and_rain':'\\u26c8',\n 'cloud_with_rain':'\\ud83c\\udf27',\n 'cloud_with_snow':'\\ud83c\\udf28',\n 'clown_face':'\\ud83e\\udd21',\n 'clubs':'\\u2663\\ufe0f',\n 'cocktail':'\\ud83c\\udf78',\n 'coffee':'\\u2615\\ufe0f',\n 'coffin':'\\u26b0\\ufe0f',\n 'cold_sweat':'\\ud83d\\ude30',\n 'comet':'\\u2604\\ufe0f',\n 'computer':'\\ud83d\\udcbb',\n 'computer_mouse':'\\ud83d\\uddb1',\n 'confetti_ball':'\\ud83c\\udf8a',\n 'confounded':'\\ud83d\\ude16',\n 'confused':'\\ud83d\\ude15',\n 'congratulations':'\\u3297\\ufe0f',\n 'construction':'\\ud83d\\udea7',\n 'construction_worker_man':'\\ud83d\\udc77',\n 'construction_worker_woman':'\\ud83d\\udc77‍\\u2640\\ufe0f',\n 'control_knobs':'\\ud83c\\udf9b',\n 'convenience_store':'\\ud83c\\udfea',\n 'cookie':'\\ud83c\\udf6a',\n 'cool':'\\ud83c\\udd92',\n 'policeman':'\\ud83d\\udc6e',\n 'copyright':'\\u00a9\\ufe0f',\n 'corn':'\\ud83c\\udf3d',\n 'couch_and_lamp':'\\ud83d\\udecb',\n 'couple':'\\ud83d\\udc6b',\n 'couple_with_heart_woman_man':'\\ud83d\\udc91',\n 'couple_with_heart_man_man':'\\ud83d\\udc68‍\\u2764\\ufe0f‍\\ud83d\\udc68',\n 'couple_with_heart_woman_woman':'\\ud83d\\udc69‍\\u2764\\ufe0f‍\\ud83d\\udc69',\n 'couplekiss_man_man':'\\ud83d\\udc68‍\\u2764\\ufe0f‍\\ud83d\\udc8b‍\\ud83d\\udc68',\n 'couplekiss_man_woman':'\\ud83d\\udc8f',\n 'couplekiss_woman_woman':'\\ud83d\\udc69‍\\u2764\\ufe0f‍\\ud83d\\udc8b‍\\ud83d\\udc69',\n 'cow':'\\ud83d\\udc2e',\n 'cow2':'\\ud83d\\udc04',\n 'cowboy_hat_face':'\\ud83e\\udd20',\n 'crab':'\\ud83e\\udd80',\n 'crayon':'\\ud83d\\udd8d',\n 'credit_card':'\\ud83d\\udcb3',\n 'crescent_moon':'\\ud83c\\udf19',\n 'cricket':'\\ud83c\\udfcf',\n 'crocodile':'\\ud83d\\udc0a',\n 'croissant':'\\ud83e\\udd50',\n 'crossed_fingers':'\\ud83e\\udd1e',\n 'crossed_flags':'\\ud83c\\udf8c',\n 'crossed_swords':'\\u2694\\ufe0f',\n 'crown':'\\ud83d\\udc51',\n 'cry':'\\ud83d\\ude22',\n 'crying_cat_face':'\\ud83d\\ude3f',\n 'crystal_ball':'\\ud83d\\udd2e',\n 'cucumber':'\\ud83e\\udd52',\n 'cupid':'\\ud83d\\udc98',\n 'curly_loop':'\\u27b0',\n 'currency_exchange':'\\ud83d\\udcb1',\n 'curry':'\\ud83c\\udf5b',\n 'custard':'\\ud83c\\udf6e',\n 'customs':'\\ud83d\\udec3',\n 'cyclone':'\\ud83c\\udf00',\n 'dagger':'\\ud83d\\udde1',\n 'dancer':'\\ud83d\\udc83',\n 'dancing_women':'\\ud83d\\udc6f',\n 'dancing_men':'\\ud83d\\udc6f‍\\u2642\\ufe0f',\n 'dango':'\\ud83c\\udf61',\n 'dark_sunglasses':'\\ud83d\\udd76',\n 'dart':'\\ud83c\\udfaf',\n 'dash':'\\ud83d\\udca8',\n 'date':'\\ud83d\\udcc5',\n 'deciduous_tree':'\\ud83c\\udf33',\n 'deer':'\\ud83e\\udd8c',\n 'department_store':'\\ud83c\\udfec',\n 'derelict_house':'\\ud83c\\udfda',\n 'desert':'\\ud83c\\udfdc',\n 'desert_island':'\\ud83c\\udfdd',\n 'desktop_computer':'\\ud83d\\udda5',\n 'male_detective':'\\ud83d\\udd75\\ufe0f',\n 'diamond_shape_with_a_dot_inside':'\\ud83d\\udca0',\n 'diamonds':'\\u2666\\ufe0f',\n 'disappointed':'\\ud83d\\ude1e',\n 'disappointed_relieved':'\\ud83d\\ude25',\n 'dizzy':'\\ud83d\\udcab',\n 'dizzy_face':'\\ud83d\\ude35',\n 'do_not_litter':'\\ud83d\\udeaf',\n 'dog':'\\ud83d\\udc36',\n 'dog2':'\\ud83d\\udc15',\n 'dollar':'\\ud83d\\udcb5',\n 'dolls':'\\ud83c\\udf8e',\n 'dolphin':'\\ud83d\\udc2c',\n 'door':'\\ud83d\\udeaa',\n 'doughnut':'\\ud83c\\udf69',\n 'dove':'\\ud83d\\udd4a',\n 'dragon':'\\ud83d\\udc09',\n 'dragon_face':'\\ud83d\\udc32',\n 'dress':'\\ud83d\\udc57',\n 'dromedary_camel':'\\ud83d\\udc2a',\n 'drooling_face':'\\ud83e\\udd24',\n 'droplet':'\\ud83d\\udca7',\n 'drum':'\\ud83e\\udd41',\n 'duck':'\\ud83e\\udd86',\n 'dvd':'\\ud83d\\udcc0',\n 'e-mail':'\\ud83d\\udce7',\n 'eagle':'\\ud83e\\udd85',\n 'ear':'\\ud83d\\udc42',\n 'ear_of_rice':'\\ud83c\\udf3e',\n 'earth_africa':'\\ud83c\\udf0d',\n 'earth_americas':'\\ud83c\\udf0e',\n 'earth_asia':'\\ud83c\\udf0f',\n 'egg':'\\ud83e\\udd5a',\n 'eggplant':'\\ud83c\\udf46',\n 'eight_pointed_black_star':'\\u2734\\ufe0f',\n 'eight_spoked_asterisk':'\\u2733\\ufe0f',\n 'electric_plug':'\\ud83d\\udd0c',\n 'elephant':'\\ud83d\\udc18',\n 'email':'\\u2709\\ufe0f',\n 'end':'\\ud83d\\udd1a',\n 'envelope_with_arrow':'\\ud83d\\udce9',\n 'euro':'\\ud83d\\udcb6',\n 'european_castle':'\\ud83c\\udff0',\n 'european_post_office':'\\ud83c\\udfe4',\n 'evergreen_tree':'\\ud83c\\udf32',\n 'exclamation':'\\u2757\\ufe0f',\n 'expressionless':'\\ud83d\\ude11',\n 'eye':'\\ud83d\\udc41',\n 'eye_speech_bubble':'\\ud83d\\udc41‍\\ud83d\\udde8',\n 'eyeglasses':'\\ud83d\\udc53',\n 'eyes':'\\ud83d\\udc40',\n 'face_with_head_bandage':'\\ud83e\\udd15',\n 'face_with_thermometer':'\\ud83e\\udd12',\n 'fist_oncoming':'\\ud83d\\udc4a',\n 'factory':'\\ud83c\\udfed',\n 'fallen_leaf':'\\ud83c\\udf42',\n 'family_man_woman_boy':'\\ud83d\\udc6a',\n 'family_man_boy':'\\ud83d\\udc68‍\\ud83d\\udc66',\n 'family_man_boy_boy':'\\ud83d\\udc68‍\\ud83d\\udc66‍\\ud83d\\udc66',\n 'family_man_girl':'\\ud83d\\udc68‍\\ud83d\\udc67',\n 'family_man_girl_boy':'\\ud83d\\udc68‍\\ud83d\\udc67‍\\ud83d\\udc66',\n 'family_man_girl_girl':'\\ud83d\\udc68‍\\ud83d\\udc67‍\\ud83d\\udc67',\n 'family_man_man_boy':'\\ud83d\\udc68‍\\ud83d\\udc68‍\\ud83d\\udc66',\n 'family_man_man_boy_boy':'\\ud83d\\udc68‍\\ud83d\\udc68‍\\ud83d\\udc66‍\\ud83d\\udc66',\n 'family_man_man_girl':'\\ud83d\\udc68‍\\ud83d\\udc68‍\\ud83d\\udc67',\n 'family_man_man_girl_boy':'\\ud83d\\udc68‍\\ud83d\\udc68‍\\ud83d\\udc67‍\\ud83d\\udc66',\n 'family_man_man_girl_girl':'\\ud83d\\udc68‍\\ud83d\\udc68‍\\ud83d\\udc67‍\\ud83d\\udc67',\n 'family_man_woman_boy_boy':'\\ud83d\\udc68‍\\ud83d\\udc69‍\\ud83d\\udc66‍\\ud83d\\udc66',\n 'family_man_woman_girl':'\\ud83d\\udc68‍\\ud83d\\udc69‍\\ud83d\\udc67',\n 'family_man_woman_girl_boy':'\\ud83d\\udc68‍\\ud83d\\udc69‍\\ud83d\\udc67‍\\ud83d\\udc66',\n 'family_man_woman_girl_girl':'\\ud83d\\udc68‍\\ud83d\\udc69‍\\ud83d\\udc67‍\\ud83d\\udc67',\n 'family_woman_boy':'\\ud83d\\udc69‍\\ud83d\\udc66',\n 'family_woman_boy_boy':'\\ud83d\\udc69‍\\ud83d\\udc66‍\\ud83d\\udc66',\n 'family_woman_girl':'\\ud83d\\udc69‍\\ud83d\\udc67',\n 'family_woman_girl_boy':'\\ud83d\\udc69‍\\ud83d\\udc67‍\\ud83d\\udc66',\n 'family_woman_girl_girl':'\\ud83d\\udc69‍\\ud83d\\udc67‍\\ud83d\\udc67',\n 'family_woman_woman_boy':'\\ud83d\\udc69‍\\ud83d\\udc69‍\\ud83d\\udc66',\n 'family_woman_woman_boy_boy':'\\ud83d\\udc69‍\\ud83d\\udc69‍\\ud83d\\udc66‍\\ud83d\\udc66',\n 'family_woman_woman_girl':'\\ud83d\\udc69‍\\ud83d\\udc69‍\\ud83d\\udc67',\n 'family_woman_woman_girl_boy':'\\ud83d\\udc69‍\\ud83d\\udc69‍\\ud83d\\udc67‍\\ud83d\\udc66',\n 'family_woman_woman_girl_girl':'\\ud83d\\udc69‍\\ud83d\\udc69‍\\ud83d\\udc67‍\\ud83d\\udc67',\n 'fast_forward':'\\u23e9',\n 'fax':'\\ud83d\\udce0',\n 'fearful':'\\ud83d\\ude28',\n 'feet':'\\ud83d\\udc3e',\n 'female_detective':'\\ud83d\\udd75\\ufe0f‍\\u2640\\ufe0f',\n 'ferris_wheel':'\\ud83c\\udfa1',\n 'ferry':'\\u26f4',\n 'field_hockey':'\\ud83c\\udfd1',\n 'file_cabinet':'\\ud83d\\uddc4',\n 'file_folder':'\\ud83d\\udcc1',\n 'film_projector':'\\ud83d\\udcfd',\n 'film_strip':'\\ud83c\\udf9e',\n 'fire':'\\ud83d\\udd25',\n 'fire_engine':'\\ud83d\\ude92',\n 'fireworks':'\\ud83c\\udf86',\n 'first_quarter_moon':'\\ud83c\\udf13',\n 'first_quarter_moon_with_face':'\\ud83c\\udf1b',\n 'fish':'\\ud83d\\udc1f',\n 'fish_cake':'\\ud83c\\udf65',\n 'fishing_pole_and_fish':'\\ud83c\\udfa3',\n 'fist_raised':'\\u270a',\n 'fist_left':'\\ud83e\\udd1b',\n 'fist_right':'\\ud83e\\udd1c',\n 'flags':'\\ud83c\\udf8f',\n 'flashlight':'\\ud83d\\udd26',\n 'fleur_de_lis':'\\u269c\\ufe0f',\n 'flight_arrival':'\\ud83d\\udeec',\n 'flight_departure':'\\ud83d\\udeeb',\n 'floppy_disk':'\\ud83d\\udcbe',\n 'flower_playing_cards':'\\ud83c\\udfb4',\n 'flushed':'\\ud83d\\ude33',\n 'fog':'\\ud83c\\udf2b',\n 'foggy':'\\ud83c\\udf01',\n 'football':'\\ud83c\\udfc8',\n 'footprints':'\\ud83d\\udc63',\n 'fork_and_knife':'\\ud83c\\udf74',\n 'fountain':'\\u26f2\\ufe0f',\n 'fountain_pen':'\\ud83d\\udd8b',\n 'four_leaf_clover':'\\ud83c\\udf40',\n 'fox_face':'\\ud83e\\udd8a',\n 'framed_picture':'\\ud83d\\uddbc',\n 'free':'\\ud83c\\udd93',\n 'fried_egg':'\\ud83c\\udf73',\n 'fried_shrimp':'\\ud83c\\udf64',\n 'fries':'\\ud83c\\udf5f',\n 'frog':'\\ud83d\\udc38',\n 'frowning':'\\ud83d\\ude26',\n 'frowning_face':'\\u2639\\ufe0f',\n 'frowning_man':'\\ud83d\\ude4d‍\\u2642\\ufe0f',\n 'frowning_woman':'\\ud83d\\ude4d',\n 'middle_finger':'\\ud83d\\udd95',\n 'fuelpump':'\\u26fd\\ufe0f',\n 'full_moon':'\\ud83c\\udf15',\n 'full_moon_with_face':'\\ud83c\\udf1d',\n 'funeral_urn':'\\u26b1\\ufe0f',\n 'game_die':'\\ud83c\\udfb2',\n 'gear':'\\u2699\\ufe0f',\n 'gem':'\\ud83d\\udc8e',\n 'gemini':'\\u264a\\ufe0f',\n 'ghost':'\\ud83d\\udc7b',\n 'gift':'\\ud83c\\udf81',\n 'gift_heart':'\\ud83d\\udc9d',\n 'girl':'\\ud83d\\udc67',\n 'globe_with_meridians':'\\ud83c\\udf10',\n 'goal_net':'\\ud83e\\udd45',\n 'goat':'\\ud83d\\udc10',\n 'golf':'\\u26f3\\ufe0f',\n 'golfing_man':'\\ud83c\\udfcc\\ufe0f',\n 'golfing_woman':'\\ud83c\\udfcc\\ufe0f‍\\u2640\\ufe0f',\n 'gorilla':'\\ud83e\\udd8d',\n 'grapes':'\\ud83c\\udf47',\n 'green_apple':'\\ud83c\\udf4f',\n 'green_book':'\\ud83d\\udcd7',\n 'green_heart':'\\ud83d\\udc9a',\n 'green_salad':'\\ud83e\\udd57',\n 'grey_exclamation':'\\u2755',\n 'grey_question':'\\u2754',\n 'grimacing':'\\ud83d\\ude2c',\n 'grin':'\\ud83d\\ude01',\n 'grinning':'\\ud83d\\ude00',\n 'guardsman':'\\ud83d\\udc82',\n 'guardswoman':'\\ud83d\\udc82‍\\u2640\\ufe0f',\n 'guitar':'\\ud83c\\udfb8',\n 'gun':'\\ud83d\\udd2b',\n 'haircut_woman':'\\ud83d\\udc87',\n 'haircut_man':'\\ud83d\\udc87‍\\u2642\\ufe0f',\n 'hamburger':'\\ud83c\\udf54',\n 'hammer':'\\ud83d\\udd28',\n 'hammer_and_pick':'\\u2692',\n 'hammer_and_wrench':'\\ud83d\\udee0',\n 'hamster':'\\ud83d\\udc39',\n 'hand':'\\u270b',\n 'handbag':'\\ud83d\\udc5c',\n 'handshake':'\\ud83e\\udd1d',\n 'hankey':'\\ud83d\\udca9',\n 'hatched_chick':'\\ud83d\\udc25',\n 'hatching_chick':'\\ud83d\\udc23',\n 'headphones':'\\ud83c\\udfa7',\n 'hear_no_evil':'\\ud83d\\ude49',\n 'heart':'\\u2764\\ufe0f',\n 'heart_decoration':'\\ud83d\\udc9f',\n 'heart_eyes':'\\ud83d\\ude0d',\n 'heart_eyes_cat':'\\ud83d\\ude3b',\n 'heartbeat':'\\ud83d\\udc93',\n 'heartpulse':'\\ud83d\\udc97',\n 'hearts':'\\u2665\\ufe0f',\n 'heavy_check_mark':'\\u2714\\ufe0f',\n 'heavy_division_sign':'\\u2797',\n 'heavy_dollar_sign':'\\ud83d\\udcb2',\n 'heavy_heart_exclamation':'\\u2763\\ufe0f',\n 'heavy_minus_sign':'\\u2796',\n 'heavy_multiplication_x':'\\u2716\\ufe0f',\n 'heavy_plus_sign':'\\u2795',\n 'helicopter':'\\ud83d\\ude81',\n 'herb':'\\ud83c\\udf3f',\n 'hibiscus':'\\ud83c\\udf3a',\n 'high_brightness':'\\ud83d\\udd06',\n 'high_heel':'\\ud83d\\udc60',\n 'hocho':'\\ud83d\\udd2a',\n 'hole':'\\ud83d\\udd73',\n 'honey_pot':'\\ud83c\\udf6f',\n 'horse':'\\ud83d\\udc34',\n 'horse_racing':'\\ud83c\\udfc7',\n 'hospital':'\\ud83c\\udfe5',\n 'hot_pepper':'\\ud83c\\udf36',\n 'hotdog':'\\ud83c\\udf2d',\n 'hotel':'\\ud83c\\udfe8',\n 'hotsprings':'\\u2668\\ufe0f',\n 'hourglass':'\\u231b\\ufe0f',\n 'hourglass_flowing_sand':'\\u23f3',\n 'house':'\\ud83c\\udfe0',\n 'house_with_garden':'\\ud83c\\udfe1',\n 'houses':'\\ud83c\\udfd8',\n 'hugs':'\\ud83e\\udd17',\n 'hushed':'\\ud83d\\ude2f',\n 'ice_cream':'\\ud83c\\udf68',\n 'ice_hockey':'\\ud83c\\udfd2',\n 'ice_skate':'\\u26f8',\n 'icecream':'\\ud83c\\udf66',\n 'id':'\\ud83c\\udd94',\n 'ideograph_advantage':'\\ud83c\\ude50',\n 'imp':'\\ud83d\\udc7f',\n 'inbox_tray':'\\ud83d\\udce5',\n 'incoming_envelope':'\\ud83d\\udce8',\n 'tipping_hand_woman':'\\ud83d\\udc81',\n 'information_source':'\\u2139\\ufe0f',\n 'innocent':'\\ud83d\\ude07',\n 'interrobang':'\\u2049\\ufe0f',\n 'iphone':'\\ud83d\\udcf1',\n 'izakaya_lantern':'\\ud83c\\udfee',\n 'jack_o_lantern':'\\ud83c\\udf83',\n 'japan':'\\ud83d\\uddfe',\n 'japanese_castle':'\\ud83c\\udfef',\n 'japanese_goblin':'\\ud83d\\udc7a',\n 'japanese_ogre':'\\ud83d\\udc79',\n 'jeans':'\\ud83d\\udc56',\n 'joy':'\\ud83d\\ude02',\n 'joy_cat':'\\ud83d\\ude39',\n 'joystick':'\\ud83d\\udd79',\n 'kaaba':'\\ud83d\\udd4b',\n 'key':'\\ud83d\\udd11',\n 'keyboard':'\\u2328\\ufe0f',\n 'keycap_ten':'\\ud83d\\udd1f',\n 'kick_scooter':'\\ud83d\\udef4',\n 'kimono':'\\ud83d\\udc58',\n 'kiss':'\\ud83d\\udc8b',\n 'kissing':'\\ud83d\\ude17',\n 'kissing_cat':'\\ud83d\\ude3d',\n 'kissing_closed_eyes':'\\ud83d\\ude1a',\n 'kissing_heart':'\\ud83d\\ude18',\n 'kissing_smiling_eyes':'\\ud83d\\ude19',\n 'kiwi_fruit':'\\ud83e\\udd5d',\n 'koala':'\\ud83d\\udc28',\n 'koko':'\\ud83c\\ude01',\n 'label':'\\ud83c\\udff7',\n 'large_blue_circle':'\\ud83d\\udd35',\n 'large_blue_diamond':'\\ud83d\\udd37',\n 'large_orange_diamond':'\\ud83d\\udd36',\n 'last_quarter_moon':'\\ud83c\\udf17',\n 'last_quarter_moon_with_face':'\\ud83c\\udf1c',\n 'latin_cross':'\\u271d\\ufe0f',\n 'laughing':'\\ud83d\\ude06',\n 'leaves':'\\ud83c\\udf43',\n 'ledger':'\\ud83d\\udcd2',\n 'left_luggage':'\\ud83d\\udec5',\n 'left_right_arrow':'\\u2194\\ufe0f',\n 'leftwards_arrow_with_hook':'\\u21a9\\ufe0f',\n 'lemon':'\\ud83c\\udf4b',\n 'leo':'\\u264c\\ufe0f',\n 'leopard':'\\ud83d\\udc06',\n 'level_slider':'\\ud83c\\udf9a',\n 'libra':'\\u264e\\ufe0f',\n 'light_rail':'\\ud83d\\ude88',\n 'link':'\\ud83d\\udd17',\n 'lion':'\\ud83e\\udd81',\n 'lips':'\\ud83d\\udc44',\n 'lipstick':'\\ud83d\\udc84',\n 'lizard':'\\ud83e\\udd8e',\n 'lock':'\\ud83d\\udd12',\n 'lock_with_ink_pen':'\\ud83d\\udd0f',\n 'lollipop':'\\ud83c\\udf6d',\n 'loop':'\\u27bf',\n 'loud_sound':'\\ud83d\\udd0a',\n 'loudspeaker':'\\ud83d\\udce2',\n 'love_hotel':'\\ud83c\\udfe9',\n 'love_letter':'\\ud83d\\udc8c',\n 'low_brightness':'\\ud83d\\udd05',\n 'lying_face':'\\ud83e\\udd25',\n 'm':'\\u24c2\\ufe0f',\n 'mag':'\\ud83d\\udd0d',\n 'mag_right':'\\ud83d\\udd0e',\n 'mahjong':'\\ud83c\\udc04\\ufe0f',\n 'mailbox':'\\ud83d\\udceb',\n 'mailbox_closed':'\\ud83d\\udcea',\n 'mailbox_with_mail':'\\ud83d\\udcec',\n 'mailbox_with_no_mail':'\\ud83d\\udced',\n 'man':'\\ud83d\\udc68',\n 'man_artist':'\\ud83d\\udc68‍\\ud83c\\udfa8',\n 'man_astronaut':'\\ud83d\\udc68‍\\ud83d\\ude80',\n 'man_cartwheeling':'\\ud83e\\udd38‍\\u2642\\ufe0f',\n 'man_cook':'\\ud83d\\udc68‍\\ud83c\\udf73',\n 'man_dancing':'\\ud83d\\udd7a',\n 'man_facepalming':'\\ud83e\\udd26‍\\u2642\\ufe0f',\n 'man_factory_worker':'\\ud83d\\udc68‍\\ud83c\\udfed',\n 'man_farmer':'\\ud83d\\udc68‍\\ud83c\\udf3e',\n 'man_firefighter':'\\ud83d\\udc68‍\\ud83d\\ude92',\n 'man_health_worker':'\\ud83d\\udc68‍\\u2695\\ufe0f',\n 'man_in_tuxedo':'\\ud83e\\udd35',\n 'man_judge':'\\ud83d\\udc68‍\\u2696\\ufe0f',\n 'man_juggling':'\\ud83e\\udd39‍\\u2642\\ufe0f',\n 'man_mechanic':'\\ud83d\\udc68‍\\ud83d\\udd27',\n 'man_office_worker':'\\ud83d\\udc68‍\\ud83d\\udcbc',\n 'man_pilot':'\\ud83d\\udc68‍\\u2708\\ufe0f',\n 'man_playing_handball':'\\ud83e\\udd3e‍\\u2642\\ufe0f',\n 'man_playing_water_polo':'\\ud83e\\udd3d‍\\u2642\\ufe0f',\n 'man_scientist':'\\ud83d\\udc68‍\\ud83d\\udd2c',\n 'man_shrugging':'\\ud83e\\udd37‍\\u2642\\ufe0f',\n 'man_singer':'\\ud83d\\udc68‍\\ud83c\\udfa4',\n 'man_student':'\\ud83d\\udc68‍\\ud83c\\udf93',\n 'man_teacher':'\\ud83d\\udc68‍\\ud83c\\udfeb',\n 'man_technologist':'\\ud83d\\udc68‍\\ud83d\\udcbb',\n 'man_with_gua_pi_mao':'\\ud83d\\udc72',\n 'man_with_turban':'\\ud83d\\udc73',\n 'tangerine':'\\ud83c\\udf4a',\n 'mans_shoe':'\\ud83d\\udc5e',\n 'mantelpiece_clock':'\\ud83d\\udd70',\n 'maple_leaf':'\\ud83c\\udf41',\n 'martial_arts_uniform':'\\ud83e\\udd4b',\n 'mask':'\\ud83d\\ude37',\n 'massage_woman':'\\ud83d\\udc86',\n 'massage_man':'\\ud83d\\udc86‍\\u2642\\ufe0f',\n 'meat_on_bone':'\\ud83c\\udf56',\n 'medal_military':'\\ud83c\\udf96',\n 'medal_sports':'\\ud83c\\udfc5',\n 'mega':'\\ud83d\\udce3',\n 'melon':'\\ud83c\\udf48',\n 'memo':'\\ud83d\\udcdd',\n 'men_wrestling':'\\ud83e\\udd3c‍\\u2642\\ufe0f',\n 'menorah':'\\ud83d\\udd4e',\n 'mens':'\\ud83d\\udeb9',\n 'metal':'\\ud83e\\udd18',\n 'metro':'\\ud83d\\ude87',\n 'microphone':'\\ud83c\\udfa4',\n 'microscope':'\\ud83d\\udd2c',\n 'milk_glass':'\\ud83e\\udd5b',\n 'milky_way':'\\ud83c\\udf0c',\n 'minibus':'\\ud83d\\ude90',\n 'minidisc':'\\ud83d\\udcbd',\n 'mobile_phone_off':'\\ud83d\\udcf4',\n 'money_mouth_face':'\\ud83e\\udd11',\n 'money_with_wings':'\\ud83d\\udcb8',\n 'moneybag':'\\ud83d\\udcb0',\n 'monkey':'\\ud83d\\udc12',\n 'monkey_face':'\\ud83d\\udc35',\n 'monorail':'\\ud83d\\ude9d',\n 'moon':'\\ud83c\\udf14',\n 'mortar_board':'\\ud83c\\udf93',\n 'mosque':'\\ud83d\\udd4c',\n 'motor_boat':'\\ud83d\\udee5',\n 'motor_scooter':'\\ud83d\\udef5',\n 'motorcycle':'\\ud83c\\udfcd',\n 'motorway':'\\ud83d\\udee3',\n 'mount_fuji':'\\ud83d\\uddfb',\n 'mountain':'\\u26f0',\n 'mountain_biking_man':'\\ud83d\\udeb5',\n 'mountain_biking_woman':'\\ud83d\\udeb5‍\\u2640\\ufe0f',\n 'mountain_cableway':'\\ud83d\\udea0',\n 'mountain_railway':'\\ud83d\\ude9e',\n 'mountain_snow':'\\ud83c\\udfd4',\n 'mouse':'\\ud83d\\udc2d',\n 'mouse2':'\\ud83d\\udc01',\n 'movie_camera':'\\ud83c\\udfa5',\n 'moyai':'\\ud83d\\uddff',\n 'mrs_claus':'\\ud83e\\udd36',\n 'muscle':'\\ud83d\\udcaa',\n 'mushroom':'\\ud83c\\udf44',\n 'musical_keyboard':'\\ud83c\\udfb9',\n 'musical_note':'\\ud83c\\udfb5',\n 'musical_score':'\\ud83c\\udfbc',\n 'mute':'\\ud83d\\udd07',\n 'nail_care':'\\ud83d\\udc85',\n 'name_badge':'\\ud83d\\udcdb',\n 'national_park':'\\ud83c\\udfde',\n 'nauseated_face':'\\ud83e\\udd22',\n 'necktie':'\\ud83d\\udc54',\n 'negative_squared_cross_mark':'\\u274e',\n 'nerd_face':'\\ud83e\\udd13',\n 'neutral_face':'\\ud83d\\ude10',\n 'new':'\\ud83c\\udd95',\n 'new_moon':'\\ud83c\\udf11',\n 'new_moon_with_face':'\\ud83c\\udf1a',\n 'newspaper':'\\ud83d\\udcf0',\n 'newspaper_roll':'\\ud83d\\uddde',\n 'next_track_button':'\\u23ed',\n 'ng':'\\ud83c\\udd96',\n 'no_good_man':'\\ud83d\\ude45‍\\u2642\\ufe0f',\n 'no_good_woman':'\\ud83d\\ude45',\n 'night_with_stars':'\\ud83c\\udf03',\n 'no_bell':'\\ud83d\\udd15',\n 'no_bicycles':'\\ud83d\\udeb3',\n 'no_entry':'\\u26d4\\ufe0f',\n 'no_entry_sign':'\\ud83d\\udeab',\n 'no_mobile_phones':'\\ud83d\\udcf5',\n 'no_mouth':'\\ud83d\\ude36',\n 'no_pedestrians':'\\ud83d\\udeb7',\n 'no_smoking':'\\ud83d\\udead',\n 'non-potable_water':'\\ud83d\\udeb1',\n 'nose':'\\ud83d\\udc43',\n 'notebook':'\\ud83d\\udcd3',\n 'notebook_with_decorative_cover':'\\ud83d\\udcd4',\n 'notes':'\\ud83c\\udfb6',\n 'nut_and_bolt':'\\ud83d\\udd29',\n 'o':'\\u2b55\\ufe0f',\n 'o2':'\\ud83c\\udd7e\\ufe0f',\n 'ocean':'\\ud83c\\udf0a',\n 'octopus':'\\ud83d\\udc19',\n 'oden':'\\ud83c\\udf62',\n 'office':'\\ud83c\\udfe2',\n 'oil_drum':'\\ud83d\\udee2',\n 'ok':'\\ud83c\\udd97',\n 'ok_hand':'\\ud83d\\udc4c',\n 'ok_man':'\\ud83d\\ude46‍\\u2642\\ufe0f',\n 'ok_woman':'\\ud83d\\ude46',\n 'old_key':'\\ud83d\\udddd',\n 'older_man':'\\ud83d\\udc74',\n 'older_woman':'\\ud83d\\udc75',\n 'om':'\\ud83d\\udd49',\n 'on':'\\ud83d\\udd1b',\n 'oncoming_automobile':'\\ud83d\\ude98',\n 'oncoming_bus':'\\ud83d\\ude8d',\n 'oncoming_police_car':'\\ud83d\\ude94',\n 'oncoming_taxi':'\\ud83d\\ude96',\n 'open_file_folder':'\\ud83d\\udcc2',\n 'open_hands':'\\ud83d\\udc50',\n 'open_mouth':'\\ud83d\\ude2e',\n 'open_umbrella':'\\u2602\\ufe0f',\n 'ophiuchus':'\\u26ce',\n 'orange_book':'\\ud83d\\udcd9',\n 'orthodox_cross':'\\u2626\\ufe0f',\n 'outbox_tray':'\\ud83d\\udce4',\n 'owl':'\\ud83e\\udd89',\n 'ox':'\\ud83d\\udc02',\n 'package':'\\ud83d\\udce6',\n 'page_facing_up':'\\ud83d\\udcc4',\n 'page_with_curl':'\\ud83d\\udcc3',\n 'pager':'\\ud83d\\udcdf',\n 'paintbrush':'\\ud83d\\udd8c',\n 'palm_tree':'\\ud83c\\udf34',\n 'pancakes':'\\ud83e\\udd5e',\n 'panda_face':'\\ud83d\\udc3c',\n 'paperclip':'\\ud83d\\udcce',\n 'paperclips':'\\ud83d\\udd87',\n 'parasol_on_ground':'\\u26f1',\n 'parking':'\\ud83c\\udd7f\\ufe0f',\n 'part_alternation_mark':'\\u303d\\ufe0f',\n 'partly_sunny':'\\u26c5\\ufe0f',\n 'passenger_ship':'\\ud83d\\udef3',\n 'passport_control':'\\ud83d\\udec2',\n 'pause_button':'\\u23f8',\n 'peace_symbol':'\\u262e\\ufe0f',\n 'peach':'\\ud83c\\udf51',\n 'peanuts':'\\ud83e\\udd5c',\n 'pear':'\\ud83c\\udf50',\n 'pen':'\\ud83d\\udd8a',\n 'pencil2':'\\u270f\\ufe0f',\n 'penguin':'\\ud83d\\udc27',\n 'pensive':'\\ud83d\\ude14',\n 'performing_arts':'\\ud83c\\udfad',\n 'persevere':'\\ud83d\\ude23',\n 'person_fencing':'\\ud83e\\udd3a',\n 'pouting_woman':'\\ud83d\\ude4e',\n 'phone':'\\u260e\\ufe0f',\n 'pick':'\\u26cf',\n 'pig':'\\ud83d\\udc37',\n 'pig2':'\\ud83d\\udc16',\n 'pig_nose':'\\ud83d\\udc3d',\n 'pill':'\\ud83d\\udc8a',\n 'pineapple':'\\ud83c\\udf4d',\n 'ping_pong':'\\ud83c\\udfd3',\n 'pisces':'\\u2653\\ufe0f',\n 'pizza':'\\ud83c\\udf55',\n 'place_of_worship':'\\ud83d\\uded0',\n 'plate_with_cutlery':'\\ud83c\\udf7d',\n 'play_or_pause_button':'\\u23ef',\n 'point_down':'\\ud83d\\udc47',\n 'point_left':'\\ud83d\\udc48',\n 'point_right':'\\ud83d\\udc49',\n 'point_up':'\\u261d\\ufe0f',\n 'point_up_2':'\\ud83d\\udc46',\n 'police_car':'\\ud83d\\ude93',\n 'policewoman':'\\ud83d\\udc6e‍\\u2640\\ufe0f',\n 'poodle':'\\ud83d\\udc29',\n 'popcorn':'\\ud83c\\udf7f',\n 'post_office':'\\ud83c\\udfe3',\n 'postal_horn':'\\ud83d\\udcef',\n 'postbox':'\\ud83d\\udcee',\n 'potable_water':'\\ud83d\\udeb0',\n 'potato':'\\ud83e\\udd54',\n 'pouch':'\\ud83d\\udc5d',\n 'poultry_leg':'\\ud83c\\udf57',\n 'pound':'\\ud83d\\udcb7',\n 'rage':'\\ud83d\\ude21',\n 'pouting_cat':'\\ud83d\\ude3e',\n 'pouting_man':'\\ud83d\\ude4e‍\\u2642\\ufe0f',\n 'pray':'\\ud83d\\ude4f',\n 'prayer_beads':'\\ud83d\\udcff',\n 'pregnant_woman':'\\ud83e\\udd30',\n 'previous_track_button':'\\u23ee',\n 'prince':'\\ud83e\\udd34',\n 'princess':'\\ud83d\\udc78',\n 'printer':'\\ud83d\\udda8',\n 'purple_heart':'\\ud83d\\udc9c',\n 'purse':'\\ud83d\\udc5b',\n 'pushpin':'\\ud83d\\udccc',\n 'put_litter_in_its_place':'\\ud83d\\udeae',\n 'question':'\\u2753',\n 'rabbit':'\\ud83d\\udc30',\n 'rabbit2':'\\ud83d\\udc07',\n 'racehorse':'\\ud83d\\udc0e',\n 'racing_car':'\\ud83c\\udfce',\n 'radio':'\\ud83d\\udcfb',\n 'radio_button':'\\ud83d\\udd18',\n 'radioactive':'\\u2622\\ufe0f',\n 'railway_car':'\\ud83d\\ude83',\n 'railway_track':'\\ud83d\\udee4',\n 'rainbow':'\\ud83c\\udf08',\n 'rainbow_flag':'\\ud83c\\udff3\\ufe0f‍\\ud83c\\udf08',\n 'raised_back_of_hand':'\\ud83e\\udd1a',\n 'raised_hand_with_fingers_splayed':'\\ud83d\\udd90',\n 'raised_hands':'\\ud83d\\ude4c',\n 'raising_hand_woman':'\\ud83d\\ude4b',\n 'raising_hand_man':'\\ud83d\\ude4b‍\\u2642\\ufe0f',\n 'ram':'\\ud83d\\udc0f',\n 'ramen':'\\ud83c\\udf5c',\n 'rat':'\\ud83d\\udc00',\n 'record_button':'\\u23fa',\n 'recycle':'\\u267b\\ufe0f',\n 'red_circle':'\\ud83d\\udd34',\n 'registered':'\\u00ae\\ufe0f',\n 'relaxed':'\\u263a\\ufe0f',\n 'relieved':'\\ud83d\\ude0c',\n 'reminder_ribbon':'\\ud83c\\udf97',\n 'repeat':'\\ud83d\\udd01',\n 'repeat_one':'\\ud83d\\udd02',\n 'rescue_worker_helmet':'\\u26d1',\n 'restroom':'\\ud83d\\udebb',\n 'revolving_hearts':'\\ud83d\\udc9e',\n 'rewind':'\\u23ea',\n 'rhinoceros':'\\ud83e\\udd8f',\n 'ribbon':'\\ud83c\\udf80',\n 'rice':'\\ud83c\\udf5a',\n 'rice_ball':'\\ud83c\\udf59',\n 'rice_cracker':'\\ud83c\\udf58',\n 'rice_scene':'\\ud83c\\udf91',\n 'right_anger_bubble':'\\ud83d\\uddef',\n 'ring':'\\ud83d\\udc8d',\n 'robot':'\\ud83e\\udd16',\n 'rocket':'\\ud83d\\ude80',\n 'rofl':'\\ud83e\\udd23',\n 'roll_eyes':'\\ud83d\\ude44',\n 'roller_coaster':'\\ud83c\\udfa2',\n 'rooster':'\\ud83d\\udc13',\n 'rose':'\\ud83c\\udf39',\n 'rosette':'\\ud83c\\udff5',\n 'rotating_light':'\\ud83d\\udea8',\n 'round_pushpin':'\\ud83d\\udccd',\n 'rowing_man':'\\ud83d\\udea3',\n 'rowing_woman':'\\ud83d\\udea3‍\\u2640\\ufe0f',\n 'rugby_football':'\\ud83c\\udfc9',\n 'running_man':'\\ud83c\\udfc3',\n 'running_shirt_with_sash':'\\ud83c\\udfbd',\n 'running_woman':'\\ud83c\\udfc3‍\\u2640\\ufe0f',\n 'sa':'\\ud83c\\ude02\\ufe0f',\n 'sagittarius':'\\u2650\\ufe0f',\n 'sake':'\\ud83c\\udf76',\n 'sandal':'\\ud83d\\udc61',\n 'santa':'\\ud83c\\udf85',\n 'satellite':'\\ud83d\\udce1',\n 'saxophone':'\\ud83c\\udfb7',\n 'school':'\\ud83c\\udfeb',\n 'school_satchel':'\\ud83c\\udf92',\n 'scissors':'\\u2702\\ufe0f',\n 'scorpion':'\\ud83e\\udd82',\n 'scorpius':'\\u264f\\ufe0f',\n 'scream':'\\ud83d\\ude31',\n 'scream_cat':'\\ud83d\\ude40',\n 'scroll':'\\ud83d\\udcdc',\n 'seat':'\\ud83d\\udcba',\n 'secret':'\\u3299\\ufe0f',\n 'see_no_evil':'\\ud83d\\ude48',\n 'seedling':'\\ud83c\\udf31',\n 'selfie':'\\ud83e\\udd33',\n 'shallow_pan_of_food':'\\ud83e\\udd58',\n 'shamrock':'\\u2618\\ufe0f',\n 'shark':'\\ud83e\\udd88',\n 'shaved_ice':'\\ud83c\\udf67',\n 'sheep':'\\ud83d\\udc11',\n 'shell':'\\ud83d\\udc1a',\n 'shield':'\\ud83d\\udee1',\n 'shinto_shrine':'\\u26e9',\n 'ship':'\\ud83d\\udea2',\n 'shirt':'\\ud83d\\udc55',\n 'shopping':'\\ud83d\\udecd',\n 'shopping_cart':'\\ud83d\\uded2',\n 'shower':'\\ud83d\\udebf',\n 'shrimp':'\\ud83e\\udd90',\n 'signal_strength':'\\ud83d\\udcf6',\n 'six_pointed_star':'\\ud83d\\udd2f',\n 'ski':'\\ud83c\\udfbf',\n 'skier':'\\u26f7',\n 'skull':'\\ud83d\\udc80',\n 'skull_and_crossbones':'\\u2620\\ufe0f',\n 'sleeping':'\\ud83d\\ude34',\n 'sleeping_bed':'\\ud83d\\udecc',\n 'sleepy':'\\ud83d\\ude2a',\n 'slightly_frowning_face':'\\ud83d\\ude41',\n 'slightly_smiling_face':'\\ud83d\\ude42',\n 'slot_machine':'\\ud83c\\udfb0',\n 'small_airplane':'\\ud83d\\udee9',\n 'small_blue_diamond':'\\ud83d\\udd39',\n 'small_orange_diamond':'\\ud83d\\udd38',\n 'small_red_triangle':'\\ud83d\\udd3a',\n 'small_red_triangle_down':'\\ud83d\\udd3b',\n 'smile':'\\ud83d\\ude04',\n 'smile_cat':'\\ud83d\\ude38',\n 'smiley':'\\ud83d\\ude03',\n 'smiley_cat':'\\ud83d\\ude3a',\n 'smiling_imp':'\\ud83d\\ude08',\n 'smirk':'\\ud83d\\ude0f',\n 'smirk_cat':'\\ud83d\\ude3c',\n 'smoking':'\\ud83d\\udeac',\n 'snail':'\\ud83d\\udc0c',\n 'snake':'\\ud83d\\udc0d',\n 'sneezing_face':'\\ud83e\\udd27',\n 'snowboarder':'\\ud83c\\udfc2',\n 'snowflake':'\\u2744\\ufe0f',\n 'snowman':'\\u26c4\\ufe0f',\n 'snowman_with_snow':'\\u2603\\ufe0f',\n 'sob':'\\ud83d\\ude2d',\n 'soccer':'\\u26bd\\ufe0f',\n 'soon':'\\ud83d\\udd1c',\n 'sos':'\\ud83c\\udd98',\n 'sound':'\\ud83d\\udd09',\n 'space_invader':'\\ud83d\\udc7e',\n 'spades':'\\u2660\\ufe0f',\n 'spaghetti':'\\ud83c\\udf5d',\n 'sparkle':'\\u2747\\ufe0f',\n 'sparkler':'\\ud83c\\udf87',\n 'sparkles':'\\u2728',\n 'sparkling_heart':'\\ud83d\\udc96',\n 'speak_no_evil':'\\ud83d\\ude4a',\n 'speaker':'\\ud83d\\udd08',\n 'speaking_head':'\\ud83d\\udde3',\n 'speech_balloon':'\\ud83d\\udcac',\n 'speedboat':'\\ud83d\\udea4',\n 'spider':'\\ud83d\\udd77',\n 'spider_web':'\\ud83d\\udd78',\n 'spiral_calendar':'\\ud83d\\uddd3',\n 'spiral_notepad':'\\ud83d\\uddd2',\n 'spoon':'\\ud83e\\udd44',\n 'squid':'\\ud83e\\udd91',\n 'stadium':'\\ud83c\\udfdf',\n 'star':'\\u2b50\\ufe0f',\n 'star2':'\\ud83c\\udf1f',\n 'star_and_crescent':'\\u262a\\ufe0f',\n 'star_of_david':'\\u2721\\ufe0f',\n 'stars':'\\ud83c\\udf20',\n 'station':'\\ud83d\\ude89',\n 'statue_of_liberty':'\\ud83d\\uddfd',\n 'steam_locomotive':'\\ud83d\\ude82',\n 'stew':'\\ud83c\\udf72',\n 'stop_button':'\\u23f9',\n 'stop_sign':'\\ud83d\\uded1',\n 'stopwatch':'\\u23f1',\n 'straight_ruler':'\\ud83d\\udccf',\n 'strawberry':'\\ud83c\\udf53',\n 'stuck_out_tongue':'\\ud83d\\ude1b',\n 'stuck_out_tongue_closed_eyes':'\\ud83d\\ude1d',\n 'stuck_out_tongue_winking_eye':'\\ud83d\\ude1c',\n 'studio_microphone':'\\ud83c\\udf99',\n 'stuffed_flatbread':'\\ud83e\\udd59',\n 'sun_behind_large_cloud':'\\ud83c\\udf25',\n 'sun_behind_rain_cloud':'\\ud83c\\udf26',\n 'sun_behind_small_cloud':'\\ud83c\\udf24',\n 'sun_with_face':'\\ud83c\\udf1e',\n 'sunflower':'\\ud83c\\udf3b',\n 'sunglasses':'\\ud83d\\ude0e',\n 'sunny':'\\u2600\\ufe0f',\n 'sunrise':'\\ud83c\\udf05',\n 'sunrise_over_mountains':'\\ud83c\\udf04',\n 'surfing_man':'\\ud83c\\udfc4',\n 'surfing_woman':'\\ud83c\\udfc4‍\\u2640\\ufe0f',\n 'sushi':'\\ud83c\\udf63',\n 'suspension_railway':'\\ud83d\\ude9f',\n 'sweat':'\\ud83d\\ude13',\n 'sweat_drops':'\\ud83d\\udca6',\n 'sweat_smile':'\\ud83d\\ude05',\n 'sweet_potato':'\\ud83c\\udf60',\n 'swimming_man':'\\ud83c\\udfca',\n 'swimming_woman':'\\ud83c\\udfca‍\\u2640\\ufe0f',\n 'symbols':'\\ud83d\\udd23',\n 'synagogue':'\\ud83d\\udd4d',\n 'syringe':'\\ud83d\\udc89',\n 'taco':'\\ud83c\\udf2e',\n 'tada':'\\ud83c\\udf89',\n 'tanabata_tree':'\\ud83c\\udf8b',\n 'taurus':'\\u2649\\ufe0f',\n 'taxi':'\\ud83d\\ude95',\n 'tea':'\\ud83c\\udf75',\n 'telephone_receiver':'\\ud83d\\udcde',\n 'telescope':'\\ud83d\\udd2d',\n 'tennis':'\\ud83c\\udfbe',\n 'tent':'\\u26fa\\ufe0f',\n 'thermometer':'\\ud83c\\udf21',\n 'thinking':'\\ud83e\\udd14',\n 'thought_balloon':'\\ud83d\\udcad',\n 'ticket':'\\ud83c\\udfab',\n 'tickets':'\\ud83c\\udf9f',\n 'tiger':'\\ud83d\\udc2f',\n 'tiger2':'\\ud83d\\udc05',\n 'timer_clock':'\\u23f2',\n 'tipping_hand_man':'\\ud83d\\udc81‍\\u2642\\ufe0f',\n 'tired_face':'\\ud83d\\ude2b',\n 'tm':'\\u2122\\ufe0f',\n 'toilet':'\\ud83d\\udebd',\n 'tokyo_tower':'\\ud83d\\uddfc',\n 'tomato':'\\ud83c\\udf45',\n 'tongue':'\\ud83d\\udc45',\n 'top':'\\ud83d\\udd1d',\n 'tophat':'\\ud83c\\udfa9',\n 'tornado':'\\ud83c\\udf2a',\n 'trackball':'\\ud83d\\uddb2',\n 'tractor':'\\ud83d\\ude9c',\n 'traffic_light':'\\ud83d\\udea5',\n 'train':'\\ud83d\\ude8b',\n 'train2':'\\ud83d\\ude86',\n 'tram':'\\ud83d\\ude8a',\n 'triangular_flag_on_post':'\\ud83d\\udea9',\n 'triangular_ruler':'\\ud83d\\udcd0',\n 'trident':'\\ud83d\\udd31',\n 'triumph':'\\ud83d\\ude24',\n 'trolleybus':'\\ud83d\\ude8e',\n 'trophy':'\\ud83c\\udfc6',\n 'tropical_drink':'\\ud83c\\udf79',\n 'tropical_fish':'\\ud83d\\udc20',\n 'truck':'\\ud83d\\ude9a',\n 'trumpet':'\\ud83c\\udfba',\n 'tulip':'\\ud83c\\udf37',\n 'tumbler_glass':'\\ud83e\\udd43',\n 'turkey':'\\ud83e\\udd83',\n 'turtle':'\\ud83d\\udc22',\n 'tv':'\\ud83d\\udcfa',\n 'twisted_rightwards_arrows':'\\ud83d\\udd00',\n 'two_hearts':'\\ud83d\\udc95',\n 'two_men_holding_hands':'\\ud83d\\udc6c',\n 'two_women_holding_hands':'\\ud83d\\udc6d',\n 'u5272':'\\ud83c\\ude39',\n 'u5408':'\\ud83c\\ude34',\n 'u55b6':'\\ud83c\\ude3a',\n 'u6307':'\\ud83c\\ude2f\\ufe0f',\n 'u6708':'\\ud83c\\ude37\\ufe0f',\n 'u6709':'\\ud83c\\ude36',\n 'u6e80':'\\ud83c\\ude35',\n 'u7121':'\\ud83c\\ude1a\\ufe0f',\n 'u7533':'\\ud83c\\ude38',\n 'u7981':'\\ud83c\\ude32',\n 'u7a7a':'\\ud83c\\ude33',\n 'umbrella':'\\u2614\\ufe0f',\n 'unamused':'\\ud83d\\ude12',\n 'underage':'\\ud83d\\udd1e',\n 'unicorn':'\\ud83e\\udd84',\n 'unlock':'\\ud83d\\udd13',\n 'up':'\\ud83c\\udd99',\n 'upside_down_face':'\\ud83d\\ude43',\n 'v':'\\u270c\\ufe0f',\n 'vertical_traffic_light':'\\ud83d\\udea6',\n 'vhs':'\\ud83d\\udcfc',\n 'vibration_mode':'\\ud83d\\udcf3',\n 'video_camera':'\\ud83d\\udcf9',\n 'video_game':'\\ud83c\\udfae',\n 'violin':'\\ud83c\\udfbb',\n 'virgo':'\\u264d\\ufe0f',\n 'volcano':'\\ud83c\\udf0b',\n 'volleyball':'\\ud83c\\udfd0',\n 'vs':'\\ud83c\\udd9a',\n 'vulcan_salute':'\\ud83d\\udd96',\n 'walking_man':'\\ud83d\\udeb6',\n 'walking_woman':'\\ud83d\\udeb6‍\\u2640\\ufe0f',\n 'waning_crescent_moon':'\\ud83c\\udf18',\n 'waning_gibbous_moon':'\\ud83c\\udf16',\n 'warning':'\\u26a0\\ufe0f',\n 'wastebasket':'\\ud83d\\uddd1',\n 'watch':'\\u231a\\ufe0f',\n 'water_buffalo':'\\ud83d\\udc03',\n 'watermelon':'\\ud83c\\udf49',\n 'wave':'\\ud83d\\udc4b',\n 'wavy_dash':'\\u3030\\ufe0f',\n 'waxing_crescent_moon':'\\ud83c\\udf12',\n 'wc':'\\ud83d\\udebe',\n 'weary':'\\ud83d\\ude29',\n 'wedding':'\\ud83d\\udc92',\n 'weight_lifting_man':'\\ud83c\\udfcb\\ufe0f',\n 'weight_lifting_woman':'\\ud83c\\udfcb\\ufe0f‍\\u2640\\ufe0f',\n 'whale':'\\ud83d\\udc33',\n 'whale2':'\\ud83d\\udc0b',\n 'wheel_of_dharma':'\\u2638\\ufe0f',\n 'wheelchair':'\\u267f\\ufe0f',\n 'white_check_mark':'\\u2705',\n 'white_circle':'\\u26aa\\ufe0f',\n 'white_flag':'\\ud83c\\udff3\\ufe0f',\n 'white_flower':'\\ud83d\\udcae',\n 'white_large_square':'\\u2b1c\\ufe0f',\n 'white_medium_small_square':'\\u25fd\\ufe0f',\n 'white_medium_square':'\\u25fb\\ufe0f',\n 'white_small_square':'\\u25ab\\ufe0f',\n 'white_square_button':'\\ud83d\\udd33',\n 'wilted_flower':'\\ud83e\\udd40',\n 'wind_chime':'\\ud83c\\udf90',\n 'wind_face':'\\ud83c\\udf2c',\n 'wine_glass':'\\ud83c\\udf77',\n 'wink':'\\ud83d\\ude09',\n 'wolf':'\\ud83d\\udc3a',\n 'woman':'\\ud83d\\udc69',\n 'woman_artist':'\\ud83d\\udc69‍\\ud83c\\udfa8',\n 'woman_astronaut':'\\ud83d\\udc69‍\\ud83d\\ude80',\n 'woman_cartwheeling':'\\ud83e\\udd38‍\\u2640\\ufe0f',\n 'woman_cook':'\\ud83d\\udc69‍\\ud83c\\udf73',\n 'woman_facepalming':'\\ud83e\\udd26‍\\u2640\\ufe0f',\n 'woman_factory_worker':'\\ud83d\\udc69‍\\ud83c\\udfed',\n 'woman_farmer':'\\ud83d\\udc69‍\\ud83c\\udf3e',\n 'woman_firefighter':'\\ud83d\\udc69‍\\ud83d\\ude92',\n 'woman_health_worker':'\\ud83d\\udc69‍\\u2695\\ufe0f',\n 'woman_judge':'\\ud83d\\udc69‍\\u2696\\ufe0f',\n 'woman_juggling':'\\ud83e\\udd39‍\\u2640\\ufe0f',\n 'woman_mechanic':'\\ud83d\\udc69‍\\ud83d\\udd27',\n 'woman_office_worker':'\\ud83d\\udc69‍\\ud83d\\udcbc',\n 'woman_pilot':'\\ud83d\\udc69‍\\u2708\\ufe0f',\n 'woman_playing_handball':'\\ud83e\\udd3e‍\\u2640\\ufe0f',\n 'woman_playing_water_polo':'\\ud83e\\udd3d‍\\u2640\\ufe0f',\n 'woman_scientist':'\\ud83d\\udc69‍\\ud83d\\udd2c',\n 'woman_shrugging':'\\ud83e\\udd37‍\\u2640\\ufe0f',\n 'woman_singer':'\\ud83d\\udc69‍\\ud83c\\udfa4',\n 'woman_student':'\\ud83d\\udc69‍\\ud83c\\udf93',\n 'woman_teacher':'\\ud83d\\udc69‍\\ud83c\\udfeb',\n 'woman_technologist':'\\ud83d\\udc69‍\\ud83d\\udcbb',\n 'woman_with_turban':'\\ud83d\\udc73‍\\u2640\\ufe0f',\n 'womans_clothes':'\\ud83d\\udc5a',\n 'womans_hat':'\\ud83d\\udc52',\n 'women_wrestling':'\\ud83e\\udd3c‍\\u2640\\ufe0f',\n 'womens':'\\ud83d\\udeba',\n 'world_map':'\\ud83d\\uddfa',\n 'worried':'\\ud83d\\ude1f',\n 'wrench':'\\ud83d\\udd27',\n 'writing_hand':'\\u270d\\ufe0f',\n 'x':'\\u274c',\n 'yellow_heart':'\\ud83d\\udc9b',\n 'yen':'\\ud83d\\udcb4',\n 'yin_yang':'\\u262f\\ufe0f',\n 'yum':'\\ud83d\\ude0b',\n 'zap':'\\u26a1\\ufe0f',\n 'zipper_mouth_face':'\\ud83e\\udd10',\n 'zzz':'\\ud83d\\udca4',\n\n /* special emojis :P */\n 'octocat': '',\n 'showdown': ''\n};\n","/**\n * Created by Estevao on 31-05-2015.\n */\n\n/**\n * Showdown Converter class\n * @class\n * @param {object} [converterOptions]\n * @returns {Converter}\n */\nshowdown.Converter = function (converterOptions) {\n 'use strict';\n\n var\n /**\n * Options used by this converter\n * @private\n * @type {{}}\n */\n options = {},\n\n /**\n * Language extensions used by this converter\n * @private\n * @type {Array}\n */\n langExtensions = [],\n\n /**\n * Output modifiers extensions used by this converter\n * @private\n * @type {Array}\n */\n outputModifiers = [],\n\n /**\n * Event listeners\n * @private\n * @type {{}}\n */\n listeners = {},\n\n /**\n * The flavor set in this converter\n */\n setConvFlavor = setFlavor,\n\n /**\n * Metadata of the document\n * @type {{parsed: {}, raw: string, format: string}}\n */\n metadata = {\n parsed: {},\n raw: '',\n format: ''\n };\n\n _constructor();\n\n /**\n * Converter constructor\n * @private\n */\n function _constructor () {\n converterOptions = converterOptions || {};\n\n for (var gOpt in globalOptions) {\n if (globalOptions.hasOwnProperty(gOpt)) {\n options[gOpt] = globalOptions[gOpt];\n }\n }\n\n // Merge options\n if (typeof converterOptions === 'object') {\n for (var opt in converterOptions) {\n if (converterOptions.hasOwnProperty(opt)) {\n options[opt] = converterOptions[opt];\n }\n }\n } else {\n throw Error('Converter expects the passed parameter to be an object, but ' + typeof converterOptions +\n ' was passed instead.');\n }\n\n if (options.extensions) {\n showdown.helper.forEach(options.extensions, _parseExtension);\n }\n }\n\n /**\n * Parse extension\n * @param {*} ext\n * @param {string} [name='']\n * @private\n */\n function _parseExtension (ext, name) {\n\n name = name || null;\n // If it's a string, the extension was previously loaded\n if (showdown.helper.isString(ext)) {\n ext = showdown.helper.stdExtName(ext);\n name = ext;\n\n // LEGACY_SUPPORT CODE\n if (showdown.extensions[ext]) {\n console.warn('DEPRECATION WARNING: ' + ext + ' is an old extension that uses a deprecated loading method.' +\n 'Please inform the developer that the extension should be updated!');\n legacyExtensionLoading(showdown.extensions[ext], ext);\n return;\n // END LEGACY SUPPORT CODE\n\n } else if (!showdown.helper.isUndefined(extensions[ext])) {\n ext = extensions[ext];\n\n } else {\n throw Error('Extension \"' + ext + '\" could not be loaded. It was either not found or is not a valid extension.');\n }\n }\n\n if (typeof ext === 'function') {\n ext = ext();\n }\n\n if (!showdown.helper.isArray(ext)) {\n ext = [ext];\n }\n\n var validExt = validate(ext, name);\n if (!validExt.valid) {\n throw Error(validExt.error);\n }\n\n for (var i = 0; i < ext.length; ++i) {\n switch (ext[i].type) {\n\n case 'lang':\n langExtensions.push(ext[i]);\n break;\n\n case 'output':\n outputModifiers.push(ext[i]);\n break;\n }\n if (ext[i].hasOwnProperty('listeners')) {\n for (var ln in ext[i].listeners) {\n if (ext[i].listeners.hasOwnProperty(ln)) {\n listen(ln, ext[i].listeners[ln]);\n }\n }\n }\n }\n\n }\n\n /**\n * LEGACY_SUPPORT\n * @param {*} ext\n * @param {string} name\n */\n function legacyExtensionLoading (ext, name) {\n if (typeof ext === 'function') {\n ext = ext(new showdown.Converter());\n }\n if (!showdown.helper.isArray(ext)) {\n ext = [ext];\n }\n var valid = validate(ext, name);\n\n if (!valid.valid) {\n throw Error(valid.error);\n }\n\n for (var i = 0; i < ext.length; ++i) {\n switch (ext[i].type) {\n case 'lang':\n langExtensions.push(ext[i]);\n break;\n case 'output':\n outputModifiers.push(ext[i]);\n break;\n default:// should never reach here\n throw Error('Extension loader error: Type unrecognized!!!');\n }\n }\n }\n\n /**\n * Listen to an event\n * @param {string} name\n * @param {function} callback\n */\n function listen (name, callback) {\n if (!showdown.helper.isString(name)) {\n throw Error('Invalid argument in converter.listen() method: name must be a string, but ' + typeof name + ' given');\n }\n\n if (typeof callback !== 'function') {\n throw Error('Invalid argument in converter.listen() method: callback must be a function, but ' + typeof callback + ' given');\n }\n\n if (!listeners.hasOwnProperty(name)) {\n listeners[name] = [];\n }\n listeners[name].push(callback);\n }\n\n function rTrimInputText (text) {\n var rsp = text.match(/^\\s*/)[0].length,\n rgx = new RegExp('^\\\\s{0,' + rsp + '}', 'gm');\n return text.replace(rgx, '');\n }\n\n /**\n * Dispatch an event\n * @private\n * @param {string} evtName Event name\n * @param {string} text Text\n * @param {{}} options Converter Options\n * @param {{}} globals\n * @returns {string}\n */\n this._dispatch = function dispatch (evtName, text, options, globals) {\n if (listeners.hasOwnProperty(evtName)) {\n for (var ei = 0; ei < listeners[evtName].length; ++ei) {\n var nText = listeners[evtName][ei](evtName, text, this, options, globals);\n if (nText && typeof nText !== 'undefined') {\n text = nText;\n }\n }\n }\n return text;\n };\n\n /**\n * Listen to an event\n * @param {string} name\n * @param {function} callback\n * @returns {showdown.Converter}\n */\n this.listen = function (name, callback) {\n listen(name, callback);\n return this;\n };\n\n /**\n * Converts a markdown string into HTML\n * @param {string} text\n * @returns {*}\n */\n this.makeHtml = function (text) {\n //check if text is not falsy\n if (!text) {\n return text;\n }\n\n var globals = {\n gHtmlBlocks: [],\n gHtmlMdBlocks: [],\n gHtmlSpans: [],\n gUrls: {},\n gTitles: {},\n gDimensions: {},\n gListLevel: 0,\n hashLinkCounts: {},\n langExtensions: langExtensions,\n outputModifiers: outputModifiers,\n converter: this,\n ghCodeBlocks: [],\n metadata: {\n parsed: {},\n raw: '',\n format: ''\n }\n };\n\n // This lets us use ¨ trema as an escape char to avoid md5 hashes\n // The choice of character is arbitrary; anything that isn't\n // magic in Markdown will work.\n text = text.replace(/¨/g, '¨T');\n\n // Replace $ with ¨D\n // RegExp interprets $ as a special character\n // when it's in a replacement string\n text = text.replace(/\\$/g, '¨D');\n\n // Standardize line endings\n text = text.replace(/\\r\\n/g, '\\n'); // DOS to Unix\n text = text.replace(/\\r/g, '\\n'); // Mac to Unix\n\n // Stardardize line spaces (nbsp causes trouble in older browsers and some regex flavors)\n text = text.replace(/\\u00A0/g, ' ');\n\n if (options.smartIndentationFix) {\n text = rTrimInputText(text);\n }\n\n // Make sure text begins and ends with a couple of newlines:\n text = '\\n\\n' + text + '\\n\\n';\n\n // detab\n text = showdown.subParser('detab')(text, options, globals);\n\n /**\n * Strip any lines consisting only of spaces and tabs.\n * This makes subsequent regexs easier to write, because we can\n * match consecutive blank lines with /\\n+/ instead of something\n * contorted like /[ \\t]*\\n+/\n */\n text = text.replace(/^[ \\t]+$/mg, '');\n\n //run languageExtensions\n showdown.helper.forEach(langExtensions, function (ext) {\n text = showdown.subParser('runExtension')(ext, text, options, globals);\n });\n\n // run the sub parsers\n text = showdown.subParser('metadata')(text, options, globals);\n text = showdown.subParser('hashPreCodeTags')(text, options, globals);\n text = showdown.subParser('githubCodeBlocks')(text, options, globals);\n text = showdown.subParser('hashHTMLBlocks')(text, options, globals);\n text = showdown.subParser('hashCodeTags')(text, options, globals);\n text = showdown.subParser('stripLinkDefinitions')(text, options, globals);\n text = showdown.subParser('blockGamut')(text, options, globals);\n text = showdown.subParser('unhashHTMLSpans')(text, options, globals);\n text = showdown.subParser('unescapeSpecialChars')(text, options, globals);\n\n // attacklab: Restore dollar signs\n text = text.replace(/¨D/g, '$$');\n\n // attacklab: Restore tremas\n text = text.replace(/¨T/g, '¨');\n\n // render a complete html document instead of a partial if the option is enabled\n text = showdown.subParser('completeHTMLDocument')(text, options, globals);\n\n // Run output modifiers\n showdown.helper.forEach(outputModifiers, function (ext) {\n text = showdown.subParser('runExtension')(ext, text, options, globals);\n });\n\n // update metadata\n metadata = globals.metadata;\n return text;\n };\n\n /**\n * Set an option of this Converter instance\n * @param {string} key\n * @param {*} value\n */\n this.setOption = function (key, value) {\n options[key] = value;\n };\n\n /**\n * Get the option of this Converter instance\n * @param {string} key\n * @returns {*}\n */\n this.getOption = function (key) {\n return options[key];\n };\n\n /**\n * Get the options of this Converter instance\n * @returns {{}}\n */\n this.getOptions = function () {\n return options;\n };\n\n /**\n * Add extension to THIS converter\n * @param {{}} extension\n * @param {string} [name=null]\n */\n this.addExtension = function (extension, name) {\n name = name || null;\n _parseExtension(extension, name);\n };\n\n /**\n * Use a global registered extension with THIS converter\n * @param {string} extensionName Name of the previously registered extension\n */\n this.useExtension = function (extensionName) {\n _parseExtension(extensionName);\n };\n\n /**\n * Set the flavor THIS converter should use\n * @param {string} name\n */\n this.setFlavor = function (name) {\n if (!flavor.hasOwnProperty(name)) {\n throw Error(name + ' flavor was not found');\n }\n var preset = flavor[name];\n setConvFlavor = name;\n for (var option in preset) {\n if (preset.hasOwnProperty(option)) {\n options[option] = preset[option];\n }\n }\n };\n\n /**\n * Get the currently set flavor of this converter\n * @returns {string}\n */\n this.getFlavor = function () {\n return setConvFlavor;\n };\n\n /**\n * Remove an extension from THIS converter.\n * Note: This is a costly operation. It's better to initialize a new converter\n * and specify the extensions you wish to use\n * @param {Array} extension\n */\n this.removeExtension = function (extension) {\n if (!showdown.helper.isArray(extension)) {\n extension = [extension];\n }\n for (var a = 0; a < extension.length; ++a) {\n var ext = extension[a];\n for (var i = 0; i < langExtensions.length; ++i) {\n if (langExtensions[i] === ext) {\n langExtensions[i].splice(i, 1);\n }\n }\n for (var ii = 0; ii < outputModifiers.length; ++i) {\n if (outputModifiers[ii] === ext) {\n outputModifiers[ii].splice(i, 1);\n }\n }\n }\n };\n\n /**\n * Get all extension of THIS converter\n * @returns {{language: Array, output: Array}}\n */\n this.getAllExtensions = function () {\n return {\n language: langExtensions,\n output: outputModifiers\n };\n };\n\n /**\n * Get the metadata of the previously parsed document\n * @param raw\n * @returns {string|{}}\n */\n this.getMetadata = function (raw) {\n if (raw) {\n return metadata.raw;\n } else {\n return metadata.parsed;\n }\n };\n\n /**\n * Get the metadata format of the previously parsed document\n * @returns {string}\n */\n this.getMetadataFormat = function () {\n return metadata.format;\n };\n\n /**\n * Private: set a single key, value metadata pair\n * @param {string} key\n * @param {string} value\n */\n this._setMetadataPair = function (key, value) {\n metadata.parsed[key] = value;\n };\n\n /**\n * Private: set metadata format\n * @param {string} format\n */\n this._setMetadataFormat = function (format) {\n metadata.format = format;\n };\n\n /**\n * Private: set metadata raw text\n * @param {string} raw\n */\n this._setMetadataRaw = function (raw) {\n metadata.raw = raw;\n };\n};\n","/**\n * Turn Markdown link shortcuts into XHTML
    tags.\n */\nshowdown.subParser('anchors', function (text, options, globals) {\n 'use strict';\n\n text = globals.converter._dispatch('anchors.before', text, options, globals);\n\n var writeAnchorTag = function (wholeMatch, linkText, linkId, url, m5, m6, title) {\n if (showdown.helper.isUndefined(title)) {\n title = '';\n }\n linkId = linkId.toLowerCase();\n\n // Special case for explicit empty url\n if (wholeMatch.search(/\\(? ?(['\"].*['\"])?\\)$/m) > -1) {\n url = '';\n } else if (!url) {\n if (!linkId) {\n // lower-case and turn embedded newlines into spaces\n linkId = linkText.toLowerCase().replace(/ ?\\n/g, ' ');\n }\n url = '#' + linkId;\n\n if (!showdown.helper.isUndefined(globals.gUrls[linkId])) {\n url = globals.gUrls[linkId];\n if (!showdown.helper.isUndefined(globals.gTitles[linkId])) {\n title = globals.gTitles[linkId];\n }\n } else {\n return wholeMatch;\n }\n }\n\n //url = showdown.helper.escapeCharacters(url, '*_', false); // replaced line to improve performance\n url = url.replace(showdown.helper.regexes.asteriskDashAndColon, showdown.helper.escapeCharactersCallback);\n\n var result = '';\n\n return result;\n };\n\n // First, handle reference-style links: [link text] [id]\n text = text.replace(/\\[((?:\\[[^\\]]*]|[^\\[\\]])*)] ?(?:\\n *)?\\[(.*?)]()()()()/g, writeAnchorTag);\n\n // Next, inline-style links: [link text](url \"optional title\")\n // cases with crazy urls like ./image/cat1).png\n text = text.replace(/\\[((?:\\[[^\\]]*]|[^\\[\\]])*)]()[ \\t]*\\([ \\t]?<([^>]*)>(?:[ \\t]*(([\"'])([^\"]*?)\\5))?[ \\t]?\\)/g,\n writeAnchorTag);\n\n // normal cases\n text = text.replace(/\\[((?:\\[[^\\]]*]|[^\\[\\]])*)]()[ \\t]*\\([ \\t]??(?:[ \\t]*(([\"'])([^\"]*?)\\5))?[ \\t]?\\)/g,\n writeAnchorTag);\n\n // handle reference-style shortcuts: [link text]\n // These must come last in case you've also got [link test][1]\n // or [link test](/foo)\n text = text.replace(/\\[([^\\[\\]]+)]()()()()()/g, writeAnchorTag);\n\n // Lastly handle GithubMentions if option is enabled\n if (options.ghMentions) {\n text = text.replace(/(^|\\s)(\\\\)?(@([a-z\\d\\-]+))(?=[.!?;,[\\]()]|\\s|$)/gmi, function (wm, st, escape, mentions, username) {\n if (escape === '\\\\') {\n return st + mentions;\n }\n\n //check if options.ghMentionsLink is a string\n if (!showdown.helper.isString(options.ghMentionsLink)) {\n throw new Error('ghMentionsLink option must be a string');\n }\n var lnk = options.ghMentionsLink.replace(/\\{u}/g, username),\n target = '';\n if (options.openLinksInNewWindow) {\n target = ' target=\"¨E95Eblank\"';\n }\n return st + '' + mentions + '';\n });\n }\n\n text = globals.converter._dispatch('anchors.after', text, options, globals);\n return text;\n});\n","// url allowed chars [a-z\\d_.~:/?#[]@!$&'()*+,;=-]\n\nvar simpleURLRegex = /([*~_]+|\\b)(((https?|ftp|dict):\\/\\/|www\\.)[^'\">\\s]+?\\.[^'\">\\s]+?)()(\\1)?(?=\\s|$)(?![\"<>])/gi,\n simpleURLRegex2 = /([*~_]+|\\b)(((https?|ftp|dict):\\/\\/|www\\.)[^'\">\\s]+\\.[^'\">\\s]+?)([.!?,()\\[\\]])?(\\1)?(?=\\s|$)(?![\"<>])/gi,\n delimUrlRegex = /()<(((https?|ftp|dict):\\/\\/|www\\.)[^'\">\\s]+)()>()/gi,\n simpleMailRegex = /(^|\\s)(?:mailto:)?([A-Za-z0-9!#$%&'*+-/=?^_`{|}~.]+@[-a-z0-9]+(\\.[-a-z0-9]+)*\\.[a-z]+)(?=$|\\s)/gmi,\n delimMailRegex = /<()(?:mailto:)?([-.\\w]+@[-a-z0-9]+(\\.[-a-z0-9]+)*\\.[a-z]+)>/gi,\n\n replaceLink = function (options) {\n 'use strict';\n return function (wm, leadingMagicChars, link, m2, m3, trailingPunctuation, trailingMagicChars) {\n link = link.replace(showdown.helper.regexes.asteriskDashAndColon, showdown.helper.escapeCharactersCallback);\n var lnkTxt = link,\n append = '',\n target = '',\n lmc = leadingMagicChars || '',\n tmc = trailingMagicChars || '';\n if (/^www\\./i.test(link)) {\n link = link.replace(/^www\\./i, 'http://www.');\n }\n if (options.excludeTrailingPunctuationFromURLs && trailingPunctuation) {\n append = trailingPunctuation;\n }\n if (options.openLinksInNewWindow) {\n target = ' target=\"¨E95Eblank\"';\n }\n return lmc + '' + lnkTxt + '' + append + tmc;\n };\n },\n\n replaceMail = function (options, globals) {\n 'use strict';\n return function (wholeMatch, b, mail) {\n var href = 'mailto:';\n b = b || '';\n mail = showdown.subParser('unescapeSpecialChars')(mail, options, globals);\n if (options.encodeEmails) {\n href = showdown.helper.encodeEmailAddress(href + mail);\n mail = showdown.helper.encodeEmailAddress(mail);\n } else {\n href = href + mail;\n }\n return b + '' + mail + '';\n };\n };\n\nshowdown.subParser('autoLinks', function (text, options, globals) {\n 'use strict';\n\n text = globals.converter._dispatch('autoLinks.before', text, options, globals);\n\n text = text.replace(delimUrlRegex, replaceLink(options));\n text = text.replace(delimMailRegex, replaceMail(options, globals));\n\n text = globals.converter._dispatch('autoLinks.after', text, options, globals);\n\n return text;\n});\n\nshowdown.subParser('simplifiedAutoLinks', function (text, options, globals) {\n 'use strict';\n\n if (!options.simplifiedAutoLink) {\n return text;\n }\n\n text = globals.converter._dispatch('simplifiedAutoLinks.before', text, options, globals);\n\n if (options.excludeTrailingPunctuationFromURLs) {\n text = text.replace(simpleURLRegex2, replaceLink(options));\n } else {\n text = text.replace(simpleURLRegex, replaceLink(options));\n }\n text = text.replace(simpleMailRegex, replaceMail(options, globals));\n\n text = globals.converter._dispatch('simplifiedAutoLinks.after', text, options, globals);\n\n return text;\n});\n","/**\n * These are all the transformations that form block-level\n * tags like paragraphs, headers, and list items.\n */\nshowdown.subParser('blockGamut', function (text, options, globals) {\n 'use strict';\n\n text = globals.converter._dispatch('blockGamut.before', text, options, globals);\n\n // we parse blockquotes first so that we can have headings and hrs\n // inside blockquotes\n text = showdown.subParser('blockQuotes')(text, options, globals);\n text = showdown.subParser('headers')(text, options, globals);\n\n // Do Horizontal Rules:\n text = showdown.subParser('horizontalRule')(text, options, globals);\n\n text = showdown.subParser('lists')(text, options, globals);\n text = showdown.subParser('codeBlocks')(text, options, globals);\n text = showdown.subParser('tables')(text, options, globals);\n\n // We already ran _HashHTMLBlocks() before, in Markdown(), but that\n // was to escape raw HTML in the original Markdown source. This time,\n // we're escaping the markup we've just created, so that we don't wrap\n //

    tags around block-level tags.\n text = showdown.subParser('hashHTMLBlocks')(text, options, globals);\n text = showdown.subParser('paragraphs')(text, options, globals);\n\n text = globals.converter._dispatch('blockGamut.after', text, options, globals);\n\n return text;\n});\n","showdown.subParser('blockQuotes', function (text, options, globals) {\n 'use strict';\n\n text = globals.converter._dispatch('blockQuotes.before', text, options, globals);\n\n // add a couple extra lines after the text and endtext mark\n text = text + '\\n\\n';\n\n var rgx = /(^ {0,3}>[ \\t]?.+\\n(.+\\n)*\\n*)+/gm;\n\n if (options.splitAdjacentBlockquotes) {\n rgx = /^ {0,3}>[\\s\\S]*?(?:\\n\\n)/gm;\n }\n\n text = text.replace(rgx, function (bq) {\n // attacklab: hack around Konqueror 3.5.4 bug:\n // \"----------bug\".replace(/^-/g,\"\") == \"bug\"\n bq = bq.replace(/^[ \\t]*>[ \\t]?/gm, ''); // trim one level of quoting\n\n // attacklab: clean up hack\n bq = bq.replace(/¨0/g, '');\n\n bq = bq.replace(/^[ \\t]+$/gm, ''); // trim whitespace-only lines\n bq = showdown.subParser('githubCodeBlocks')(bq, options, globals);\n bq = showdown.subParser('blockGamut')(bq, options, globals); // recurse\n\n bq = bq.replace(/(^|\\n)/g, '$1 ');\n // These leading spaces screw with

     content, so we need to fix that:\n    bq = bq.replace(/(\\s*
    [^\\r]+?<\\/pre>)/gm, function (wholeMatch, m1) {\n      var pre = m1;\n      // attacklab: hack around Konqueror 3.5.4 bug:\n      pre = pre.replace(/^  /mg, '¨0');\n      pre = pre.replace(/¨0/g, '');\n      return pre;\n    });\n\n    return showdown.subParser('hashBlock')('
    \\n' + bq + '\\n
    ', options, globals);\n });\n\n text = globals.converter._dispatch('blockQuotes.after', text, options, globals);\n return text;\n});\n","/**\n * Process Markdown `
    ` blocks.\n */\nshowdown.subParser('codeBlocks', function (text, options, globals) {\n  'use strict';\n\n  text = globals.converter._dispatch('codeBlocks.before', text, options, globals);\n\n  // sentinel workarounds for lack of \\A and \\Z, safari\\khtml bug\n  text += '¨0';\n\n  var pattern = /(?:\\n\\n|^)((?:(?:[ ]{4}|\\t).*\\n+)+)(\\n*[ ]{0,3}[^ \\t\\n]|(?=¨0))/g;\n  text = text.replace(pattern, function (wholeMatch, m1, m2) {\n    var codeblock = m1,\n        nextChar = m2,\n        end = '\\n';\n\n    codeblock = showdown.subParser('outdent')(codeblock, options, globals);\n    codeblock = showdown.subParser('encodeCode')(codeblock, options, globals);\n    codeblock = showdown.subParser('detab')(codeblock, options, globals);\n    codeblock = codeblock.replace(/^\\n+/g, ''); // trim leading newlines\n    codeblock = codeblock.replace(/\\n+$/g, ''); // trim trailing newlines\n\n    if (options.omitExtraWLInCodeBlocks) {\n      end = '';\n    }\n\n    codeblock = '
    ' + codeblock + end + '
    ';\n\n return showdown.subParser('hashBlock')(codeblock, options, globals) + nextChar;\n });\n\n // strip sentinel\n text = text.replace(/¨0/, '');\n\n text = globals.converter._dispatch('codeBlocks.after', text, options, globals);\n return text;\n});\n","/**\n *\n * * Backtick quotes are used for spans.\n *\n * * You can use multiple backticks as the delimiters if you want to\n * include literal backticks in the code span. So, this input:\n *\n * Just type ``foo `bar` baz`` at the prompt.\n *\n * Will translate to:\n *\n *

    Just type foo `bar` baz at the prompt.

    \n *\n * There's no arbitrary limit to the number of backticks you\n * can use as delimters. If you need three consecutive backticks\n * in your code, use four for delimiters, etc.\n *\n * * You can use spaces to get literal backticks at the edges:\n *\n * ... type `` `bar` `` ...\n *\n * Turns to:\n *\n * ... type `bar` ...\n */\nshowdown.subParser('codeSpans', function (text, options, globals) {\n 'use strict';\n\n text = globals.converter._dispatch('codeSpans.before', text, options, globals);\n\n if (typeof(text) === 'undefined') {\n text = '';\n }\n text = text.replace(/(^|[^\\\\])(`+)([^\\r]*?[^`])\\2(?!`)/gm,\n function (wholeMatch, m1, m2, m3) {\n var c = m3;\n c = c.replace(/^([ \\t]*)/g, '');\t// leading whitespace\n c = c.replace(/[ \\t]*$/g, '');\t// trailing whitespace\n c = showdown.subParser('encodeCode')(c, options, globals);\n c = m1 + '' + c + '';\n c = showdown.subParser('hashHTMLSpans')(c, options, globals);\n return c;\n }\n );\n\n text = globals.converter._dispatch('codeSpans.after', text, options, globals);\n return text;\n});\n","/**\n * Turn Markdown link shortcuts into XHTML tags.\n */\nshowdown.subParser('completeHTMLDocument', function (text, options, globals) {\n 'use strict';\n\n if (!options.completeHTMLDocument) {\n return text;\n }\n\n text = globals.converter._dispatch('completeHTMLDocument.before', text, options, globals);\n\n var doctype = 'html',\n doctypeParsed = '\\n',\n title = '',\n charset = '\\n',\n lang = '',\n metadata = '';\n\n if (typeof globals.metadata.parsed.doctype !== 'undefined') {\n doctypeParsed = '\\n';\n doctype = globals.metadata.parsed.doctype.toString().toLowerCase();\n if (doctype === 'html' || doctype === 'html5') {\n charset = '';\n }\n }\n\n for (var meta in globals.metadata.parsed) {\n if (globals.metadata.parsed.hasOwnProperty(meta)) {\n switch (meta.toLowerCase()) {\n case 'doctype':\n break;\n\n case 'title':\n title = '' + globals.metadata.parsed.title + '\\n';\n break;\n\n case 'charset':\n if (doctype === 'html' || doctype === 'html5') {\n charset = '\\n';\n } else {\n charset = '\\n';\n }\n break;\n\n case 'language':\n case 'lang':\n lang = ' lang=\"' + globals.metadata.parsed[meta] + '\"';\n metadata += '\\n';\n break;\n\n default:\n metadata += '\\n';\n }\n }\n }\n\n text = doctypeParsed + '\\n\\n' + title + charset + metadata + '\\n\\n' + text.trim() + '\\n\\n';\n\n text = globals.converter._dispatch('completeHTMLDocument.after', text, options, globals);\n return text;\n});\n","/**\n * Convert all tabs to spaces\n */\nshowdown.subParser('detab', function (text, options, globals) {\n 'use strict';\n text = globals.converter._dispatch('detab.before', text, options, globals);\n\n // expand first n-1 tabs\n text = text.replace(/\\t(?=\\t)/g, ' '); // g_tab_width\n\n // replace the nth with two sentinels\n text = text.replace(/\\t/g, '¨A¨B');\n\n // use the sentinel to anchor our regex so it doesn't explode\n text = text.replace(/¨B(.+?)¨A/g, function (wholeMatch, m1) {\n var leadingText = m1,\n numSpaces = 4 - leadingText.length % 4; // g_tab_width\n\n // there *must* be a better way to do this:\n for (var i = 0; i < numSpaces; i++) {\n leadingText += ' ';\n }\n\n return leadingText;\n });\n\n // clean up sentinels\n text = text.replace(/¨A/g, ' '); // g_tab_width\n text = text.replace(/¨B/g, '');\n\n text = globals.converter._dispatch('detab.after', text, options, globals);\n return text;\n});\n","showdown.subParser('ellipsis', function (text, options, globals) {\n 'use strict';\n\n text = globals.converter._dispatch('ellipsis.before', text, options, globals);\n\n text = text.replace(/\\.\\.\\./g, '…');\n\n text = globals.converter._dispatch('ellipsis.after', text, options, globals);\n\n return text;\n});\n","/**\n * These are all the transformations that occur *within* block-level\n * tags like paragraphs, headers, and list items.\n */\nshowdown.subParser('emoji', function (text, options, globals) {\n 'use strict';\n\n if (!options.emoji) {\n return text;\n }\n\n text = globals.converter._dispatch('emoji.before', text, options, globals);\n\n var emojiRgx = /:([\\S]+?):/g;\n\n text = text.replace(emojiRgx, function (wm, emojiCode) {\n if (showdown.helper.emojis.hasOwnProperty(emojiCode)) {\n return showdown.helper.emojis[emojiCode];\n }\n return wm;\n });\n\n text = globals.converter._dispatch('emoji.after', text, options, globals);\n\n return text;\n});\n","/**\n * Smart processing for ampersands and angle brackets that need to be encoded.\n */\nshowdown.subParser('encodeAmpsAndAngles', function (text, options, globals) {\n 'use strict';\n text = globals.converter._dispatch('encodeAmpsAndAngles.before', text, options, globals);\n\n // Ampersand-encoding based entirely on Nat Irons's Amputator MT plugin:\n // http://bumppo.net/projects/amputator/\n text = text.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\\w+);)/g, '&');\n\n // Encode naked <'s\n text = text.replace(/<(?![a-z\\/?$!])/gi, '<');\n\n // Encode <\n text = text.replace(/\n text = text.replace(/>/g, '>');\n\n text = globals.converter._dispatch('encodeAmpsAndAngles.after', text, options, globals);\n return text;\n});\n","/**\n * Returns the string, with after processing the following backslash escape sequences.\n *\n * attacklab: The polite way to do this is with the new escapeCharacters() function:\n *\n * text = escapeCharacters(text,\"\\\\\",true);\n * text = escapeCharacters(text,\"`*_{}[]()>#+-.!\",true);\n *\n * ...but we're sidestepping its use of the (slow) RegExp constructor\n * as an optimization for Firefox. This function gets called a LOT.\n */\nshowdown.subParser('encodeBackslashEscapes', function (text, options, globals) {\n 'use strict';\n text = globals.converter._dispatch('encodeBackslashEscapes.before', text, options, globals);\n\n text = text.replace(/\\\\(\\\\)/g, showdown.helper.escapeCharactersCallback);\n text = text.replace(/\\\\([`*_{}\\[\\]()>#+.!~=|-])/g, showdown.helper.escapeCharactersCallback);\n\n text = globals.converter._dispatch('encodeBackslashEscapes.after', text, options, globals);\n return text;\n});\n","/**\n * Encode/escape certain characters inside Markdown code runs.\n * The point is that in code, these characters are literals,\n * and lose their special Markdown meanings.\n */\nshowdown.subParser('encodeCode', function (text, options, globals) {\n 'use strict';\n\n text = globals.converter._dispatch('encodeCode.before', text, options, globals);\n\n // Encode all ampersands; HTML entities are not\n // entities within a Markdown code span.\n text = text\n .replace(/&/g, '&')\n // Do the angle bracket song and dance:\n .replace(//g, '>')\n // Now, escape characters that are magic in Markdown:\n .replace(/([*_{}\\[\\]\\\\=~-])/g, showdown.helper.escapeCharactersCallback);\n\n text = globals.converter._dispatch('encodeCode.after', text, options, globals);\n return text;\n});\n","/**\n * Within tags -- meaning between < and > -- encode [\\ ` * _ ~ =] so they\n * don't conflict with their use in Markdown for code, italics and strong.\n */\nshowdown.subParser('escapeSpecialCharsWithinTagAttributes', function (text, options, globals) {\n 'use strict';\n text = globals.converter._dispatch('escapeSpecialCharsWithinTagAttributes.before', text, options, globals);\n\n // Build a regex to find HTML tags.\n var tags = /<\\/?[a-z\\d_:-]+(?:[\\s]+[\\s\\S]+?)?>/gi,\n comments = /-]|-[^>])(?:[^-]|-[^-])*)--)>/gi;\n\n text = text.replace(tags, function (wholeMatch) {\n return wholeMatch\n .replace(/(.)<\\/?code>(?=.)/g, '$1`')\n .replace(/([\\\\`*_~=|])/g, showdown.helper.escapeCharactersCallback);\n });\n\n text = text.replace(comments, function (wholeMatch) {\n return wholeMatch\n .replace(/([\\\\`*_~=|])/g, showdown.helper.escapeCharactersCallback);\n });\n\n text = globals.converter._dispatch('escapeSpecialCharsWithinTagAttributes.after', text, options, globals);\n return text;\n});\n","/**\n * Handle github codeblocks prior to running HashHTML so that\n * HTML contained within the codeblock gets escaped properly\n * Example:\n * ```ruby\n * def hello_world(x)\n * puts \"Hello, #{x}\"\n * end\n * ```\n */\nshowdown.subParser('githubCodeBlocks', function (text, options, globals) {\n 'use strict';\n\n // early exit if option is not enabled\n if (!options.ghCodeBlocks) {\n return text;\n }\n\n text = globals.converter._dispatch('githubCodeBlocks.before', text, options, globals);\n\n text += '¨0';\n\n text = text.replace(/(?:^|\\n)(```+|~~~+)([^\\s`~]*)\\n([\\s\\S]*?)\\n\\1/g, function (wholeMatch, delim, language, codeblock) {\n var end = (options.omitExtraWLInCodeBlocks) ? '' : '\\n';\n\n // First parse the github code block\n codeblock = showdown.subParser('encodeCode')(codeblock, options, globals);\n codeblock = showdown.subParser('detab')(codeblock, options, globals);\n codeblock = codeblock.replace(/^\\n+/g, ''); // trim leading newlines\n codeblock = codeblock.replace(/\\n+$/g, ''); // trim trailing whitespace\n\n codeblock = '
    ' + codeblock + end + '
    ';\n\n codeblock = showdown.subParser('hashBlock')(codeblock, options, globals);\n\n // Since GHCodeblocks can be false positives, we need to\n // store the primitive text and the parsed text in a global var,\n // and then return a token\n return '\\n\\n¨G' + (globals.ghCodeBlocks.push({text: wholeMatch, codeblock: codeblock}) - 1) + 'G\\n\\n';\n });\n\n // attacklab: strip sentinel\n text = text.replace(/¨0/, '');\n\n return globals.converter._dispatch('githubCodeBlocks.after', text, options, globals);\n});\n","showdown.subParser('hashBlock', function (text, options, globals) {\n 'use strict';\n text = globals.converter._dispatch('hashBlock.before', text, options, globals);\n text = text.replace(/(^\\n+|\\n+$)/g, '');\n text = '\\n\\n¨K' + (globals.gHtmlBlocks.push(text) - 1) + 'K\\n\\n';\n text = globals.converter._dispatch('hashBlock.after', text, options, globals);\n return text;\n});\n","/**\n * Hash and escape elements that should not be parsed as markdown\n */\nshowdown.subParser('hashCodeTags', function (text, options, globals) {\n 'use strict';\n text = globals.converter._dispatch('hashCodeTags.before', text, options, globals);\n\n var repFunc = function (wholeMatch, match, left, right) {\n var codeblock = left + showdown.subParser('encodeCode')(match, options, globals) + right;\n return '¨C' + (globals.gHtmlSpans.push(codeblock) - 1) + 'C';\n };\n\n // Hash naked \n text = showdown.helper.replaceRecursiveRegExp(text, repFunc, ']*>', '', 'gim');\n\n text = globals.converter._dispatch('hashCodeTags.after', text, options, globals);\n return text;\n});\n","showdown.subParser('hashElement', function (text, options, globals) {\n 'use strict';\n\n return function (wholeMatch, m1) {\n var blockText = m1;\n\n // Undo double lines\n blockText = blockText.replace(/\\n\\n/g, '\\n');\n blockText = blockText.replace(/^\\n/, '');\n\n // strip trailing blank lines\n blockText = blockText.replace(/\\n+$/g, '');\n\n // Replace the element text with a marker (\"¨KxK\" where x is its key)\n blockText = '\\n\\n¨K' + (globals.gHtmlBlocks.push(blockText) - 1) + 'K\\n\\n';\n\n return blockText;\n };\n});\n","showdown.subParser('hashHTMLBlocks', function (text, options, globals) {\n 'use strict';\n text = globals.converter._dispatch('hashHTMLBlocks.before', text, options, globals);\n\n var blockTags = [\n 'pre',\n 'div',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'blockquote',\n 'table',\n 'dl',\n 'ol',\n 'ul',\n 'script',\n 'noscript',\n 'form',\n 'fieldset',\n 'iframe',\n 'math',\n 'style',\n 'section',\n 'header',\n 'footer',\n 'nav',\n 'article',\n 'aside',\n 'address',\n 'audio',\n 'canvas',\n 'figure',\n 'hgroup',\n 'output',\n 'video',\n 'p'\n ],\n repFunc = function (wholeMatch, match, left, right) {\n var txt = wholeMatch;\n // check if this html element is marked as markdown\n // if so, it's contents should be parsed as markdown\n if (left.search(/\\bmarkdown\\b/) !== -1) {\n txt = left + globals.converter.makeHtml(match) + right;\n }\n return '\\n\\n¨K' + (globals.gHtmlBlocks.push(txt) - 1) + 'K\\n\\n';\n };\n\n if (options.backslashEscapesHTMLTags) {\n // encode backslash escaped HTML tags\n text = text.replace(/\\\\<(\\/?[^>]+?)>/g, function (wm, inside) {\n return '<' + inside + '>';\n });\n }\n\n // hash HTML Blocks\n for (var i = 0; i < blockTags.length; ++i) {\n\n var opTagPos,\n rgx1 = new RegExp('^ {0,3}(<' + blockTags[i] + '\\\\b[^>]*>)', 'im'),\n patLeft = '<' + blockTags[i] + '\\\\b[^>]*>',\n patRight = '';\n // 1. Look for the first position of the first opening HTML tag in the text\n while ((opTagPos = showdown.helper.regexIndexOf(text, rgx1)) !== -1) {\n\n // if the HTML tag is \\ escaped, we need to escape it and break\n\n\n //2. Split the text in that position\n var subTexts = showdown.helper.splitAtIndex(text, opTagPos),\n //3. Match recursively\n newSubText1 = showdown.helper.replaceRecursiveRegExp(subTexts[1], repFunc, patLeft, patRight, 'im');\n\n // prevent an infinite loop\n if (newSubText1 === subTexts[1]) {\n break;\n }\n text = subTexts[0].concat(newSubText1);\n }\n }\n // HR SPECIAL CASE\n text = text.replace(/(\\n {0,3}(<(hr)\\b([^<>])*?\\/?>)[ \\t]*(?=\\n{2,}))/g,\n showdown.subParser('hashElement')(text, options, globals));\n\n // Special case for standalone HTML comments\n text = showdown.helper.replaceRecursiveRegExp(text, function (txt) {\n return '\\n\\n¨K' + (globals.gHtmlBlocks.push(txt) - 1) + 'K\\n\\n';\n }, '^ {0,3}', 'gm');\n\n // PHP and ASP-style processor instructions ( and <%...%>)\n text = text.replace(/(?:\\n\\n)( {0,3}(?:<([?%])[^\\r]*?\\2>)[ \\t]*(?=\\n{2,}))/g,\n showdown.subParser('hashElement')(text, options, globals));\n\n text = globals.converter._dispatch('hashHTMLBlocks.after', text, options, globals);\n return text;\n});\n","/**\n * Hash span elements that should not be parsed as markdown\n */\nshowdown.subParser('hashHTMLSpans', function (text, options, globals) {\n 'use strict';\n text = globals.converter._dispatch('hashHTMLSpans.before', text, options, globals);\n\n function hashHTMLSpan (html) {\n return '¨C' + (globals.gHtmlSpans.push(html) - 1) + 'C';\n }\n\n // Hash Self Closing tags\n text = text.replace(/<[^>]+?\\/>/gi, function (wm) {\n return hashHTMLSpan(wm);\n });\n\n // Hash tags without properties\n text = text.replace(/<([^>]+?)>[\\s\\S]*?<\\/\\1>/g, function (wm) {\n return hashHTMLSpan(wm);\n });\n\n // Hash tags with properties\n text = text.replace(/<([^>]+?)\\s[^>]+?>[\\s\\S]*?<\\/\\1>/g, function (wm) {\n return hashHTMLSpan(wm);\n });\n\n // Hash self closing tags without />\n text = text.replace(/<[^>]+?>/gi, function (wm) {\n return hashHTMLSpan(wm);\n });\n\n /*showdown.helper.matchRecursiveRegExp(text, ']*>', '', 'gi');*/\n\n text = globals.converter._dispatch('hashHTMLSpans.after', text, options, globals);\n return text;\n});\n\n/**\n * Unhash HTML spans\n */\nshowdown.subParser('unhashHTMLSpans', function (text, options, globals) {\n 'use strict';\n text = globals.converter._dispatch('unhashHTMLSpans.before', text, options, globals);\n\n for (var i = 0; i < globals.gHtmlSpans.length; ++i) {\n var repText = globals.gHtmlSpans[i],\n // limiter to prevent infinite loop (assume 10 as limit for recurse)\n limit = 0;\n\n while (/¨C(\\d+)C/.test(repText)) {\n var num = RegExp.$1;\n repText = repText.replace('¨C' + num + 'C', globals.gHtmlSpans[num]);\n if (limit === 10) {\n console.error('maximum nesting of 10 spans reached!!!');\n break;\n }\n ++limit;\n }\n text = text.replace('¨C' + i + 'C', repText);\n }\n\n text = globals.converter._dispatch('unhashHTMLSpans.after', text, options, globals);\n return text;\n});\n","/**\n * Hash and escape
     elements that should not be parsed as markdown\n */\nshowdown.subParser('hashPreCodeTags', function (text, options, globals) {\n  'use strict';\n  text = globals.converter._dispatch('hashPreCodeTags.before', text, options, globals);\n\n  var repFunc = function (wholeMatch, match, left, right) {\n    // encode html entities\n    var codeblock = left + showdown.subParser('encodeCode')(match, options, globals) + right;\n    return '\\n\\n¨G' + (globals.ghCodeBlocks.push({text: wholeMatch, codeblock: codeblock}) - 1) + 'G\\n\\n';\n  };\n\n  // Hash 
    \n  text = showdown.helper.replaceRecursiveRegExp(text, repFunc, '^ {0,3}]*>\\\\s*]*>', '^ {0,3}\\\\s*
    ', 'gim');\n\n text = globals.converter._dispatch('hashPreCodeTags.after', text, options, globals);\n return text;\n});\n","showdown.subParser('headers', function (text, options, globals) {\n 'use strict';\n\n text = globals.converter._dispatch('headers.before', text, options, globals);\n\n var headerLevelStart = (isNaN(parseInt(options.headerLevelStart))) ? 1 : parseInt(options.headerLevelStart),\n\n // Set text-style headers:\n //\tHeader 1\n //\t========\n //\n //\tHeader 2\n //\t--------\n //\n setextRegexH1 = (options.smoothLivePreview) ? /^(.+)[ \\t]*\\n={2,}[ \\t]*\\n+/gm : /^(.+)[ \\t]*\\n=+[ \\t]*\\n+/gm,\n setextRegexH2 = (options.smoothLivePreview) ? /^(.+)[ \\t]*\\n-{2,}[ \\t]*\\n+/gm : /^(.+)[ \\t]*\\n-+[ \\t]*\\n+/gm;\n\n text = text.replace(setextRegexH1, function (wholeMatch, m1) {\n\n var spanGamut = showdown.subParser('spanGamut')(m1, options, globals),\n hID = (options.noHeaderId) ? '' : ' id=\"' + headerId(m1) + '\"',\n hLevel = headerLevelStart,\n hashBlock = '' + spanGamut + '';\n return showdown.subParser('hashBlock')(hashBlock, options, globals);\n });\n\n text = text.replace(setextRegexH2, function (matchFound, m1) {\n var spanGamut = showdown.subParser('spanGamut')(m1, options, globals),\n hID = (options.noHeaderId) ? '' : ' id=\"' + headerId(m1) + '\"',\n hLevel = headerLevelStart + 1,\n hashBlock = '' + spanGamut + '';\n return showdown.subParser('hashBlock')(hashBlock, options, globals);\n });\n\n // atx-style headers:\n // # Header 1\n // ## Header 2\n // ## Header 2 with closing hashes ##\n // ...\n // ###### Header 6\n //\n var atxStyle = (options.requireSpaceBeforeHeadingText) ? /^(#{1,6})[ \\t]+(.+?)[ \\t]*#*\\n+/gm : /^(#{1,6})[ \\t]*(.+?)[ \\t]*#*\\n+/gm;\n\n text = text.replace(atxStyle, function (wholeMatch, m1, m2) {\n var hText = m2;\n if (options.customizedHeaderId) {\n hText = m2.replace(/\\s?\\{([^{]+?)}\\s*$/, '');\n }\n\n var span = showdown.subParser('spanGamut')(hText, options, globals),\n hID = (options.noHeaderId) ? '' : ' id=\"' + headerId(m2) + '\"',\n hLevel = headerLevelStart - 1 + m1.length,\n header = '' + span + '';\n\n return showdown.subParser('hashBlock')(header, options, globals);\n });\n\n function headerId (m) {\n var title,\n prefix;\n\n // It is separate from other options to allow combining prefix and customized\n if (options.customizedHeaderId) {\n var match = m.match(/\\{([^{]+?)}\\s*$/);\n if (match && match[1]) {\n m = match[1];\n }\n }\n\n title = m;\n\n // Prefix id to prevent causing inadvertent pre-existing style matches.\n if (showdown.helper.isString(options.prefixHeaderId)) {\n prefix = options.prefixHeaderId;\n } else if (options.prefixHeaderId === true) {\n prefix = 'section-';\n } else {\n prefix = '';\n }\n\n if (!options.rawPrefixHeaderId) {\n title = prefix + title;\n }\n\n if (options.ghCompatibleHeaderId) {\n title = title\n .replace(/ /g, '-')\n // replace previously escaped chars (&, ¨ and $)\n .replace(/&/g, '')\n .replace(/¨T/g, '')\n .replace(/¨D/g, '')\n // replace rest of the chars (&~$ are repeated as they might have been escaped)\n // borrowed from github's redcarpet (some they should produce similar results)\n .replace(/[&+$,\\/:;=?@\"#{}|^¨~\\[\\]`\\\\*)(%.!'<>]/g, '')\n .toLowerCase();\n } else if (options.rawHeaderId) {\n title = title\n .replace(/ /g, '-')\n // replace previously escaped chars (&, ¨ and $)\n .replace(/&/g, '&')\n .replace(/¨T/g, '¨')\n .replace(/¨D/g, '$')\n // replace \" and '\n .replace(/[\"']/g, '-')\n .toLowerCase();\n } else {\n title = title\n .replace(/[^\\w]/g, '')\n .toLowerCase();\n }\n\n if (options.rawPrefixHeaderId) {\n title = prefix + title;\n }\n\n if (globals.hashLinkCounts[title]) {\n title = title + '-' + (globals.hashLinkCounts[title]++);\n } else {\n globals.hashLinkCounts[title] = 1;\n }\n return title;\n }\n\n text = globals.converter._dispatch('headers.after', text, options, globals);\n return text;\n});\n","/**\n * Turn Markdown link shortcuts into XHTML
    tags.\n */\nshowdown.subParser('horizontalRule', function (text, options, globals) {\n 'use strict';\n text = globals.converter._dispatch('horizontalRule.before', text, options, globals);\n\n var key = showdown.subParser('hashBlock')('
    ', options, globals);\n text = text.replace(/^ {0,2}( ?-){3,}[ \\t]*$/gm, key);\n text = text.replace(/^ {0,2}( ?\\*){3,}[ \\t]*$/gm, key);\n text = text.replace(/^ {0,2}( ?_){3,}[ \\t]*$/gm, key);\n\n text = globals.converter._dispatch('horizontalRule.after', text, options, globals);\n return text;\n});\n","/**\n * Turn Markdown image shortcuts into tags.\n */\nshowdown.subParser('images', function (text, options, globals) {\n 'use strict';\n\n text = globals.converter._dispatch('images.before', text, options, globals);\n\n var inlineRegExp = /!\\[([^\\]]*?)][ \\t]*()\\([ \\t]??(?: =([*\\d]+[A-Za-z%]{0,4})x([*\\d]+[A-Za-z%]{0,4}))?[ \\t]*(?:([\"'])([^\"]*?)\\6)?[ \\t]?\\)/g,\n crazyRegExp = /!\\[([^\\]]*?)][ \\t]*()\\([ \\t]?<([^>]*)>(?: =([*\\d]+[A-Za-z%]{0,4})x([*\\d]+[A-Za-z%]{0,4}))?[ \\t]*(?:(?:([\"'])([^\"]*?)\\6))?[ \\t]?\\)/g,\n base64RegExp = /!\\[([^\\]]*?)][ \\t]*()\\([ \\t]??(?: =([*\\d]+[A-Za-z%]{0,4})x([*\\d]+[A-Za-z%]{0,4}))?[ \\t]*(?:([\"'])([^\"]*?)\\6)?[ \\t]?\\)/g,\n referenceRegExp = /!\\[([^\\]]*?)] ?(?:\\n *)?\\[([\\s\\S]*?)]()()()()()/g,\n refShortcutRegExp = /!\\[([^\\[\\]]+)]()()()()()/g;\n\n function writeImageTagBase64 (wholeMatch, altText, linkId, url, width, height, m5, title) {\n url = url.replace(/\\s/g, '');\n return writeImageTag (wholeMatch, altText, linkId, url, width, height, m5, title);\n }\n\n function writeImageTag (wholeMatch, altText, linkId, url, width, height, m5, title) {\n\n var gUrls = globals.gUrls,\n gTitles = globals.gTitles,\n gDims = globals.gDimensions;\n\n linkId = linkId.toLowerCase();\n\n if (!title) {\n title = '';\n }\n // Special case for explicit empty url\n if (wholeMatch.search(/\\(? ?(['\"].*['\"])?\\)$/m) > -1) {\n url = '';\n\n } else if (url === '' || url === null) {\n if (linkId === '' || linkId === null) {\n // lower-case and turn embedded newlines into spaces\n linkId = altText.toLowerCase().replace(/ ?\\n/g, ' ');\n }\n url = '#' + linkId;\n\n if (!showdown.helper.isUndefined(gUrls[linkId])) {\n url = gUrls[linkId];\n if (!showdown.helper.isUndefined(gTitles[linkId])) {\n title = gTitles[linkId];\n }\n if (!showdown.helper.isUndefined(gDims[linkId])) {\n width = gDims[linkId].width;\n height = gDims[linkId].height;\n }\n } else {\n return wholeMatch;\n }\n }\n\n altText = altText\n .replace(/\"/g, '"')\n //altText = showdown.helper.escapeCharacters(altText, '*_', false);\n .replace(showdown.helper.regexes.asteriskDashAndColon, showdown.helper.escapeCharactersCallback);\n //url = showdown.helper.escapeCharacters(url, '*_', false);\n url = url.replace(showdown.helper.regexes.asteriskDashAndColon, showdown.helper.escapeCharactersCallback);\n var result = '\"'x \"optional title\")\n\n // base64 encoded images\n text = text.replace(base64RegExp, writeImageTagBase64);\n\n // cases with crazy urls like ./image/cat1).png\n text = text.replace(crazyRegExp, writeImageTag);\n\n // normal cases\n text = text.replace(inlineRegExp, writeImageTag);\n\n // handle reference-style shortcuts: ![img text]\n text = text.replace(refShortcutRegExp, writeImageTag);\n\n text = globals.converter._dispatch('images.after', text, options, globals);\n return text;\n});\n","showdown.subParser('italicsAndBold', function (text, options, globals) {\n 'use strict';\n\n text = globals.converter._dispatch('italicsAndBold.before', text, options, globals);\n\n // it's faster to have 3 separate regexes for each case than have just one\n // because of backtracing, in some cases, it could lead to an exponential effect\n // called \"catastrophic backtrace\". Ominous!\n\n function parseInside (txt, left, right) {\n /*\n if (options.simplifiedAutoLink) {\n txt = showdown.subParser('simplifiedAutoLinks')(txt, options, globals);\n }\n */\n return left + txt + right;\n }\n\n // Parse underscores\n if (options.literalMidWordUnderscores) {\n text = text.replace(/\\b___(\\S[\\s\\S]*)___\\b/g, function (wm, txt) {\n return parseInside (txt, '', '');\n });\n text = text.replace(/\\b__(\\S[\\s\\S]*)__\\b/g, function (wm, txt) {\n return parseInside (txt, '', '');\n });\n text = text.replace(/\\b_(\\S[\\s\\S]*?)_\\b/g, function (wm, txt) {\n return parseInside (txt, '', '');\n });\n } else {\n text = text.replace(/___(\\S[\\s\\S]*?)___/g, function (wm, m) {\n return (/\\S$/.test(m)) ? parseInside (m, '', '') : wm;\n });\n text = text.replace(/__(\\S[\\s\\S]*?)__/g, function (wm, m) {\n return (/\\S$/.test(m)) ? parseInside (m, '', '') : wm;\n });\n text = text.replace(/_([^\\s_][\\s\\S]*?)_/g, function (wm, m) {\n // !/^_[^_]/.test(m) - test if it doesn't start with __ (since it seems redundant, we removed it)\n return (/\\S$/.test(m)) ? parseInside (m, '', '') : wm;\n });\n }\n\n // Now parse asterisks\n if (options.literalMidWordAsterisks) {\n text = text.replace(/([^*]|^)\\B\\*\\*\\*(\\S[\\s\\S]+?)\\*\\*\\*\\B(?!\\*)/g, function (wm, lead, txt) {\n return parseInside (txt, lead + '', '');\n });\n text = text.replace(/([^*]|^)\\B\\*\\*(\\S[\\s\\S]+?)\\*\\*\\B(?!\\*)/g, function (wm, lead, txt) {\n return parseInside (txt, lead + '', '');\n });\n text = text.replace(/([^*]|^)\\B\\*(\\S[\\s\\S]+?)\\*\\B(?!\\*)/g, function (wm, lead, txt) {\n return parseInside (txt, lead + '', '');\n });\n } else {\n text = text.replace(/\\*\\*\\*(\\S[\\s\\S]*?)\\*\\*\\*/g, function (wm, m) {\n return (/\\S$/.test(m)) ? parseInside (m, '', '') : wm;\n });\n text = text.replace(/\\*\\*(\\S[\\s\\S]*?)\\*\\*/g, function (wm, m) {\n return (/\\S$/.test(m)) ? parseInside (m, '', '') : wm;\n });\n text = text.replace(/\\*([^\\s*][\\s\\S]*?)\\*/g, function (wm, m) {\n // !/^\\*[^*]/.test(m) - test if it doesn't start with ** (since it seems redundant, we removed it)\n return (/\\S$/.test(m)) ? parseInside (m, '', '') : wm;\n });\n }\n\n\n text = globals.converter._dispatch('italicsAndBold.after', text, options, globals);\n return text;\n});\n","/**\n * Form HTML ordered (numbered) and unordered (bulleted) lists.\n */\nshowdown.subParser('lists', function (text, options, globals) {\n 'use strict';\n\n /**\n * Process the contents of a single ordered or unordered list, splitting it\n * into individual list items.\n * @param {string} listStr\n * @param {boolean} trimTrailing\n * @returns {string}\n */\n function processListItems (listStr, trimTrailing) {\n // The $g_list_level global keeps track of when we're inside a list.\n // Each time we enter a list, we increment it; when we leave a list,\n // we decrement. If it's zero, we're not in a list anymore.\n //\n // We do this because when we're not inside a list, we want to treat\n // something like this:\n //\n // I recommend upgrading to version\n // 8. Oops, now this line is treated\n // as a sub-list.\n //\n // As a single paragraph, despite the fact that the second line starts\n // with a digit-period-space sequence.\n //\n // Whereas when we're inside a list (or sub-list), that line will be\n // treated as the start of a sub-list. What a kludge, huh? This is\n // an aspect of Markdown's syntax that's hard to parse perfectly\n // without resorting to mind-reading. Perhaps the solution is to\n // change the syntax rules such that sub-lists must start with a\n // starting cardinal number; e.g. \"1.\" or \"a.\".\n globals.gListLevel++;\n\n // trim trailing blank lines:\n listStr = listStr.replace(/\\n{2,}$/, '\\n');\n\n // attacklab: add sentinel to emulate \\z\n listStr += '¨0';\n\n var rgx = /(\\n)?(^ {0,3})([*+-]|\\d+[.])[ \\t]+((\\[(x|X| )?])?[ \\t]*[^\\r]+?(\\n{1,2}))(?=\\n*(¨0| {0,3}([*+-]|\\d+[.])[ \\t]+))/gm,\n isParagraphed = (/\\n[ \\t]*\\n(?!¨0)/.test(listStr));\n\n // Since version 1.5, nesting sublists requires 4 spaces (or 1 tab) indentation,\n // which is a syntax breaking change\n // activating this option reverts to old behavior\n if (options.disableForced4SpacesIndentedSublists) {\n rgx = /(\\n)?(^ {0,3})([*+-]|\\d+[.])[ \\t]+((\\[(x|X| )?])?[ \\t]*[^\\r]+?(\\n{1,2}))(?=\\n*(¨0|\\2([*+-]|\\d+[.])[ \\t]+))/gm;\n }\n\n listStr = listStr.replace(rgx, function (wholeMatch, m1, m2, m3, m4, taskbtn, checked) {\n checked = (checked && checked.trim() !== '');\n\n var item = showdown.subParser('outdent')(m4, options, globals),\n bulletStyle = '';\n\n // Support for github tasklists\n if (taskbtn && options.tasklists) {\n bulletStyle = ' class=\"task-list-item\" style=\"list-style-type: none;\"';\n item = item.replace(/^[ \\t]*\\[(x|X| )?]/m, function () {\n var otp = '
  • a
  • \n // instead of:\n //
    • - - a
    \n // So, to prevent it, we will put a marker (¨A)in the beginning of the line\n // Kind of hackish/monkey patching, but seems more effective than overcomplicating the list parser\n item = item.replace(/^([-*+]|\\d\\.)[ \\t]+[\\S\\n ]*/g, function (wm2) {\n return '¨A' + wm2;\n });\n\n // m1 - Leading line or\n // Has a double return (multi paragraph) or\n // Has sublist\n if (m1 || (item.search(/\\n{2,}/) > -1)) {\n item = showdown.subParser('githubCodeBlocks')(item, options, globals);\n item = showdown.subParser('blockGamut')(item, options, globals);\n } else {\n // Recursion for sub-lists:\n item = showdown.subParser('lists')(item, options, globals);\n item = item.replace(/\\n$/, ''); // chomp(item)\n item = showdown.subParser('hashHTMLBlocks')(item, options, globals);\n\n // Colapse double linebreaks\n item = item.replace(/\\n\\n+/g, '\\n\\n');\n if (isParagraphed) {\n item = showdown.subParser('paragraphs')(item, options, globals);\n } else {\n item = showdown.subParser('spanGamut')(item, options, globals);\n }\n }\n\n // now we need to remove the marker (¨A)\n item = item.replace('¨A', '');\n // we can finally wrap the line in list item tags\n item = '' + item + '\\n';\n\n return item;\n });\n\n // attacklab: strip sentinel\n listStr = listStr.replace(/¨0/g, '');\n\n globals.gListLevel--;\n\n if (trimTrailing) {\n listStr = listStr.replace(/\\s+$/, '');\n }\n\n return listStr;\n }\n\n function styleStartNumber (list, listType) {\n // check if ol and starts by a number different than 1\n if (listType === 'ol') {\n var res = list.match(/^ *(\\d+)\\./);\n if (res && res[1] !== '1') {\n return ' start=\"' + res[1] + '\"';\n }\n }\n return '';\n }\n\n /**\n * Check and parse consecutive lists (better fix for issue #142)\n * @param {string} list\n * @param {string} listType\n * @param {boolean} trimTrailing\n * @returns {string}\n */\n function parseConsecutiveLists (list, listType, trimTrailing) {\n // check if we caught 2 or more consecutive lists by mistake\n // we use the counterRgx, meaning if listType is UL we look for OL and vice versa\n var olRgx = (options.disableForced4SpacesIndentedSublists) ? /^ ?\\d+\\.[ \\t]/gm : /^ {0,3}\\d+\\.[ \\t]/gm,\n ulRgx = (options.disableForced4SpacesIndentedSublists) ? /^ ?[*+-][ \\t]/gm : /^ {0,3}[*+-][ \\t]/gm,\n counterRxg = (listType === 'ul') ? olRgx : ulRgx,\n result = '';\n\n if (list.search(counterRxg) !== -1) {\n (function parseCL (txt) {\n var pos = txt.search(counterRxg),\n style = styleStartNumber(list, listType);\n if (pos !== -1) {\n // slice\n result += '\\n\\n<' + listType + style + '>\\n' + processListItems(txt.slice(0, pos), !!trimTrailing) + '\\n';\n\n // invert counterType and listType\n listType = (listType === 'ul') ? 'ol' : 'ul';\n counterRxg = (listType === 'ul') ? olRgx : ulRgx;\n\n //recurse\n parseCL(txt.slice(pos));\n } else {\n result += '\\n\\n<' + listType + style + '>\\n' + processListItems(txt, !!trimTrailing) + '\\n';\n }\n })(list);\n } else {\n var style = styleStartNumber(list, listType);\n result = '\\n\\n<' + listType + style + '>\\n' + processListItems(list, !!trimTrailing) + '\\n';\n }\n\n return result;\n }\n\n /** Start of list parsing **/\n text = globals.converter._dispatch('lists.before', text, options, globals);\n // add sentinel to hack around khtml/safari bug:\n // http://bugs.webkit.org/show_bug.cgi?id=11231\n text += '¨0';\n\n if (globals.gListLevel) {\n text = text.replace(/^(( {0,3}([*+-]|\\d+[.])[ \\t]+)[^\\r]+?(¨0|\\n{2,}(?=\\S)(?![ \\t]*(?:[*+-]|\\d+[.])[ \\t]+)))/gm,\n function (wholeMatch, list, m2) {\n var listType = (m2.search(/[*+-]/g) > -1) ? 'ul' : 'ol';\n return parseConsecutiveLists(list, listType, true);\n }\n );\n } else {\n text = text.replace(/(\\n\\n|^\\n?)(( {0,3}([*+-]|\\d+[.])[ \\t]+)[^\\r]+?(¨0|\\n{2,}(?=\\S)(?![ \\t]*(?:[*+-]|\\d+[.])[ \\t]+)))/gm,\n function (wholeMatch, m1, list, m3) {\n var listType = (m3.search(/[*+-]/g) > -1) ? 'ul' : 'ol';\n return parseConsecutiveLists(list, listType, false);\n }\n );\n }\n\n // strip sentinel\n text = text.replace(/¨0/, '');\n text = globals.converter._dispatch('lists.after', text, options, globals);\n return text;\n});\n","/**\n * Parse metadata at the top of the document\n */\nshowdown.subParser('metadata', function (text, options, globals) {\n 'use strict';\n\n if (!options.metadata) {\n return text;\n }\n\n text = globals.converter._dispatch('metadata.before', text, options, globals);\n\n function parseMetadataContents (content) {\n // raw is raw so it's not changed in any way\n globals.metadata.raw = content;\n\n // escape chars forbidden in html attributes\n // double quotes\n content = content\n // ampersand first\n .replace(/&/g, '&')\n // double quotes\n .replace(/\"/g, '"');\n\n content = content.replace(/\\n {4}/g, ' ');\n content.replace(/^([\\S ]+): +([\\s\\S]+?)$/gm, function (wm, key, value) {\n globals.metadata.parsed[key] = value;\n return '';\n });\n }\n\n text = text.replace(/^\\s*«««+(\\S*?)\\n([\\s\\S]+?)\\n»»»+\\n/, function (wholematch, format, content) {\n parseMetadataContents(content);\n return '¨M';\n });\n\n text = text.replace(/^\\s*---+(\\S*?)\\n([\\s\\S]+?)\\n---+\\n/, function (wholematch, format, content) {\n if (format) {\n globals.metadata.format = format;\n }\n parseMetadataContents(content);\n return '¨M';\n });\n\n text = text.replace(/¨M/g, '');\n\n text = globals.converter._dispatch('metadata.after', text, options, globals);\n return text;\n});\n","/**\n * Remove one level of line-leading tabs or spaces\n */\nshowdown.subParser('outdent', function (text, options, globals) {\n 'use strict';\n text = globals.converter._dispatch('outdent.before', text, options, globals);\n\n // attacklab: hack around Konqueror 3.5.4 bug:\n // \"----------bug\".replace(/^-/g,\"\") == \"bug\"\n text = text.replace(/^(\\t|[ ]{1,4})/gm, '¨0'); // attacklab: g_tab_width\n\n // attacklab: clean up hack\n text = text.replace(/¨0/g, '');\n\n text = globals.converter._dispatch('outdent.after', text, options, globals);\n return text;\n});\n","/**\n *\n */\nshowdown.subParser('paragraphs', function (text, options, globals) {\n 'use strict';\n\n text = globals.converter._dispatch('paragraphs.before', text, options, globals);\n // Strip leading and trailing lines:\n text = text.replace(/^\\n+/g, '');\n text = text.replace(/\\n+$/g, '');\n\n var grafs = text.split(/\\n{2,}/g),\n grafsOut = [],\n end = grafs.length; // Wrap

    tags\n\n for (var i = 0; i < end; i++) {\n var str = grafs[i];\n // if this is an HTML marker, copy it\n if (str.search(/¨(K|G)(\\d+)\\1/g) >= 0) {\n grafsOut.push(str);\n\n // test for presence of characters to prevent empty lines being parsed\n // as paragraphs (resulting in undesired extra empty paragraphs)\n } else if (str.search(/\\S/) >= 0) {\n str = showdown.subParser('spanGamut')(str, options, globals);\n str = str.replace(/^([ \\t]*)/g, '

    ');\n str += '

    ';\n grafsOut.push(str);\n }\n }\n\n /** Unhashify HTML blocks */\n end = grafsOut.length;\n for (i = 0; i < end; i++) {\n var blockText = '',\n grafsOutIt = grafsOut[i],\n codeFlag = false;\n // if this is a marker for an html block...\n // use RegExp.test instead of string.search because of QML bug\n while (/¨(K|G)(\\d+)\\1/.test(grafsOutIt)) {\n var delim = RegExp.$1,\n num = RegExp.$2;\n\n if (delim === 'K') {\n blockText = globals.gHtmlBlocks[num];\n } else {\n // we need to check if ghBlock is a false positive\n if (codeFlag) {\n // use encoded version of all text\n blockText = showdown.subParser('encodeCode')(globals.ghCodeBlocks[num].text, options, globals);\n } else {\n blockText = globals.ghCodeBlocks[num].codeblock;\n }\n }\n blockText = blockText.replace(/\\$/g, '$$$$'); // Escape any dollar signs\n\n grafsOutIt = grafsOutIt.replace(/(\\n\\n)?¨(K|G)\\d+\\2(\\n\\n)?/, blockText);\n // Check if grafsOutIt is a pre->code\n if (/^]*>\\s*]*>/.test(grafsOutIt)) {\n codeFlag = true;\n }\n }\n grafsOut[i] = grafsOutIt;\n }\n text = grafsOut.join('\\n');\n // Strip leading and trailing lines:\n text = text.replace(/^\\n+/g, '');\n text = text.replace(/\\n+$/g, '');\n return globals.converter._dispatch('paragraphs.after', text, options, globals);\n});\n","/**\n * Run extension\n */\nshowdown.subParser('runExtension', function (ext, text, options, globals) {\n 'use strict';\n\n if (ext.filter) {\n text = ext.filter(text, globals.converter, options);\n\n } else if (ext.regex) {\n // TODO remove this when old extension loading mechanism is deprecated\n var re = ext.regex;\n if (!(re instanceof RegExp)) {\n re = new RegExp(re, 'g');\n }\n text = text.replace(re, ext.replace);\n }\n\n return text;\n});\n","/**\n * These are all the transformations that occur *within* block-level\n * tags like paragraphs, headers, and list items.\n */\nshowdown.subParser('spanGamut', function (text, options, globals) {\n 'use strict';\n\n text = globals.converter._dispatch('spanGamut.before', text, options, globals);\n text = showdown.subParser('codeSpans')(text, options, globals);\n text = showdown.subParser('escapeSpecialCharsWithinTagAttributes')(text, options, globals);\n text = showdown.subParser('encodeBackslashEscapes')(text, options, globals);\n\n // Process anchor and image tags. Images must come first,\n // because ![foo][f] looks like an anchor.\n text = showdown.subParser('images')(text, options, globals);\n text = showdown.subParser('anchors')(text, options, globals);\n\n // Make links out of things like ``\n // Must come after anchors, because you can use < and >\n // delimiters in inline links like [this]().\n text = showdown.subParser('autoLinks')(text, options, globals);\n text = showdown.subParser('simplifiedAutoLinks')(text, options, globals);\n text = showdown.subParser('emoji')(text, options, globals);\n text = showdown.subParser('underline')(text, options, globals);\n text = showdown.subParser('italicsAndBold')(text, options, globals);\n text = showdown.subParser('strikethrough')(text, options, globals);\n text = showdown.subParser('ellipsis')(text, options, globals);\n\n // we need to hash HTML tags inside spans\n text = showdown.subParser('hashHTMLSpans')(text, options, globals);\n\n // now we encode amps and angles\n text = showdown.subParser('encodeAmpsAndAngles')(text, options, globals);\n\n // Do hard breaks\n if (options.simpleLineBreaks) {\n // GFM style hard breaks\n // only add line breaks if the text does not contain a block (special case for lists)\n if (!/\\n\\n¨K/.test(text)) {\n text = text.replace(/\\n+/g, '
    \\n');\n }\n } else {\n // Vanilla hard breaks\n text = text.replace(/ +\\n/g, '
    \\n');\n }\n\n text = globals.converter._dispatch('spanGamut.after', text, options, globals);\n return text;\n});\n","showdown.subParser('strikethrough', function (text, options, globals) {\n 'use strict';\n\n function parseInside (txt) {\n if (options.simplifiedAutoLink) {\n txt = showdown.subParser('simplifiedAutoLinks')(txt, options, globals);\n }\n return '' + txt + '';\n }\n\n if (options.strikethrough) {\n text = globals.converter._dispatch('strikethrough.before', text, options, globals);\n text = text.replace(/(?:~){2}([\\s\\S]+?)(?:~){2}/g, function (wm, txt) { return parseInside(txt); });\n text = globals.converter._dispatch('strikethrough.after', text, options, globals);\n }\n\n return text;\n});\n","/**\n * Strips link definitions from text, stores the URLs and titles in\n * hash references.\n * Link defs are in the form: ^[id]: url \"optional title\"\n */\nshowdown.subParser('stripLinkDefinitions', function (text, options, globals) {\n 'use strict';\n\n var regex = /^ {0,3}\\[(.+)]:[ \\t]*\\n?[ \\t]*\\s]+)>?(?: =([*\\d]+[A-Za-z%]{0,4})x([*\\d]+[A-Za-z%]{0,4}))?[ \\t]*\\n?[ \\t]*(?:(\\n*)[\"|'(](.+?)[\"|')][ \\t]*)?(?:\\n+|(?=¨0))/gm,\n base64Regex = /^ {0,3}\\[(.+)]:[ \\t]*\\n?[ \\t]*?(?: =([*\\d]+[A-Za-z%]{0,4})x([*\\d]+[A-Za-z%]{0,4}))?[ \\t]*\\n?[ \\t]*(?:(\\n*)[\"|'(](.+?)[\"|')][ \\t]*)?(?:\\n\\n|(?=¨0)|(?=\\n\\[))/gm;\n\n // attacklab: sentinel workarounds for lack of \\A and \\Z, safari\\khtml bug\n text += '¨0';\n\n var replaceFunc = function (wholeMatch, linkId, url, width, height, blankLines, title) {\n linkId = linkId.toLowerCase();\n if (url.match(/^data:.+?\\/.+?;base64,/)) {\n // remove newlines\n globals.gUrls[linkId] = url.replace(/\\s/g, '');\n } else {\n globals.gUrls[linkId] = showdown.subParser('encodeAmpsAndAngles')(url, options, globals); // Link IDs are case-insensitive\n }\n\n if (blankLines) {\n // Oops, found blank lines, so it's not a title.\n // Put back the parenthetical statement we stole.\n return blankLines + title;\n\n } else {\n if (title) {\n globals.gTitles[linkId] = title.replace(/\"|'/g, '"');\n }\n if (options.parseImgDimensions && width && height) {\n globals.gDimensions[linkId] = {\n width: width,\n height: height\n };\n }\n }\n // Completely remove the definition from the text\n return '';\n };\n\n // first we try to find base64 link references\n text = text.replace(base64Regex, replaceFunc);\n\n text = text.replace(regex, replaceFunc);\n\n // attacklab: strip sentinel\n text = text.replace(/¨0/, '');\n\n return text;\n});\n","showdown.subParser('tables', function (text, options, globals) {\n 'use strict';\n\n if (!options.tables) {\n return text;\n }\n\n var tableRgx = /^ {0,3}\\|?.+\\|.+\\n {0,3}\\|?[ \\t]*:?[ \\t]*(?:[-=]){2,}[ \\t]*:?[ \\t]*\\|[ \\t]*:?[ \\t]*(?:[-=]){2,}[\\s\\S]+?(?:\\n\\n|¨0)/gm,\n //singeColTblRgx = /^ {0,3}\\|.+\\|\\n {0,3}\\|[ \\t]*:?[ \\t]*(?:[-=]){2,}[ \\t]*:?[ \\t]*\\|[ \\t]*\\n(?: {0,3}\\|.+\\|\\n)+(?:\\n\\n|¨0)/gm;\n singeColTblRgx = /^ {0,3}\\|.+\\|[ \\t]*\\n {0,3}\\|[ \\t]*:?[ \\t]*(?:[-=]){2,}[ \\t]*:?[ \\t]*\\|[ \\t]*\\n( {0,3}\\|.+\\|[ \\t]*\\n)*(?:\\n|¨0)/gm;\n\n function parseStyles (sLine) {\n if (/^:[ \\t]*--*$/.test(sLine)) {\n return ' style=\"text-align:left;\"';\n } else if (/^--*[ \\t]*:[ \\t]*$/.test(sLine)) {\n return ' style=\"text-align:right;\"';\n } else if (/^:[ \\t]*--*[ \\t]*:$/.test(sLine)) {\n return ' style=\"text-align:center;\"';\n } else {\n return '';\n }\n }\n\n function parseHeaders (header, style) {\n var id = '';\n header = header.trim();\n // support both tablesHeaderId and tableHeaderId due to error in documentation so we don't break backwards compatibility\n if (options.tablesHeaderId || options.tableHeaderId) {\n id = ' id=\"' + header.replace(/ /g, '_').toLowerCase() + '\"';\n }\n header = showdown.subParser('spanGamut')(header, options, globals);\n\n return '' + header + '\\n';\n }\n\n function parseCells (cell, style) {\n var subText = showdown.subParser('spanGamut')(cell, options, globals);\n return '' + subText + '\\n';\n }\n\n function buildTable (headers, cells) {\n var tb = '\\n\\n\\n',\n tblLgn = headers.length;\n\n for (var i = 0; i < tblLgn; ++i) {\n tb += headers[i];\n }\n tb += '\\n\\n\\n';\n\n for (i = 0; i < cells.length; ++i) {\n tb += '\\n';\n for (var ii = 0; ii < tblLgn; ++ii) {\n tb += cells[i][ii];\n }\n tb += '\\n';\n }\n tb += '\\n
    \\n';\n return tb;\n }\n\n function parseTable (rawTable) {\n var i, tableLines = rawTable.split('\\n');\n\n for (i = 0; i < tableLines.length; ++i) {\n // strip wrong first and last column if wrapped tables are used\n if (/^ {0,3}\\|/.test(tableLines[i])) {\n tableLines[i] = tableLines[i].replace(/^ {0,3}\\|/, '');\n }\n if (/\\|[ \\t]*$/.test(tableLines[i])) {\n tableLines[i] = tableLines[i].replace(/\\|[ \\t]*$/, '');\n }\n // parse code spans first, but we only support one line code spans\n tableLines[i] = showdown.subParser('codeSpans')(tableLines[i], options, globals);\n }\n\n var rawHeaders = tableLines[0].split('|').map(function (s) { return s.trim();}),\n rawStyles = tableLines[1].split('|').map(function (s) { return s.trim();}),\n rawCells = [],\n headers = [],\n styles = [],\n cells = [];\n\n tableLines.shift();\n tableLines.shift();\n\n for (i = 0; i < tableLines.length; ++i) {\n if (tableLines[i].trim() === '') {\n continue;\n }\n rawCells.push(\n tableLines[i]\n .split('|')\n .map(function (s) {\n return s.trim();\n })\n );\n }\n\n if (rawHeaders.length < rawStyles.length) {\n return rawTable;\n }\n\n for (i = 0; i < rawStyles.length; ++i) {\n styles.push(parseStyles(rawStyles[i]));\n }\n\n for (i = 0; i < rawHeaders.length; ++i) {\n if (showdown.helper.isUndefined(styles[i])) {\n styles[i] = '';\n }\n headers.push(parseHeaders(rawHeaders[i], styles[i]));\n }\n\n for (i = 0; i < rawCells.length; ++i) {\n var row = [];\n for (var ii = 0; ii < headers.length; ++ii) {\n if (showdown.helper.isUndefined(rawCells[i][ii])) {\n\n }\n row.push(parseCells(rawCells[i][ii], styles[ii]));\n }\n cells.push(row);\n }\n\n return buildTable(headers, cells);\n }\n\n text = globals.converter._dispatch('tables.before', text, options, globals);\n\n // find escaped pipe characters\n text = text.replace(/\\\\(\\|)/g, showdown.helper.escapeCharactersCallback);\n\n // parse multi column tables\n text = text.replace(tableRgx, parseTable);\n\n // parse one column tables\n text = text.replace(singeColTblRgx, parseTable);\n\n text = globals.converter._dispatch('tables.after', text, options, globals);\n\n return text;\n});\n","showdown.subParser('underline', function (text, options, globals) {\n 'use strict';\n\n if (!options.underline) {\n return text;\n }\n\n text = globals.converter._dispatch('underline.before', text, options, globals);\n\n if (options.literalMidWordUnderscores) {\n text = text.replace(/\\b_?__(\\S[\\s\\S]*)___?\\b/g, function (wm, txt) {\n return '' + txt + '';\n });\n } else {\n text = text.replace(/_?__(\\S[\\s\\S]*?)___?/g, function (wm, m) {\n return (/\\S$/.test(m)) ? '' + m + '' : wm;\n });\n }\n\n // escape remaining underscores to prevent them being parsed by italic and bold\n text = text.replace(/(_)/g, showdown.helper.escapeCharactersCallback);\n\n text = globals.converter._dispatch('underline.after', text, options, globals);\n\n return text;\n});\n","/**\n * Swap back in all the special characters we've hidden.\n */\nshowdown.subParser('unescapeSpecialChars', function (text, options, globals) {\n 'use strict';\n text = globals.converter._dispatch('unescapeSpecialChars.before', text, options, globals);\n\n text = text.replace(/¨E(\\d+)E/g, function (wholeMatch, m1) {\n var charCodeToReplace = parseInt(m1);\n return String.fromCharCode(charCodeToReplace);\n });\n\n text = globals.converter._dispatch('unescapeSpecialChars.after', text, options, globals);\n return text;\n});\n","var root = this;\n\n// AMD Loader\nif (typeof define === 'function' && define.amd) {\n define(function () {\n 'use strict';\n return showdown;\n });\n\n// CommonJS/nodeJS Loader\n} else if (typeof module !== 'undefined' && module.exports) {\n module.exports = showdown;\n\n// Regular Browser loader\n} else {\n root.showdown = showdown;\n}\n"]} \ No newline at end of file diff --git a/cvat/apps/documentation/templates/documentation/base_page.html b/cvat/apps/documentation/templates/documentation/base_page.html deleted file mode 100644 index f49fe5f1002..00000000000 --- a/cvat/apps/documentation/templates/documentation/base_page.html +++ /dev/null @@ -1,34 +0,0 @@ - - -{% load static compress %} - - - {% block title %} {% endblock %} - {% compress js file thirdparty %} - - - {% endcompress %} - - - - - - diff --git a/cvat/apps/documentation/templates/documentation/user_guide.html b/cvat/apps/documentation/templates/documentation/user_guide.html deleted file mode 100644 index fa1b6221d57..00000000000 --- a/cvat/apps/documentation/templates/documentation/user_guide.html +++ /dev/null @@ -1,14 +0,0 @@ - -{% extends 'documentation/base_page.html' %} - -{% block title %} -CVAT User Guide -{% endblock %} - -{% block content %} -{{ user_guide }} -{% endblock %} diff --git a/cvat/apps/documentation/templates/documentation/xml_format.html b/cvat/apps/documentation/templates/documentation/xml_format.html deleted file mode 100644 index ff871aba956..00000000000 --- a/cvat/apps/documentation/templates/documentation/xml_format.html +++ /dev/null @@ -1,8 +0,0 @@ - -{% extends 'documentation/base_page.html' %} -{% block title %} CVAT XML format {% endblock %} -{% block content %} {{ xml_format }} {% endblock %} diff --git a/cvat/apps/documentation/urls.py b/cvat/apps/documentation/urls.py deleted file mode 100644 index a0f132c4881..00000000000 --- a/cvat/apps/documentation/urls.py +++ /dev/null @@ -1,13 +0,0 @@ - -# Copyright (C) 2018 Intel Corporation -# -# SPDX-License-Identifier: MIT - -from django.urls import path -from . import views - -urlpatterns = [ - path('user_guide.html', views.UserGuideView), - path('xml_format.html', views.XmlFormatView), -] - diff --git a/cvat/apps/documentation/user_guide.md b/cvat/apps/documentation/user_guide.md deleted file mode 100644 index 9406756d2f6..00000000000 --- a/cvat/apps/documentation/user_guide.md +++ /dev/null @@ -1,1823 +0,0 @@ -- [User's guide](#users-guide) - - [Getting started](#getting-started) - - [Authorization](#authorization) - - [Administration panel](#administration-panel) - - [Creating an annotation task](#creating-an-annotation-task) - - [Projects](#projects) - - [Models](#models) - - [Search](#search) - - [Interface of the annotation tool](#interface-of-the-annotation-tool) - - [Basic navigation](#basic-navigation) - - [Types of shapes (basics)](#types-of-shapes-basics) - - [Shape mode (basics)](#shape-mode-basics) - - [Track mode (basics)](#track-mode-basics) - - [Attribute annotation mode (basics)](#attribute-annotation-mode-basics) - - [Downloading annotations](#downloading-annotations) - - [Task synchronization with a repository](#task-synchronization-with-a-repository) - - [Vocabulary](#vocabulary) - - [Workspace](#workspace) - - [Settings](#settings) - - [Top Panel](#top-panel) - - [Controls sidebar](#controls-sidebar) - - [Objects sidebar](#objects-sidebar) - - [Objects](#objects) - - [Labels](#labels) - - [Shape mode (advanced)](#shape-mode-advanced) - - [Track mode (advanced)](#track-mode-advanced) - - [Attribute annotation mode (advanced)](#attribute-annotation-mode-advanced) - - [AI Tools](#ai-tools) - - [OpenCV Tools](#opencv-tools) - - [Annotation with rectangle by 4 points](#annotation-with-rectangle-by-4-points) - - [Annotation with polygons](#annotation-with-polygons) - - [Creating masks](#creating-masks) - - [Annotation with polylines](#annotation-with-polylines) - - [Annotation with points](#annotation-with-points) - - [Points in shape mode](#points-in-shape-mode) - - [Linear interpolation with one point](#linear-interpolation-with-one-point) - - [Annotation with cuboids](#annotation-with-cuboids) - - [Annotation with tags](#annotation-with-tags) - - [Track mode with polygons](#track-mode-with-polygons) - - [Review](#review) - - [Automatic annotation](#automatic-annotation) - - [Shape grouping](#shape-grouping) - - [Filter](#filter) - - [Analytics](#analytics) - - [Shortcuts](#shortcuts) - -# User's guide - -Computer Vision Annotation Tool (CVAT) is a web-based tool which helps to -annotate videos and images for Computer Vision algorithms. It was inspired -by [Vatic](http://carlvondrick.com/vatic/) free, online, interactive video -annotation tool. CVAT has many powerful features: _interpolation of bounding -boxes between key frames, automatic annotation using deep learning models, -shortcuts for most of critical actions, dashboard with a list of annotation -tasks, LDAP and basic authorization, etc..._ It was created for and used by -a professional data annotation team. UX and UI were optimized especially for -computer vision tasks developed by our team. - -## Getting started - -### Authorization - -- First of all, you have to log in to CVAT tool. - - ![](static/documentation/images/image001.jpg) - -- For register a new user press "Create an account" - - ![](static/documentation/images/image002.jpg) - -- You can register a user but by default it will not have rights even to view - list of tasks. Thus you should create a superuser. The superuser can use - [Django administration panel](http://localhost:8080/admin) to assign correct - groups to the user. Please use the command below to create an admin account: - - `docker exec -it cvat bash -ic 'python3 ~/manage.py createsuperuser'` - -- If you want to create a non-admin account, you can do that using the link below - on the login page. Don't forget to modify permissions for the new user in the - administration panel. There are several groups (aka roles): admin, user, - annotator, observer. - - ![](static/documentation/images/image003.jpg) - -### Administration panel - -Go to the [Django administration panel](http://localhost:8080/admin). There you can: - -- Create / edit / delete users -- Control permissions of users and access to the tool. - - ![](static/documentation/images/image115.jpg) - -### Creating an annotation task - -1. Create an annotation task pressing `Create new task` button on the tasks page or on the project page. - ![](static/documentation/images/image004.jpg) - -1. Specify parameters of the task: - - #### Basic configuration - - **Name** The name of the task to be created. - - ![](static/documentation/images/image005.jpg) - - **Projects** The project that this task will be related with. - - ![](static/documentation/images/image193.jpg) - - **Labels**. There are two ways of working with labels (available only if the task is not related to the project): - - - The `Constructor` is a simple way to add and adjust labels. To add a new label click the `Add label` button. - ![](static/documentation/images/image123.jpg) - - You can set a name of the label in the `Label name` field and choose a color for each label. - - ![](static/documentation/images/image124.jpg) - - If necessary you can add an attribute and set its properties by clicking `Add an attribute`: - - ![](static/documentation/images/image125.jpg) - - The following actions are available here: - - 1. Set the attribute’s name. - 1. Choose the way to display the attribute: - - Select — drop down list of value - - Radio — is used when it is necessary to choose just one option out of few suggested. - - Checkbox — is used when it is necessary to choose any number of options out of suggested. - - Text — is used when an attribute is entered as a text. - - Number — is used when an attribute is entered as a number. - 1. Set values for the attribute. The values could be separated by pressing `Enter`. - The entered value is displayed as a separate element which could be deleted - by pressing `Backspace` or clicking the close button (x). - If the specified way of displaying the attribute is Text or Number, - the entered value will be displayed as text by default (e.g. you can specify the text format). - 1. Checkbox `Mutable` determines if an attribute would be changed frame to frame. - 1. You can delete the attribute by clicking the close button (x). - - Click the `Continue` button to add more labels. - If you need to cancel adding a label - press the `Cancel` button. - After all the necessary labels are added click the `Done` button. - After clicking `Done` the added labels would be displayed as separate elements of different colour. - You can edit or delete labels by clicking `Update attributes` or `Delete label`. - - - The `Raw` is a way of working with labels for an advanced user. - Raw presents label data in _json_ format with an option of editing and copying labels as a text. - The `Done` button applies the changes and the `Reset` button cancels the changes. - ![](static/documentation/images/image126.jpg) - - In `Raw` and `Constructor` mode, you can press the `Copy` button to copy the list of labels. - - **Select files**. Press tab `My computer` to choose some files for annotation from your PC. - If you select tab `Connected file share` you can choose files for annotation from your network. - If you select ` Remote source` , you'll see a field where you can enter a list of URLs (one URL per line). - If you upload a video or dataset with images and select `Use cache` option, you can attach a `manifest.jsonl` file. - You can find how to prepare it [here](/utils/dataset_manifest/README.md). - - ![](static/documentation/images/image127.jpg) - - #### Advanced configuration - - ![](static/documentation/images/image128_use_cache.jpg) - - **Use zip chunks**. Force to use zip chunks as compressed data. Actual for videos only. - - **Use cache**. Defines how to work with data. Select the checkbox to switch to the "on-the-fly data processing", - which will reduce the task creation time (by preparing chunks when requests are received) - and store data in a cache of limited size with a policy of evicting less popular items. - See more [here](/cvat/apps/documentation/data_on_fly.md). - - **Image Quality**. Use this option to specify quality of uploaded images. - The option helps to load high resolution datasets faster. - Use the value from `5` (almost completely compressed images) to `100` (not compressed images). - - **Overlap Size**. Use this option to make overlapped segments. - The option makes tracks continuous from one segment into another. - Use it for interpolation mode. There are several options for using the parameter: - - - For an interpolation task (video sequence). - If you annotate a bounding box on two adjacent segments they will be merged into one bounding box. - If overlap equals to zero or annotation is poor on adjacent segments inside a dumped annotation file, - you will have several tracks, one for each segment, which corresponds to the object. - - For an annotation task (independent images). - If an object exists on overlapped segments, the overlap is greater than zero - and the annotation is good enough on adjacent segments, it will be automatically merged into one object. - If overlap equals to zero or annotation is poor on adjacent segments inside a dumped annotation file, - you will have several bounding boxes for the same object. - Thus, you annotate an object on the first segment. - You annotate the same object on second segment, and if you do it right, you - will have one track inside the annotations. - If annotations on different segments (on overlapped frames) - are very different, you will have two shapes for the same object. - This functionality works only for bounding boxes. - Polygons, polylines, points don't support automatic merge on overlapped segments - even the overlap parameter isn't zero and match between corresponding shapes on adjacent segments is perfect. - - **Segment size**. Use this option to divide a huge dataset into a few smaller segments. - For example, one job cannot be annotated by several labelers (it isn't supported). - Thus using "segment size" you can create several jobs for the same annotation task. - It will help you to parallel data annotation process. - - **Start frame**. Frame from which video in task begins. - - **Stop frame**. Frame on which video in task ends. - - **Frame Step**. Use this option to filter video frames. - For example, enter `25` to leave every twenty fifth frame in the video or every twenty fifth image. - - **Chunk size**. Defines a number of frames to be packed in a chunk when send from client to server. - Server defines automatically if empty. - - Recommended values: - - - 1080p or less: 36 - - 2k or less: 8 - 16 - - 4k or less: 4 - 8 - - More: 1 - 4 - - **Dataset Repository**. URL link of the repository optionally specifies the path to the repository for storage - (`default: annotation / .zip`). - The .zip and .xml file extension of annotation are supported. - Field format: `URL [PATH]` example: `https://github.com/project/repos.git [1/2/3/4/annotation.xml]` - - Supported URL formats : - - - `https://github.com/project/repos[.git]` - - `github.com/project/repos[.git]` - - `git@github.com:project/repos[.git]` - - The task will be highlighted in red after creation if annotation isn't synchronized with the repository. - - **Use LFS**. If the annotation file is large, you can create a repository with - [LFS](https://git-lfs.github.com/) support. - - **Issue tracker**. Specify full issue tracker's URL if it's necessary. - - Push `Submit` button and it will be added into the list of annotation tasks. - Then, the created task will be displayed on a tasks page: - - ![](static/documentation/images/image006_detrac.jpg) - -1. The tasks page contains elements and each of them relates to a separate task. They are sorted in creation order. - Each element contains: task name, preview, progress bar, button `Open`, and menu `Actions`. - Each button is responsible for a in menu `Actions` specific function: - - - `Dump Annotation` and `Export as a dataset` — download annotations or - annotations and images in a specific format. The following formats are available: - - [CVAT for video](/cvat/apps/documentation/xml_format.md#interpolation) - is highlighted if a task has the interpolation mode. - - [CVAT for images](/cvat/apps/documentation/xml_format.md#annotation) - is highlighted if a task has the annotation mode. - - [PASCAL VOC](http://host.robots.ox.ac.uk/pascal/VOC/) - - [(VOC) Segmentation mask](http://host.robots.ox.ac.uk/pascal/VOC/) — - archive contains class and instance masks for each frame in the png - format and a text file with the value of each color. - - [YOLO](https://pjreddie.com/darknet/yolo/) - - [COCO](http://cocodataset.org/#format-data) - - [TFRecord](https://www.tensorflow.org/tutorials/load_data/tf_records) - - [MOT](https://motchallenge.net/) - - [LabelMe 3.0](http://labelme.csail.mit.edu/Release3.0/) - - [Datumaro](https://github.com/opencv/cvat/blob/develop/datumaro/) - - `Upload annotation` is available in the same formats as in `Dump annotation`. - - [CVAT](/cvat/apps/documentation/xml_format.md) accepts both video and image sub-formats. - - `Automatic Annotation` — automatic annotation with OpenVINO toolkit. - Presence depends on how you build CVAT instance. - - `Delete` — delete task. - - Push `Open` button to go to task details. - -1. Task details is a task page which contains a preview, a progress bar - and the details of the task (specified when the task was created) and the jobs section. - - ![](static/documentation/images/image131_detrac.jpg) - - - The next actions are available on this page: - 1. Change the task’s title. - 1. Open `Actions` menu. - 1. Change issue tracker or open issue tracker if it is specified. - 1. Change labels (available only if the task is not related to the project). - You can add new labels or add attributes for the existing labels in the Raw mode or the Constructor mode. - By clicking `Copy` you will copy the labels to the clipboard. - 1. Assigned to — is used to assign a task to a person. Start typing an assignee’s name and/or - choose the right person out of the dropdown list. - - `Jobs` — is a list of all jobs for a particular task. Here you can find the next data: - - Jobs name with a hyperlink to it. - - Frames — the frame interval. - - A status of the job. The status is specified by the user in the menu inside the job. - There are three types of status: annotation, validation or completed. - The status of the job is changes the progress bar of the task. - - Started on — start date of this job. - - Duration — is the amount of time the job is being worked. - - Assignee is the user who is working on the job. - You can start typing an assignee’s name and/or choose the right person out of the dropdown list. - - Reviewer – a user assigned to carry out the review, read more in the [review](#review) section. - - `Copy`. By clicking `Copy` you will copy the job list to the clipboard. - The job list contains direct links to jobs. - - You can filter or sort jobs by status, as well as by assigner or reviewer. - -1. Follow a link inside `Jobs` section to start annotation process. - In some cases, you can have several links. It depends on size of your - task and `Overlap Size` and `Segment Size` parameters. To improve - UX, only the first chunk of several frames will be loaded and you will be able - to annotate first images. Other frames will be loaded in background. - - ![](static/documentation/images/image007_detrac.jpg) - -### Projects - -At CVAT, you can create a project containing tasks of the same type. All tasks related to the project will inherit a list of labels. - -To create a project, go to the projects section by clicking on the `Projects` item in the top menu.  -On the projects page, you can see a list of projects, use a search, or create a new project by clicking `Create New Project`. - -![](static/documentation/images/image190.jpg) - -You can change: the name of the project, the list of labels (which will be used for tasks created as parts of this project) and a link to the issue. - -![](static/documentation/images/image191.jpg) - -Once created, the project will appear on the projects page. To open a project, just click on it. - -![](static/documentation/images/image192_mapillary_vistas.jpg) - -Here you can do the following: - -1. Change the project's title. -1. Open the `Actions` menu. -1. Change issue tracker or open issue tracker if it is specified. -1. Change labels. - You can add new labels or add attributes for the existing labels in the Raw mode or the Constructor mode.  - You can also change the color for different labels. By clicking `Copy` you can copy the labels to the clipboard. -1. Assigned to — is used to assign a project to a person. Start typing an assignee's name and/or choose the right person out of the dropdown list. -1. `Tasks` — is a list of all tasks for a particular project. - -You can remove the project and all related tasks through the Action menu. - -### Models - -The Models page contains a list of deep learning (DL) models deployed for semi-automatic and automatic annotation. -To open the Models page, click the Models button on the navigation bar. -The list of models is presented in the form of a table. The parameters indicated for each model are the following: - -- `Framework` the model is based on -- model `Name` -- model `Type`: - - `detector` - used for automatic annotation (available in [detectors](#detectors) and [automatic annotation](#automatic-annotation)) - - `interactor` - used for semi-automatic shape annotation (available in [interactors](#interactors)) - - `tracker` - used for semi-automatic track annotation (available in [trackers](#trackers)) - - `reid` - used to combine individual objects into a track (available in [automatic annotation](#automatic-annotation)) -- `Description` - brief description of the model -- `Labels` - list of the supported labels (only for the models of the `detectors` type) - -![](static/documentation/images/image099.jpg) - -Read how to install your model [here](installation.md#semi-automatic-and-automatic-annotation). - -### Search - -There are several options how to use the search. - -- Search within all fields (owner, assignee, task name, task status, task mode). - To execute enter a search string in search field. -- Search for specific fields. How to perform: - - `owner: admin` - all tasks created by the user who has the substring "admin" in his name - - `assignee: employee` - all tasks which are assigned to a user who has the substring "employee" in his name - - `name: training` - all tasks with the substring "training" in their names - - `mode: annotation` or `mode: interpolation` - all tasks with images or videos. - - `status: annotation` or `status: validation` or `status: completed` - search by status - - `id: 5` - task with id = 5. -- Multiple filters. Filters can be combined (except for the identifier) ​​using the keyword ` AND`: - - `mode: interpolation AND owner: admin` - - `mode: annotation and status: annotation` - -The search is case insensitive. - -![](static/documentation/images/image100_detrac.jpg) - -## Interface of the annotation tool - -The tool consists of: - -- `Header` - pinned header used to navigate CVAT sections and account settings; -- `Top panel` — contains navigation buttons, main functions and menu access; -- `Workspace` — space where images are shown; -- `Controls sidebar` — contains tools for navigating the image, zoom, - creating shapes and editing tracks (merge, split, group) -- `Objects sidebar` — contains label filter, two lists: - objects (on the frame) and labels (of objects on the frame) and appearance settings. - -![](static/documentation/images/image034_detrac.jpg) - -### Basic navigation - -1. Use arrows below to move to the next/previous frame. - Use the scroll bar slider to scroll through frames. - Almost every button has a shortcut. - To get a hint about a shortcut, just move your mouse pointer over an UI element. - - ![](static/documentation/images/image008.jpg) - -1. To navigate the image, use the button on the controls sidebar. - Another way an image can be moved/shifted is by holding the left mouse button inside - an area without annotated objects. - If the `Mouse Wheel` is pressed, then all annotated objects are ignored. Otherwise the - a highlighted bounding box will be moved instead of the image itself. - - ![](static/documentation/images/image136.jpg) - -1. You can use the button on the sidebar controls to zoom on a region of interest. - Use the button `Fit the image` to fit the image in the workspace. - You can also use the mouse wheel to scale the image - (the image will be zoomed relatively to your current cursor position). - - ![](static/documentation/images/image137.jpg) - -### Types of shapes (basics) - -There are five shapes which you can annotate your images with: - -- `Rectangle` or `Bounding box` -- `Polygon` -- `Polyline` -- `Points` -- `Cuboid` -- `Tag` - -And there is how they all look like: - -![](static/documentation/images/image038_detrac.jpg 'Rectangle') ![](static/documentation/images/image033_detrac.jpg 'Polygon') - -![](static/documentation/images/image009_mapillary_vistas.jpg 'Polyline') ![](static/documentation/images/image010_affectnet.jpg 'Points') - -![](static/documentation/images/image015_detrac.jpg 'Cuboid') ![](static/documentation/images/image135.jpg 'Tag') - -`Tag` - has no shape in the workspace, but is displayed in objects sidebar. - -### Shape mode (basics) - -Usage examples: - -- Create new annotations for a set of images. -- Add/modify/delete objects for existing annotations. - -1. You need to select `Rectangle` on the controls sidebar: - - ![](static/documentation/images/image082.jpg) - - Before you start, select the correct ` Label` (should be specified by you when creating the task) - and ` Drawing Method` (by 2 points or by 4 points): - - ![](static/documentation/images/image080.jpg) - -1. Creating a new annotation in `Shape mode`: - - - Create a separate `Rectangle` by clicking on `Shape`. - - ![](static/documentation/images/image081.jpg) - - - Choose the opposite points. Your first rectangle is ready! - - ![](static/documentation/images/image011_detrac.jpg) - - - To learn about creating a rectangle using the by 4 point drawing method, ([read here](#annotation-by-rectangle-4-points)). - - - It is possible to adjust boundaries and location of the rectangle using a mouse. - Rectangle's size is shown in the top right corner , you can check it by clicking on any point of the shape. - You can also undo your actions using `Ctrl+Z` and redo them with `Shift+Ctrl+Z` or `Ctrl+Y`. - -1. You can see the `Object card` in the objects sidebar or open it by right-clicking on the object. - You can change the attributes in the details section. - You can perform basic operations or delete an object by clicking on the action menu button. - - ![](static/documentation/images/image012.jpg) - -1. The following figure is an example of a fully annotated frame with separate shapes. - - ![](static/documentation/images/image013_detrac.jpg) - - Read more in the section [shape mode (advanced)](#shape-mode-advanced). - -### Track mode (basics) - -Usage examples: - -- Create new annotations for a sequence of frames. -- Add/modify/delete objects for existing annotations. -- Edit tracks, merge several rectangles into one track. - -1. Like in the `Shape mode`, you need to select a `Rectangle` on the sidebar, - in the appearing form, select the desired `Label` and the `Drawing method`. - - ![](static/documentation/images/image083.jpg) - -1. Creating a track for an object (look at the selected car as an example): - - - Create a `Rectangle` in `Track mode` by clicking on `Track`. - - ![](static/documentation/images/image014.jpg) - - - In `Track mode` the rectangle will be automatically interpolated on the next frames. - - The cyclist starts moving on frame #2270. Let's mark the frame as a key frame. - You can press `K` for that or click the `star` button (see the screenshot below). - - ![](static/documentation/images/image016.jpg) - - - If the object starts to change its position, you need to modify the rectangle where it happens. - It isn't necessary to change the rectangle on each frame, simply update several keyframes - and the frames between them will be interpolated automatically. - - Let's jump 30 frames forward and adjust the boundaries of the object. See an example below: - - ![](static/documentation/images/image017_detrac.jpg) - - - After that the rectangle of the object will be changed automatically on frames 2270 to 2300: - - ![](static/documentation/images/gif019_detrac.gif) - -1. When the annotated object disappears or becomes too small, you need to - finish the track. You have to choose `Outside Property`, shortcut `O`. - - ![](static/documentation/images/image019.jpg) - -1. If the object isn't visible on a couple of frames and then appears again, - you can use the `Merge` feature to merge several individual tracks - into one. - - ![](static/documentation/images/image020.jpg) - - - Create tracks for moments when the cyclist is visible: - - ![](static/documentation/images/gif001_detrac.gif) - - - Click `Merge` button or press key `M` and click on any rectangle of the first track - and on any rectangle of the second track and so on: - - ![](static/documentation/images/image162_detrac.jpg) - - - Click `Merge` button or press `M` to apply changes. - - ![](static/documentation/images/image020.jpg) - - - The final annotated sequence of frames in `Interpolation` mode can - look like the clip below: - - ![](static/documentation/images/gif003_detrac.gif) - - Read more in the section [track mode (advanced)](#track-mode-advanced). - -### Attribute annotation mode (basics) - -- In this mode you can edit attributes with fast navigation between objects and frames using a keyboard. - Open the drop-down list in the top panel and select Attribute annotation Mode. - - ![](static/documentation/images/image023_affectnet.jpg) - -- In this mode objects panel change to a special panel : - - ![](static/documentation/images/image026.jpg) - -- The active attribute will be red. In this case it is `gender` . Look at the bottom side panel to see all possible - shortcuts for changing the attribute. Press key `2` on your keyboard to assign a value (female) for the attribute - or select from the drop-down list. - - ![](static/documentation/images/image024_affectnet.jpg) - -- Press `Up Arrow`/`Down Arrow` on your keyboard or click the buttons in the UI to go to the next/previous - attribute. In this case, after pressing `Down Arrow` you will be able to edit the `Age` attribute. - - ![](static/documentation/images/image025_affectnet.jpg) - -- Use `Right Arrow`/`Left Arrow` keys to move to the previous/next image with annotation. - -To see all the hot keys available in the attribute annotation mode, press `F2`. -Read more in the section [attribute annotation mode (advanced)](#attribute-annotation-mode-advanced). - -### Downloading annotations - -1. To download the latest annotations, you have to save all changes first. - click the `Save` button. There is a `Ctrl+S` shortcut to save annotations quickly. -1. After that, сlick the `Menu` button. -1. Press the `Dump Annotation` button. - - ![](static/documentation/images/image028.jpg) - -1. Choose format dump annotation file. Dump annotation are available in several formats: - - - [CVAT for video](/cvat/apps/documentation/xml_format.md#interpolation) - is highlighted if a task has the interpolation mode. - - [CVAT for images](/cvat/apps/documentation/xml_format.md#annotation) - is highlighted if a task has the annotation mode. - - ![](static/documentation/images/image029.jpg 'Example XML format') - - - [PASCAL VOC](http://host.robots.ox.ac.uk/pascal/VOC/) - - [(VOC) Segmentation mask](http://host.robots.ox.ac.uk/pascal/VOC/) — - archive contains class and instance masks for each frame in the png - format and a text file with the value of each color. - - [YOLO](https://pjreddie.com/darknet/yolo/) - - [COCO](http://cocodataset.org/#format-data) - - [TFRecord](https://www.tensorflow.org/tutorials/load_data/tf_records) - - [MOT](https://motchallenge.net/) - - [LabelMe 3.0](http://labelme.csail.mit.edu/Release3.0/) - - [Datumaro](https://github.com/opencv/cvat/blob/develop/datumaro/) - -### Task synchronization with a repository - -1. At the end of the annotation process, a task is synchronized by clicking - ` Synchronize` on the task page. Notice: this feature - works only if a git repository was specified when the task was created. - - ![](static/documentation/images/image106.jpg) - -1. After synchronization the button `Sync` is highlighted in green. The - annotation is now in the repository in a temporary branch. - - ![](static/documentation/images/image109.jpg) - -1. The next step is to go to the repository and manually create a pull request to the main branch. -1. After confirming the PR, when the annotation is saved in the main branch, the color of the task changes to blue. - - ![](static/documentation/images/image110.jpg) - -### Vocabulary - -**Label** is a type of an annotated object (e.g. person, car, vehicle, etc.) - -![](static/documentation/images/image032_detrac.jpg) - ---- - -**Attribute** is a property of an annotated object (e.g. color, model, -quality, etc.). There are two types of attributes: - -- **Unique**: immutable and can't be changed from frame to frame (e.g. age, gender, color, etc.) - - ![](static/documentation/images/image073.jpg) - -- **Temporary**: mutable and can be changed on any frame (e.g. quality, pose, truncated, etc.) - - ![](static/documentation/images/image072.jpg) - ---- - -**Track** is a set of shapes on different frames which corresponds to one object. -Tracks are created in `Track mode` - -![](static/documentation/images/gif003_detrac.gif) - ---- - -**Annotation** is a set of shapes and tracks. There are several types of annotations: - -- _Manual_ which is created by a person -- _Semi-automatic_ which is created mainly automatically, but the user provides some data (e.g. interpolation) -- _Automatic_ which is created automatically without a person in the loop - ---- - -### Workspace - -This is the main field in which drawing and editing objects takes place. -In addition the workspace also has the following functions: - -- Right-clicking on an object calls up the `Object card` - this is an element containing - the necessary controls for changing the label and attributes of the object, as well as the action menu. - - ![](static/documentation/images/image138_mapillary_vistas.jpg) - -- Right-clicking a point deletes it. - - ![](static/documentation/images/image139_mapillary_vistas.jpg) - -- `Z-axis slider` - Allows you to switch annotation layers hiding the upper layers - (slider is enabled if several z layers are on a frame). - This element has a button for adding a new layer. When pressed, a new layer is added and switched to it. - You can move objects in layers using the `+` and `-` keys. - - ![](static/documentation/images/image140.jpg) - -- `Image settings panel` -  used to set up the grid and set up image brightness contrast saturation. - - - Show `Grid`, change grid size, choose color and transparency: - - ![](static/documentation/images/image068_mapillary_vistas.jpg) - - - Adjust `Brightness`/`Contrast`/`Saturation` of too exposed or too - dark images using `F3` — color settings (changes displaying settings and not the - image itself). - - Shortcuts: - - - `Shift+B+=`/`Shift+B+-` for brightness. - - `Shift+C+=`/`Shift+C+-` for contrast. - - `Shift+S+=`/`Shift+S+-` for saturation. - - ![](static/documentation/images/image164_mapillary_vistas.jpg) - - - `Reset color settings` to default values. - ---- - -### Settings - -To open the settings open the user menu in the header and select the settings item or press `F2`. - -![](static/documentation/images/image067.jpg) - -`Settings` have two tabs: - -In tab `Player` you can: - -- Control step of `C` and `V` shortcuts. -- Control speed of `Space`/`Play` button. -- Select canvas background color. You can choose a background color or enter manually (in RGB or HEX format). -- `Reset zoom` Show every image in full size or zoomed out like previous - (it is enabled by default for interpolation mode and disabled for annotation mode). -- `Rotate all images` checkbox — switch the rotation of all frames or an individual frame. - ---- - -In tab `Workspace` you can: - -![](static/documentation/images/image155.jpg) - -- `Enable auto save` checkbox — turned off by default. -- `Auto save interval (min)` input box — 15 minutes by default. -- `Show all interpolation tracks` checkbox — shows hidden objects on the - side panel for every interpolated object (turned off by default). -- `Always show object details` - show text for an object on the canvas not only when the object is activated: - - ![](static/documentation/images/image152_detrac.jpg) - -- `Automatic bordering` - enable automatic bordering for polygons and polylines during drawing/editing. - For more information To find out more, go to the section [annotation with polygons](#Annotation-with-polygons). - -- `Intelligent polygon cropping` - activates intelligent cropping when editing the polygon (read more in the section [edit polygon](#edit-polygon) - -- `Attribute annotation mode (AAM) zoom margin` input box — defines margins (in px) - for shape in the attribute annotation mode. -- Click `Save` to save settings (settings will be saved on the server and will not change after the page is refreshed). Click `Cancel` or press `F2` to return to the annotation. - ---- - -### Top Panel - -![](static/documentation/images/image035.jpg) - ---- - -#### Menu button - -It is the main menu of the annotation tool. It can be used to download, upload and remove annotations. - -![](static/documentation/images/image051.jpg) - -Button assignment: - -- `Dump Annotations` — downloads annotations from a task. -- `Upload Annotations` — uploads annotations into a task. -- `Remove Annotations` — removes annotations from the current job. -- `Export as a dataset` — download a data set from a task. Several formats are available: - - [Datumaro](https://github.com/opencv/cvat/blob/develop/datumaro/docs/design.md) - - [Pascal VOC 2012](http://host.robots.ox.ac.uk/pascal/VOC/) - - [MS COCO](http://cocodataset.org/#format-data) - - [YOLO](https://pjreddie.com/darknet/yolo/) -- `Open the task` — opens a page with details about the task. -- `Request a review` - calls up the form to submit the job for a review, read more in the [review](#review) section. -- `Finish the job` - changes the status of the job to `completed` and returns to the task page without review. -- `Submit the review` - (available during the review) calls up the form to submit a review, read more in the [review](#review) section. - -#### Save Work - -Saves annotations for the current job. The button has an indication of the saving process. - -![](static/documentation/images/image141.jpg) - -#### Undo-redo buttons - -Use buttons to undo actions or redo them. - -![](static/documentation/images/image061.jpg) - ---- - -#### Player - -Go to the first /the latest frames. - -![](static/documentation/images/image036.jpg) - -Go to the next/previous frame with a predefined step. Shortcuts: -`V` — step backward, `C` — step forward. By default the step is `10` frames -(change at `Account Menu` —> `Settings` —> `Player Step`). - -![](static/documentation/images/image037.jpg) - -The button to go to the next / previous frame has the customization possibility. To customize, right-click on the button and select one of three options: - -1. The default option - go to the next / previous frame (the step is 1 frame). -2. Go to the next / previous frame that has any objects (in particular filtered). Read the [filter](#filter) section to know the details how to use it. -3. Go to the next / previous frame without annotation at all. Use this option in cases when you need to find missed frames quickly. - -Shortcuts: `D` - previous, `F` - next. - -![](static/documentation/images/image040.jpg) - -Play the sequence of frames or the set of images. -Shortcut: `Space` (change at `Account Menu` —> `Settings` —> `Player Speed`). - -![](static/documentation/images/image041.jpg) - -Go to a specific frame. Press `~` to focus on the element. - -![](static/documentation/images/image060.jpg) - ---- - -#### Fullscreen Player - -The fullscreen player mode. The keyboard shortcut is `F11`. - -![](static/documentation/images/image143.jpg) - -#### Info - -Open the job info. - -![](static/documentation/images/image144_detrac.jpg) - -_Overview_: - -- `Assinger` - the one to whom the job is assigned. -- `Reviewer` – a user assigned to carry out the review, read more in the [review](#review) section. -- `Start Frame` - the number of the first frame in this job. -- `End Frame` - the number of the last frame in this job. -- `Frames` - the total number of all frames in the job. - -_Annotations statistics_: - -This is a table number of created shapes, sorted by labels (e.g. vehicle, person) -and type of annotation (shape, track). As well as the number of manual and interpolated frames. - -#### UI switcher - -Switching between user interface modes. - -![](static/documentation/images/image145.jpg) - ---- - -### Controls sidebar - -**Navigation block** - contains tools for moving and rotating images. -|Icon |Description | -|-- |-- | -|![](static/documentation/images/image148.jpg)|`Cursor` (`Esc`)- a basic annotation pedacting tool. | -|![](static/documentation/images/image149.jpg)|`Move the image`- a tool for moving around the image without
    the possibility of editing.| -|![](static/documentation/images/image102.jpg)|`Rotate`- two buttons to rotate the current frame
    a clockwise (`Ctrl+R`) and anticlockwise (`Ctrl+Shift+R`).
    You can enable `Rotate all images` in the settings to rotate all the images in the job - -**Zoom block** - contains tools for image zoom. -|Icon |Description | -|-- |-- | -|![](static/documentation/images/image151.jpg)|`Fit image`- fits image into the workspace size.
    Shortcut - double click on an image| -|![](static/documentation/images/image166.jpg)|`Select a region of interest`- zooms in on a selected region.
    You can use this tool to quickly zoom in on a specific part of the frame.| - -**Shapes block** - contains all the tools for creating shapes. -|Icon |Description |Links to section | -|-- |-- |-- | -|![](static/documentation/images/image189.jpg)|`AI Tools` |[AI Tools](#ai-tools)| -|![](static/documentation/images/image201.jpg)|`OpenCV` |[OpenCV](#opencv)| -|![](static/documentation/images/image167.jpg)|`Rectangle`|[Shape mode](#shape-mode-basics); [Track mode](#track-mode-basics);
    [Drawing by 4 points](#annotation-with-rectangle-by-4-points)| -|![](static/documentation/images/image168.jpg)|`Polygon` |[Annotation with polygons](#annotation-with-polygons); [Track mode with polygons](#track-mode-with-polygons) | -|![](static/documentation/images/image169.jpg)|`Polyline` |[Annotation with polylines](#annotation-with-polylines)| -|![](static/documentation/images/image170.jpg)|`Points` |[Annotation with points](#annotation-with-points) | -|![](static/documentation/images/image176.jpg)|`Cuboid` |[Annotation with cuboids](#annotation-with-cuboids) | -|![](static/documentation/images/image171.jpg)|`Tag` |[Annotation with tags](#annotation-with-tag) | -|![](static/documentation/images/image195.jpg)|`Open an issue` |[Review](#review) (available only in review mode) | - -**Edit block** - contains tools for editing tracks and shapes. -|Icon |Description |Links to section | -|-- |-- |-- | -|![](static/documentation/images/image172.jpg)|`Merge Shapes`(`M`) — starts/stops the merging shapes mode. |[Track mode (basics)](#track-mode-basics)| -|![](static/documentation/images/image173.jpg)|`Group Shapes` (`G`) — starts/stops the grouping shapes mode.|[Shape grouping](#shape-grouping)| -|![](static/documentation/images/image174.jpg)|`Split` — splits a track. |[Track mode (advanced)](#track-mode-advanced)| - ---- - -### Objects sidebar - -`Hide` - the button hides the object's sidebar. - -![](static/documentation/images/image146.jpg) - -#### Objects - -**Filter** input box - -![](static/documentation/images/image059.jpg) - -The way how to use filters is described in the advanced guide [here](#filter). - -**List of objects** - -![](static/documentation/images/image147.jpg) - -- Switch lock property for all - switches lock property of all objects in the frame. -- Switch hidden property for all - switches hide property of all objects in the frame. -- Expand/collapse all - collapses/expands the details field of all objects in the frame. -- Sorting - sort the list of objects: updated time, ID - accent, ID - descent - -In the objects sidebar you can see the list of available objects on the current -frame. The following figure is an example of how the list might look like: - -| Shape mode | Track mode | -| --------------------------------------------- | --------------------------------------------- | -| ![](static/documentation/images/image044.jpg) | ![](static/documentation/images/image045.jpg) | - ---- - -**Objects** on the side bar - -The type of a shape can be changed by selecting **Label** property. For instance, it can look like shown on the figure below: - -![](static/documentation/images/image050.jpg) - -**Object action menu** - -The action menu calls up the button: - -![](static/documentation/images/image047.jpg) - -The action menu contains: - -- `Create object URL` - puts a link to an object on the clipboard. After you open the link, this object will be filtered. -- `Make a copy`- copies an object. The keyboard shortcut is `Ctrl + C` `Ctrl + V`. -- `Propagate` - Сopies the form to several frames, - invokes a dialog box in which you can specify the number of copies - or the frame onto which you want to copy the object. The keyboard shortcut `Ctrl + B`. - - ![](static/documentation/images/image053.jpg) - -- `To background` - moves the object to the background. The keyboard shortcut `-`,`_`. -- `To foreground` - moves the object to the foreground. The keyboard shortcut `+`,`=`. -- `Change instance color`- choosing a color using the color picker (available only in instance mode). - - ![](static/documentation/images/image153.jpg) - -- `Remove` - removes the object. The keyboard shortcut `Del`,`Shift+Del`. - -A shape can be locked to prevent its modification or moving by an accident. Shortcut to lock an object: `L`. - -![](static/documentation/images/image046.jpg) - -A shape can be **Occluded**. Shortcut: `Q`. Such shapes have dashed boundaries. - -![](static/documentation/images/image048.jpg) - -![](static/documentation/images/image049_detrac.jpg) - -You can change the way an object is displayed on a frame (show or hide). - -![](static/documentation/images/image055.jpg) - -`Switch pinned property` - when enabled, a shape cannot be moved by dragging or dropping. - -![](static/documentation/images/image052.jpg) - -By clicking on the `Details` button you can collapse or expand the field with all the attributes of the object. - -![](static/documentation/images/image154.jpg) - ---- - -#### Labels - -In this tab you can lock or hide objects of a certain label. -To change the color for a specific label, -you need to go to the task page and select the color by clicking the edit button, -this way you will change the label color for all jobs in the task. - -![](static/documentation/images/image062.jpg) - -**Fast label change** -You can change the label of an object using hot keys. In order to do it, you need to assign a number (from 0 to 9) to labels. By default numbers 1,2...0 are assigned to the first ten labels. - To assign a number, click on the button placed at the right of a label name on the sidebar. - -![](static/documentation/images/image210.jpg) - -After that you will be able to assign a corresponding label to an object - by hovering your mouse cursor over it and pressing `Ctrl + Num(0..9)`. - -In case you do not point the cursor to the object, pressing `Ctrl + Num(0..9)` will set a chosen label as default, - so that the next object you create (use `N` key) will automatically have this label assigned. - -![](static/documentation/images/image211.jpg) - ---- - -#### Appearance - -**Color By** options - -Change the color scheme of annotation: - -- `Instance` — every shape has random color - - ![](static/documentation/images/image095_detrac.jpg) - -- `Group` — every group of shape has its own random color, ungrouped shapes are white - - ![](static/documentation/images/image094_detrac.jpg) - -- `Label` — every label (e.g. car, person) has its own random color - - ![](static/documentation/images/image093_detrac.jpg) - - You can change any random color pointing to a needed box on a frame or on an - object sidebar. - -**Fill Opacity** slider - -Change the opacity of every shape in the annotation. - -![](static/documentation/images/image086_detrac.jpg) - -**Selected Fill Opacity** slider - -Change the opacity of the selected object's fill. - -![](static/documentation/images/image089_detrac.jpg) - -**Outlines borders** checkbox - -You can change a special shape border color by clicking on the `Eyedropper` icon. - -![](static/documentation/images/image088_detrac.jpg) - -**Show bitmap** checkbox - -If enabled all shapes are displayed in white and the background is black. - -![](static/documentation/images/image087_detrac.jpg) - -**Show projections** checkbox - -Enables / disables the display of auxiliary perspective lines. Only relevant for cuboids - -![](static/documentation/images/image090_detrac.jpg) - -## Shape mode (advanced) - -Basic operations in the mode were described in section [shape mode (basics)](#shape-mode-basics). - -**Occluded** -Occlusion is an attribute used if an object is occluded by another object or -isn't fully visible on the frame. Use `Q` shortcut to set the property -quickly. - -![](static/documentation/images/image065.jpg) - -Example: the three cars on the figure below should be labeled as **occluded**. - -![](static/documentation/images/image054_mapillary_vistas.jpg) - -If a frame contains too many objects and it is difficult to annotate them -due to many shapes placed mostly in the same place, it makes sense -to lock them. Shapes for locked objects are transparent, and it is easy to -annotate new objects. Besides, you can't change previously annotated objects -by accident. Shortcut: `L`. - -![](static/documentation/images/image066.jpg) - -## Track mode (advanced) - -Basic operations in the mode were described in section [track mode (basics)](#track-mode-basics). - -Shapes that were created in the track mode, have extra navigation buttons. - -- These buttons help to jump to the previous/next keyframe. - - ![](static/documentation/images/image056.jpg) - -- The button helps to jump to the initial frame and to the last keyframe. - - ![](static/documentation/images/image057.jpg) - -You can use the `Split` function to split one track into two tracks: - -![](static/documentation/images/gif010_detrac.gif) - -## Attribute annotation mode (advanced) - -Basic operations in the mode were described in section [attribute annotation mode (basics)](#attribute-annotation-mode-basics). - -It is possible to handle lots of objects on the same frame in the mode. - -![](static/documentation/images/image058_detrac.jpg) - -It is more convenient to annotate objects of the same type. In this case you can apply -the appropriate filter. For example, the following filter will -hide all objects except person: `label=="Person"`. - -To navigate between objects (person in this case), -use the following buttons `switch between objects in the frame` on the special panel: - -![](static/documentation/images/image026.jpg) - -or shortcuts: - -- `Tab` — go to the next object -- `Shift+Tab` — go to the previous object. - -In order to change the zoom level, go to settings (press `F3`) -in the workspace tab and set the value Attribute annotation mode (AAM) zoom margin in px. - -## AI Tools - -The tool is designed for semi-automatic and automatic annotation using DL models. -The tool is available only if there is a corresponding model. -For more details about DL models read the [Models](#models) section. - -### Interactors - -Interactors are used to create a polygon semi-automatically. -Supported DL models are not bound to the label and can be used for any objects. -To create a polygon usually you need to use regular or positive points. -For some kinds of segmentation negative points are available. -Positive points are the points related to the object. -Negative points should be placed outside the boundary of the object. -In most cases specifying positive points alone is enough to build a polygon. - -- Before you start, select the magic wand on the controls sidebar and go to the `Interactors` tab. - Then select a label for the polygon and a required DL model. - - ![](static/documentation/images/image114.jpg) - -- Click `Interact` to enter the interaction mode. Now you can place positive and/or negative points. - Left click creates a positive point and right click creates a negative point. - `Deep extreme cut` model requires a minimum of 4 points. After you set 4 positive points, - a request will be sent to the server and when the process is complete a polygon will be created. - If you are not satisfied with the result, you can set additional points or remove points by left-clicking on it. - If you want to postpone the request and create a few more points, hold down `Ctrl` and continue, - the request will be sent after the key is released. - - ![](static/documentation/images/image188_detrac.jpg) - -- To finish interaction, click on the icon on the controls sidebar or press `N` on your keyboard. - -- When the object is finished, you can edit it like a polygon. - You can read about editing polygons in the [Annotation with polygons](#annotation-with-polygons) section. - -### Detectors - -Detectors are used to automatically annotate one frame. Supported DL models are suitable only for certain labels. - -- Before you start, click the magic wand on the controls sidebar and select the Detectors icon tab. - You need to match the labels of the DL model (left column) with the labels in your task (right column). - Then click `Annotate`. - - ![](static/documentation/images/image187.jpg) - -- This action will automatically annotates one frame. - In the [Automatic annotation](#automatic-annotation) section you can read how to make automatic annotation of all frames. - -## OpenCV tools - -The tool based on [Open CV](https://opencv.org/) Computer Vision library which is an open-source product that includes many CV algorithms. Some of these algorithms can be used to simplify the annotation process. - -First step to work with OpenCV is to load it into CVAT. Click on the toolbar icon, then click `Load OpenCV`. - -![](static/documentation/images/image198.jpg) - -Once it is loaded, the tool's functionality will be available. - -### Intelligent scissors - -Intelligent scissors is an CV method of creating a polygon by placing points with automatic drawing of a line between them. -The distance between the adjacent points is limited by the threshold of action, -displayed as a red square which is tied to the cursor. - -- First, select the label and then click on the `intelligent scissors` button. - - ![](static/documentation/images/image199.jpg) - -- Create the first point on the boundary of the allocated object. - You will see a line repeating the outline of the object. -- Place the second point, so that the previous point is within the restrictive threshold. - After that a line repeating the object boundary will be automatically created between the points. - - ![](static/documentation/images/image200_detrac.jpg) - - To increase or lower the action threshold, hold `Ctrl` and scroll the mouse wheel. - Increasing action threshold will affect the performance. - During the drawing process you can remove the last point by clicking on it with the left mouse button. - -- Once all the points are placed, you can complete the creation of the object by clicking on the icon or clicking `N`. - As a result, a polygon will be created (read more about the polygons in the [annoation with polygons](#annotation-with-polygons)). - -## Annotation with rectangle by 4 points - -It is an efficient method of bounding box annotation, proposed -[here](https://arxiv.org/pdf/1708.02750.pdf). -Before starting, you need to make sure that the drawing method by 4 points is selected. - -![](static/documentation/images/image134.jpg) - -Press `Shape` or `Track` for entering drawing mode. Click on four extreme points: -the top, bottom, left- and right-most physical points on the object. -Drawing will be automatically completed right after clicking the fourth point. -Press `Esc` to cancel editing. - -![](static/documentation/images/gif016_mapillary_vistas.gif) - -## Annotation with polygons - -### Manual drawing - -It is used for semantic / instance segmentation. - -Before starting, you need to select `Polygon` on the controls sidebar and choose the correct Label. - -![](static/documentation/images/image084.jpg) - -- Click `Shape` to enter drawing mode. - There are two ways to draw a polygon: either create points by clicking or - by dragging the mouse on the screen while holding `Shift`. - -| Clicking points | Holding Shift+Dragging | -| -------------------------------------------------- | -------------------------------------------------- | -| ![](static/documentation/images/gif005_detrac.gif) | ![](static/documentation/images/gif006_detrac.gif) | - -- When `Shift` isn't pressed, you can zoom in/out (when scrolling the mouse - wheel) and move (when clicking the mouse wheel and moving the mouse), you can also - delete the previous point by right-clicking on it. -- Press `N` again for completing the shape. -- After creating the polygon, you can move the points or delete them by right-clicking and selecting `Delete point` - or clicking with pressed `Alt` key in the context menu. - -### Drawing using automatic borders - -![](static/documentation/images/gif025_mapillary_vistas.gif) - -You can use auto borders when drawing a polygon. Using automatic borders allows you to automatically trace -the outline of polygons existing in the annotation. - -- To do this, go to settings -> workspace tab and enable `Automatic Bordering` - or press `Ctrl` while drawing a polygon. - - ![](static/documentation/images/image161.jpg) - -- Start drawing / editing a polygon. -- Points of other shapes will be highlighted, which means that the polygon can be attached to them. -- Define the part of the polygon path that you want to repeat. - - ![](static/documentation/images/image157_mapillary_vistas.jpg) - -- Click on the first point of the contour part. - - ![](static/documentation/images/image158_mapillary_vistas.jpg) - -- Then click on any point located on part of the path. The selected point will be highlighted in purple. - - ![](static/documentation/images/image159_mapillary_vistas.jpg) - -- Сlick on the last point and the outline to this point will be built automatically. - - ![](static/documentation/images/image160_mapillary_vistas.jpg) - -Besides, you can set a fixed number of points in the `Number of points` field, then -drawing will be stopped automatically. To enable dragging you should right-click -inside the polygon and choose `Switch pinned property`. - -Below you can see results with opacity and black stroke: - -![](static/documentation/images/image064_mapillary_vistas.jpg) - -If you need to annotate small objects, increase `Image Quality` to -`95` in `Create task` dialog for your convenience. - -### Edit polygon - -To edit a polygon you have to click on it while holding `Shift`, it will open the polygon editor. - -- In the editor you can create new points or delete part of a polygon by closing the line on another point. -- When `Intelligent polygon cropping` option is activated in the settings, СVAT considers two criteria to decide which part of a polygon should be cut off during automatic editing. - - The first criteria is a number of cut points. - - The second criteria is a length of a cut curve. - - If both criteria recommend to cut the same part, algorithm works automatically, and if not, a user has to make the decision. - If you want to choose manually which part of a polygon should be cut off, disable `Intelligent polygon cropping` in the settings. In this case after closing the polygon, you can select the part of the polygon you want to leave. - - ![](static/documentation/images/image209.jpg) - -- You can press `Esc` to cancel editing. - - ![](static/documentation/images/gif007_mapillary_vistas.gif) - -### Cutting holes in polygons - -Currently, CVAT does not support cutting transparent holes in polygons. However, -it is poissble to generate holes in exported instance and class masks. -To do this, one needs to define a background class in the task and draw holes -with it as additional shapes above the shapes needed to have holes: - -The editor window: - ![The editor](static/documentation/images/mask_export_example1_editor.png) - -Remember to use z-axis ordering for shapes by \[\-\] and \[\+\, \=\] keys. - -Exported masks: - ![A class mask](static/documentation/images/mask_export_example1_cls_mask.png) ![An instance mask](static/documentation/images/mask_export_example1_inst_mask.png) - -Notice that it is currently impossible to have a single instance number for -internal shapes (they will be merged into the largest one and then covered by -"holes"). - -### Creating masks - -There are several formats in CVAT that can be used to export masks: -- `Segmentation Mask` (PASCAL VOC masks) -- `CamVid` -- `MOTS` -- `ICDAR` -- `COCO` (RLE-encoded instance masks, [guide](https://github.com/openvinotoolkit/cvat/blob/develop/cvat/apps/dataset_manager/formats/README.md#coco)) -- `TFRecord` ([over Datumaro](https://github.com/openvinotoolkit/datumaro/blob/develop/docs/user_manual.md), [guide](https://github.com/openvinotoolkit/cvat/blob/develop/cvat/apps/dataset_manager/formats/README.md#tfrecord)): -- `Datumaro` - -An example of exported masks (in the `Segmentation Mask` format): - - ![A class mask](static/documentation/images/exported_cls_masks_example.png) ![An instance mask](static/documentation/images/exported_inst_masks_example.png) - -Important notices: -- Both boxes and polygons are converted into masks -- Grouped objects are considered as a single instance and exported as a single - mask (label and attributes are taken from the largest object in the group) - -#### Class colors - -All the labels have associated colors, which are used in the generated masks. -These colors can be changed in the task label properties: - - ![](static/documentation/images/label_color_picker.jpg) - -Label colors are also displayed in the annotation window on the right panel, -where you can show or hide specific labels -(only the presented labels are displayed): - - ![](static/documentation/images/label_panel_anno_window.jpg) - -A background class can be: -- A default class, which is implicitly-added, of black color (RGB 0, 0, 0) -- `background` class with any color (has a priority, name is case-insensitive) -- Any class of black color (RGB 0, 0, 0) - -To change backgound color in generated masks (default is black), -change `background` class color to the desired one. - - -## Annotation with polylines - -It is used for road markup annotation etc. - -Before starting, you need to select the `Polyline`. You can set a fixed number of points -in the `Number of points` field, then drawing will be stopped automatically. - -![](static/documentation/images/image085.jpg) - -Click `Shape` to enter drawing mode. There are two ways to draw a polyline — -you either create points by clicking or by dragging a mouse on the screen while holding `Shift`. -When `Shift` isn't pressed, you can zoom in/out (when scrolling the mouse wheel) -and move (when clicking the mouse wheel and moving the mouse), you can delete -previous points by right-clicking on it. Press `N` again to complete the shape. -You can delete a point by clicking on it with pressed `Ctrl` or right-clicking on a point -and selecting `Delete point`. Click with pressed `Shift` will open a polyline editor. -There you can create new points(by clicking or dragging) or delete part of a polygon closing -the red line on another point. Press `Esc` to cancel editing. - -![](static/documentation/images/image039_mapillary_vistas.jpg) - -## Annotation with points - -### Points in shape mode - -It is used for face, landmarks annotation etc. - -Before you start you need to select the `Points`. If necessary you can set a fixed number of points -in the `Number of points` field, then drawing will be stopped automatically. - -![](static/documentation/images/image042.jpg) - -Click `Shape` to entering the drawing mode. Now you can start annotation of the necessary area. -Points are automatically grouped — all points will be considered linked between each start and finish. -Press `N` again to finish marking the area. You can delete a point by clicking with pressed `Ctrl` -or right-clicking on a point and selecting `Delete point`. Clicking with pressed `Shift` will open the points -shape editor. There you can add new points into an existing shape. You can zoom in/out (when scrolling the mouse wheel) -and move (when clicking the mouse wheel and moving the mouse) while drawing. You can drag an object after -it has been drawn and change the position of individual points after finishing an object. - -![](static/documentation/images/image063_affectnet.jpg) - -### Linear interpolation with one point - -You can use linear interpolation for points to annotate a moving object: - -1. Before you start, select the `Points`. -1. Linear interpolation works only with one point, so you need to set `Number of points` to 1. -1. After that select the `Track`. - - ![](static/documentation/images/image122.jpg) - -1. Click `Track` to enter the drawing mode left-click to create a point and after that shape will be automatically completed. - - ![](static/documentation/images/image163_detrac.jpg) - -1. Move forward a few frames and move the point to the desired position, - this way you will create a keyframe and intermediate frames will be drawn automatically. - You can work with this object as with an interpolated track: you can hide it using the `Outside`, - move around keyframes, etc. - - ![](static/documentation/images/image165_detrac.jpg) - -1. This way you'll get linear interpolation using the ` Points`. - - ![](static/documentation/images/gif013_detrac.gif) - -## Annotation with cuboids - -It is used to annotate 3 dimensional objects such as cars, boxes, etc... -Currently the feature supports one point perspective and has the constraint -where the vertical edges are exactly parallel to the sides. - -### Creating the cuboid - -Before you start, you have to make sure that Cuboid is selected -and choose a drawing method ”from rectangle” or “by 4 points”. - -![](static/documentation/images/image091.jpg) - -#### Drawing cuboid by 4 points - -Choose a drawing method “by 4 points” and click Shape to enter the drawing mode. There are many ways to draw a cuboid. -You can draw the cuboid by placing 4 points, after that the drawing will be completed automatically. -The first 3 points determine the plane of the cuboid while the last point determines the depth of that plane. -For the first 3 points, it is recommended to only draw the 2 closest side faces, as well as the top and bottom face. - -A few examples: - -![](static/documentation/images/image177_mapillary_vistas.jpg) - -### Drawing cuboid from rectangle - -Choose a drawing method “from rectangle” and click Shape to enter the drawing mode. -When you draw using the rectangle method, you must select the frontal plane of the object using the bounding box. -The depth and perspective of the resulting cuboid can be edited. - -Example: - -![](static/documentation/images/image182_mapillary_vistas.jpg) - -### Editing the cuboid - -![](static/documentation/images/image178_mapillary_vistas.jpg) - -The cuboid can be edited in multiple ways: by dragging points, by dragging certain faces or by dragging planes. -First notice that there is a face that is painted with gray lines only, let us call it the front face. - -You can move the cuboid by simply dragging the shape behind the front face. -The cuboid can be extended by dragging on the point in the middle of the edges. -The cuboid can also be extended up and down by dragging the point at the vertices. - -![](static/documentation/images/gif017_mapillary_vistas.gif) - -To draw with perspective effects it should be assumed that the front face is the closest to the camera. -To begin simply drag the points on the vertices that are not on the gray/front face while holding `Shift`. -The cuboid can then be edited as usual. - -![](static/documentation/images/gif018_mapillary_vistas.gif) - -If you wish to reset perspective effects, you may right click on the cuboid, -and select `Reset perspective` to return to a regular cuboid. - -![](static/documentation/images/image180_mapillary_vistas.jpg) - -The location of the gray face can be swapped with the adjacent visible side face. -You can do it by right clicking on the cuboid and selecting `Switch perspective orientation`. -Note that this will also reset the perspective effects. - -![](static/documentation/images/image179_mapillary_vistas.jpg) - -Certain faces of the cuboid can also be edited, -these faces are: the left, right and dorsal faces, relative to the gray face. -Simply drag the faces to move them independently from the rest of the cuboid. - -![](static/documentation/images/gif020_mapillary_vistas.gif) - -You can also use cuboids in track mode, similar to rectangles in track mode ([basics](#track-mode-basics) and [advanced](#track-mode-advanced)) or [Track mode with polygons](#track-mode-with-polygons) - -## Annotation with Tags - -It is used to annotate frames, tags are not displayed in the workspace. -Before you start, open the drop-down list in the top panel and select `Tag annotation`. - -![](static/documentation/images/image183.jpg) - -The objects sidebar will be replaced with a special panel for working with tags. -Here you can select a label for a tag and add it by clicking on the `Add tag` button. -You can also customize hotkeys for each label. - -![](static/documentation/images/image181.jpg) - -If you need to use only one label for one frame, then enable the `Automatically go to the next frame` -checkbox, then after you add the tag the frame will automatically switch to the next. - -## Track mode with polygons - -Polygons in the track mode allow you to mark moving objects more accurately other than using a rectangle -([Tracking mode (basic)](#track-mode-basics); [Tracking mode (advanced)](#track-mode-advanced)). - -1. To create a polygon in the track mode, click the `Track` button. - - ![](static/documentation/images/image184.jpg) - -1. Create a polygon the same way as in the case of [Annotation with polygons](#annotation-with-polygons). - Press `N` to complete the polygon. - -1. Pay attention to the fact that the created polygon has a starting point and a direction, - these elements are important for annotation of the following frames. - -1. After going a few frames forward press `Shift+N`, the old polygon will disappear and you can create a new polygon. - The new starting point should match the starting point of the previously created polygon - (in this example, the top of the left mirror). The direction must also match (in this example, clockwise). - After creating the polygon, press `N` and the intermediate frames will be interpolated automatically. - - ![](static/documentation/images/image185_detrac.jpg) - -1. If you need to change the starting point, right-click on the desired point and select `Set starting point`. - To change the direction, right-click on the desired point and select switch orientation. - - ![](static/documentation/images/image186_detrac.jpg) - -There is no need to redraw the polygon every time using `Shift+N`, -instead you can simply move the points or edit a part of the polygon by pressing `Shift+Click`. - -## Review - -A special mode to check the annotation allows you to point to an object or area in the frame containing an error. -To go into review mode, you need to select `Request a review` in the menu and assign the user to run a check. - -![](static/documentation/images/image194.jpg) - -After that, the job status will be changed to `validation` -and the reviewer will be able to open the task in review mode. -Review mode is a UI mode, there is a special "issue" tool which you can use to identify objects -or areas in the frame and describe the problem. - -- To do this, first click `open an issue` icon on the controls sidebar: - - ![](static/documentation/images/image195.jpg) - -- Then click on an object in the frame to highlight the object or highlight the area by holding the left mouse button - and describe the problem. The object or area will be shaded in red. -- The created issue will appear in the workspace and in the `issues` tab on the objects sidebar. -- After you save the annotation, other users will be able to see the problem, comment on each issue - and change the status of the problem to `resolved`. -- You can use the arrows on the issues tab to navigate the frames that contain problems. - - ![](static/documentation/images/image196_detrac.jpg) - -- Once all the problems are marked, save the annotation, open the menu and select "submit the review". After that you'll see a form containing the verification statistics, here you can give an assessment of the job and choose further actions: - - - Accept - changes the status of the job to `completed`. - - Review next – passes the job to another user for re-review. - - Reject - changes the status of the job to `annotation`. - - ![](static/documentation/images/image197.jpg) - -## Automatic annotation - -Automatic Annotation is used for creating preliminary annotations. -To use Automatic Annotation you need a DL model. You can use primary models or models uploaded by a user. -You can find the list of available models in the `Models` section. - -1. To launch automatic annotation, you should open the dashboard and find a task which you want to annotate. - Then click the `Actions` button and choose option `Automatic Annotation` from the dropdown menu. - - ![](static/documentation/images/image119_detrac.jpg) - -1. In the dialog window select a model you need. DL models are created for specific labels, e.g. - the Crossroad model was taught using footage from cameras located above the highway and it is best to - use this model for the tasks with similar camera angles. - If it's necessary select the `Clean old annotations` checkbox. - Adjust the labels so that the task labels will correspond to the labels of the DL model. - For example, let’s consider a task where you have to annotate labels “car” and “person”. - You should connect the “person” label from the model to the “person” label in the task. - As for the “car” label, you should choose the most fitting label available in the model - the “vehicle” label. - The task requires to annotate cars only and choosing the “vehicle” label implies annotation of all vehicles, - in this case using auto annotation will help you complete the task faster. - Click `Submit` to begin the automatic annotation process. - - ![](static/documentation/images/image120.jpg) - -1. At runtime - you can see the percentage of completion. - You can cancel the automatic annotation by clicking on the `Cancel`button. - - ![](static/documentation/images/image121_detrac.jpg) - -1. The end result of an automatic annotation is an annotation with separate rectangles (or other shapes) - - ![](static/documentation/images/gif014_detrac.gif) - -1. You can combine separate bounding boxes into tracks using the `Person reidentification ` model. - To do this, click on the automatic annotation item in the action menu again and select the model - of the `ReID` type (in this case the `Person reidentification` model). - You can set the following parameters: - - - Model `Threshold` is a maximum cosine distance between objects’ embeddings. - - `Maximum distance` defines a maximum radius that an object can diverge between adjacent frames. - - ![](static/documentation/images/image133.jpg) - -1. You can remove false positives and edit tracks using `Split` and `Merge` functions. - - ![](static/documentation/images/gif015_detrac.gif) - -## Shape grouping - -This feature allows us to group several shapes. - -You may use the `Group Shapes` button or shortcuts: - -- `G` — start selection / end selection in group mode -- `Esc` — close group mode -- `Shift+G` — reset group for selected shapes - -You may select shapes clicking on them or selecting an area. - -Grouped shapes will have `group_id` filed in dumped annotation. - -Also you may switch color distribution from an instance (default) to a group. -You have to switch `Color By Group` checkbox for that. - -Shapes that don't have `group_id`, will be highlighted in white. - -![](static/documentation/images/image078_detrac.jpg) - -![](static/documentation/images/image077_detrac.jpg) - -## Filter - -There are some reasons to use the feature: - -1. When you use a filter, objects that don't match the filter will be hidden. -1. The fast navigation between frames which have an object of interest. - Use the `Left Arrow` / `Right Arrow` keys for this purpose - or customize the UI buttons by right-clicking and select `switching by filter`. - If there are no objects which correspond to the filter, - you will go to the previous / next frame which contains any annotated objects. - -To apply filters you need to click on the button on the top panel. - -![](static/documentation/images/image059.jpg) - -It will open a window for filter input. Here you will find two buttons: `Add rule` and `Add group`. - -![](static/documentation/images/image202.jpg) - -### Rules - -The "Add rule" button adds a rule for objects display. A rule may use the following properties: - -![](static/documentation/images/image204.jpg) - -**Supported properties:** - -| Properties | Supported values | Description | -| ------------ | -------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | -| `Label` | all the label names that are in the task | label name | -| `Type` | shape, track or tag | type of object | -| `Shape` | all shape types | type of shape | -| `Occluded` | true or false | occluded ([read more](#shape-mode-advanced)) | -| `Width` | number of px or field | shape width | -| `Height` | number of px or field | shape height | -| `ServerID` | number or field | ID of the object on the server
    (You can find out by forming a link to the object through the Action menu) | -| `ObjectID` | number or field | ID of the object in your client
    (indicated on the objects sidebar) | -| `Attributes` | some other fields including attributes with a
    similar type or a specific attribute value | any fields specified by a label | - -**Supported operators for properties:** - -`==` - Equally; `!=` - Not equal; `>` - More; `>=` - More or equal; `<` - Less; `<=` - Less or equal; - -`Any in`; `Not in` - these operators allow you to set multiple values in one rule; - -![](static/documentation/images/image203.jpg) - -`Is empty`; `is not empty` – these operators don't require to input a value. - -`Between`; `Not between` – these operators allow you to choose a range between two values. - -Some properties support two types of values that you can choose: - -![](static/documentation/images/image205.jpg) - -You can add multiple rules, to do so click the add rule button and set another rule. Once you've set a new rule, you'll be able to choose which operator they will be connected by: `And` or `Or`. - -![](static/documentation/images/image206.jpg) - -All subsequent rules will be joined by the chosen operator. Click `Submit` to apply the filter or if you want multiple rules to be connected by different operators, use groups. - -### Groups - -To add a group, click the "add group" button. Inside the group you can create rules or groups. - -![](static/documentation/images/image207.jpg) - -If there is more than one rule in the group, they can be connected by `And` or `Or` operators. -The rule group will work as well as a separate rule outside the group and will be joined by an -operator outside the group. -You can create groups within other groups, to do so you need to click the add group button within the group. - -You can move rules and groups. To move the rule or group, drag it by the button. -To remove the rule or group, click on the `Delete` button. - -![](static/documentation/images/image208.jpg) - -If you activate the `Not` button, objects that don't match the group will be filtered out. -Click `Submit` to apply the filter. -The "Cancel" button undoes the filter. The `Clear filter` button removes the filter. - -Once applied filter automatically appears in `Recent used` list. Maximum length of the list is 10. - ---- - -## Analytics - -If your CVAT instance was created with analytics support, you can press the `Analytics` button in the dashboard -and analytics and journals will be opened in a new tab. - -![](static/documentation/images/image113.jpg) - -The analytics allows you to see how much time every user spends on each task -and how much work they did over any time range. - -![](static/documentation/images/image097.jpg) - -It also has an activity graph which can be modified with a number of users shown and a timeframe. - -![](static/documentation/images/image096.jpg) - -## Shortcuts - -Many UI elements have shortcut hints. Put your pointer to a required element to see it. - -![](static/documentation/images/image075.jpg) - -| Shortcut | Common | -| -------------------------- | -------------------------------------------------------------------------------------------------------- | -| | _Main functions_ | -| `F1` | Open/hide the list of available shortcuts | -| `F2` | Go to the settings page or go back | -| `Ctrl+S` | Go to the settings page or go back | -| `Ctrl+Z` | Cancel the latest action related with objects | -| `Ctrl+Shift+Z` or `Ctrl+Y` | Cancel undo action | -| Hold `Mouse Wheel` | To move an image frame (for example, while drawing) | -| | _Player_ | -| `F` | Go to the next frame | -| `D` | Go to the previous frame | -| `V` | Go forward with a step | -| `C` | Go backward with a step | -| `Right` | Search the next frame that satisfies to the filters
    or next frame which contain any objects | -| `Left` | Search the previous frame that satisfies to the filters
    or previous frame which contain any objects | -| `Space` | Start/stop automatic changing frames | -| `` ` `` or `~` | Focus on the element to change the current frame | -| | _Modes_ | -| `N` | Repeat the latest procedure of drawing with the same parameters | -| `M` | Activate or deactivate mode to merging shapes | -| `Alt+M` | Activate or deactivate mode to spliting shapes | -| `G` | Activate or deactivate mode to grouping shapes | -| `Shift+G` | Reset group for selected shapes (in group mode) | -| `Esc` | Cancel any active canvas mode | -| | _Image operations_ | -| `Ctrl+R` | Change image angle (add 90 degrees) | -| `Ctrl+Shift+R` | Change image angle (substract 90 degrees) | -| `Shift+B+=` | Increase brightness level for the image | -| `Shift+B+-` | Decrease brightness level for the image | -| `Shift+C+=` | Increase contrast level for the image | -| `Shift+C+-` | Decrease contrast level for the image | -| `Shift+S+=` | Increase saturation level for the image | -| `Shift+S+-` | Increase contrast level for the image | -| `Shift+G+=` | Make the grid more visible | -| `Shift+G+-` | Make the grid less visible | -| `Shift+G+Enter` | Set another color for the image grid | -| | _Operations with objects_ | -| `Ctrl` | Switch automatic bordering for polygons and polylines during drawing/editing | -| Hold `Ctrl` | When the shape is active and fix it | -| `Alt+Click` on point | Deleting a point (used when hovering over a point of polygon, polyline, points) | -| `Shift+Click` on point | Editing a shape (used when hovering over a point of polygon, polyline or points) | -| `Right-Click` on shape | Display of an object element from objects sidebar | -| `T+L` | Change locked state for all objects in the sidebar | -| `L` | Change locked state for an active object | -| `T+H` | Change hidden state for objects in the sidebar | -| `H` | Change hidden state for an active object | -| `Q` or `/` | Change occluded property for an active object | -| `Del` or `Shift+Del` | Delete an active object. Use shift to force delete of locked objects | -| `-` or `_` | Put an active object "farther" from the user (decrease z axis value) | -| `+` or `=` | Put an active object "closer" to the user (increase z axis value) | -| `Ctrl+C` | Copy shape to CVAT internal clipboard | -| `Ctrl+V` | Paste a shape from internal CVAT clipboard | -| Hold `Ctrl` while pasting | When pasting shape from the buffer for multiple pasting. | -| `Crtl+B` | Make a copy of the object on the following frames | -| `Ctrl+Num(0..9)` | Сhanges the object label if pressed while the cursor is pointed on the object 
    / changes default label if pressed while the cursor is not pointed on an object| -| | _Operations are available only for track_ | -| `K` | Change keyframe property for an active track | -| `O` | Change outside property for an active track | -| `R` | Go to the next keyframe of an active track | -| `E` | Go to the previous keyframe of an active track | -| | _Attribute annotation mode_ | -| `Up Arrow` | Go to the next attribute (up) | -| `Down Arrow` | Go to the next attribute (down) | -| `Tab` | Go to the next annotated object in current frame | -| `Shift+Tab` | Go to the previous annotated object in current frame | -| `` | Assign a corresponding value to the current attribute | diff --git a/cvat/apps/documentation/views.py b/cvat/apps/documentation/views.py deleted file mode 100644 index 0b40287fa91..00000000000 --- a/cvat/apps/documentation/views.py +++ /dev/null @@ -1,21 +0,0 @@ - -# Copyright (C) 2018 Intel Corporation -# -# SPDX-License-Identifier: MIT - -from django.shortcuts import render -import os - -def UserGuideView(request): - module_dir = os.path.dirname(__file__) - doc_path = os.path.join(module_dir, 'user_guide.md') - - return render(request, 'documentation/user_guide.html', - context={"user_guide": open(doc_path, "r").read()}) - -def XmlFormatView(request): - module_dir = os.path.dirname(__file__) - doc_path = os.path.join(module_dir, 'xml_format.md') - - return render(request, 'documentation/xml_format.html', - context={"xml_format": open(doc_path, "r").read()}) diff --git a/cvat/settings/base.py b/cvat/settings/base.py index bfcd8d652b8..7f54b3324c0 100644 --- a/cvat/settings/base.py +++ b/cvat/settings/base.py @@ -104,7 +104,6 @@ def add_ssh_keys(): 'django.contrib.messages', 'django.contrib.staticfiles', 'cvat.apps.authentication', - 'cvat.apps.documentation', 'cvat.apps.dataset_manager', 'cvat.apps.engine', 'cvat.apps.dataset_repo', diff --git a/cvat/urls.py b/cvat/urls.py index 1fa4cb50978..54e18d2cbca 100644 --- a/cvat/urls.py +++ b/cvat/urls.py @@ -26,7 +26,6 @@ path('admin/', admin.site.urls), path('', include('cvat.apps.engine.urls')), path('django-rq/', include('django_rq.urls')), - path('documentation/', include('cvat.apps.documentation.urls')), ] if apps.is_installed('cvat.apps.dataset_repo'): diff --git a/site/README.md b/site/README.md new file mode 100644 index 00000000000..9f0fd748776 --- /dev/null +++ b/site/README.md @@ -0,0 +1,63 @@ +## Basic manual for website editing + +### Edit or add documentation pages + +To edit and/or add documentation, you need to have a [GitHub](https://github.com/login) account. +To change documentation files or add a documentation page, +simply click `Edit this page` on the page you would like to edit. +If you need to add a child page, click `Create child page`. + +If you need to edit the text that has the markup [markdown](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet), +click on the `Fork this repository` button. + +Read how to edit files for github ([GitHub docs](https://docs.github.com/en/github/managing-files-in-a-repository/editing-files-in-another-users-repository)). + +Please note that files have a markup for correct display on the site: the title, the title of the link, +the weight (affects the order of files display on the sidebar) and description (optional): + + --- + title: "Title" + linkTitle: "Link Title" + weight: 1 + description: > + Description + --- + +### Start site localy + +To start the site locally, you need a recent [extended version hugo](https://github.com/gohugoio/hugo/releases) +(recommend version 0.75.0 or later). +Open the most recent release and scroll down until you find a list of Extended versions. [Read more](https://gohugo.io/getting-started/installing/#quick-install) + +Add a path to "hugo" in the "Path" environment variable. + +Clone a repository branch containing the site. For example, using a git command: + + git clone --branch + +If you want to build and/or serve your site locally, you also need to get local copies of the theme’s own submodules: + + git submodule update --init --recursive + +To build and preview your site locally, use: + + cd /cvat/site/ + hugo server + +By default, your site will be available at http://localhost:1313/ + +Instead of a "hugo server" command, you can use the "hugo" command that generates the site into a "public" folder. + +To build or update your site’s CSS resources you will need [PostCSS](https://postcss.org/) to create final assets. +To install it you must have a recent version of [NodeJS](https://nodejs.org/en/) installed on your machine, +so you can use npm, the Node package manager. +By default npm installs tools under the directory where you run [npm install](https://docs.npmjs.com/cli/v6/commands/npm-install#description): + + cd /cvat/site/ + npm ci + +Then you can build a website in the "public" folder: + + hugo + +[Read more](https://www.docsy.dev/docs/getting-started/) diff --git a/site/assets/icons/logo.svg b/site/assets/icons/logo.svg new file mode 100644 index 00000000000..45e05ffbbfc --- /dev/null +++ b/site/assets/icons/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/assets/scss/_custom.scss b/site/assets/scss/_custom.scss new file mode 100644 index 00000000000..2884f584124 --- /dev/null +++ b/site/assets/scss/_custom.scss @@ -0,0 +1,110 @@ +// Copyright (C) 2021 Intel Corporation +// +// SPDX-License-Identifier: MIT + +/* Increased left padding on the sidebar of documentation */ + +.td-sidebar-nav__section-title .td-sidebar-nav__section { + padding-left: 0.3rem; +} + +/* Main documentation page */ + +#docs section { + padding-top: 2rem; + padding-bottom: 7rem; +} + +#docs .row div { + margin-top: 1rem; +} + +/* Footer */ + +.footer-disclaimer { + font-size: 0.83rem; + line-height: 1.25; + margin-top: 0.5rem; + margin-bottom: 0.5rem; +} + +.container-fluid footer { + min-height: inherit; + padding-bottom: 0.5rem !important; + padding-top: 2rem !important; +} + +/* Icon color for temporary page */ + +#temporary-page i { + color: lightgrey; +} + +/* About page */ + +.logo-2 { + opacity: 0.8; +} + +.history #year h2 { + text-shadow: 0 0 3px rgb(27, 27, 27); +} + +.avatar:hover img { + box-shadow: 0 0 15px gray; +} + +.developer-info-list-item { + min-width: 15rem !important; +} + +.location { + width: 70%; +} + +.marker-location i { + color: lightgray; +} + +/* World map block "the team" */ + +.team-container { + margin: auto; + max-width: 1200px; +} + +.world-map-container { + width: 100%; +} + +#world-map { + z-index: 1; + width: 100%; + height: 100%; +} + +#world-map-marker { + z-index: 2; + position: absolute; + border-radius: 50%; + border: 2px white solid; + box-shadow: 2px 2px 1px gray; + max-height: 25px; +} + +#world-map-marker:hover { + border: 4px white solid; +} + +#world-map-marker:hover #tooltip div { + visibility: visible; +} + +#tooltip { + background: white; + color: #000; + padding: 4px 8px; + font-size: 13px; + border-radius: 8px; + visibility: hidden; +} diff --git a/site/assets/scss/_variables_project.scss b/site/assets/scss/_variables_project.scss new file mode 100644 index 00000000000..3ef8dd4b811 --- /dev/null +++ b/site/assets/scss/_variables_project.scss @@ -0,0 +1,17 @@ +// Copyright (C) 2021 Intel Corporation +// +// SPDX-License-Identifier: MIT + +/* + +Add styles or override variables from the theme here. + +*/ + +@import 'custom'; + +$enable-gradients: false; +$enable-rounded: true; +$enable-shadows: true; + +$info: #f1f1f1; diff --git a/site/config.toml b/site/config.toml new file mode 100644 index 00000000000..01ceb05600e --- /dev/null +++ b/site/config.toml @@ -0,0 +1,196 @@ +baseURL = "/" +title = "CVAT" +relativeURLs = true + +enableRobotsTXT = true + +# Hugo allows theme composition (and inheritance). The precedence is from left to right. +theme = ["docsy"] + +# Will give values to .Lastmod etc. +enableGitInfo = true + +# Language settings +contentDir = "content/en" +defaultContentLanguage = "en" +defaultContentLanguageInSubdir = false +# Useful when translating. +enableMissingTranslationPlaceholders = true + +disableKinds = ["taxonomy", "taxonomyTerm"] + +# Highlighting config +pygmentsCodeFences = true +pygmentsUseClasses = false +# Use the new Chroma Go highlighter in Hugo. +pygmentsUseClassic = false +#pygmentsOptions = "linenos=table" +# See https://help.farbox.com/pygments.html +pygmentsStyle = "tango" + +# Configure how URLs look like per section. +[permalinks] +blog = "/:section/:year/:month/:day/:slug/" + +## Configuration for BlackFriday markdown parser: https://github.com/russross/blackfriday +[blackfriday] +plainIDAnchors = true +hrefTargetBlank = true +angledQuotes = false +latexDashes = true + +# Image processing configuration. +[imaging] +resampleFilter = "CatmullRom" +quality = 75 +anchor = "smart" + +[[menu.main]] + name = "Try it now" + weight = 50 + url = "https://cvat.org" + +[services] +[services.googleAnalytics] +# Comment out the next line to disable GA tracking. Also disables the feature described in [params.ui.feedback]. +id = "UA-00000000-0" + +# Language configuration + +[languages] +[languages.en] +title = "" +description = "" +languageName ="English" +# Weight used for sorting. +weight = 1 + +[markup] + [markup.goldmark] + [markup.goldmark.renderer] + unsafe = true + [markup.highlight] + # See a complete list of available styles at https://xyproto.github.io/splash/docs/all.html + style = "tango" + # Uncomment if you want your chosen highlight style used for code blocks without a specified language + # guessSyntax = "true" + +# Everything below this are Site Params + +# Comment out if you don't want the "print entire section" link enabled. +[outputs] +section = ["HTML", "print"] + +[params] +intel_terms_of_use = "https://www.intel.com/content/www/us/en/legal/terms-of-use.html" +intel_privacy_notice = "https://www.intel.com/content/www/us/en/privacy/intel-privacy-notice.html" +cvat_terms_of_use = "https://cvat.org/api/v1/restrictions/terms-of-use" + +# First one is picked as the Twitter card image if not set on page. +# images = ["images/project-illustration.png"] + +# Menu title if your navbar has a versions selector to access old versions of your site. +# This menu appears only if you have at least one [params.versions] set. +version_menu = "Releases" + +# Flag used in the "version-banner" partial to decide whether to display a +# banner on every page indicating that this is an archived version of the docs. +# Set this flag to "true" if you want to display the banner. +archived_version = false + +# The version number for the version of the docs represented in this doc set. +# Used in the "version-banner" partial to display a version number for the +# current doc set. +version = "0.0" + +# A link to latest version of the docs. Used in the "version-banner" partial to +# point people to the main doc site. +url_latest_version = "https://example.com" + +# Repository configuration (URLs for in-page links to opening issues and suggesting changes) +github_repo = "https://github.com/openvinotoolkit/cvat" +# An optional link to a related project repo. For example, the sibling repository where your product code lives. +github_project_repo = "https://github.com/openvinotoolkit/cvat" + +# Specify a value here if your content directory is not in your repo's root directory +# github_subdir = "" + +# Uncomment this if you have a newer GitHub repo with "main" as the default branch, +# or specify a new value if you want to reference another branch in your GitHub links +github_branch = "develop" + +# Google Custom Search Engine ID. Remove or comment out to disable search. +# gcs_engine_id = "011737558837375720776:fsdu1nryfng" + +# Enable Algolia DocSearch +algolia_docsearch = false + +# Enable Lunr.js offline search +offlineSearch = true + +# Enable syntax highlighting and copy buttons on code blocks with Prism +prism_syntax_highlighting = false + +# User interface configuration +[params.ui] +# Enable to show the side bar menu in its compact state. +sidebar_menu_compact = true +ul_show = 2 +# Set to true to disable breadcrumb navigation. +breadcrumb_disable = false +# Set to true to hide the sidebar search box (the top nav search box will still be displayed if search is enabled) +sidebar_search_disable = true +# Set to false if you don't want to display a logo (/assets/icons/logo.svg) in the top nav bar +navbar_logo = true +# Set to true to disable the About link in the site footer +footer_about_disable = false + +# Adds a H2 section titled "Feedback" to the bottom of each doc. The responses are sent to Google Analytics as events. +# This feature depends on [services.googleAnalytics] and will be disabled if "services.googleAnalytics.id" is not set. +# If you want this feature, but occasionally need to remove the "Feedback" section from a single page, +# add "hide_feedback: true" to the page's front matter. +[params.ui.feedback] +enable = false +# The responses that the user sees after clicking "yes" (the page was helpful) or "no" (the page was not helpful). +yes = 'Glad to hear it! Please
    tell us how we can improve.' +no = 'Sorry to hear that. Please tell us how we can improve.' + +# Adds a reading time to the top of each doc. +# If you want this feature, but occasionally need to remove the Reading time from a single page, +# add "hide_readingtime: true" to the page's front matter +[params.ui.readingtime] +enable = false + +[params.links] +# End user relevant links. These will show up on left side of footer and in the community page if you have one. +[[params.links.user]] + name ="Gitter public chat" + url = "https://gitter.im/opencv-cvat/public" + icon = "fab fa-gitter" + desc = "Join our Gitter channel for community support." +[[params.links.user]] + name = "Stack Overflow" + url = "https://stackoverflow.com/search?q=%23cvat" + icon = "fab fa-stack-overflow" + desc = "Practical questions and curated answers" +[[params.links.user]] + name = "YouTube" + url = "https://www.youtube.com/user/nmanovic" + icon = "fab fa-youtube" + desc = "Practical questions and curated answers" +# Developer relevant links. These will show up on right side of footer and in the community page if you have one. +[[params.links.developer]] + name = "GitHub" + url = "https://github.com/openvinotoolkit/cvat" + icon = "fab fa-github" + desc = "Development takes place here!" +[[params.links.developer]] + name = "Forum on Intel Developer Zone" + url = "https://community.intel.com/t5/Intel-Distribution-of-OpenVINO/bd-p/distribution-openvino-toolkit" + icon = "fas fa-envelope" + desc = "Development takes place here!" +[[params.links.developer]] + name ="Gitter developers chat" + url = "https://gitter.im/opencv-cvat/dev" + icon = "fab fa-gitter" + desc = "Join our Gitter channel for community support." diff --git a/site/content/en/_index.html b/site/content/en/_index.html new file mode 100644 index 00000000000..6d8c83fc678 --- /dev/null +++ b/site/content/en/_index.html @@ -0,0 +1,22 @@ ++++ +title = "CVAT" +linkTitle = "CVAT" ++++ + +{{< blocks/section height="full" color="docs" >}} + +
    +
    + +
    +
    +

    This page is in development.

    +
    +
    +

    + Visit our GitHub repository. +

    +
    +
    + +{{< /blocks/section >}} diff --git a/site/content/en/about/_index.html b/site/content/en/about/_index.html new file mode 100644 index 00000000000..e35dca2718d --- /dev/null +++ b/site/content/en/about/_index.html @@ -0,0 +1,180 @@ +--- +title: "About CVAT" +linkTitle: "About" +menu: + main: + weight: 50 +--- + + +{{< blocks/cover image_anchor="center" height="min" >}} +
    + +

    About Us

    +

    CVAT was designed to provide users with a set of convenient instruments for annotating digital images and videos.
    CVAT supports supervised machine learning tasks pertaining to object detection, image classification, image segmentation and 3D data annotation. It allows users to annotate images with four types of shapes: boxes, polygons (both generally and for segmentation tasks), polylines (e.g., for annotation of markings on roads),
    and points (e.g., for annotation of face landmarks or pose estimation).

    +
    +{{< /blocks/cover >}} + + +{{< blocks/section height="auto" color="info" >}} +
    +

    Data scientists need annotated data (and lots of it) to train the deep neural networks (DNNs) at the core of AI workflows. Obtaining annotated data or annotating data yourself is a challenging and time-consuming process.
    For example, it took about 3,100 total hours for members of Intel’s own data annotation team to annotate more than 769,000 objects for just one of our algorithms. To help solve this challenge, Intel is conducting research to find better methods of data annotation and deliver tools that help developers do the same.

    +
    +
    +
    +

    2017 + +

    + First version of CVAT was created and open sourced. +
    +
    +

    2018 + +

    + Publication on GitHub. +
    +
    +

    2020 + +

    + Release version 1.0.0. Major update.
    Opening public demo-server cvat.org.
    +
    +
    +

    2020 + +

    + Release version 1.1.0.
    Adding DL models.
    +
    +
    +

    2021 + +

    + Release version 1.3.0.
    Adding CVAT-3D.
    +
    +
    +

    2022 + +

    + Further development... +
    +
    +
    +
    + +{{< /blocks/section >}} + + +{{< blocks/section height="auto" color="info" >}} +

    The Team

    +
    +
    +
    + + Boris Sekachev + Nikita Manovich + Andrey Zhavoronkov + Maxim Zhiltsov + Andrey Chernov + Timur Osmanov +
    +
    +
    + +{{< /blocks/section >}} + + +{{< blocks/section height="min" color="info" >}} +

    Leadership:

    +
    +
    +
    +
    + +
    +
    +

    Nikita Manovich

    + Deep Learning Manager +
    +
    +
    +
    + +
    +
    +

    Andrey Zhavoronkov

    + Deep Learning Software Engineer +
    +
    +
    +
    + +
    +
    +

    Boris Sekachev

    + Deep Learning Software Engineer +
    +
    +
    +
    +
    +
    +

    Maxim Zhiltsov

    + Deep Learning Software Engineer +
    +
    +
    +
    +
    +
    +

    Andrey Chernov

    + Program/Project Manager +
    +
    +
    +
    +
    +
    +

    Timur Osmanov

    + Data Analyst +
    +
    +
    + + +{{< /blocks/section >}} + + +{{< blocks/section height="auto" color="docs" >}} +

    Contact Us:

    +
    + +
    +
    + +

    Russia, Nizhny Novgorod, Turgeneva street 30 (campus TGV)

    +
    +

    + Feedback from users helps Intel determine future direction for CVAT’s development. We hope to improve the tool’s user experience, feature set, stability, automation features and ability to be integrated with other services and encourage members of the community to take an active part in CVAT’s development. +

    + +
    + + +
    + +
    +{{< /blocks/section >}} diff --git a/site/content/en/about/featured-background.jpg b/site/content/en/about/featured-background.jpg new file mode 100644 index 0000000000000000000000000000000000000000..74b2130d3d9fcf0e7ca641af4a155c92cfa342cc GIT binary patch literal 635151 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

    Q&0+)2@)uwCZ-QEoOrAkff|`!g1dm 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 otXVfCP+?4FSn=iLeoagY^^z0IL8F)TuxNN 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Ν=52=xr3W#@*egcp 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

    - }> + }>
    diff --git a/cvat-ui/src/components/projects-page/project-list.tsx b/cvat-ui/src/components/projects-page/project-list.tsx index 1d7138902da..494b501f04d 100644 --- a/cvat-ui/src/components/projects-page/project-list.tsx +++ b/cvat-ui/src/components/projects-page/project-list.tsx @@ -1,4 +1,4 @@ -// Copyright (C) 2020 Intel Corporation +// Copyright (C) 2020-2021 Intel Corporation // // SPDX-License-Identifier: MIT @@ -8,14 +8,14 @@ import { Row, Col } from 'antd/lib/grid'; import Pagination from 'antd/lib/pagination'; import { getProjectsAsync } from 'actions/projects-actions'; -import { CombinedState } from 'reducers/interfaces'; +import { CombinedState, Project } from 'reducers/interfaces'; import ProjectItem from './project-item'; export default function ProjectListComponent(): JSX.Element { const dispatch = useDispatch(); const projectsCount = useSelector((state: CombinedState) => state.projects.count); const { page } = useSelector((state: CombinedState) => state.projects.gettingQuery); - let projectInstances = useSelector((state: CombinedState) => state.projects.current); + const projectInstances = useSelector((state: CombinedState) => state.projects.current); const gettingQuery = useSelector((state: CombinedState) => state.projects.gettingQuery); function changePage(p: number): void { @@ -27,7 +27,7 @@ export default function ProjectListComponent(): JSX.Element { ); } - projectInstances = projectInstances.reduce((rows, key, index) => { + const projects = projectInstances.reduce((rows, key, index) => { if (index % 4 === 0) { rows.push([key]); } else { @@ -38,14 +38,14 @@ export default function ProjectListComponent(): JSX.Element { return ( <> - + - {projectInstances.map( - (row: any[]): JSX.Element => ( - - {row.map((instance: any) => ( - - + {projects.map( + (row: Project[]): JSX.Element => ( + + {row.map((project: Project) => ( + + ))} diff --git a/cvat-ui/src/components/projects-page/styles.scss b/cvat-ui/src/components/projects-page/styles.scss index 44fb6615870..dd60013d227 100644 --- a/cvat-ui/src/components/projects-page/styles.scss +++ b/cvat-ui/src/components/projects-page/styles.scss @@ -117,3 +117,7 @@ object-fit: cover; } } + +.cvat-project-list-content { + padding-bottom: $grid-unit-size; +} diff --git a/cvat-ui/src/reducers/interfaces.ts b/cvat-ui/src/reducers/interfaces.ts index 841a0ef612d..fc8a40340d9 100644 --- a/cvat-ui/src/reducers/interfaces.ts +++ b/cvat-ui/src/reducers/interfaces.ts @@ -30,10 +30,13 @@ export interface ProjectsQuery { owner: string | null; name: string | null; status: string | null; - [key: string]: string | number | null | undefined; + [key: string]: string | boolean | number | null | undefined; } -export type Project = any; +export interface Project { + instance: any; + preview: string; +} export interface ProjectsState { initialized: boolean; diff --git a/cvat-ui/src/reducers/projects-reducer.ts b/cvat-ui/src/reducers/projects-reducer.ts index d6a7c1eee49..d8fba25d88c 100644 --- a/cvat-ui/src/reducers/projects-reducer.ts +++ b/cvat-ui/src/reducers/projects-reducer.ts @@ -1,4 +1,4 @@ -// Copyright (C) 2020 Intel Corporation +// Copyright (C) 2020-2021 Intel Corporation // // SPDX-License-Identifier: MIT @@ -50,12 +50,19 @@ export default (state: ProjectsState = defaultState, action: AnyAction): Project current: [], }; case ProjectsActionTypes.GET_PROJECTS_SUCCESS: { + const combinedWithPreviews = action.payload.array.map( + (project: any, index: number): Project => ({ + instance: project, + preview: action.payload.previews[index], + }), + ); + return { ...state, initialized: true, fetching: false, count: action.payload.count, - current: action.payload.array, + current: combinedWithPreviews, }; } case ProjectsActionTypes.GET_PROJECTS_FAILED: { @@ -110,13 +117,11 @@ export default (state: ProjectsState = defaultState, action: AnyAction): Project return { ...state, current: state.current.map( - (project): Project => { - if (project.id === action.payload.project.id) { - return action.payload.project; - } - - return project; - }, + (project): Project => ({ + ...project, + instance: project.instance.id === action.payload.project.id ? + action.payload.project : project.instance, + }), ), }; } @@ -124,13 +129,11 @@ export default (state: ProjectsState = defaultState, action: AnyAction): Project return { ...state, current: state.current.map( - (project): Project => { - if (project.id === action.payload.project.id) { - return action.payload.project; - } - - return project; - }, + (project): Project => ({ + ...project, + instance: project.instance.id === action.payload.project.id ? + action.payload.project : project.instance, + }), ), }; } diff --git a/cvat/apps/engine/serializers.py b/cvat/apps/engine/serializers.py index 15739bbafee..4f3495594a7 100644 --- a/cvat/apps/engine/serializers.py +++ b/cvat/apps/engine/serializers.py @@ -510,11 +510,9 @@ class Meta: def to_representation(self, instance): response = super().to_representation(instance) - subsets = set() - for task in instance.tasks.all(): - if task.subset: - subsets.add(task.subset) - response['task_subsets'] = list(subsets) + task_subsets = set(instance.tasks.values_list('subset', flat=True)) + task_subsets.discard('') + response['task_subsets'] = list(task_subsets) return response class ProjectSerializer(ProjectWithoutTaskSerializer): From d9533ffc06c0b9b78069c6c66cf8dd8e126896f6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 May 2021 14:16:51 +0300 Subject: [PATCH 011/123] Bump browserslist from 4.6.6 to 4.16.6 in /cvat-canvas (#3233) Bumps [browserslist](https://github.com/browserslist/browserslist) from 4.6.6 to 4.16.6. - [Release notes](https://github.com/browserslist/browserslist/releases) - [Changelog](https://github.com/browserslist/browserslist/blob/main/CHANGELOG.md) - [Commits](https://github.com/browserslist/browserslist/compare/4.6.6...4.16.6) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- cvat-canvas/package-lock.json | 101 +++++++++++++--------------------- 1 file changed, 39 insertions(+), 62 deletions(-) diff --git a/cvat-canvas/package-lock.json b/cvat-canvas/package-lock.json index 4419de0763b..0028f3d197f 100644 --- a/cvat-canvas/package-lock.json +++ b/cvat-canvas/package-lock.json @@ -1995,17 +1995,6 @@ "postcss-value-parser": "^4.0.2" }, "dependencies": { - "browserslist": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.2.tgz", - "integrity": "sha512-+M4oeaTplPm/f1pXDw84YohEv7B1i/2Aisei8s4s6k3QsoSHa7i5sz8u/cGQkkatCPxMASKxPualR4wwYgVboA==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001015", - "electron-to-chromium": "^1.3.322", - "node-releases": "^1.1.42" - } - }, "caniuse-lite": { "version": "1.0.30001016", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001016.tgz", @@ -2015,14 +2004,12 @@ "electron-to-chromium": { "version": "1.3.322", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.322.tgz", - "integrity": "sha512-Tc8JQEfGQ1MzfSzI/bTlSr7btJv/FFO7Yh6tanqVmIWOuNCu6/D1MilIEgLtmWqIrsv+o4IjpLAhgMBr/ncNAA==", - "dev": true + "integrity": "sha512-Tc8JQEfGQ1MzfSzI/bTlSr7btJv/FFO7Yh6tanqVmIWOuNCu6/D1MilIEgLtmWqIrsv+o4IjpLAhgMBr/ncNAA==" }, "node-releases": { "version": "1.1.44", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.44.tgz", "integrity": "sha512-NwbdvJyR7nrcGrXvKAvzc5raj/NkoJudkarh2yIpJ4t0NH4aqjUDz/486P+ynIW5eokKOfzGNRdYoLfBlomruw==", - "dev": true, "requires": { "semver": "^6.3.0" } @@ -2041,8 +2028,7 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, "source-map": { "version": "0.6.1", @@ -2367,14 +2353,42 @@ } }, "browserslist": { - "version": "4.6.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.6.tgz", - "integrity": "sha512-D2Nk3W9JL9Fp/gIcWei8LrERCS+eXu9AM5cfXA8WEZ84lFks+ARnZ0q/R69m2SV3Wjma83QDDPxsNKXUwdIsyA==", + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000984", - "electron-to-chromium": "^1.3.191", - "node-releases": "^1.1.25" + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" + }, + "dependencies": { + "caniuse-lite": { + "version": "1.0.30001228", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz", + "integrity": "sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A==", + "dev": true + }, + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.737", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.737.tgz", + "integrity": "sha512-P/B84AgUSQXaum7a8m11HUsYL8tj9h/Pt5f7Hg7Ty6bm5DxlFq+e5+ouHUoNQMsKDJ7u4yGfI8mOErCmSH9wyg==", + "dev": true + }, + "node-releases": { + "version": "1.1.72", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz", + "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==", + "dev": true + } } }, "buffer-from": { @@ -2811,12 +2825,6 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "colorette": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", - "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", - "dev": true - }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -3501,12 +3509,6 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, - "electron-to-chromium": { - "version": "1.3.199", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.199.tgz", - "integrity": "sha512-gachlDdHSK47s0N2e58GH9HMC6Z4ip0SfmYUa5iEbE50AKaOUXysaJnXMfKj0xB245jWbYcyFSH+th3rqsF8hA==", - "dev": true - }, "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", @@ -6738,15 +6740,6 @@ } } }, - "node-releases": { - "version": "1.1.25", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.25.tgz", - "integrity": "sha512-fI5BXuk83lKEoZDdH3gRhtsNgh05/wZacuXkgbiYkceE7+QIMXOg98n9ZV7mz27B+kFHnqHcUpscZZlGRSmTpQ==", - "dev": true, - "requires": { - "semver": "^5.3.0" - } - }, "node-sass": { "version": "4.14.1", "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz", @@ -10461,30 +10454,15 @@ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true }, - "browserslist": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", - "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001181", - "colorette": "^1.2.1", - "electron-to-chromium": "^1.3.649", - "escalade": "^3.1.1", - "node-releases": "^1.1.70" - } - }, "caniuse-lite": { "version": "1.0.30001185", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001185.tgz", - "integrity": "sha512-Fpi4kVNtNvJ15H0F6vwmXtb3tukv3Zg3qhKkOGUq7KJ1J6b9kf4dnNgtEAFXhRsJo0gNj9W60+wBvn0JcTvdTg==", - "dev": true + "integrity": "sha512-Fpi4kVNtNvJ15H0F6vwmXtb3tukv3Zg3qhKkOGUq7KJ1J6b9kf4dnNgtEAFXhRsJo0gNj9W60+wBvn0JcTvdTg==" }, "electron-to-chromium": { "version": "1.3.654", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.654.tgz", - "integrity": "sha512-Zy2gc/c8KYFg2GkNr7Ruzh5tPEZpFm7EyXqZTFasm1YRDJtpyBRGaOuM0H3t6SuIP53qX4kNmtO9t0WjhBjE9A==", - "dev": true + "integrity": "sha512-Zy2gc/c8KYFg2GkNr7Ruzh5tPEZpFm7EyXqZTFasm1YRDJtpyBRGaOuM0H3t6SuIP53qX4kNmtO9t0WjhBjE9A==" }, "enhanced-resolve": { "version": "5.7.0", @@ -10559,8 +10537,7 @@ "node-releases": { "version": "1.1.70", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.70.tgz", - "integrity": "sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw==", - "dev": true + "integrity": "sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw==" }, "schema-utils": { "version": "3.0.0", From aa0038a9e8590daa76008e2e396e50308c1afacd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 May 2021 09:29:01 +0300 Subject: [PATCH 012/123] Bump browserslist from 4.7.2 to 4.16.6 in /cvat-ui (#3236) Bumps [browserslist](https://github.com/browserslist/browserslist) from 4.7.2 to 4.16.6. - [Release notes](https://github.com/browserslist/browserslist/releases) - [Changelog](https://github.com/browserslist/browserslist/blob/main/CHANGELOG.md) - [Commits](https://github.com/browserslist/browserslist/compare/4.7.2...4.16.6) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- cvat-ui/package-lock.json | 168 ++++++++------------------------------ 1 file changed, 36 insertions(+), 132 deletions(-) diff --git a/cvat-ui/package-lock.json b/cvat-ui/package-lock.json index b3a5bce157d..b8bc58acf88 100644 --- a/cvat-ui/package-lock.json +++ b/cvat-ui/package-lock.json @@ -2616,28 +2616,15 @@ "postcss-value-parser": "^4.0.2" }, "dependencies": { - "browserslist": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.2.tgz", - "integrity": "sha512-+M4oeaTplPm/f1pXDw84YohEv7B1i/2Aisei8s4s6k3QsoSHa7i5sz8u/cGQkkatCPxMASKxPualR4wwYgVboA==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001015", - "electron-to-chromium": "^1.3.322", - "node-releases": "^1.1.42" - } - }, "electron-to-chromium": { "version": "1.3.322", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.322.tgz", - "integrity": "sha512-Tc8JQEfGQ1MzfSzI/bTlSr7btJv/FFO7Yh6tanqVmIWOuNCu6/D1MilIEgLtmWqIrsv+o4IjpLAhgMBr/ncNAA==", - "dev": true + "integrity": "sha512-Tc8JQEfGQ1MzfSzI/bTlSr7btJv/FFO7Yh6tanqVmIWOuNCu6/D1MilIEgLtmWqIrsv+o4IjpLAhgMBr/ncNAA==" }, "node-releases": { "version": "1.1.42", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.42.tgz", "integrity": "sha512-OQ/ESmUqGawI2PRX+XIRao44qWYBBfN54ImQYdWVTQqUckuejOg76ysSqDBK8NG3zwySRVnX36JwDQ6x+9GxzA==", - "dev": true, "requires": { "semver": "^6.3.0" } @@ -2656,8 +2643,7 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, "source-map": { "version": "0.6.1", @@ -3078,14 +3064,30 @@ } }, "browserslist": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.2.tgz", - "integrity": "sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw==", + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001004", - "electron-to-chromium": "^1.3.295", - "node-releases": "^1.1.38" + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" + }, + "dependencies": { + "electron-to-chromium": { + "version": "1.3.738", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.738.tgz", + "integrity": "sha512-vCMf4gDOpEylPSLPLSwAEsz+R3ShP02Y3cAKMZvTqule3XcPp7tgc/0ESI7IS6ZeyBlGClE50N53fIOkcIVnpw==", + "dev": true + }, + "node-releases": { + "version": "1.1.72", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz", + "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==", + "dev": true + } } }, "buffer": { @@ -3462,6 +3464,12 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -4999,7 +5007,6 @@ "@babel/plugin-transform-typeof-symbol": "^7.2.0", "@babel/plugin-transform-unicode-regex": "^7.4.4", "@babel/types": "^7.5.5", - "browserslist": "^4.6.0", "core-js-compat": "^3.1.1", "invariant": "^2.2.2", "js-levenshtein": "^1.1.3", @@ -5879,7 +5886,6 @@ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.3.tgz", "integrity": "sha512-8T5Y1C5Iyj6PgkPSFd0ODvK9DIleuPKUPYniNxybS47g2k2wFgLZ46lGQHlBuGKIAEV8fbCDfKCCRS1tvOgc3Q==", "requires": { - "browserslist": "^4.8.0", "caniuse-lite": "^1.0.30001012", "chalk": "^2.4.2", "normalize-range": "^0.1.2", @@ -5888,16 +5894,6 @@ "postcss-value-parser": "^4.0.2" }, "dependencies": { - "browserslist": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.2.tgz", - "integrity": "sha512-+M4oeaTplPm/f1pXDw84YohEv7B1i/2Aisei8s4s6k3QsoSHa7i5sz8u/cGQkkatCPxMASKxPualR4wwYgVboA==", - "requires": { - "caniuse-lite": "^1.0.30001015", - "electron-to-chromium": "^1.3.322", - "node-releases": "^1.1.42" - } - }, "caniuse-lite": { "version": "1.0.30001016", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001016.tgz", @@ -6305,16 +6301,6 @@ "pako": "~1.0.5" } }, - "browserslist": { - "version": "4.6.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.6.tgz", - "integrity": "sha512-D2Nk3W9JL9Fp/gIcWei8LrERCS+eXu9AM5cfXA8WEZ84lFks+ARnZ0q/R69m2SV3Wjma83QDDPxsNKXUwdIsyA==", - "requires": { - "caniuse-lite": "^1.0.30000984", - "electron-to-chromium": "^1.3.191", - "node-releases": "^1.1.25" - } - }, "buffer": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", @@ -6925,7 +6911,6 @@ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.1.4.tgz", "integrity": "sha512-Z5zbO9f1d0YrJdoaQhphVAnKPimX92D6z8lCGphH89MNRxlL1prI9ExJPqVwP0/kgkQCv8c4GJGT8X16yUncOg==", "requires": { - "browserslist": "^4.6.2", "core-js-pure": "3.1.4", "semver": "^6.1.1" }, @@ -11823,7 +11808,6 @@ "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", "requires": { "autoprefixer": "^9.6.1", - "browserslist": "^4.6.4", "caniuse-lite": "^1.0.30000981", "css-blank-pseudo": "^0.1.4", "css-has-pseudo": "^0.10.0", @@ -14468,18 +14452,6 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" }, - "browserslist": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", - "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", - "requires": { - "caniuse-lite": "^1.0.30001181", - "colorette": "^1.2.1", - "electron-to-chromium": "^1.3.649", - "escalade": "^3.1.1", - "node-releases": "^1.1.70" - } - }, "caniuse-lite": { "version": "1.0.30001185", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001185.tgz", @@ -16032,7 +16004,6 @@ "@babel/plugin-transform-typeof-symbol": "^7.2.0", "@babel/plugin-transform-unicode-regex": "^7.4.4", "@babel/types": "^7.5.5", - "browserslist": "^4.6.0", "core-js-compat": "^3.1.1", "invariant": "^2.2.2", "js-levenshtein": "^1.1.3", @@ -16665,7 +16636,6 @@ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.3.tgz", "integrity": "sha512-8T5Y1C5Iyj6PgkPSFd0ODvK9DIleuPKUPYniNxybS47g2k2wFgLZ46lGQHlBuGKIAEV8fbCDfKCCRS1tvOgc3Q==", "requires": { - "browserslist": "^4.8.0", "caniuse-lite": "^1.0.30001012", "chalk": "^2.4.2", "normalize-range": "^0.1.2", @@ -16674,16 +16644,6 @@ "postcss-value-parser": "^4.0.2" }, "dependencies": { - "browserslist": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.2.tgz", - "integrity": "sha512-+M4oeaTplPm/f1pXDw84YohEv7B1i/2Aisei8s4s6k3QsoSHa7i5sz8u/cGQkkatCPxMASKxPualR4wwYgVboA==", - "requires": { - "caniuse-lite": "^1.0.30001015", - "electron-to-chromium": "^1.3.322", - "node-releases": "^1.1.42" - } - }, "camera-controls": { "version": "1.25.3", "resolved": "https://registry.npmjs.org/camera-controls/-/camera-controls-1.25.3.tgz", @@ -17049,16 +17009,6 @@ "pako": "~1.0.5" } }, - "browserslist": { - "version": "4.6.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.6.tgz", - "integrity": "sha512-D2Nk3W9JL9Fp/gIcWei8LrERCS+eXu9AM5cfXA8WEZ84lFks+ARnZ0q/R69m2SV3Wjma83QDDPxsNKXUwdIsyA==", - "requires": { - "caniuse-lite": "^1.0.30000984", - "electron-to-chromium": "^1.3.191", - "node-releases": "^1.1.25" - } - }, "buffer": { "version": "4.9.2", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", @@ -17647,7 +17597,6 @@ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.1.4.tgz", "integrity": "sha512-Z5zbO9f1d0YrJdoaQhphVAnKPimX92D6z8lCGphH89MNRxlL1prI9ExJPqVwP0/kgkQCv8c4GJGT8X16yUncOg==", "requires": { - "browserslist": "^4.6.2", "core-js-pure": "3.1.4", "semver": "^6.1.1" }, @@ -21749,7 +21698,6 @@ "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", "requires": { "autoprefixer": "^9.6.1", - "browserslist": "^4.6.4", "caniuse-lite": "^1.0.30000981", "css-blank-pseudo": "^0.1.4", "css-has-pseudo": "^0.10.0", @@ -24590,7 +24538,6 @@ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz", "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==", "requires": { - "browserslist": "^4.12.0", "invariant": "^2.2.4", "semver": "^5.5.0" } @@ -25017,7 +24964,6 @@ "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==", "requires": { "@babel/compat-data": "^7.10.4", - "browserslist": "^4.12.0", "invariant": "^2.2.4", "levenary": "^1.1.1", "semver": "^5.5.0" @@ -25826,7 +25772,6 @@ "@babel/plugin-transform-unicode-regex": "^7.10.4", "@babel/preset-modules": "^0.1.3", "@babel/types": "^7.11.0", - "browserslist": "^4.12.0", "core-js-compat": "^3.6.2", "invariant": "^2.2.2", "levenary": "^1.1.1", @@ -29174,17 +29119,6 @@ "pako": "~1.0.5" } }, - "browserslist": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.13.0.tgz", - "integrity": "sha512-MINatJ5ZNrLnQ6blGvePd/QOz9Xtu+Ne+x29iQSCHfkU5BugKVJwZKn/iiL8UbpIpa3JhviKjz+XxMo0m2caFQ==", - "requires": { - "caniuse-lite": "^1.0.30001093", - "electron-to-chromium": "^1.3.488", - "escalade": "^3.0.1", - "node-releases": "^1.1.58" - } - }, "bser": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", @@ -29620,7 +29554,6 @@ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", "requires": { - "browserslist": "^4.8.5", "semver": "7.0.0" }, "dependencies": { @@ -30438,7 +30371,6 @@ "@babel/plugin-transform-typeof-symbol": "^7.2.0", "@babel/plugin-transform-unicode-regex": "^7.6.2", "@babel/types": "^7.6.3", - "browserslist": "^4.6.0", "core-js-compat": "^3.1.1", "invariant": "^2.2.2", "js-levenshtein": "^1.1.3", @@ -31198,16 +31130,6 @@ "pako": "~1.0.5" } }, - "browserslist": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.1.tgz", - "integrity": "sha512-QtULFqKIAtiyNx7NhZ/p4rB8m3xDozVo/pi5VgTlADLF2tNigz/QH+v0m5qhn7XfHT7u+607NcCNOnC0HZAlMg==", - "requires": { - "caniuse-lite": "^1.0.30000999", - "electron-to-chromium": "^1.3.284", - "node-releases": "^1.1.36" - } - }, "buffer": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", @@ -31714,7 +31636,6 @@ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.3.2.tgz", "integrity": "sha512-gfiK4QnNXhnnHVOIZst2XHdFfdMTPxtR0EGs0TdILMlGIft+087oH6/Sw2xTTIjpWXC9vEwsJA8VG3XTGcmO5g==", "requires": { - "browserslist": "^4.7.0", "semver": "^6.3.0" }, "dependencies": { @@ -47384,12 +47305,6 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, - "electron-to-chromium": { - "version": "1.3.296", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.296.tgz", - "integrity": "sha512-s5hv+TSJSVRsxH190De66YHb50pBGTweT9XGWYu/LMR20KX6TsjFzObo36CjVAzM+PUeeKSBRtm/mISlCzeojQ==", - "dev": true - }, "elliptic": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", @@ -47571,6 +47486,12 @@ "is-symbol": "^1.0.2" } }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -51838,23 +51759,6 @@ } } }, - "node-releases": { - "version": "1.1.39", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.39.tgz", - "integrity": "sha512-8MRC/ErwNCHOlAFycy9OPca46fQYUjbJRDcZTHVWIGXIjYLM73k70vv3WkYutVnM4cCo4hE0MqBVVZjP6vjISA==", - "dev": true, - "requires": { - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, "node-sass": { "version": "4.14.1", "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz", From d14c26a32f35c75a899a0142bf93c81ddf502f4e Mon Sep 17 00:00:00 2001 From: Snyk bot Date: Wed, 26 May 2021 09:29:24 +0300 Subject: [PATCH 013/123] fix: upgrade @types/react from 16.14.5 to 16.14.6 (#3237) Snyk has created this PR to upgrade @types/react from 16.14.5 to 16.14.6. See this package in npm: https://www.npmjs.com/package/@types/react See this project in Snyk: https://app.snyk.io/org/cvat/project/c1f463ee-3776-44c4-b0fa-cd2254d0a094?utm_source=github&utm_medium=upgrade-pr --- cvat-ui/package-lock.json | 12 ++++++------ cvat-ui/package.json | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/cvat-ui/package-lock.json b/cvat-ui/package-lock.json index b8bc58acf88..19d8f033712 100644 --- a/cvat-ui/package-lock.json +++ b/cvat-ui/package-lock.json @@ -1283,9 +1283,9 @@ "dev": true }, "@types/react": { - "version": "16.14.5", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.5.tgz", - "integrity": "sha512-YRRv9DNZhaVTVRh9Wmmit7Y0UFhEVqXqCSw3uazRWMxa2x85hWQZ5BN24i7GXZbaclaLXEcodEeIHsjBA8eAMw==", + "version": "16.14.6", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.6.tgz", + "integrity": "sha512-Ol/aFKune+P0FSFKIgf+XbhGzYGyz0p7g5befSt4rmbzfGLaZR0q7jPew9k7d3bvrcuaL8dPy9Oz3XGZmf9n+w==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -4023,9 +4023,9 @@ } }, "csstype": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.7.tgz", - "integrity": "sha512-KxnUB0ZMlnUWCsx2Z8MUsr6qV6ja1w9ArPErJaJaF8a5SOWoHLIszeCTKGRGRgtLgYrs1E8CHkNSP1VZTTPc9g==" + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz", + "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" }, "currently-unhandled": { "version": "0.4.1", diff --git a/cvat-ui/package.json b/cvat-ui/package.json index a3df3ed409b..5d6b979c711 100644 --- a/cvat-ui/package.json +++ b/cvat-ui/package.json @@ -51,7 +51,7 @@ "@ant-design/icons": "^4.6.2", "@types/lodash": "^4.14.168", "@types/platform": "^1.3.3", - "@types/react": "^16.14.5", + "@types/react": "^16.14.6", "@types/react-color": "^3.0.4", "@types/react-dom": "^16.9.12", "@types/react-redux": "^7.1.16", From 11d967d2087d2eecf331cf445ea49bdcff77234f Mon Sep 17 00:00:00 2001 From: qztseng Date: Wed, 26 May 2021 22:19:10 +0800 Subject: [PATCH 014/123] add cli kwargs for image_quality and frame_step when creating task (#3176) * add cli kwargs for image_quality and frame_step when creating task * add **kwargs to the tasks_data function call * add the corresponding options into argument parser * Update core.py update license header * update license header * fix definition.py help text --- utils/cli/core/core.py | 13 ++++++++++--- utils/cli/core/definition.py | 17 +++++++++++++++-- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/utils/cli/core/core.py b/utils/cli/core/core.py index facd17d407f..5f126a04374 100644 --- a/utils/cli/core/core.py +++ b/utils/cli/core/core.py @@ -1,4 +1,4 @@ -# Copyright (C) 2020 Intel Corporation +# Copyright (C) 2020-2021 Intel Corporation # # SPDX-License-Identifier: MIT @@ -23,7 +23,7 @@ def __init__(self, session, api, credentials): self.session = session self.login(credentials) - def tasks_data(self, task_id, resource_type, resources): + def tasks_data(self, task_id, resource_type, resources, **kwargs): """ Add local, remote, or shared files to an existing task. """ url = self.api.tasks_id_data(task_id) data = {} @@ -35,6 +35,13 @@ def tasks_data(self, task_id, resource_type, resources): elif resource_type == ResourceType.SHARE: data = {'server_files[{}]'.format(i): f for i, f in enumerate(resources)} data['image_quality'] = 50 + + ## capture additional kwargs + if 'image_quality' in kwargs: + data['image_quality'] = kwargs.get('image_quality') + if 'frame_step' in kwargs: + data['frame_filter'] = f"step={kwargs.get('frame_step')}" + response = self.session.post(url, data=data, files=files) response.raise_for_status() @@ -85,7 +92,7 @@ def tasks_create(self, name, labels, overlap, segment_size, bug, resource_type, response_json = response.json() log.info('Created task ID: {id} NAME: {name}'.format(**response_json)) task_id = response_json['id'] - self.tasks_data(task_id, resource_type, resources) + self.tasks_data(task_id, resource_type, resources, **kwargs) if annotation_path != '': url = self.api.tasks_id_status(task_id) diff --git a/utils/cli/core/definition.py b/utils/cli/core/definition.py index 48e11456916..db44551e513 100644 --- a/utils/cli/core/definition.py +++ b/utils/cli/core/definition.py @@ -181,7 +181,20 @@ def argparse(s): action='store_true', help='using lfs for dataset repository (default: %(default)s)' ) - +task_create_parser.add_argument( + '--image_quality', + default=70, + type=int, + help='''set the image quality option in the advanced configuration + when creating tasks.(default: %(default)s)''' +) +task_create_parser.add_argument( + '--frame_step', + default=1, + type=int, + help='''set the frame step option in the advanced configuration + when uploading image series or videos (default: %(default)s)''' +) ####################################################################### # Delete ####################################################################### @@ -296,4 +309,4 @@ def argparse(s): type=str, default='CVAT 1.1', help='annotation format (default: %(default)s)' -) \ No newline at end of file +) From f74a496733bf0ca308ae7007aa9ec629808a94d5 Mon Sep 17 00:00:00 2001 From: manasars <44188718+manasars@users.noreply.github.com> Date: Thu, 27 May 2021 16:28:12 +0530 Subject: [PATCH 015/123] CVAT 3D Milestone-5 (#3079) 3D bounding box manipulation: side view, top view, front view surrounding the object. Allow user to place 3D bounding boxes & tag labels on specific area using point cloud. Co-authored-by: cdp Co-authored-by: Jayraj --- .github/workflows/main.yml | 6 +- README.md | 2 +- cvat-canvas3d/README.md | 21 +- cvat-canvas3d/src/typescript/canvas3d.ts | 58 +- .../src/typescript/canvas3dController.ts | 29 +- cvat-canvas3d/src/typescript/canvas3dModel.ts | 227 ++- cvat-canvas3d/src/typescript/canvas3dView.ts | 1608 +++++++++++++++-- cvat-canvas3d/src/typescript/consts.ts | 18 + cvat-canvas3d/src/typescript/cuboid.ts | 173 +- cvat-core/src/annotations-objects.js | 15 +- cvat-core/src/server-proxy.js | 4 +- cvat-ui/src/actions/annotation-actions.ts | 20 +- .../annotation-page/appearance-block.tsx | 44 +- .../annotation-page/canvas/canvas-wrapper.tsx | 23 +- .../canvas/canvas-wrapper3D.tsx | 280 ++- .../controls-side-bar/cursor-control.tsx | 3 +- .../controls-side-bar/draw-cuboid-control.tsx | 3 +- .../controls-side-bar/draw-shape-popover.tsx | 11 +- .../controls-side-bar/group-control.tsx | 18 +- .../controls-side-bar/move-control.tsx | 3 +- .../objects-side-bar/object-item-basics.tsx | 3 + .../objects-side-bar/object-item-menu.tsx | 19 +- .../objects-side-bar/object-item.tsx | 9 +- .../objects-side-bar/styles.scss | 2 +- .../controls-side-bar/controls-side-bar.tsx | 133 +- .../controls-side-bar/cursor-control.tsx | 36 - .../controls-side-bar/draw-cuboid-control.tsx | 55 - .../controls-side-bar/move-control.tsx | 34 - .../controls-side-bar/photo-context.tsx | 38 + .../standard3D-workspace.tsx | 9 + .../top-bar/annotation-menu.tsx | 5 +- .../annotation-page/top-bar/right-group.tsx | 3 - .../top-bar/statistics-modal.tsx | 43 +- .../create-task-page/project-search-field.tsx | 2 +- .../move-task-modal/label-mapper-item.tsx | 22 +- .../move-task-modal/move-task-modal.tsx | 11 +- .../annotation-page/canvas/canvas-wrapper.tsx | 3 +- .../canvas/canvas-wrapper3D.tsx | 188 +- .../controls-side-bar/draw-shape-popover.tsx | 11 +- .../objects-side-bar/object-item.tsx | 15 +- .../controls-side-bar/controls-side-bar.tsx | 47 +- .../top-bar/statistics-modal.tsx | 3 +- .../annotation-page/top-bar/top-bar.tsx | 3 +- cvat-ui/src/cvat-canvas3d-wrapper.ts | 5 +- cvat-ui/src/reducers/annotation-reducer.ts | 4 + cvat-ui/src/reducers/settings-reducer.ts | 11 +- ...56_canvas3d_functionality_basic_actions.js | 2 +- ...nality_control_button_mouse_interaction.js | 11 +- .../case_64_canvas3d_functionality_cuboid.js | 76 +- tests/cypress/support/commands_canvas3d.js | 19 +- 50 files changed, 2868 insertions(+), 520 deletions(-) delete mode 100644 cvat-ui/src/components/annotation-page/standard3D-workspace/controls-side-bar/cursor-control.tsx delete mode 100644 cvat-ui/src/components/annotation-page/standard3D-workspace/controls-side-bar/draw-cuboid-control.tsx delete mode 100644 cvat-ui/src/components/annotation-page/standard3D-workspace/controls-side-bar/move-control.tsx create mode 100644 cvat-ui/src/components/annotation-page/standard3D-workspace/controls-side-bar/photo-context.tsx diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3ca8e06c6a0..4fbefd3f780 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -168,7 +168,11 @@ jobs: npx cypress run --headless --browser chrome --spec 'cypress/integration/${{ matrix.specs }}/**/*.js' mv ./.nyc_output/out.json ./.nyc_output/out_${{ matrix.specs }}.json else - npx cypress run --headless --browser chrome --env coverage=false --spec 'cypress/integration/${{ matrix.specs }}/**/*.js' + if [[ ${{ matrix.specs }} != 'canvas3d_functionality' ]]; then + npx cypress run --headless --browser chrome --env coverage=false --spec 'cypress/integration/${{ matrix.specs }}/**/*.js' + else + npx cypress run --browser chrome --env coverage=false --spec 'cypress/integration/${{ matrix.specs }}/**/*.js' + fi fi - name: Creating a log file from "cvat" container logs if: failure() diff --git a/README.md b/README.md index cdcac6a7a89..f08c2357ec1 100644 --- a/README.md +++ b/README.md @@ -164,7 +164,7 @@ Other ways to ask questions and get our support: vision AI platform that fully integrates CVAT with scalable data processing and parallelized training pipelines. - [DataIsKey](https://dataiskey.eu/annotation-tool/) uses CVAT as their prime data labeling tool -to offer annotation services for projects of any size. + to offer annotation services for projects of any size. diff --git a/cvat-canvas3d/README.md b/cvat-canvas3d/README.md index 7ce318f70dc..17566e61635 100644 --- a/cvat-canvas3d/README.md +++ b/cvat-canvas3d/README.md @@ -26,11 +26,20 @@ npm run build -- --mode=development # without a minification ```ts interface Canvas3d { - html(): HTMLDivElement; - setup(frameData: any): void; - mode(): Mode; + html(): ViewsDOM; + setup(frameData: any, objectStates: any[]): void; isAbleToChangeFrame(): boolean; + mode(): Mode; render(): void; + keyControls(keys: KeyboardEvent): void; + draw(drawData: DrawData): void; + cancel(): void; + dragCanvas(enable: boolean): void; + activate(clientID: number | null, attributeID?: number): void; + configureShapes(shapeProperties: ShapeProperties): void; + fitCanvas(): void; + fit(): void; + group(groupData: GroupData): void; } ``` @@ -44,5 +53,9 @@ console.log('Version ', window.canvas.CanvasVersion); console.log('Current mode is ', window.canvas.mode()); // Put canvas to a html container -htmlContainer.appendChild(canvas.html()); +const views = canvas.html(); +htmlContainer.appendChild(views.perspective); +htmlContainer.appendChild(views.top); +htmlContainer.appendChild(views.side); +htmlContainer.appendChild(views.front); ``` diff --git a/cvat-canvas3d/src/typescript/canvas3d.ts b/cvat-canvas3d/src/typescript/canvas3d.ts index 139321feeae..02a375cd0d6 100644 --- a/cvat-canvas3d/src/typescript/canvas3d.ts +++ b/cvat-canvas3d/src/typescript/canvas3d.ts @@ -5,10 +5,17 @@ import pjson from '../../package.json'; import { Canvas3dController, Canvas3dControllerImpl } from './canvas3dController'; import { - Canvas3dModel, Canvas3dModelImpl, Mode, DrawData, ViewType, MouseInteraction, + Canvas3dModel, + Canvas3dModelImpl, + Mode, + DrawData, + ViewType, + MouseInteraction, + ShapeProperties, + GroupData, } from './canvas3dModel'; import { - Canvas3dView, Canvas3dViewImpl, ViewsDOM, CAMERA_ACTION, + Canvas3dView, Canvas3dViewImpl, ViewsDOM, CameraAction, } from './canvas3dView'; import { Master } from './master'; @@ -16,19 +23,24 @@ const Canvas3dVersion = pjson.version; interface Canvas3d { html(): ViewsDOM; - setup(frameData: any): void; + setup(frameData: any, objectStates: any[]): void; isAbleToChangeFrame(): boolean; mode(): Mode; render(): void; keyControls(keys: KeyboardEvent): void; - mouseControls(type: string, event: MouseEvent): void; draw(drawData: DrawData): void; cancel(): void; + dragCanvas(enable: boolean): void; + activate(clientID: number | null, attributeID?: number): void; + configureShapes(shapeProperties: ShapeProperties): void; + fitCanvas(): void; + fit(): void; + group(groupData: GroupData): void; } class Canvas3dImpl implements Canvas3d { - private model: Canvas3dModel & Master; - private controller: Canvas3dController; + private readonly model: Canvas3dModel & Master; + private readonly controller: Canvas3dController; private view: Canvas3dView; public constructor() { @@ -45,10 +57,6 @@ class Canvas3dImpl implements Canvas3d { this.view.keyControls(keys); } - public mouseControls(type: MouseInteraction, event: MouseEvent): void { - this.view.mouseControls(type, event); - } - public render(): void { this.view.render(); } @@ -57,14 +65,18 @@ class Canvas3dImpl implements Canvas3d { this.model.draw(drawData); } - public setup(frameData: any): void { - this.model.setup(frameData); + public setup(frameData: any, objectStates: any[]): void { + this.model.setup(frameData, objectStates); } public mode(): Mode { return this.model.mode; } + public group(groupData: GroupData): void { + this.model.group(groupData); + } + public isAbleToChangeFrame(): boolean { return this.model.isAbleToChangeFrame(); } @@ -72,8 +84,28 @@ class Canvas3dImpl implements Canvas3d { public cancel(): void { this.model.cancel(); } + + public dragCanvas(enable: boolean): void { + this.model.dragCanvas(enable); + } + + public configureShapes(shapeProperties: ShapeProperties): void { + this.model.configureShapes(shapeProperties); + } + + public activate(clientID: number | null, attributeID: number | null = null): void { + this.model.activate(String(clientID), attributeID); + } + + public fit(): void { + this.model.fit(); + } + + public fitCanvas(): void { + this.model.fit(); + } } export { - Canvas3dImpl as Canvas3d, Canvas3dVersion, ViewType, MouseInteraction, CAMERA_ACTION, + Canvas3dImpl as Canvas3d, Canvas3dVersion, ViewType, MouseInteraction, CameraAction, ViewsDOM, }; diff --git a/cvat-canvas3d/src/typescript/canvas3dController.ts b/cvat-canvas3d/src/typescript/canvas3dController.ts index 5320fc03eec..00b08f6c3a8 100644 --- a/cvat-canvas3d/src/typescript/canvas3dController.ts +++ b/cvat-canvas3d/src/typescript/canvas3dController.ts @@ -2,11 +2,18 @@ // // SPDX-License-Identifier: MIT -import { Canvas3dModel, Mode, DrawData } from './canvas3dModel'; +import { + Canvas3dModel, Mode, DrawData, ActiveElement, FocusData, GroupData, +} from './canvas3dModel'; export interface Canvas3dController { readonly drawData: DrawData; + readonly activeElement: ActiveElement; + readonly selected: any; + readonly focused: FocusData; + readonly groupData: GroupData; mode: Mode; + group(groupData: GroupData): void; } export class Canvas3dControllerImpl implements Canvas3dController { @@ -27,4 +34,24 @@ export class Canvas3dControllerImpl implements Canvas3dController { public get drawData(): DrawData { return this.model.data.drawData; } + + public get activeElement(): ActiveElement { + return this.model.data.activeElement; + } + + public get selected(): any { + return this.model.data.selected; + } + + public get focused(): any { + return this.model.data.focusData; + } + + public get groupData(): GroupData { + return this.model.groupData; + } + + public group(groupData: GroupData): void { + this.model.group(groupData); + } } diff --git a/cvat-canvas3d/src/typescript/canvas3dModel.ts b/cvat-canvas3d/src/typescript/canvas3dModel.ts index 0b0aef5912e..359d64a5ae8 100644 --- a/cvat-canvas3d/src/typescript/canvas3dModel.ts +++ b/cvat-canvas3d/src/typescript/canvas3dModel.ts @@ -9,6 +9,16 @@ export interface Size { height: number; } +export interface ActiveElement { + clientID: string | null; + attributeID: number | null; +} + +export interface GroupData { + enabled: boolean; + grouped?: []; +} + export interface Image { renderWidth: number; renderHeight: number; @@ -19,6 +29,7 @@ export interface DrawData { enabled: boolean; initialState?: any; redraw?: number; + shapeType?: string; } export enum FrameZoom { @@ -26,6 +37,13 @@ export enum FrameZoom { MAX = 10, } +export enum Planes { + TOP = 'topPlane', + SIDE = 'sidePlane', + FRONT = 'frontPlane', + PERSPECTIVE = 'perspectivePlane', +} + export enum ViewType { PERSPECTIVE = 'perspective', TOP = 'top', @@ -39,14 +57,29 @@ export enum MouseInteraction { HOVER = 'hover', } +export interface FocusData { + clientID: string | null; +} + +export interface ShapeProperties { + opacity: number; + outlined: boolean; + outlineColor: string; + selectedOpacity: number; + colorBy: string; +} + export enum UpdateReasons { IMAGE_CHANGED = 'image_changed', OBJECTS_UPDATED = 'objects_updated', - FITTED_CANVAS = 'fitted_canvas', DRAW = 'draw', SELECT = 'select', CANCEL = 'cancel', DATA_FAILED = 'data_failed', + DRAG_CANVAS = 'drag_canvas', + SHAPE_ACTIVATED = 'shape_activated', + GROUP = 'group', + FITTED_CANVAS = 'fitted_canvas', } export enum Mode { @@ -56,9 +89,12 @@ export enum Mode { DRAW = 'draw', EDIT = 'edit', INTERACT = 'interact', + DRAG_CANVAS = 'drag_canvas', + GROUP = 'group', } export interface Canvas3dDataModel { + activeElement: ActiveElement; canvasSize: Size; image: Image | null; imageID: number | null; @@ -67,15 +103,27 @@ export interface Canvas3dDataModel { drawData: DrawData; mode: Mode; exception: Error | null; + objects: any[]; + groupedObjects: any[]; + focusData: FocusData; + selected: any; + shapeProperties: ShapeProperties; + groupData: GroupData; } export interface Canvas3dModel { mode: Mode; data: Canvas3dDataModel; - setup(frameData: any): void; + readonly groupData: GroupData; + setup(frameData: any, objectStates: any[]): void; isAbleToChangeFrame(): boolean; draw(drawData: DrawData): void; cancel(): void; + dragCanvas(enable: boolean): void; + activate(clientID: string | null, attributeID: number | null): void; + configureShapes(shapeProperties: any): void; + fit(): void; + group(groupData: GroupData): void; } export class Canvas3dModelImpl extends MasterImpl implements Canvas3dModel { @@ -84,10 +132,16 @@ export class Canvas3dModelImpl extends MasterImpl implements Canvas3dModel { public constructor() { super(); this.data = { + activeElement: { + clientID: null, + attributeID: null, + }, canvasSize: { height: 0, width: 0, }, + objects: [], + groupedObjects: [], image: null, imageID: null, imageOffset: 0, @@ -101,37 +155,68 @@ export class Canvas3dModelImpl extends MasterImpl implements Canvas3dModel { }, mode: Mode.IDLE, exception: null, + focusData: { + clientID: null, + }, + groupData: { + enabled: false, + grouped: [], + }, + selected: null, + shapeProperties: { + opacity: 40, + outlined: false, + outlineColor: '#000000', + selectedOpacity: 60, + colorBy: 'Label', + }, }; } - public setup(frameData: any): void { + public setup(frameData: any, objectStates: any[]): void { if (this.data.imageID !== frameData.number) { - this.data.imageID = frameData.number; - frameData - .data((): void => { - this.data.image = null; - this.notify(UpdateReasons.IMAGE_CHANGED); - }) - .then((data: Image): void => { - if (frameData.number !== this.data.imageID) { - // already another image - return; - } - - this.data.imageSize = { - height: frameData.height as number, - width: frameData.width as number, - }; - - this.data.image = data; - this.notify(UpdateReasons.IMAGE_CHANGED); - }) - .catch((exception: any): void => { - this.data.exception = exception; - this.notify(UpdateReasons.DATA_FAILED); - throw exception; - }); + if ([Mode.EDIT, Mode.DRAG, Mode.RESIZE].includes(this.data.mode)) { + throw Error(`Canvas is busy. Action: ${this.data.mode}`); + } + } + + if ([Mode.EDIT].includes(this.data.mode)) { + return; + } + + if (frameData.number === this.data.imageID) { + this.data.objects = objectStates; + this.notify(UpdateReasons.OBJECTS_UPDATED); + return; } + + this.data.imageID = frameData.number; + frameData + .data((): void => { + this.data.image = null; + this.notify(UpdateReasons.IMAGE_CHANGED); + }) + .then((data: Image): void => { + if (frameData.number !== this.data.imageID) { + // already another image + return; + } + + this.data.imageSize = { + height: frameData.height as number, + width: frameData.width as number, + }; + + this.data.image = data; + this.notify(UpdateReasons.IMAGE_CHANGED); + this.data.objects = objectStates; + this.notify(UpdateReasons.OBJECTS_UPDATED); + }) + .catch((exception: any): void => { + this.data.exception = exception; + this.notify(UpdateReasons.DATA_FAILED); + throw exception; + }); } public set mode(value: Mode) { @@ -145,7 +230,6 @@ export class Canvas3dModelImpl extends MasterImpl implements Canvas3dModel { public isAbleToChangeFrame(): boolean { const isUnable = [Mode.DRAG, Mode.EDIT, Mode.RESIZE, Mode.INTERACT].includes(this.data.mode) || (this.data.mode === Mode.DRAW && typeof this.data.drawData.redraw === 'number'); - return !isUnable; } @@ -153,13 +237,98 @@ export class Canvas3dModelImpl extends MasterImpl implements Canvas3dModel { if (drawData.enabled && this.data.drawData.enabled) { throw new Error('Drawing has been already started'); } + if ([Mode.DRAW, Mode.EDIT].includes(this.data.mode)) { + return; + } this.data.drawData.enabled = drawData.enabled; this.data.mode = Mode.DRAW; + if (typeof drawData.redraw === 'number') { + const clientID = drawData.redraw; + const [state] = this.data.objects.filter((_state: any): boolean => _state.clientID === clientID); + + if (state) { + this.data.drawData = { ...drawData }; + this.data.drawData.initialState = { ...this.data.drawData.initialState, label: state.label }; + this.data.drawData.shapeType = state.shapeType; + } else { + return; + } + } else { + this.data.drawData = { ...drawData }; + if (this.data.drawData.initialState) { + this.data.drawData.shapeType = this.data.drawData.initialState.shapeType; + } + } this.notify(UpdateReasons.DRAW); } public cancel(): void { this.notify(UpdateReasons.CANCEL); } + + public dragCanvas(enable: boolean): void { + if (enable && this.data.mode !== Mode.IDLE) { + throw Error(`Canvas is busy. Action: ${this.data.mode}`); + } + + if (!enable && this.data.mode !== Mode.DRAG_CANVAS) { + throw Error(`Canvas is not in the drag mode. Action: ${this.data.mode}`); + } + + this.data.mode = enable ? Mode.DRAG_CANVAS : Mode.IDLE; + this.notify(UpdateReasons.DRAG_CANVAS); + } + + public activate(clientID: string, attributeID: number | null): void { + if (this.data.activeElement.clientID === clientID && this.data.activeElement.attributeID === attributeID) { + return; + } + if (this.data.mode !== Mode.IDLE) { + throw Error(`Canvas is busy. Action: ${this.data.mode}`); + } + if (typeof clientID === 'number') { + const [state] = this.data.objects.filter((_state: any): boolean => _state.clientID === clientID); + if (!state || state.objectType === 'tag') { + return; + } + } + this.data.activeElement = { + clientID, + attributeID, + }; + this.notify(UpdateReasons.SHAPE_ACTIVATED); + } + + public group(groupData: GroupData): void { + if (![Mode.IDLE, Mode.GROUP].includes(this.data.mode)) { + throw Error(`Canvas is busy. Action: ${this.data.mode}`); + } + + if (this.data.groupData.enabled && groupData.enabled) { + return; + } + + if (!this.data.groupData.enabled && !groupData.enabled) { + return; + } + this.data.mode = groupData.enabled ? Mode.GROUP : Mode.IDLE; + this.data.groupData = { ...this.data.groupData, ...groupData }; + this.notify(UpdateReasons.GROUP); + } + + public configureShapes(shapeProperties: ShapeProperties): void { + this.data.shapeProperties = { + ...shapeProperties, + }; + this.notify(UpdateReasons.OBJECTS_UPDATED); + } + + public fit(): void { + this.notify(UpdateReasons.FITTED_CANVAS); + } + + public get groupData(): GroupData { + return { ...this.data.groupData }; + } } diff --git a/cvat-canvas3d/src/typescript/canvas3dView.ts b/cvat-canvas3d/src/typescript/canvas3dView.ts index 866e7cc26e5..d3703f66e74 100644 --- a/cvat-canvas3d/src/typescript/canvas3dView.ts +++ b/cvat-canvas3d/src/typescript/canvas3dView.ts @@ -9,18 +9,19 @@ import { Canvas3dController } from './canvas3dController'; import { Listener, Master } from './master'; import CONST from './consts'; import { - Canvas3dModel, UpdateReasons, Mode, DrawData, ViewType, MouseInteraction, + Canvas3dModel, DrawData, Mode, Planes, UpdateReasons, ViewType, } from './canvas3dModel'; -import { CuboidModel } from './cuboid'; +import { + createRotationHelper, CuboidModel, setEdges, setTranslationHelper, +} from './cuboid'; export interface Canvas3dView { html(): ViewsDOM; render(): void; keyControls(keys: KeyboardEvent): void; - mouseControls(type: MouseInteraction, event: MouseEvent): void; } -export enum CAMERA_ACTION { +export enum CameraAction { ZOOM_IN = 'KeyI', MOVE_UP = 'KeyU', MOVE_DOWN = 'KeyO', @@ -75,6 +76,9 @@ export class Canvas3dViewImpl implements Canvas3dView, Listener { private cube: CuboidModel; private highlighted: boolean; private selected: CubeObject; + private model: Canvas3dModel & Master; + private action: any; + private globalHelpers: any; private set mode(value: Mode) { this.controller.mode = value; @@ -88,9 +92,74 @@ export class Canvas3dViewImpl implements Canvas3dView, Listener { this.controller = controller; this.clock = new THREE.Clock(); this.speed = CONST.MOVEMENT_FACTOR; - this.cube = new CuboidModel(); + this.cube = new CuboidModel('line', '#ffffff'); this.highlighted = false; this.selected = this.cube; + this.model = model; + this.globalHelpers = { + top: { + resize: [], + rotate: [], + }, + side: { + resize: [], + rotate: [], + }, + front: { + resize: [], + rotate: [], + }, + }; + this.action = { + scan: null, + selectable: true, + frameCoordinates: { + x: 0, + y: 0, + z: 0, + }, + detected: false, + initialMouseVector: new THREE.Vector2(), + detachCam: false, + detachCamRef: 'null', + translation: { + status: false, + helper: null, + coordinates: null, + offset: new THREE.Vector3(), + inverseMatrix: new THREE.Matrix4(), + }, + rotation: { + status: false, + helper: null, + recentMouseVector: new THREE.Vector2(0, 0), + screenInit: { + x: 0, + y: 0, + }, + screenMove: { + x: 0, + y: 0, + }, + }, + resize: { + status: false, + helper: null, + recentMouseVector: new THREE.Vector2(0, 0), + initScales: { + x: 1, + y: 1, + z: 1, + }, + memScales: { + x: 1, + y: 1, + z: 1, + }, + resizeVector: new THREE.Vector3(0, 0, 0), + frontBool: false, + }, + }; this.views = { perspective: { @@ -104,18 +173,182 @@ export class Canvas3dViewImpl implements Canvas3dView, Listener { top: { renderer: new THREE.WebGLRenderer({ antialias: true }), scene: new THREE.Scene(), + rayCaster: { + renderer: new THREE.Raycaster(), + mouseVector: new THREE.Vector2(), + }, }, side: { renderer: new THREE.WebGLRenderer({ antialias: true }), scene: new THREE.Scene(), + rayCaster: { + renderer: new THREE.Raycaster(), + mouseVector: new THREE.Vector2(), + }, }, front: { renderer: new THREE.WebGLRenderer({ antialias: true }), scene: new THREE.Scene(), + rayCaster: { + renderer: new THREE.Raycaster(), + mouseVector: new THREE.Vector2(), + }, }, }; CameraControls.install({ THREE }); + const canvasPerspectiveView = this.views.perspective.renderer.domElement; + const canvasTopView = this.views.top.renderer.domElement; + const canvasSideView = this.views.side.renderer.domElement; + const canvasFrontView = this.views.front.renderer.domElement; + + canvasPerspectiveView.addEventListener('contextmenu', (e: MouseEvent): void => { + if (this.controller.focused.clientID !== null) { + this.dispatchEvent( + new CustomEvent('canvas.contextmenu', { + bubbles: false, + cancelable: true, + detail: { + clientID: Number(this.controller.focused.clientID), + clientX: e.clientX, + clientY: e.clientY, + }, + }), + ); + } + }); + + canvasTopView.addEventListener('mousedown', this.startAction.bind(this, 'top')); + canvasSideView.addEventListener('mousedown', this.startAction.bind(this, 'side')); + canvasFrontView.addEventListener('mousedown', this.startAction.bind(this, 'front')); + + canvasTopView.addEventListener('mousemove', this.moveAction.bind(this, 'top')); + canvasSideView.addEventListener('mousemove', this.moveAction.bind(this, 'side')); + canvasFrontView.addEventListener('mousemove', this.moveAction.bind(this, 'front')); + + canvasTopView.addEventListener('mouseup', this.completeActions.bind(this)); + canvasTopView.addEventListener('mouseleave', this.completeActions.bind(this)); + canvasSideView.addEventListener('mouseup', this.completeActions.bind(this)); + canvasSideView.addEventListener('mouseleave', this.completeActions.bind(this)); + canvasFrontView.addEventListener('mouseup', this.completeActions.bind(this)); + canvasFrontView.addEventListener('mouseleave', this.completeActions.bind(this)); + + canvasPerspectiveView.addEventListener('mousemove', (event: MouseEvent): void => { + event.preventDefault(); + if (this.mode === Mode.DRAG_CANVAS) return; + const canvas = this.views.perspective.renderer.domElement; + const rect = canvas.getBoundingClientRect(); + const { mouseVector } = this.views.perspective.rayCaster as { mouseVector: THREE.Vector2 }; + mouseVector.x = ((event.clientX - (canvas.offsetLeft + rect.left)) / canvas.clientWidth) * 2 - 1; + mouseVector.y = -((event.clientY - (canvas.offsetTop + rect.top)) / canvas.clientHeight) * 2 + 1; + }); + + canvasPerspectiveView.addEventListener('click', (e: MouseEvent): void => { + e.preventDefault(); + if (e.detail !== 1) return; + if (![Mode.GROUP, Mode.IDLE].includes(this.mode) || !this.views.perspective.rayCaster) return; + const intersects = this.views.perspective.rayCaster.renderer.intersectObjects( + this.views.perspective.scene.children[0].children, + false, + ); + if (intersects.length !== 0 && this.mode === Mode.GROUP && this.model.data.groupData.grouped) { + const item = this.model.data.groupData.grouped.filter( + (_state: any): boolean => _state.clientID === Number(intersects[0].object.name), + ); + if (item.length !== 0) { + // @ts-ignore + this.model.data.groupData.grouped = this.model.data.groupData.grouped.filter( + (_state: any): boolean => _state.clientID !== Number(intersects[0].object.name), + ); + intersects[0].object.material.color.set(intersects[0].object.originalColor); + } else { + const [state] = this.model.data.objects.filter( + (_state: any): boolean => _state.clientID === Number(intersects[0].object.name), + ); + this.model.data.groupData.grouped.push(state); + intersects[0].object.material.color.set('#ffffff'); + } + } else if (this.mode === Mode.IDLE) { + if (intersects.length === 0) { + this.setHelperVisibility(false); + } + this.dispatchEvent( + new CustomEvent('canvas.selected', { + bubbles: false, + cancelable: true, + detail: { + clientID: intersects.length !== 0 ? Number(intersects[0].object.name) : null, + }, + }), + ); + } + }); + + canvasPerspectiveView.addEventListener('dblclick', (e: MouseEvent): void => { + e.preventDefault(); + if (this.mode !== Mode.DRAW) { + const { perspective: viewType } = this.views; + viewType.rayCaster.renderer.setFromCamera(viewType.rayCaster.mouseVector, viewType.camera); + const intersects = viewType.rayCaster.renderer.intersectObjects( + this.views.perspective.scene.children[0].children, + false, + ); + if (intersects.length !== 0) { + this.setDefaultZoom(); + } else { + const { x, y, z } = this.action.frameCoordinates; + this.positionAllViews(x, y, z, true); + } + return; + } + this.controller.drawData.enabled = false; + this.mode = Mode.IDLE; + const { x, y, z } = this.cube.perspective.position; + const { x: width, y: height, z: depth } = this.cube.perspective.scale; + const { x: rotationX, y: rotationY, z: rotationZ } = this.cube.perspective.rotation; + const points = [x, y, z, rotationX, rotationY, rotationZ, width, height, depth, 0, 0, 0, 0, 0, 0, 0]; + const initState = this.model.data.drawData.initialState; + let label; + if (initState) { + ({ label } = initState); + } + + if (typeof this.model.data.drawData.redraw === 'number') { + const [state] = this.model.data.objects.filter( + (_state: any): boolean => _state.clientID === Number(this.model.data.selected.perspective.name), + ); + this.dispatchEvent( + new CustomEvent('canvas.edited', { + bubbles: false, + cancelable: true, + detail: { + state, + points, + }, + }), + ); + } else { + this.dispatchEvent( + new CustomEvent('canvas.drawn', { + bubbles: false, + cancelable: true, + detail: { + state: { + ...initState, + shapeType: 'cuboid', + frame: this.model.data.imageID, + points, + label, + }, + continue: undefined, + duration: 0, + }, + }), + ); + } + this.dispatchEvent(new CustomEvent('canvas.canceled')); + }); + this.mode = Mode.IDLE; Object.keys(this.views).forEach((view: string): void => { @@ -132,84 +365,436 @@ export class Canvas3dViewImpl implements Canvas3dView, Listener { this.views.perspective.camera.position.set(-15, 0, 4); this.views.perspective.camera.up.set(0, 0, 1); this.views.perspective.camera.lookAt(10, 0, 0); + this.views.perspective.camera.name = 'cameraPerspective'; this.views.top.camera = new THREE.OrthographicCamera( (-aspectRatio * viewSize) / 2 - 2, (aspectRatio * viewSize) / 2 + 2, viewSize / 2 + 2, -viewSize / 2 - 2, - -10, - 10, + -50, + 50, ); + this.views.top.camera.position.set(0, 0, 5); + this.views.top.camera.lookAt(0, 0, 0); + this.views.top.camera.up.set(0, 0, 1); + this.views.top.camera.name = 'cameraTop'; + this.views.side.camera = new THREE.OrthographicCamera( (-aspectRatio * viewSize) / 2, (aspectRatio * viewSize) / 2, viewSize / 2, -viewSize / 2, - -10, - 10, + -50, + 50, ); this.views.side.camera.position.set(0, 5, 0); this.views.side.camera.lookAt(0, 0, 0); this.views.side.camera.up.set(0, 0, 1); + this.views.side.camera.name = 'cameraSide'; this.views.front.camera = new THREE.OrthographicCamera( (-aspectRatio * viewSize) / 2, (aspectRatio * viewSize) / 2, viewSize / 2, -viewSize / 2, - -10, - 10, + -50, + 50, ); - this.views.front.camera.position.set(-7, 0, 0); + this.views.front.camera.position.set(3, 0, 0); this.views.front.camera.up.set(0, 0, 1); this.views.front.camera.lookAt(0, 0, 0); + this.views.front.camera.name = 'cameraFront'; Object.keys(this.views).forEach((view: string): void => { const viewType = this.views[view as keyof Views]; - viewType.renderer.setSize(width, height); - if (view !== ViewType.PERSPECTIVE) { - viewType.controls = new CameraControls(viewType.camera, viewType.renderer.domElement); - viewType.controls.mouseButtons.left = CameraControls.ACTION.NONE; - viewType.controls.mouseButtons.right = CameraControls.ACTION.NONE; - } else { - viewType.controls = new CameraControls(viewType.camera, viewType.renderer.domElement); + if (viewType.camera) { + viewType.renderer.setSize(width, height); + if (view !== ViewType.PERSPECTIVE) { + viewType.controls = new CameraControls(viewType.camera, viewType.renderer.domElement); + viewType.controls.mouseButtons.left = CameraControls.ACTION.NONE; + viewType.controls.mouseButtons.right = CameraControls.ACTION.NONE; + } else { + viewType.controls = new CameraControls(viewType.camera, viewType.renderer.domElement); + } + viewType.controls.minDistance = CONST.MIN_DISTANCE; + viewType.controls.maxDistance = CONST.MAX_DISTANCE; } - viewType.controls.minDistance = CONST.MIN_DISTANCE; - viewType.controls.maxDistance = CONST.MAX_DISTANCE; + }); + this.views.top.controls.enabled = false; + this.views.side.controls.enabled = false; + this.views.front.controls.enabled = false; + + [ViewType.TOP, ViewType.SIDE, ViewType.FRONT].forEach((view: ViewType): void => { + this.views[view].renderer.domElement.addEventListener( + 'wheel', + (event: WheelEvent): void => { + event.preventDefault(); + const { camera } = this.views[view]; + if (event.deltaY < CONST.FOV_MIN && camera.zoom < CONST.FOV_MAX) { + camera.zoom += CONST.FOV_INC; + } else if (event.deltaY > CONST.FOV_MIN && camera.zoom > CONST.FOV_MIN + 0.1) { + camera.zoom -= CONST.FOV_INC; + } + this.setHelperSize(view); + }, + { passive: false }, + ); }); model.subscribe(this); } + private setDefaultZoom(): void { + if (this.model.data.activeElement === 'null') { + Object.keys(this.views).forEach((view: string): void => { + const viewType = this.views[view as keyof Views]; + if (view !== ViewType.PERSPECTIVE) { + viewType.camera.zoom = CONST.FOV_DEFAULT; + viewType.camera.updateProjectionMatrix(); + } + }); + } else { + const canvasTop = this.views.top.renderer.domElement; + const bboxtop = new THREE.Box3().setFromObject(this.model.data.selected.top); + const x1 = Math.min( + canvasTop.offsetWidth / (bboxtop.max.x - bboxtop.min.x), + canvasTop.offsetHeight / (bboxtop.max.y - bboxtop.min.y), + ) * 0.4; + this.views.top.camera.zoom = x1 / 100; + this.views.top.camera.updateProjectionMatrix(); + this.views.top.camera.updateMatrix(); + this.setHelperSize(ViewType.TOP); + + const canvasFront = this.views.top.renderer.domElement; + const bboxfront = new THREE.Box3().setFromObject(this.model.data.selected.front); + const x2 = Math.min( + canvasFront.offsetWidth / (bboxfront.max.y - bboxfront.min.y), + canvasFront.offsetHeight / (bboxfront.max.z - bboxfront.min.z), + ) * 0.4; + this.views.front.camera.zoom = x2 / 100; + this.views.front.camera.updateProjectionMatrix(); + this.views.front.camera.updateMatrix(); + this.setHelperSize(ViewType.FRONT); + + const canvasSide = this.views.side.renderer.domElement; + const bboxside = new THREE.Box3().setFromObject(this.model.data.selected.side); + const x3 = Math.min( + canvasSide.offsetWidth / (bboxside.max.x - bboxside.min.x), + canvasSide.offsetHeight / (bboxside.max.z - bboxside.min.z), + ) * 0.4; + this.views.side.camera.zoom = x3 / 100; + this.views.side.camera.updateProjectionMatrix(); + this.views.side.camera.updateMatrix(); + this.setHelperSize(ViewType.SIDE); + } + } + + private startAction(view: any, event: MouseEvent): void { + if (event.detail !== 1) return; + const { clientID } = this.model.data.activeElement; + if (clientID === 'null') return; + const canvas = this.views[view as keyof Views].renderer.domElement; + const rect = canvas.getBoundingClientRect(); + const { mouseVector } = this.views[view as keyof Views].rayCaster as { mouseVector: THREE.Vector2 }; + const diffX = event.clientX - rect.left; + const diffY = event.clientY - rect.top; + mouseVector.x = (diffX / canvas.clientWidth) * 2 - 1; + mouseVector.y = -(diffY / canvas.clientHeight) * 2 + 1; + this.action.rotation.screenInit = { x: diffX, y: diffY }; + this.action.rotation.screenMove = { x: diffX, y: diffY }; + if ( + this.model.data.selected + && !this.model.data.selected.perspective.userData.lock + && !this.model.data.selected.perspective.userData.hidden + ) { + this.action.scan = view; + this.model.mode = Mode.EDIT; + this.action.selectable = false; + } + } + + private moveAction(view: any, event: MouseEvent): void { + event.preventDefault(); + const { clientID } = this.model.data.activeElement; + if (clientID === 'null') return; + const canvas = this.views[view as keyof Views].renderer.domElement; + const rect = canvas.getBoundingClientRect(); + const { mouseVector } = this.views[view as keyof Views].rayCaster as { mouseVector: THREE.Vector2 }; + const diffX = event.clientX - rect.left; + const diffY = event.clientY - rect.top; + mouseVector.x = (diffX / canvas.clientWidth) * 2 - 1; + mouseVector.y = -(diffY / canvas.clientHeight) * 2 + 1; + this.action.rotation.screenMove = { x: diffX, y: diffY }; + } + + private translateReferencePlane(coordinates: any): void { + const topPlane = this.views.top.scene.getObjectByName(Planes.TOP); + if (topPlane) { + topPlane.position.x = coordinates.x; + topPlane.position.y = coordinates.y; + topPlane.position.z = coordinates.z; + } + const sidePlane = this.views.side.scene.getObjectByName(Planes.SIDE); + if (sidePlane) { + sidePlane.position.x = coordinates.x; + sidePlane.position.y = coordinates.y; + sidePlane.position.z = coordinates.z; + } + const frontPlane = this.views.front.scene.getObjectByName(Planes.FRONT); + if (frontPlane) { + frontPlane.position.x = coordinates.x; + frontPlane.position.y = coordinates.y; + frontPlane.position.z = coordinates.z; + } + } + + private resetActions(): void { + this.action = { + ...this.action, + scan: null, + detected: false, + translation: { + status: false, + helper: null, + }, + rotation: { + status: false, + helper: null, + recentMouseVector: new THREE.Vector2(0, 0), + }, + resize: { + ...this.action.resize, + status: false, + helper: null, + recentMouseVector: new THREE.Vector2(0, 0), + }, + }; + } + + private completeActions(): void { + const { scan, detected } = this.action; + if (!detected) { + this.resetActions(); + return; + } + + const { x, y, z } = this.model.data.selected[scan].position; + const { x: width, y: height, z: depth } = this.model.data.selected[scan].scale; + const { x: rotationX, y: rotationY, z: rotationZ } = this.model.data.selected[scan].rotation; + const points = [x, y, z, rotationX, rotationY, rotationZ, width, height, depth, 0, 0, 0, 0, 0, 0, 0]; + const [state] = this.model.data.objects.filter( + (_state: any): boolean => _state.clientID === Number(this.model.data.selected[scan].name), + ); + this.dispatchEvent( + new CustomEvent('canvas.edited', { + bubbles: false, + cancelable: true, + detail: { + state, + points, + }, + }), + ); + if (this.action.rotation.status) { + this.detachCamera(scan); + } + + this.adjustPerspectiveCameras(); + this.translateReferencePlane(new THREE.Vector3(x, y, z)); + this.resetActions(); + this.model.mode = Mode.IDLE; + this.action.selectable = true; + } + + private onGroupDone(objects?: any[]): void { + if (objects && objects.length !== 0) { + this.dispatchEvent( + new CustomEvent('canvas.groupped', { + bubbles: false, + cancelable: true, + detail: { + states: objects, + }, + }), + ); + } else { + this.dispatchEvent( + new CustomEvent('canvas.canceled', { + bubbles: false, + cancelable: true, + }), + ); + } + + this.controller.group({ + enabled: false, + grouped: [], + }); + + this.mode = Mode.IDLE; + } + + private setupObject(object: any, addToScene: boolean): CuboidModel { + const { + opacity, outlined, outlineColor, selectedOpacity, colorBy, + } = this.model.data.shapeProperties; + const clientID = String(object.clientID); + const cuboid = new CuboidModel(object.occluded ? 'dashed' : 'line', outlined ? outlineColor : '#ffffff'); + + cuboid.setName(clientID); + cuboid.perspective.userData = object; + let color = ''; + if (colorBy === 'Label') { + ({ color } = object.label); + } else if (colorBy === 'Instance') { + ({ color } = object); + } else { + ({ color } = object.group); + } + cuboid.setOriginalColor(color); + cuboid.setColor(color); + cuboid.setOpacity(opacity); + + if ( + this.model.data.activeElement.clientID === clientID + && ![Mode.DRAG_CANVAS, Mode.GROUP].includes(this.mode) + ) { + cuboid.setOpacity(selectedOpacity); + if (!object.lock) { + createRotationHelper(cuboid.top, ViewType.TOP); + createRotationHelper(cuboid.side, ViewType.SIDE); + createRotationHelper(cuboid.front, ViewType.FRONT); + setTranslationHelper(cuboid.top); + setTranslationHelper(cuboid.side); + setTranslationHelper(cuboid.front); + } + setEdges(cuboid.top); + setEdges(cuboid.side); + setEdges(cuboid.front); + this.translateReferencePlane(new THREE.Vector3(object.points[0], object.points[1], object.points[2])); + this.model.data.selected = cuboid; + if (object.hidden) { + this.setHelperVisibility(false); + return cuboid; + } + } else { + cuboid.top.visible = false; + cuboid.side.visible = false; + cuboid.front.visible = false; + } + if (object.hidden) { + return cuboid; + } + cuboid.setPosition(object.points[0], object.points[1], object.points[2]); + cuboid.setScale(object.points[6], object.points[7], object.points[8]); + cuboid.setRotation(object.points[3], object.points[4], object.points[5]); + if (addToScene) { + this.addSceneChildren(cuboid); + } + if (this.model.data.activeElement.clientID === clientID) { + cuboid.attachCameraReference(); + this.rotatePlane(null, null); + this.action.detachCam = true; + this.action.detachCamRef = this.model.data.activeElement.clientID; + if (!object.lock) { + this.setSelectedChildScale(1 / cuboid.top.scale.x, 1 / cuboid.top.scale.y, 1 / cuboid.top.scale.z); + this.setHelperVisibility(true); + this.updateRotationHelperPos(); + this.updateResizeHelperPos(); + } else { + this.setHelperVisibility(false); + } + } + return cuboid; + } + + private setupObjects(): void { + if (this.views.perspective.scene.children[0]) { + this.clearSceneObjects(); + this.setHelperVisibility(false); + for (let i = 0; i < this.model.data.objects.length; i++) { + const object = this.model.data.objects[i]; + this.setupObject(object, true); + } + } + } + + private addSceneChildren(shapeObject: CuboidModel): void { + this.views.perspective.scene.children[0].add(shapeObject.perspective); + this.views.top.scene.children[0].add(shapeObject.top); + this.views.side.scene.children[0].add(shapeObject.side); + this.views.front.scene.children[0].add(shapeObject.front); + } + + private dispatchEvent(event: CustomEvent): void { + this.views.perspective.renderer.domElement.dispatchEvent(event); + } + public notify(model: Canvas3dModel & Master, reason: UpdateReasons): void { if (reason === UpdateReasons.IMAGE_CHANGED) { + if (!model.data.image) return; const loader = new PCDLoader(); - this.clearScene(); const objectURL = URL.createObjectURL(model.data.image.imageData); + this.clearScene(); loader.load(objectURL, this.addScene.bind(this)); URL.revokeObjectURL(objectURL); - const event: CustomEvent = new CustomEvent('canvas.setup'); - this.views.perspective.renderer.domElement.dispatchEvent(event); + this.dispatchEvent(new CustomEvent('canvas.setup')); + } else if (reason === UpdateReasons.SHAPE_ACTIVATED) { + const { clientID } = this.model.data.activeElement; + this.setupObjects(); + if (clientID !== 'null') { + this.setDefaultZoom(); + } } else if (reason === UpdateReasons.DRAW) { const data: DrawData = this.controller.drawData; - if (data.enabled && this.mode === Mode.IDLE) { - this.mode = Mode.DRAW; - this.cube = new CuboidModel(); - } else if (this.mode !== Mode.IDLE) { - this.cube = new CuboidModel(); + this.cube = new CuboidModel('line', '#ffffff'); + if (data.redraw) { + const object = this.views.perspective.scene.getObjectByName(String(data.redraw)); + if (object) { + this.cube.perspective = object.clone() as THREE.Mesh; + object.visible = false; + } + } else if (data.initialState) { + this.model.data.activeElement.clientID = 'null'; + this.setupObjects(); + this.cube = this.setupObject(data.initialState, false); } + this.setHelperVisibility(false); + } else if (reason === UpdateReasons.OBJECTS_UPDATED) { + this.setupObjects(); + } else if (reason === UpdateReasons.DRAG_CANVAS) { + this.dispatchEvent( + new CustomEvent(this.mode === Mode.DRAG_CANVAS ? 'canvas.dragstart' : 'canvas.dragstop', { + bubbles: false, + cancelable: true, + }), + ); + this.model.data.activeElement.clientID = 'null'; + this.setupObjects(); } else if (reason === UpdateReasons.CANCEL) { if (this.mode === Mode.DRAW) { this.controller.drawData.enabled = false; + this.controller.drawData.redraw = undefined; Object.keys(this.views).forEach((view: string): void => { this.views[view as keyof Views].scene.children[0].remove(this.cube[view as keyof Views]); }); } + this.model.data.groupData.grouped = []; + this.setHelperVisibility(false); this.mode = Mode.IDLE; - const event: CustomEvent = new CustomEvent('canvas.canceled'); - this.views.perspective.renderer.domElement.dispatchEvent(event); + this.dispatchEvent(new CustomEvent('canvas.canceled')); + } else if (reason === UpdateReasons.FITTED_CANVAS) { + this.dispatchEvent(new CustomEvent('canvas.fit')); + } else if (reason === UpdateReasons.GROUP) { + if (!this.model.groupData.enabled) { + this.onGroupDone(this.model.data.groupData.grouped); + } else { + this.model.data.groupData.grouped = []; + this.model.data.activeElement.clientID = 'null'; + this.setupObjects(); + } } } @@ -219,13 +804,102 @@ export class Canvas3dViewImpl implements Canvas3dView, Listener { }); } + private clearSceneObjects(): void { + Object.keys(this.views).forEach((view: string): void => { + this.views[view as keyof Views].scene.children[0].children = []; + }); + } + + private setHelperVisibility(visibility: boolean): void { + [ViewType.TOP, ViewType.SIDE, ViewType.FRONT].forEach((viewType: ViewType): void => { + const globalRotationObject = this.views[viewType].scene.getObjectByName('globalRotationHelper'); + if (globalRotationObject) { + globalRotationObject.visible = visibility; + } + for (let i = 0; i < 8; i++) { + const resizeObject = this.views[viewType].scene.getObjectByName(`globalResizeHelper${i}`); + if (resizeObject) { + resizeObject.visible = visibility; + } + } + }); + } + + private static setupRotationHelper(): THREE.Mesh { + const sphereGeometry = new THREE.SphereGeometry(0.15); + const sphereMaterial = new THREE.MeshBasicMaterial({ color: '#ffffff', opacity: 1, visible: true }); + const rotationHelper = new THREE.Mesh(sphereGeometry, sphereMaterial); + rotationHelper.name = 'globalRotationHelper'; + return rotationHelper; + } + + private updateRotationHelperPos(): void { + [ViewType.TOP, ViewType.SIDE, ViewType.FRONT].forEach((view: ViewType): void => { + const point = new THREE.Vector3(0, 0, 0); + this.model.data.selected[view].getObjectByName('rotationHelper').getWorldPosition(point); + const globalRotationObject = this.views[view].scene.getObjectByName('globalRotationHelper'); + if (globalRotationObject) { + globalRotationObject.position.set(point.x, point.y, point.z); + } + }); + } + + private setHelperSize(viewType: ViewType): void { + if ([ViewType.TOP, ViewType.SIDE, ViewType.FRONT].includes(viewType)) { + const { camera } = this.views[viewType]; + if (!camera || camera instanceof THREE.PerspectiveCamera) return; + const factor = (camera.top - camera.bottom) / camera.zoom; + const rotationObject = this.views[viewType].scene.getObjectByName('globalRotationHelper'); + if (rotationObject) { + rotationObject.scale.set(1, 1, 1).multiplyScalar(factor / 10); + } + for (let i = 0; i < 8; i++) { + const resizeObject = this.views[viewType].scene.getObjectByName(`globalResizeHelper${i}`); + if (resizeObject) { + resizeObject.scale.set(1, 1, 1).multiplyScalar(factor / 10); + } + } + } + } + + private setupResizeHelper(viewType: ViewType): void { + const sphereGeometry = new THREE.SphereGeometry(0.15); + const sphereMaterial = new THREE.MeshBasicMaterial({ color: '#ffffff', opacity: 1, visible: true }); + const helpers = []; + for (let i = 0; i < 8; i++) { + helpers[i] = new THREE.Mesh(sphereGeometry.clone(), sphereMaterial.clone()); + helpers[i].name = `globalResizeHelper${i}`; + this.globalHelpers[viewType].resize.push(helpers[i]); + this.views[viewType].scene.add(helpers[i]); + } + } + + private updateResizeHelperPos(): void { + [ViewType.TOP, ViewType.SIDE, ViewType.FRONT].forEach((view: ViewType): void => { + let i = 0; + this.model.data.selected[view].children.forEach((element: any): void => { + if (element.name === 'resizeHelper') { + const p = new THREE.Vector3(0, 0, 0); + element.getWorldPosition(p); + const name = `globalResizeHelper${i}`; + const object = this.views[view].scene.getObjectByName(name); + if (object) { + object.position.set(p.x, p.y, p.z); + } + i++; + } + }); + }); + } + private addScene(points: any): void { // eslint-disable-next-line no-param-reassign - points.material.size = 0.08; - // eslint-disable-next-line no-param-reassign - points.material.color = new THREE.Color(0x0000ff); + points.material.size = 0.05; + points.material.color.set(new THREE.Color(0xffffff)); + const material = points.material.clone(); const sphereCenter = points.geometry.boundingSphere.center; const { radius } = points.geometry.boundingSphere; + if (!this.views.perspective.camera) return; const xRange = -radius / 2 < this.views.perspective.camera.position.x - sphereCenter.x && radius / 2 > this.views.perspective.camera.position.x - sphereCenter.x; const yRange = -radius / 2 < this.views.perspective.camera.position.y - sphereCenter.y @@ -245,32 +919,138 @@ export class Canvas3dViewImpl implements Canvas3dView, Listener { newZ = sphereCenter.z; } if (newX || newY || newZ) { - this.positionAllViews(newX, newY, newZ); + this.action.frameCoordinates = { x: newX, y: newY, z: newZ }; + this.positionAllViews(newX, newY, newZ, false); } - this.views.perspective.scene.add(points); + + [ViewType.TOP, ViewType.SIDE, ViewType.FRONT].forEach((view: ViewType): void => { + this.globalHelpers[view].resize = []; + this.globalHelpers[view].rotation = []; + }); + + this.views.perspective.scene.add(points.clone()); + // Setup TopView + const canvasTopView = this.views.top.renderer.domElement; + const topScenePlane = new THREE.Mesh( + new THREE.PlaneBufferGeometry( + canvasTopView.offsetHeight, + canvasTopView.offsetWidth, + canvasTopView.offsetHeight, + canvasTopView.offsetWidth, + ), + new THREE.MeshBasicMaterial({ + color: 0xffffff, + alphaTest: 0, + visible: false, + transparent: true, + opacity: 0, + }), + ); + topScenePlane.position.set(0, 0, 0); + topScenePlane.name = Planes.TOP; + (topScenePlane.material as THREE.MeshBasicMaterial).side = THREE.DoubleSide; + (topScenePlane as any).verticesNeedUpdate = true; + // eslint-disable-next-line no-param-reassign + points.material = material; + material.size = 0.5; this.views.top.scene.add(points.clone()); + this.views.top.scene.add(topScenePlane); + const topRotationHelper = Canvas3dViewImpl.setupRotationHelper(); + this.globalHelpers.top.rotation.push(topRotationHelper); + this.views.top.scene.add(topRotationHelper); + this.setupResizeHelper(ViewType.TOP); + // Setup Side View + const canvasSideView = this.views.side.renderer.domElement; + const sideScenePlane = new THREE.Mesh( + new THREE.PlaneBufferGeometry( + canvasSideView.offsetHeight, + canvasSideView.offsetWidth, + canvasSideView.offsetHeight, + canvasSideView.offsetWidth, + ), + new THREE.MeshBasicMaterial({ + color: 0xffffff, + alphaTest: 0, + visible: false, + transparent: true, + opacity: 0, + }), + ); + sideScenePlane.position.set(0, 0, 0); + sideScenePlane.rotation.set(-Math.PI / 2, Math.PI / 2000, Math.PI); + sideScenePlane.name = Planes.SIDE; + (sideScenePlane.material as THREE.MeshBasicMaterial).side = THREE.DoubleSide; + (sideScenePlane as any).verticesNeedUpdate = true; this.views.side.scene.add(points.clone()); + this.views.side.scene.add(sideScenePlane); + const sideRotationHelper = Canvas3dViewImpl.setupRotationHelper(); + this.globalHelpers.side.rotation.push(sideRotationHelper); + this.views.side.scene.add(sideRotationHelper); + this.setupResizeHelper(ViewType.SIDE); + // Setup front View + const canvasFrontView = this.views.front.renderer.domElement; + const frontScenePlane = new THREE.Mesh( + new THREE.PlaneBufferGeometry( + canvasFrontView.offsetHeight, + canvasFrontView.offsetWidth, + canvasFrontView.offsetHeight, + canvasFrontView.offsetWidth, + ), + new THREE.MeshBasicMaterial({ + color: 0xffffff, + alphaTest: 0, + visible: false, + transparent: true, + opacity: 0, + }), + ); + frontScenePlane.position.set(0, 0, 0); + frontScenePlane.rotation.set(0, Math.PI / 2, 0); + frontScenePlane.name = Planes.FRONT; + (frontScenePlane.material as THREE.MeshBasicMaterial).side = THREE.DoubleSide; + (frontScenePlane as any).verticesNeedUpdate = true; this.views.front.scene.add(points.clone()); + this.views.front.scene.add(frontScenePlane); + const frontRotationHelper = Canvas3dViewImpl.setupRotationHelper(); + this.globalHelpers.front.rotation.push(frontRotationHelper); + this.views.front.scene.add(frontRotationHelper); + this.setupResizeHelper(ViewType.FRONT); + this.setHelperVisibility(false); + this.setupObjects(); } - private positionAllViews(x: number, y: number, z: number): void { - this.views.perspective.controls.setLookAt(x - 8, y - 8, z + 3, x, y, z, false); - this.views.top.controls.setLookAt(x, y, z + 8, x, y, z, false); - this.views.side.controls.setLookAt(x, y + 8, z, x, y, z, false); - this.views.front.controls.setLookAt(x + 8, y, z, x, y, z, false); + private positionAllViews(x: number, y: number, z: number, animation: boolean): void { + if ( + this.views.perspective.controls + && this.views.top.controls + && this.views.side.controls + && this.views.front.controls + ) { + this.views.perspective.controls.setLookAt(x - 8, y - 8, z + 3, x, y, z, animation); + this.views.top.camera.position.set(x, y, z + 8); + this.views.top.camera.lookAt(x, y, z); + this.views.top.camera.zoom = CONST.FOV_DEFAULT; + this.views.side.camera.position.set(x, y + 8, z); + this.views.side.camera.lookAt(x, y, z); + this.views.side.camera.zoom = CONST.FOV_DEFAULT; + this.views.front.camera.position.set(x + 8, y, z); + this.views.front.camera.lookAt(x, y, z); + this.views.front.camera.zoom = CONST.FOV_DEFAULT; + } } private static resizeRendererToDisplaySize(viewName: string, view: RenderView): void { const { camera, renderer } = view; const canvas = renderer.domElement; + if (!canvas.parentElement) return; const width = canvas.parentElement.clientWidth; const height = canvas.parentElement.clientHeight; const needResize = canvas.clientWidth !== width || canvas.clientHeight !== height; - if (needResize) { + if (needResize && camera && view.camera) { if (camera instanceof THREE.PerspectiveCamera) { camera.aspect = width / height; } else { - const topViewFactor = 0; // viewName === ViewType.TOP ? 2 : 0; + const topViewFactor = 0; const viewSize = CONST.ZOOM_FACTOR; const aspectRatio = width / height; if (!(camera instanceof THREE.PerspectiveCamera)) { @@ -279,8 +1059,8 @@ export class Canvas3dViewImpl implements Canvas3dView, Listener { camera.top = viewSize / 2 + topViewFactor; camera.bottom = -viewSize / 2 - topViewFactor; } - camera.near = -10; - camera.far = 10; + camera.near = -50; + camera.far = 50; } view.renderer.setSize(width, height); view.camera.updateProjectionMatrix(); @@ -298,86 +1078,714 @@ export class Canvas3dViewImpl implements Canvas3dView, Listener { this.views.perspective.scene.children[0].add(this.cube.perspective); const newPoints = intersects[0].point; this.cube.perspective.position.copy(newPoints); + this.views.perspective.renderer.domElement.style.cursor = 'default'; } } else if (this.mode === Mode.IDLE) { - const intersects = this.views.perspective.rayCaster.renderer.intersectObjects( - this.views.perspective.scene.children[0].children, - false, - ); + const { children } = this.views.perspective.scene.children[0]; + const { renderer } = this.views.perspective.rayCaster; + const intersects = renderer.intersectObjects(children, false); if (intersects.length !== 0) { - this.views.perspective.scene.children[0].children.forEach((sceneItem: THREE.Mesh): void => { - if (this.selected.perspective !== sceneItem) { - // eslint-disable-next-line no-param-reassign - sceneItem.material.color = new THREE.Color(0xff0000); - } - }); - const selectedObject = intersects[0].object as THREE.Mesh; - if (this.selected.perspective !== selectedObject) { - selectedObject.material.color = new THREE.Color(0xffff00); - this.highlighted = true; + const clientID = intersects[0].object.name; + if (clientID === undefined || clientID === '' || this.model.data.focusData.clientID === clientID) { + return; } - } else { - if (this.highlighted) { - this.views.perspective.scene.children[0].children.forEach((sceneItem: THREE.Mesh): void => { - if (this.selected.perspective !== sceneItem) { - // eslint-disable-next-line no-param-reassign - sceneItem.material.color = new THREE.Color(0xff0000); - } - }); - } - this.highlighted = false; + if (!this.action.selectable) return; + this.resetColor(); + const object = this.views.perspective.scene.getObjectByName(clientID); + if (object === undefined) return; + this.model.data.focusData.clientID = clientID; + this.dispatchEvent( + new CustomEvent('canvas.selected', { + bubbles: false, + cancelable: true, + detail: { + clientID: Number(intersects[0].object.name), + }, + }), + ); + } else if (this.model.data.focusData.clientID !== null) { + this.resetColor(); + this.model.data.focusData.clientID = null; } } }; + private resetColor(): void { + this.model.data.objects.forEach((object: any): void => { + const { clientID } = object; + const target = this.views.perspective.scene.getObjectByName(String(clientID)); + if (target) { + ((target as THREE.Mesh).material as THREE.MeshBasicMaterial).color.set((target as any).originalColor); + } + }); + } + public render(): void { Object.keys(this.views).forEach((view: string): void => { const viewType = this.views[view as keyof Views]; + if (!(viewType.controls && viewType.camera && viewType.rayCaster)) return; Canvas3dViewImpl.resizeRendererToDisplaySize(view, viewType); - viewType.controls.update(this.clock.getDelta()); + if (viewType.controls.enabled) { + viewType.controls.update(this.clock.getDelta()); + } else { + viewType.camera.updateProjectionMatrix(); + } viewType.renderer.render(viewType.scene, viewType.camera); if (view === ViewType.PERSPECTIVE && viewType.scene.children.length !== 0) { this.renderRayCaster(viewType); } + const { clientID } = this.model.data.activeElement; + if (clientID !== 'null' && view !== ViewType.PERSPECTIVE) { + viewType.rayCaster.renderer.setFromCamera(viewType.rayCaster.mouseVector, viewType.camera); + // First Scan + if (this.action.scan === view) { + if (!(this.action.translation.status || this.action.resize.status || this.action.rotation.status)) { + this.initiateAction(view, viewType); + } + // Action Operations + if (this.action.detected) { + if (this.action.translation.status) { + this.renderTranslateAction(view as ViewType, viewType); + } else if (this.action.resize.status) { + this.renderResizeAction(view as ViewType, viewType); + } else { + this.renderRotateAction(view as ViewType, viewType); + } + this.updateRotationHelperPos(); + this.updateResizeHelperPos(); + } + } + } + }); + if (this.action.detachCam && this.action.detachCamRef === this.model.data.activeElement.clientID) { + try { + this.detachCamera(null); + // eslint-disable-next-line no-empty + } catch (e) { + } finally { + this.action.detachCam = false; + } + } + } + + private adjustPerspectiveCameras(): void { + const coordinatesTop = this.model.data.selected.getReferenceCoordinates(ViewType.TOP); + const sphericalTop = new THREE.Spherical(); + sphericalTop.setFromVector3(coordinatesTop); + this.views.top.camera.position.setFromSpherical(sphericalTop); + this.views.top.camera.updateProjectionMatrix(); + + const coordinatesSide = this.model.data.selected.getReferenceCoordinates(ViewType.SIDE); + const sphericalSide = new THREE.Spherical(); + sphericalSide.setFromVector3(coordinatesSide); + this.views.side.camera.position.setFromSpherical(sphericalSide); + this.views.side.camera.updateProjectionMatrix(); + + const coordinatesFront = this.model.data.selected.getReferenceCoordinates(ViewType.FRONT); + const sphericalFront = new THREE.Spherical(); + sphericalFront.setFromVector3(coordinatesFront); + this.views.front.camera.position.setFromSpherical(sphericalFront); + this.views.front.camera.updateProjectionMatrix(); + } + + private renderTranslateAction(view: ViewType, viewType: any): void { + if ( + this.action.translation.helper.x === this.views[view].rayCaster.mouseVector.x + && this.action.translation.helper.y === this.views[view].rayCaster.mouseVector.y + ) { + return; + } + const intersects = viewType.rayCaster.renderer.intersectObjects( + [viewType.scene.getObjectByName(`${view}Plane`)], + true, + ); + + if (intersects.length !== 0 && intersects[0].point) { + const coordinates = intersects[0].point; + this.action.translation.coordinates = coordinates; + this.moveObject(coordinates); + } + } + + private moveObject(coordinates: THREE.Vector3): void { + const { + perspective, top, side, front, + } = this.model.data.selected; + let localCoordinates = coordinates; + if (this.action.translation.status) { + localCoordinates = coordinates + .clone() + .sub(this.action.translation.offset) + .applyMatrix4(this.action.translation.inverseMatrix); + } + perspective.position.copy(localCoordinates.clone()); + top.position.copy(localCoordinates.clone()); + side.position.copy(localCoordinates.clone()); + front.position.copy(localCoordinates.clone()); + } + + private setSelectedChildScale(x: number, y: number, z: number): void { + [ViewType.TOP, ViewType.SIDE, ViewType.FRONT].forEach((view: ViewType): void => { + this.model.data.selected[view].children.forEach((element: any): void => { + if (element.name !== CONST.CUBOID_EDGE_NAME) { + element.scale.set( + x == null ? element.scale.x : x, + y == null ? element.scale.y : y, + z == null ? element.scale.z : z, + ); + } + }); }); } + private renderResizeAction(view: ViewType, viewType: any): void { + const intersects = viewType.rayCaster.renderer.intersectObjects( + [viewType.scene.getObjectByName(`${view}Plane`)], + true, + ); + // Return if no intersection with the reference plane + if (intersects.length === 0) return; + const { x: scaleInitX, y: scaleInitY, z: scaleInitZ } = this.action.resize.initScales; + const { x: scaleMemX, y: scaleMemY, z: scaleMemZ } = this.action.resize.memScales; + const { x: initPosX, y: initPosY } = this.action.resize.helper; + const { x: currentPosX, y: currentPosY } = viewType.rayCaster.mouseVector; + const { resizeVector } = this.action.resize; + + if (this.action.resize.helper.x === currentPosX && this.action.resize.helper.y === currentPosY) { + return; + } + + if ( + this.action.resize.recentMouseVector.x === currentPosX + && this.action.resize.recentMouseVector.y === currentPosY + ) { + return; + } + this.action.resize.recentMouseVector = viewType.rayCaster.mouseVector.clone(); + switch (view) { + case ViewType.TOP: { + let y = scaleInitX * (currentPosX / initPosX); + let x = scaleInitY * (currentPosY / initPosY); + if (x < 0) x = 0.2; + if (y < 0) y = 0.2; + this.model.data.selected.setScale(y, x, this.model.data.selected.top.scale.z); + this.setSelectedChildScale(1 / y, 1 / x, null); + const differenceX = y / 2 - scaleMemX / 2; + const differenceY = x / 2 - scaleMemY / 2; + + if (currentPosX > 0 && currentPosY < 0) { + resizeVector.x += differenceX; + resizeVector.y -= differenceY; + } else if (currentPosX > 0 && currentPosY > 0) { + resizeVector.x += differenceX; + resizeVector.y += differenceY; + } else if (currentPosX < 0 && currentPosY < 0) { + resizeVector.x -= differenceX; + resizeVector.y -= differenceY; + } else if (currentPosX < 0 && currentPosY > 0) { + resizeVector.x -= differenceX; + resizeVector.y += differenceY; + } + + this.action.resize.memScales.x = y; + this.action.resize.memScales.y = x; + break; + } + case ViewType.SIDE: { + let x = scaleInitX * (currentPosX / initPosX); + let z = scaleInitZ * (currentPosY / initPosY); + if (x < 0) x = 0.2; + if (z < 0) z = 0.2; + this.model.data.selected.setScale(x, this.model.data.selected.top.scale.y, z); + this.setSelectedChildScale(1 / x, null, 1 / z); + const differenceX = x / 2 - scaleMemX / 2; + const differenceY = z / 2 - scaleMemZ / 2; + + if (currentPosX > 0 && currentPosY < 0) { + resizeVector.x += differenceX; + resizeVector.y -= differenceY; + } else if (currentPosX > 0 && currentPosY > 0) { + resizeVector.x += differenceX; + resizeVector.y += differenceY; + } else if (currentPosX < 0 && currentPosY < 0) { + resizeVector.x -= differenceX; + resizeVector.y -= differenceY; + } else if (currentPosX < 0 && currentPosY > 0) { + resizeVector.x -= differenceX; + resizeVector.y += differenceY; + } + + this.action.resize.memScales = { ...this.action.resize.memScales, x, z }; + break; + } + case ViewType.FRONT: { + let y = scaleInitY * (currentPosX / initPosX); + let z = scaleInitZ * (currentPosY / initPosY); + if (y < 0) y = 0.2; + if (z < 0) z = 0.2; + this.model.data.selected.setScale(this.model.data.selected.top.scale.x, y, z); + this.setSelectedChildScale(null, 1 / y, 1 / z); + let differenceX; + let differenceY; + + if (!this.action.resize.frontBool) { + differenceX = z / 2 - scaleMemZ / 2; + differenceY = y / 2 - scaleMemY / 2; + this.action.resize.frontBool = true; + } else { + differenceX = z / 2 - scaleMemY / 2; + differenceY = y / 2 - scaleMemZ / 2; + } + if (currentPosX > 0 && currentPosY < 0) { + resizeVector.x += differenceX; + resizeVector.y += differenceY; + } else if (currentPosX > 0 && currentPosY > 0) { + resizeVector.x -= differenceX; + resizeVector.y += differenceY; + } else if (currentPosX < 0 && currentPosY < 0) { + resizeVector.x += differenceX; + resizeVector.y -= differenceY; + } else if (currentPosX < 0 && currentPosY > 0) { + resizeVector.x -= differenceX; + resizeVector.y -= differenceY; + } + + this.action.resize.memScales.y = z; + this.action.resize.memScales.z = y; + break; + } + default: + } + const coordinates = resizeVector.clone(); + intersects[0].object.localToWorld(coordinates); + this.moveObject(coordinates); + this.adjustPerspectiveCameras(); + } + + private static isLeft(a: any, b: any, c: any): boolean { + // For reference + // A + // |\ // A = Rotation Center + // | \ // B = Previous Frame Position + // | C // C = Current Frame Position + // B + return (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x) > 0; + } + + private rotateCube(instance: CuboidModel, direction: number, view: ViewType): void { + switch (view) { + case ViewType.TOP: + instance.perspective.rotateZ(direction); + instance.top.rotateZ(direction); + instance.side.rotateZ(direction); + instance.front.rotateZ(direction); + this.rotateCamera(direction, view); + break; + case ViewType.FRONT: + instance.perspective.rotateX(direction); + instance.top.rotateX(direction); + instance.side.rotateX(direction); + instance.front.rotateX(direction); + this.rotateCamera(direction, view); + break; + case ViewType.SIDE: + instance.perspective.rotateY(direction); + instance.top.rotateY(direction); + instance.side.rotateY(direction); + instance.front.rotateY(direction); + this.rotateCamera(direction, view); + break; + default: + } + } + + private rotateCamera(direction: any, view: ViewType): void { + switch (view) { + case ViewType.TOP: + this.views.top.camera.rotateZ(direction); + break; + case ViewType.FRONT: + this.views.front.camera.rotateZ(direction); + break; + case ViewType.SIDE: + this.views.side.camera.rotateZ(direction); + break; + default: + } + } + + private attachCamera(view: ViewType): void { + switch (view) { + case ViewType.TOP: + this.model.data.selected.side.attach(this.views.side.camera); + this.model.data.selected.front.attach(this.views.front.camera); + break; + case ViewType.SIDE: + this.model.data.selected.front.attach(this.views.front.camera); + this.model.data.selected.top.attach(this.views.top.camera); + break; + case ViewType.FRONT: + this.model.data.selected.side.attach(this.views.side.camera); + this.model.data.selected.top.attach(this.views.top.camera); + break; + default: + } + } + + private detachCamera(view: ViewType): void { + const coordTop = this.model.data.selected.getReferenceCoordinates(ViewType.TOP); + const sphericaltop = new THREE.Spherical(); + sphericaltop.setFromVector3(coordTop); + + const coordSide = this.model.data.selected.getReferenceCoordinates(ViewType.SIDE); + const sphericalside = new THREE.Spherical(); + sphericalside.setFromVector3(coordSide); + + const coordFront = this.model.data.selected.getReferenceCoordinates(ViewType.FRONT); + const sphericalfront = new THREE.Spherical(); + sphericalfront.setFromVector3(coordFront); + + const { side: objectSideView, front: objectFrontView, top: objectTopView } = this.model.data.selected; + const { camera: sideCamera } = this.views.side; + const { camera: frontCamera } = this.views.front; + const { camera: topCamera } = this.views.top; + + switch (view) { + case ViewType.TOP: { + const camRotationSide = objectSideView + .getObjectByName('cameraSide') + .getWorldQuaternion(new THREE.Quaternion()); + objectSideView.remove(sideCamera); + sideCamera.position.setFromSpherical(sphericalside); + sideCamera.lookAt(objectSideView.position.x, objectSideView.position.y, objectSideView.position.z); + sideCamera.setRotationFromQuaternion(camRotationSide); + sideCamera.scale.set(1, 1, 1); + + const camRotationFront = objectFrontView + .getObjectByName('cameraFront') + .getWorldQuaternion(new THREE.Quaternion()); + objectFrontView.remove(frontCamera); + frontCamera.position.setFromSpherical(sphericalfront); + frontCamera.lookAt(objectFrontView.position.x, objectFrontView.position.y, objectFrontView.position.z); + frontCamera.setRotationFromQuaternion(camRotationFront); + frontCamera.scale.set(1, 1, 1); + break; + } + case ViewType.SIDE: { + const camRotationFront = objectFrontView + .getObjectByName('cameraFront') + .getWorldQuaternion(new THREE.Quaternion()); + objectFrontView.remove(frontCamera); + frontCamera.position.setFromSpherical(sphericalfront); + frontCamera.lookAt(objectFrontView.position.x, objectFrontView.position.y, objectFrontView.position.z); + frontCamera.setRotationFromQuaternion(camRotationFront); + frontCamera.scale.set(1, 1, 1); + + objectTopView.remove(topCamera); + topCamera.position.setFromSpherical(sphericaltop); + topCamera.lookAt(objectTopView.position.x, objectTopView.position.y, objectTopView.position.z); + topCamera.setRotationFromEuler(objectTopView.rotation); + topCamera.scale.set(1, 1, 1); + break; + } + case ViewType.FRONT: { + const camRotationSide = objectSideView + .getObjectByName('cameraSide') + .getWorldQuaternion(new THREE.Quaternion()); + objectSideView.remove(sideCamera); + sideCamera.position.setFromSpherical(sphericalside); + sideCamera.lookAt(objectSideView.position.x, objectSideView.position.y, objectSideView.position.z); + sideCamera.setRotationFromQuaternion(camRotationSide); + sideCamera.scale.set(1, 1, 1); + + objectTopView.remove(topCamera); + topCamera.position.setFromSpherical(sphericaltop); + topCamera.lookAt(objectTopView.position.x, objectTopView.position.y, objectTopView.position.z); + topCamera.setRotationFromEuler(objectTopView.rotation); + topCamera.scale.set(1, 1, 1); + break; + } + default: { + sideCamera.position.setFromSpherical(sphericalside); + sideCamera.lookAt(objectSideView.position.x, objectSideView.position.y, objectSideView.position.z); + sideCamera.rotation.z = this.views.side.scene.getObjectByName(Planes.SIDE).rotation.z; + sideCamera.scale.set(1, 1, 1); + + topCamera.position.setFromSpherical(sphericaltop); + topCamera.lookAt(objectTopView.position.x, objectTopView.position.y, objectTopView.position.z); + topCamera.setRotationFromEuler(objectTopView.rotation); + topCamera.scale.set(1, 1, 1); + + const camFrontRotate = objectFrontView + .getObjectByName('camRefRot') + .getWorldQuaternion(new THREE.Quaternion()); + frontCamera.position.setFromSpherical(sphericalfront); + frontCamera.lookAt(objectFrontView.position.x, objectFrontView.position.y, objectFrontView.position.z); + frontCamera.setRotationFromQuaternion(camFrontRotate); + frontCamera.scale.set(1, 1, 1); + } + } + } + + private rotatePlane(direction: number, view: ViewType): void { + const sceneTopPlane = this.views.top.scene.getObjectByName(Planes.TOP); + const sceneSidePlane = this.views.side.scene.getObjectByName(Planes.SIDE); + const sceneFrontPlane = this.views.front.scene.getObjectByName(Planes.FRONT); + switch (view) { + case ViewType.TOP: + sceneTopPlane.rotateZ(direction); + sceneSidePlane.rotateY(direction); + sceneFrontPlane.rotateX(-direction); + break; + case ViewType.SIDE: + sceneTopPlane.rotateY(direction); + sceneSidePlane.rotateZ(direction); + sceneFrontPlane.rotateY(direction); + break; + case ViewType.FRONT: + sceneTopPlane.rotateX(direction); + sceneSidePlane.rotateX(-direction); + sceneFrontPlane.rotateZ(direction); + break; + default: { + const { top: objectTopView, side: objectSideView, front: objectFrontView } = this.model.data.selected; + objectTopView.add(sceneTopPlane); + objectSideView.add(sceneSidePlane); + objectFrontView.add(sceneFrontPlane); + objectTopView.getObjectByName(Planes.TOP).rotation.set(0, 0, 0); + objectSideView.getObjectByName(Planes.SIDE).rotation.set(-Math.PI / 2, Math.PI / 2000, Math.PI); + objectFrontView.getObjectByName(Planes.FRONT).rotation.set(0, Math.PI / 2, 0); + + const quaternionSide = new THREE.Quaternion(); + objectSideView.getObjectByName(Planes.SIDE).getWorldQuaternion(quaternionSide); + const rotationSide = new THREE.Euler(); + rotationSide.setFromQuaternion(quaternionSide); + + const quaternionFront = new THREE.Quaternion(); + objectFrontView.getObjectByName(Planes.FRONT).getWorldQuaternion(quaternionFront); + const rotationFront = new THREE.Euler(); + rotationFront.setFromQuaternion(quaternionFront); + + const quaternionTop = new THREE.Quaternion(); + objectTopView.getObjectByName(Planes.TOP).getWorldQuaternion(quaternionTop); + const rotationTop = new THREE.Euler(); + rotationTop.setFromQuaternion(quaternionTop); + + objectTopView.remove(sceneTopPlane); + objectSideView.remove(sceneSidePlane); + objectFrontView.remove(sceneFrontPlane); + + const canvasTopView = this.views.top.renderer.domElement; + const planeTop = new THREE.Mesh( + new THREE.PlaneBufferGeometry( + canvasTopView.offsetHeight, + canvasTopView.offsetWidth, + canvasTopView.offsetHeight, + canvasTopView.offsetWidth, + ), + new THREE.MeshBasicMaterial({ + color: 0xff0000, + alphaTest: 0, + visible: false, + transparent: true, + opacity: 0.1, + }), + ); + planeTop.name = Planes.TOP; + (planeTop.material as THREE.MeshBasicMaterial).side = THREE.DoubleSide; + + const canvasSideView = this.views.side.renderer.domElement; + const planeSide = new THREE.Mesh( + new THREE.PlaneBufferGeometry( + canvasSideView.offsetHeight, + canvasSideView.offsetWidth, + canvasSideView.offsetHeight, + canvasSideView.offsetWidth, + ), + new THREE.MeshBasicMaterial({ + color: 0x00ff00, + alphaTest: 0, + visible: false, + transparent: true, + opacity: 0.1, + }), + ); + planeSide.name = Planes.SIDE; + (planeSide.material as THREE.MeshBasicMaterial).side = THREE.DoubleSide; + + const canvasFrontView = this.views.front.renderer.domElement; + const planeFront = new THREE.Mesh( + new THREE.PlaneBufferGeometry( + canvasFrontView.offsetHeight, + canvasFrontView.offsetWidth, + canvasFrontView.offsetHeight, + canvasFrontView.offsetWidth, + ), + new THREE.MeshBasicMaterial({ + color: 0x0000ff, + alphaTest: 0, + visible: false, + transparent: true, + opacity: 0.5, + }), + ); + planeFront.name = Planes.FRONT; + (planeFront.material as THREE.MeshBasicMaterial).side = THREE.DoubleSide; + + const coordinates = { + x: objectTopView.position.x, + y: objectTopView.position.y, + z: objectTopView.position.z, + }; + + planeTop.rotation.set(rotationTop.x, rotationTop.y, rotationTop.z); + planeSide.rotation.set(rotationSide.x, rotationSide.y, rotationSide.z); + planeFront.rotation.set(rotationFront.x, rotationFront.y, rotationFront.z); + this.views.top.scene.add(planeTop); + this.views.side.scene.add(planeSide); + this.views.front.scene.add(planeFront); + + this.translateReferencePlane(coordinates); + } + } + } + + private renderRotateAction(view: ViewType, viewType: any): void { + const rotationSpeed = Math.PI / CONST.ROTATION_SPEED; + const { renderer } = viewType; + const canvas = renderer.domElement; + if (!canvas) return; + const canvasCentre = { + x: canvas.offsetLeft + canvas.offsetWidth / 2, + y: canvas.offsetTop + canvas.offsetHeight / 2, + }; + if ( + this.action.rotation.screenInit.x === this.action.rotation.screenMove.x + && this.action.rotation.screenInit.y === this.action.rotation.screenMove.y + ) { + return; + } + + if ( + this.action.rotation.recentMouseVector.x === this.views[view].rayCaster.mouseVector.x + && this.action.rotation.recentMouseVector.y === this.views[view].rayCaster.mouseVector.y + ) { + return; + } + this.action.rotation.recentMouseVector = this.views[view].rayCaster.mouseVector.clone(); + if (Canvas3dViewImpl.isLeft(canvasCentre, this.action.rotation.screenInit, this.action.rotation.screenMove)) { + this.rotateCube(this.model.data.selected, -rotationSpeed, view); + this.rotatePlane(-rotationSpeed, view); + } else { + this.rotateCube(this.model.data.selected, rotationSpeed, view); + this.rotatePlane(rotationSpeed, view); + } + this.action.rotation.screenInit.x = this.action.rotation.screenMove.x; + this.action.rotation.screenInit.y = this.action.rotation.screenMove.y; + } + + private initiateAction(view: string, viewType: any): void { + const intersectsHelperResize = viewType.rayCaster.renderer.intersectObjects( + this.globalHelpers[view].resize, + false, + ); + const [state] = this.model.data.objects.filter( + (_state: any): boolean => _state.clientID === Number(this.model.data.selected[view].name), + ); + if (state.lock) return; + + if (intersectsHelperResize.length !== 0) { + this.action.resize.helper = viewType.rayCaster.mouseVector.clone(); + this.action.resize.status = true; + this.action.detected = true; + this.views.top.controls.enabled = false; + this.views.side.controls.enabled = false; + this.views.front.controls.enabled = false; + const { x, y, z } = this.model.data.selected[view].scale; + this.action.resize.initScales = { x, y, z }; + this.action.resize.memScales = { x, y, z }; + this.action.resize.frontBool = false; + this.action.resize.resizeVector = new THREE.Vector3(0, 0, 0); + return; + } + const intersectsHelperRotation = viewType.rayCaster.renderer.intersectObjects( + this.globalHelpers[view].rotation, + false, + ); + if (intersectsHelperRotation.length !== 0) { + this.action.rotation.helper = viewType.rayCaster.mouseVector.clone(); + this.action.rotation.status = true; + this.action.detected = true; + this.views.top.controls.enabled = false; + this.views.side.controls.enabled = false; + this.views.front.controls.enabled = false; + this.attachCamera(view as ViewType); + return; + } + + const intersectsBox = viewType.rayCaster.renderer.intersectObjects([this.model.data.selected[view]], false); + const intersectsPointCloud = viewType.rayCaster.renderer.intersectObjects( + [viewType.scene.getObjectByName(`${view}Plane`)], + true, + ); + if (intersectsBox.length !== 0) { + // const [state] = this.model.data.objects.filter( + // (_state: any): boolean => _state.clientID === Number(this.model.data.selected[view].name), + // ); + if (state.pinned) return; + this.action.translation.helper = viewType.rayCaster.mouseVector.clone(); + this.action.translation.inverseMatrix = intersectsBox[0].object.parent.matrixWorld.invert(); + this.action.translation.offset = intersectsPointCloud[0].point.sub( + new THREE.Vector3().setFromMatrixPosition(intersectsBox[0].object.matrixWorld), + ); + this.action.translation.status = true; + this.action.detected = true; + this.views.top.controls.enabled = false; + this.views.side.controls.enabled = false; + this.views.front.controls.enabled = false; + } + } + public keyControls(key: any): void { const { controls } = this.views.perspective; + if (!controls) return; switch (key.code) { - case CAMERA_ACTION.ROTATE_RIGHT: + case CameraAction.ROTATE_RIGHT: controls.rotate(0.1 * THREE.MathUtils.DEG2RAD * this.speed, 0, true); break; - case CAMERA_ACTION.ROTATE_LEFT: + case CameraAction.ROTATE_LEFT: controls.rotate(-0.1 * THREE.MathUtils.DEG2RAD * this.speed, 0, true); break; - case CAMERA_ACTION.TILT_UP: + case CameraAction.TILT_UP: controls.rotate(0, -0.05 * THREE.MathUtils.DEG2RAD * this.speed, true); break; - case CAMERA_ACTION.TILT_DOWN: + case CameraAction.TILT_DOWN: controls.rotate(0, 0.05 * THREE.MathUtils.DEG2RAD * this.speed, true); break; + case 'ControlLeft': + this.action.selectable = !key.ctrlKey; + break; default: break; } if (key.altKey === true) { switch (key.code) { - case CAMERA_ACTION.ZOOM_IN: + case CameraAction.ZOOM_IN: controls.dolly(CONST.DOLLY_FACTOR, true); break; - case CAMERA_ACTION.ZOOM_OUT: + case CameraAction.ZOOM_OUT: controls.dolly(-CONST.DOLLY_FACTOR, true); break; - case CAMERA_ACTION.MOVE_LEFT: + case CameraAction.MOVE_LEFT: controls.truck(-0.01 * this.speed, 0, true); break; - case CAMERA_ACTION.MOVE_RIGHT: + case CameraAction.MOVE_RIGHT: controls.truck(0.01 * this.speed, 0, true); break; - case CAMERA_ACTION.MOVE_DOWN: + case CameraAction.MOVE_DOWN: controls.truck(0, -0.01 * this.speed, true); break; - case CAMERA_ACTION.MOVE_UP: + case CameraAction.MOVE_UP: controls.truck(0, 0.01 * this.speed, true); break; default: @@ -386,46 +1794,6 @@ export class Canvas3dViewImpl implements Canvas3dView, Listener { } } - public mouseControls(type: MouseInteraction, event: MouseEvent): void { - event.preventDefault(); - if (type === MouseInteraction.DOUBLE_CLICK && this.mode === Mode.DRAW) { - this.controller.drawData.enabled = false; - this.mode = Mode.IDLE; - const cancelEvent: CustomEvent = new CustomEvent('canvas.canceled'); - this.views.perspective.renderer.domElement.dispatchEvent(cancelEvent); - } else { - const canvas = this.views.perspective.renderer.domElement; - const rect = canvas.getBoundingClientRect(); - const { mouseVector } = this.views.perspective.rayCaster; - mouseVector.x = ((event.clientX - (canvas.offsetLeft + rect.left)) / canvas.clientWidth) * 2 - 1; - mouseVector.y = -((event.clientY - (canvas.offsetTop + rect.top)) / canvas.clientHeight) * 2 + 1; - - if (type === MouseInteraction.CLICK && this.mode === Mode.IDLE) { - const intersects = this.views.perspective.rayCaster.renderer.intersectObjects( - this.views.perspective.scene.children[0].children, - false, - ); - if (intersects.length !== 0) { - this.views.perspective.scene.children[0].children.forEach((sceneItem: THREE.Mesh): void => { - // eslint-disable-next-line no-param-reassign - sceneItem.material.color = new THREE.Color(0xff0000); - }); - const selectedObject = intersects[0].object; - selectedObject.material.color = new THREE.Color(0x00ffff); - Object.keys(this.views).forEach((view: string): void => { - if (view !== ViewType.PERSPECTIVE) { - this.views[view as keyof Views].scene.children[0].children = [selectedObject.clone()]; - this.views[view as keyof Views].controls.fitToBox(selectedObject, false); - this.views[view as keyof Views].controls.zoom(view === ViewType.TOP ? -5 : -5, false); - } - this.views[view as keyof Views].scene.background = new THREE.Color(0x000000); - }); - this.selected.perspective = selectedObject as THREE.Mesh; - } - } - } - } - public html(): ViewsDOM { return { perspective: this.views.perspective.renderer.domElement, diff --git a/cvat-canvas3d/src/typescript/consts.ts b/cvat-canvas3d/src/typescript/consts.ts index ea0b97c7b6e..3caf834a182 100644 --- a/cvat-canvas3d/src/typescript/consts.ts +++ b/cvat-canvas3d/src/typescript/consts.ts @@ -8,6 +8,15 @@ const DOLLY_FACTOR = 5; const MAX_DISTANCE = 100; const MIN_DISTANCE = 0; const ZOOM_FACTOR = 7; +const ROTATION_HELPER_OFFSET = 0.1; +const CAMERA_REFERENCE = 'camRef'; +const CUBOID_EDGE_NAME = 'edges'; +const ROTATION_HELPER = 'rotationHelper'; +const ROTATION_SPEED = 80; +const FOV_DEFAULT = 1; +const FOV_MAX = 2; +const FOV_MIN = 0; +const FOV_INC = 0.08; export default { BASE_GRID_WIDTH, @@ -16,4 +25,13 @@ export default { MAX_DISTANCE, MIN_DISTANCE, ZOOM_FACTOR, + ROTATION_HELPER_OFFSET, + CAMERA_REFERENCE, + CUBOID_EDGE_NAME, + ROTATION_HELPER, + ROTATION_SPEED, + FOV_DEFAULT, + FOV_MAX, + FOV_MIN, + FOV_INC, }; diff --git a/cvat-canvas3d/src/typescript/cuboid.ts b/cvat-canvas3d/src/typescript/cuboid.ts index 47a37e33c21..d293e40e558 100644 --- a/cvat-canvas3d/src/typescript/cuboid.ts +++ b/cvat-canvas3d/src/typescript/cuboid.ts @@ -2,6 +2,13 @@ // // SPDX-License-Identifier: MIT import * as THREE from 'three'; +import { BufferGeometryUtils } from 'three/examples/jsm/utils/BufferGeometryUtils'; +import { ViewType } from './canvas3dModel'; +import constants from './consts'; + +export interface Indexable { + [key: string]: any; +} export class CuboidModel { public perspective: THREE.Mesh; @@ -9,12 +16,174 @@ export class CuboidModel { public side: THREE.Mesh; public front: THREE.Mesh; - public constructor() { + public constructor(outline: string, outlineColor: string) { const geometry = new THREE.BoxGeometry(1, 1, 1); - const material = new THREE.MeshBasicMaterial({ color: 0x00ff00, wireframe: true }); + const material = new THREE.MeshBasicMaterial({ + color: 0x00ff00, + wireframe: false, + transparent: true, + opacity: 0.4, + }); this.perspective = new THREE.Mesh(geometry, material); + const geo = new THREE.EdgesGeometry(this.perspective.geometry); + const wireframe = new THREE.LineSegments( + geo, + outline === 'line' + ? new THREE.LineBasicMaterial({ color: outlineColor, linewidth: 4 }) + : new THREE.LineDashedMaterial({ + color: outlineColor, + dashSize: 0.05, + gapSize: 0.05, + }), + ); + wireframe.computeLineDistances(); + wireframe.renderOrder = 1; + this.perspective.add(wireframe); + this.top = new THREE.Mesh(geometry, material); this.side = new THREE.Mesh(geometry, material); this.front = new THREE.Mesh(geometry, material); + + const camRotateHelper = new THREE.Object3D(); + camRotateHelper.translateX(-2); + camRotateHelper.name = 'camRefRot'; + camRotateHelper.up = new THREE.Vector3(0, 0, 1); + camRotateHelper.lookAt(new THREE.Vector3(0, 0, 0)); + this.front.add(camRotateHelper.clone()); + } + + public setPosition(x: number, y: number, z: number): void { + [ViewType.PERSPECTIVE, ViewType.TOP, ViewType.SIDE, ViewType.FRONT].forEach((view): void => { + (this as Indexable)[view].position.set(x, y, z); + }); + } + + public setScale(x: number, y: number, z: number): void { + [ViewType.PERSPECTIVE, ViewType.TOP, ViewType.SIDE, ViewType.FRONT].forEach((view): void => { + (this as Indexable)[view].scale.set(x, y, z); + }); + } + + public setRotation(x: number, y: number, z: number): void { + [ViewType.PERSPECTIVE, ViewType.TOP, ViewType.SIDE, ViewType.FRONT].forEach((view): void => { + (this as Indexable)[view].rotation.set(x, y, z); + }); + } + + public attachCameraReference(): void { + // Attach Cam Reference + const topCameraReference = new THREE.Object3D(); + topCameraReference.translateZ(2); + topCameraReference.name = constants.CAMERA_REFERENCE; + this.top.add(topCameraReference); + this.top.userData = { ...this.top.userData, camReference: topCameraReference }; + + const sideCameraReference = new THREE.Object3D(); + sideCameraReference.translateY(2); + sideCameraReference.name = constants.CAMERA_REFERENCE; + this.side.add(sideCameraReference); + this.side.userData = { ...this.side.userData, camReference: sideCameraReference }; + + const frontCameraReference = new THREE.Object3D(); + frontCameraReference.translateX(2); + frontCameraReference.name = constants.CAMERA_REFERENCE; + this.front.add(frontCameraReference); + this.front.userData = { ...this.front.userData, camReference: frontCameraReference }; + } + + public getReferenceCoordinates(viewType: string): THREE.Vector3 { + const { elements } = (this as Indexable)[viewType].getObjectByName(constants.CAMERA_REFERENCE).matrixWorld; + return new THREE.Vector3(elements[12], elements[13], elements[14]); + } + + public setName(clientId: any): void { + [ViewType.PERSPECTIVE, ViewType.TOP, ViewType.SIDE, ViewType.FRONT].forEach((view): void => { + (this as Indexable)[view].name = clientId; + }); + } + + public setOriginalColor(color: string): void { + [ViewType.PERSPECTIVE, ViewType.TOP, ViewType.SIDE, ViewType.FRONT].forEach((view): void => { + ((this as Indexable)[view] as any).originalColor = color; + }); + } + + public setColor(color: string): void { + [ViewType.PERSPECTIVE, ViewType.TOP, ViewType.SIDE, ViewType.FRONT].forEach((view): void => { + ((this as Indexable)[view].material as THREE.MeshBasicMaterial).color.set(color); + }); + } + + public setOpacity(opacity: number): void { + [ViewType.PERSPECTIVE, ViewType.TOP, ViewType.SIDE, ViewType.FRONT].forEach((view): void => { + ((this as Indexable)[view].material as THREE.MeshBasicMaterial).opacity = opacity / 100; + }); + } +} + +export function setEdges(instance: THREE.Mesh): THREE.LineSegments { + const edges = new THREE.EdgesGeometry(instance.geometry); + const line = new THREE.LineSegments(edges, new THREE.LineBasicMaterial({ color: '#ffffff', linewidth: 3 })); + line.name = constants.CUBOID_EDGE_NAME; + instance.add(line); + return line; +} + +export function setTranslationHelper(instance: THREE.Mesh): void { + const sphereGeometry = new THREE.SphereGeometry(0.1); + const sphereMaterial = new THREE.MeshBasicMaterial({ color: '#ffffff', opacity: 1 }); + instance.geometry.deleteAttribute('normal'); + instance.geometry.deleteAttribute('uv'); + // eslint-disable-next-line no-param-reassign + instance.geometry = BufferGeometryUtils.mergeVertices(instance.geometry); + const vertices = []; + const positionAttribute = instance.geometry.getAttribute('position'); + for (let i = 0; i < positionAttribute.count; i++) { + const vertex = new THREE.Vector3(); + vertex.fromBufferAttribute(positionAttribute, i); + vertices.push(vertex); + } + const helpers = []; + for (let i = 0; i < vertices.length; i++) { + helpers[i] = new THREE.Mesh(sphereGeometry.clone(), sphereMaterial.clone()); + helpers[i].position.set(vertices[i].x, vertices[i].y, vertices[i].z); + helpers[i].up.set(0, 0, 1); + helpers[i].name = 'resizeHelper'; + instance.add(helpers[i]); + helpers[i].scale.set(1 / instance.scale.x, 1 / instance.scale.y, 1 / instance.scale.z); + } + // eslint-disable-next-line no-param-reassign + instance.userData = { ...instance.userData, resizeHelpers: helpers }; +} + +export function createRotationHelper(instance: THREE.Mesh, viewType: ViewType): void { + const sphereGeometry = new THREE.SphereGeometry(0.1); + const sphereMaterial = new THREE.MeshBasicMaterial({ color: '#ffffff', opacity: 1 }); + const rotationHelper = new THREE.Mesh(sphereGeometry, sphereMaterial); + rotationHelper.name = constants.ROTATION_HELPER; + switch (viewType) { + case ViewType.TOP: + rotationHelper.position.set( + (instance.geometry as THREE.BoxGeometry).parameters.height / 2 + constants.ROTATION_HELPER_OFFSET, + instance.position.y, + instance.position.z, + ); + instance.add(rotationHelper.clone()); + // eslint-disable-next-line no-param-reassign + instance.userData = { ...instance.userData, rotationHelpers: rotationHelper.clone() }; + break; + case ViewType.SIDE: + case ViewType.FRONT: + rotationHelper.position.set( + instance.position.x, + instance.position.y, + (instance.geometry as THREE.BoxGeometry).parameters.depth / 2 + constants.ROTATION_HELPER_OFFSET, + ); + instance.add(rotationHelper.clone()); + // eslint-disable-next-line no-param-reassign + instance.userData = { ...instance.userData, rotationHelpers: rotationHelper.clone() }; + break; + default: + break; } } diff --git a/cvat-core/src/annotations-objects.js b/cvat-core/src/annotations-objects.js index 7f5910e43a7..2116675663d 100644 --- a/cvat-core/src/annotations-objects.js +++ b/cvat-core/src/annotations-objects.js @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2020 Intel Corporation +// Copyright (C) 2021 Intel Corporation // // SPDX-License-Identifier: MIT @@ -324,11 +324,16 @@ checkObjectType('points', data.points, null, Array); checkNumberOfPoints(this.shapeType, data.points); // cut points - const { width, height } = this.frameMeta[frame]; + const { width, height, filename } = this.frameMeta[frame]; fittedPoints = fitPoints(this.shapeType, data.points, width, height); - - if (!checkShapeArea(this.shapeType, fittedPoints) || checkOutside(fittedPoints, width, height)) { - fittedPoints = []; + let check = true; + if (filename && filename.slice(filename.length - 3) === 'pcd') { + check = false; + } + if (check) { + if (!checkShapeArea(this.shapeType, fittedPoints) || checkOutside(fittedPoints, width, height)) { + fittedPoints = []; + } } } diff --git a/cvat-core/src/server-proxy.js b/cvat-core/src/server-proxy.js index d2b63a9b11b..cf31969a302 100644 --- a/cvat-core/src/server-proxy.js +++ b/cvat-core/src/server-proxy.js @@ -1082,9 +1082,7 @@ const closureId = Date.now(); predictAnnotations.latestRequest.id = closureId; - const predicate = () => ( - !predictAnnotations.latestRequest.fetching || predictAnnotations.latestRequest.id !== closureId - ); + const predicate = () => !predictAnnotations.latestRequest.fetching || predictAnnotations.latestRequest.id !== closureId; if (predictAnnotations.latestRequest.fetching) { waitFor(5, predicate).then(() => { if (predictAnnotations.latestRequest.id !== closureId) { diff --git a/cvat-ui/src/actions/annotation-actions.ts b/cvat-ui/src/actions/annotation-actions.ts index 0dd6eb55b9d..4e346c13e5a 100644 --- a/cvat-ui/src/actions/annotation-actions.ts +++ b/cvat-ui/src/actions/annotation-actions.ts @@ -7,7 +7,7 @@ import { ActionCreator, AnyAction, Dispatch, Store, } from 'redux'; import { ThunkAction } from 'utils/redux'; -import { RectDrawingMethod } from 'cvat-canvas-wrapper'; +import { RectDrawingMethod, Canvas } from 'cvat-canvas-wrapper'; import getCore from 'cvat-core-wrapper'; import logger, { LogType } from 'cvat-logger'; import { getCVATStore } from 'cvat-store'; @@ -1435,8 +1435,9 @@ export function pasteShapeAsync(): ThunkAction { activeControl, }, }); - - canvasInstance.cancel(); + if (canvasInstance instanceof Canvas) { + canvasInstance.cancel(); + } if (initialState.objectType === ObjectType.TAG) { const objectState = new cvat.classes.ObjectState({ objectType: ObjectType.TAG, @@ -1493,7 +1494,7 @@ export function repeatDrawShapeAsync(): ThunkAction { } = getStore().getState().annotation; let activeControl = ActiveControl.CURSOR; - if (activeInteractor) { + if (activeInteractor && canvasInstance instanceof Canvas) { if (activeInteractor.type === 'tracker') { canvasInstance.interact({ enabled: true, @@ -1511,7 +1512,6 @@ export function repeatDrawShapeAsync(): ThunkAction { return; } - if (activeShapeType === ShapeType.RECTANGLE) { activeControl = ActiveControl.DRAW_RECTANGLE; } else if (activeShapeType === ShapeType.POINTS) { @@ -1523,7 +1523,6 @@ export function repeatDrawShapeAsync(): ThunkAction { } else if (activeShapeType === ShapeType.CUBOID) { activeControl = ActiveControl.DRAW_CUBOID; } - dispatch({ type: AnnotationActionTypes.REPEAT_DRAW_SHAPE, payload: { @@ -1531,7 +1530,9 @@ export function repeatDrawShapeAsync(): ThunkAction { }, }); - canvasInstance.cancel(); + if (canvasInstance instanceof Canvas) { + canvasInstance.cancel(); + } if (activeObjectType === ObjectType.TAG) { const objectState = new cvat.classes.ObjectState({ objectType: ObjectType.TAG, @@ -1580,8 +1581,9 @@ export function redrawShapeAsync(): ThunkAction { activeControl, }, }); - - canvasInstance.cancel(); + if (canvasInstance instanceof Canvas) { + canvasInstance.cancel(); + } canvasInstance.draw({ enabled: true, redraw: activatedStateID, diff --git a/cvat-ui/src/components/annotation-page/appearance-block.tsx b/cvat-ui/src/components/annotation-page/appearance-block.tsx index a00a4937a06..a2adabab298 100644 --- a/cvat-ui/src/components/annotation-page/appearance-block.tsx +++ b/cvat-ui/src/components/annotation-page/appearance-block.tsx @@ -14,7 +14,7 @@ import Button from 'antd/lib/button'; import ColorPicker from 'components/annotation-page/standard-workspace/objects-side-bar/color-picker'; import { ColorizeIcon } from 'icons'; -import { ColorBy, CombinedState } from 'reducers/interfaces'; +import { ColorBy, CombinedState, DimensionType } from 'reducers/interfaces'; import { collapseAppearance as collapseAppearanceAction, updateTabContentHeight as updateTabContentHeightAction, @@ -37,6 +37,7 @@ interface StateToProps { outlineColor: string; showBitmap: boolean; showProjections: boolean; + jobInstance: any; } interface DispatchToProps { @@ -66,7 +67,10 @@ export function computeHeight(): number { function mapStateToProps(state: CombinedState): StateToProps { const { - annotation: { appearanceCollapsed }, + annotation: { + appearanceCollapsed, + job: { instance: jobInstance }, + }, settings: { shapes: { colorBy, opacity, selectedOpacity, outlined, outlineColor, showBitmap, showProjections, @@ -83,6 +87,7 @@ function mapStateToProps(state: CombinedState): StateToProps { outlineColor, showBitmap, showProjections, + jobInstance, }; } @@ -144,8 +149,11 @@ function AppearanceBlock(props: Props): JSX.Element { changeShapesOutlinedBorders, changeShowBitmap, changeShowProjections, + jobInstance, } = props; + const is2D = jobInstance.task.dimension === DimensionType.DIM_2D; + return ( - - Show bitmap - - - Show projections - + {is2D && ( + + Show bitmap + + )} + {is2D && ( + + Show projections + + )}
    diff --git a/cvat-ui/src/components/annotation-page/canvas/canvas-wrapper.tsx b/cvat-ui/src/components/annotation-page/canvas/canvas-wrapper.tsx index 595613d56dd..fb21708fd11 100644 --- a/cvat-ui/src/components/annotation-page/canvas/canvas-wrapper.tsx +++ b/cvat-ui/src/components/annotation-page/canvas/canvas-wrapper.tsx @@ -14,6 +14,7 @@ import { } from 'reducers/interfaces'; import { LogType } from 'cvat-logger'; import { Canvas } from 'cvat-canvas-wrapper'; +import { Canvas3d } from 'cvat-canvas3d-wrapper'; import getCore from 'cvat-core-wrapper'; import consts from 'consts'; import CVATTooltip from 'components/common/cvat-tooltip'; @@ -26,7 +27,7 @@ const MAX_DISTANCE_TO_OPEN_SHAPE = 50; interface Props { sidebarCollapsed: boolean; - canvasInstance: Canvas; + canvasInstance: Canvas | Canvas3d; jobInstance: any; activatedStateID: number | null; activatedAttributeID: number | null; @@ -103,10 +104,10 @@ export default class CanvasWrapperComponent extends React.PureComponent { automaticBordering, intelligentPolygonCrop, showObjectsTextAlways, - canvasInstance, workspace, showProjections, } = this.props; + const { canvasInstance } = this.props as { canvasInstance: Canvas }; // It's awful approach from the point of view React // But we do not have another way because cvat-canvas returns regular DOM element @@ -139,7 +140,6 @@ export default class CanvasWrapperComponent extends React.PureComponent { frameData, frameAngle, annotations, - canvasInstance, sidebarCollapsed, activatedStateID, curZLayer, @@ -161,7 +161,7 @@ export default class CanvasWrapperComponent extends React.PureComponent { canvasBackgroundColor, onFetchAnnotation, } = this.props; - + const { canvasInstance } = this.props as { canvasInstance: Canvas }; if ( prevProps.showObjectsTextAlways !== showObjectsTextAlways || prevProps.automaticBordering !== automaticBordering || @@ -306,7 +306,7 @@ export default class CanvasWrapperComponent extends React.PureComponent { } public componentWillUnmount(): void { - const { canvasInstance } = this.props; + const { canvasInstance } = this.props as { canvasInstance: Canvas }; canvasInstance.html().removeEventListener('mousedown', this.onCanvasMouseDown); canvasInstance.html().removeEventListener('click', this.onCanvasClicked); @@ -432,7 +432,8 @@ export default class CanvasWrapperComponent extends React.PureComponent { }; private onCanvasClicked = (): void => { - const { canvasInstance, onUpdateContextMenu } = this.props; + const { onUpdateContextMenu } = this.props; + const { canvasInstance } = this.props as { canvasInstance: Canvas }; onUpdateContextMenu(false, 0, 0, ContextMenuType.CANVAS_SHAPE); if (!canvasInstance.html().contains(document.activeElement) && document.activeElement instanceof HTMLElement) { document.activeElement.blur(); @@ -562,7 +563,8 @@ export default class CanvasWrapperComponent extends React.PureComponent { }; private onCanvasFindObject = async (e: any): Promise => { - const { jobInstance, canvasInstance } = this.props; + const { jobInstance } = this.props; + const { canvasInstance } = this.props as { canvasInstance: Canvas }; const result = await jobInstance.annotations.select(e.detail.states, e.detail.x, e.detail.y); @@ -596,12 +598,12 @@ export default class CanvasWrapperComponent extends React.PureComponent { const { activatedStateID, activatedAttributeID, - canvasInstance, selectedOpacity, aamZoomMargin, workspace, annotations, } = this.props; + const { canvasInstance } = this.props as { canvasInstance: Canvas }; if (activatedStateID !== null) { const [activatedState] = annotations.filter((state: any): boolean => state.clientID === activatedStateID); @@ -653,7 +655,8 @@ export default class CanvasWrapperComponent extends React.PureComponent { } private updateIssueRegions(): void { - const { canvasInstance, frameIssues } = this.props; + const { frameIssues } = this.props; + const { canvasInstance } = this.props as { canvasInstance: Canvas }; if (frameIssues === null) { canvasInstance.setupIssueRegions({}); } else { @@ -688,12 +691,12 @@ export default class CanvasWrapperComponent extends React.PureComponent { gridSize, gridColor, gridOpacity, - canvasInstance, brightnessLevel, contrastLevel, saturationLevel, canvasBackgroundColor, } = this.props; + const { canvasInstance } = this.props as { canvasInstance: Canvas }; // Size window.addEventListener('resize', this.fitCanvas); diff --git a/cvat-ui/src/components/annotation-page/canvas/canvas-wrapper3D.tsx b/cvat-ui/src/components/annotation-page/canvas/canvas-wrapper3D.tsx index 823a62fa5ee..af0bd291abc 100644 --- a/cvat-ui/src/components/annotation-page/canvas/canvas-wrapper3D.tsx +++ b/cvat-ui/src/components/annotation-page/canvas/canvas-wrapper3D.tsx @@ -10,29 +10,55 @@ import { ArrowDownOutlined, ArrowLeftOutlined, ArrowRightOutlined, ArrowUpOutlined, } from '@ant-design/icons'; import { ResizableBox } from 'react-resizable'; -import { Workspace } from 'reducers/interfaces'; import { - CAMERA_ACTION, Canvas3d, MouseInteraction, ViewType, + ColorBy, ContextMenuType, ObjectType, Workspace, +} from 'reducers/interfaces'; +import { + CameraAction, Canvas3d, ViewType, ViewsDOM, } from 'cvat-canvas3d-wrapper'; +import { Canvas } from 'cvat-canvas-wrapper'; import ContextImage from 'components/annotation-page/standard-workspace/context-image/context-image'; import CVATTooltip from 'components/common/cvat-tooltip'; +import { LogType } from 'cvat-logger'; +import getCore from 'cvat-core-wrapper'; + +const cvat = getCore(); interface Props { - canvasInstance: Canvas3d; + opacity: number; + selectedOpacity: number; + outlined: boolean; + outlineColor: string; + colorBy: ColorBy; + canvasInstance: Canvas3d | Canvas; jobInstance: any; frameData: any; curZLayer: number; annotations: any[]; + contextMenuVisibility: boolean; + activeLabelID: number; + activatedStateID: number | null; + activeObjectType: ObjectType; onSetupCanvas: () => void; + onGroupObjects: (enabled: boolean) => void; onResetCanvas(): void; + onCreateAnnotations(sessionInstance: any, frame: number, states: any[]): void; + onActivateObject(activatedStateID: number | null): void; + onUpdateAnnotations(states: any[]): void; + onUpdateContextMenu(visible: boolean, left: number, top: number, type: ContextMenuType, pointID?: number): void; + onGroupAnnotations(sessionInstance: any, frame: number, states: any[]): void; + onEditShape: (enabled: boolean) => void; + onDragCanvas: (enabled: boolean) => void; + onShapeDrawn: () => void; workspace: Workspace; - animateID: any; automaticBordering: boolean; showObjectsTextAlways: boolean; + frame: number; } interface ViewSize { fullHeight: number; + fullWidth: number; vertical: number; top: number; side: number; @@ -41,7 +67,7 @@ interface ViewSize { function viewSizeReducer( state: ViewSize, - action: { type: ViewType | 'set'; e?: SyntheticEvent; data?: ViewSize }, + action: { type: ViewType | 'set' | 'resize'; e?: SyntheticEvent; data?: ViewSize }, ): ViewSize { const event = (action.e as unknown) as MouseEvent; const canvas3dContainer = document.getElementById('canvas3d-container'); @@ -94,6 +120,33 @@ function viewSizeReducer( }; case 'set': return action.data as ViewSize; + case 'resize': { + const canvasPerspectiveContainer = document.getElementById('cvat-canvas3d-perspective'); + let midState = { ...state }; + if (canvasPerspectiveContainer) { + if (state.fullHeight !== canvas3dContainer.clientHeight) { + const diff = canvas3dContainer.clientHeight - state.fullHeight; + midState = { + ...midState, + fullHeight: canvas3dContainer.clientHeight, + vertical: state.vertical + diff, + }; + } + if (state.fullWidth !== canvasPerspectiveContainer.clientWidth) { + const oldWidth = state.fullWidth; + const width = canvasPerspectiveContainer.clientWidth; + midState = { + ...midState, + fullWidth: width, + top: (state.top / oldWidth) * width, + side: (state.side / oldWidth) * width, + front: (state.front / oldWidth) * width, + }; + } + return midState; + } + return state; + } default: throw new Error(); } @@ -105,6 +158,7 @@ const CanvasWrapperComponent = (props: Props): ReactElement => { const animateId = useRef(0); const [viewSize, setViewSize] = useReducer(viewSizeReducer, { fullHeight: 0, + fullWidth: 0, vertical: 0, top: 0, side: 0, @@ -115,70 +169,122 @@ const CanvasWrapperComponent = (props: Props): ReactElement => { const sideView = useRef(null); const frontView = useRef(null); - const { frameData, annotations, curZLayer } = props; + const { + opacity, + outlined, + outlineColor, + selectedOpacity, + colorBy, + contextMenuVisibility, + frameData, + onResetCanvas, + onSetupCanvas, + annotations, + frame, + jobInstance, + activeLabelID, + activeObjectType, + onShapeDrawn, + onCreateAnnotations, + } = props; + const { canvasInstance } = props as { canvasInstance: Canvas3d }; const onCanvasSetup = (): void => { - const { onSetupCanvas } = props; onSetupCanvas(); }; - const animateCanvas = (): void => { - const { canvasInstance } = props; + const onCanvasDragStart = (): void => { + const { onDragCanvas } = props; + onDragCanvas(true); + }; + const onCanvasDragDone = (): void => { + const { onDragCanvas } = props; + onDragCanvas(false); + }; + + const animateCanvas = (): void => { canvasInstance.render(); animateId.current = requestAnimationFrame(animateCanvas); }; const updateCanvas = (): void => { - const { canvasInstance } = props; - if (frameData !== null) { - canvasInstance.setup(frameData); + canvasInstance.setup( + frameData, + annotations.filter((e) => e.objectType !== ObjectType.TAG), + ); } }; - const onMouseClick = (event: MouseEvent): void => { - const { canvasInstance } = props; - canvasInstance.mouseControls(MouseInteraction.CLICK, event); + const onCanvasCancel = (): void => { + onResetCanvas(); }; - const onMouseDoubleClick = (event: MouseEvent): void => { - const { canvasInstance } = props; - canvasInstance.mouseControls(MouseInteraction.DOUBLE_CLICK, event); - }; + const onCanvasShapeDrawn = (event: any): void => { + if (!event.detail.continue) { + onShapeDrawn(); + } + + const { state, duration } = event.detail; + const isDrawnFromScratch = !state.label; + if (isDrawnFromScratch) { + jobInstance.logger.log(LogType.drawObject, { count: 1, duration }); + } else { + jobInstance.logger.log(LogType.pasteObject, { count: 1, duration }); + } - const onMouseHover = (event: MouseEvent): void => { - const { canvasInstance } = props; - canvasInstance.mouseControls(MouseInteraction.HOVER, event); + state.objectType = state.objectType || activeObjectType; + state.label = state.label || jobInstance.task.labels.filter((label: any) => label.id === activeLabelID)[0]; + state.occluded = state.occluded || false; + state.frame = frame; + state.zOrder = 0; + const objectState = new cvat.classes.ObjectState(state); + onCreateAnnotations(jobInstance, frame, [objectState]); }; - const onCanvasCancel = (): void => { - const { onResetCanvas } = props; - onResetCanvas(); + const onCanvasClick = (e: MouseEvent): void => { + const { onUpdateContextMenu } = props; + if (contextMenuVisibility) { + onUpdateContextMenu(false, e.clientX, e.clientY, ContextMenuType.CANVAS_SHAPE); + } }; const initialSetup = (): void => { - const { canvasInstance } = props; - - const canvasInstanceDOM = canvasInstance.html(); - // Events + const canvasInstanceDOM = canvasInstance.html() as ViewsDOM; canvasInstanceDOM.perspective.addEventListener('canvas.setup', onCanvasSetup); - canvasInstanceDOM.perspective.addEventListener('mousemove', onMouseHover); canvasInstanceDOM.perspective.addEventListener('canvas.canceled', onCanvasCancel); - canvasInstanceDOM.perspective.addEventListener(MouseInteraction.DOUBLE_CLICK, onMouseDoubleClick); - canvasInstanceDOM.perspective.addEventListener(MouseInteraction.CLICK, onMouseClick); + canvasInstanceDOM.perspective.addEventListener('canvas.dragstart', onCanvasDragStart); + canvasInstanceDOM.perspective.addEventListener('canvas.dragstop', onCanvasDragDone); }; - const keyControls = (key: KeyboardEvent): void => { - const { canvasInstance } = props; + const keyControlsKeyDown = (key: KeyboardEvent): void => { canvasInstance.keyControls(key); }; - useEffect(() => { - const { canvasInstance } = props; + const keyControlsKeyUp = (key: KeyboardEvent): void => { + if (key.code === 'ControlLeft') { + canvasInstance.keyControls(key); + } + }; - const canvasInstanceDOM = canvasInstance.html(); + const onCanvasShapeSelected = (event: any): void => { + const { onActivateObject } = props; + const { clientID } = event.detail; + onActivateObject(clientID); + canvasInstance.activate(clientID); + }; + const onCanvasEditDone = (event: any): void => { + const { onEditShape, onUpdateAnnotations } = props; + onEditShape(false); + const { state, points } = event.detail; + state.points = points; + onUpdateAnnotations([state]); + }; + + useEffect(() => { + const canvasInstanceDOM = canvasInstance.html(); if ( perspectiveView && perspectiveView.current && @@ -200,6 +306,7 @@ const CanvasWrapperComponent = (props: Props): ReactElement => { type: 'set', data: { fullHeight: canvas3dContainer.clientHeight, + fullWidth: canvas3dContainer.clientWidth, vertical: canvas3dContainer.clientHeight / 2, top: width, side: width, @@ -209,7 +316,8 @@ const CanvasWrapperComponent = (props: Props): ReactElement => { } } - document.addEventListener('keydown', keyControls); + document.addEventListener('keydown', keyControlsKeyDown); + document.addEventListener('keyup', keyControlsKeyUp); initialSetup(); updateCanvas(); @@ -217,21 +325,80 @@ const CanvasWrapperComponent = (props: Props): ReactElement => { return () => { canvasInstanceDOM.perspective.removeEventListener('canvas.setup', onCanvasSetup); - canvasInstanceDOM.perspective.removeEventListener('mousemove', onMouseHover); canvasInstanceDOM.perspective.removeEventListener('canvas.canceled', onCanvasCancel); - canvasInstanceDOM.perspective.removeEventListener(MouseInteraction.DOUBLE_CLICK, onMouseDoubleClick); - canvasInstanceDOM.perspective.removeEventListener(MouseInteraction.CLICK, onMouseClick); - document.removeEventListener('keydown', keyControls); + canvasInstanceDOM.perspective.removeEventListener('canvas.dragstart', onCanvasDragStart); + canvasInstanceDOM.perspective.removeEventListener('canvas.dragstop', onCanvasDragDone); + document.removeEventListener('keydown', keyControlsKeyDown); + document.removeEventListener('keyup', keyControlsKeyUp); cancelAnimationFrame(animateId.current); }; }, []); + const updateShapesView = (): void => { + (canvasInstance as Canvas3d).configureShapes({ + opacity, + outlined, + outlineColor, + selectedOpacity, + colorBy, + }); + }; + + const onContextMenu = (event: any): void => { + const { onUpdateContextMenu, onActivateObject } = props; + onActivateObject(event.detail.clientID); + onUpdateContextMenu( + event.detail.clientID !== null, + event.detail.clientX, + event.detail.clientY, + ContextMenuType.CANVAS_SHAPE, + ); + }; + + const onResize = (): void => { + setViewSize({ + type: 'resize', + }); + }; + + const onCanvasObjectsGroupped = (event: any): void => { + const { onGroupAnnotations, onGroupObjects } = props; + + onGroupObjects(false); + + const { states } = event.detail; + onGroupAnnotations(jobInstance, frame, states); + }; + useEffect(() => { + updateShapesView(); + }, [opacity, outlined, outlineColor, selectedOpacity, colorBy]); + + useEffect(() => { + const canvasInstanceDOM = canvasInstance.html() as ViewsDOM; updateCanvas(); - }, [frameData, annotations, curZLayer]); + canvasInstanceDOM.perspective.addEventListener('canvas.drawn', onCanvasShapeDrawn); + canvasInstanceDOM.perspective.addEventListener('canvas.selected', onCanvasShapeSelected); + canvasInstanceDOM.perspective.addEventListener('canvas.edited', onCanvasEditDone); + canvasInstanceDOM.perspective.addEventListener('canvas.contextmenu', onContextMenu); + canvasInstanceDOM.perspective.addEventListener('click', onCanvasClick); + canvasInstanceDOM.perspective.addEventListener('canvas.fit', onResize); + canvasInstanceDOM.perspective.addEventListener('canvas.groupped', onCanvasObjectsGroupped); + window.addEventListener('resize', onResize); + + return () => { + canvasInstanceDOM.perspective.removeEventListener('canvas.drawn', onCanvasShapeDrawn); + canvasInstanceDOM.perspective.removeEventListener('canvas.selected', onCanvasShapeSelected); + canvasInstanceDOM.perspective.removeEventListener('canvas.edited', onCanvasEditDone); + canvasInstanceDOM.perspective.removeEventListener('canvas.contextmenu', onContextMenu); + canvasInstanceDOM.perspective.removeEventListener('click', onCanvasClick); + canvasInstanceDOM.perspective.removeEventListener('canvas.fit', onResize); + canvasInstanceDOM.perspective.removeEventListener('canvas.groupped', onCanvasObjectsGroupped); + window.removeEventListener('resize', onResize); + }; + }, [frameData, annotations, activeLabelID, contextMenuVisibility]); - const screenKeyControl = (code: CAMERA_ACTION): void => { - const { canvasInstance } = props; + const screenKeyControl = (code: CameraAction): void => { canvasInstance.keyControls(new KeyboardEvent('keydown', { code, altKey: true })); }; @@ -239,7 +406,8 @@ const CanvasWrapperComponent = (props: Props): ReactElement => {