Compare commits

...

82 Commits

Author SHA1 Message Date
김장현 12610e03f8 비행 시뮬레이션 페이지 로고(인천,웅진) 추가 2 hours ago
kyw546 e4efb940ac 수정 2 hours ago
김지은 a4081ead4a css 22 hours ago
김지은 6b93fe2466 Merge branch 'master' of http://gitea.palntour.com/pav/pav-home 22 hours ago
김지은 729845ad83 favicon 22 hours ago
김장현 f8beb8ed98 변경 요청사항 적용 22 hours ago
김지은 ebfe6e9fcb logo img 추가, itp 관련 추가 후 주석 23 hours ago
이준희 f5cc90fea7 문구 오타 수정 2 months ago
junh_eee(이준희) 9b73b58e5b 문구수정 2 months ago
이준희 6ba21bf69f flyTo 계정 전용 작업 2 months ago
김지은 e9fdf3e9ea . 10 months ago
김지은 f161ce7f7c css 10 months ago
김지은 8e246de085 남원로고 10 months ago
김지은 72638e9f5a reservation footer 10 months ago
김지은 ecd66d0b8e . 10 months ago
김지은 b7e3e7a322 . 10 months ago
김지은 993c06de17 중복코드수정 10 months ago
김지은 c3c6ebe3ca 관제메인 로고변경 10 months ago
김지은 af942b57c2 . 11 months ago
김지은 c9f9d651b0 mui 11 months ago
김지은 4fdfa2f665 test 삭제 11 months ago
김지은 294d9ed93b test 11 months ago
이준희 6578cb5f8d . 11 months ago
이준희 eb49879d45 css 11 months ago
이준희 95f4be94a4 css 11 months ago
이준희 1f04c6d59d . 11 months ago
이준희 2bbf1294f9 . 11 months ago
hhjk00 45cf2bfd12 Merge branch 'master' of http://gitea.palntour.com/pav/pav-home 11 months ago
hhjk00 b6bed9cfc4 menu toggle icon 표출 11 months ago
이준희 8fb4f11851 레이아웃정리-eun 11 months ago
김장현 7a50181d88 예약 페이지 생성 11 months ago
이준희 79deb90758 Merge branch 'master' of http://gitea.palntour.com/pav/pav-home 11 months ago
이준희 3629520881 지은 11 months ago
kyw546 a93275dde0 Merge branch 'master' of http://gitea.palntour.com/pav/pav-home 11 months ago
kyw546 fc99f04e27 . 11 months ago
김지은 259a65b420 . 11 months ago
김지은 1b2f05464e . 11 months ago
김지은 9152deff65 . 11 months ago
김지은 9085249189 d 11 months ago
김지은 5bfa8013c7 . 11 months ago
junh_eee(이준희) e77df057ed 로그인 화면 비밀번호 default값 제거 11 months ago
kyw546 74f7a91bbe . 11 months ago
kyw546 074b16db9f . 11 months ago
kyw546 7a9470040d . 11 months ago
kyw546 12e2da75d3 . 11 months ago
kyw546 f8a30eb1dc . 11 months ago
kyw546 5ae982130e . 11 months ago
kyw546 c01e0894a2 . 11 months ago
kyw546 66ab0ba594 . 11 months ago
김장현 4812519fcb 도심항공교통 예약 화면 작업 11 months ago
김장현 a802aed33d 도심항공교통 예약 화면 11 months ago
hhjk00 24182b65a8 Merge branch 'master' of http://gitea.palntour.com/pav/pav-home 11 months ago
hhjk00 9469d774bc uam 노선 변경 11 months ago
junh_eee(이준희) 0caccde9fd 예약프로세스 모달 생성 11 months ago
hhjk00 9d358d7361 uamPosition 주석 11 months ago
hhjk00 b9d1f9eba8 송전선로 표기 완료 11 months ago
hhjk00 87997130e2 송전선 및 선로 표기 진행중 11 months ago
hhjk00 2f2d30c524 uam 노선 buffer 적용 11 months ago
hhjk00 ec1f3de597 line, point 스타일 변경, 경로 수정 1 year ago
hhjk00 8e7691b7b7 uam 노선 waypoint 적용 1 year ago
junh_eee(이준희) 70e22656f0 실시간 영상 주소 롤백 1 year ago
junh_eee(이준희) 25f9433fdd 실시간 영상 주소 변경 1 year ago
junh_eee(이준희) 2dbf064211 실시간 영상 주소 변경 1 year ago
junh_eee(이준희) 528988bff4 실시간 영상 주소 변경 1 year ago
junh_eee(이준희) ca6465f9f1 비행계획서 공역 좌표 지정시 경고 얼럿 미표출 1 year ago
junh_eee(이준희) 4c99822a38 비행계획서 공역 좌표 지정 가능 1 year ago
junh_eee(이준희) df47548969 실시간 영상보기 모달 생성 및 css 추가 1 year ago
junh_eee(이준희) 01764adb94 mapbox 주석 1 year ago
junh_eee(이준희) 060a25c841 실시간 영상보기 링크 수정 1 year ago
junh_eee(이준희) 650314091b master 권한 부여 시 에러 수정 1 year ago
김장현 da8b4d1079 mapbox 언어 변경, 관제 기체 정보 팝업 작업중, 관제 기체 이동 작업, 코드 정리 1 year ago
김장현 8ef3f93d45 mapbox 폴더 생성 및 격자공역 작업 1 year ago
김장현 741cabf151 mapbox test 1 year ago
이준희 113c4f87d6 mapbox 테스트 1 year ago
이준희 8b64938b0d 모든기체 드론으로 임시표출 1 year ago
이준희 28b925b967 로고명 수정 1 year ago
이준희 d7014cab22 kac 로고 추가 1 year ago
이준희 58928b91c9 tp 로고 색상 수정 1 year ago
이준희 3b463398c9 Merge branch 'master' of http://gitea.palntour.com/pav/pav-home 1 year ago
이준희 1c9cc24468 기존 로고 삭제 후 Tp 로고 추가 1 year ago
sanguu516(박상현) b28040e93a 공역 고도 값 데이터 수정 1 year ago
sanguu516(박상현) e0631f680f 공역 고도 값 화면 깨짐 수정 1 year ago
  1. 10
      .env.development
  2. 930
      package-lock.json
  3. 31
      package.json
  4. BIN
      public/favicon.ico
  5. 9
      public/index.html
  6. 162
      src/@core/layouts/HorizontalLayout.js
  7. 63
      src/@core/layouts/components/menu/vertical-menu/VerticalMenuHeader.js
  8. 3
      src/@core/layouts/components/menu/vertical-menu/index.js
  9. 16
      src/@core/layouts/components/navbar/NavbarUser.js
  10. 153
      src/assets/css/custom.css
  11. BIN
      src/assets/images/incheon_logo_wh.png
  12. BIN
      src/assets/images/itp_logo_wh.png
  13. BIN
      src/assets/images/itp_logo_wh_icon.png
  14. BIN
      src/assets/images/kac_logo_wh.png
  15. 279
      src/assets/images/kiast_logo.svg
  16. 279
      src/assets/images/kiast_logo_wh.svg
  17. BIN
      src/assets/images/login_img.png
  18. 218
      src/assets/images/mi_logo.svg
  19. BIN
      src/assets/images/mi_logo_wh.png
  20. 218
      src/assets/images/mi_logo_wh.svg
  21. BIN
      src/assets/images/ongjin_logo_wh.png
  22. BIN
      src/assets/images/tp_logo.png
  23. BIN
      src/assets/images/tplogo_wh.png
  24. BIN
      src/assets/images/transmission_tower_icon.png
  25. 16
      src/components/account/login/AccountLogin.js
  26. 16
      src/components/analysis/simulation/AnalysisSimulationMenu.js
  27. 2
      src/components/analysis/simulation/AnalysisSimulationReport.js
  28. 74
      src/components/basis/flight/plan/FlightPlanAreaMap.js
  29. 5
      src/components/dashboard/DashboardMenu.js
  30. 3
      src/components/map/MapControl.js
  31. 1728
      src/components/map/geojson/airportAirArea.json
  32. 1693
      src/components/map/geojson/uamAirArea.json
  33. 372
      src/components/map/mapbox/MapBoxMap.js
  34. 657
      src/components/map/mapbox/dron/DronMarker.js
  35. 392
      src/components/map/mapbox/feature/FeatureAirZone.js
  36. 81
      src/components/map/naver/NaverMap.js
  37. 49
      src/components/map/naver/draw/FlightPlanDraw.js
  38. 2
      src/components/map/naver/dron/DronMarker.js
  39. 93
      src/components/map/naver/feature/FeatureAirZone.js
  40. 8
      src/components/websocket/WebsocketClient.js
  41. 2
      src/configs/constants.js
  42. 6
      src/configs/themeConfig.js
  43. 18
      src/containers/basis/flight/plan/FlightPlanAreaDetailContainer.js
  44. 5
      src/containers/basis/group/BasisGroupUsersContainer.js
  45. 19
      src/modules/basis/flight/actions/basisFlightAction.ts
  46. 4
      src/modules/basis/flight/apis/basisFlightApi.ts
  47. 19
      src/modules/basis/flight/models/basisFlightModel.ts
  48. 7
      src/modules/basis/flight/reducers/basisFlightReducer.ts
  49. 26
      src/modules/basis/flight/sagas/basisFlightSaga.ts
  50. 13
      src/navigation/reservation/index.js
  51. 10
      src/router/routes/RouteReservation.js
  52. 2
      src/router/routes/index.js
  53. 2
      src/views/control/alarm/ControlAlarmList.js
  54. 58
      src/views/control/main/ControlMain.js
  55. 85
      src/views/control/report/ControlReportList.js
  56. 423
      src/views/control/setting/ControlFsm.js
  57. 266
      src/views/control/setting/ControlReservation.js
  58. 459
      src/views/control/setting/ControlSetting.js
  59. 430
      src/views/control/setting/steps/ReserveStep1.js
  60. 223
      src/views/control/setting/steps/ReserveStep2.js
  61. 164
      src/views/control/setting/steps/ReserveStep3.js
  62. 121
      src/views/control/setting/steps/ReserveStep4.js
  63. 70
      src/views/control/setting/steps/Step1.js
  64. 41
      src/views/control/setting/steps/Step2.js
  65. 32
      src/views/control/setting/steps/Step3.js
  66. 43
      src/views/control/setting/steps/Step4.js
  67. 19
      src/views/control/setting/steps/index.js
  68. 6
      src/views/reservation/ReservationView.js
  69. 12
      test/pav-warning.js

10
.env.development

@ -1,6 +1,10 @@
REACT_APP_HOST = http://192.168.0.30:8080/
REACT_APP_WS_HOST = ws://192.168.0.30:8081/ws
# REACT_APP_HOST = http://192.168.0.30:8080/
# REACT_APP_WS_HOST = ws://192.168.0.30:8081/ws
# REACT_APP_IMAGE_HOST = https://palnet-file.s3.ap-northeast-2.amazonaws.com/
REACT_APP_HOST = http://pav.palntour.com:8080/
REACT_APP_WS_HOST = ws://pav.palntour.com:8081/ws
REACT_APP_IMAGE_HOST = https://palnet-file.s3.ap-northeast-2.amazonaws.com/
# Naver Search API HOST
@ -12,3 +16,5 @@ REACT_WINDY_KEY = wf6Lkn1MAtqcgyW78xbceFHBz6ccsUo8
# API KEY
NAVER_APP_CLIENT_KEY = WGEct3bJhQC0pyMsP_GK
NAVER_APP_SECRET_KEY = Q4K4OtUYol
REACT_APP_MAPBOX_TOKEN = pk.eyJ1IjoianVuaGVlZSIsImEiOiJjbGxnNWVhc3IweDJsM2dvYmI1ZXg2MGljIn0.EmSS1ocpPJv2ZaduQHmz_Q

930
package-lock.json generated

File diff suppressed because it is too large Load Diff

31
package.json

@ -5,6 +5,8 @@
"dependencies": {
"@casl/ability": "5.2.2",
"@casl/react": "2.1.1",
"@emotion/react": "^11.11.1",
"@emotion/styled": "^11.11.0",
"@fullcalendar/core": "5.7.2",
"@fullcalendar/daygrid": "5.7.2",
"@fullcalendar/interaction": "5.7.2",
@ -13,9 +15,11 @@
"@fullcalendar/timegrid": "5.7.2",
"@fullcalendar/timeline": "5.7.2",
"@hookform/resolvers": "1.3.4",
"@mui/material": "^5.14.17",
"@mui/styled-engine-sc": "^6.0.0-alpha.5",
"@stomp/stompjs": "^6.1.0",
"@turf/buffer": "^6.5.0",
"@turf/turf": "^6.5.0",
"@turf/turf": "6.5.0",
"@types/googlemaps": "^3.43.3",
"@types/history": "^4.7.8",
"@types/jest": "^26.0.23",
@ -92,6 +96,7 @@
"react-scroll-up": "1.3.7",
"react-select": "4.0.2",
"react-shepherd": "3.3.0",
"react-slick": "^0.29.0",
"react-slidedown": "2.4.5",
"react-sortablejs": "6.0.0",
"react-toastify": "7.0.3",
@ -103,8 +108,9 @@
"redux-thunk": "2.3.0",
"sass": "1.26.8",
"screenfull": "5.0.2",
"slick-carousel": "^1.8.1",
"sortablejs": "1.12.0",
"styled-components": "5.1.1",
"styled-components": "^5.1.1",
"sweetalert2": "10.14.0",
"sweetalert2-react-content": "3.0.1",
"swiper": "6.0.4",
@ -146,10 +152,21 @@
"sass-loader": "^8.0.2",
"typescript": "^4.3.5"
},
"browserslist": [
">0.2%",
"not dead",
"not op_mini all"
],
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all",
"not safari < 10",
"not chrome < 51",
"not android < 5",
"not ie < 12"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
},
"homepage": ""
}

BIN
public/favicon.ico

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 15 KiB

9
public/index.html

@ -13,6 +13,13 @@
user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
-->
<!-- <link
rel="stylesheet"
href="https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-directions/v4.1.1/mapbox-gl-directions.css"
type="text/css"
/>
<script src="https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-directions/v4.1.1/mapbox-gl-directions.js"></script> -->
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
<script
type="text/javascript"
@ -64,7 +71,7 @@
href="https://unpkg.com/leaflet@1.5.1/dist/leaflet.css"
crossorigin=""
/>
<title>Drone Control System</title>
<title>PAV Monitoring System</title>
</head>
<body>
<div id="root"></div>

162
src/@core/layouts/HorizontalLayout.js

@ -1,123 +1,129 @@
// ** React Imports
import { useState, useEffect } from 'react'
import { Link } from 'react-router-dom'
import { useState, useEffect } from 'react';
import { Link } from 'react-router-dom';
// ** Store & Actions
import { useSelector, useDispatch } from 'react-redux'
import { handleMenuHidden, handleContentWidth } from '@store/actions/layout'
import { useSelector, useDispatch } from 'react-redux';
import { handleMenuHidden, handleContentWidth } from '@store/actions/layout';
// ** Third Party Components
import classnames from 'classnames'
import { ArrowUp } from 'react-feather'
import ScrollToTop from 'react-scroll-up'
import { Navbar, NavItem, Button } from 'reactstrap'
import classnames from 'classnames';
import { ArrowUp } from 'react-feather';
import ScrollToTop from 'react-scroll-up';
import { Navbar, NavItem, Button } from 'reactstrap';
// ** Configs
import themeConfig from '@configs/themeConfig'
import themeConfig from '@configs/themeConfig';
// ** Custom Components
import Customizer from '@components/customizer'
import NavbarComponent from './components/navbar'
import FooterComponent from './components/footer'
import MenuComponent from './components/menu/horizontal-menu'
import Customizer from '@components/customizer';
import NavbarComponent from './components/navbar';
import FooterComponent from './components/footer';
import MenuComponent from './components/menu/horizontal-menu';
// ** Custom Hooks
import { useRTL } from '@hooks/useRTL'
import { useSkin } from '@hooks/useSkin'
import { useNavbarType } from '@hooks/useNavbarType'
import { useFooterType } from '@hooks/useFooterType'
import { useNavbarColor } from '@hooks/useNavbarColor'
import { useRTL } from '@hooks/useRTL';
import { useSkin } from '@hooks/useSkin';
import { useNavbarType } from '@hooks/useNavbarType';
import { useFooterType } from '@hooks/useFooterType';
import { useNavbarColor } from '@hooks/useNavbarColor';
// ** Styles
import '@styles/base/core/menu/menu-types/horizontal-menu.scss'
import '@styles/base/core/menu/menu-types/horizontal-menu.scss';
const HorizontalLayout = props => {
// ** Props
const { children, navbar, footer, menu, currentActiveItem, routerProps } = props
const { children, navbar, footer, menu, currentActiveItem, routerProps } =
props;
// ** Hooks
const [skin, setSkin] = useSkin()
const [isRtl, setIsRtl] = useRTL()
const [navbarType, setNavbarType] = useNavbarType()
const [footerType, setFooterType] = useFooterType()
const [navbarColor, setNavbarColor] = useNavbarColor()
const [skin, setSkin] = useSkin();
const [isRtl, setIsRtl] = useRTL();
const [navbarType, setNavbarType] = useNavbarType();
const [footerType, setFooterType] = useFooterType();
const [navbarColor, setNavbarColor] = useNavbarColor();
// ** States
const [isMounted, setIsMounted] = useState(false)
const [navbarScrolled, setNavbarScrolled] = useState(false)
const [isMounted, setIsMounted] = useState(false);
const [navbarScrolled, setNavbarScrolled] = useState(false);
// ** Store Vars
const dispatch = useDispatch()
const layoutStore = useSelector(state => state.layout)
const dispatch = useDispatch();
const layoutStore = useSelector(state => state.layout);
const { user } = useSelector(state => state.authState);
// ** Vars
const contentWidth = layoutStore.contentWidth
const isHidden = layoutStore.menuHidden
const contentWidth = layoutStore.contentWidth;
const isHidden = layoutStore.menuHidden;
// ** Handles Content Width
const setContentWidth = val => dispatch(handleContentWidth(val))
const setContentWidth = val => dispatch(handleContentWidth(val));
// ** Handles Content Width
const setIsHidden = val => dispatch(handleMenuHidden(val))
const setIsHidden = val => dispatch(handleMenuHidden(val));
// ** UseEffect Cleanup
const cleanup = () => {
setIsMounted(false)
setNavbarScrolled(false)
}
setIsMounted(false);
setNavbarScrolled(false);
};
//** ComponentDidMount
useEffect(() => {
setIsMounted(true)
setIsMounted(true);
window.addEventListener('scroll', function () {
if (window.pageYOffset > 65 && navbarScrolled === false) {
setNavbarScrolled(true)
setNavbarScrolled(true);
}
if (window.pageYOffset < 65) {
setNavbarScrolled(false)
setNavbarScrolled(false);
}
})
return () => cleanup()
}, [])
});
return () => cleanup();
}, []);
// ** Vars
const footerClasses = {
static: 'footer-static',
sticky: 'footer-fixed',
hidden: 'footer-hidden'
}
};
const navbarWrapperClasses = {
floating: 'navbar-floating',
sticky: 'navbar-sticky',
static: 'navbar-static'
}
};
const navbarClasses = {
floating: 'floating-nav',
sticky: 'fixed-top'
}
};
const bgColorCondition = navbarColor !== '' && navbarColor !== 'light' && navbarColor !== 'white'
const bgColorCondition =
navbarColor !== '' && navbarColor !== 'light' && navbarColor !== 'white';
if (!isMounted) {
return null
return null;
}
return (
<div
className={classnames(
`wrapper horizontal-layout horizontal-menu ${navbarWrapperClasses[navbarType] || 'navbar-floating'} ${
footerClasses[footerType] || 'footer-static'
} menu-expanded`
`wrapper horizontal-layout horizontal-menu ${
navbarWrapperClasses[navbarType] || 'navbar-floating'
} ${footerClasses[footerType] || 'footer-static'} menu-expanded`
)}
{...(isHidden ? { 'data-col': '1-column' } : {})}
>
<Navbar
expand='lg'
className={classnames('header-navbar navbar-fixed align-items-center navbar-shadow navbar-brand-center', {
'navbar-scrolled': navbarScrolled
})}
className={classnames(
'header-navbar navbar-fixed align-items-center navbar-shadow navbar-brand-center',
{
'navbar-scrolled': navbarScrolled
}
)}
>
{!navbar && (
<div className='navbar-header d-xl-block d-none'>
@ -127,7 +133,9 @@ const HorizontalLayout = props => {
<span className='brand-logo'>
<img src={themeConfig.app.appLogoImage} alt='logo' />
</span>
<h2 className='brand-text mb-0'>{themeConfig.app.appName}</h2>
<h2 className='brand-text mb-0'>
{user?.cstmrSno === 27 ? 'FLYTO' : themeConfig.app.appName}
</h2>
</Link>
</NavItem>
</ul>
@ -145,12 +153,24 @@ const HorizontalLayout = props => {
expand='sm'
light={skin !== 'dark'}
dark={skin === 'dark' || bgColorCondition}
className={classnames(`header-navbar navbar-horizontal navbar-shadow menu-border`, {
[navbarClasses[navbarType]]: navbarType !== 'static',
'floating-nav': (!navbarClasses[navbarType] && navbarType !== 'static') || navbarType === 'floating'
})}
className={classnames(
`header-navbar navbar-horizontal navbar-shadow menu-border`,
{
[navbarClasses[navbarType]]: navbarType !== 'static',
'floating-nav':
(!navbarClasses[navbarType] && navbarType !== 'static') ||
navbarType === 'floating'
}
)}
>
{menu ? menu : <MenuComponent routerProps={routerProps} currentActiveItem={currentActiveItem} />}
{menu ? (
menu
) : (
<MenuComponent
routerProps={routerProps}
currentActiveItem={currentActiveItem}
/>
)}
</Navbar>
</div>
) : null}
@ -180,11 +200,21 @@ const HorizontalLayout = props => {
/>
) : null}
<footer
className={classnames(`footer footer-light ${footerClasses[footerType] || 'footer-static'}`, {
'd-none': footerType === 'hidden'
})}
className={classnames(
`footer footer-light ${footerClasses[footerType] || 'footer-static'}`,
{
'd-none': footerType === 'hidden'
}
)}
>
{footer ? footer : <FooterComponent footerType={footerType} footerClasses={footerClasses} />}
{footer ? (
footer
) : (
<FooterComponent
footerType={footerType}
footerClasses={footerClasses}
/>
)}
</footer>
{themeConfig.layout.scrollTop === true ? (
@ -197,6 +227,6 @@ const HorizontalLayout = props => {
</div>
) : null}
</div>
)
}
export default HorizontalLayout
);
};
export default HorizontalLayout;

63
src/@core/layouts/components/menu/vertical-menu/VerticalMenuHeader.js

@ -1,21 +1,30 @@
// ** React Imports
import { useEffect } from 'react'
import { NavLink } from 'react-router-dom'
import { useEffect } from 'react';
import { NavLink } from 'react-router-dom';
import { useSelector } from 'react-redux';
// ** Third Party Components
import { Disc, X, Circle } from 'react-feather'
import { Disc, X, Circle } from 'react-feather';
// ** Config
import themeConfig from '@configs/themeConfig'
import themeConfig from '@configs/themeConfig';
const VerticalMenuHeader = props => {
// ** Props
const { menuCollapsed, setMenuCollapsed, setMenuVisibility, setGroupOpen, menuHover } = props
const {
menuCollapsed,
setMenuCollapsed,
setMenuVisibility,
setGroupOpen,
menuHover
} = props;
const { user } = useSelector(state => state.authState);
// ** Reset open group
useEffect(() => {
if (!menuHover && menuCollapsed) setGroupOpen([])
}, [menuHover, menuCollapsed])
if (!menuHover && menuCollapsed) setGroupOpen([]);
}, [menuHover, menuCollapsed]);
// ** Menu toggler component
const Toggler = () => {
@ -27,7 +36,7 @@ const VerticalMenuHeader = props => {
className='text-primary toggle-icon d-none d-xl-block'
onClick={() => setMenuCollapsed(true)}
/>
)
);
} else {
return (
<Circle
@ -36,30 +45,46 @@ const VerticalMenuHeader = props => {
className='text-primary toggle-icon d-none d-xl-block'
onClick={() => setMenuCollapsed(false)}
/>
)
);
}
}
};
return (
<div className='navbar-header'>
<ul className='nav navbar-nav flex-row'>
<li className='nav-item mr-auto'>
<NavLink to='/' className='navbar-brand'>
<span className='brand-logo'>
<img src={themeConfig.app.appLogoImage} alt='logo' />
</span>
<h2 className='brand-text mb-0'>{themeConfig.app.appName}</h2>
<NavLink to='/' className='navbar-brand' style={{ marginRight: 0 }}>
{/* <div className='brand-logo-box'>
<span className='brand-logo'>
<img src={themeConfig.app.appLogoImage} alt='logo' />
</span>
<h2 className='brand-text mb-0'>
{user?.cstmrSno === 27 ? 'FLYTO' : themeConfig.app.appName}
</h2>
</div> */}
<div className='brand-logo-box itp'>
<span className='brand-logo'>
<img src={themeConfig.app.appLogoImage} alt='logo' />
</span>
<h2 className='brand-text mb-0'>
{user?.cstmrSno === 27 ? 'FLYTO' : themeConfig.app.appName}
</h2>
</div>
</NavLink>
</li>
<li className='nav-item nav-toggle'>
<div className='nav-link modern-nav-toggle cursor-pointer'>
<Toggler />
<X onClick={() => setMenuVisibility(false)} className='toggle-icon icon-x d-block d-xl-none' size={20} />
<X
onClick={() => setMenuVisibility(false)}
className='toggle-icon icon-x d-block d-xl-none'
size={20}
/>
</div>
</li>
</ul>
</div>
)
}
);
};
export default VerticalMenuHeader
export default VerticalMenuHeader;

3
src/@core/layouts/components/menu/vertical-menu/index.js

@ -10,6 +10,7 @@ import statics from '@src/navigation/statics';
import system from '@src/navigation/system';
import analysis from '@src/navigation/analysis';
import flightPlan from '@src/navigation/flightPlan';
import reservation from '@src/navigation/reservation';
// ** Third Party Components
import classnames from 'classnames';
@ -43,6 +44,8 @@ const Sidebar = props => {
return analysis;
case 'flightPlan':
return flightPlan;
case 'reservation':
return reservation;
}
};

16
src/@core/layouts/components/navbar/NavbarUser.js

@ -13,6 +13,7 @@ const NavbarUser = props => {
const dispatch = useDispatch();
const { topMenuCd } = useSelector(state => state.menuState);
const { user } = useSelector(state => state.authState);
// ** Function to toggle Theme (Light/Dark)
const ThemeToggler = () => {
@ -100,7 +101,8 @@ const NavbarUser = props => {
// toggle('2')
// }}
>
드론 관제 시스템
{/* {user?.cstmrSno === 27 ? 'UAM 관제 시스템' : '드론 관제 시스템'} */}
PAV 모니터링 시스템
</NavLink>
</NavItem>
<NavItem>
@ -130,6 +132,18 @@ const NavbarUser = props => {
날씨 정보
</NavLink>
</NavItem>
{/* <NavItem>
<NavLink
onClick={e => handlerTopMenu('reservation')}
active={topMenuCd === 'reservation'}
// active={active === '2'}
// onClick={() => {
// toggle('2')
// }}
>
도심항공교통(UAM) 예약
</NavLink>
</NavItem> */}
</Nav>
{/* <div className='bookmark-wrapper d-flex align-items-center'>
<NavItem className='d-none d-lg-block'>

153
src/assets/css/custom.css

@ -229,8 +229,9 @@ h1.logo img{width:100%;}
h1.logo span{display:block;color:#f4f4f4;font-weight:bold;letter-spacing:2px;font-size:0.9375rem;}
.left-menu{width:80px;height:100vh;background:#283046;padding-top:20px;position:fixed;}
.left-menu-nav, .left-menu-footer{color:#bbb;}
.left-menu-nav li, .left-menu-footer li{margin-top:20px;text-align:center;}
.left-menu-nav li, .left-menu-footer li{margin-top:16px;text-align:center;}
.left-menu-footer{position:absolute;bottom:20px;left:50%;transform: translateX(-50%);}
.socket-wrap{display:flex;justify-content: center;margin-top:24px!important}
.socket_on{display:block;width:32px;height:32px;border-radius:100%;background:#28C76F;position: relative;}
.socket_on svg{color:#fff;margin-top:4px;}
.socket_on::after{content:'';display:block;width:10px;height:10px;border:2px solid #ddd;border-radius:100%;background:#28C76F;position: absolute;right:0;bottom:0px;}
@ -276,7 +277,7 @@ h1.logo span{display:block;color:#f4f4f4;font-weight:bold;letter-spacing:2px;fon
.login{display:flex;height:100vh;color:#bbb;position:relative;}
.login-logo{position:absolute;top:80px;left:100px;color:#bbb;font-weight:bold;font-size:1.8rem;width: 100%;}
.login-img, .login-form {display: flex;align-items: center;justify-content: center;}
.login-img{flex:1.2;background:#161d31;}
.login-img{flex:1.2;background:#161d31;cursor:inherit;user-select: none;}
.login-form{background:#283046;width:100%;flex:0.8;flex-direction: column;}
.login-form form{width:100%;padding:0 120px;}
.login-form .form-control{background:transparent;border:1px solid #404656;}
@ -286,8 +287,8 @@ h1.logo span{display:block;color:#f4f4f4;font-weight:bold;letter-spacing:2px;fon
.login-form .form-control::placeholder{color:#bbb;}
.login-form .vx-checkbox-con .vx-checkbox{border-color: #404656;}
.login-txt{width:100%;margin-bottom:20px;}
.login-txt h2{color:#f4f4f4;font-family: "Montserrat", serif;font-size:1.8rem;font-weight:bold;text-align: center;}
.login-txt p{color:#bbb;font-family: "Montserrat", serif;font-size:1.125rem;font-weight:normal;text-align: center;margin-top:20px;}
.login-txt h2{color:#f4f4f4;font-family: "Montserrat",'NotoSansKR', serif;font-size:1.8rem;font-weight:bold;text-align: center;}
.login-txt p{color:#bbb;font-family: "Montserrat",'NotoSansKR', serif;font-size:1.125rem;font-weight:normal;text-align: center;margin-top:20px;}
.full-btn button{width:100%;margin-bottom:10px;}
.login-link{margin-top:10px;}
@media screen and (max-width:1280px){
@ -406,9 +407,9 @@ h1.logo span{display:block;color:#f4f4f4;font-weight:bold;letter-spacing:2px;fon
.tooltip-test{position:absolute;left:500px;top:500px;}
.tooltip-box{background:#283046;padding:10px;border-radius:6px;position:relative;max-width:150px;word-break: break-all;}
/* .tooltip-box div{text-align:left;font-size:13px;} */
.tooltip-ti{border-bottom:1px solid #bbb;padding-bottom:4px;}
.tooltip-ti{border-bottom:1px solid #bbb;padding-bottom:2px;font-size:0.875rem;color:#f4f4f4}
/* .tooltip-ti span, .tooltip-txt .ti{color:#f4f4f4;font-weight:400;} */
.tooltip-txt{color:#f4f4f4;font-weight:400;font-size:12px}
.tooltip-txt{font-weight:400;font-size:12px;padding-top:4px;word-break: keep-all;}
.tooltip-txt-list + .tooltip-txt-list{margin-top:4px;}
.tooltip-box .arrow {position:absolute;bottom:-10px;left:50%;transform: translateX(-50%);display:block;width: 0px;height: 0px;border-top:10px solid #283046;border-bottom:10px solid none;border-right: 10px solid transparent;border-left: 10px solid transparent;}
.tooltip-txt-list .ti:before{content:'/';margin:0 2px;}
@ -842,4 +843,142 @@ background-size: 75% auto;
.layer-weather-address{display:flex;align-items:center;justify-content:space-between;}
.box_4n{display:flex;flex-wrap: wrap;}
.box_4n div{width:50%;height:50vh;}
.box_4n div{width:50%;height:50vh;}
.modal-video{display:flex;align-items: center;justify-content: center;}
.modal-video>.modal-content{height:90vh;}
.uam-reservation{min-width:1200px;position: relative;}
.uam-reservation .nav-link{transition:0.3s ease;-webkit-transition:0.3s ease;}
.uam-reservation .nav-link{border:0px;background-color:#242b3d}
.uam-reservation .nav-link.active span{font-weight:500}
.uam-reservation-header{display:flex;width:100%;align-items:center;justify-content:space-between;}
.uam-reservation-header h5{font-weight:500;}
.uam-reservation-header > div{width:100%}
.uam-reservation-header .step{display:flex;width:100%;margin-bottom:1.5rem;padding-bottom:1rem;border-bottom:1px solid rgba(255,255,255,0.1)}
.uam-reservation-header .step li{font-size:0.875rem;display:flex;align-items:center;}
.uam-reservation-header .step li + li{margin-left:0.5rem}
.uam-reservation-header .step .num-icon{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius: 0.357rem;background:#10163A;margin-right:10px;}
.uam-reservation-header .step .ti{font-size:1rem}
.uam-reservation-header .step .line{width:14px;color: rgba(255,255,255,0.4);margin:0 0.3rem 0 0.5rem}
.uam-reservation-tab-list{display:flex;}
.uam-reservation-tab-list .list{display: flex;justify-content:center;align-items:center;flex:1;background-color:#242b3d;padding:0.5rem;font-size:0.875rem;text-align:center;border-radius: 0.357rem;cursor:pointer;border:1px solid #404656;}
.uam-reservation-tab-list .list + .list{margin-left:0.5rem}
.uam-reservation-header .step .active-step .num-icon{background:#7367f0;font-weight:500;}
.uam-reservation-header .step .active-step .ti{font-weight:500;}
.active-step{color:rgba(255,255,255,0.8);font-weight:500;}
.inactive-step{color:rgba(255,255,255,0.4);}
.list.active {background-color: #7367f0;border-color:#7367f0;color:#fff;font-weight:500;}
.finish.active{background-color: #ff9f43;border-color:#ff9f43;color: #fff;}
.step-wrap{margin-top:1rem;border-radius: 0.357rem;}
.step-box{padding:1rem;background-color:#242b3d;border-radius: 0.357rem;}
.step-box + .step-box{margin-top:1rem}
.step-box-ti{border-bottom:1px solid #404656;padding-bottom:0.5rem;margin-bottom:1rem;display:flex;align-items:center;justify-content: space-between;}
.step-box-ti h5{font-weight:500;font-size:1rem}
.step-box-city{display:flex;width:100%;}
.step-box-city-list{flex:1;}
.step-box-city-list .step-city-ti{background:#283046;border:1px solid #404656;padding:0.8rem 1.7rem;font-weight:500;text-align:center;}
.step-box-city-list + .step-box-city-list{margin-left:1rem}
.step-box-city-list ul li{padding:0.8rem 1.7rem;border:1px solid #404656;border-top:none;cursor: pointer;font-size:0.875rem}
.step-box-city-list ul li:hover{background:#2a3247;transition: 0.3s ease;-webkit-transition: 0.3s ease;}
.search-box-city{display:flex;width:100%;}
.search-city{display:flex;flex:1;justify-content:space-between;align-items:center;background:#404656;padding:0.8rem;font-size:0.875rem;border-radius:0.357rem;}
.search-city + .search-city{margin-left:1rem;}
.search-city .arrow svg{width:18px;margin-top:-2px;margin-left:4px;margin-right:4px}
.search-city .delete:hover svg{color:#ea5455;cursor: pointer;transition:0.3s ease;-webkit-transition:0.3s ease;}
.step-wrap .calendar{display:flex;justify-content:center;}
.step-wrap .calendar .dayContainer + .dayContainer{box-shadow:none;}
.step-wrap .passengers ul{display:flex;}
.step-wrap .passengers ul li{flex:1;}
.step-wrap .passengers ul li + li{margin-left:1rem;}
.step-wrap .passengers h6{font-size:0.875rem;font-weight:500;margin-bottom:0.5rem}
.step-wrap .passengers .btn-icon svg{margin-top:4px;}
.step-wrap .finish-btn{text-align:right;margin-top:1rem;}
.step-reservation .uam-reservation-tab-list .btn{margin-left:1rem}
.step-box{padding:1rem;background-color:#242b3d;}
.step-reservation-header{text-align:center;}
.step-reservation-header .place{margin:1rem 0;}
.step-reservation-header .place span{font-size:1.5rem;font-weight:500;color:#fff}
.step-reservation-header .arrow svg{width:22px;margin-top:-2px;margin-left:8px;margin-right:8px}
.fsm-box{padding:1rem}
.fsm-ti{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid #404656;padding-bottom:0.5rem;margin-bottom:1rem}
.fsm-ti h5{font-weight:500}
.fsm-ti .btn-wrap button + button{margin-left:0.5rem}
.fsm-box .list-input label{font-size:0.875rem}
.reservation-date{margin-left:1.5rem;margin-right:1.5rem}
.reservation-date .box{display:flex!important;flex-direction: column;align-items:center;justify-content:center;background:#404656;border:2px solid #404656;border-radius: 0.1rem;padding:0.5rem;cursor:pointer;min-height:80px}
.reservation-date .box.active{border-color: #7367f0;background:#7367f0;}
.reservation-date .box.active span{color:#fff;}
.reservation-date .box .date{display:block;font-size:0.875rem}
.reservation-date .box .state{font-size:1.25rem;font-weight:400;}
.reservation-date .box .rate{font-size:0.875rem;margin-left:4px}
.reservation-date .slick-slide{margin-left:1rem;max-width: 144px;}
.reservation-date .slick-next{ right: -30px;}
.reservation-date .slick-prev{left: -30px;}
.reservation-table table{width:100%;margin:1rem auto}
.reservation-table table tr th, .reservation-table table tr td{vertical-align:middle;text-align:center}
.reservation-table table thead{background:#343d55;font-size:1rem;}
.reservation-table table thead tr th{padding:0.8rem 0.4rem;font-weight:500;;}
.reservation-table table tbody tr td{padding:0.8rem 0;}
.reservation-table table tbody tr td:nth-child(4) .amount{border-left:0;border-right:0}
.reservation-table table tbody tr td .amount{border:1px solid #404656;width:100%;height:60px;display:flex;flex-direction:column;justify-content:center;align-items:center;margin:0px auto;line-height:1.2;cursor: pointer;}
.reservation-table table tbody tr td .rate{font-size:0.875rem;font-weight:400;margin-left:4px}
.reservation-table .state{font-size:1.125rem;font-weight:400}
.reservation-table .flight span{display:block;}
.reservation-table .seat{display:block;font-size:0.75rem;font-weight:400;}
.reservation-table .alltime .start, .reservation-table .alltime .arrive{font-size:1.25rem;font-weight:400;color:#ddd;padding:0 0.7rem;}
.reservation-table .alltime{display:flex;align-items: center;justify-content: center;width:100%;position: relative;}
.reservation-table .alltime .time{position:absolute;left:50%;transform: translateX(-50%);top:-10px;font-size:0.75rem}
.reservation-table .alltime .plus{position:absolute;left:50%;transform: translateX(-50%);bottom:-10px;font-size:0.75rem}
.reservation-table .alltime .line{display:inline-block;width:55%;height:1px;background:#b4b7bd;position: relative;}
.reservation-table .alltime .line::before{content:'';display:block;width:7px;height:7px;border-radius:100%;background:#b4b7bd;position:absolute;left:0;top:-3px;}
.reservation-table .alltime .line::after{content:'';display:block;width:7px;height:7px;border-radius:100%;background:#b4b7bd;position:absolute;right:0;top:-3px;}
.reservation-table .amount.active{background:#7367f0;color:#fff}
.uam-reservation-quick{min-width:1200px}
.uam-reservation-quick .modal-title{width:100%}
.uam-reservation-quick .uam-reservation-tab-list .btn{margin-left:1rem}
.uam-reservation-btn{display:flex;justify-content:space-between;margin-top:1rem}
.uam-reservation-btn button{min-width:120px}
.fare-wrap{display:flex;}
.fare-wrap .fare{flex:1;background:#343d55;border:1px solid #343d55;border-radius:0.357rem;text-align: left;padding:2rem 1.5rem;}
.fare-wrap .fare *{color:rgba(255, 255, 255, 0.1)}
.fare-wrap .fare + .fare{margin-left:1rem}
.fare-wrap .fare.active{border-color:#7367f0}
.fare-wrap .fare.active *{color:rgba(255, 255, 255, 0.8)}
.fare-wrap .fare ul li h6{font-weight:500;font-size:1.125rem}
.fare-wrap .fare ul li .ti{display:block;}
.fare-wrap .fare ul li span{font-size:0.875rem}
.fare-wrap .list-txt > li:first-child{padding-left:0;}
.fare-wrap .list-txt > li:first-child::before{display:none;}
.fare-wrap .list-txt > li {position: relative;padding-left:14px;font-size:0.875rem;word-break: keep-all;}
.fare-wrap .list-txt > li + li{margin-top:1rem}
.fare-wrap .list-txt > li:before {content:'';display: inline-block;width:4px;height:4px;background:rgba(255, 255, 255, 0.1);border-radius:50%;position: absolute;top: 7px;left:4px;}
.fare-wrap .fare.active .list-txt > li:before{background:rgba(255, 255, 255, 0.8)}
.content.app-content{padding-bottom:5rem!important}/* 임시 css 추후삭제 */
.uam-reservation-total{position:fixed;bottom:0;width:calc(100% - 260px);left:260px;}
.uam-reservation-total .collapsing{position:absolute;bottom:56px;}
.uam-reservation-total .collapse.show{position:absolute;bottom:56px;}
.uam-reservation-total .app-collapse.card{background:#343D55}
.uam-reservation-total [class*='collapse-'] .card .card-body{padding:0}
.uam-reservation-total-wrap{background:#fff;}
.main-menu .navbar-header .navbar-brand .brand-logo-box .brand-logo img{margin-top:-5px}
.main-menu .navbar-header .navbar-brand .brand-logo-box .brand-text{padding-left:10px;}
h1.logo.itp {margin: 10px auto;width:100%;}
h1.logo.itp img{width:45px}
h1.logo.itp span{font-size:0.6rem;font-weight:100;letter-spacing:0.3pt;margin-top:4px}
.brand-logo-box{display:flex;}
.main-menu .navbar-header .navbar-brand .brand-logo-box.itp .brand-logo img{margin-top:3px}
.main-menu .navbar-header .navbar-brand .brand-logo-box.itp .brand-text{padding-left:10px;font-size:1.3rem;color:#fff}

BIN
src/assets/images/incheon_logo_wh.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

BIN
src/assets/images/itp_logo_wh.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

BIN
src/assets/images/itp_logo_wh_icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
src/assets/images/kac_logo_wh.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

279
src/assets/images/kiast_logo.svg

@ -0,0 +1,279 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="220px" height="98.667px" viewBox="0 0 220 98.667" enable-background="new 0 0 220 98.667" xml:space="preserve">
<g>
<g>
<path fill="#00479D" d="M63.85,63.171V33.878h6.524v12.964l2.137-3.22l6.669-9.744h8.151L77.645,46.35l10.206,16.821h-7.757
l-7.19-12.639l-2.529,3.084v9.555H63.85z"/>
<path fill="#00479D" d="M89.429,33.878h6.668v29.293h-6.668V33.878z"/>
<path fill="#00479D" d="M115.95,55.651h-8.383l-2.083,7.52h-6.862l8.945-29.293h8.686l9.076,29.293h-7.121L115.95,55.651z
M108.521,50.688h6.454l-1.819-6.206c-0.229-0.81-0.496-1.809-0.8-2.993c-0.304-1.187-0.527-2.068-0.671-2.647
c-0.231,0.753-0.479,1.692-0.737,2.821c-0.349,1.445-0.577,2.386-0.693,2.819L108.521,50.688z"/>
<path fill="#00479D" d="M126.988,61.775l1.377-5.414c1.012,0.508,2.144,0.93,3.401,1.267c1.256,0.337,2.563,0.508,3.921,0.508
c1.501,0,2.649-0.282,3.444-0.847c0.793-0.564,1.19-1.338,1.19-2.321c0-0.897-0.366-1.647-1.104-2.256
c-0.734-0.608-1.999-1.23-3.789-1.865c-2.543-0.896-4.479-2.01-5.807-3.34c-1.474-1.474-2.208-3.239-2.208-5.293
c0-2.544,0.997-4.641,2.994-6.291c1.996-1.646,4.688-2.472,8.073-2.472c1.619,0,3.009,0.125,4.166,0.37s2.257,0.6,3.3,1.065
l-1.477,5.354c-1.017-0.495-2.044-0.852-3.087-1.07c-1.044-0.219-2.06-0.328-3.044-0.328c-1.392,0-2.448,0.261-3.173,0.781
c-0.726,0.52-1.086,1.199-1.086,2.037c0,0.865,0.42,1.604,1.261,2.212c0.696,0.49,2.088,1.127,4.178,1.906
c2.609,0.954,4.53,2.132,5.764,3.533c1.231,1.401,1.847,3.13,1.847,5.181c0,2.602-0.956,4.726-2.869,6.373
c-2.119,1.82-5.106,2.73-8.963,2.73c-1.567,0-3.11-0.18-4.633-0.541C129.142,62.692,127.917,62.267,126.988,61.775z"/>
<path fill="#00479D" d="M156.163,63.171V39.409h-7.873v-5.531h22.556v5.531h-8.015v23.762H156.163z"/>
</g>
<g>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M98.626,23.54c-18.409,2.146-38.616,4.723-51.451,12.286
l3.838,9.598C58.546,37.91,72.086,26.692,98.626,23.54"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M100.497,28.751c-18.409,2.144-38.617,4.721-51.45,12.285
l3.837,9.596C60.417,43.12,73.956,31.902,100.497,28.751"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#00479D" d="M98.293,25.654c-17.962,2.092-37.682,4.607-50.201,11.988
l8.047,5.876C63.49,36.188,76.902,30.297,98.293,25.654"/>
</g>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#45B035" d="M149.097,19.618C101.091,16.895,45.294,22.545,6.556,6.747
L44.8,34.678c26.833-12.043,70.668-13.341,92.569-14.682"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#45B035" d="M131.676,12.552c2.833,0.075,2.34,0.317,5.167,0.391
c1.097,0.987,1.955,1.674,3.049,2.66c13.093-0.102,5.839-0.154,18.93-0.256c6.947-0.054,8.259-0.396,11.943,4.513l-35.744,0.215
C134.104,17.583,133.727,15.043,131.676,12.552"/>
<line fill="none" x1="5.156" y1="6.019" x2="61.359" y2="47.103"/>
</g>
<g>
<path fill="#00479D" d="M71.165,73.023c0.135,0.197,0.24,0.4,0.313,0.607c0.082,0.228,0.125,0.462,0.125,0.7
c0,0.935-0.379,1.703-1.137,2.306c-0.697,0.581-1.521,0.871-2.477,0.871s-1.785-0.29-2.492-0.871
c-0.746-0.613-1.121-1.382-1.121-2.306c0-0.229,0.037-0.456,0.109-0.685c0.072-0.197,0.176-0.405,0.313-0.623h-0.826v-1.729h2.865
V70.08h2.336v1.215h2.85v1.729H71.165z M66.93,73.428c-0.281,0.271-0.42,0.593-0.42,0.966c0,0.363,0.139,0.681,0.42,0.949
c0.291,0.271,0.639,0.405,1.043,0.405s0.752-0.135,1.043-0.405c0.301-0.269,0.451-0.586,0.451-0.949
c0-0.373-0.15-0.695-0.451-0.966c-0.291-0.26-0.639-0.389-1.043-0.389S67.221,73.168,66.93,73.428 M75.338,78.037
c0.934,0.799,1.4,1.791,1.4,2.975c0,1.193-0.467,2.185-1.4,2.974c-0.861,0.737-1.875,1.105-3.037,1.105
c-1.172,0-2.189-0.368-3.051-1.105c-0.904-0.789-1.355-1.78-1.355-2.974s0.451-2.186,1.355-2.975
c0.861-0.736,1.879-1.105,3.051-1.105C73.454,76.932,74.465,77.301,75.338,78.037 M70.792,79.517
c-0.447,0.405-0.67,0.903-0.67,1.495c0,0.591,0.223,1.09,0.67,1.494c0.436,0.395,0.949,0.592,1.541,0.592s1.096-0.197,1.512-0.592
c0.445-0.404,0.67-0.903,0.67-1.494c0-0.592-0.225-1.09-0.67-1.495c-0.426-0.385-0.93-0.576-1.512-0.576
C71.741,78.94,71.227,79.132,70.792,79.517 M76.739,74.829v2.211h-2.195v-6.244h2.195v2.088h1.775v1.945H76.739z"/>
<path fill="#00479D" d="M86.481,75.826h6.54v1.946H79.583v-1.946h4.701v-1.838h2.197V75.826z M90.171,77.009v-4.266H80.034v-1.947
h12.333v6.213H90.171z M89.548,77.29c1.111,0.83,1.666,1.858,1.666,3.083c0,1.308-0.523,2.398-1.572,3.271
c-0.977,0.809-2.108,1.214-3.395,1.214c-1.328,0-2.48-0.405-3.457-1.214c-1.039-0.872-1.557-1.963-1.557-3.271
c0-1.225,0.549-2.253,1.65-3.083c1.008-0.757,2.127-1.137,3.363-1.137C87.45,76.153,88.552,76.533,89.548,77.29 M84.377,78.566
c-0.52,0.498-0.779,1.101-0.779,1.807c0,0.695,0.26,1.292,0.779,1.791c0.52,0.487,1.133,0.731,1.838,0.731
c0.695,0,1.303-0.244,1.822-0.731c0.53-0.499,0.793-1.096,0.793-1.791c0-0.706-0.264-1.309-0.793-1.807
c-0.52-0.478-1.127-0.716-1.822-0.716C85.51,77.851,84.897,78.089,84.377,78.566"/>
<path fill="#00479D" d="M102.185,71.279c0.883,0.747,1.324,1.692,1.324,2.834c0,1.121-0.441,2.056-1.324,2.803
c-0.82,0.706-1.775,1.059-2.865,1.059c-1.111,0-2.076-0.353-2.896-1.059c-0.871-0.747-1.307-1.682-1.307-2.803
c0-1.142,0.436-2.087,1.307-2.834c0.82-0.706,1.785-1.059,2.896-1.059C100.409,70.221,101.364,70.573,102.185,71.279
M96.392,79.174h2.195v2.912h9.516v1.946H97.45c-0.363,0-0.623-0.077-0.779-0.233c-0.186-0.187-0.279-0.498-0.279-0.935V79.174z
M97.948,72.774c-0.404,0.363-0.607,0.81-0.607,1.339c0,0.52,0.203,0.955,0.607,1.308c0.385,0.343,0.842,0.514,1.371,0.514
c0.498,0,0.939-0.171,1.324-0.514c0.404-0.363,0.607-0.799,0.607-1.308c0-0.529-0.203-0.976-0.607-1.339
c-0.385-0.343-0.826-0.514-1.324-0.514C98.79,72.261,98.333,72.432,97.948,72.774 M107.993,76.075v3.831h-2.197v-9.11h2.197v3.317
h1.775v1.962H107.993z"/>
<path fill="#00479D" d="M119.118,70.796v1.947h-2.801c0.092,0.872,0.342,1.557,0.746,2.055c0.477,0.603,1.184,0.977,2.119,1.121
v2.087c-0.842-0.063-1.621-0.307-2.338-0.731c-0.736-0.437-1.291-1.007-1.666-1.713c-0.395,0.695-0.99,1.271-1.789,1.729
c-0.738,0.415-1.48,0.648-2.229,0.7v-2.071c0.924-0.145,1.621-0.519,2.086-1.121c0.375-0.498,0.613-1.183,0.717-2.055h-2.74v-1.947
H119.118z"/>
<path fill="#00479D" d="M112.019,79.205h2.195v2.881h9.514v1.946h-10.635c-0.363,0-0.629-0.078-0.793-0.233
c-0.188-0.187-0.281-0.498-0.281-0.935V79.205z"/>
<polygon fill="#00479D" points="121.423,73.226 121.423,70.796 123.618,70.796 123.618,79.906 121.423,79.906 121.423,75.172
119.493,75.172 119.493,73.226 "/>
<path fill="#00479D" d="M134.542,70.796v1.512c0,3.321-0.893,5.756-2.678,7.302c-1.277,1.101-2.928,1.697-4.951,1.792v-2.135
c1.836-0.062,3.213-0.689,4.125-1.884c0.852-1.1,1.277-2.646,1.277-4.64h-5.201v-1.947H134.542z M137.05,70.796h2.195v13.438
h-2.195V70.796z"/>
<path fill="#00479D" d="M147.616,78.364v-1.059h-5.527v-1.76h13.234v1.76h-5.527v1.059H147.616z M149.905,70.531
c0,0.842,0.467,1.47,1.4,1.885c0.83,0.363,2.02,0.565,3.566,0.607v1.837c-1.277-0.021-2.461-0.171-3.551-0.451
c-1.268-0.332-2.139-0.789-2.615-1.371c-0.488,0.582-1.365,1.039-2.633,1.371c-1.09,0.28-2.268,0.426-3.535,0.436v-1.821
c1.537-0.052,2.721-0.26,3.551-0.623c0.936-0.415,1.402-1.038,1.402-1.869H149.905z M152.677,79.609h-10.139v-1.712h12.334v3.814
h-10.137v0.545h10.137v1.775h-11.273c-0.365,0-0.629-0.078-0.795-0.233c-0.176-0.187-0.266-0.498-0.266-0.935v-2.74h10.139V79.609z
"/>
<path fill="#00479D" d="M164.585,71.343c0.855,0.726,1.283,1.642,1.283,2.749c0,1.088-0.428,1.994-1.283,2.719
c-0.797,0.686-1.723,1.027-2.779,1.027c-1.078,0-2.016-0.342-2.811-1.027c-0.846-0.725-1.268-1.631-1.268-2.719
c0-1.107,0.422-2.023,1.268-2.749c0.795-0.685,1.732-1.026,2.811-1.026C162.862,70.316,163.788,70.658,164.585,71.343"/>
<path fill="#00479D" d="M158.878,79.153h2.195v2.912h9.516v1.946h-10.652c-0.363,0-0.623-0.077-0.779-0.233
c-0.188-0.187-0.279-0.499-0.279-0.935V79.153z"/>
<path fill="#FFFFFF" d="M160.501,72.819c-0.385,0.345-0.576,0.77-0.576,1.272c0,0.493,0.191,0.908,0.576,1.243
c0.365,0.326,0.801,0.488,1.305,0.488c0.473,0,0.891-0.162,1.258-0.488c0.385-0.346,0.576-0.759,0.576-1.243
c0-0.503-0.191-0.928-0.576-1.272c-0.367-0.326-0.785-0.488-1.258-0.488C161.302,72.331,160.866,72.493,160.501,72.819"/>
<polygon fill="#00479D" points="166.312,78.058 166.312,76.11 168.241,76.11 168.241,70.807 170.438,70.807 170.438,80.486
168.241,80.486 168.241,78.058 "/>
<polygon fill="#00479D" points="161.946,78.055 157.687,78.055 157.687,76.109 165.995,76.109 165.995,78.055 164.142,78.055
164.142,79.894 161.946,79.894 "/>
</g>
<g>
<path fill="#00479D" d="M67.438,90.681h-0.832l-0.938-1.671l-0.473,0.566v1.104h-0.711v-3.67h0.711v1.591l1.287-1.591h0.867
l-1.211,1.459L67.438,90.681z"/>
<path fill="#00479D" d="M70.04,89.328c0,0.268-0.021,0.476-0.061,0.626c-0.043,0.15-0.123,0.289-0.242,0.416
c-0.092,0.1-0.207,0.179-0.344,0.238s-0.299,0.09-0.486,0.09c-0.186,0-0.346-0.03-0.482-0.09s-0.252-0.139-0.344-0.238
c-0.117-0.12-0.195-0.259-0.238-0.418c-0.043-0.16-0.064-0.367-0.064-0.624c0-0.263,0.02-0.47,0.061-0.62s0.121-0.289,0.242-0.416
c0.092-0.099,0.199-0.176,0.322-0.23c0.148-0.064,0.314-0.098,0.504-0.098c0.184,0,0.352,0.033,0.502,0.098
c0.127,0.055,0.236,0.132,0.328,0.23c0.117,0.12,0.195,0.259,0.238,0.418S70.04,89.075,70.04,89.328z M69.372,89.328
c0-0.175-0.008-0.31-0.025-0.404s-0.061-0.176-0.127-0.245c-0.08-0.078-0.184-0.118-0.313-0.118c-0.127,0-0.23,0.04-0.309,0.118
c-0.061,0.063-0.102,0.146-0.123,0.25c-0.02,0.105-0.029,0.238-0.029,0.399c0,0.217,0.012,0.366,0.035,0.449
c0.023,0.082,0.063,0.151,0.117,0.205c0.078,0.079,0.182,0.119,0.309,0.119c0.129,0,0.232-0.04,0.313-0.119
c0.061-0.062,0.102-0.145,0.121-0.249C69.362,89.628,69.372,89.493,69.372,89.328z"/>
<path fill="#00479D" d="M72.686,88.214l-0.504,0.507c-0.055-0.055-0.107-0.096-0.158-0.121c-0.051-0.026-0.117-0.039-0.195-0.039
c-0.115,0-0.217,0.042-0.303,0.126c-0.084,0.085-0.127,0.209-0.127,0.371v1.623h-0.668v-2.682h0.648v0.256
c0.068-0.079,0.162-0.147,0.285-0.205s0.254-0.086,0.391-0.086c0.133,0,0.248,0.019,0.346,0.057
C72.499,88.058,72.592,88.122,72.686,88.214z"/>
<path fill="#00479D" d="M75.311,89.54h-1.67c0,0.179,0.051,0.322,0.154,0.433c0.102,0.109,0.246,0.164,0.43,0.164
c0.137,0,0.25-0.02,0.338-0.058c0.086-0.038,0.176-0.105,0.268-0.2l0.406,0.401c-0.146,0.146-0.295,0.252-0.443,0.318
c-0.15,0.066-0.34,0.1-0.572,0.1c-0.367,0-0.652-0.093-0.857-0.277c-0.254-0.226-0.381-0.59-0.381-1.093
c0-0.428,0.105-0.762,0.316-1.002c0.213-0.241,0.494-0.362,0.848-0.362c0.361,0,0.648,0.122,0.861,0.364
c0.201,0.233,0.303,0.538,0.303,0.914V89.54z M74.657,89.086c0-0.093-0.02-0.187-0.059-0.28c-0.039-0.093-0.098-0.164-0.172-0.215
c-0.076-0.05-0.168-0.075-0.277-0.075s-0.201,0.025-0.277,0.075c-0.074,0.051-0.133,0.122-0.172,0.215
c-0.039,0.094-0.059,0.188-0.059,0.28H74.657z"/>
<path fill="#00479D" d="M77.991,90.672h-0.65v-0.232c-0.092,0.094-0.186,0.159-0.281,0.199c-0.096,0.039-0.221,0.06-0.375,0.06
c-0.297,0-0.521-0.078-0.674-0.233c-0.152-0.156-0.229-0.357-0.229-0.604c0-0.229,0.074-0.412,0.221-0.549
c0.16-0.151,0.391-0.227,0.691-0.227h0.629v-0.135c0-0.149-0.039-0.258-0.115-0.325s-0.203-0.101-0.381-0.101
c-0.129,0-0.229,0.016-0.297,0.046c-0.068,0.031-0.139,0.09-0.215,0.177l-0.426-0.417c0.131-0.14,0.266-0.235,0.406-0.288
s0.326-0.079,0.559-0.079c0.758,0,1.137,0.315,1.137,0.945V90.672z M77.323,89.685V89.54h-0.527c-0.248,0-0.371,0.103-0.371,0.305
c0,0.207,0.127,0.311,0.383,0.311c0.105,0,0.188-0.008,0.244-0.023c0.059-0.016,0.119-0.053,0.18-0.111
S77.323,89.851,77.323,89.685z"/>
<path fill="#00479D" d="M80.776,90.681h-0.713v-3.67h0.713V90.681z"/>
<path fill="#00479D" d="M83.844,90.681h-0.668v-1.629c0-0.169-0.045-0.296-0.139-0.383c-0.078-0.072-0.178-0.108-0.301-0.108
c-0.125,0-0.225,0.034-0.301,0.104c-0.094,0.086-0.143,0.216-0.143,0.388v1.629h-0.668v-2.682h0.65v0.246
c0.176-0.188,0.396-0.281,0.666-0.281c0.131,0,0.248,0.021,0.357,0.062c0.107,0.041,0.197,0.1,0.273,0.176
c0.1,0.1,0.168,0.212,0.211,0.338c0.039,0.125,0.061,0.267,0.061,0.425V90.681z"/>
<path fill="#00479D" d="M86.62,89.827c0,0.284-0.107,0.502-0.328,0.655c-0.201,0.144-0.469,0.216-0.805,0.216
c-0.256,0-0.455-0.021-0.6-0.062c-0.201-0.059-0.381-0.166-0.537-0.324l0.439-0.434c0.096,0.095,0.215,0.163,0.357,0.203
c0.109,0.031,0.227,0.046,0.354,0.046c0.129,0,0.24-0.022,0.332-0.066s0.139-0.114,0.139-0.21c0-0.068-0.021-0.124-0.064-0.167
c-0.043-0.042-0.115-0.069-0.219-0.08l-0.418-0.04c-0.252-0.024-0.443-0.093-0.568-0.206c-0.139-0.123-0.209-0.304-0.209-0.543
c0-0.267,0.1-0.476,0.299-0.626s0.441-0.226,0.729-0.226c0.232,0,0.428,0.022,0.59,0.067c0.16,0.045,0.303,0.127,0.43,0.247
l-0.41,0.418c-0.068-0.062-0.158-0.107-0.271-0.136c-0.111-0.03-0.229-0.045-0.348-0.045c-0.121,0-0.215,0.025-0.279,0.074
c-0.066,0.051-0.098,0.11-0.098,0.183c0,0.062,0.016,0.109,0.047,0.144c0.043,0.048,0.119,0.076,0.229,0.087l0.42,0.041
c0.258,0.023,0.455,0.103,0.59,0.238C86.553,89.417,86.62,89.599,86.62,89.827z"/>
<path fill="#00479D" d="M88.44,90.681h-0.366c-0.256,0-0.453-0.079-0.59-0.237c-0.123-0.14-0.184-0.317-0.184-0.529v-1.327h-0.283
V88.08h0.283v-0.793h0.668v0.793h0.471v0.507h-0.471v1.29c0,0.161,0.076,0.242,0.23,0.242h0.241V90.681z"/>
<path fill="#00479D" d="M89.755,87.545h-0.668v-0.543h0.668V87.545z M89.755,90.681h-0.668V88h0.668V90.681z"/>
<path fill="#00479D" d="M91.759,90.681h-0.365c-0.256,0-0.453-0.079-0.588-0.237c-0.125-0.14-0.186-0.317-0.186-0.529v-1.327
h-0.283V88.08h0.283v-0.793h0.668v0.793h0.471v0.507h-0.471v1.29c0,0.161,0.076,0.242,0.23,0.242h0.24V90.681z"/>
<path fill="#00479D" d="M94.597,90.672h-0.65v-0.25c-0.174,0.185-0.396,0.276-0.666,0.276c-0.129,0-0.248-0.021-0.355-0.062
c-0.107-0.042-0.199-0.1-0.273-0.175c-0.1-0.1-0.17-0.212-0.211-0.337c-0.041-0.124-0.063-0.266-0.063-0.424V87.99h0.668v1.622
c0,0.168,0.047,0.295,0.139,0.381c0.078,0.072,0.178,0.108,0.301,0.108c0.125,0,0.227-0.034,0.301-0.104
c0.094-0.085,0.143-0.214,0.143-0.386V87.99h0.668V90.672z"/>
<path fill="#00479D" d="M96.606,90.681h-0.365c-0.256,0-0.453-0.079-0.588-0.237c-0.123-0.14-0.186-0.317-0.186-0.529v-1.327
h-0.283V88.08h0.283v-0.793h0.668v0.793h0.471v0.507h-0.471v1.29c0,0.161,0.076,0.242,0.23,0.242h0.24V90.681z"/>
<path fill="#00479D" d="M99.458,89.54h-1.67c0,0.179,0.051,0.322,0.154,0.433c0.104,0.109,0.246,0.164,0.432,0.164
c0.135,0,0.248-0.02,0.336-0.058c0.086-0.038,0.176-0.105,0.268-0.2l0.406,0.401c-0.146,0.146-0.295,0.252-0.443,0.318
s-0.34,0.1-0.572,0.1c-0.365,0-0.652-0.093-0.857-0.277c-0.254-0.226-0.381-0.59-0.381-1.093c0-0.428,0.105-0.762,0.316-1.002
c0.213-0.241,0.496-0.362,0.848-0.362c0.361,0,0.65,0.122,0.861,0.364c0.203,0.233,0.303,0.538,0.303,0.914V89.54z M98.804,89.086
c0-0.093-0.02-0.187-0.059-0.28c-0.039-0.093-0.098-0.164-0.172-0.215c-0.076-0.05-0.168-0.075-0.277-0.075
s-0.201,0.025-0.277,0.075c-0.074,0.051-0.133,0.122-0.172,0.215c-0.039,0.094-0.059,0.188-0.059,0.28H98.804z"/>
<path fill="#00479D" d="M103.513,89.328c0,0.268-0.02,0.476-0.063,0.626c-0.039,0.15-0.121,0.289-0.24,0.416
c-0.092,0.1-0.207,0.179-0.344,0.238s-0.299,0.09-0.486,0.09c-0.186,0-0.346-0.03-0.482-0.09s-0.252-0.139-0.344-0.238
c-0.117-0.12-0.195-0.259-0.238-0.418c-0.043-0.16-0.064-0.367-0.064-0.624c0-0.263,0.02-0.47,0.061-0.62s0.123-0.289,0.242-0.416
c0.092-0.099,0.199-0.176,0.322-0.23c0.146-0.064,0.314-0.098,0.504-0.098c0.184,0,0.352,0.033,0.502,0.098
c0.127,0.055,0.236,0.132,0.328,0.23c0.117,0.12,0.195,0.259,0.238,0.418S103.513,89.075,103.513,89.328z M102.845,89.328
c0-0.175-0.008-0.31-0.025-0.404s-0.061-0.176-0.129-0.245c-0.078-0.078-0.182-0.118-0.311-0.118c-0.127,0-0.229,0.04-0.309,0.118
c-0.061,0.063-0.102,0.146-0.121,0.25c-0.021,0.105-0.031,0.238-0.031,0.399c0,0.217,0.012,0.366,0.035,0.449
c0.023,0.082,0.064,0.151,0.117,0.205c0.08,0.079,0.182,0.119,0.309,0.119c0.129,0,0.232-0.04,0.311-0.119
c0.063-0.062,0.104-0.145,0.123-0.249C102.835,89.628,102.845,89.493,102.845,89.328z"/>
<path fill="#00479D" d="M105.446,88.587h-0.494v2.094h-0.668v-2.094h-0.275V88.08h0.275v-0.336c0-0.209,0.061-0.386,0.186-0.526
c0.141-0.162,0.338-0.242,0.596-0.242h0.381v0.561h-0.264c-0.154,0-0.23,0.082-0.23,0.246v0.298h0.494V88.587z"/>
<path fill="#00479D" d="M110.124,90.681h-0.744l-0.215-0.659h-1.299l-0.221,0.659h-0.744l1.33-3.67h0.559L110.124,90.681z
M108.978,89.425l-0.445-1.329l-0.463,1.329H108.978z"/>
<path fill="#00479D" d="M112.71,87.99l-0.98,2.69h-0.523l-0.984-2.69h0.703l0.543,1.666l0.539-1.666H112.71z"/>
<path fill="#00479D" d="M113.813,87.545h-0.668v-0.543h0.668V87.545z M113.813,90.681h-0.668V88h0.668V90.681z"/>
<path fill="#00479D" d="M116.63,90.672h-0.65v-0.232c-0.092,0.094-0.186,0.159-0.281,0.199c-0.096,0.039-0.221,0.06-0.375,0.06
c-0.297,0-0.521-0.078-0.674-0.233c-0.152-0.156-0.229-0.357-0.229-0.604c0-0.229,0.074-0.412,0.221-0.549
c0.16-0.151,0.391-0.227,0.691-0.227h0.629v-0.135c0-0.149-0.039-0.258-0.115-0.325s-0.203-0.101-0.381-0.101
c-0.129,0-0.229,0.016-0.297,0.046c-0.068,0.031-0.139,0.09-0.213,0.177l-0.428-0.417c0.131-0.14,0.266-0.235,0.406-0.288
s0.326-0.079,0.559-0.079c0.758,0,1.137,0.315,1.137,0.945V90.672z M115.962,89.685V89.54h-0.527c-0.248,0-0.371,0.103-0.371,0.305
c0,0.207,0.127,0.311,0.383,0.311c0.105,0,0.188-0.008,0.244-0.023c0.059-0.016,0.119-0.053,0.18-0.111
S115.962,89.851,115.962,89.685z"/>
<path fill="#00479D" d="M118.608,90.681h-0.363c-0.258,0-0.453-0.079-0.59-0.237c-0.123-0.14-0.186-0.317-0.186-0.529v-1.327
h-0.283V88.08h0.283v-0.793h0.668v0.793h0.471v0.507h-0.471v1.29c0,0.161,0.076,0.242,0.23,0.242h0.24V90.681z"/>
<path fill="#00479D" d="M119.923,87.545h-0.668v-0.543h0.668V87.545z M119.923,90.681h-0.668V88h0.668V90.681z"/>
<path fill="#00479D" d="M122.874,89.328c0,0.268-0.021,0.476-0.063,0.626s-0.121,0.289-0.24,0.416
c-0.094,0.1-0.207,0.179-0.344,0.238s-0.301,0.09-0.488,0.09c-0.186,0-0.346-0.03-0.482-0.09s-0.252-0.139-0.344-0.238
c-0.115-0.12-0.195-0.259-0.238-0.418c-0.043-0.16-0.064-0.367-0.064-0.624c0-0.263,0.021-0.47,0.063-0.62s0.121-0.289,0.24-0.416
c0.092-0.099,0.201-0.176,0.324-0.23c0.146-0.064,0.314-0.098,0.502-0.098c0.186,0,0.354,0.033,0.504,0.098
c0.125,0.055,0.234,0.132,0.328,0.23c0.115,0.12,0.195,0.259,0.238,0.418S122.874,89.075,122.874,89.328z M122.206,89.328
c0-0.175-0.01-0.31-0.025-0.404c-0.018-0.095-0.061-0.176-0.129-0.245c-0.078-0.078-0.182-0.118-0.313-0.118
c-0.125,0-0.229,0.04-0.307,0.118c-0.063,0.063-0.102,0.146-0.123,0.25c-0.02,0.105-0.031,0.238-0.031,0.399
c0,0.217,0.012,0.366,0.037,0.449c0.023,0.082,0.063,0.151,0.117,0.205c0.078,0.079,0.182,0.119,0.307,0.119
c0.131,0,0.234-0.04,0.313-0.119c0.063-0.062,0.102-0.145,0.123-0.249C122.194,89.628,122.206,89.493,122.206,89.328z"/>
<path fill="#00479D" d="M125.78,90.681h-0.668v-1.629c0-0.169-0.045-0.296-0.137-0.383c-0.078-0.072-0.178-0.108-0.301-0.108
c-0.125,0-0.227,0.034-0.301,0.104c-0.096,0.086-0.143,0.216-0.143,0.388v1.629h-0.668v-2.682h0.65v0.246
c0.174-0.188,0.396-0.281,0.666-0.281c0.129,0,0.248,0.021,0.355,0.062s0.199,0.1,0.273,0.176c0.1,0.1,0.17,0.212,0.211,0.338
c0.041,0.125,0.061,0.267,0.061,0.425V90.681z"/>
<path fill="#00479D" d="M130.21,89.591c0,0.346-0.131,0.619-0.391,0.82c-0.246,0.191-0.568,0.287-0.965,0.287
c-0.291,0-0.543-0.036-0.754-0.107c-0.213-0.071-0.406-0.195-0.58-0.372l0.459-0.465c0.109,0.111,0.24,0.191,0.389,0.239
c0.15,0.049,0.314,0.072,0.498,0.072c0.432,0,0.648-0.15,0.648-0.451c0-0.134-0.037-0.236-0.113-0.309
c-0.035-0.031-0.076-0.058-0.129-0.08c-0.051-0.022-0.117-0.038-0.195-0.048l-0.443-0.063c-0.311-0.044-0.549-0.145-0.709-0.303
c-0.176-0.175-0.262-0.414-0.262-0.719c0-0.332,0.113-0.601,0.34-0.804c0.229-0.204,0.541-0.306,0.934-0.306
c0.258,0,0.48,0.032,0.666,0.098c0.188,0.065,0.359,0.176,0.516,0.33l-0.451,0.445c-0.102-0.096-0.219-0.161-0.348-0.196
c-0.129-0.036-0.264-0.054-0.404-0.054c-0.186,0-0.326,0.043-0.424,0.128c-0.096,0.086-0.143,0.197-0.143,0.334
c0,0.055,0.008,0.103,0.023,0.144c0.014,0.04,0.043,0.08,0.084,0.117c0.082,0.075,0.195,0.123,0.34,0.144l0.432,0.062
c0.309,0.045,0.541,0.139,0.699,0.282c0.1,0.092,0.172,0.202,0.215,0.33C130.187,89.276,130.21,89.424,130.21,89.591z"/>
<path fill="#00479D" d="M132.892,90.672h-0.65v-0.232c-0.092,0.094-0.186,0.159-0.281,0.199c-0.096,0.039-0.221,0.06-0.375,0.06
c-0.297,0-0.521-0.078-0.674-0.233c-0.152-0.156-0.229-0.357-0.229-0.604c0-0.229,0.074-0.412,0.221-0.549
c0.16-0.151,0.391-0.227,0.691-0.227h0.629v-0.135c0-0.149-0.039-0.258-0.115-0.325s-0.203-0.101-0.381-0.101
c-0.129,0-0.229,0.016-0.297,0.046c-0.068,0.031-0.139,0.09-0.213,0.177l-0.428-0.417c0.131-0.14,0.266-0.235,0.406-0.288
s0.326-0.079,0.559-0.079c0.758,0,1.137,0.315,1.137,0.945V90.672z M132.224,89.685V89.54h-0.527c-0.248,0-0.371,0.103-0.371,0.305
c0,0.207,0.127,0.311,0.383,0.311c0.105,0,0.188-0.008,0.244-0.023c0.059-0.016,0.119-0.053,0.18-0.111
S132.224,89.851,132.224,89.685z"/>
<path fill="#00479D" d="M134.911,88.587h-0.492v2.094h-0.668v-2.094h-0.275V88.08h0.275v-0.336c0-0.209,0.061-0.386,0.184-0.526
c0.141-0.162,0.34-0.242,0.598-0.242h0.379v0.561h-0.262c-0.154,0-0.23,0.082-0.23,0.246v0.298h0.492V88.587z"/>
<path fill="#00479D" d="M137.671,89.54h-1.67c0,0.179,0.051,0.322,0.154,0.433c0.102,0.109,0.246,0.164,0.432,0.164
c0.135,0,0.248-0.02,0.334-0.058c0.088-0.038,0.178-0.105,0.27-0.2l0.406,0.401c-0.146,0.146-0.295,0.252-0.443,0.318
s-0.34,0.1-0.572,0.1c-0.365,0-0.652-0.093-0.857-0.277c-0.254-0.226-0.381-0.59-0.381-1.093c0-0.428,0.105-0.762,0.316-1.002
c0.213-0.241,0.494-0.362,0.848-0.362c0.361,0,0.648,0.122,0.861,0.364c0.203,0.233,0.303,0.538,0.303,0.914V89.54z
M137.017,89.086c0-0.093-0.02-0.187-0.059-0.28c-0.041-0.093-0.098-0.164-0.172-0.215c-0.076-0.05-0.168-0.075-0.277-0.075
s-0.201,0.025-0.277,0.075c-0.074,0.051-0.131,0.122-0.172,0.215c-0.039,0.094-0.059,0.188-0.059,0.28H137.017z"/>
<path fill="#00479D" d="M139.538,90.681h-0.363c-0.256,0-0.453-0.079-0.59-0.237c-0.123-0.14-0.186-0.317-0.186-0.529v-1.327
h-0.281V88.08h0.281v-0.793h0.668v0.793h0.471v0.507h-0.471v1.29c0,0.161,0.078,0.242,0.23,0.242h0.24V90.681z"/>
<path fill="#00479D" d="M142.335,87.99l-1.145,3.111c-0.031,0.081-0.061,0.148-0.09,0.2c-0.029,0.051-0.066,0.1-0.109,0.144
c-0.072,0.072-0.158,0.125-0.254,0.157c-0.098,0.032-0.205,0.049-0.322,0.049h-0.262v-0.597h0.154c0.096,0,0.168-0.017,0.213-0.049
c0.047-0.033,0.086-0.098,0.121-0.193l0.113-0.33l-0.914-2.492h0.703l0.555,1.657l0.533-1.657H142.335z"/>
<path fill="#00479D" d="M146.417,87.644h-0.953v3.037h-0.711v-3.037H143.8v-0.633h2.617V87.644z"/>
<path fill="#00479D" d="M149.198,89.54h-1.67c0,0.179,0.051,0.322,0.154,0.433c0.102,0.109,0.246,0.164,0.43,0.164
c0.137,0,0.25-0.02,0.336-0.058c0.088-0.038,0.178-0.105,0.27-0.2l0.406,0.401c-0.148,0.146-0.295,0.252-0.443,0.318
c-0.15,0.066-0.34,0.1-0.572,0.1c-0.367,0-0.652-0.093-0.857-0.277c-0.256-0.226-0.383-0.59-0.383-1.093
c0-0.428,0.107-0.762,0.318-1.002c0.213-0.241,0.494-0.362,0.848-0.362c0.361,0,0.648,0.122,0.861,0.364
c0.201,0.233,0.303,0.538,0.303,0.914V89.54z M148.544,89.086c0-0.093-0.02-0.187-0.059-0.28c-0.041-0.093-0.098-0.164-0.174-0.215
c-0.074-0.05-0.166-0.075-0.275-0.075s-0.203,0.025-0.277,0.075c-0.076,0.051-0.133,0.122-0.172,0.215
c-0.039,0.094-0.059,0.188-0.059,0.28H148.544z"/>
<path fill="#00479D" d="M151.81,90.336c-0.232,0.241-0.527,0.362-0.883,0.362c-0.32,0-0.586-0.093-0.795-0.277
c-0.268-0.235-0.4-0.6-0.4-1.093c0-0.492,0.131-0.854,0.396-1.087c0.207-0.185,0.475-0.277,0.799-0.277
c0.359,0,0.654,0.119,0.883,0.356l-0.451,0.454c-0.068-0.076-0.137-0.131-0.203-0.164s-0.143-0.05-0.229-0.05
c-0.156,0-0.285,0.061-0.381,0.181c-0.098,0.12-0.146,0.316-0.146,0.587c0,0.275,0.049,0.473,0.146,0.593
c0.096,0.12,0.225,0.181,0.381,0.181c0.158,0,0.303-0.071,0.432-0.214L151.81,90.336z"/>
<path fill="#00479D" d="M154.579,90.681h-0.668v-1.645c0-0.165-0.047-0.289-0.139-0.372c-0.078-0.069-0.178-0.104-0.297-0.104
s-0.215,0.034-0.291,0.104c-0.092,0.083-0.139,0.207-0.139,0.372v1.645h-0.668v-3.67h0.668v1.234
c0.182-0.188,0.395-0.281,0.641-0.281c0.287,0,0.508,0.09,0.662,0.268c0.152,0.18,0.23,0.417,0.23,0.712V90.681z"/>
<path fill="#00479D" d="M157.567,90.681h-0.668v-1.629c0-0.169-0.047-0.296-0.139-0.383c-0.078-0.072-0.178-0.108-0.301-0.108
c-0.125,0-0.225,0.034-0.301,0.104c-0.096,0.086-0.143,0.216-0.143,0.388v1.629h-0.668v-2.682h0.65v0.246
c0.174-0.188,0.396-0.281,0.666-0.281c0.129,0,0.248,0.021,0.355,0.062s0.199,0.1,0.273,0.176c0.1,0.1,0.17,0.212,0.211,0.338
c0.041,0.125,0.063,0.267,0.063,0.425V90.681z"/>
<path fill="#00479D" d="M160.485,89.328c0,0.268-0.02,0.476-0.061,0.626s-0.121,0.289-0.242,0.416
c-0.092,0.1-0.207,0.179-0.342,0.238c-0.139,0.06-0.301,0.09-0.488,0.09c-0.184,0-0.346-0.03-0.482-0.09s-0.252-0.139-0.344-0.238
c-0.115-0.12-0.195-0.259-0.238-0.418c-0.043-0.16-0.064-0.367-0.064-0.624c0-0.263,0.021-0.47,0.061-0.62
c0.043-0.15,0.123-0.289,0.242-0.416c0.092-0.099,0.201-0.176,0.322-0.23c0.148-0.064,0.316-0.098,0.504-0.098
c0.184,0,0.352,0.033,0.502,0.098c0.127,0.055,0.236,0.132,0.328,0.23c0.117,0.12,0.197,0.259,0.24,0.418
S160.485,89.075,160.485,89.328z M159.817,89.328c0-0.175-0.008-0.31-0.025-0.404s-0.059-0.176-0.127-0.245
c-0.078-0.078-0.184-0.118-0.313-0.118c-0.127,0-0.229,0.04-0.307,0.118c-0.063,0.063-0.104,0.146-0.123,0.25
c-0.021,0.105-0.031,0.238-0.031,0.399c0,0.217,0.012,0.366,0.035,0.449c0.025,0.082,0.064,0.151,0.119,0.205
c0.078,0.079,0.18,0.119,0.307,0.119c0.129,0,0.234-0.04,0.313-0.119c0.061-0.062,0.102-0.145,0.123-0.249
C159.808,89.628,159.817,89.493,159.817,89.328z"/>
<path fill="#00479D" d="M162.312,90.681h-0.381c-0.258,0-0.455-0.079-0.596-0.237c-0.123-0.141-0.186-0.318-0.186-0.53v-2.902
h0.668v2.866c0,0.161,0.078,0.242,0.236,0.242h0.258V90.681z"/>
<path fill="#00479D" d="M167.573,90.571c0,0.324-0.107,0.59-0.32,0.797c-0.213,0.206-0.498,0.31-0.852,0.31
c-0.215,0-0.396-0.025-0.543-0.074c-0.148-0.049-0.289-0.14-0.426-0.272l0.416-0.419c0.139,0.136,0.313,0.205,0.52,0.205
c0.184,0,0.324-0.059,0.42-0.175c0.078-0.097,0.117-0.224,0.117-0.381v-0.273c-0.086,0.097-0.178,0.165-0.279,0.206
c-0.1,0.041-0.219,0.062-0.355,0.062c-0.266,0-0.477-0.078-0.635-0.236c-0.115-0.116-0.189-0.252-0.223-0.408
c-0.033-0.155-0.049-0.374-0.049-0.654c0-0.273,0.016-0.488,0.049-0.646c0.031-0.157,0.105-0.294,0.223-0.41
c0.156-0.158,0.369-0.236,0.639-0.236c0.143,0,0.264,0.021,0.363,0.065c0.098,0.043,0.193,0.116,0.285,0.22v-0.25h0.65V90.571z
M166.905,89.262c0-0.215-0.023-0.374-0.07-0.477c-0.07-0.144-0.191-0.216-0.369-0.216c-0.176,0-0.297,0.07-0.361,0.21
c-0.049,0.104-0.072,0.264-0.072,0.482c0,0.283,0.039,0.474,0.117,0.569c0.068,0.085,0.174,0.128,0.316,0.128
c0.178,0,0.299-0.072,0.369-0.216C166.882,89.641,166.905,89.48,166.905,89.262z"/>
<path fill="#00479D" d="M170.519,87.99l-1.145,3.111c-0.031,0.081-0.061,0.148-0.09,0.2c-0.029,0.051-0.066,0.1-0.109,0.144
c-0.072,0.072-0.156,0.125-0.254,0.157s-0.205,0.049-0.32,0.049h-0.262v-0.597h0.152c0.096,0,0.168-0.017,0.213-0.049
c0.047-0.033,0.088-0.098,0.121-0.193l0.113-0.33l-0.914-2.492h0.703l0.555,1.657l0.533-1.657H170.519z"/>
<path fill="#00479D" d="M164.907,89.333c0,0.268-0.02,0.476-0.061,0.626s-0.121,0.289-0.242,0.416
c-0.092,0.1-0.207,0.179-0.342,0.238c-0.139,0.06-0.301,0.09-0.488,0.09c-0.184,0-0.346-0.03-0.482-0.09s-0.252-0.139-0.344-0.238
c-0.115-0.12-0.195-0.259-0.238-0.418c-0.043-0.16-0.064-0.367-0.064-0.624c0-0.263,0.021-0.47,0.061-0.62
c0.043-0.15,0.123-0.289,0.242-0.416c0.092-0.099,0.201-0.176,0.322-0.23c0.148-0.064,0.316-0.098,0.504-0.098
c0.184,0,0.352,0.033,0.502,0.098c0.127,0.055,0.236,0.132,0.328,0.23c0.117,0.12,0.197,0.259,0.24,0.418
S164.907,89.08,164.907,89.333z M164.239,89.333c0-0.175-0.008-0.31-0.025-0.404s-0.059-0.176-0.127-0.245
c-0.078-0.078-0.184-0.118-0.313-0.118c-0.127,0-0.229,0.04-0.307,0.118c-0.063,0.063-0.104,0.146-0.123,0.25
c-0.021,0.105-0.031,0.238-0.031,0.399c0,0.217,0.012,0.366,0.035,0.449c0.025,0.082,0.064,0.151,0.119,0.205
c0.078,0.079,0.18,0.119,0.307,0.119c0.129,0,0.234-0.04,0.313-0.119c0.061-0.062,0.102-0.145,0.123-0.249
C164.229,89.633,164.239,89.498,164.239,89.333z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 28 KiB

279
src/assets/images/kiast_logo_wh.svg

@ -0,0 +1,279 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="220px" height="98.667px" viewBox="0 0 220 98.667" enable-background="new 0 0 220 98.667" xml:space="preserve">
<g>
<g>
<path fill="#FFFFFF" d="M63.85,63.171V33.878h6.524v12.964l2.137-3.22l6.669-9.744h8.151L77.645,46.35l10.206,16.821h-7.757
l-7.19-12.639l-2.529,3.084v9.555H63.85z"/>
<path fill="#FFFFFF" d="M89.429,33.878h6.668v29.293h-6.668V33.878z"/>
<path fill="#FFFFFF" d="M115.95,55.651h-8.383l-2.083,7.52h-6.862l8.945-29.293h8.686l9.076,29.293h-7.121L115.95,55.651z
M108.521,50.688h6.454l-1.819-6.206c-0.229-0.81-0.496-1.809-0.8-2.993c-0.304-1.187-0.527-2.068-0.671-2.647
c-0.231,0.753-0.479,1.692-0.737,2.821c-0.349,1.445-0.577,2.386-0.693,2.819L108.521,50.688z"/>
<path fill="#FFFFFF" d="M126.988,61.775l1.377-5.414c1.012,0.508,2.144,0.93,3.401,1.267c1.256,0.337,2.563,0.508,3.921,0.508
c1.501,0,2.649-0.282,3.444-0.847c0.793-0.564,1.19-1.338,1.19-2.321c0-0.897-0.366-1.647-1.104-2.256
c-0.734-0.608-1.999-1.23-3.789-1.865c-2.543-0.896-4.479-2.01-5.807-3.34c-1.474-1.474-2.208-3.239-2.208-5.293
c0-2.544,0.997-4.641,2.994-6.291c1.996-1.646,4.688-2.472,8.073-2.472c1.619,0,3.009,0.125,4.166,0.37s2.257,0.6,3.3,1.065
l-1.477,5.354c-1.017-0.495-2.044-0.852-3.087-1.07c-1.044-0.219-2.06-0.328-3.044-0.328c-1.392,0-2.448,0.261-3.173,0.781
c-0.726,0.52-1.086,1.199-1.086,2.037c0,0.865,0.42,1.604,1.261,2.212c0.696,0.49,2.088,1.127,4.178,1.906
c2.609,0.954,4.53,2.132,5.764,3.533c1.231,1.401,1.847,3.13,1.847,5.181c0,2.602-0.956,4.726-2.869,6.373
c-2.119,1.82-5.106,2.73-8.963,2.73c-1.567,0-3.11-0.18-4.633-0.541C129.142,62.692,127.917,62.267,126.988,61.775z"/>
<path fill="#FFFFFF" d="M156.163,63.171V39.409h-7.873v-5.531h22.556v5.531h-8.015v23.762H156.163z"/>
</g>
<g>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M98.626,23.54c-18.409,2.146-38.616,4.723-51.451,12.286
l3.838,9.598C58.546,37.91,72.086,26.692,98.626,23.54"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M100.497,28.751c-18.409,2.144-38.617,4.721-51.45,12.285
l3.837,9.596C60.417,43.12,73.956,31.902,100.497,28.751"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M98.293,25.654c-17.962,2.092-37.682,4.607-50.201,11.988
l8.047,5.876C63.49,36.188,76.902,30.297,98.293,25.654"/>
</g>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M149.097,19.618C101.091,16.895,45.294,22.545,6.556,6.747
L44.8,34.678c26.833-12.043,70.668-13.341,92.569-14.682"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M131.676,12.552c2.833,0.075,2.34,0.317,5.167,0.391
c1.097,0.987,1.955,1.674,3.049,2.66c13.093-0.102,5.839-0.154,18.93-0.256c6.947-0.054,8.259-0.396,11.943,4.513l-35.744,0.215
C134.104,17.583,133.727,15.043,131.676,12.552"/>
<line fill="#FFFFFF" x1="5.156" y1="6.019" x2="61.359" y2="47.103"/>
</g>
<g>
<path fill="#FFFFFF" d="M71.165,73.023c0.135,0.197,0.24,0.4,0.313,0.607c0.082,0.228,0.125,0.462,0.125,0.7
c0,0.935-0.379,1.703-1.137,2.306c-0.697,0.581-1.521,0.871-2.477,0.871s-1.785-0.29-2.492-0.871
c-0.746-0.613-1.121-1.382-1.121-2.306c0-0.229,0.037-0.456,0.109-0.685c0.072-0.197,0.176-0.405,0.313-0.623h-0.826v-1.729h2.865
V70.08h2.336v1.215h2.85v1.729H71.165z M66.93,73.428c-0.281,0.271-0.42,0.593-0.42,0.966c0,0.363,0.139,0.681,0.42,0.949
c0.291,0.271,0.639,0.405,1.043,0.405s0.752-0.135,1.043-0.405c0.301-0.269,0.451-0.586,0.451-0.949
c0-0.373-0.15-0.695-0.451-0.966c-0.291-0.26-0.639-0.389-1.043-0.389S67.221,73.168,66.93,73.428 M75.338,78.037
c0.934,0.799,1.4,1.791,1.4,2.975c0,1.193-0.467,2.185-1.4,2.974c-0.861,0.737-1.875,1.105-3.037,1.105
c-1.172,0-2.189-0.368-3.051-1.105c-0.904-0.789-1.355-1.78-1.355-2.974s0.451-2.186,1.355-2.975
c0.861-0.736,1.879-1.105,3.051-1.105C73.454,76.932,74.465,77.301,75.338,78.037 M70.792,79.517
c-0.447,0.405-0.67,0.903-0.67,1.495c0,0.591,0.223,1.09,0.67,1.494c0.436,0.395,0.949,0.592,1.541,0.592s1.096-0.197,1.512-0.592
c0.445-0.404,0.67-0.903,0.67-1.494c0-0.592-0.225-1.09-0.67-1.495c-0.426-0.385-0.93-0.576-1.512-0.576
C71.741,78.94,71.227,79.132,70.792,79.517 M76.739,74.829v2.211h-2.195v-6.244h2.195v2.088h1.775v1.945H76.739z"/>
<path fill="#FFFFFF" d="M86.481,75.826h6.54v1.946H79.583v-1.946h4.701v-1.838h2.197V75.826z M90.171,77.009v-4.266H80.034v-1.947
h12.333v6.213H90.171z M89.548,77.29c1.111,0.83,1.666,1.858,1.666,3.083c0,1.308-0.523,2.398-1.572,3.271
c-0.977,0.809-2.108,1.214-3.395,1.214c-1.328,0-2.48-0.405-3.457-1.214c-1.039-0.872-1.557-1.963-1.557-3.271
c0-1.225,0.549-2.253,1.65-3.083c1.008-0.757,2.127-1.137,3.363-1.137C87.45,76.153,88.552,76.533,89.548,77.29 M84.377,78.566
c-0.52,0.498-0.779,1.101-0.779,1.807c0,0.695,0.26,1.292,0.779,1.791c0.52,0.487,1.133,0.731,1.838,0.731
c0.695,0,1.303-0.244,1.822-0.731c0.53-0.499,0.793-1.096,0.793-1.791c0-0.706-0.264-1.309-0.793-1.807
c-0.52-0.478-1.127-0.716-1.822-0.716C85.51,77.851,84.897,78.089,84.377,78.566"/>
<path fill="#FFFFFF" d="M102.185,71.279c0.883,0.747,1.324,1.692,1.324,2.834c0,1.121-0.441,2.056-1.324,2.803
c-0.82,0.706-1.775,1.059-2.865,1.059c-1.111,0-2.076-0.353-2.896-1.059c-0.871-0.747-1.307-1.682-1.307-2.803
c0-1.142,0.436-2.087,1.307-2.834c0.82-0.706,1.785-1.059,2.896-1.059C100.409,70.221,101.364,70.573,102.185,71.279
M96.392,79.174h2.195v2.912h9.516v1.946H97.45c-0.363,0-0.623-0.077-0.779-0.233c-0.186-0.187-0.279-0.498-0.279-0.935V79.174z
M97.948,72.774c-0.404,0.363-0.607,0.81-0.607,1.339c0,0.52,0.203,0.955,0.607,1.308c0.385,0.343,0.842,0.514,1.371,0.514
c0.498,0,0.939-0.171,1.324-0.514c0.404-0.363,0.607-0.799,0.607-1.308c0-0.529-0.203-0.976-0.607-1.339
c-0.385-0.343-0.826-0.514-1.324-0.514C98.79,72.261,98.333,72.432,97.948,72.774 M107.993,76.075v3.831h-2.197v-9.11h2.197v3.317
h1.775v1.962H107.993z"/>
<path fill="#FFFFFF" d="M119.118,70.796v1.947h-2.801c0.092,0.872,0.342,1.557,0.746,2.055c0.477,0.603,1.184,0.977,2.119,1.121
v2.087c-0.842-0.063-1.621-0.307-2.338-0.731c-0.736-0.437-1.291-1.007-1.666-1.713c-0.395,0.695-0.99,1.271-1.789,1.729
c-0.738,0.415-1.48,0.648-2.229,0.7v-2.071c0.924-0.145,1.621-0.519,2.086-1.121c0.375-0.498,0.613-1.183,0.717-2.055h-2.74v-1.947
H119.118z"/>
<path fill="#FFFFFF" d="M112.019,79.205h2.195v2.881h9.514v1.946h-10.635c-0.363,0-0.629-0.078-0.793-0.233
c-0.188-0.187-0.281-0.498-0.281-0.935V79.205z"/>
<polygon fill="#FFFFFF" points="121.423,73.226 121.423,70.796 123.618,70.796 123.618,79.906 121.423,79.906 121.423,75.172
119.493,75.172 119.493,73.226 "/>
<path fill="#FFFFFF" d="M134.542,70.796v1.512c0,3.321-0.893,5.756-2.678,7.302c-1.277,1.101-2.928,1.697-4.951,1.792v-2.135
c1.836-0.062,3.213-0.689,4.125-1.884c0.852-1.1,1.277-2.646,1.277-4.64h-5.201v-1.947H134.542z M137.05,70.796h2.195v13.438
h-2.195V70.796z"/>
<path fill="#FFFFFF" d="M147.616,78.364v-1.059h-5.527v-1.76h13.234v1.76h-5.527v1.059H147.616z M149.905,70.531
c0,0.842,0.467,1.47,1.4,1.885c0.83,0.363,2.02,0.565,3.566,0.607v1.837c-1.277-0.021-2.461-0.171-3.551-0.451
c-1.268-0.332-2.139-0.789-2.615-1.371c-0.488,0.582-1.365,1.039-2.633,1.371c-1.09,0.28-2.268,0.426-3.535,0.436v-1.821
c1.537-0.052,2.721-0.26,3.551-0.623c0.936-0.415,1.402-1.038,1.402-1.869H149.905z M152.677,79.609h-10.139v-1.712h12.334v3.814
h-10.137v0.545h10.137v1.775h-11.273c-0.365,0-0.629-0.078-0.795-0.233c-0.176-0.187-0.266-0.498-0.266-0.935v-2.74h10.139V79.609z
"/>
<path fill="#FFFFFF" d="M164.585,71.343c0.855,0.726,1.283,1.642,1.283,2.749c0,1.088-0.428,1.994-1.283,2.719
c-0.797,0.686-1.723,1.027-2.779,1.027c-1.078,0-2.016-0.342-2.811-1.027c-0.846-0.725-1.268-1.631-1.268-2.719
c0-1.107,0.422-2.023,1.268-2.749c0.795-0.685,1.732-1.026,2.811-1.026C162.862,70.316,163.788,70.658,164.585,71.343"/>
<path fill="#FFFFFF" d="M158.878,79.153h2.195v2.912h9.516v1.946h-10.652c-0.363,0-0.623-0.077-0.779-0.233
c-0.188-0.187-0.279-0.499-0.279-0.935V79.153z"/>
<path fill="#FFFFFF" d="M160.501,72.819c-0.385,0.345-0.576,0.77-0.576,1.272c0,0.493,0.191,0.908,0.576,1.243
c0.365,0.326,0.801,0.488,1.305,0.488c0.473,0,0.891-0.162,1.258-0.488c0.385-0.346,0.576-0.759,0.576-1.243
c0-0.503-0.191-0.928-0.576-1.272c-0.367-0.326-0.785-0.488-1.258-0.488C161.302,72.331,160.866,72.493,160.501,72.819"/>
<polygon fill="#FFFFFF" points="166.312,78.058 166.312,76.11 168.241,76.11 168.241,70.807 170.438,70.807 170.438,80.486
168.241,80.486 168.241,78.058 "/>
<polygon fill="#FFFFFF" points="161.946,78.055 157.687,78.055 157.687,76.109 165.995,76.109 165.995,78.055 164.142,78.055
164.142,79.894 161.946,79.894 "/>
</g>
<g>
<path fill="#FFFFFF" d="M67.438,90.681h-0.832l-0.938-1.671l-0.473,0.566v1.104h-0.711v-3.67h0.711v1.591l1.287-1.591h0.867
l-1.211,1.459L67.438,90.681z"/>
<path fill="#FFFFFF" d="M70.04,89.328c0,0.268-0.021,0.476-0.061,0.626c-0.043,0.15-0.123,0.289-0.242,0.416
c-0.092,0.1-0.207,0.179-0.344,0.238s-0.299,0.09-0.486,0.09c-0.186,0-0.346-0.03-0.482-0.09s-0.252-0.139-0.344-0.238
c-0.117-0.12-0.195-0.259-0.238-0.418c-0.043-0.16-0.064-0.367-0.064-0.624c0-0.263,0.02-0.47,0.061-0.62s0.121-0.289,0.242-0.416
c0.092-0.099,0.199-0.176,0.322-0.23c0.148-0.064,0.314-0.098,0.504-0.098c0.184,0,0.352,0.033,0.502,0.098
c0.127,0.055,0.236,0.132,0.328,0.23c0.117,0.12,0.195,0.259,0.238,0.418S70.04,89.075,70.04,89.328z M69.372,89.328
c0-0.175-0.008-0.31-0.025-0.404s-0.061-0.176-0.127-0.245c-0.08-0.078-0.184-0.118-0.313-0.118c-0.127,0-0.23,0.04-0.309,0.118
c-0.061,0.063-0.102,0.146-0.123,0.25c-0.02,0.105-0.029,0.238-0.029,0.399c0,0.217,0.012,0.366,0.035,0.449
c0.023,0.082,0.063,0.151,0.117,0.205c0.078,0.079,0.182,0.119,0.309,0.119c0.129,0,0.232-0.04,0.313-0.119
c0.061-0.062,0.102-0.145,0.121-0.249C69.362,89.628,69.372,89.493,69.372,89.328z"/>
<path fill="#FFFFFF" d="M72.686,88.214l-0.504,0.507c-0.055-0.055-0.107-0.096-0.158-0.121c-0.051-0.026-0.117-0.039-0.195-0.039
c-0.115,0-0.217,0.042-0.303,0.126c-0.084,0.085-0.127,0.209-0.127,0.371v1.623h-0.668v-2.682h0.648v0.256
c0.068-0.079,0.162-0.147,0.285-0.205s0.254-0.086,0.391-0.086c0.133,0,0.248,0.019,0.346,0.057
C72.499,88.058,72.592,88.122,72.686,88.214z"/>
<path fill="#FFFFFF" d="M75.311,89.54h-1.67c0,0.179,0.051,0.322,0.154,0.433c0.102,0.109,0.246,0.164,0.43,0.164
c0.137,0,0.25-0.02,0.338-0.058c0.086-0.038,0.176-0.105,0.268-0.2l0.406,0.401c-0.146,0.146-0.295,0.252-0.443,0.318
c-0.15,0.066-0.34,0.1-0.572,0.1c-0.367,0-0.652-0.093-0.857-0.277c-0.254-0.226-0.381-0.59-0.381-1.093
c0-0.428,0.105-0.762,0.316-1.002c0.213-0.241,0.494-0.362,0.848-0.362c0.361,0,0.648,0.122,0.861,0.364
c0.201,0.233,0.303,0.538,0.303,0.914V89.54z M74.657,89.086c0-0.093-0.02-0.187-0.059-0.28c-0.039-0.093-0.098-0.164-0.172-0.215
c-0.076-0.05-0.168-0.075-0.277-0.075s-0.201,0.025-0.277,0.075c-0.074,0.051-0.133,0.122-0.172,0.215
c-0.039,0.094-0.059,0.188-0.059,0.28H74.657z"/>
<path fill="#FFFFFF" d="M77.991,90.672h-0.65v-0.232c-0.092,0.094-0.186,0.159-0.281,0.199c-0.096,0.039-0.221,0.06-0.375,0.06
c-0.297,0-0.521-0.078-0.674-0.233c-0.152-0.156-0.229-0.357-0.229-0.604c0-0.229,0.074-0.412,0.221-0.549
c0.16-0.151,0.391-0.227,0.691-0.227h0.629v-0.135c0-0.149-0.039-0.258-0.115-0.325s-0.203-0.101-0.381-0.101
c-0.129,0-0.229,0.016-0.297,0.046c-0.068,0.031-0.139,0.09-0.215,0.177l-0.426-0.417c0.131-0.14,0.266-0.235,0.406-0.288
s0.326-0.079,0.559-0.079c0.758,0,1.137,0.315,1.137,0.945V90.672z M77.323,89.685V89.54h-0.527c-0.248,0-0.371,0.103-0.371,0.305
c0,0.207,0.127,0.311,0.383,0.311c0.105,0,0.188-0.008,0.244-0.023c0.059-0.016,0.119-0.053,0.18-0.111
S77.323,89.851,77.323,89.685z"/>
<path fill="#FFFFFF" d="M80.776,90.681h-0.713v-3.67h0.713V90.681z"/>
<path fill="#FFFFFF" d="M83.844,90.681h-0.668v-1.629c0-0.169-0.045-0.296-0.139-0.383c-0.078-0.072-0.178-0.108-0.301-0.108
c-0.125,0-0.225,0.034-0.301,0.104c-0.094,0.086-0.143,0.216-0.143,0.388v1.629h-0.668v-2.682h0.65v0.246
c0.176-0.188,0.396-0.281,0.666-0.281c0.131,0,0.248,0.021,0.357,0.062c0.107,0.041,0.197,0.1,0.273,0.176
c0.1,0.1,0.168,0.212,0.211,0.338c0.039,0.125,0.061,0.267,0.061,0.425V90.681z"/>
<path fill="#FFFFFF" d="M86.62,89.827c0,0.284-0.107,0.502-0.328,0.655c-0.201,0.144-0.469,0.216-0.805,0.216
c-0.256,0-0.455-0.021-0.6-0.062c-0.201-0.059-0.381-0.166-0.537-0.324l0.439-0.434c0.096,0.095,0.215,0.163,0.357,0.203
c0.109,0.031,0.227,0.046,0.354,0.046c0.129,0,0.24-0.022,0.332-0.066s0.139-0.114,0.139-0.21c0-0.068-0.021-0.124-0.064-0.167
c-0.043-0.042-0.115-0.069-0.219-0.08l-0.418-0.04c-0.252-0.024-0.443-0.093-0.568-0.206c-0.139-0.123-0.209-0.304-0.209-0.543
c0-0.267,0.1-0.476,0.299-0.626s0.441-0.226,0.729-0.226c0.232,0,0.428,0.022,0.59,0.067c0.16,0.045,0.303,0.127,0.43,0.247
l-0.41,0.418c-0.068-0.062-0.158-0.107-0.271-0.136c-0.111-0.03-0.229-0.045-0.348-0.045c-0.121,0-0.215,0.025-0.279,0.074
c-0.066,0.051-0.098,0.11-0.098,0.183c0,0.062,0.016,0.109,0.047,0.144c0.043,0.048,0.119,0.076,0.229,0.087l0.42,0.041
c0.258,0.023,0.455,0.103,0.59,0.238C86.553,89.417,86.62,89.599,86.62,89.827z"/>
<path fill="#FFFFFF" d="M88.44,90.681h-0.366c-0.256,0-0.453-0.079-0.59-0.237c-0.123-0.14-0.184-0.317-0.184-0.529v-1.327h-0.283
V88.08h0.283v-0.793h0.668v0.793h0.471v0.507h-0.471v1.29c0,0.161,0.076,0.242,0.23,0.242h0.241V90.681z"/>
<path fill="#FFFFFF" d="M89.755,87.545h-0.668v-0.543h0.668V87.545z M89.755,90.681h-0.668V88h0.668V90.681z"/>
<path fill="#FFFFFF" d="M91.759,90.681h-0.365c-0.256,0-0.453-0.079-0.588-0.237c-0.125-0.14-0.186-0.317-0.186-0.529v-1.327
h-0.283V88.08h0.283v-0.793h0.668v0.793h0.471v0.507h-0.471v1.29c0,0.161,0.076,0.242,0.23,0.242h0.24V90.681z"/>
<path fill="#FFFFFF" d="M94.597,90.672h-0.65v-0.25c-0.174,0.185-0.396,0.276-0.666,0.276c-0.129,0-0.248-0.021-0.355-0.062
c-0.107-0.042-0.199-0.1-0.273-0.175c-0.1-0.1-0.17-0.212-0.211-0.337c-0.041-0.124-0.063-0.266-0.063-0.424V87.99h0.668v1.622
c0,0.168,0.047,0.295,0.139,0.381c0.078,0.072,0.178,0.108,0.301,0.108c0.125,0,0.227-0.034,0.301-0.104
c0.094-0.085,0.143-0.214,0.143-0.386V87.99h0.668V90.672z"/>
<path fill="#FFFFFF" d="M96.606,90.681h-0.365c-0.256,0-0.453-0.079-0.588-0.237c-0.123-0.14-0.186-0.317-0.186-0.529v-1.327
h-0.283V88.08h0.283v-0.793h0.668v0.793h0.471v0.507h-0.471v1.29c0,0.161,0.076,0.242,0.23,0.242h0.24V90.681z"/>
<path fill="#FFFFFF" d="M99.458,89.54h-1.67c0,0.179,0.051,0.322,0.154,0.433c0.104,0.109,0.246,0.164,0.432,0.164
c0.135,0,0.248-0.02,0.336-0.058c0.086-0.038,0.176-0.105,0.268-0.2l0.406,0.401c-0.146,0.146-0.295,0.252-0.443,0.318
s-0.34,0.1-0.572,0.1c-0.365,0-0.652-0.093-0.857-0.277c-0.254-0.226-0.381-0.59-0.381-1.093c0-0.428,0.105-0.762,0.316-1.002
c0.213-0.241,0.496-0.362,0.848-0.362c0.361,0,0.65,0.122,0.861,0.364c0.203,0.233,0.303,0.538,0.303,0.914V89.54z M98.804,89.086
c0-0.093-0.02-0.187-0.059-0.28c-0.039-0.093-0.098-0.164-0.172-0.215c-0.076-0.05-0.168-0.075-0.277-0.075
s-0.201,0.025-0.277,0.075c-0.074,0.051-0.133,0.122-0.172,0.215c-0.039,0.094-0.059,0.188-0.059,0.28H98.804z"/>
<path fill="#FFFFFF" d="M103.513,89.328c0,0.268-0.02,0.476-0.063,0.626c-0.039,0.15-0.121,0.289-0.24,0.416
c-0.092,0.1-0.207,0.179-0.344,0.238s-0.299,0.09-0.486,0.09c-0.186,0-0.346-0.03-0.482-0.09s-0.252-0.139-0.344-0.238
c-0.117-0.12-0.195-0.259-0.238-0.418c-0.043-0.16-0.064-0.367-0.064-0.624c0-0.263,0.02-0.47,0.061-0.62s0.123-0.289,0.242-0.416
c0.092-0.099,0.199-0.176,0.322-0.23c0.146-0.064,0.314-0.098,0.504-0.098c0.184,0,0.352,0.033,0.502,0.098
c0.127,0.055,0.236,0.132,0.328,0.23c0.117,0.12,0.195,0.259,0.238,0.418S103.513,89.075,103.513,89.328z M102.845,89.328
c0-0.175-0.008-0.31-0.025-0.404s-0.061-0.176-0.129-0.245c-0.078-0.078-0.182-0.118-0.311-0.118c-0.127,0-0.229,0.04-0.309,0.118
c-0.061,0.063-0.102,0.146-0.121,0.25c-0.021,0.105-0.031,0.238-0.031,0.399c0,0.217,0.012,0.366,0.035,0.449
c0.023,0.082,0.064,0.151,0.117,0.205c0.08,0.079,0.182,0.119,0.309,0.119c0.129,0,0.232-0.04,0.311-0.119
c0.063-0.062,0.104-0.145,0.123-0.249C102.835,89.628,102.845,89.493,102.845,89.328z"/>
<path fill="#FFFFFF" d="M105.446,88.587h-0.494v2.094h-0.668v-2.094h-0.275V88.08h0.275v-0.336c0-0.209,0.061-0.386,0.186-0.526
c0.141-0.162,0.338-0.242,0.596-0.242h0.381v0.561h-0.264c-0.154,0-0.23,0.082-0.23,0.246v0.298h0.494V88.587z"/>
<path fill="#FFFFFF" d="M110.124,90.681h-0.744l-0.215-0.659h-1.299l-0.221,0.659h-0.744l1.33-3.67h0.559L110.124,90.681z
M108.978,89.425l-0.445-1.329l-0.463,1.329H108.978z"/>
<path fill="#FFFFFF" d="M112.71,87.99l-0.98,2.69h-0.523l-0.984-2.69h0.703l0.543,1.666l0.539-1.666H112.71z"/>
<path fill="#FFFFFF" d="M113.813,87.545h-0.668v-0.543h0.668V87.545z M113.813,90.681h-0.668V88h0.668V90.681z"/>
<path fill="#FFFFFF" d="M116.63,90.672h-0.65v-0.232c-0.092,0.094-0.186,0.159-0.281,0.199c-0.096,0.039-0.221,0.06-0.375,0.06
c-0.297,0-0.521-0.078-0.674-0.233c-0.152-0.156-0.229-0.357-0.229-0.604c0-0.229,0.074-0.412,0.221-0.549
c0.16-0.151,0.391-0.227,0.691-0.227h0.629v-0.135c0-0.149-0.039-0.258-0.115-0.325s-0.203-0.101-0.381-0.101
c-0.129,0-0.229,0.016-0.297,0.046c-0.068,0.031-0.139,0.09-0.213,0.177l-0.428-0.417c0.131-0.14,0.266-0.235,0.406-0.288
s0.326-0.079,0.559-0.079c0.758,0,1.137,0.315,1.137,0.945V90.672z M115.962,89.685V89.54h-0.527c-0.248,0-0.371,0.103-0.371,0.305
c0,0.207,0.127,0.311,0.383,0.311c0.105,0,0.188-0.008,0.244-0.023c0.059-0.016,0.119-0.053,0.18-0.111
S115.962,89.851,115.962,89.685z"/>
<path fill="#FFFFFF" d="M118.608,90.681h-0.363c-0.258,0-0.453-0.079-0.59-0.237c-0.123-0.14-0.186-0.317-0.186-0.529v-1.327
h-0.283V88.08h0.283v-0.793h0.668v0.793h0.471v0.507h-0.471v1.29c0,0.161,0.076,0.242,0.23,0.242h0.24V90.681z"/>
<path fill="#FFFFFF" d="M119.923,87.545h-0.668v-0.543h0.668V87.545z M119.923,90.681h-0.668V88h0.668V90.681z"/>
<path fill="#FFFFFF" d="M122.874,89.328c0,0.268-0.021,0.476-0.063,0.626s-0.121,0.289-0.24,0.416
c-0.094,0.1-0.207,0.179-0.344,0.238s-0.301,0.09-0.488,0.09c-0.186,0-0.346-0.03-0.482-0.09s-0.252-0.139-0.344-0.238
c-0.115-0.12-0.195-0.259-0.238-0.418c-0.043-0.16-0.064-0.367-0.064-0.624c0-0.263,0.021-0.47,0.063-0.62s0.121-0.289,0.24-0.416
c0.092-0.099,0.201-0.176,0.324-0.23c0.146-0.064,0.314-0.098,0.502-0.098c0.186,0,0.354,0.033,0.504,0.098
c0.125,0.055,0.234,0.132,0.328,0.23c0.115,0.12,0.195,0.259,0.238,0.418S122.874,89.075,122.874,89.328z M122.206,89.328
c0-0.175-0.01-0.31-0.025-0.404c-0.018-0.095-0.061-0.176-0.129-0.245c-0.078-0.078-0.182-0.118-0.313-0.118
c-0.125,0-0.229,0.04-0.307,0.118c-0.063,0.063-0.102,0.146-0.123,0.25c-0.02,0.105-0.031,0.238-0.031,0.399
c0,0.217,0.012,0.366,0.037,0.449c0.023,0.082,0.063,0.151,0.117,0.205c0.078,0.079,0.182,0.119,0.307,0.119
c0.131,0,0.234-0.04,0.313-0.119c0.063-0.062,0.102-0.145,0.123-0.249C122.194,89.628,122.206,89.493,122.206,89.328z"/>
<path fill="#FFFFFF" d="M125.78,90.681h-0.668v-1.629c0-0.169-0.045-0.296-0.137-0.383c-0.078-0.072-0.178-0.108-0.301-0.108
c-0.125,0-0.227,0.034-0.301,0.104c-0.096,0.086-0.143,0.216-0.143,0.388v1.629h-0.668v-2.682h0.65v0.246
c0.174-0.188,0.396-0.281,0.666-0.281c0.129,0,0.248,0.021,0.355,0.062s0.199,0.1,0.273,0.176c0.1,0.1,0.17,0.212,0.211,0.338
c0.041,0.125,0.061,0.267,0.061,0.425V90.681z"/>
<path fill="#FFFFFF" d="M130.21,89.591c0,0.346-0.131,0.619-0.391,0.82c-0.246,0.191-0.568,0.287-0.965,0.287
c-0.291,0-0.543-0.036-0.754-0.107c-0.213-0.071-0.406-0.195-0.58-0.372l0.459-0.465c0.109,0.111,0.24,0.191,0.389,0.239
c0.15,0.049,0.314,0.072,0.498,0.072c0.432,0,0.648-0.15,0.648-0.451c0-0.134-0.037-0.236-0.113-0.309
c-0.035-0.031-0.076-0.058-0.129-0.08c-0.051-0.022-0.117-0.038-0.195-0.048l-0.443-0.063c-0.311-0.044-0.549-0.145-0.709-0.303
c-0.176-0.175-0.262-0.414-0.262-0.719c0-0.332,0.113-0.601,0.34-0.804c0.229-0.204,0.541-0.306,0.934-0.306
c0.258,0,0.48,0.032,0.666,0.098c0.188,0.065,0.359,0.176,0.516,0.33l-0.451,0.445c-0.102-0.096-0.219-0.161-0.348-0.196
c-0.129-0.036-0.264-0.054-0.404-0.054c-0.186,0-0.326,0.043-0.424,0.128c-0.096,0.086-0.143,0.197-0.143,0.334
c0,0.055,0.008,0.103,0.023,0.144c0.014,0.04,0.043,0.08,0.084,0.117c0.082,0.075,0.195,0.123,0.34,0.144l0.432,0.062
c0.309,0.045,0.541,0.139,0.699,0.282c0.1,0.092,0.172,0.202,0.215,0.33C130.187,89.276,130.21,89.424,130.21,89.591z"/>
<path fill="#FFFFFF" d="M132.892,90.672h-0.65v-0.232c-0.092,0.094-0.186,0.159-0.281,0.199c-0.096,0.039-0.221,0.06-0.375,0.06
c-0.297,0-0.521-0.078-0.674-0.233c-0.152-0.156-0.229-0.357-0.229-0.604c0-0.229,0.074-0.412,0.221-0.549
c0.16-0.151,0.391-0.227,0.691-0.227h0.629v-0.135c0-0.149-0.039-0.258-0.115-0.325s-0.203-0.101-0.381-0.101
c-0.129,0-0.229,0.016-0.297,0.046c-0.068,0.031-0.139,0.09-0.213,0.177l-0.428-0.417c0.131-0.14,0.266-0.235,0.406-0.288
s0.326-0.079,0.559-0.079c0.758,0,1.137,0.315,1.137,0.945V90.672z M132.224,89.685V89.54h-0.527c-0.248,0-0.371,0.103-0.371,0.305
c0,0.207,0.127,0.311,0.383,0.311c0.105,0,0.188-0.008,0.244-0.023c0.059-0.016,0.119-0.053,0.18-0.111
S132.224,89.851,132.224,89.685z"/>
<path fill="#FFFFFF" d="M134.911,88.587h-0.492v2.094h-0.668v-2.094h-0.275V88.08h0.275v-0.336c0-0.209,0.061-0.386,0.184-0.526
c0.141-0.162,0.34-0.242,0.598-0.242h0.379v0.561h-0.262c-0.154,0-0.23,0.082-0.23,0.246v0.298h0.492V88.587z"/>
<path fill="#FFFFFF" d="M137.671,89.54h-1.67c0,0.179,0.051,0.322,0.154,0.433c0.102,0.109,0.246,0.164,0.432,0.164
c0.135,0,0.248-0.02,0.334-0.058c0.088-0.038,0.178-0.105,0.27-0.2l0.406,0.401c-0.146,0.146-0.295,0.252-0.443,0.318
s-0.34,0.1-0.572,0.1c-0.365,0-0.652-0.093-0.857-0.277c-0.254-0.226-0.381-0.59-0.381-1.093c0-0.428,0.105-0.762,0.316-1.002
c0.213-0.241,0.494-0.362,0.848-0.362c0.361,0,0.648,0.122,0.861,0.364c0.203,0.233,0.303,0.538,0.303,0.914V89.54z
M137.017,89.086c0-0.093-0.02-0.187-0.059-0.28c-0.041-0.093-0.098-0.164-0.172-0.215c-0.076-0.05-0.168-0.075-0.277-0.075
s-0.201,0.025-0.277,0.075c-0.074,0.051-0.131,0.122-0.172,0.215c-0.039,0.094-0.059,0.188-0.059,0.28H137.017z"/>
<path fill="#FFFFFF" d="M139.538,90.681h-0.363c-0.256,0-0.453-0.079-0.59-0.237c-0.123-0.14-0.186-0.317-0.186-0.529v-1.327
h-0.281V88.08h0.281v-0.793h0.668v0.793h0.471v0.507h-0.471v1.29c0,0.161,0.078,0.242,0.23,0.242h0.24V90.681z"/>
<path fill="#FFFFFF" d="M142.335,87.99l-1.145,3.111c-0.031,0.081-0.061,0.148-0.09,0.2c-0.029,0.051-0.066,0.1-0.109,0.144
c-0.072,0.072-0.158,0.125-0.254,0.157c-0.098,0.032-0.205,0.049-0.322,0.049h-0.262v-0.597h0.154c0.096,0,0.168-0.017,0.213-0.049
c0.047-0.033,0.086-0.098,0.121-0.193l0.113-0.33l-0.914-2.492h0.703l0.555,1.657l0.533-1.657H142.335z"/>
<path fill="#FFFFFF" d="M146.417,87.644h-0.953v3.037h-0.711v-3.037H143.8v-0.633h2.617V87.644z"/>
<path fill="#FFFFFF" d="M149.198,89.54h-1.67c0,0.179,0.051,0.322,0.154,0.433c0.102,0.109,0.246,0.164,0.43,0.164
c0.137,0,0.25-0.02,0.336-0.058c0.088-0.038,0.178-0.105,0.27-0.2l0.406,0.401c-0.148,0.146-0.295,0.252-0.443,0.318
c-0.15,0.066-0.34,0.1-0.572,0.1c-0.367,0-0.652-0.093-0.857-0.277c-0.256-0.226-0.383-0.59-0.383-1.093
c0-0.428,0.107-0.762,0.318-1.002c0.213-0.241,0.494-0.362,0.848-0.362c0.361,0,0.648,0.122,0.861,0.364
c0.201,0.233,0.303,0.538,0.303,0.914V89.54z M148.544,89.086c0-0.093-0.02-0.187-0.059-0.28c-0.041-0.093-0.098-0.164-0.174-0.215
c-0.074-0.05-0.166-0.075-0.275-0.075s-0.203,0.025-0.277,0.075c-0.076,0.051-0.133,0.122-0.172,0.215
c-0.039,0.094-0.059,0.188-0.059,0.28H148.544z"/>
<path fill="#FFFFFF" d="M151.81,90.336c-0.232,0.241-0.527,0.362-0.883,0.362c-0.32,0-0.586-0.093-0.795-0.277
c-0.268-0.235-0.4-0.6-0.4-1.093c0-0.492,0.131-0.854,0.396-1.087c0.207-0.185,0.475-0.277,0.799-0.277
c0.359,0,0.654,0.119,0.883,0.356l-0.451,0.454c-0.068-0.076-0.137-0.131-0.203-0.164s-0.143-0.05-0.229-0.05
c-0.156,0-0.285,0.061-0.381,0.181c-0.098,0.12-0.146,0.316-0.146,0.587c0,0.275,0.049,0.473,0.146,0.593
c0.096,0.12,0.225,0.181,0.381,0.181c0.158,0,0.303-0.071,0.432-0.214L151.81,90.336z"/>
<path fill="#FFFFFF" d="M154.579,90.681h-0.668v-1.645c0-0.165-0.047-0.289-0.139-0.372c-0.078-0.069-0.178-0.104-0.297-0.104
s-0.215,0.034-0.291,0.104c-0.092,0.083-0.139,0.207-0.139,0.372v1.645h-0.668v-3.67h0.668v1.234
c0.182-0.188,0.395-0.281,0.641-0.281c0.287,0,0.508,0.09,0.662,0.268c0.152,0.18,0.23,0.417,0.23,0.712V90.681z"/>
<path fill="#FFFFFF" d="M157.567,90.681h-0.668v-1.629c0-0.169-0.047-0.296-0.139-0.383c-0.078-0.072-0.178-0.108-0.301-0.108
c-0.125,0-0.225,0.034-0.301,0.104c-0.096,0.086-0.143,0.216-0.143,0.388v1.629h-0.668v-2.682h0.65v0.246
c0.174-0.188,0.396-0.281,0.666-0.281c0.129,0,0.248,0.021,0.355,0.062s0.199,0.1,0.273,0.176c0.1,0.1,0.17,0.212,0.211,0.338
c0.041,0.125,0.063,0.267,0.063,0.425V90.681z"/>
<path fill="#FFFFFF" d="M160.485,89.328c0,0.268-0.02,0.476-0.061,0.626s-0.121,0.289-0.242,0.416
c-0.092,0.1-0.207,0.179-0.342,0.238c-0.139,0.06-0.301,0.09-0.488,0.09c-0.184,0-0.346-0.03-0.482-0.09s-0.252-0.139-0.344-0.238
c-0.115-0.12-0.195-0.259-0.238-0.418c-0.043-0.16-0.064-0.367-0.064-0.624c0-0.263,0.021-0.47,0.061-0.62
c0.043-0.15,0.123-0.289,0.242-0.416c0.092-0.099,0.201-0.176,0.322-0.23c0.148-0.064,0.316-0.098,0.504-0.098
c0.184,0,0.352,0.033,0.502,0.098c0.127,0.055,0.236,0.132,0.328,0.23c0.117,0.12,0.197,0.259,0.24,0.418
S160.485,89.075,160.485,89.328z M159.817,89.328c0-0.175-0.008-0.31-0.025-0.404s-0.059-0.176-0.127-0.245
c-0.078-0.078-0.184-0.118-0.313-0.118c-0.127,0-0.229,0.04-0.307,0.118c-0.063,0.063-0.104,0.146-0.123,0.25
c-0.021,0.105-0.031,0.238-0.031,0.399c0,0.217,0.012,0.366,0.035,0.449c0.025,0.082,0.064,0.151,0.119,0.205
c0.078,0.079,0.18,0.119,0.307,0.119c0.129,0,0.234-0.04,0.313-0.119c0.061-0.062,0.102-0.145,0.123-0.249
C159.808,89.628,159.817,89.493,159.817,89.328z"/>
<path fill="#FFFFFF" d="M162.312,90.681h-0.381c-0.258,0-0.455-0.079-0.596-0.237c-0.123-0.141-0.186-0.318-0.186-0.53v-2.902
h0.668v2.866c0,0.161,0.078,0.242,0.236,0.242h0.258V90.681z"/>
<path fill="#FFFFFF" d="M167.573,90.571c0,0.324-0.107,0.59-0.32,0.797c-0.213,0.206-0.498,0.31-0.852,0.31
c-0.215,0-0.396-0.025-0.543-0.074c-0.148-0.049-0.289-0.14-0.426-0.272l0.416-0.419c0.139,0.136,0.313,0.205,0.52,0.205
c0.184,0,0.324-0.059,0.42-0.175c0.078-0.097,0.117-0.224,0.117-0.381v-0.273c-0.086,0.097-0.178,0.165-0.279,0.206
c-0.1,0.041-0.219,0.062-0.355,0.062c-0.266,0-0.477-0.078-0.635-0.236c-0.115-0.116-0.189-0.252-0.223-0.408
c-0.033-0.155-0.049-0.374-0.049-0.654c0-0.273,0.016-0.488,0.049-0.646c0.031-0.157,0.105-0.294,0.223-0.41
c0.156-0.158,0.369-0.236,0.639-0.236c0.143,0,0.264,0.021,0.363,0.065c0.098,0.043,0.193,0.116,0.285,0.22v-0.25h0.65V90.571z
M166.905,89.262c0-0.215-0.023-0.374-0.07-0.477c-0.07-0.144-0.191-0.216-0.369-0.216c-0.176,0-0.297,0.07-0.361,0.21
c-0.049,0.104-0.072,0.264-0.072,0.482c0,0.283,0.039,0.474,0.117,0.569c0.068,0.085,0.174,0.128,0.316,0.128
c0.178,0,0.299-0.072,0.369-0.216C166.882,89.641,166.905,89.48,166.905,89.262z"/>
<path fill="#FFFFFF" d="M170.519,87.99l-1.145,3.111c-0.031,0.081-0.061,0.148-0.09,0.2c-0.029,0.051-0.066,0.1-0.109,0.144
c-0.072,0.072-0.156,0.125-0.254,0.157s-0.205,0.049-0.32,0.049h-0.262v-0.597h0.152c0.096,0,0.168-0.017,0.213-0.049
c0.047-0.033,0.088-0.098,0.121-0.193l0.113-0.33l-0.914-2.492h0.703l0.555,1.657l0.533-1.657H170.519z"/>
<path fill="#FFFFFF" d="M164.907,89.333c0,0.268-0.02,0.476-0.061,0.626s-0.121,0.289-0.242,0.416
c-0.092,0.1-0.207,0.179-0.342,0.238c-0.139,0.06-0.301,0.09-0.488,0.09c-0.184,0-0.346-0.03-0.482-0.09s-0.252-0.139-0.344-0.238
c-0.115-0.12-0.195-0.259-0.238-0.418c-0.043-0.16-0.064-0.367-0.064-0.624c0-0.263,0.021-0.47,0.061-0.62
c0.043-0.15,0.123-0.289,0.242-0.416c0.092-0.099,0.201-0.176,0.322-0.23c0.148-0.064,0.316-0.098,0.504-0.098
c0.184,0,0.352,0.033,0.502,0.098c0.127,0.055,0.236,0.132,0.328,0.23c0.117,0.12,0.197,0.259,0.24,0.418
S164.907,89.08,164.907,89.333z M164.239,89.333c0-0.175-0.008-0.31-0.025-0.404s-0.059-0.176-0.127-0.245
c-0.078-0.078-0.184-0.118-0.313-0.118c-0.127,0-0.229,0.04-0.307,0.118c-0.063,0.063-0.104,0.146-0.123,0.25
c-0.021,0.105-0.031,0.238-0.031,0.399c0,0.217,0.012,0.366,0.035,0.449c0.025,0.082,0.064,0.151,0.119,0.205
c0.078,0.079,0.18,0.119,0.307,0.119c0.129,0,0.234-0.04,0.313-0.119c0.061-0.062,0.102-0.145,0.123-0.249
C164.229,89.633,164.239,89.498,164.239,89.333z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 28 KiB

BIN
src/assets/images/login_img.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

218
src/assets/images/mi_logo.svg

@ -0,0 +1,218 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="360px" height="396px" viewBox="0 0 360 396" enable-background="new 0 0 360 396" xml:space="preserve">
<g>
<path fill="#003964" d="M229.294,102.004c-16.579-11.262-37.798-6.669-48.931,10.271c-9.31,14.146-23.354,15.904-28.799,15.904
c-17.722,0-29.855-12.468-33.449-25.372h-0.008c-0.034-0.127-0.063-0.233-0.097-0.359c-0.033-0.143-0.079-0.288-0.114-0.44
c-1.416-5.381-1.766-7.955-1.766-13.676c0-30.857,31.662-65.209,77.255-65.209c46.693,0,73.412,35.546,80.295,55.3
c-0.124-0.346-0.23-0.692-0.353-1.051c-13.246-38.637-49.89-66.418-93.022-66.418c-54.294,0-98.319,44.016-98.319,98.317
c0,48.534,35.013,90.083,83.57,90.083c38.726,0,64.755-21.716,76.695-51.639C248.809,131.349,244.163,112.111,229.294,102.004"/>
<path fill="#ED193A" d="M274.292,80.338c-5.742-19.27-32.661-57.214-80.906-57.214c-45.593,0-77.255,34.351-77.255,65.208
c0,5.722,0.35,8.296,1.766,13.677c-0.596-2.351-0.905-4.713-0.905-7.013c0-32.133,32.173-54.402,65.252-54.402
c44.773,0,81.063,36.298,81.063,81.061c0,35.099-20.19,65.472-49.542,80.068l0.01,0.023c37.831-13.699,64.842-49.927,64.842-92.475
C278.616,99.201,277.265,90.323,274.292,80.338"/>
<path fill="#58595B" d="M84.246,287.663v19.702h-7.033v-13.559H40.029v-6.144h18.937v-8.3H36.48v-6.144h51.947v6.144H65.935v8.3
H84.246z M84.246,251.87v16.851h-7.033V258.08H40.659v-6.21H84.246z"/>
<polygon fill="#58595B" points="143.476,286.65 125.103,286.65 125.103,296.911 147.594,296.911 147.594,303.058 95.647,303.058
95.647,296.911 118.074,296.911 118.074,286.65 99.831,286.65 99.831,253.581 143.349,253.581 143.349,259.726 106.73,259.726
106.73,267.074 143.349,267.074 143.349,273.093 106.73,273.093 106.73,280.505 143.476,280.505 "/>
<path fill="#58595B" d="M167.165,296.911v-17.548h6.654v17.548h9.438v-17.548h6.713v17.548h16.788v6.146h-51.943v-6.146H167.165z
M195.547,286.966v-27.115h-36.555v-6.269h43.59v33.384H195.547z"/>
<path fill="#58595B" d="M265.279,283.039h-51.948v-5.766h22.493v-3.673h-18.309v-22.237h43.519v5.764h-36.677v2.788h36.677v5.26
h-36.677v2.85h36.805v5.576h-18.437v3.673h22.554V283.039z M253.183,296.911c0,1.774-0.373,3.442-1.111,5.005
c-0.74,1.562-1.723,2.914-2.948,4.056c-1.267,1.182-2.726,2.121-4.367,2.82c-1.649,0.693-3.42,1.043-5.321,1.043
s-3.687-0.35-5.35-1.043c-1.671-0.699-3.142-1.639-4.408-2.82c-1.223-1.142-2.206-2.494-2.941-4.056
c-0.74-1.563-1.114-3.23-1.114-5.005s0.374-3.432,1.114-4.974c0.735-1.542,1.719-2.881,2.941-4.022
c1.267-1.182,2.737-2.121,4.408-2.818c1.663-0.695,3.448-1.044,5.35-1.044s3.672,0.349,5.321,1.044
c1.642,0.697,3.101,1.637,4.367,2.818c1.226,1.142,2.208,2.48,2.948,4.022C252.81,293.479,253.183,295.137,253.183,296.911
M246.397,296.849c0-1.902-0.673-3.538-2.022-4.911c-1.35-1.371-2.999-2.059-4.94-2.059c-1.944,0-3.604,0.688-4.97,2.059
c-1.378,1.373-2.065,3.009-2.065,4.911c0,1.901,0.688,3.526,2.065,4.88c1.366,1.348,3.025,2.026,4.97,2.026
c1.941,0,3.591-0.679,4.94-2.026C245.725,300.375,246.397,298.75,246.397,296.849"/>
<path fill="#58595B" d="M272.182,286.421h51.945v6.208h-22.49V307.2h-7.032v-14.571h-22.423V286.421z M283.265,258.803h29.71
v-7.162h6.973v27.178H276.36v-27.178h6.904V258.803z M312.975,264.881h-29.71v7.795h29.71V264.881z"/>
</g>
<polygon fill="#58595B" points="94.755,328.068 94.755,346.673 91.766,346.673 91.766,331.698 86.909,346.673 84.024,346.673
79.167,331.698 79.167,346.673 76.178,346.673 76.178,328.068 80.769,328.068 85.466,342.563 90.164,328.068 "/>
<path fill="#58595B" d="M101.904,329.536c0,0.516-0.19,0.966-0.573,1.348c-0.383,0.383-0.84,0.575-1.374,0.575
c-0.535,0-0.992-0.192-1.375-0.575c-0.383-0.382-0.573-0.832-0.573-1.348c0-0.533,0.19-0.991,0.573-1.374
c0.383-0.383,0.84-0.574,1.375-0.574c0.533,0,0.99,0.191,1.374,0.574C101.713,328.545,101.904,329.003,101.904,329.536
M98.463,333.3h3.041v13.373h-3.041V333.3z"/>
<path fill="#58595B" d="M108.225,339.946v6.728h-3.016V333.3h2.911v1.788c0.354-0.622,0.871-1.129,1.547-1.521
s1.407-0.588,2.189-0.588c1.583,0,2.851,0.539,3.803,1.614c0.952,1.078,1.428,2.515,1.428,4.313v7.768h-3.042v-6.994
c0-1.423-0.233-2.478-0.695-3.163c-0.464-0.685-1.176-1.027-2.135-1.027c-0.5,0-0.985,0.164-1.457,0.493
c-0.471,0.33-0.831,0.778-1.08,1.35C108.377,337.989,108.225,338.861,108.225,339.946"/>
<path fill="#58595B" d="M124.129,329.536c0,0.516-0.19,0.966-0.573,1.348c-0.383,0.383-0.84,0.575-1.374,0.575
c-0.535,0-0.992-0.192-1.375-0.575c-0.383-0.382-0.573-0.832-0.573-1.348c0-0.533,0.19-0.991,0.573-1.374s0.84-0.574,1.375-0.574
c0.533,0,0.99,0.191,1.374,0.574C123.939,328.545,124.129,329.003,124.129,329.536 M120.688,333.3h3.041v13.373h-3.041V333.3z"/>
<path fill="#58595B" d="M126.207,344.19l1.895-1.947c0.535,0.729,1.121,1.298,1.764,1.707c0.621,0.374,1.29,0.561,2.001,0.561
c0.676,0,1.25-0.137,1.721-0.413c0.471-0.275,0.709-0.645,0.709-1.107s-0.229-0.823-0.681-1.082
c-0.455-0.257-0.993-0.502-1.616-0.733c-0.73-0.231-1.478-0.489-2.242-0.773c-1.033-0.374-1.79-0.854-2.271-1.442
c-0.48-0.587-0.721-1.255-0.721-2.002c0-1.103,0.516-2.042,1.549-2.816c1.033-0.773,2.251-1.161,3.658-1.161
c1.495,0,2.713,0.356,3.655,1.068c0.481,0.374,0.864,0.837,1.149,1.388l-1.868,1.815c-0.25-0.427-0.545-0.774-0.883-1.041
c-0.585-0.517-1.326-0.774-2.216-0.774c-0.516,0-0.964,0.13-1.347,0.387c-0.383,0.258-0.574,0.565-0.574,0.921
c0,0.392,0.214,0.721,0.64,0.987c0.426,0.268,1.059,0.526,1.895,0.774c0.302,0.09,0.649,0.197,1.042,0.32
c1.299,0.428,2.282,0.979,2.949,1.655c0.668,0.678,1.001,1.486,1.001,2.429c0,1.104-0.533,2.06-1.602,2.87
c-1.068,0.81-2.43,1.215-4.083,1.215c-1.388,0-2.616-0.321-3.684-0.961C127.337,345.605,126.724,344.991,126.207,344.19"/>
<path fill="#58595B" d="M143.713,329.003v4.297h2.911v2.456h-2.911v6.808c0,0.64,0.155,1.08,0.466,1.32
c0.312,0.24,0.752,0.36,1.323,0.36h1.121v2.429h-1.842c-1.442,0-2.492-0.32-3.151-0.96c-0.659-0.642-0.987-1.592-0.987-2.855v-7.102
h-2.297V333.3h2.297v-4.297H143.713z"/>
<path fill="#58595B" d="M149.154,346.673V333.3h2.856v2.002c0.445-0.658,0.987-1.165,1.627-1.521
c0.767-0.462,1.664-0.693,2.697-0.693h0.214v2.722h-0.321c-1.264,0-2.268,0.384-3.015,1.148c-0.695,0.747-1.042,1.914-1.042,3.497
v6.219H149.154z"/>
<polygon fill="#58595B" points="162.95,346.166 157.69,333.3 160.841,333.3 164.471,342.43 168.076,333.3 171.198,333.3
163.752,351.852 160.653,351.852 "/>
<path fill="#58595B" d="M186.003,346.994c-1.958,0-3.627-0.672-5.005-2.016c-1.38-1.344-2.07-3.003-2.07-4.979
s0.69-3.639,2.07-4.992c1.378-1.352,3.046-2.028,5.005-2.028c1.975,0,3.649,0.677,5.017,2.028c1.37,1.354,2.056,3.017,2.056,4.992
s-0.686,3.635-2.056,4.979C189.652,346.322,187.979,346.994,186.003,346.994 M186.003,344.484c1.102,0,2.049-0.422,2.841-1.269
c0.793-0.845,1.188-1.916,1.188-3.216c0-1.281-0.395-2.353-1.188-3.217c-0.792-0.862-1.739-1.294-2.841-1.294
c-1.085,0-2.025,0.432-2.818,1.294c-0.79,0.864-1.188,1.936-1.188,3.217c0,1.3,0.397,2.371,1.188,3.216
C183.979,344.063,184.918,344.484,186.003,344.484"/>
<path fill="#58595B" d="M196.355,331.886c0-1.246,0.351-2.194,1.055-2.844c0.702-0.648,1.775-0.974,3.215-0.974h1.469v2.429h-0.881
c-0.568,0-1.009,0.12-1.32,0.36s-0.467,0.681-0.467,1.321v1.121h2.668v2.456h-2.668v10.917h-3.07v-10.917h-2.296V333.3h2.296
V331.886z"/>
<polygon fill="#58595B" points="223.731,346.673 212.653,346.673 212.653,328.068 215.778,328.068 215.778,344.059 223.731,344.059
"/>
<path fill="#58595B" d="M231.735,338.052h3.151c0-0.872-0.338-1.526-1.014-1.962c-0.679-0.437-1.656-0.654-2.938-0.654h-0.08
c-1.212,0-2.492,0.285-3.844,0.855l-0.773-2.378c1.404-0.604,2.953-0.916,4.643-0.934h0.055c2.242,0,3.963,0.432,5.165,1.295
c1.201,0.863,1.801,2.238,1.801,4.124v8.274h-2.882v-1.467c-0.571,0.568-1.269,1.009-2.097,1.32
c-0.825,0.313-1.668,0.468-2.522,0.468c-1.602,0-2.896-0.424-3.884-1.269c-0.988-0.845-1.48-1.881-1.48-3.109
c0-1.37,0.613-2.5,1.842-3.39C228.016,338.443,229.637,338.052,231.735,338.052 M230.907,344.592c0.783,0,1.559-0.191,2.323-0.574
c0.766-0.383,1.318-0.821,1.656-1.321v-2.27h-2.696c-1.53,0-2.599,0.196-3.203,0.588c-0.588,0.445-0.881,0.979-0.881,1.602
c0,0.569,0.247,1.042,0.747,1.415C229.351,344.405,230.036,344.592,230.907,344.592"/>
<path fill="#58595B" d="M244.437,339.946v6.728h-3.018V333.3h2.911v1.788c0.356-0.622,0.871-1.129,1.549-1.521
c0.676-0.392,1.404-0.588,2.188-0.588c1.585,0,2.854,0.539,3.806,1.614c0.951,1.078,1.428,2.515,1.428,4.313v7.768h-3.044v-6.994
c0-1.423-0.231-2.478-0.695-3.163c-0.462-0.685-1.173-1.027-2.135-1.027c-0.497,0-0.982,0.164-1.454,0.493
c-0.471,0.33-0.833,0.778-1.08,1.35C244.587,337.989,244.437,338.861,244.437,339.946"/>
<path fill="#58595B" d="M262.45,332.979c1.585,0,2.946,0.642,4.084,1.922v-6.833h3.044v18.604h-2.938v-1.68
c-1.12,1.334-2.518,2.001-4.19,2.001c-1.959,0-3.541-0.694-4.753-2.082c-1.209-1.389-1.813-3.025-1.813-4.912
c0-1.886,0.604-3.527,1.813-4.925C258.909,333.678,260.491,332.979,262.45,332.979 M266.508,340.854
c0.053-0.587,0.053-1.157,0-1.709c-0.107-1.014-0.48-1.858-1.121-2.536c-0.712-0.747-1.592-1.12-2.644-1.12
c-1.174,0-2.1,0.432-2.775,1.294c-0.676,0.864-1.014,1.936-1.014,3.217c0,1.3,0.338,2.371,1.014,3.216
c0.676,0.847,1.602,1.268,2.775,1.268c1.052,0,1.932-0.372,2.644-1.119C266.027,342.688,266.4,341.852,266.508,340.854"/>
<path fill="#58595B" d="M275.044,347.849h-0.133c-0.533,0-0.997-0.188-1.388-0.562c-0.393-0.374-0.585-0.827-0.585-1.361
c0-0.551,0.192-1.014,0.585-1.388c0.391-0.373,0.854-0.561,1.388-0.561c0.552,0,1.014,0.178,1.388,0.533
c0.447,0.428,0.668,1.023,0.668,1.789c0,1.299-0.321,2.376-0.961,3.23c-0.624,0.801-1.335,1.361-2.137,1.682l-0.8-0.881
c0.728-0.463,1.271-0.997,1.628-1.602C274.856,348.462,274.973,348.169,275.044,347.849"/>
<g>
<rect x="6.214" y="360.68" fill="#58595B" width="3.123" height="18.604"/>
<path fill="#58595B" d="M16.085,372.558v6.728h-3.018v-13.374h2.911v1.788c0.357-0.622,0.871-1.129,1.549-1.521
c0.676-0.392,1.404-0.588,2.187-0.588c1.585,0,2.854,0.539,3.805,1.614c0.952,1.078,1.428,2.515,1.428,4.313v7.768h-3.044v-6.994
c0-1.423-0.231-2.478-0.695-3.163c-0.462-0.686-1.173-1.027-2.135-1.027c-0.498,0-0.983,0.164-1.454,0.493
c-0.471,0.33-0.833,0.778-1.081,1.35C16.235,370.601,16.085,371.473,16.085,372.558"/>
<path fill="#58595B" d="M28.973,364.497c0-1.246,0.352-2.194,1.054-2.844c0.702-0.648,1.775-0.974,3.217-0.974h1.469v2.429h-0.881
c-0.571,0-1.011,0.12-1.323,0.36c-0.312,0.24-0.466,0.681-0.466,1.321v1.121h2.67v2.455h-2.67v10.918h-3.07v-10.918h-2.297v-2.455
h2.297V364.497z"/>
<path fill="#58595B" d="M37.19,379.284v-13.373h2.856v2.002c0.445-0.658,0.988-1.165,1.628-1.521
c0.766-0.462,1.664-0.694,2.697-0.694h0.214v2.723h-0.321c-1.264,0-2.269,0.384-3.016,1.148c-0.695,0.747-1.042,1.913-1.042,3.497
v6.219H37.19z"/>
<path fill="#58595B" d="M52.348,370.663h3.148c0-0.872-0.338-1.526-1.014-1.962c-0.676-0.437-1.654-0.654-2.937-0.654h-0.078
c-1.211,0-2.492,0.285-3.846,0.855l-0.773-2.378c1.407-0.604,2.954-0.916,4.646-0.934h0.052c2.242,0,3.965,0.432,5.167,1.294
c1.199,0.864,1.801,2.238,1.801,4.125v8.274H55.63v-1.467c-0.569,0.568-1.266,1.009-2.094,1.32
c-0.828,0.313-1.668,0.468-2.522,0.468c-1.602,0-2.896-0.424-3.884-1.269c-0.987-0.845-1.482-1.881-1.482-3.109
c0-1.37,0.614-2.5,1.842-3.39C48.628,371.055,50.247,370.663,52.348,370.663 M51.52,377.203c0.783,0,1.556-0.191,2.323-0.575
c0.764-0.382,1.316-0.82,1.654-1.32v-2.27H52.8c-1.53,0-2.596,0.196-3.203,0.588c-0.585,0.445-0.881,0.979-0.881,1.602
c0,0.569,0.25,1.041,0.748,1.415C49.963,377.017,50.649,377.203,51.52,377.203"/>
<path fill="#58595B" d="M60.804,376.802l1.895-1.947c0.535,0.729,1.121,1.298,1.763,1.707c0.621,0.374,1.292,0.561,2.004,0.561
c0.674,0,1.247-0.137,1.718-0.413c0.471-0.275,0.709-0.645,0.709-1.107s-0.229-0.823-0.681-1.082
c-0.455-0.257-0.993-0.502-1.616-0.733c-0.73-0.231-1.478-0.489-2.242-0.774c-1.033-0.373-1.79-0.854-2.271-1.441
c-0.48-0.587-0.721-1.255-0.721-2.002c0-1.103,0.517-2.042,1.549-2.816c1.033-0.773,2.251-1.161,3.658-1.161
c1.495,0,2.713,0.356,3.655,1.068c0.481,0.374,0.864,0.837,1.149,1.388l-1.868,1.815c-0.25-0.427-0.545-0.774-0.883-1.041
c-0.585-0.517-1.326-0.774-2.216-0.774c-0.516,0-0.964,0.13-1.347,0.387c-0.383,0.258-0.574,0.565-0.574,0.921
c0,0.392,0.214,0.721,0.64,0.987c0.426,0.268,1.059,0.526,1.897,0.774c0.3,0.09,0.647,0.196,1.04,0.32
c1.299,0.428,2.282,0.979,2.948,1.655c0.669,0.677,1.002,1.486,1.002,2.429c0,1.104-0.533,2.06-1.602,2.87
c-1.068,0.81-2.43,1.215-4.084,1.215c-1.387,0-2.615-0.321-3.684-0.961C61.934,378.217,61.32,377.603,60.804,376.802"/>
<path fill="#58595B" d="M78.31,361.614v4.297h2.911v2.455H78.31v6.808c0,0.641,0.155,1.081,0.466,1.321
c0.312,0.24,0.752,0.36,1.323,0.36h1.121v2.429h-1.842c-1.442,0-2.492-0.32-3.151-0.96c-0.659-0.642-0.987-1.593-0.987-2.856
v-7.102h-2.297v-2.455h2.297v-4.297H78.31z"/>
<path fill="#58595B" d="M83.75,379.284v-13.373h2.856v2.002c0.445-0.658,0.987-1.165,1.627-1.521
c0.767-0.462,1.664-0.694,2.697-0.694h0.214v2.723h-0.321c-1.264,0-2.268,0.384-3.015,1.148c-0.695,0.747-1.042,1.913-1.042,3.497
v6.219H83.75z"/>
<path fill="#58595B" d="M102.111,372.639v-6.727h3.042v13.372h-2.908v-1.761c-0.374,0.658-0.873,1.156-1.494,1.494
c-0.731,0.392-1.488,0.588-2.271,0.588c-1.566,0-2.825-0.534-3.777-1.602c-0.952-1.068-1.428-2.51-1.428-4.324v-7.768h3.016v7.02
c0,1.406,0.235,2.452,0.709,3.137c0.471,0.685,1.188,1.027,2.149,1.027c0.479,0,0.959-0.164,1.44-0.493
c0.481-0.33,0.845-0.771,1.095-1.322C101.968,374.622,102.111,373.741,102.111,372.639"/>
<path fill="#58595B" d="M107.737,372.611c0-1.922,0.726-3.572,2.175-4.951c1.452-1.38,3.289-2.069,5.514-2.069
c1.742,0,3.379,0.561,4.912,1.683l-0.988,2.375c-1.335-1.032-2.644-1.548-3.924-1.548c-1.371,0-2.482,0.437-3.336,1.308
c-0.854,0.872-1.283,1.939-1.283,3.203s0.428,2.327,1.283,3.19s1.966,1.294,3.336,1.294c1.297,0,2.625-0.507,3.977-1.521
l0.987,2.376c-1.478,1.104-3.132,1.655-4.964,1.655c-2.225,0-4.063-0.686-5.514-2.056
C108.463,376.18,107.737,374.533,107.737,372.611"/>
<path fill="#58595B" d="M127.007,361.614v4.297h2.908v2.455h-2.908v6.808c0,0.641,0.155,1.081,0.466,1.321
c0.312,0.24,0.752,0.36,1.321,0.36h1.121v2.429h-1.842c-1.442,0-2.492-0.32-3.148-0.96c-0.659-0.642-0.988-1.593-0.988-2.856
v-7.102h-2.296v-2.455h2.296v-4.297H127.007z"/>
<path fill="#58595B" d="M141.281,372.639v-6.727h3.044v13.372h-2.911v-1.761c-0.374,0.658-0.871,1.156-1.495,1.494
c-0.73,0.392-1.485,0.588-2.268,0.588c-1.566,0-2.827-0.534-3.779-1.602c-0.952-1.068-1.428-2.51-1.428-4.324v-7.768h3.018v7.02
c0,1.406,0.236,2.452,0.707,3.137s1.188,1.027,2.149,1.027c0.48,0,0.961-0.164,1.442-0.493c0.481-0.33,0.845-0.771,1.095-1.322
C141.138,374.622,141.281,373.741,141.281,372.639"/>
<path fill="#58595B" d="M147.842,379.284v-13.373h2.858v2.002c0.443-0.658,0.988-1.165,1.628-1.521
c0.764-0.462,1.664-0.694,2.696-0.694h0.212v2.723h-0.319c-1.264,0-2.271,0.384-3.018,1.148c-0.692,0.747-1.04,1.913-1.04,3.497
v6.219H147.842z"/>
<path fill="#58595B" d="M159.344,373.946c0.176,0.82,0.56,1.486,1.147,2.002c0.854,0.783,1.985,1.174,3.389,1.174
c1.478,0,2.858-0.543,4.139-1.628l0.907,2.242c-1.44,1.246-3.148,1.869-5.124,1.869c-2.261,0-4.098-0.642-5.512-1.923
c-1.416-1.28-2.123-2.963-2.123-5.044c0-2.047,0.626-3.733,1.883-5.059c1.254-1.325,2.896-1.989,4.924-1.989
c1.992,0,3.627,0.659,4.898,1.975c1.273,1.317,1.909,2.946,1.909,4.887c0,0.532-0.043,1.031-0.133,1.494H159.344z M159.29,371.544
h7.42c-0.036-0.872-0.4-1.668-1.095-2.39c-0.692-0.721-1.573-1.08-2.642-1.08c-1.104,0-2.011,0.392-2.723,1.174
C159.734,369.835,159.414,370.601,159.29,371.544"/>
</g>
<path fill="#58595B" d="M188.101,370.805h3.15c0-0.872-0.338-1.526-1.014-1.962c-0.679-0.437-1.656-0.654-2.937-0.654h-0.081
c-1.211,0-2.492,0.285-3.844,0.855l-0.773-2.378c1.404-0.604,2.954-0.916,4.644-0.934h0.055c2.241,0,3.962,0.432,5.164,1.294
c1.202,0.864,1.802,2.238,1.802,4.125v8.274h-2.882v-1.467c-0.571,0.568-1.269,1.009-2.097,1.32
c-0.826,0.312-1.669,0.468-2.523,0.468c-1.601,0-2.896-0.424-3.883-1.269c-0.988-0.845-1.48-1.881-1.48-3.109
c0-1.37,0.614-2.5,1.842-3.39C184.38,371.196,186.001,370.805,188.101,370.805 M187.272,377.345c0.782,0,1.559-0.191,2.322-0.575
c0.767-0.382,1.318-0.82,1.656-1.32v-2.27h-2.696c-1.53,0-2.599,0.196-3.203,0.588c-0.588,0.445-0.881,0.979-0.881,1.602
c0,0.569,0.248,1.042,0.748,1.415C185.716,377.158,186.401,377.345,187.272,377.345"/>
<path fill="#58595B" d="M200.802,372.699v6.728h-3.018v-13.374h2.91v1.788c0.357-0.622,0.871-1.129,1.55-1.521
c0.676-0.392,1.403-0.588,2.187-0.588c1.585,0,2.854,0.539,3.806,1.614c0.952,1.078,1.428,2.515,1.428,4.313v7.768h-3.044v-6.994
c0-1.423-0.23-2.478-0.694-3.163c-0.462-0.686-1.174-1.027-2.135-1.027c-0.498,0-0.983,0.164-1.454,0.493
c-0.472,0.33-0.833,0.778-1.081,1.35C200.951,370.742,200.802,371.614,200.802,372.699"/>
<path fill="#58595B" d="M218.814,365.732c1.585,0,2.946,0.642,4.084,1.922v-6.833h3.045v18.604h-2.938v-1.68
c-1.121,1.334-2.519,2.001-4.191,2.001c-1.958,0-3.541-0.694-4.75-2.082c-1.211-1.389-1.815-3.025-1.815-4.912
c0-1.886,0.604-3.527,1.815-4.925C215.273,366.431,216.856,365.732,218.814,365.732 M222.872,373.607
c0.053-0.587,0.053-1.157,0-1.709c-0.106-1.014-0.48-1.858-1.12-2.536c-0.712-0.747-1.593-1.12-2.645-1.12
c-1.173,0-2.099,0.432-2.775,1.294c-0.676,0.864-1.014,1.936-1.014,3.217c0,1.299,0.338,2.371,1.014,3.216
c0.677,0.847,1.603,1.269,2.775,1.269c1.052,0,1.933-0.373,2.645-1.12C222.392,375.44,222.766,374.604,222.872,373.607"/>
<polygon fill="#58595B" points="244.352,363.437 244.352,379.426 241.229,379.426 241.229,363.437 235.543,363.437 235.543,360.821
250.037,360.821 250.037,363.437 "/>
<path fill="#58595B" d="M250.646,379.426v-13.373h2.856v2.002c0.445-0.658,0.987-1.165,1.628-1.521
c0.766-0.462,1.663-0.694,2.696-0.694h0.214v2.723h-0.321c-1.264,0-2.268,0.384-3.015,1.148c-0.695,0.747-1.043,1.914-1.043,3.497
v6.219H250.646z"/>
<path fill="#58595B" d="M265.804,370.805h3.148c0-0.872-0.338-1.526-1.014-1.962c-0.677-0.437-1.654-0.654-2.938-0.654h-0.078
c-1.212,0-2.492,0.285-3.846,0.855l-0.773-2.378c1.406-0.604,2.953-0.916,4.647-0.934h0.05c2.242,0,3.965,0.432,5.167,1.294
c1.199,0.864,1.802,2.238,1.802,4.125v8.274h-2.885v-1.467c-0.568,0.568-1.266,1.009-2.094,1.32s-1.669,0.468-2.523,0.468
c-1.602,0-2.896-0.424-3.884-1.269c-0.987-0.845-1.482-1.881-1.482-3.109c0-1.37,0.614-2.5,1.842-3.39
C262.084,371.196,263.702,370.805,265.804,370.805 M264.976,377.345c0.782,0,1.556-0.191,2.322-0.575
c0.764-0.382,1.316-0.82,1.654-1.32v-2.27h-2.696c-1.53,0-2.597,0.196-3.204,0.588c-0.585,0.445-0.88,0.979-0.88,1.602
c0,0.569,0.25,1.042,0.747,1.415C263.419,377.158,264.104,377.345,264.976,377.345"/>
<path fill="#58595B" d="M278.505,372.699v6.728h-3.018v-13.374h2.91v1.788c0.357-0.622,0.871-1.129,1.55-1.521
c0.676-0.392,1.403-0.588,2.187-0.588c1.585,0,2.854,0.539,3.806,1.614c0.952,1.078,1.428,2.515,1.428,4.313v7.768h-3.044v-6.994
c0-1.423-0.23-2.478-0.694-3.163c-0.462-0.686-1.174-1.027-2.135-1.027c-0.498,0-0.983,0.164-1.454,0.493
c-0.472,0.33-0.833,0.778-1.081,1.35C278.654,370.742,278.505,371.614,278.505,372.699"/>
<path fill="#58595B" d="M289.656,376.943l1.895-1.947c0.536,0.729,1.121,1.298,1.764,1.707c0.621,0.374,1.292,0.561,2.004,0.561
c0.674,0,1.247-0.137,1.719-0.413c0.471-0.275,0.709-0.644,0.709-1.107c0-0.463-0.229-0.823-0.681-1.082
c-0.455-0.257-0.993-0.502-1.616-0.734c-0.73-0.23-1.478-0.488-2.242-0.773c-1.032-0.373-1.789-0.854-2.27-1.441
c-0.481-0.587-0.722-1.255-0.722-2.002c0-1.103,0.517-2.042,1.55-2.816c1.032-0.773,2.251-1.161,3.657-1.161
c1.495,0,2.713,0.356,3.655,1.068c0.481,0.374,0.864,0.837,1.15,1.388l-1.869,1.815c-0.249-0.427-0.545-0.774-0.883-1.041
c-0.585-0.517-1.325-0.774-2.215-0.774c-0.517,0-0.964,0.13-1.348,0.387c-0.383,0.258-0.573,0.565-0.573,0.921
c0,0.392,0.214,0.721,0.64,0.987c0.427,0.268,1.06,0.526,1.897,0.774c0.3,0.09,0.647,0.196,1.04,0.32
c1.299,0.428,2.282,0.979,2.948,1.655c0.669,0.677,1.002,1.486,1.002,2.429c0,1.104-0.533,2.06-1.602,2.87
c-1.068,0.81-2.43,1.215-4.084,1.215c-1.388,0-2.615-0.321-3.684-0.961C290.787,378.358,290.173,377.744,289.656,376.943"/>
<path fill="#58595B" d="M310.393,379.747c-1.638,0-3.008-0.631-4.107-1.896v6.753h-3.021v-18.552h2.911v1.708
c1.156-1.352,2.563-2.028,4.217-2.028c1.939,0,3.52,0.698,4.738,2.096s1.827,3.039,1.827,4.925c0,1.887-0.608,3.523-1.827,4.912
C313.912,379.053,312.332,379.747,310.393,379.747 M306.309,373.607c0.107,0.997,0.483,1.833,1.121,2.51
c0.711,0.747,1.602,1.12,2.67,1.12c1.156,0,2.078-0.422,2.763-1.269c0.686-0.845,1.028-1.917,1.028-3.216
c0-1.281-0.343-2.353-1.028-3.217c-0.685-0.862-1.606-1.294-2.763-1.294c-1.068,0-1.959,0.373-2.67,1.12
c-0.638,0.678-1.014,1.522-1.121,2.536C306.256,372.45,306.256,373.021,306.309,373.607"/>
<path fill="#58595B" d="M325.657,379.747c-1.959,0-3.627-0.672-5.005-2.016c-1.381-1.344-2.07-3.003-2.07-4.979
s0.689-3.639,2.07-4.992c1.378-1.352,3.046-2.028,5.005-2.028c1.975,0,3.647,0.677,5.017,2.028c1.37,1.354,2.056,3.017,2.056,4.992
s-0.686,3.635-2.056,4.979C329.305,379.075,327.632,379.747,325.657,379.747 M325.657,377.237c1.102,0,2.049-0.422,2.841-1.269
c0.793-0.845,1.188-1.917,1.188-3.216c0-1.281-0.395-2.353-1.188-3.217c-0.792-0.862-1.739-1.294-2.841-1.294
c-1.086,0-2.025,0.432-2.818,1.294c-0.79,0.864-1.188,1.936-1.188,3.217c0,1.299,0.397,2.371,1.188,3.216
C323.632,376.815,324.571,377.237,325.657,377.237"/>
<path fill="#58595B" d="M335.341,379.426v-13.373h2.858v2.002c0.442-0.658,0.987-1.165,1.627-1.521
c0.765-0.462,1.664-0.694,2.697-0.694h0.211v2.723h-0.318c-1.264,0-2.271,0.384-3.018,1.148c-0.692,0.747-1.04,1.914-1.04,3.497
v6.219H335.341z"/>
<path fill="#58595B" d="M349.698,361.756v4.297h2.908v2.456h-2.908v6.807c0,0.641,0.154,1.081,0.467,1.321
c0.312,0.24,0.752,0.36,1.32,0.36h1.121v2.429h-1.842c-1.442,0-2.492-0.32-3.148-0.96c-0.659-0.642-0.988-1.593-0.988-2.856v-7.101
h-2.296v-2.456h2.296v-4.297H349.698z"/>
</svg>

After

Width:  |  Height:  |  Size: 21 KiB

BIN
src/assets/images/mi_logo_wh.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

218
src/assets/images/mi_logo_wh.svg

@ -0,0 +1,218 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="360px" height="396px" viewBox="0 0 360 396" enable-background="new 0 0 360 396" xml:space="preserve">
<g>
<path fill="#FFFFFF" d="M229.294,102.004c-16.579-11.262-37.798-6.669-48.931,10.271c-9.31,14.146-23.354,15.904-28.799,15.904
c-17.722,0-29.855-12.468-33.449-25.372h-0.008c-0.034-0.127-0.063-0.233-0.097-0.359c-0.033-0.143-0.079-0.288-0.114-0.44
c-1.416-5.381-1.766-7.955-1.766-13.676c0-30.857,31.662-65.209,77.255-65.209c46.693,0,73.412,35.546,80.295,55.3
c-0.124-0.346-0.23-0.692-0.353-1.051c-13.246-38.637-49.89-66.418-93.022-66.418c-54.294,0-98.319,44.016-98.319,98.317
c0,48.534,35.013,90.083,83.57,90.083c38.726,0,64.755-21.716,76.695-51.639C248.809,131.349,244.163,112.111,229.294,102.004"/>
<path fill="#FFFFFF" d="M274.292,80.338c-5.742-19.27-32.661-57.214-80.906-57.214c-45.593,0-77.255,34.351-77.255,65.208
c0,5.722,0.35,8.296,1.766,13.677c-0.596-2.351-0.905-4.713-0.905-7.013c0-32.133,32.173-54.402,65.252-54.402
c44.773,0,81.063,36.298,81.063,81.061c0,35.099-20.19,65.472-49.542,80.068l0.01,0.023c37.831-13.699,64.842-49.927,64.842-92.475
C278.616,99.201,277.265,90.323,274.292,80.338"/>
<path fill="#FFFFFF" d="M84.246,287.663v19.702h-7.033v-13.559H40.029v-6.144h18.937v-8.3H36.48v-6.144h51.947v6.144H65.935v8.3
H84.246z M84.246,251.87v16.851h-7.033V258.08H40.659v-6.21H84.246z"/>
<polygon fill="#FFFFFF" points="143.476,286.65 125.103,286.65 125.103,296.911 147.594,296.911 147.594,303.058 95.647,303.058
95.647,296.911 118.074,296.911 118.074,286.65 99.831,286.65 99.831,253.581 143.349,253.581 143.349,259.726 106.73,259.726
106.73,267.074 143.349,267.074 143.349,273.093 106.73,273.093 106.73,280.505 143.476,280.505 "/>
<path fill="#FFFFFF" d="M167.165,296.911v-17.548h6.654v17.548h9.438v-17.548h6.713v17.548h16.788v6.146h-51.943v-6.146H167.165z
M195.547,286.966v-27.115h-36.555v-6.269h43.59v33.384H195.547z"/>
<path fill="#FFFFFF" d="M265.279,283.039h-51.948v-5.766h22.493v-3.673h-18.309v-22.237h43.519v5.764h-36.677v2.788h36.677v5.26
h-36.677v2.85h36.805v5.576h-18.437v3.673h22.554V283.039z M253.183,296.911c0,1.774-0.373,3.442-1.111,5.005
c-0.74,1.562-1.723,2.914-2.948,4.056c-1.267,1.182-2.726,2.121-4.367,2.82c-1.649,0.693-3.42,1.043-5.321,1.043
s-3.687-0.35-5.35-1.043c-1.671-0.699-3.142-1.639-4.408-2.82c-1.223-1.142-2.206-2.494-2.941-4.056
c-0.74-1.563-1.114-3.23-1.114-5.005s0.374-3.432,1.114-4.974c0.735-1.542,1.719-2.881,2.941-4.022
c1.267-1.182,2.737-2.121,4.408-2.818c1.663-0.695,3.448-1.044,5.35-1.044s3.672,0.349,5.321,1.044
c1.642,0.697,3.101,1.637,4.367,2.818c1.226,1.142,2.208,2.48,2.948,4.022C252.81,293.479,253.183,295.137,253.183,296.911
M246.397,296.849c0-1.902-0.673-3.538-2.022-4.911c-1.35-1.371-2.999-2.059-4.94-2.059c-1.944,0-3.604,0.688-4.97,2.059
c-1.378,1.373-2.065,3.009-2.065,4.911c0,1.901,0.688,3.526,2.065,4.88c1.366,1.348,3.025,2.026,4.97,2.026
c1.941,0,3.591-0.679,4.94-2.026C245.725,300.375,246.397,298.75,246.397,296.849"/>
<path fill="#FFFFFF" d="M272.182,286.421h51.945v6.208h-22.49V307.2h-7.032v-14.571h-22.423V286.421z M283.265,258.803h29.71
v-7.162h6.973v27.178H276.36v-27.178h6.904V258.803z M312.975,264.881h-29.71v7.795h29.71V264.881z"/>
</g>
<polygon fill="#FFFFFF" points="94.755,328.068 94.755,346.673 91.766,346.673 91.766,331.698 86.909,346.673 84.024,346.673
79.167,331.698 79.167,346.673 76.178,346.673 76.178,328.068 80.769,328.068 85.466,342.563 90.164,328.068 "/>
<path fill="#FFFFFF" d="M101.904,329.536c0,0.516-0.19,0.966-0.573,1.348c-0.383,0.383-0.84,0.575-1.374,0.575
c-0.535,0-0.992-0.192-1.375-0.575c-0.383-0.382-0.573-0.832-0.573-1.348c0-0.533,0.19-0.991,0.573-1.374
c0.383-0.383,0.84-0.574,1.375-0.574c0.533,0,0.99,0.191,1.374,0.574C101.713,328.545,101.904,329.003,101.904,329.536
M98.463,333.3h3.041v13.373h-3.041V333.3z"/>
<path fill="#FFFFFF" d="M108.225,339.946v6.728h-3.016V333.3h2.911v1.788c0.354-0.622,0.871-1.129,1.547-1.521
s1.407-0.588,2.189-0.588c1.583,0,2.851,0.539,3.803,1.614c0.952,1.078,1.428,2.515,1.428,4.313v7.768h-3.042v-6.994
c0-1.423-0.233-2.478-0.695-3.163c-0.464-0.685-1.176-1.027-2.135-1.027c-0.5,0-0.985,0.164-1.457,0.493
c-0.471,0.33-0.831,0.778-1.08,1.35C108.377,337.989,108.225,338.861,108.225,339.946"/>
<path fill="#FFFFFF" d="M124.129,329.536c0,0.516-0.19,0.966-0.573,1.348c-0.383,0.383-0.84,0.575-1.374,0.575
c-0.535,0-0.992-0.192-1.375-0.575c-0.383-0.382-0.573-0.832-0.573-1.348c0-0.533,0.19-0.991,0.573-1.374s0.84-0.574,1.375-0.574
c0.533,0,0.99,0.191,1.374,0.574C123.939,328.545,124.129,329.003,124.129,329.536 M120.688,333.3h3.041v13.373h-3.041V333.3z"/>
<path fill="#FFFFFF" d="M126.207,344.19l1.895-1.947c0.535,0.729,1.121,1.298,1.764,1.707c0.621,0.374,1.29,0.561,2.001,0.561
c0.676,0,1.25-0.137,1.721-0.413c0.471-0.275,0.709-0.645,0.709-1.107s-0.229-0.823-0.681-1.082
c-0.455-0.257-0.993-0.502-1.616-0.733c-0.73-0.231-1.478-0.489-2.242-0.773c-1.033-0.374-1.79-0.854-2.271-1.442
c-0.48-0.587-0.721-1.255-0.721-2.002c0-1.103,0.516-2.042,1.549-2.816c1.033-0.773,2.251-1.161,3.658-1.161
c1.495,0,2.713,0.356,3.655,1.068c0.481,0.374,0.864,0.837,1.149,1.388l-1.868,1.815c-0.25-0.427-0.545-0.774-0.883-1.041
c-0.585-0.517-1.326-0.774-2.216-0.774c-0.516,0-0.964,0.13-1.347,0.387c-0.383,0.258-0.574,0.565-0.574,0.921
c0,0.392,0.214,0.721,0.64,0.987c0.426,0.268,1.059,0.526,1.895,0.774c0.302,0.09,0.649,0.197,1.042,0.32
c1.299,0.428,2.282,0.979,2.949,1.655c0.668,0.678,1.001,1.486,1.001,2.429c0,1.104-0.533,2.06-1.602,2.87
c-1.068,0.81-2.43,1.215-4.083,1.215c-1.388,0-2.616-0.321-3.684-0.961C127.337,345.605,126.724,344.991,126.207,344.19"/>
<path fill="#FFFFFF" d="M143.713,329.003v4.297h2.911v2.456h-2.911v6.808c0,0.64,0.155,1.08,0.466,1.32
c0.312,0.24,0.752,0.36,1.323,0.36h1.121v2.429h-1.842c-1.442,0-2.492-0.32-3.151-0.96c-0.659-0.642-0.987-1.592-0.987-2.855v-7.102
h-2.297V333.3h2.297v-4.297H143.713z"/>
<path fill="#FFFFFF" d="M149.154,346.673V333.3h2.856v2.002c0.445-0.658,0.987-1.165,1.627-1.521
c0.767-0.462,1.664-0.693,2.697-0.693h0.214v2.722h-0.321c-1.264,0-2.268,0.384-3.015,1.148c-0.695,0.747-1.042,1.914-1.042,3.497
v6.219H149.154z"/>
<polygon fill="#FFFFFF" points="162.95,346.166 157.69,333.3 160.841,333.3 164.471,342.43 168.076,333.3 171.198,333.3
163.752,351.852 160.653,351.852 "/>
<path fill="#FFFFFF" d="M186.003,346.994c-1.958,0-3.627-0.672-5.005-2.016c-1.38-1.344-2.07-3.003-2.07-4.979
s0.69-3.639,2.07-4.992c1.378-1.352,3.046-2.028,5.005-2.028c1.975,0,3.649,0.677,5.017,2.028c1.37,1.354,2.056,3.017,2.056,4.992
s-0.686,3.635-2.056,4.979C189.652,346.322,187.979,346.994,186.003,346.994 M186.003,344.484c1.102,0,2.049-0.422,2.841-1.269
c0.793-0.845,1.188-1.916,1.188-3.216c0-1.281-0.395-2.353-1.188-3.217c-0.792-0.862-1.739-1.294-2.841-1.294
c-1.085,0-2.025,0.432-2.818,1.294c-0.79,0.864-1.188,1.936-1.188,3.217c0,1.3,0.397,2.371,1.188,3.216
C183.979,344.063,184.918,344.484,186.003,344.484"/>
<path fill="#FFFFFF" d="M196.355,331.886c0-1.246,0.351-2.194,1.055-2.844c0.702-0.648,1.775-0.974,3.215-0.974h1.469v2.429h-0.881
c-0.568,0-1.009,0.12-1.32,0.36s-0.467,0.681-0.467,1.321v1.121h2.668v2.456h-2.668v10.917h-3.07v-10.917h-2.296V333.3h2.296
V331.886z"/>
<polygon fill="#FFFFFF" points="223.731,346.673 212.653,346.673 212.653,328.068 215.778,328.068 215.778,344.059 223.731,344.059
"/>
<path fill="#FFFFFF" d="M231.735,338.052h3.151c0-0.872-0.338-1.526-1.014-1.962c-0.679-0.437-1.656-0.654-2.938-0.654h-0.08
c-1.212,0-2.492,0.285-3.844,0.855l-0.773-2.378c1.404-0.604,2.953-0.916,4.643-0.934h0.055c2.242,0,3.963,0.432,5.165,1.295
c1.201,0.863,1.801,2.238,1.801,4.124v8.274h-2.882v-1.467c-0.571,0.568-1.269,1.009-2.097,1.32
c-0.825,0.313-1.668,0.468-2.522,0.468c-1.602,0-2.896-0.424-3.884-1.269c-0.988-0.845-1.48-1.881-1.48-3.109
c0-1.37,0.613-2.5,1.842-3.39C228.016,338.443,229.637,338.052,231.735,338.052 M230.907,344.592c0.783,0,1.559-0.191,2.323-0.574
c0.766-0.383,1.318-0.821,1.656-1.321v-2.27h-2.696c-1.53,0-2.599,0.196-3.203,0.588c-0.588,0.445-0.881,0.979-0.881,1.602
c0,0.569,0.247,1.042,0.747,1.415C229.351,344.405,230.036,344.592,230.907,344.592"/>
<path fill="#FFFFFF" d="M244.437,339.946v6.728h-3.018V333.3h2.911v1.788c0.356-0.622,0.871-1.129,1.549-1.521
c0.676-0.392,1.404-0.588,2.188-0.588c1.585,0,2.854,0.539,3.806,1.614c0.951,1.078,1.428,2.515,1.428,4.313v7.768h-3.044v-6.994
c0-1.423-0.231-2.478-0.695-3.163c-0.462-0.685-1.173-1.027-2.135-1.027c-0.497,0-0.982,0.164-1.454,0.493
c-0.471,0.33-0.833,0.778-1.08,1.35C244.587,337.989,244.437,338.861,244.437,339.946"/>
<path fill="#FFFFFF" d="M262.45,332.979c1.585,0,2.946,0.642,4.084,1.922v-6.833h3.044v18.604h-2.938v-1.68
c-1.12,1.334-2.518,2.001-4.19,2.001c-1.959,0-3.541-0.694-4.753-2.082c-1.209-1.389-1.813-3.025-1.813-4.912
c0-1.886,0.604-3.527,1.813-4.925C258.909,333.678,260.491,332.979,262.45,332.979 M266.508,340.854
c0.053-0.587,0.053-1.157,0-1.709c-0.107-1.014-0.48-1.858-1.121-2.536c-0.712-0.747-1.592-1.12-2.644-1.12
c-1.174,0-2.1,0.432-2.775,1.294c-0.676,0.864-1.014,1.936-1.014,3.217c0,1.3,0.338,2.371,1.014,3.216
c0.676,0.847,1.602,1.268,2.775,1.268c1.052,0,1.932-0.372,2.644-1.119C266.027,342.688,266.4,341.852,266.508,340.854"/>
<path fill="#FFFFFF" d="M275.044,347.849h-0.133c-0.533,0-0.997-0.188-1.388-0.562c-0.393-0.374-0.585-0.827-0.585-1.361
c0-0.551,0.192-1.014,0.585-1.388c0.391-0.373,0.854-0.561,1.388-0.561c0.552,0,1.014,0.178,1.388,0.533
c0.447,0.428,0.668,1.023,0.668,1.789c0,1.299-0.321,2.376-0.961,3.23c-0.624,0.801-1.335,1.361-2.137,1.682l-0.8-0.881
c0.728-0.463,1.271-0.997,1.628-1.602C274.856,348.462,274.973,348.169,275.044,347.849"/>
<g>
<rect x="6.214" y="360.68" fill="#FFFFFF" width="3.123" height="18.604"/>
<path fill="#FFFFFF" d="M16.085,372.558v6.728h-3.018v-13.374h2.911v1.788c0.357-0.622,0.871-1.129,1.549-1.521
c0.676-0.392,1.404-0.588,2.187-0.588c1.585,0,2.854,0.539,3.805,1.614c0.952,1.078,1.428,2.515,1.428,4.313v7.768h-3.044v-6.994
c0-1.423-0.231-2.478-0.695-3.163c-0.462-0.686-1.173-1.027-2.135-1.027c-0.498,0-0.983,0.164-1.454,0.493
c-0.471,0.33-0.833,0.778-1.081,1.35C16.235,370.601,16.085,371.473,16.085,372.558"/>
<path fill="#FFFFFF" d="M28.973,364.497c0-1.246,0.352-2.194,1.054-2.844c0.702-0.648,1.775-0.974,3.217-0.974h1.469v2.429h-0.881
c-0.571,0-1.011,0.12-1.323,0.36c-0.312,0.24-0.466,0.681-0.466,1.321v1.121h2.67v2.455h-2.67v10.918h-3.07v-10.918h-2.297v-2.455
h2.297V364.497z"/>
<path fill="#FFFFFF" d="M37.19,379.284v-13.373h2.856v2.002c0.445-0.658,0.988-1.165,1.628-1.521
c0.766-0.462,1.664-0.694,2.697-0.694h0.214v2.723h-0.321c-1.264,0-2.269,0.384-3.016,1.148c-0.695,0.747-1.042,1.913-1.042,3.497
v6.219H37.19z"/>
<path fill="#FFFFFF" d="M52.348,370.663h3.148c0-0.872-0.338-1.526-1.014-1.962c-0.676-0.437-1.654-0.654-2.937-0.654h-0.078
c-1.211,0-2.492,0.285-3.846,0.855l-0.773-2.378c1.407-0.604,2.954-0.916,4.646-0.934h0.052c2.242,0,3.965,0.432,5.167,1.294
c1.199,0.864,1.801,2.238,1.801,4.125v8.274H55.63v-1.467c-0.569,0.568-1.266,1.009-2.094,1.32
c-0.828,0.313-1.668,0.468-2.522,0.468c-1.602,0-2.896-0.424-3.884-1.269c-0.987-0.845-1.482-1.881-1.482-3.109
c0-1.37,0.614-2.5,1.842-3.39C48.628,371.055,50.247,370.663,52.348,370.663 M51.52,377.203c0.783,0,1.556-0.191,2.323-0.575
c0.764-0.382,1.316-0.82,1.654-1.32v-2.27H52.8c-1.53,0-2.596,0.196-3.203,0.588c-0.585,0.445-0.881,0.979-0.881,1.602
c0,0.569,0.25,1.041,0.748,1.415C49.963,377.017,50.649,377.203,51.52,377.203"/>
<path fill="#FFFFFF" d="M60.804,376.802l1.895-1.947c0.535,0.729,1.121,1.298,1.763,1.707c0.621,0.374,1.292,0.561,2.004,0.561
c0.674,0,1.247-0.137,1.718-0.413c0.471-0.275,0.709-0.645,0.709-1.107s-0.229-0.823-0.681-1.082
c-0.455-0.257-0.993-0.502-1.616-0.733c-0.73-0.231-1.478-0.489-2.242-0.774c-1.033-0.373-1.79-0.854-2.271-1.441
c-0.48-0.587-0.721-1.255-0.721-2.002c0-1.103,0.517-2.042,1.549-2.816c1.033-0.773,2.251-1.161,3.658-1.161
c1.495,0,2.713,0.356,3.655,1.068c0.481,0.374,0.864,0.837,1.149,1.388l-1.868,1.815c-0.25-0.427-0.545-0.774-0.883-1.041
c-0.585-0.517-1.326-0.774-2.216-0.774c-0.516,0-0.964,0.13-1.347,0.387c-0.383,0.258-0.574,0.565-0.574,0.921
c0,0.392,0.214,0.721,0.64,0.987c0.426,0.268,1.059,0.526,1.897,0.774c0.3,0.09,0.647,0.196,1.04,0.32
c1.299,0.428,2.282,0.979,2.948,1.655c0.669,0.677,1.002,1.486,1.002,2.429c0,1.104-0.533,2.06-1.602,2.87
c-1.068,0.81-2.43,1.215-4.084,1.215c-1.387,0-2.615-0.321-3.684-0.961C61.934,378.217,61.32,377.603,60.804,376.802"/>
<path fill="#FFFFFF" d="M78.31,361.614v4.297h2.911v2.455H78.31v6.808c0,0.641,0.155,1.081,0.466,1.321
c0.312,0.24,0.752,0.36,1.323,0.36h1.121v2.429h-1.842c-1.442,0-2.492-0.32-3.151-0.96c-0.659-0.642-0.987-1.593-0.987-2.856
v-7.102h-2.297v-2.455h2.297v-4.297H78.31z"/>
<path fill="#FFFFFF" d="M83.75,379.284v-13.373h2.856v2.002c0.445-0.658,0.987-1.165,1.627-1.521
c0.767-0.462,1.664-0.694,2.697-0.694h0.214v2.723h-0.321c-1.264,0-2.268,0.384-3.015,1.148c-0.695,0.747-1.042,1.913-1.042,3.497
v6.219H83.75z"/>
<path fill="#FFFFFF" d="M102.111,372.639v-6.727h3.042v13.372h-2.908v-1.761c-0.374,0.658-0.873,1.156-1.494,1.494
c-0.731,0.392-1.488,0.588-2.271,0.588c-1.566,0-2.825-0.534-3.777-1.602c-0.952-1.068-1.428-2.51-1.428-4.324v-7.768h3.016v7.02
c0,1.406,0.235,2.452,0.709,3.137c0.471,0.685,1.188,1.027,2.149,1.027c0.479,0,0.959-0.164,1.44-0.493
c0.481-0.33,0.845-0.771,1.095-1.322C101.968,374.622,102.111,373.741,102.111,372.639"/>
<path fill="#FFFFFF" d="M107.737,372.611c0-1.922,0.726-3.572,2.175-4.951c1.452-1.38,3.289-2.069,5.514-2.069
c1.742,0,3.379,0.561,4.912,1.683l-0.988,2.375c-1.335-1.032-2.644-1.548-3.924-1.548c-1.371,0-2.482,0.437-3.336,1.308
c-0.854,0.872-1.283,1.939-1.283,3.203s0.428,2.327,1.283,3.19s1.966,1.294,3.336,1.294c1.297,0,2.625-0.507,3.977-1.521
l0.987,2.376c-1.478,1.104-3.132,1.655-4.964,1.655c-2.225,0-4.063-0.686-5.514-2.056
C108.463,376.18,107.737,374.533,107.737,372.611"/>
<path fill="#FFFFFF" d="M127.007,361.614v4.297h2.908v2.455h-2.908v6.808c0,0.641,0.155,1.081,0.466,1.321
c0.312,0.24,0.752,0.36,1.321,0.36h1.121v2.429h-1.842c-1.442,0-2.492-0.32-3.148-0.96c-0.659-0.642-0.988-1.593-0.988-2.856
v-7.102h-2.296v-2.455h2.296v-4.297H127.007z"/>
<path fill="#FFFFFF" d="M141.281,372.639v-6.727h3.044v13.372h-2.911v-1.761c-0.374,0.658-0.871,1.156-1.495,1.494
c-0.73,0.392-1.485,0.588-2.268,0.588c-1.566,0-2.827-0.534-3.779-1.602c-0.952-1.068-1.428-2.51-1.428-4.324v-7.768h3.018v7.02
c0,1.406,0.236,2.452,0.707,3.137s1.188,1.027,2.149,1.027c0.48,0,0.961-0.164,1.442-0.493c0.481-0.33,0.845-0.771,1.095-1.322
C141.138,374.622,141.281,373.741,141.281,372.639"/>
<path fill="#FFFFFF" d="M147.842,379.284v-13.373h2.858v2.002c0.443-0.658,0.988-1.165,1.628-1.521
c0.764-0.462,1.664-0.694,2.696-0.694h0.212v2.723h-0.319c-1.264,0-2.271,0.384-3.018,1.148c-0.692,0.747-1.04,1.913-1.04,3.497
v6.219H147.842z"/>
<path fill="#FFFFFF" d="M159.344,373.946c0.176,0.82,0.56,1.486,1.147,2.002c0.854,0.783,1.985,1.174,3.389,1.174
c1.478,0,2.858-0.543,4.139-1.628l0.907,2.242c-1.44,1.246-3.148,1.869-5.124,1.869c-2.261,0-4.098-0.642-5.512-1.923
c-1.416-1.28-2.123-2.963-2.123-5.044c0-2.047,0.626-3.733,1.883-5.059c1.254-1.325,2.896-1.989,4.924-1.989
c1.992,0,3.627,0.659,4.898,1.975c1.273,1.317,1.909,2.946,1.909,4.887c0,0.532-0.043,1.031-0.133,1.494H159.344z M159.29,371.544
h7.42c-0.036-0.872-0.4-1.668-1.095-2.39c-0.692-0.721-1.573-1.08-2.642-1.08c-1.104,0-2.011,0.392-2.723,1.174
C159.734,369.835,159.414,370.601,159.29,371.544"/>
</g>
<path fill="#FFFFFF" d="M188.101,370.805h3.15c0-0.872-0.338-1.526-1.014-1.962c-0.679-0.437-1.656-0.654-2.937-0.654h-0.081
c-1.211,0-2.492,0.285-3.844,0.855l-0.773-2.378c1.404-0.604,2.954-0.916,4.644-0.934h0.055c2.241,0,3.962,0.432,5.164,1.294
c1.202,0.864,1.802,2.238,1.802,4.125v8.274h-2.882v-1.467c-0.571,0.568-1.269,1.009-2.097,1.32
c-0.826,0.312-1.669,0.468-2.523,0.468c-1.601,0-2.896-0.424-3.883-1.269c-0.988-0.845-1.48-1.881-1.48-3.109
c0-1.37,0.614-2.5,1.842-3.39C184.38,371.196,186.001,370.805,188.101,370.805 M187.272,377.345c0.782,0,1.559-0.191,2.322-0.575
c0.767-0.382,1.318-0.82,1.656-1.32v-2.27h-2.696c-1.53,0-2.599,0.196-3.203,0.588c-0.588,0.445-0.881,0.979-0.881,1.602
c0,0.569,0.248,1.042,0.748,1.415C185.716,377.158,186.401,377.345,187.272,377.345"/>
<path fill="#FFFFFF" d="M200.802,372.699v6.728h-3.018v-13.374h2.91v1.788c0.357-0.622,0.871-1.129,1.55-1.521
c0.676-0.392,1.403-0.588,2.187-0.588c1.585,0,2.854,0.539,3.806,1.614c0.952,1.078,1.428,2.515,1.428,4.313v7.768h-3.044v-6.994
c0-1.423-0.23-2.478-0.694-3.163c-0.462-0.686-1.174-1.027-2.135-1.027c-0.498,0-0.983,0.164-1.454,0.493
c-0.472,0.33-0.833,0.778-1.081,1.35C200.951,370.742,200.802,371.614,200.802,372.699"/>
<path fill="#FFFFFF" d="M218.814,365.732c1.585,0,2.946,0.642,4.084,1.922v-6.833h3.045v18.604h-2.938v-1.68
c-1.121,1.334-2.519,2.001-4.191,2.001c-1.958,0-3.541-0.694-4.75-2.082c-1.211-1.389-1.815-3.025-1.815-4.912
c0-1.886,0.604-3.527,1.815-4.925C215.273,366.431,216.856,365.732,218.814,365.732 M222.872,373.607
c0.053-0.587,0.053-1.157,0-1.709c-0.106-1.014-0.48-1.858-1.12-2.536c-0.712-0.747-1.593-1.12-2.645-1.12
c-1.173,0-2.099,0.432-2.775,1.294c-0.676,0.864-1.014,1.936-1.014,3.217c0,1.299,0.338,2.371,1.014,3.216
c0.677,0.847,1.603,1.269,2.775,1.269c1.052,0,1.933-0.373,2.645-1.12C222.392,375.44,222.766,374.604,222.872,373.607"/>
<polygon fill="#FFFFFF" points="244.352,363.437 244.352,379.426 241.229,379.426 241.229,363.437 235.543,363.437 235.543,360.821
250.037,360.821 250.037,363.437 "/>
<path fill="#FFFFFF" d="M250.646,379.426v-13.373h2.856v2.002c0.445-0.658,0.987-1.165,1.628-1.521
c0.766-0.462,1.663-0.694,2.696-0.694h0.214v2.723h-0.321c-1.264,0-2.268,0.384-3.015,1.148c-0.695,0.747-1.043,1.914-1.043,3.497
v6.219H250.646z"/>
<path fill="#FFFFFF" d="M265.804,370.805h3.148c0-0.872-0.338-1.526-1.014-1.962c-0.677-0.437-1.654-0.654-2.938-0.654h-0.078
c-1.212,0-2.492,0.285-3.846,0.855l-0.773-2.378c1.406-0.604,2.953-0.916,4.647-0.934h0.05c2.242,0,3.965,0.432,5.167,1.294
c1.199,0.864,1.802,2.238,1.802,4.125v8.274h-2.885v-1.467c-0.568,0.568-1.266,1.009-2.094,1.32s-1.669,0.468-2.523,0.468
c-1.602,0-2.896-0.424-3.884-1.269c-0.987-0.845-1.482-1.881-1.482-3.109c0-1.37,0.614-2.5,1.842-3.39
C262.084,371.196,263.702,370.805,265.804,370.805 M264.976,377.345c0.782,0,1.556-0.191,2.322-0.575
c0.764-0.382,1.316-0.82,1.654-1.32v-2.27h-2.696c-1.53,0-2.597,0.196-3.204,0.588c-0.585,0.445-0.88,0.979-0.88,1.602
c0,0.569,0.25,1.042,0.747,1.415C263.419,377.158,264.104,377.345,264.976,377.345"/>
<path fill="#FFFFFF" d="M278.505,372.699v6.728h-3.018v-13.374h2.91v1.788c0.357-0.622,0.871-1.129,1.55-1.521
c0.676-0.392,1.403-0.588,2.187-0.588c1.585,0,2.854,0.539,3.806,1.614c0.952,1.078,1.428,2.515,1.428,4.313v7.768h-3.044v-6.994
c0-1.423-0.23-2.478-0.694-3.163c-0.462-0.686-1.174-1.027-2.135-1.027c-0.498,0-0.983,0.164-1.454,0.493
c-0.472,0.33-0.833,0.778-1.081,1.35C278.654,370.742,278.505,371.614,278.505,372.699"/>
<path fill="#FFFFFF" d="M289.656,376.943l1.895-1.947c0.536,0.729,1.121,1.298,1.764,1.707c0.621,0.374,1.292,0.561,2.004,0.561
c0.674,0,1.247-0.137,1.719-0.413c0.471-0.275,0.709-0.644,0.709-1.107c0-0.463-0.229-0.823-0.681-1.082
c-0.455-0.257-0.993-0.502-1.616-0.734c-0.73-0.23-1.478-0.488-2.242-0.773c-1.032-0.373-1.789-0.854-2.27-1.441
c-0.481-0.587-0.722-1.255-0.722-2.002c0-1.103,0.517-2.042,1.55-2.816c1.032-0.773,2.251-1.161,3.657-1.161
c1.495,0,2.713,0.356,3.655,1.068c0.481,0.374,0.864,0.837,1.15,1.388l-1.869,1.815c-0.249-0.427-0.545-0.774-0.883-1.041
c-0.585-0.517-1.325-0.774-2.215-0.774c-0.517,0-0.964,0.13-1.348,0.387c-0.383,0.258-0.573,0.565-0.573,0.921
c0,0.392,0.214,0.721,0.64,0.987c0.427,0.268,1.06,0.526,1.897,0.774c0.3,0.09,0.647,0.196,1.04,0.32
c1.299,0.428,2.282,0.979,2.948,1.655c0.669,0.677,1.002,1.486,1.002,2.429c0,1.104-0.533,2.06-1.602,2.87
c-1.068,0.81-2.43,1.215-4.084,1.215c-1.388,0-2.615-0.321-3.684-0.961C290.787,378.358,290.173,377.744,289.656,376.943"/>
<path fill="#FFFFFF" d="M310.393,379.747c-1.638,0-3.008-0.631-4.107-1.896v6.753h-3.021v-18.552h2.911v1.708
c1.156-1.352,2.563-2.028,4.217-2.028c1.939,0,3.52,0.698,4.738,2.096s1.827,3.039,1.827,4.925c0,1.887-0.608,3.523-1.827,4.912
C313.912,379.053,312.332,379.747,310.393,379.747 M306.309,373.607c0.107,0.997,0.483,1.833,1.121,2.51
c0.711,0.747,1.602,1.12,2.67,1.12c1.156,0,2.078-0.422,2.763-1.269c0.686-0.845,1.028-1.917,1.028-3.216
c0-1.281-0.343-2.353-1.028-3.217c-0.685-0.862-1.606-1.294-2.763-1.294c-1.068,0-1.959,0.373-2.67,1.12
c-0.638,0.678-1.014,1.522-1.121,2.536C306.256,372.45,306.256,373.021,306.309,373.607"/>
<path fill="#FFFFFF" d="M325.657,379.747c-1.959,0-3.627-0.672-5.005-2.016c-1.381-1.344-2.07-3.003-2.07-4.979
s0.689-3.639,2.07-4.992c1.378-1.352,3.046-2.028,5.005-2.028c1.975,0,3.647,0.677,5.017,2.028c1.37,1.354,2.056,3.017,2.056,4.992
s-0.686,3.635-2.056,4.979C329.305,379.075,327.632,379.747,325.657,379.747 M325.657,377.237c1.102,0,2.049-0.422,2.841-1.269
c0.793-0.845,1.188-1.917,1.188-3.216c0-1.281-0.395-2.353-1.188-3.217c-0.792-0.862-1.739-1.294-2.841-1.294
c-1.086,0-2.025,0.432-2.818,1.294c-0.79,0.864-1.188,1.936-1.188,3.217c0,1.299,0.397,2.371,1.188,3.216
C323.632,376.815,324.571,377.237,325.657,377.237"/>
<path fill="#FFFFFF" d="M335.341,379.426v-13.373h2.858v2.002c0.442-0.658,0.987-1.165,1.627-1.521
c0.765-0.462,1.664-0.694,2.697-0.694h0.211v2.723h-0.318c-1.264,0-2.271,0.384-3.018,1.148c-0.692,0.747-1.04,1.914-1.04,3.497
v6.219H335.341z"/>
<path fill="#FFFFFF" d="M349.698,361.756v4.297h2.908v2.456h-2.908v6.807c0,0.641,0.154,1.081,0.467,1.321
c0.312,0.24,0.752,0.36,1.32,0.36h1.121v2.429h-1.842c-1.442,0-2.492-0.32-3.148-0.96c-0.659-0.642-0.988-1.593-0.988-2.856v-7.101
h-2.296v-2.456h2.296v-4.297H349.698z"/>
</svg>

After

Width:  |  Height:  |  Size: 21 KiB

BIN
src/assets/images/ongjin_logo_wh.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
src/assets/images/tp_logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
src/assets/images/tplogo_wh.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
src/assets/images/transmission_tower_icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

16
src/components/account/login/AccountLogin.js

@ -14,7 +14,7 @@ import {
} from 'reactstrap';
import { Mail, Lock, Check, Facebook, Twitter, GitHub } from 'react-feather';
import loginImg from '../../../assets/images/login01.png';
import loginImg from '../../../assets/images/login_img.png';
import { Link } from 'react-router-dom';
import '../../../assets/css/custom.css';
@ -28,8 +28,9 @@ export const AccountLogin = ({ props }) => {
const { isLogin, message } = useSelector(state => state.authState);
const [loginForm, setLoginForm] = useState({
userId: 'palnet',
userPswd: 'palnet5909!'
userId: '',
userPswd: ''
// userPswd: 'palnet5909!'
});
//모달 관련 설정
@ -91,17 +92,20 @@ export const AccountLogin = ({ props }) => {
return (
<>
<div className='login'>
<div className='login-logo'>Drone Control System</div>
{/* <div className='login-logo'>Drone Control System</div> */}
<div className='login-logo'>PAV 모니터링 시스템</div>
<div className='login-img'>
<img src={loginImg} />
</div>
<div className='login-form'>
<div className='login-txt'>
<h2>Welcome to Drone Control System</h2>
{/* <h2>Welcome to Drone Control System</h2> */}
<h2>PAV 모니터링 시스템</h2>
<p>
control system is a web system that provides
<br />
convenient control and monitoring of drones!
{/* convenient control and monitoring of drones! */}
convenient control and monitoring of PAV!
</p>
</div>
<Form>

16
src/components/analysis/simulation/AnalysisSimulationMenu.js

@ -2,14 +2,16 @@ import { AiOutlinePoweroff } from 'react-icons/ai';
import { ReactComponent as DroneMenuIcon } from '../../../assets/images/drone_menu_icon.svg';
import { useDispatch, useSelector } from 'react-redux';
import { Sun, Map, Bell } from 'react-feather';
import logo from '../../../assets/images/pal_logo.png';
import itp_logo from '../../../assets/images/itp_logo_wh_icon.png';
import ongjin_logo from '../../../assets/images/ongjin_logo_wh.png';
import incheon_logo from '../../../assets/images/incheon_logo_wh.png';
export const AnalysisSimulationMenu = props => {
return (
<div className='left-menu'>
<h1 className='logo'>
<img src={logo} width='80' />
<span>PAL</span>
<h1 className='logo itp'>
<img src={itp_logo} width='80' />
<span>인천테크노파크</span>
</h1>
<ul className='left-menu-nav'>
<li>
@ -29,6 +31,12 @@ export const AnalysisSimulationMenu = props => {
</li> */}
</ul>
<ul className='left-menu-footer'>
<li>
<img src={incheon_logo} width='60' />
</li>
<li>
<img src={ongjin_logo} width='60' />
</li>
<li>
<AiOutlinePoweroff
size={25}

2
src/components/analysis/simulation/AnalysisSimulationReport.js

@ -21,7 +21,7 @@ export const AnalysisSimulationReport = props => {
</div>
<div className='layer-search layer-search-form'>
<div className='sm-txt'>
검색하실 날짜 정보 또는 드론 식별번호를 입력해 주세요.
검색하실 날짜 정보 또는 기체 식별번호를 입력해 주세요.
</div>
<div>
<div className='d-flex align-items-center calendar-flat'>

74
src/components/basis/flight/plan/FlightPlanAreaMap.js

@ -24,7 +24,7 @@ import {
} from '../../../../modules/basis/flight/actions/basisFlightAction';
import { flightPlanAPI } from '../../../../modules/basis/flight/apis/basisFlightApi';
import { WeatherContainer } from '../../../../containers/basis/flight/plan/WeatherContainer';
import gimpo from '../../../map/geojson/airportAirArea.json';
const FlightPlanAreaMap = props => {
const dispatch = useDispatch();
const naver = window.naver;
@ -49,8 +49,50 @@ const FlightPlanAreaMap = props => {
const [number, setNumber] = useState(0);
const [formModal, setFormModal] = useState(false);
const [coordCenter, setCoordCenter] = useState([]); // 격자 센터값
let gimPofeatures = gimpo.features;
useEffect(() => {
NaverMapInit();
const coords = [];
gimPofeatures.map(air => {
coords.push({
lat:
(Math.max(
air.geometry.coordinates[0][0][1],
air.geometry.coordinates[0][1][1],
air.geometry.coordinates[0][2][1],
air.geometry.coordinates[0][3][1]
) +
Math.min(
air.geometry.coordinates[0][0][1],
air.geometry.coordinates[0][1][1],
air.geometry.coordinates[0][2][1],
air.geometry.coordinates[0][3][1]
)) /
2,
lng:
(Math.max(
air.geometry.coordinates[0][0][0],
air.geometry.coordinates[0][1][0],
air.geometry.coordinates[0][2][0],
air.geometry.coordinates[0][3][0]
) +
Math.min(
air.geometry.coordinates[0][0][0],
air.geometry.coordinates[0][1][0],
air.geometry.coordinates[0][2][0],
air.geometry.coordinates[0][3][0]
)) /
2,
airspace: air.properties.airspace
});
});
setCoordCenter(coords);
return () => {
dispatch(AREA_DETAIL_INIT());
};
@ -64,6 +106,25 @@ const FlightPlanAreaMap = props => {
setIsMapLoad(true);
}, [airArea]);
useEffect(() => {
coordCenter.map((val, idx) => {
const position = new naver.maps.LatLng(
val.lat.toFixed(6),
val.lng.toFixed(6)
);
const marker = new naver.maps.Marker({
position: position,
map: map,
icon: {
content: `<div style="color:#000000;font-size:10px;">${val.airspace}</div>`,
size: new naver.maps.Size(0, 0),
origin: new naver.maps.Point(0, 0),
anchor: new naver.maps.Point(7, 5),
align: 'center'
}
});
});
}, [coordCenter]);
useEffect(() => {
ModeInit();
}, [mapControl.drawType]);
@ -118,8 +179,8 @@ const FlightPlanAreaMap = props => {
}
const mapOptions = {
// center: new naver.maps.LatLng(36.56793936069445, 127.85101412107547),
center: new naver.maps.LatLng(37.520357, 126.610166),
zoom: !areaCoordList ? 14 : bufferzoom.bufferzoom,
center: new naver.maps.LatLng(37.558522, 126.793722),
zoom: !areaCoordList ? 11 : bufferzoom.bufferzoom,
zoomControl: true,
mapTypeId: naver.maps.MapTypeId.NORMAL,
zoomControlOptions: {
@ -128,9 +189,9 @@ const FlightPlanAreaMap = props => {
}
};
const mapp = new naver.maps.Map('map', mapOptions);
naver.maps.Event.addListener(mapp, 'idle', function () {
// console.log(dragSize);
});
// naver.maps.Event.addListener(mapp, 'idle', function () {
// // console.log(dragSize);
// });
naver.maps.Event.addListener(mapp, 'zoom_changed', function () {
let radius = 17920;
for (let i = 6; i < 22; i++) {
@ -154,6 +215,7 @@ const FlightPlanAreaMap = props => {
const handleCoordinates = areaInfo => {
const initAreaList = initFlightBas.initDetail.areaList.concat();
const coordList = [];
// radius = 10;

5
src/components/dashboard/DashboardMenu.js

@ -1,12 +1,15 @@
import { Card, Col, Row } from 'reactstrap';
import { useSelector } from 'react-redux';
export const DashboardMenu = props => {
const { user } = useSelector(state => state.authState);
return (
<Row className='menu-page'>
<Col md={3}>
<Card className='menu-list01'>
<a href='#' onClick={() => window.open('/control', '_blank')}>
드론 관제 시스템
{/* {user?.cstmrSno === 27 ? 'UAM 관제 시스템' : '드론 관제 시스템'} */}
PAV 모니터링 시스템
</a>
</Card>
</Col>

3
src/components/map/MapControl.js

@ -1,9 +1,12 @@
import React from 'react';
import { GoogleCustomMap } from './google/GoogleMap';
import { NaverCustomMap } from './naver/NaverMap';
import MapBoxMap from './mapbox/MapBoxMap';
export const MapControl = props => {
return (
<>{props.mapType === 'google' ? <GoogleCustomMap /> : <NaverCustomMap />}</>
// <NaverCustomMap />
// <MapBoxMap />
);
};

1728
src/components/map/geojson/airportAirArea.json

File diff suppressed because it is too large Load Diff

1693
src/components/map/geojson/uamAirArea.json

File diff suppressed because it is too large Load Diff

372
src/components/map/mapbox/MapBoxMap.js

@ -0,0 +1,372 @@
// import { MAPBOX_TOKEN } from '../../../configs/constants';
// import { useEffect, useState, useRef } from 'react';
// import { DronMarker } from './dron/DronMarker';
// import { FeatureAirZone } from './feature/FeatureAirZone';
// import 'mapbox-gl/dist/mapbox-gl.css';
// import mapboxgl from 'mapbox-gl';
// import MapboxLanguage from '@mapbox/mapbox-gl-language';
// export default function MapBoxMap() {
// const naver = window.naver;
// const [mapObject, setMapObject] = useState(null);
// const [isMapLoaded, setMapLoaded] = useState(false);
// const mapContainer = useRef(null);
// const uamPosition = {
// type: 'FeatureCollection',
// features: [
// {
// type: 'Feature',
// properties: {
// name: 'V1',
// background: '#ffffff',
// border: '#15298A',
// spanColor: '#000000'
// },
// geometry: {
// type: 'Point',
// coordinates: [126.540668, 37.4797865]
// }
// },
// {
// type: 'Feature',
// properties: {
// name: 'V2',
// background: '#ffffff',
// border: '#15298A',
// spanColor: '#000000'
// },
// geometry: {
// type: 'Point',
// coordinates: [126.6107763, 37.521245]
// }
// },
// {
// type: 'Feature',
// properties: {
// name: 'V3',
// background: '#ffffff',
// border: '#15298A',
// spanColor: '#000000'
// },
// geometry: {
// type: 'Point',
// coordinates: [126.6243464, 37.5642352]
// }
// },
// {
// type: 'Feature',
// properties: {
// name: 'V4',
// background: '#ffffff',
// border: '#15298A',
// spanColor: '#000000'
// },
// geometry: {
// type: 'Point',
// coordinates: [126.6650669, 37.3658236]
// }
// },
// {
// type: 'Feature',
// properties: {
// name: 'V5',
// background: '#ffffff',
// border: '#15298A',
// spanColor: '#000000'
// },
// geometry: {
// type: 'Point',
// coordinates: [126.7074861, 37.4520753]
// }
// },
// {
// type: 'Feature',
// properties: {
// name: 'R1',
// background: '#429629',
// border: '#ffffff',
// spanColor: '#ffffff'
// },
// geometry: {
// type: 'Point',
// coordinates: [126.5801572, 37.492581]
// }
// },
// {
// type: 'Feature',
// properties: {
// name: 'R2',
// background: '#429629',
// border: '#ffffff',
// spanColor: '#ffffff'
// },
// geometry: {
// type: 'Point',
// coordinates: [126.6036588, 37.542031]
// }
// },
// {
// type: 'Feature',
// properties: {
// name: 'R3',
// background: '#429629',
// border: '#ffffff',
// spanColor: '#ffffff'
// },
// geometry: {
// type: 'Point',
// coordinates: [126.6005224, 37.5764269]
// }
// },
// {
// type: 'Feature',
// properties: {
// name: 'R4',
// background: '#429629',
// border: '#ffffff',
// spanColor: '#ffffff'
// },
// geometry: {
// type: 'Point',
// coordinates: [126.6600404, 37.5790407]
// }
// },
// {
// type: 'Feature',
// properties: {
// name: 'R5',
// background: '#429629',
// border: '#ffffff',
// spanColor: '#ffffff'
// },
// geometry: {
// type: 'Point',
// coordinates: [126.649562, 37.524016]
// }
// },
// {
// type: 'Feature',
// properties: {
// name: 'R6',
// background: '#429629',
// border: '#ffffff',
// spanColor: '#ffffff'
// },
// geometry: {
// type: 'Point',
// coordinates: [126.693722, 37.5506488]
// }
// },
// {
// type: 'Feature',
// properties: {
// name: 'R7',
// background: '#429629',
// border: '#ffffff',
// spanColor: '#ffffff'
// },
// geometry: {
// type: 'Point',
// coordinates: [126.6023981, 37.4712333]
// }
// },
// {
// type: 'Feature',
// properties: {
// name: 'R8',
// background: '#429629',
// border: '#ffffff',
// spanColor: '#ffffff'
// },
// geometry: {
// type: 'Point',
// coordinates: [126.6202759, 37.4046495]
// }
// },
// {
// type: 'Feature',
// properties: {
// name: 'R9',
// background: '#429629',
// border: '#ffffff',
// spanColor: '#ffffff'
// },
// geometry: {
// type: 'Point',
// coordinates: [126.6296542, 37.3450207]
// }
// }
// ]
// };
// useEffect(() => {
// mapBoxMapInit();
// }, []);
// useEffect(() => {
// if (mapObject) {
// uamPosition.features.map(uam => {
// const el = document.createElement('div');
// const elChild = document.createElement('span');
// elChild.innerText = uam.properties.name;
// elChild.style.color = uam.properties.spanColor;
// el.className = 'marker';
// el.style.background = uam.properties.background;
// el.style.borderRadius = '50%';
// el.style.border = `4px solid ${uam.properties.border}`;
// el.style.padding = '5px';
// el.style.width = '40px';
// el.style.height = '40px';
// el.style.textAlign = 'center';
// el.appendChild(elChild);
// new mapboxgl.Marker(el)
// .setLngLat(uam.geometry.coordinates)
// .addTo(mapObject);
// });
// }
// }, [mapObject]);
// const mapBoxMapInit = () => {
// mapboxgl.accessToken = MAPBOX_TOKEN;
// const map = new mapboxgl.Map({
// container: 'map', // container ID
// style: 'mapbox://styles/mapbox/streets-v12', // style URL
// center: [126.611401, 37.519695], // starting position [lng, lat]
// zoom: 11, // starting zoom
// antialias: true
// });
// const language = new MapboxLanguage();
// map.addControl(language);
// map.on('load', () => {
// const layers = map.getStyle().layers;
// const labelLayerId = layers.find(
// layer => layer.type === 'symbol' && layer.layout['text-field']
// ).id;
// // 지형 3d start
// map.addSource('mapbox-dem', {
// type: 'raster-dem',
// url: 'mapbox://mapbox.mapbox-terrain-dem-v1',
// tileSize: 512,
// maxZoom: 16
// });
// map.setTerrain({ source: 'mapbox-dem', exaggeration: 1.5 });
// map.addLayer({
// id: 'contour-labels',
// type: 'symbol',
// source: {
// type: 'vector',
// url: 'mapbox://mapbox.mapbox-terrain-v2'
// },
// 'source-layer': 'contour',
// layout: {
// visibility: 'visible',
// 'symbol-placement': 'line',
// 'text-field': ['concat', ['to-string', ['get', 'ele']], 'm']
// },
// paint: {
// 'icon-color': '#877b59',
// 'icon-halo-width': 1,
// 'text-color': '#877b59',
// 'text-halo-width': 1
// }
// });
// map.addLayer({
// id: 'sky',
// type: 'sky',
// paint: {
// 'sky-type': 'atmosphere',
// 'sky-atmosphere-sun': [0.0, 90.0],
// 'sky-atmosphere-sun-intensity': 15
// }
// });
// // 지형 3d end
// // 등고선 start
// map.addLayer({
// id: 'contours',
// type: 'line',
// source: {
// type: 'vector',
// url: 'mapbox://mapbox.mapbox-terrain-v2'
// },
// 'source-layer': 'contour',
// layout: {
// visibility: 'visible',
// 'line-join': 'round',
// 'line-cap': 'round'
// },
// paint: {
// 'line-color': '#877b59',
// 'line-width': 1
// }
// });
// // 등고선 end
// // 3d building
// map.addLayer(
// {
// id: 'add-3d-buildings',
// source: 'composite',
// 'source-layer': 'building',
// filter: ['==', 'extrude', 'true'],
// type: 'fill-extrusion',
// minzoom: 15,
// paint: {
// 'fill-extrusion-color': '#aaa',
// // Use an 'interpolate' expression to
// // add a smooth transition effect to
// // the buildings as the user zooms in.
// 'fill-extrusion-height': [
// 'interpolate',
// ['linear'],
// ['zoom'],
// 15,
// 0,
// 15.05,
// ['get', 'height']
// ],
// 'fill-extrusion-base': [
// 'interpolate',
// ['linear'],
// ['zoom'],
// 15,
// 0,
// 15.05,
// ['get', 'min_height']
// ],
// 'fill-extrusion-opacity': 0.6
// }
// },
// labelLayerId
// );
// // 3d building
// setMapObject(map);
// setMapLoaded(true);
// });
// };
// return (
// <>
// <div
// id='map'
// ref={mapContainer}
// style={{ width: '100%', height: '100vh' }}
// ></div>
// {isMapLoaded && mapObject ? (
// <>
// <DronMarker map={mapObject} mapboxgl={mapboxgl} />
// <FeatureAirZone map={mapObject} mapboxgl={mapboxgl} />
// </>
// ) : null}
// {/* */}
// </>
// );
// }

657
src/components/map/mapbox/dron/DronMarker.js

@ -0,0 +1,657 @@
// import $ from 'jquery';
// import { useEffect, useState } from 'react';
// import { useDispatch, useSelector, shallowEqual } from 'react-redux';
// import '../../../../assets/css/custom.css';
// import FlightIcon from '../../../../assets/images/airplan_org.svg';
// import FlightDetailIcon from '../../../../assets/images/airplan_pp.svg';
// import DronIcon from '../../../../assets/images/drone-marker-icon.png';
// import DronDetailIcon from '../../../../assets/images/drone-marker-icon-pulple.png';
// import DronUamIcon from '../../../../assets/images/uam_icon.png';
// import DronUamDetailIcon from '../../../../assets/images/uam_icon_purple.png';
// import {
// controlGpDtlAction,
// controlGpFlightPlanAction,
// controlGpCountAction
// } from '../../../../modules/control/gp';
// import {
// objectClickAction,
// objectUnClickAction
// } from '../../../../modules/control/map/actions/controlMapActions';
// import { JOIN_LIST } from '../../../../modules/basis/group/actions/basisGroupAction';
// export const DronMarker = props => {
// const dispatch = useDispatch();
// const { controlGpList, controlGroupAuthInfo } = useSelector(
// state => state.controlGpState
// );
// const { objectId, isClickObject } = useSelector(
// state => state.controlMapReducer,
// shallowEqual
// );
// // const { controlGroupAuthInfo } = useSelector(
// // state => state.controlGroupAuthState
// // );
// const { controlGpArcrftWarnList } = useSelector(
// state => state.controlGpLogState
// );
// const { user } = useSelector(state => state.authState);
// const { joinList } = useSelector(state => state.groupState);
// const [arrMarkers, setArrMarkers] = useState([]);
// const [arrInfos, setArrInfos] = useState([]);
// const [count, setCount] = useState({
// drone: [],
// flight: []
// });
// let mapboxgl = props.mapboxgl;
// let map = props.map;
// let CustomOverlay;
// let infoWindow;
// // const infowindowOpen = data => {
// // const content = `
// // <div class="dblock-box">
// // <div class="dblock-ti">
// // <span>${data?.id}</span>
// // </div>
// // <div class="dblock-txt>
// // <div class="dblock-txt-list">
// // <div>
// // <span style="width: 250px; display: inline-block;">${
// // data?.speed
// // }${data?.speedType} | ${data?.elev}${data?.elevType} | ${
// // data?.heading
// // }</span>
// // <span style="width: 250px; display: inline-block;">${(data?.coord._lat).toFixed(
// // 6
// // )} | ${(data?.coord._lng).toFixed(6)}</span>
// // </div>
// // </div>
// // </div>
// // </div>
// // `;
// // infoWindow = new naver.maps.InfoWindow({
// // class: 'tooltip-dblock',
// // content: content,
// // maxWidth: 160,
// // backgroundColor: '#283046', //박스안쪽영역 컬러
// // // borderColor: '#333', //테두리컬러
// // // borderWidth: 3, //테두리 굵기
// // // anchorSize: new naver.maps.Size(30, -10),
// // anchorSkew: false,
// // anchorColor: '#283046',
// // pixelOffset: new naver.maps.Point(20, -20)
// // });
// // infoWindow.open(props.map, data.coord);
// // };
// // useLayoutEffect(() => {
// // dispatch(controlGroupAuthAction.request());
// // }, [controlGpList]);
// useEffect(() => {
// if (count.drone.length > 0 || count.flight.length > 0) {
// dispatch(
// controlGpCountAction.request({
// count
// })
// );
// } else {
// const count = {
// drone: [],
// flight: []
// };
// dispatch(
// controlGpCountAction.request({
// count
// })
// );
// }
// }, [count]);
// useEffect(() => {
// dispatch(
// JOIN_LIST.request({
// cstmrSno: user?.cstmrSno
// })
// );
// }, []);
// useEffect(() => {
// if (arrMarkers.length != 0) {
// markerInfo(arrMarkers);
// }
// }, [arrMarkers]);
// useEffect(() => {
// markerInit();
// }, [controlGpList]);
// // useEffect(() => {
// // let imageUrl;
// // arrMarkers.map(clickMarker => {
// // if (objectId === clickMarker.controlId && isClickObject) {
// // // console.log(clickMarker.gps.objectId, '><><');
// // imageUrl =
// // // clickMarker.type === 'DRONE' ? DronUamDetailIcon : FlightDetailIcon;
// // clickMarker.type === 'DRONE'
// // ? clickMarker.gps.objectId.includes('UAM')
// // ? DronUamDetailIcon
// // : DronDetailIcon
// // : FlightDetailIcon;
// // clickMarker.setIcon({
// // content: `<img src="${imageUrl}" alt="" style="transform: rotate(${clickMarker.gps.heading}deg)">`,
// // origin: new naver.maps.Point(0, 0),
// // anchor: new naver.maps.Point(15, 15)
// // });
// // } else {
// // // imageUrl = clickMarker.type === 'DRONE' ? DronUamIcon : FlightIcon;
// // imageUrl =
// // clickMarker.type === 'DRONE'
// // ? clickMarker.gps.objectId.includes('UAM')
// // ? DronUamIcon
// // : DronIcon
// // : FlightIcon;
// // clickMarker.setIcon({
// // content: `<img src="${imageUrl}" alt="" style="transform: rotate(${clickMarker.gps.heading}deg)">`,
// // origin: new naver.maps.Point(0, 0),
// // anchor: new naver.maps.Point(15, 15)
// // });
// // }
// // });
// // }, [objectId, isClickObject]);
// // useEffect(() => {
// // arrMarkers.map(clickMarker => {
// // if (objectId === clickMarker.controlId) {
// // dispatch(controlGpDtlAction.request(objectId));
// // props.map.setCenter(clickMarker.getPosition());
// // props.map.setZoom(13, true);
// // }
// // });
// // }, [objectId]);
// //마커를 그린다.
// const addMarkers = (position, id, controlId, gps) => {
// const gpsCnt = {
// gps: gps,
// type: ''
// };
// const markerOption = {};
// if (id.substring(0, 2) === 'PA') {
// const pal = controlGroupAuthInfo?.find(
// prev => prev.idntfNum === gps.objectId
// );
// if (pal || !pal || id.includes('NAMWON')) {
// if (id.includes('UAM')) {
// markerOption.url = DronUamIcon;
// } else {
// markerOption.url = DronIcon;
// }
// markerOption.type = 'DRONE';
// gpsCnt.type = 'drone';
// } else {
// if (user?.authId === 'SUPER' || user?.authId === 'ADMIN') {
// markerOption.url = FlightIcon;
// markerOption.type = 'FLIGHT';
// gpsCnt.type = 'flight';
// } else {
// const terminal = joinList?.find(prev => prev.trmnlId === gps.trmnlId);
// if (
// terminal?.groupAuthCd === 'MASTER' ||
// terminal?.groupAuthCd === 'LEADER'
// ) {
// markerOption.url = FlightIcon;
// markerOption.type = 'FLIGHT';
// gpsCnt.type = 'flight';
// }
// }
// }
// } else {
// if (user?.authId === 'SUPER' || user?.authId === 'ADMIN') {
// markerOption.url = FlightIcon;
// markerOption.type = 'FLIGHT';
// gpsCnt.type = 'flight';
// } else {
// const terminal = joinList?.find(prev => prev.trmnlId === gps.trmnlId);
// if (
// terminal?.groupAuthCd === 'MASTER' ||
// terminal?.groupAuthCd === 'LEADER'
// ) {
// markerOption.url = FlightIcon;
// markerOption.type = 'FLIGHT';
// gpsCnt.type = 'flight';
// }
// }
// }
// if (gpsCnt.type === 'drone') {
// setCount(prev => ({
// ...prev,
// drone: [...prev.drone, gpsCnt]
// }));
// } else if (gpsCnt.type === 'flight') {
// setCount(prev => ({
// ...prev,
// flight: [...prev.flight, gpsCnt]
// }));
// }
// // if (id.substring(0, 2) === 'PA') {
// // const pal = controlGroupAuthInfo?.find(
// // prev => prev.idntfNum === gps.objectId
// // );
// // markerOption.url = pal ? DronIcon : FlightIcon;
// // markerOption.type = pal ? 'DRONE' : 'FLIGHT';
// // } else {
// // markerOption.url = FlightIcon;
// // markerOption.type = 'FLIGHT';
// // }
// // markerOption.origin = new naver.maps.Point(0, 0);
// // markerOption.anchor = new naver.maps.Point(15, 15);
// // const marker = new naver.maps.Marker({
// // position: position,
// // title: id,
// // id: id,
// // controlId: controlId,
// // type: markerOption.type,
// // icon: {
// // content: `<img id=${id} src="${markerOption.url}" alt="" style="transform: rotate(${gps.heading}deg);">`,
// // origin: markerOption.origin,
// // anchor: markerOption.anchor
// // },
// // gps: gps
// // });
// // marker.setMap(props.map);
// const el = document.createElement('img');
// el.id = id;
// el.src = markerOption.url;
// el.style.transform = `rotate(${gps.heading}deg)`;
// const marker = new props.mapboxgl.Marker({
// element: el,
// rotation: gps.heading
// })
// .setLngLat(position)
// .addTo(props.map);
// marker.id = id;
// marker.title = id;
// marker.controlId = controlId;
// marker.type = markerOption.type;
// marker.gps = gps;
// marker.position = position;
// marker.icon = {
// content: `<img id=${id} src="${markerOption.url}" alt="" style="transform: rotate(${gps.heading}deg);">`,
// origin: markerOption.origin,
// anchor: markerOption.anchor
// };
// dispatch(controlGpFlightPlanAction.request(marker.id)); //예상경로
// // dispatch(controlGpHisAction.request({ id: marker.controlId })); //진행경로;
// /** drone 상세보기 */
// marker.getElement().addEventListener('click', function (e) {
// handlerDronClick(marker.controlId, marker.id);
// });
// if (markerOption.url) {
// setArrMarkers(m => [...m, marker]);
// }
// };
// const handlerDronClick = (controlId, idntfNum) => {
// // get detail, history, flight-plan
// dispatch(objectClickAction(controlId));
// // dispatch(controlGpDtlAction.request(controlId));
// // dispatch(controlGpFlightPlanAction.request(idntfNum));
// };
// //마커를 삭제 한다.
// const removeMarkers = marker => {
// // marker.setMap(null);
// marker.remove();
// };
// const removeInfos = info => {
// // info.setMap(null);
// info.remove();
// };
// //마커에 위치를 이동한다.
// const moveMarkers = (marker, position, gps) => {
// const getIcon = marker.icon;
// marker.setLngLat(position);
// const warnList = controlGpArcrftWarnList?.filter(
// i => i.cntrlId === gps.controlId
// );
// if (warnList?.length > 0) {
// if (warnList[0].controlWarnCd) {
// // marker.setIcon({
// // content: `<img ${getIcon.content.substr(
// // getIcon.content.indexOf('src'),
// // getIcon.content.indexOf('alt') - 6
// // )} alt="" style="transform: rotate(${
// // gps.heading
// // }deg); filter: invert(16%) sepia(79%) saturate(4975%) hue-rotate(359deg) brightness(104%) contrast(129%)" />`,
// // anchor: getIcon.anchor
// // });
// } else {
// // console.log(marker);
// // marker.setIcon({
// // content: `<img ${getIcon.content.substr(
// // getIcon.content.indexOf('src'),
// // getIcon.content.indexOf('alt') - 6
// // )} alt="" style="transform: rotate(${gps.heading}deg); " />`,
// // anchor: getIcon.anchor
// // });
// marker.setRotation(gps.heading);
// }
// return;
// }
// marker.setRotation(gps.heading);
// // marker.setIcon({
// // content: `<img ${getIcon.content.substr(
// // getIcon.content.indexOf('src'),
// // getIcon.content.indexOf('alt') - 6
// // )} alt="" style="transform: rotate(${gps.heading}deg); " />`,
// // anchor: getIcon.anchor
// // });
// };
// const moveInfos = (info, position, item, idx) => {
// if (info) {
// info.setLngLat([position.lng, position.lat]);
// // info.setPosition(position, info);
// // // info._element.html(`<div class="dblock-ti"><span>${info?._id}</span>
// // // <span>${item?.speed}${item?.speedType} | ${item?.elev}${item?.elevType} | ${item?.heading}</span></div>`);
// // info._element.html(`
// // <div class="dblock-ti">
// // <span>${info?._id}</span>
// // </div>
// // <div class="dblock-txt">
// // <div class="dblock-txt-list">
// // <span>${item?.elev}M</span>
// // <span>${item?.speed}km</span>
// // ${
// // typeof item?.lat === 'number' && typeof item?.lng === 'number'
// // ? `
// // <span>
// // ${(item?.lat).toFixed(6)} ${(item?.lng).toFixed(6)}
// // </span>`
// // : ''
// // }
// // </div>
// // </div>
// // `);
// }
// };
// //데이터가 없는 마커를 모두 삭제 한다.
// const allRemoveMarkers = () => {
// let isUnClick = false;
// if (arrMarkers && controlGpList) {
// arrMarkers.map(marker => {
// const isExists = controlGpList.find(
// item => item.objectId === marker.id
// );
// if (!isExists) {
// removeMarkers(marker);
// const arrData = arrMarkers.filter(item => item.id != marker.id);
// const drone = count.drone.filter(d => d.gps.objectId != marker.id);
// const flight = count.flight.filter(d => d.gps.objectId != marker.id);
// setCount({
// drone: drone,
// flight: flight
// });
// removeArrMarkers(arrData);
// if (marker.controlId === objectId) {
// dispatch(objectUnClickAction());
// }
// }
// });
// arrInfos.map(info => {
// const isExists = controlGpList.find(item => item.objectId === info._id);
// if (!isExists) {
// removeInfos(info);
// const arrData = arrInfos.filter(item => item.id != info._id);
// removeArrInfos(arrData);
// }
// });
// }
// return isUnClick;
// };
// //마커를 셋팅 한다.
// const markerInit = () => {
// if (controlGpList) {
// allRemoveMarkers();
// controlGpList.map((item, idx) => {
// // let position = new naver.maps.LatLng(item.lat, item.lng);
// let position = new props.mapboxgl.LngLat(item.lng, item.lat);
// if (arrMarkers.length > 0) {
// const isExists = arrMarkers.find(ele => ele.id === item.objectId);
// const isInfos = arrInfos.find(info => info._id === item.objectId);
// if (isExists) {
// moveMarkers(isExists, position, item);
// moveInfos(isInfos, position, item, idx);
// } else {
// addMarkers(position, item.objectId, item.controlId, item);
// }
// } else {
// addMarkers(position, item.objectId, item.controlId, item);
// }
// });
// }
// };
// //운항정보 창 셋팅
// const infoInit = (marker, gps, idx) => {
// CustomOverlay = function (options) {
// this._element = $(`
// <div class="dblock-box">
// <div class="dblock-ti">
// <span>${marker?.id}</span>
// </div>
// <div class="dblock-txt">
// <div class="dblock-txt-list">
// <span>${gps?.elev}M</span>
// <span>${gps?.speed}km</span>
// ${
// typeof gps?.lat === 'number' && typeof gps?.lng === 'number'
// ? `
// <span>
// ${(gps?.lat).toFixed(6)} ${(gps?.lng).toFixed(6)}
// </span>`
// : ''
// }
// </div>
// </div>
// </div>
// `);
// // this._element = $(`
// // <div class="tooltip-box" style="width: 150px;">
// // <div class="tooltip-ti">
// // <span>${marker?.id}</span>
// // </div>
// // <div class="tooltip-txt>
// // <div class="tooltip-txt-list">
// // <div>
// // <span style="width: 120px; display: inline-block;">속도: ${gps?.speed}${gps?.speedType}</span>
// // </div>
// // <div>
// // <span style="width: 120px; display: inline-block;">고도: ${gps?.elev}${gps?.elevType}</span>
// // </div>
// // <div>
// // <span style="width: 120px; display: inline-block;">헤딩방향: ${gps?.heading}</span>
// // </div>
// // </div>
// // </div>
// // </div>
// // `)
// this.setPosition(options.position, idx);
// this.setMap(options.map || null);
// this.setId(options.id);
// this.setIdx(idx);
// this.setControlId(options.controlId);
// };
// CustomOverlay.prototype = new naver.maps.OverlayView();
// CustomOverlay.prototype.constructor = CustomOverlay;
// //메소드 재정의
// //필수
// CustomOverlay.prototype.onAdd = function () {
// let overlayLayer = this.getPanes().overlayLayer;
// this._element.appendTo(overlayLayer);
// };
// CustomOverlay.prototype.draw = function (idx) {
// if (!this.getMap()) {
// return;
// }
// let projection = this.getProjection(),
// position = this.getPosition(),
// pixelPosition = projection.fromCoordToOffset(position);
// // let cnt = 0;
// // let index = idx?._idx;
// // cnt = index * 98;
// this._element.css('left', pixelPosition.x);
// this._element.css('top', pixelPosition.y);
// // this._element.css('top', pixelPosition.y + -cnt)
// };
// CustomOverlay.prototype.onRemove = function () {
// let overlayLayer = this.getPanes().overlayLayer;
// this._element.remove();
// this._element.off();
// };
// //속성
// CustomOverlay.prototype.setPosition = function (position, idx) {
// this._position = position;
// this.draw(idx);
// };
// CustomOverlay.prototype.getPosition = function () {
// return this._position;
// };
// CustomOverlay.prototype.setId = function (id) {
// this._id = id;
// };
// CustomOverlay.prototype.getId = function () {
// return this._id;
// };
// CustomOverlay.prototype.setIdx = function (idx) {
// this._idx = idx;
// };
// CustomOverlay.prototype.getIdx = function () {
// return this._idx;
// };
// CustomOverlay.prototype.setControlId = function (controlId) {
// this._controlId = controlId;
// };
// CustomOverlay.prototype.getControlId = function () {
// return this._controlId;
// };
// };
// const removeArrMarkers = arrData => {
// setArrMarkers(arrData);
// };
// const removeArrInfos = arrData => {
// setArrInfos(arrData);
// };
// const markerInfo = arrMarkers => {
// arrMarkers.forEach((marker, idx) => {
// if (arrInfos.filter(i => i._controlId === marker.controlId).length > 0) {
// return;
// }
// const info = new props.mapboxgl.Popup({
// closeButton: false,
// closeOnClick: false
// })
// .setLngLat([marker.position.lng, marker.position.lat])
// .setHTML(
// `
// <div class="dblock-box">
// <div class="dblock-ti">
// <span>${marker?.id}</span>
// </div>
// <div class="dblock-txt">
// <div class="dblock-txt-list">
// <span>${marker.gps?.elev}M</span>
// <span>${marker.gps?.speed}km</span>
// ${
// typeof marker.gps?.lat === 'number' &&
// typeof marker.gps?.lng === 'number'
// ? `
// <span>
// ${(marker.gps?.lat).toFixed(
// 6
// )} ${(marker.gps?.lng).toFixed(6)}
// </span>`
// : ''
// }
// </div>
// </div>
// </div>
// `
// )
// .addTo(props.map);
// // infoInit(marker, controlGpList[idx], idx);
// info._id = marker.id;
// info.gps = marker.gps;
// // if (controlGpList.length != 0) {
// // const info = new CustomOverlay({
// // position: new naver.maps.LatLng(
// // controlGpList[idx]?.lat,
// // controlGpList[idx]?.lng
// // ),
// // // map: map,
// // id: marker.id,
// // idx: idx,
// // controlId: marker.controlId
// // });
// // info.setMap(map);
// setArrInfos(m => [...m, info]);
// // }
// });
// };
// return null;
// };

392
src/components/map/mapbox/feature/FeatureAirZone.js

@ -0,0 +1,392 @@
// import { useEffect, useState } from 'react';
// import { useSelector } from 'react-redux';
// import * as turf from '@turf/turf';
// import geoJson from '../../../../components/map/geojson/airArea.json';
// import gimPo from '../../../../components/map/geojson/airportAirArea.json';
// import '../../../../assets/css/custom.css';
// // 격자 공역 Source
// const airPort = [
// {
// title: '김포공항',
// buffer: 9300,
// center: [126.793722, 37.558522],
// reduce: [54.4, 218.6, 500, 905.4, 1459.8, 2195, 3173.5, 4552.5, 6952.5]
// },
// {
// title: '인천공항',
// buffer: 9300,
// center: [126.4409428, 37.4588105],
// reduce: [54.4, 218.6, 500, 905.4, 1459.8, 2195, 3173.5, 4552.5, 6952.5]
// },
// {
// title: '제주공항',
// buffer: 9300,
// center: [126.4930205, 33.506848],
// reduce: [54.4, 218.6, 500, 905.4, 1459.8, 2195, 3173.5, 4552.5, 6952.5]
// },
// {
// title: '정석비행장',
// buffer: 9300,
// center: [126.7142598, 33.3943517],
// reduce: [54.4, 218.6, 500, 905.4, 1459.8, 2195, 3173.5, 4552.5, 6952.5]
// }
// ];
// export const FeatureAirZone = props => {
// const mapControl = useSelector(state => state.controlMapReducer);
// let popup;
// let infoWindow;
// useEffect(() => {
// featureAirZoneInit();
// }, [mapControl]);
// const infowindowOpen = data => {
// const content =
// '<div class="tooltip-box">' +
// '<div class="tooltip-ti">' +
// '<span>' +
// data.title +
// '</span>' +
// '</div>' +
// '<div class="tooltip-txt">' +
// '<div class="tooltip-txt-list">' +
// '<span>' +
// data.description +
// '</span>' +
// '</div>' +
// '</div>' +
// '</div>';
// if (popup) {
// popup.remove();
// }
// // Create a popup element
// popup = new props.mapboxgl.Popup({
// offset: [20, -20],
// closeButton: false,
// closeOnClick: false,
// closeOnMove: true
// })
// .setLngLat(data.coord)
// .setHTML(content)
// .addTo(props.map);
// };
// const featureAirEvent = markers => {
// markers.forEach(marker => {
// marker.getElement().addEventListener('mouseover', e => {
// const data = {};
// data.coord = marker.getLngLat();
// data.title = marker.properties.name;
// data.description = marker.properties.description;
// infowindowOpen(data);
// });
// marker.getElement().addEventListener('mouseout', () => {
// if (popup) {
// popup.remove();
// }
// });
// });
// props.map.on('mouseover', 'maine', e => {
// props.map.getCanvas().style.cursor = 'pointer';
// const feature = e.features[0];
// const data = feature.properties;
// data.coord = e.lngLat;
// data.title = feature.properties.name;
// infowindowOpen(data);
// });
// props.map.on('mouseout', 'maine', () => {
// props.map.getCanvas().style.cursor = '';
// if (popup) {
// popup.remove();
// }
// });
// props.map.on('click', e => {
// // 클릭한 지점의 피처들을 얻어옵니다.
// const features = props.map.queryRenderedFeatures(e.point, {
// layers: ['add-3d-buildings'] // 빌딩 레이어의 ID를 지정합니다.
// });
// // 빌딩 피처가 있는 경우
// if (features.length > 0) {
// // 첫 번째 빌딩 피처의 높이 값을 얻어옵니다.
// const height = features[0].properties.height;
// // 팝업을 생성하고 지도에 추가합니다.
// new props.mapboxgl.Popup()
// .setLngLat(e.lngLat)
// .setHTML(`Building height: ${height}m`)
// .addTo(props.map);
// }
// });
// };
// // 공역 생성 함수
// const featureAirZoneInit = () => {
// let arrGeoJson = [];
// const useGeoJson = {
// ...geoJson,
// features: [...geoJson.features, ...gimPo.features]
// };
// // props.map.data.removeGeoJson(useGeoJson);
// if (props.map.getLayer('maine')) {
// props.map.removeLayer('maine');
// props.map.removeSource('maine');
// }
// // 공역 색상 및 공역 표출 정보에 따른 노출
// useGeoJson.features.map(item => {
// if (item.properties.type === '0001' && mapControl.area0001) {
// arrGeoJson.push({
// ...item,
// properties: { ...item.properties, color: '#FF3648' }
// });
// } else if (item.properties.type === '0002' && mapControl.area0002) {
// arrGeoJson.push({
// ...item,
// properties: { ...item.properties, color: '#FFA1AA' }
// });
// } else if (item.properties.type === '0003' && mapControl.area0003) {
// arrGeoJson.push({
// ...item,
// properties: { ...item.properties, color: '#FFA800' }
// });
// } else if (item.properties.type === '0004' && mapControl.area0004) {
// arrGeoJson.push({
// ...item,
// properties: { ...item.properties, color: '#A16B00' }
// });
// } else if (item.properties.type === '0005' && mapControl.area0005) {
// arrGeoJson.push({
// ...item,
// properties: { ...item.properties, color: '#AB40FF' }
// });
// } else if (item.properties.type === '0006' && mapControl.area0006) {
// arrGeoJson.push({
// ...item,
// properties: { ...item.properties, color: '#009cad' }
// });
// }
// });
// useGeoJson.features = arrGeoJson;
// // 공역 생성 start
// props.map.addSource('maine', {
// type: 'geojson',
// data: {
// ...useGeoJson
// }
// });
// props.map.addLayer({
// id: 'maine',
// type: 'fill',
// source: 'maine',
// layout: {},
// paint: {
// 'fill-color': ['get', 'color'],
// 'fill-opacity': 0.5
// }
// });
// // 공역 생성 end
// // 비행장 마커 생성
// const markers = useGeoJson.features
// .filter(i => i.geometry.type === 'Point')
// .map(i => {
// const marker = new props.mapboxgl.Marker()
// .setLngLat(i.geometry.coordinates)
// .addTo(props.map);
// marker.properties = i.properties;
// return marker;
// });
// // 격자 공역 생성
// airPort.map(air => polyArea(air));
// // 마우스 오버 이벤트 생성
// featureAirEvent(markers);
// };
// // 격자 공역 셋팅 함수
// const polyArea = air => {
// const polyArr = [];
// const radius = air.buffer;
// const position = air.center;
// const color = '#000';
// const opacity = 0.7;
// let angle = 0;
// let layerId = 1;
// for (let i = 0; i < 4; i++) {
// angle += 90;
// let buffer = 0;
// for (let j = 0; j < 9; j++) {
// buffer += 1000;
// const coord = turf.destination(
// turf.point([position[0], position[1]]),
// buffer / 1000,
// angle,
// { units: 'kilometers' }
// ).geometry.coordinates;
// let reduce = 0;
// reduce = air.reduce[j];
// if (angle % 180 === 0) {
// const polyEW = {
// id: layerId++,
// type: 'Feature',
// geometry: {
// type: 'LineString',
// coordinates: [
// turf.destination(
// turf.point([coord[0], coord[1]]),
// (radius - reduce) / 1000,
// 90,
// { units: 'kilometers' }
// ).geometry.coordinates,
// turf.destination(
// turf.point([coord[0], coord[1]]),
// (radius - reduce) / 1000,
// 270,
// { units: 'kilometers' }
// ).geometry.coordinates
// ]
// },
// properties: {
// stroke: color,
// 'stroke-width': 0.8,
// 'stroke-opacity': opacity
// }
// };
// polyArr.push(polyEW);
// } else {
// const polyNS = {
// id: layerId++,
// type: 'Feature',
// geometry: {
// type: 'LineString',
// coordinates: [
// turf.destination(
// turf.point([coord[0], coord[1]]),
// (radius - reduce) / 1000,
// 0,
// { units: 'kilometers' }
// ).geometry.coordinates,
// turf.destination(
// turf.point([coord[0], coord[1]]),
// (radius - reduce) / 1000,
// 180,
// { units: 'kilometers' }
// ).geometry.coordinates
// ]
// },
// properties: {
// stroke: color,
// 'stroke-width': 0.8,
// 'stroke-opacity': opacity
// }
// };
// polyArr.push(polyNS);
// }
// }
// }
// const NS = {
// id: layerId++,
// type: 'Feature',
// geometry: {
// type: 'LineString',
// coordinates: [
// turf.destination(
// turf.point([position[0], position[1]]),
// radius / 1000,
// 0,
// { units: 'kilometers' }
// ).geometry.coordinates,
// turf.destination(
// turf.point([position[0], position[1]]),
// radius / 1000,
// 180,
// { units: 'kilometers' }
// ).geometry.coordinates
// ]
// },
// properties: {
// stroke: color,
// 'stroke-width': 0.8,
// 'stroke-opacity': opacity
// }
// };
// polyArr.push(NS);
// const EW = {
// id: layerId++,
// type: 'Feature',
// geometry: {
// type: 'LineString',
// coordinates: [
// turf.destination(
// turf.point([position[0], position[1]]),
// radius / 1000,
// 90,
// { units: 'kilometers' }
// ).geometry.coordinates,
// turf.destination(
// turf.point([position[0], position[1]]),
// radius / 1000,
// 270,
// { units: 'kilometers' }
// ).geometry.coordinates
// ]
// },
// properties: {
// stroke: color,
// 'stroke-width': 0.8,
// 'stroke-opacity': opacity
// }
// };
// polyArr.push(EW);
// if (props.map.getLayer(air.title)) {
// props.map.removeLayer(air.title);
// props.map.removeSource(air.title);
// }
// props.map.addSource(air.title, {
// type: 'geojson',
// data: {
// type: 'FeatureCollection',
// features: polyArr
// }
// });
// props.map.addLayer({
// id: air.title,
// type: 'line',
// source: air.title,
// layout: {
// 'line-join': 'round',
// 'line-cap': 'round'
// },
// paint: {
// 'line-color': color,
// 'line-width': 0.8,
// 'line-opacity': opacity
// }
// });
// // Grid area
// };
// return null;
// };

81
src/components/map/naver/NaverMap.js

@ -4,6 +4,7 @@ import NaverMapControl from './NaverMapControl';
import { FeatureAirZone } from './feature/FeatureAirZone';
import geoJson from '../geojson/airArea.json';
import gimPo from '../geojson/airportAirArea.json';
import uam from '../geojson/uamAirArea.json';
import NewDronPlan from './dron/NewDronPlan';
import DronToast from './dron/DronToast';
import ControlDraw from './draw/ControlDraw';
@ -121,13 +122,18 @@ export const NaverCustomMap = () => {
let airArea = geoJson.features;
let gimPofeatures = gimPo.features;
let features = airArea.concat(gimPofeatures);
let uamAirArea = uam.features;
let features = airArea.concat(gimPofeatures, uamAirArea);
const coords = [];
useEffect(() => {
NaverMapInit();
airPort?.map((air, idx) => polyArea(air, idx));
// airPort?.map((air, idx) => airlist(air, idx));
// airPort?.map((air, idx) => polyArea(air, idx));
airPort?.map((air, idx) => {
gridgrid(air, idx);
});
gimPofeatures.map(air => {
coords.push({
lat:
@ -165,42 +171,48 @@ export const NaverCustomMap = () => {
}, []);
useEffect(() => {
uamPosition.map(uam => {
const name = uam.name;
const position = new naver.maps.LatLng(uam.lat, uam.lon);
const cont =
name.substr(0, 1) == 'R'
? [
'<div style="border-radius:50%; background:#429629; border: 4px solid #ffffff; padding:5px; width:40px; height:40px; text-align:center">',
`<span style="color:#ffffff">${name}</span>`,
'</div>'
]
: [
'<div style="border-radius:50%; background:#ffffff; border: 4px solid #15298A; padding:5px; width:40px; height:40px; text-align:center ">',
`<span style="color:#000000">${name}</span>`,
'</div>'
];
new naver.maps.Marker({
position: position,
map: mapObject,
icon: {
content: cont.join(''),
anchor: new naver.maps.Point(20, 20)
}
});
});
// uamPosition.map(uam => {
// const name = uam.name;
// const position = new naver.maps.LatLng(uam.lat, uam.lon);
// const cont =
// name.substr(0, 1) == 'R'
// ? [
// '<div style="border-radius:50%; background:#429629; border: 4px solid #ffffff; padding:5px; width:40px; height:40px; text-align:center">',
// `<span style="color:#ffffff">${name}</span>`,
// '</div>'
// ]
// : [
// '<div style="border-radius:50%; background:#ffffff; border: 4px solid #15298A; padding:5px; width:40px; height:40px; text-align:center ">',
// `<span style="color:#000000">${name}</span>`,
// '</div>'
// ];
// new naver.maps.Marker({
// position: position,
// map: mapObject,
// icon: {
// content: cont.join(''),
// anchor: new naver.maps.Point(20, 20)
// }
// });
// });
// coordCenter = new nl();
coordCenter.map((val, idx) => {
const position = new naver.maps.LatLng(val.lat, val.lng);
const cont = `<div style=font-size:15px;color:#000000;padding-top:5px;padding-left:8px ">${val.airspace}</div>`;
const position = new naver.maps.LatLng(
val.lat.toFixed(6),
val.lng.toFixed(6)
);
// const cont = `<div style=font-size:5px;color:#000000; text-align:center">${val.airspace}</div>`;
const marker = new naver.maps.Marker({
position: position,
map: mapObject,
icon: {
content: [cont].join(''),
anchor: new naver.maps.Point(20, 20)
content: `<div style="color:#000000;font-size:5px;">${val.airspace}</div>`,
size: new naver.maps.Size(0, 0),
origin: new naver.maps.Point(0, 0),
anchor: new naver.maps.Point(5, 5),
align: 'center'
}
});
});
@ -230,10 +242,10 @@ export const NaverCustomMap = () => {
const NaverMapInit = () => {
const mapOptions = {
center: new naver.maps.LatLng(37.520357, 126.610166),
center: new naver.maps.LatLng(37.558522, 126.793722),
// center: new naver.maps.LatLng(36.56793936069445, 127.85101412107547),
// zoom: 10,
zoom: 14,
zoom: 12,
zoomControl: true,
mapTypeId: naver.maps.MapTypeId.NORMAR,
zoomControlOptions: {
@ -485,6 +497,7 @@ export const NaverCustomMap = () => {
const latlngJson = [tt.lng(), tt.lat(), 0];
arr.push(latlngJson);
});
arr.push([path[0].lng(), path[0].lat(), 0]);
setSquarePaths(prev => [...prev, arr]);
};

49
src/components/map/naver/draw/FlightPlanDraw.js

@ -19,6 +19,10 @@ export const FlightPlanDraw_init = props => {
const setDragCircle = props.setDragCircle;
const [pastClickEve, setClickEve] = useState();
//공역 클릭 가능하도록 하기 위해 만든 임시 이벤트 변수
const [pastGeoJsonClickEve, setGeoJsonClickEve] = useState();
const [pastMarker, setMarker] = useState([]);
const [figure, setFigure] = useState();
@ -55,6 +59,13 @@ export const FlightPlanDraw_init = props => {
rightclickEve: ''
};
//공역 클릭 가능하도록 하기 위해 만든 임시 이벤트 변수
let geoJsonEve = {
clickEve: '',
mousedownEve: '',
rightclickEve: ''
};
let dragCircle = [];
let dragCircleEve = [];
@ -135,6 +146,7 @@ export const FlightPlanDraw_init = props => {
if (pastCircle.length != 0) {
pastCircle.forEach(prev => prev.setMap(null));
naver.maps.Event.removeListener(pastClickEve);
naver.maps.Event.removeListener(pastGeoJsonClickEve);
setCircle([]);
}
@ -150,31 +162,48 @@ export const FlightPlanDraw_init = props => {
const startMode = mode => {
if (!mode) return;
if (pastClickEve) {
if (pastClickEve || pastGeoJsonClickEve) {
naver.maps.Event.removeListener(pastClickEve);
naver.maps.Event.removeListener(pastGeoJsonClickEve);
}
if (mode === 'LINE') {
Eve.clickEve = naver.maps.Event.addListener(map, 'click', function (e) {
onClickPolyline(e);
});
geoJsonEve.clickEve = map.data.addListener('click', function (e) {
onClickPolyline(e);
});
setClickEve(Eve.clickEve);
setGeoJsonClickEve(geoJsonEve.clickEve);
} else if (mode === 'POLYGON') {
Eve.clickEve = naver.maps.Event.addListener(map, 'click', function (e) {
onClickPolygon(e);
});
geoJsonEve.clickEve = map.data.addListener('click', function (e) {
onClickPolygon(e);
});
setClickEve(Eve.clickEve);
setGeoJsonClickEve(geoJsonEve.clickEve);
} else if (mode === 'CIRCLE') {
Eve.clickEve = naver.maps.Event.addListener(map, 'click', function (e) {
onClickCircle(e);
});
geoJsonEve.clickEve = map.data.addListener('click', function (e) {
onClickCircle(e);
});
setClickEve(Eve.clickEve);
setGeoJsonClickEve(geoJsonEve.clickEve);
}
};
const removeListener = () => {
naver.maps.Event.removeListener(Eve.clickEve);
naver.maps.Event.removeListener(geoJsonEve.clickEve);
naver.maps.Event.removeListener(pastClickEve);
naver.maps.Event.removeListener(pastGeoJsonClickEve);
setClickEve();
setGeoJsonClickEve();
naver.maps.Event.removeListener(Eve.mousedownEve);
naver.maps.Event.removeListener(Eve.rightclickEve);
@ -273,6 +302,12 @@ export const FlightPlanDraw_init = props => {
finishDraw();
}
);
geoJsonEve.rightclickEve = map.data.addListener(
'rightclick',
function () {
finishDraw();
}
);
$(document).on('mousemove.measure', function (e) {
onMouseMovePolyline(e);
});
@ -333,6 +368,12 @@ export const FlightPlanDraw_init = props => {
finishDraw();
}
);
geoJsonEve.rightclickEve = map.data.addListener(
'rightclick',
function () {
finishDraw();
}
);
$(document).on('mousemove.measure', function (e) {
onMouseMovePolygon(e);
});
@ -510,7 +551,11 @@ export const FlightPlanDraw_init = props => {
Eve.clickEve = naver.maps.Event.addListener(map, 'click', function (e) {
onClickCircle(e);
});
geoJsonEve.clickEve = map.data.addListener('click', function (e) {
onClickCircle(e);
});
setClickEve(Eve.clickEve);
setGeoJsonClickEve(geoJsonEve.clickEve);
// setCircle(prev => [...prev, circle]);
setAreaInfo('');
@ -816,7 +861,7 @@ export const FlightPlanDraw_init = props => {
data.position = midPoint;
data.color = '#737373';
data.content = text;
anchor: new naver.maps.Point(20, 35);
data.anchor = new naver.maps.Point(20, 35);
createMarker(data);
}
}

2
src/components/map/naver/dron/DronMarker.js

@ -190,7 +190,7 @@ export const DronMarker = props => {
const pal = controlGroupAuthInfo?.find(
prev => prev.idntfNum === gps.objectId
);
if (pal || id.includes('NAMWON')) {
if (pal || !pal || id.includes('NAMWON')) {
if (id.includes('UAM')) {
markerOption.url = DronUamIcon;
} else {

93
src/components/map/naver/feature/FeatureAirZone.js

@ -1,9 +1,17 @@
import { useEffect, useState } from 'react';
import { useSelector } from 'react-redux';
import { useDispatch, useSelector } from 'react-redux';
import '../../../../assets/css/custom.css';
import * as Actions from '../../../../modules/basis/flight/actions/basisFlightAction';
import towerImg from '../../../../assets/images/transmission_tower_icon.png';
export const FeatureAirZone = props => {
const dispatch = useDispatch();
const mapControl = useSelector(state => state.controlMapReducer);
const { uamBufferList } = useSelector(state => state.flightState);
const [uamCoordinates, setUamCoordinates] = useState([]);
let infoWindow;
useEffect(() => {
@ -19,6 +27,39 @@ export const FeatureAirZone = props => {
});
}, [props.poly]);
// uam 노선 buffer 가져오기
useEffect(() => {
if (uamCoordinates.length > 0) {
uamCoordinates.forEach(coordinates => {
dispatch(
Actions.FLIGHT_UAM_BUFFER_LIST.request({
buffer: 50,
coordinates: coordinates
})
);
});
}
}, [uamCoordinates]);
// uam 노선 buffer 그리기
useEffect(() => {
let bufferPaths = [];
uamBufferList.forEach(coord => {
const path = new naver.maps.LatLng(coord.y, coord.x);
bufferPaths.push(path);
});
new naver.maps.Polyline({
strokeColor: '#283046',
strokeOpacity: 1,
strokeStyle: [5, 5],
path: bufferPaths,
map: props.map
});
}, [uamBufferList]);
const infowindowOpen = data => {
const content =
'<div class="tooltip-box">' +
@ -61,6 +102,15 @@ export const FeatureAirZone = props => {
const featureAirZoneInit = () => {
let arrGeoJson = [];
const uamRoutes = {
AR: [],
HG01: [],
HG02: [],
HG03: [],
TC: []
};
// props.map.data.removeGeoJson(props.geoJson);
// let geoJson = originGeoJson;
let useGeoJson = { type: 'FeatureCollection' };
@ -81,14 +131,44 @@ export const FeatureAirZone = props => {
arrGeoJson.push(item);
} else if (item.properties.type === '0006' && mapControl.area0006) {
arrGeoJson.push(item);
} else if (item.properties.route) {
arrGeoJson.push(item);
// 노선 별 좌표 저장
if (item.geometry.type === 'LineString') {
const route = item.properties.route;
if (uamRoutes[route]) {
item.geometry.coordinates.forEach(coord => {
const coordinates = { x: coord[0], y: coord[1] };
uamRoutes[route].push(coordinates);
});
}
}
} else if (item.properties.tower) {
arrGeoJson.push(item);
}
});
const routeArrays = Object.values(uamRoutes);
routeArrays.forEach(routeArray => {
setUamCoordinates(prev => [...prev, routeArray]);
});
useGeoJson.features = arrGeoJson;
props.map.data.addGeoJson(useGeoJson);
props.map.data.setStyle(feature => {
var color;
var wayPointIcon = {
content:
'<div style="width: 12px; height: 12px; background-color: white; border: 1px solid black; border-radius: 50%;"></div>',
anchor: new naver.maps.Point(7, 6)
};
var towerIcon = {
content: `<img src=${towerImg} style="width: 23px; height: 23px" />`,
anchor: new naver.maps.Point(15, 15)
};
//0001 비행금지구역 #FF3648
//0002 비행제한구역 #FFA1AA
@ -99,6 +179,8 @@ export const FeatureAirZone = props => {
// 공역 색상 변경
const type = feature.getProperty('type');
const name = feature.getProperty('name');
const route = feature.getProperty('route');
const tower = feature.getProperty('tower');
if (type === '0001') {
color = '#FF3648';
@ -114,14 +196,19 @@ export const FeatureAirZone = props => {
color = '#009cad';
} else if (name === '김포공항') {
color = '#020715';
} else if (route) {
color = '#FF1493';
} else if (tower) {
color = '#960018';
}
return {
fillColor: name === '김포공항' ? '#ffffff' : color,
opercity: name === '김포공항' ? 0 : 1,
strokeColor: color,
strokeWeight: name === '김포공항' ? 1 : 0.7,
icon: null
strokeWeight: name === '김포공항' ? 1 : route ? 3 : tower ? 1 : 0.7,
icon: route ? wayPointIcon : tower ? towerIcon : null,
strokeStyle: route ? 'shortdash' : ''
};
});

8
src/components/websocket/WebsocketClient.js

@ -53,11 +53,9 @@ const WebsocketClient = () => {
}
return (
<>
<li>
<span className={isConnection ? 'socket_on' : 'socket_off'}>
<VscLoading size={25} />
</span>
</li>
<span className={isConnection ? 'socket_on' : 'socket_off'}>
<VscLoading size={25} />
</span>
</>
);
};

2
src/configs/constants.js

@ -5,6 +5,8 @@ export const NAVER_SEARCH_API_HOST = process.env.NAVER_SEARCH_API_HOST;
export const IMG_PATH = process.env.REACT_APP_IMAGE_HOST;
export const MAPBOX_TOKEN = process.env.REACT_APP_MAPBOX_TOKEN;
// API KEY
export const NAVER_APP_CLIENT_KEY = process.env.NAVER_APP_CLIENT_KEY;
export const NAVER_APP_SECRET_KEY = process.env.NAVER_APP_SECRET_KEY;

6
src/configs/themeConfig.js

@ -3,9 +3,11 @@
//Template config options
const themeConfig = {
app: {
appName: 'DRONESYS',
// appName: 'DRONESYS',
// appLogoImage: require('@src/assets/images/logo/logo.svg').default,
appLogoImage: require('../assets/images/pal_logo.png').default
// appLogoImage: require('../assets/images/pal_logo.png').default
appName: '인천테크노파크',
appLogoImage: require('../assets/images/itp_logo_wh_icon.png').default
},
layout: {
isRTL: false,

18
src/containers/basis/flight/plan/FlightPlanAreaDetailContainer.js

@ -55,15 +55,15 @@ const FlightPlanAreaDetailContainer = ({ handleModal, isDone, isDisabled }) => {
resultAreaDetail
);
if (data.result) {
setAlertModal({
isOpen: true,
title: '우회 여부 확인',
desc: '경로상에 비행 금지된 구역이 있습니다.\n우회하여 경로 설정해주시기 바랍니다.'
});
return false;
}
// if (data.result) {
// setAlertModal({
// isOpen: true,
// title: '우회 여부 확인',
// desc: '경로상에 비행 금지된 구역이 있습니다.\n우회하여 경로 설정해주시기 바랍니다.'
// });
// return false;
// }
dispatch(Actions.AREA_DETAIL_LIST_SAVE(resultAreaDetail));
handleModal({ type: 'area', isOpne: false });

5
src/containers/basis/group/BasisGroupUsersContainer.js

@ -186,15 +186,16 @@ export const BasisGroupUsersContainer = props => {
let normal = false;
let myGroupAuthCd = '';
let my = '';
if (groupList) {
let my = groupList?.find(prev => {
my = groupList?.find(prev => {
if (prev.groupId === row?.groupId) {
return prev;
}
});
myGroupAuthCd = my.myGroupAuthCd;
} else if (joinList) {
let my = joinList?.find(prev => {
my = joinList?.find(prev => {
if (prev.groupId === row?.groupId) {
return prev;
}

19
src/modules/basis/flight/actions/basisFlightAction.ts

@ -13,7 +13,9 @@ import {
BasFlightAprovData,
BasFlightScheduleList,
weatherData,
resweatherData
resweatherData,
FlightUamBufferList,
FlightUamBufferRq
} from '../models/basisFlightModel';
// 공역 조회
@ -129,6 +131,11 @@ const FLIGHT_SCHEDULE_SUCCESS =
const FLIGHT_SCHEDULE_FAILURE =
'basis/flight/schedule/list/FLIGHT_SCHEDULE_FAILURE';
// 버퍼 좌표 가져오기
const UAM_BUFFER_LIST_REQUEST = 'basis/flight/adex/BUFFER_LIST_REQUEST';
const UAM_BUFFER_LIST_SUCCESS = 'basis/flight/adex/BUFFER_LIST_SUCCESS';
const UAM_BUFFER_LIST_FAILURE = 'basis/flight/adex/BUFFER_LIST_FAILURE';
export const SEARCH_AREA = createAsyncAction(
FLIGHT_SEARCH_AREA_REQUEST,
FLIGHT_SEARCH_AREA_SUCCESS,
@ -280,6 +287,13 @@ export const FlightweatherAction = createAsyncAction(
FLIGHT_WEATHER_FAILURE
)<weatherData, resweatherData, AxiosError>();
// UAM 버퍼 좌표 가져오기
export const FLIGHT_UAM_BUFFER_LIST = createAsyncAction(
UAM_BUFFER_LIST_REQUEST,
UAM_BUFFER_LIST_SUCCESS,
UAM_BUFFER_LIST_FAILURE
)<FlightUamBufferRq, FlightUamBufferList[], AxiosError>();
const actions = {
PUBLIC_AREA_LIST,
// FLIGHT_PLAN_AREA,
@ -305,7 +319,8 @@ const actions = {
FLIGHT_APRV_PROC,
SEARCH_AREA,
FLIGHT_SCHEDULE_LIST,
FlightweatherAction
FlightweatherAction,
FLIGHT_UAM_BUFFER_LIST
};
export type FlightAction = ActionType<typeof actions>;

4
src/modules/basis/flight/apis/basisFlightApi.ts

@ -6,6 +6,7 @@ import {
FlightPlanAreaDataList,
FlightPlanData,
FlightPlanListRqData,
FlightUamBufferRq,
weatherData
} from '../models/basisFlightModel';
@ -82,5 +83,8 @@ export const flightPlanAPI = {
},
scheduleList: async (date: string) => {
return await axios.get(`api/bas/flight/schedule?searchDate=${date}`);
},
uamBufferList: async (data: FlightUamBufferRq) => {
return await axios.post('/api/bas/flight/adex/buffer', data);
}
};

19
src/modules/basis/flight/models/basisFlightModel.ts

@ -21,6 +21,7 @@ export interface FlightState {
selectGroup: SelectGroupData | undefined;
listSelect: ListGroupData | undefined;
aprvSelect: ListGroupData | undefined;
uamBufferList: FlightUamBufferList[] | undefined;
}
export interface weatherData {
serviceKey: string;
@ -243,6 +244,21 @@ export interface BasFlightScheduleData {
list: [BasFlightScheduleList];
}
export interface FlightUamBufferRq {
buffer: number;
coordinates: {
x: number;
y: number;
}[];
}
export interface FlightUamBufferList {
x: number;
y: number;
m: number | string;
z: number | string;
}
export const initFlight = {
weather: undefined,
page: 1,
@ -387,7 +403,8 @@ export const initFlight = {
areaList: undefined,
aprvList: undefined,
aprvProc: undefined,
scheduleList: []
scheduleList: [],
uamBufferList: []
};
export const initFlightBas = {

7
src/modules/basis/flight/reducers/basisFlightReducer.ts

@ -163,4 +163,11 @@ export const flightReducer = createReducer<FlightState, Actions.FlightAction>(
const data = action.payload;
draft.scheduleList = data;
})
)
// uam 노선 버퍼 영역 조회
.handleAction(Actions.FLIGHT_UAM_BUFFER_LIST.success, (state, action) =>
produce(state, draft => {
const data = action.payload;
draft.uamBufferList = data;
})
);

26
src/modules/basis/flight/sagas/basisFlightSaga.ts

@ -433,6 +433,31 @@ function* searchAreaSaga(
}
}
// get uam buffer list
function* uamBufferListSaga(
action: ActionType<typeof Actions.FLIGHT_UAM_BUFFER_LIST.request>
) {
try {
const data = action.payload;
const response = yield call(Apis.flightPlanAPI.uamBufferList, data);
if (response.errorCode) {
yield put(
MessageActions.IS_ERROR({
errorCode: response.errorCode,
errorMessage: response.errorMessage,
isHistoryBack: false,
isRefresh: false
})
);
return;
}
yield put(Actions.FLIGHT_UAM_BUFFER_LIST.success(response));
} catch (error: any) {
yield put(Actions.FLIGHT_UAM_BUFFER_LIST.failure(error));
}
}
export function* flightSaga() {
yield takeEvery(Actions.PUBLIC_AREA_LIST.request, listAreaSaga);
// yield takeEvery(Actions.FLIGHT_PLAN_AREA.request, createFlightPlanArea);
@ -449,4 +474,5 @@ export function* flightSaga() {
yield takeEvery(Actions.SEARCH_AREA.request, searchAreaSaga);
yield takeEvery(Actions.FLIGHT_SCHEDULE_LIST.request, scheduleListSaga);
yield takeEvery(Actions.FlightweatherAction.request, WeatherSaga);
yield takeEvery(Actions.FLIGHT_UAM_BUFFER_LIST.request, uamBufferListSaga);
}

13
src/navigation/reservation/index.js

@ -0,0 +1,13 @@
export default [
{
id: 'reservation_001',
title: '도심항공교통(UAM) 예약',
navLink: '#'
},
{
id: 'reservation_001_01',
type: 'item',
title: '도심항공교통(UAM) 예약',
navLink: '/reservation'
}
];

10
src/router/routes/RouteReservation.js

@ -0,0 +1,10 @@
import { lazy } from 'react';
const RouteReservation = [
{
path: '/reservation',
component: lazy(() => import('../../views/reservation/ReservationView'))
}
];
export default RouteReservation;

2
src/router/routes/index.js

@ -5,6 +5,7 @@ import RouteBasis from './RouteBasis';
import RouteDashboard from './RouteDashboard';
import RouteSystem from './RouteSystem';
import RouteWeather from './RouteWeather';
import RouteReservation from './RouteReservation';
// ** Document title
const TemplateTitle = '%s - Dron Control System';
@ -20,6 +21,7 @@ const Routes = [
...RouteBasis,
...RouteSystem,
...RouteWeather,
...RouteReservation,
{
path: '/home',
component: lazy(() => import('../../views/Home'))

2
src/views/control/alarm/ControlAlarmList.js

@ -74,7 +74,7 @@ const ControlAlarmList = props => {
<dl className='notice-list'>
<dt>
<div className='list-ti'>
<div className='list-left-txt'>드론 현황</div>
<div className='list-left-txt'>PAV 현황</div>
<div className='list-right-txt'>
<Badge color='light-primary'>
{total? total.totalDroneCnt: 0} 비행

58
src/views/control/main/ControlMain.js

@ -2,9 +2,16 @@ import React, { useEffect, useState } from 'react';
import '../../../assets/css/custom.css';
import logo from '../../../assets/images/pal_logo.png';
import itp_logo from '../../../assets/images/itp_logo_wh_icon.png';
import finevt_logo from '../../../assets/images/finevt_logo.png';
import nam_logo from '../../../assets/images/nam_logo.png';
import future_logo from '../../../assets/images/future_logo.png';
import tp_logo from '../../../assets/images/tplogo_wh.png';
import kac_logo from '../../../assets/images/kac_logo_wh.png';
import mi_logo from '../../../assets/images/mi_logo_wh.png';
import kiast_logo from '../../../assets/images/kiast_logo_wh.svg';
import ongjin_logo from '../../../assets/images/ongjin_logo_wh.png';
import incheon_logo from '../../../assets/images/incheon_logo_wh.png';
import {
Sun,
@ -133,8 +140,8 @@ const ControlMain = () => {
};
//날씨 API
const rq = {
nx: 37.4562557,
ny: 126.7052062
nx: 37.558522,
ny: 126.793722
};
useEffect(() => {
dispatch(controlweatherAction.request(rq));
@ -162,9 +169,13 @@ const ControlMain = () => {
<ControlAlarmNotice />
<div className='left-menu'>
<h1 className='logo'>
{/* <h1 className='logo'>
<img src={logo} width='80' />
<span>PAL</span>
<span>{user?.cstmrSno === 27 ? 'FLYTO' : 'PAL'}</span>
</h1> */}
<h1 className='logo itp'>
<img src={itp_logo} width='80' />
<span>{user?.cstmrSno === 27 ? 'FLYTO' : '인천테크노파크'}</span>
</h1>
<ul className='left-menu-nav'>
@ -194,16 +205,39 @@ const ControlMain = () => {
</li>
</ul>
<ul className='left-menu-footer'>
<li>
{/* <li>
<img src={future_logo} width='50' />
</li>
<li>
<img src={nam_logo} width='50' />
</li>
<li>
<img src={finevt_logo} width='50' />
</li> */}
{/* <li>
<img src={kac_logo} width='50' />
</li>
<li>
<img src={tp_logo} width='50' />
</li> */}
{user?.cstmrSno === 27 ? (
<></>
) : (
<>
<li>
<img src={incheon_logo} width='60' />
</li>
<li>
<img src={ongjin_logo} width='60' />
</li>
{/* <li>
<img src={nam_logo} width='50' />
</li>
<li>
<img src={mi_logo} width='60' />
</li>
<li>
<img src={kiast_logo} width='80' />
</li> */}
</>
)}
<li>
<AiOutlinePoweroff
size={25}
@ -211,7 +245,7 @@ const ControlMain = () => {
onClick={handlerLogout}
/>
</li>
<li style={{ marginLeft: '8px' }}>
<li className='socket-wrap'>
<WebsocketClient />
</li>
{/* socket_off = 클래스명 변경시 빨간색! 접속이 원할하지않을때 */}
@ -229,7 +263,7 @@ const ControlMain = () => {
<div className='data-box-header'>
<span className='box-ti'>
{!isClickObject
? '인천광역시'
? '김포공항'
: !controlDetail?.stAreaNm
? `${controlDetail?.res.area1} ${controlDetail?.res.area2} ${controlDetail?.res.area3} ${controlDetail?.res.landNm} ${controlDetail?.res.landNum} `
: controlDetail?.stAreaNm}
@ -288,7 +322,7 @@ const ControlMain = () => {
<span>{droneCount}</span>
</div>
<div className='data-list'>
<span>UAM</span>
<span>PAV</span>
<span>{uamCount}</span>
</div>
<div className='data-list'>

85
src/views/control/report/ControlReportList.js

@ -1,15 +1,61 @@
import moment from 'moment';
import { useState } from 'react';
import { useEffect, useState } from 'react';
import { Search, X } from 'react-feather';
import { useDispatch, useSelector } from 'react-redux';
import { Badge, Button, Input, InputGroup } from 'reactstrap';
import {
Badge,
Button,
Input,
InputGroup,
Modal,
ModalHeader,
ModalBody
} from 'reactstrap';
import {
controlGpDtlAction,
controlGpFlightPlanAction
} from '../../../modules/control/gp';
import { objectClickAction } from '../../../modules/control/map/actions/controlMapActions';
import { NavLink } from 'react-router-dom';
const HandlerModal = ({ modal, handler }) => {
return (
<div
className='vertically-centered-modal'
style={{ maxWidth: '95vh', height: '95vh', margin: 0 }}
>
<Modal
isOpen={modal}
toggle={handler}
className='modal-dialog-centered modal-lg modal-video'
style={{ margin: '0px auto', maxWidth: '90%', minHeight: '100vh' }}
>
<ModalHeader toggle={handler}>실시간 영상보기</ModalHeader>
<ModalBody className='pal-modal-body'>
<>
{/* <iframe
width='100%'
height='100%'
src='https://www.youtube.com/embed/_g3GX_Dr_AA?si=K2QakM3sI5N1V5pe'
title='YouTube video player'
frameborder='0'
allow='accelerometer; autoplay=1; mute=1; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share'
allowfullscreen
></iframe> */}
<iframe
width='100%'
height='100%'
src='https://www.youtube.com/embed/dVJ0bfO_IcY?si=VHv-Luhx4PoTCzUo'
title='YouTube video player'
frameborder='0'
allow='accelerometer; autoplay=1; mute=1; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share'
allowfullscreen
></iframe>
</>
</ModalBody>
</Modal>
</div>
);
};
const ControlReportList = props => {
const { controlGpList } = useSelector(state => state.controlGpState);
const [filterId, setFilterId] = useState('');
@ -24,11 +70,18 @@ const ControlReportList = props => {
// useEffect(() => {}, [filterId]);
const [modal, setModal] = useState(false);
const handler = () => {
setModal(false);
};
return (
<div className='left-layer'>
<div className='layer-content'>
<div className='layer-ti'>
<h4>드론 비행 현황 정보</h4>
{/* <h4>드론 비행 현황 정보</h4> */}
<h4>PAV 비행현황 정보</h4>
<button
className='btn-icon'
color='primary'
@ -53,7 +106,8 @@ const ControlReportList = props => {
</div>
<div className='layer-content drone-list'>
<div className='layer-ti'>
<h4>드론 현황</h4>
{/* <h4>드론 현황</h4> */}
<h4>PAV 현황</h4>
<Badge color='light-primary'>
{controlGpList ? controlGpList.length : 0} 비행중
</Badge>
@ -100,14 +154,28 @@ const ControlReportList = props => {
{item.objectId.includes('NAMWON') ? (
<dt>
<div className='data-list'>
<NavLink
<div
className='data-list'
onClick={() => {
setModal(true);
}}
>
{/* <NavLink
to='/system/multi/views'
target='_blank'
style={{ width: '100%' }}
>
<span>실시간 영상보기</span>
</NavLink>
</NavLink> */}
<span>실시간 영상보기</span>
{/* <iframe
src='https://www.youtube.com/embed/_g3GX_Dr_AA?si=K2QakM3sI5N1V5pe'
title='YouTube video player'
frameborder='0'
allow='accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share'
allowfullscreen
></iframe> */}
</div>
</dt>
) : (
@ -131,6 +199,7 @@ const ControlReportList = props => {
}
})}
</div>
{modal ? <HandlerModal modal={modal} handler={handler} /> : <></>}
</div>
);
};

423
src/views/control/setting/ControlFsm.js

@ -0,0 +1,423 @@
import { useState } from 'react';
import { Button, Row, Col, FormGroup, Label, Input, Modal, ModalHeader, ModalBody, CustomInput } from 'reactstrap';
export default function ControlFsm({ modal, handler }) {
return (
<div
className='vertically-centered-modal'
>
<Modal
isOpen={modal}
toggle={handler}
className='modal-dialog-centered modal-lg'
>
<ModalHeader
toggle={handler}
>
FSM 비행계획서
</ModalHeader>
<ModalBody className='pal-modal-body'>
<div className='fsm-wrap'>
<div className='fsm-box'>
<div className='fsm-ti'>
<h5>비행계획서 상세정보</h5>
<div className='btn-wrap'>
<Button>CHG</Button>
<Button>CNL</Button>
<Button color='success'>비행계획서 제출</Button>
</div>
</div>
<Row>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for=''>서류구분</Label>
<Input
type='select'
name='select'
bsSize='sm'
id=''
>
<option>비행계획서 작성</option>
</Input>
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for=''>항공기 등록기호</Label>
<Input
type='text'
id=''
bsSize='sm'
placeholder=''
value=''
/>
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for=''>비행계획일자</Label>
<Input
type='text'
id=''
bsSize='sm'
placeholder=''
value=''
/>
</FormGroup>
</Col>
</Row>
<Row>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for=''>Priority</Label>
<Input
type='select'
name='select'
bsSize='sm'
id=''
>
<option>FF</option>
</Input>
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for=''>Filing Time</Label>
<Input
type='text'
id=''
bsSize='sm'
placeholder=''
value=''
/>
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for=''>의뢰부서</Label>
<Input
type='text'
id=''
bsSize='sm'
placeholder=''
value=''
/>
</FormGroup>
</Col>
</Row>
<hr/>
<Row>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for=''>Message Type</Label>
<Input
type='text'
bsSize='sm'
id=''
/>
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for=''>Flight Identity(Callsign)</Label>
<Input
type='text'
bsSize='sm'
id=''
/>
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for=''>Flight Rules</Label>
<Input
type='text'
bsSize='sm'
id=''
/>
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for=''>Flight Type</Label>
<Input
type='text'
bsSize='sm'
id=''
/>
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for=''>Number</Label>
<Input
type='text'
bsSize='sm'
id=''
/>
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for=''>Aicrraft Type</Label>
<Input
type='text'
bsSize='sm'
id=''
/>
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for=''>Wake Turb. Cat.</Label>
<Input
type='text'
bsSize='sm'
id=''
/>
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for=''>Equipment</Label>
<Input
type='text'
bsSize='sm'
id=''
/>
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for=''>Departure</Label>
<Input
type='text'
bsSize='sm'
id=''
/>
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for=''>Time</Label>
<Input
type='text'
bsSize='sm'
id=''
/>
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for=''>Cruising Speed</Label>
<Input
type='text'
bsSize='sm'
id=''
/>
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for=''>Flight Level</Label>
<Input
type='text'
bsSize='sm'
id=''
/>
</FormGroup>
</Col>
<Col className='list-input' md='12'>
<FormGroup>
<Label for=''>Route</Label>
<Input
type='textarea'
bsSize='sm'
id=''
/>
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for=''>Arrival</Label>
<Input
type='text'
bsSize='sm'
id=''
/>
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for=''>Total EET</Label>
<Input
type='text'
bsSize='sm'
id=''
/>
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for=''>1st ALTN</Label>
<Input
type='text'
bsSize='sm'
id=''
/>
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for=''>2st ALTN</Label>
<Input
type='text'
bsSize='sm'
id=''
/>
</FormGroup>
</Col>
<Col className='list-input' md='12'>
<FormGroup>
<Label for=''>Other information</Label>
<Input
type='textarea'
bsSize='sm'
id=''
/>
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for=''>E</Label>
<Input
type='text'
bsSize='sm'
id=''
/>
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for=''>P</Label>
<Input
type='text'
bsSize='sm'
id=''
/>
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for=''>R/</Label>
<div className='checkbox-inline'>
<CustomInput inline type='checkbox' id='exampleCustomCheckbox' label='U' defaultChecked />
<CustomInput inline type='checkbox' id='exampleCustomCheckbox2' label='V' />
<CustomInput inline type='checkbox' id='exampleCustomCheckbox3' label='E' />
</div>
</FormGroup>
</Col>
</Row>
<Row>
<Col className='list-input' md='6' sm='12'>
<FormGroup>
<Label for=''>S/</Label>
<div className='checkbox-inline'>
<CustomInput inline type='checkbox' id='4' label='P' defaultChecked />
<CustomInput inline type='checkbox' id='5' label='D' />
<CustomInput inline type='checkbox' id='6' label='M' />
<CustomInput inline type='checkbox' id='7' label='J' />
</div>
</FormGroup>
</Col>
<Col className='list-input' md='6' sm='12'>
<FormGroup>
<Label for=''>J/</Label>
<div className='checkbox-inline'>
<CustomInput inline type='checkbox' id='8' label='L' defaultChecked />
<CustomInput inline type='checkbox' id='9' label='F' />
<CustomInput inline type='checkbox' id='10' label='U' />
<CustomInput inline type='checkbox' id='11' label='V' />
</div>
</FormGroup>
</Col>
</Row>
<Row>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for=''>D/Number</Label>
<Input
type='text'
bsSize='sm'
id=''
/>
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for=''>Capacity</Label>
<Input
type='text'
bsSize='sm'
id=''
/>
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for=''>Cover</Label>
<Input
type='text'
bsSize='sm'
id=''
/>
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for=''>Colour</Label>
<Input
type='text'
bsSize='sm'
id=''
/>
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for=''>A/</Label>
<Input
type='text'
bsSize='sm'
id=''
/>
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for=''>N/</Label>
<Input
type='text'
bsSize='sm'
id=''
/>
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for=''>C/</Label>
<Input
type='text'
bsSize='sm'
id=''
/>
</FormGroup>
</Col>
</Row>
</div>
</div>
</ModalBody>
</Modal>
</div>
);
}

266
src/views/control/setting/ControlReservation.js

@ -0,0 +1,266 @@
import { useState } from 'react';
import {
Badge,
Button,
Input,
InputGroup,
Modal,
ModalHeader,
ModalBody,
Nav,
NavItem,
NavLink
} from 'reactstrap';
import {
Step1,
Step2,
Step3,
Step4,
ReserveStep1,
ReserveStep2,
ReserveStep3,
ReserveStep4
} from './steps';
import { CustomMainLayout } from '../../../components/layout/CustomMainLayout';
import { ChevronRight } from 'react-feather';
import AppCollapse from '@components/app-collapse';
export default function ControlReservation({ modal, handler }) {
const [activeTab, setActiveTab] = useState(1);
const [step, setStep] = useState(1);
const [airTraficCheck, setAirTraficCheck] = useState(1);
const [isChoise, setIsChoise] = useState(false);
const [search, setSearch] = useState(false);
const [reserveStep, setReserveStep] = useState(1);
const titleName = '도심항공교통(UAM) 예약';
const data = [
{
title: (
<div>
<div>
<span>여정1 선택완료</span>
<span>여정2 선택완료</span>
</div>
<div>TEST</div>
</div>
),
content: (
<div className=''>
Brownie sweet carrot cake dragée caramels fruitcake. Gummi bears
tootsie roll croissant gingerbread dragée tootsie roll. Cookie
caramels tootsie roll pie. Sesame snaps cookie cake donut wafer. Wafer
cookie jelly-o candy muffin cake. Marzipan topping lollipop. Gummies
chocolate sugar plum.
</div>
)
}
];
function getStepColorClass(stepNumber, currentStep) {
return stepNumber === currentStep ? 'active-step' : 'inactive-step';
}
return (
<CustomMainLayout title={titleName}>
<div className='uam-reservation'>
<div>
{search ? (
reserveStep !== 4 ? (
<div className='uam-reservation-header'>
<div>
<ul className='step'>
<li className={getStepColorClass(1, step)}>
<span className='num-icon'>1</span>
<span className='ti'>항공교통 조회</span>
</li>
<li className='line'>
<ChevronRight />
</li>
<li className={getStepColorClass(2, step)}>
<span className='num-icon'>2</span>
<span className='ti'>항공교통 선택</span>
</li>
<li className='line'>
<ChevronRight />
</li>
<li className={getStepColorClass(3, step)}>
<span className='num-icon'>3</span>
<span className='ti'>탑승정보 입력</span>
</li>
<li className='line'>
<ChevronRight />
</li>
<li className={getStepColorClass(4, step)}>
<span className='num-icon'>4</span>
<span className='ti'>결제</span>
</li>
</ul>
</div>
</div>
) : (
<div className='uam-reservation-header'>
<div>결제완료</div>
</div>
)
) : (
<div className='uam-reservation-header'>
<ul className='step'>
<li className={getStepColorClass(1, step)}>
<span className='num-icon'>1</span>
<span className='ti'>항공교통 조회</span>
</li>
<li className='line'>
<ChevronRight />
</li>
<li className={getStepColorClass(2, step)}>
<span className='num-icon'>2</span>
<span className='ti'>항공교통 선택</span>
</li>
<li className='line'>
<ChevronRight />
</li>
<li className={getStepColorClass(3, step)}>
<span className='num-icon'>3</span>
<span className='ti'>탑승정보 입력</span>
</li>
<li className='line'>
<ChevronRight />
</li>
<li className={getStepColorClass(4, step)}>
<span className='num-icon'>4</span>
<span className='ti'>결제</span>
</li>
</ul>
</div>
)}
</div>
<div>
{!search ? (
<div>
<div>
<Nav justified pills>
<NavItem>
<NavLink
active={activeTab === 1}
onClick={() => setActiveTab(1)}
>
<span>왕복</span>
</NavLink>
</NavItem>
<NavItem>
<NavLink
active={activeTab === 2}
onClick={() => setActiveTab(2)}
>
<span>편도</span>
</NavLink>
</NavItem>
</Nav>
</div>
<div className='uam-reservation-tab-list'>
<div
className={`list ${airTraficCheck === 1 ? 'active' : ''}`}
onClick={() => {
setAirTraficCheck(1);
}}
>
출발지
</div>
<div
className={`list ${airTraficCheck === 2 ? 'active' : ''}`}
onClick={() => {
setAirTraficCheck(2);
}}
>
도착지
</div>
<div
className={`list ${airTraficCheck === 3 ? 'active' : ''}`}
onClick={() => {
setAirTraficCheck(3);
}}
>
탑승일
</div>
<div
className={`list ${airTraficCheck === 4 ? 'active' : ''}`}
onClick={() => {
setAirTraficCheck(4);
}}
>
탑승객
</div>
<div
className={`list finish ${isChoise ? 'active' : ''}`}
onClick={() => {
setSearch(true);
setStep(2);
}}
>
항공교통 조회
</div>
</div>
<>
{airTraficCheck === 1 && <Step1 />}
{airTraficCheck === 2 && <Step2 />}
{airTraficCheck === 3 && <Step3 />}
{airTraficCheck === 4 && <Step4 setIsChoise={setIsChoise} />}
</>
</div>
) : (
<>
{reserveStep === 1 && <ReserveStep1 />}
{reserveStep === 2 && <ReserveStep2 />}
{reserveStep === 3 && <ReserveStep3 />}
{reserveStep === 4 && <ReserveStep4 />}
{reserveStep !== 4 ? (
<div className='uam-reservation-btn'>
<div>
<Button
color='danger'
onClick={() => {
if (reserveStep === 1) {
setIsChoise(false);
setSearch(false);
setAirTraficCheck(1);
} else {
setReserveStep(reserveStep - 1);
setStep(step - 1);
}
}}
>
취소
</Button>
</div>
<div>
<Button
color='primary'
onClick={() => {
setReserveStep(reserveStep + 1);
setStep(step + 1);
}}
>
{reserveStep === 3 ? '결제하기' : '다음'}
</Button>
</div>
</div>
) : (
<div>
<div>
<button onClick={handler}>확인</button>
</div>
</div>
)}
</>
)}
</div>
{/* total content-wrapper
padding-bottom:5rem이 추가되어야함 그래야 취소 다음 버튼이 보임
현재 임시로 css에서 강제로 important 상태*/}
<div className='uam-reservation-total'>
<AppCollapse data={data} />
</div>
</div>
</CustomMainLayout>
);
}

459
src/views/control/setting/ControlSetting.js

@ -4,275 +4,230 @@ import { BiBuildings, BiGridAlt } from 'react-icons/bi';
import { CgTrees } from 'react-icons/cg';
import { VscRadioTower } from 'react-icons/vsc';
import { useDispatch, useSelector } from 'react-redux';
import { useHistory } from 'react-router-dom';
import {
Button,
InputGroup,
ButtonGroup,
InputGroupAddon,
Input,
CustomInput
Button,
InputGroup,
ButtonGroup,
InputGroupAddon,
Input,
CustomInput
} from 'reactstrap';
import {
areaClickAction, environmentClickAction,
mapTypeChangeAction, sensorClickAction
areaClickAction,
environmentClickAction,
mapTypeChangeAction,
sensorClickAction
} from '../../../modules/control/map/actions/controlMapActions';
import ControlReservation from './ControlReservation';
import ControlFsm from './ControlFsm';
const ControlSetting = props => {
const dispatch = useDispatch();
const [modal, setModal] = useState(false);
const dispatch = useDispatch();
const history = useHistory();
const mapControl = useSelector(state => state.controlMapReducer);
const mapControl = useSelector(state => state.controlMapReducer);
const handlerMapType = val => {
dispatch(mapTypeChangeAction(val));
};
const handlerMapType = val => {
dispatch(mapTypeChangeAction(val));
};
const handlerAreaClick = val => {
dispatch(areaClickAction(val));
};
const handlerAreaClick = val => {
dispatch(areaClickAction(val));
};
const handlerSensorClick = (val, isChecked) => {
if (isChecked) {
dispatch(sensorClickAction(val));
} else {
dispatch(sensorClickAction(''));
}
};
// const handlerModal = () => {
// setModal(!modal);
// };
return (
<div className=''>
<div className='layer-content'>
<div className='layer-ti'>
<h4>지도유형</h4>
{/* <button className='btn-icon' outline color='primary'><X size={20} /></button> */}
const handlerModal = modalName => {
setModal(modalName);
};
return (
<div className=''>
<div className='layer-content'>
<div className='layer-ti'>
<h4>지도유형</h4>
{/* <button className='btn-icon' outline color='primary'><X size={20} /></button> */}
</div>
<div className='map-btn'>
<ButtonGroup>
<Button
color={mapControl.mapType === 'HYBRID' ? 'primary' : ''}
onClick={e => handlerMapType('HYBRID')}
>
위성지도
</Button>
<Button
color={mapControl.mapType === 'NORMAL' ? 'primary' : ''}
onClick={e => handlerMapType('NORMAL')}
>
일반지도
</Button>
<Button
color={mapControl.mapType === 'TERRAIN' ? 'primary' : ''}
onClick={e => handlerMapType('TERRAIN')}
>
지형지도
</Button>
</ButtonGroup>
</div>
</div>
<div className='layer-content'>
<div className='layer-ti'>
<h4>공역 표출 정보</h4>
</div>
<div className='layer-content-box'>
<div className='layer-content-info layer-switch-list'>
<dl>
<dt>
<div className='list-left-txt'>
<span className='dot-icon color-red'></span>
</div>
<div className='list-right-txt'>
<CustomInput
onClick={e => handlerAreaClick('0001')}
className='custom-control-primary'
type='switch'
id='test01'
name='test01'
inline
defaultChecked={mapControl.area0001}
/>
</div>
</dt>
<dt>
<div className='list-left-txt'>
<span className='dot-icon color-pink'></span>
</div>
<div className='list-right-txt'>
<CustomInput
onClick={e => handlerAreaClick('0002')}
className='custom-control-primary'
type='switch'
id='test02'
name='test02'
inline
defaultChecked={mapControl.area0002}
/>
</div>
<div className='map-btn'>
<ButtonGroup>
<Button
color={mapControl.mapType === 'HYBRID' ? 'primary' : ''}
onClick={e => handlerMapType('HYBRID')}
>
위성지도
</Button>
<Button
color={mapControl.mapType === 'NORMAL' ? 'primary' : ''}
onClick={e => handlerMapType('NORMAL')}
>
일반지도
</Button>
<Button
color={mapControl.mapType === 'TERRAIN' ? 'primary' : ''}
onClick={e => handlerMapType('TERRAIN')}
>
지형지도
</Button>
</ButtonGroup>
</dt>
<dt>
<div className='list-left-txt'>
<span className='dot-icon color-orange'></span>()
</div>
</div>
<div className='layer-content'>
<div className='layer-ti'>
<h4>공역 표출 정보</h4>
<div className='list-right-txt'>
<CustomInput
onClick={e => handlerAreaClick('0003')}
className='custom-control-primary'
type='switch'
id='test03'
name='test03'
inline
defaultChecked={mapControl.area0003}
/>
</div>
<div className='layer-content-box'>
<div className='layer-content-info layer-switch-list'>
<dl>
<dt>
<div className='list-left-txt'>
<span className='dot-icon color-red'></span>
</div>
<div className='list-right-txt'>
<CustomInput
onClick={e => handlerAreaClick('0001')}
className='custom-control-primary'
type='switch'
id='test01'
name='test01'
inline
defaultChecked={mapControl.area0001}
/>
</div>
</dt>
<dt>
<div className='list-left-txt'>
<span className='dot-icon color-pink'></span>
</div>
<div className='list-right-txt'>
<CustomInput
onClick={e => handlerAreaClick('0002')}
className='custom-control-primary'
type='switch'
id='test02'
name='test02'
inline
defaultChecked={mapControl.area0002}
/>
</div>
</dt>
<dt>
<div className='list-left-txt'>
<span className='dot-icon color-orange'></span>()
</div>
<div className='list-right-txt'>
<CustomInput
onClick={e => handlerAreaClick('0003')}
className='custom-control-primary'
type='switch'
id='test03'
name='test03'
inline
defaultChecked={mapControl.area0003}
/>
</div>
</dt>
<dt>
<div className='list-left-txt'>
<span className='dot-icon color-brown'></span>()
</div>
<div className='list-right-txt'>
<CustomInput
onClick={e => handlerAreaClick('0004')}
className='custom-control-primary'
type='switch'
id='test04'
name='test04'
inline
defaultChecked={mapControl.area0004}
/>
</div>
</dt>
<dt>
<div className='list-left-txt'>
<span className='dot-icon color-purple'></span>
</div>
<div className='list-right-txt'>
<CustomInput
onClick={e => handlerAreaClick('0005')}
className='custom-control-primary'
type='switch'
id='test05'
name='test05'
inline
defaultChecked={mapControl.area0005}
/>
</div>
</dt>
<dt>
<div className='list-left-txt'>
<span className='dot-icon color-skyblue'></span>
초경량비행장치공역
</div>
<div className='list-right-txt'>
<CustomInput
onClick={e => handlerAreaClick('0006')}
className='custom-control-primary'
type='switch'
id='test06'
name='test06'
inline
defaultChecked={mapControl.area0006}
/>
</div>
</dt>
</dl>
</div>
</dt>
<dt>
<div className='list-left-txt'>
<span className='dot-icon color-brown'></span>()
</div>
</div>
{/* <div className='layer-content'>
<div className='layer-ti'>
<h4>환경지표</h4>
<div className='list-right-txt'>
<CustomInput
onClick={e => handlerAreaClick('0004')}
className='custom-control-primary'
type='switch'
id='test04'
name='test04'
inline
defaultChecked={mapControl.area0004}
/>
</div>
<div className='layer-content-box'>
<div className='layer-content-info layer-switch-list'>
<dl>
<dt>
<div className='list-left-txt'>
<span className='dot-icon color-red'></span>(DUST)
</div>
<div className='list-right-txt'>
<CustomInput
onChange={e => handlerSensorClick('dust', e.target.checked)}
className='custom-control-primary'
type='switch'
id='sensorDust'
name='sensorDust'
inline
checked={mapControl.sensor === 'dust'}
// defaultChecked={mapControl.sensor === 'dust'}
/>
</div>
</dt>
<dt>
<div className='list-left-txt'>
<span className='dot-icon color-pink'></span>(O3)
</div>
<div className='list-right-txt'>
<CustomInput
onChange={e => handlerSensorClick('o3', e.target.checked)}
className='custom-control-primary'
type='switch'
id='sensorO3'
name='sensorO3'
inline
checked={mapControl.sensor === 'o3'}
// defaultChecked={mapControl.sensor === 'o3'}
/>
</div>
</dt>
<dt>
<div className='list-left-txt'>
<span className='dot-icon color-orange'></span>(No2)
</div>
<div className='list-right-txt'>
<CustomInput
onChange={e => handlerSensorClick('no2', e.target.checked)}
className='custom-control-primary'
type='switch'
id='sensorNo2'
name='sensorNo2'
inline
checked={mapControl.sensor === 'no2'}
// defaultChecked={mapControl.sensor === 'no2'}
/>
</div>
</dt>
<dt>
<div className='list-left-txt'>
<span className='dot-icon color-brown'></span>(Co)
</div>
<div className='list-right-txt'>
<CustomInput
onChange={e => handlerSensorClick('co', e.target.checked)}
className='custom-control-primary'
type='switch'
id='sensorCo'
name='sensorCo'
inline
checked={mapControl.sensor === 'co'}
// defaultChecked={mapControl.sensor === 'co'}
/>
</div>
</dt>
<dt>
<div className='list-left-txt'>
<span className='dot-icon color-purple'></span>(So2)
</div>
<div className='list-right-txt'>
<CustomInput
onChange={e => handlerSensorClick('so2', e.target.checked)}
className='custom-control-primary'
type='switch'
id='sensorSo2'
name='sensorSo2'
inline
checked={mapControl.sensor === 'so2'}
// defaultChecked={mapControl.sensor === 'so2'}
/>
</div>
</dt>
</dl>
</div>
</dt>
<dt>
<div className='list-left-txt'>
<span className='dot-icon color-purple'></span>
</div>
</div> */}
<div className='list-right-txt'>
<CustomInput
onClick={e => handlerAreaClick('0005')}
className='custom-control-primary'
type='switch'
id='test05'
name='test05'
inline
defaultChecked={mapControl.area0005}
/>
</div>
</dt>
<dt>
<div className='list-left-txt'>
<span className='dot-icon color-skyblue'></span>
초경량비행장치공역
</div>
<div className='list-right-txt'>
<CustomInput
onClick={e => handlerAreaClick('0006')}
className='custom-control-primary'
type='switch'
id='test06'
name='test06'
inline
defaultChecked={mapControl.area0006}
/>
</div>
</dt>
</dl>
</div>
</div>
</div>
<div className='layer-content'>
<div className='layer-ti'>
<h4>도심항공교통(UAM) 예약</h4>
</div>
<div className='layer-content-box'>
<div className='map-btn'>
<ButtonGroup>
<Button
color='primary'
onClick={() => {
history.push('');
}}
>
도심항공교통(UAM) 예약 바로가기
</Button>
</ButtonGroup>
</div>
</div>
</div>
<div className='layer-content'>
<div className='layer-ti'>
<h4>FSM 비행계획서 작성</h4>
</div>
<div className='layer-content-box'>
<div className='map-btn'>
<ButtonGroup>
<Button color='primary' onClick={() => handlerModal('fsm')}>
FSM 비행계획서 작성 바로가기
</Button>
</ButtonGroup>
</div>
</div>
);
</div>
{/* {modal ? (
<ControlReservation modal={modal} handler={handlerModal} />
) : (
<></>
)} */}
{modal === 'reservation' && (
<ControlReservation modal={true} handler={() => handlerModal(null)} />
)}
{modal === 'fsm' && (
<ControlFsm modal={true} handler={() => handlerModal(null)} />
)}
</div>
);
};
export default ControlSetting;

430
src/views/control/setting/steps/ReserveStep1.js

@ -0,0 +1,430 @@
import React, { useState, Component } from 'react';
import Slider from 'react-slick';
import 'slick-carousel/slick/slick.css';
import 'slick-carousel/slick/slick-theme.css';
import {
Badge,
Button,
Modal,
ModalHeader,
ModalBody,
ModalFooter,
Alert
} from 'reactstrap';
import { ArrowRight, XCircle, X } from 'react-feather';
export default function ReserveStep1() {
const settings = {
dots: false,
infinite: true,
speed: 500,
slidesToShow: 7,
slidesToScroll: 1
};
const [centeredModal, setCenteredModal] = useState(false);
return (
<div className='step-reservation'>
<div className='step-box'>
<div className='uam-reservation-tab-list'>
<div
className='list'
onClick={() => setCenteredModal(!centeredModal)}
>
고양 킨텍스
</div>
<div
className='list'
onClick={() => setCenteredModal(!centeredModal)}
>
여의도 공원
</div>
<div
className='list'
onClick={() => setCenteredModal(!centeredModal)}
>
2023. 10. 22() ~ 2023. 11. 01()
</div>
<div
className='list'
onClick={() => setCenteredModal(!centeredModal)}
>
성인 1, 소아 1, 유아 1
</div>
<Button onClick={() => setCenteredModal(!centeredModal)}>수정</Button>
</div>
<Modal
isOpen={centeredModal}
toggle={() => setCenteredModal(!centeredModal)}
className='modal-dialog-centered uam-reservation-quick'
>
<ModalHeader>
<div className='uam-reservation-tab-list'>
<div className='list'>고양 킨텍스</div>
<div className='list'>여의도 공원</div>
<div className='list'>2023. 10. 22() ~ 2023. 11. 01()</div>
<div className='list'>성인 1, 소아 1, 유아 1</div>
<Button>수정</Button>
</div>
</ModalHeader>
<ModalBody>
<div className='step-wrap'>
<div className='step-box'>
<div className='step-box-ti'>
<h5>출발지 선택</h5>
{/*
step-wrap이 닫히거나 변경? 추후에... 다시 상의..
modal사용시 quick box 커스텀 어려움
modal 제거 하드코딩 ? 추후 상의
현재는 그냥 기획서상 화면만 구현 */}
<Button
className='btn-icon'
color='primary'
onClick={() => setCenteredModal(!centeredModal)}
>
<X size={16} />
</Button>
</div>
<div className='step-box-city'>
<ul className='step-box-city-list'>
<li className='step-city-ti'>아라뱃길</li>
<li>
<ul>
<li>드론시험 인증센터</li>
<li>계양 신도시</li>
</ul>
</li>
</ul>
<ul className='step-box-city-list'>
<li className='step-city-ti'>한강</li>
<li>
<ul>
<li>고양 킨텍스</li>
<li>김포공항</li>
<li>여의도 공원</li>
</ul>
</li>
</ul>
<ul className='step-box-city-list'>
<li className='step-city-ti'>탄천</li>
<li>
<ul>
<li>잠실한강공원</li>
<li>수서역</li>
</ul>
</li>
</ul>
</div>
</div>
<div className='step-box'>
<div className='step-box-ti'>
<h5>최근 조회하신 여정</h5>
</div>
<div className='search-box-city'>
<div className='search-city'>
<div>
<span>드론시험 인증센터</span>
<span className='arrow'>
<ArrowRight />
</span>
<span>계양 신도시</span>
</div>
<div className='delete'>
<XCircle />
</div>
</div>
<div className='search-city'>
<div>
<span>드론시험 인증센터</span>
<span className='arrow'>
<ArrowRight />
</span>
<span>계양 신도시</span>
</div>
<div className='delete'>
<XCircle />
</div>
</div>
</div>
</div>
</div>
</ModalBody>
</Modal>
</div>
<div className='step-box'>
<div className='step-reservation-header'>
<Badge color='primary' className='badge-glow'>
여정 1
</Badge>
<div className='place'>
<span>고양 킨텍스</span>
<span className='arrow'>
<ArrowRight />
</span>
<span>여의도 공원</span>
</div>
</div>
<div className='reservation-date'>
<Slider {...settings}>
<div className='box'>
<span className='date'>2025.10.23()</span>
<span className='state'>매진</span>
</div>
<div className='box'>
<span className='date'>2025.10.24()</span>
<span className='state'>매진</span>
</div>
<div className='box'>
<span className='date'>2025.10.25()</span>
<span className='state'>매진</span>
</div>
<div className='box active'>
<span className='date'>2025.10.26()</span>
<span className='state'>
56,000<span className='rate'>KRW</span>
</span>
</div>
<div className='box'>
<span className='date'>2025.10.27()</span>
<span className='state'>
58,000<span className='rate'>KRW</span>
</span>
</div>
<div className='box'>
<span className='date'>2025.10.28()</span>
<span className='state'>-</span>
</div>
<div className='box'>
<span className='date'>2025.10.29()</span>
<span className='state'>
48,000<span className='rate'>KRW</span>
</span>
</div>
<div className='box'>
<span className='date'>2025.10.30()</span>
<span className='state'>
38,000<span className='rate'>KRW</span>
</span>
</div>
</Slider>
</div>
<div className='reservation-table'>
<table>
<colgroup>
<col width='20%' />
<col width='20%' />
<col width='15%' />
<col width='15%' />
<col width='15%' />
</colgroup>
<thead>
<tr>
<th>출발/도착시간(비행시간)</th>
<th>편명/기종</th>
<th>특가운임</th>
<th>할인운임</th>
<th>정규운임</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<div>
<span className='alltime'>
<span className='time'>1시간 5</span>
<span className='start'>12:40</span>
<span className='line'></span>
<span className='arrive'>09:45</span>
<span className='plus'>+ 1 day</span>
</span>
</div>
</td>
<td>
<div className='flight'>
<span>3P1003</span>
<span>B737-800</span>
</div>
</td>
<td>
<div className='amount'>
<span className='state'>매진</span>
</div>
</td>
<td>
<div className='amount active'>
<span className='state'>
76.000<span className='rate'>KRW</span>
</span>
<span className='seat'>잔여 7</span>
</div>
</td>
<td>
<div className='amount'>
<span className='state'>
76.000<span className='rate'>KRW</span>
</span>
<span className='seat'>잔여 7</span>
</div>
</td>
</tr>
<tr>
<td colSpan='5'>
<div className='fare-wrap'>
<div className='fare'>
<ul className='list-txt'>
<li>
<h6>특가운임 운임조건</h6>
</li>
<li>
<span className='ti'>취소 수수료</span>
<span>
구매일 ~ 91일전까지 : 전액환불
<br />
출발 이후 : 5,000
</span>
</li>
<li>
<span>예약부도 위약금</span>
<span>출발 이후 : 12,000</span>
</li>
</ul>
</div>
<div className='fare active'>
<ul className='list-txt'>
<li>
<h6>할인운임 운임조건</h6>
</li>
<li>
<span className='ti'>취소 수수료</span>
<span>
구매일 ~ 91일전까지 : 전액환불
<br />
출발 이후 : 5,000
</span>
</li>
<li>
<span>예약부도 위약금</span>
<span>출발 이후 : 12,000</span>
</li>
</ul>
</div>
<div className='fare'>
<ul className='list-txt'>
<li>
<h6>정규운임 운임조건</h6>
</li>
<li>
<span className='ti'>취소 수수료</span>
<span>
구매일 ~ 91일전까지 : 전액환불
<br />
출발 이후 : 5,000
</span>
</li>
<li>
<span>예약부도 위약금</span>
<span>출발 이후 : 12,000</span>
</li>
</ul>
</div>
</div>
</td>
</tr>
<tr>
<td>
<div>
<span className='alltime'>
<span className='time'>1시간 5</span>
<span className='start'>12:40</span>
<span className='line'></span>
<span className='arrive'>09:45</span>
<span className='plus'>+ 1 day</span>
</span>
</div>
</td>
<td>
<div className='flight'>
<span>3P1003</span>
<span>B737-800</span>
</div>
</td>
<td>
<div className='amount'>
<span className='state'>매진</span>
</div>
</td>
<td>
<div className='amount'>
<span className='state'>
76.000<span className='rate'>KRW</span>
</span>
<span className='seat'>잔여 7</span>
</div>
</td>
<td>
<div className='amount'>
<span className='state'>
76.000<span className='rate'>KRW</span>
</span>
<span className='seat'>잔여 7</span>
</div>
</td>
</tr>
<tr>
<td colSpan='5'></td>
</tr>
<tr>
<td>
<div>
<span className='alltime'>
<span className='time'>1시간 5</span>
<span className='start'>12:40</span>
<span className='line'></span>
<span className='arrive'>09:45</span>
<span className='plus'>+ 1 day</span>
</span>
</div>
</td>
<td>
<div className='flight'>
<span>3P1003</span>
<span>B737-800</span>
</div>
</td>
<td>
<div className='amount'>
<span className='state'>매진</span>
</div>
</td>
<td>
<div className='amount'>
<span className='state'>
76.000<span className='rate'>KRW</span>
</span>
<span className='seat'>잔여 7</span>
</div>
</td>
<td>
<div className='amount'>
<span className='state'>
76.000<span className='rate'>KRW</span>
</span>
<span className='seat'>잔여 7</span>
</div>
</td>
</tr>
<tr>
<td colSpan='5'></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
);
}

223
src/views/control/setting/steps/ReserveStep2.js

@ -0,0 +1,223 @@
export default function ReserveStep2() {
return (
<div style={{ padding: '40px' }}>
<div
style={{
fontWeight: 'bold',
fontSize: '1.3rem',
borderBottom: '1px solid #000'
}}
>
성인 1
</div>
<div style={{ padding: '10px', marginBottom: '20px' }}>
<div
style={{
display: 'flex',
justifyContent: 'flex-start',
width: '100%'
}}
>
<div
style={{
width: '50%'
}}
>
<div
style={{
borderBottom: '1px dotted #000',
marginBottom: '10px',
height: '100px'
}}
>
<span style={{ fontWeight: 'bold' }}>성명</span>
<div style={{ padding: '10px' }}>
<input value='KIM' style={{ marginRight: '10px',padding:'5px' }} />
<input value='YOONSUN' style={{ marginRight: '10px',padding:'5px' }} />
<input value='12345678' style={{ padding:'5px' }}/>
</div>
<div style={{ marginBottom: '10px' }}>
* 탑승자의 성명은 신분증상의 성명과 동일하게 입력하여 주시기
바랍니다.
</div>
</div>
<div
style={{
borderBottom: '1px dotted #000',
marginBottom: '10px',
height: '100px',
padding: '10px'
}}
>
<span style={{ fontWeight: 'bold' }}>신분할인 (여정1)</span>
<div style={{ marginBottom: '10px' }}>
<select style={{ width: '72%' ,padding:'5px'}}>
<option>성인 (기본운임)</option>
</select>
</div>
<div>
* 선택한 할인율 적용된 금액은 다음 단계에서 확인 가능합니다.
</div>
</div>
<div
style={{
borderBottom: '1px dotted #000',
height: '80px',
padding: '10px'
}}
>
<span style={{ fontWeight: 'bold' }}>신분할인 (여정2)</span>
<div style={{ marginBottom: '10px' }}>
<select style={{ width: '72%' ,padding:'5px'}}>
<option>성인 (기본운임)</option>
</select>
</div>
</div>
</div>
<div
style={{
width: '50%'
}}
>
<div
style={{
borderBottom: '1px dotted #000',
marginBottom: '10px',
height: '100px'
}}
>
<span style={{ fontWeight: 'bold' }}>성별</span>
<div style={{ padding:'10px' }}>
<span style={{ padding: '5px 40px', border: '1px solid #000' }}>
남자
</span>
<span
style={{
padding: '5px 40px',
border: '1px solid #990033',
backgroundColor: '#990033',
color: '#fff'
}}
>
여자
</span>
</div>
</div>
<div
style={{
borderBottom: '1px dotted #000',
marginBottom: '10px',
height: '100px'
}}
></div>
<div
style={{
borderBottom: '1px dotted #000',
height: '80px'
}}
></div>
</div>
</div>
</div>
<div
style={{
display: 'flex',
justifyContent: 'space-between',
borderBottom: '1px solid #000'
}}
>
<div
style={{
fontWeight: 'bold',
fontSize: '1.3rem'
}}
>
예매자 정보
</div>
<div style={{ color: 'red' }}>
* 반드시 연락 가능한 연락처와 이메일을 입력하십시오.
</div>
</div>
<div
style={{
padding: '10px',
backgroundColor: '#F2F2F2',
borderBottom: '1px dotted #000'
}}
>
<div
style={{
display: 'flex',
justifyContent: 'flex-start',
width: '100%'
}}
>
<div
style={{
width: '50%',
borderRight: '1px solid #000',
marginRight: '10px'
}}
>
<div
style={{
// marginBottom: '10px',
height: '100px'
}}
>
<span style={{ fontWeight: 'bold' }}>연락처</span>
<div style={{ marginBottom: '10px' }}>
<select
disabled
style={{ height: '29px', marginRight: '10px' }}
>
<option>+ 82 (대한민국)</option>
</select>
<select
disabled
style={{ height: '29px', marginRight: '10px' }}
>
<option>010</option>
</select>
<input value='' disabled style={{ marginRight: '10px' }} />
<input value='' disabled />
</div>
<div style={{ marginBottom: '10px' }}>
* 탑승자의 성명은 신분증상의 성명과 동일하게 입력하여 주시기
바랍니다.
</div>
</div>
</div>
<div
style={{
width: '50%'
}}
>
<div
style={{
// marginBottom: '10px',
height: '100px'
}}
>
<span style={{ fontWeight: 'bold' }}>이메일</span>
<div>
<input
value='이메일'
disabled
style={{ marginRight: '10px' }}
/>
@
<select disabled style={{ height: '29px', width: '300px' }}>
<option>선택</option>
</select>
</div>
</div>
</div>
</div>
</div>
</div>
);
}

164
src/views/control/setting/steps/ReserveStep3.js

@ -0,0 +1,164 @@
export default function ReserveStep3() {
return (
<div style={{ padding: '40px' }}>
<div
style={{
borderBottom: '1px solid #000'
}}
>
<div
style={{
fontWeight: 'bold',
fontSize: '1.3rem'
}}
>
결제 정보
</div>
</div>
<div
style={{
display: 'flex',
justifyContent: 'flex-start',
padding: '5px',
borderBottom: '1px solid #000'
}}
>
<div
style={{
width: '15%',
height: '50px',
display: 'flex',
justifyContent: 'center',
alignItems: 'center'
}}
>
결제 수단
</div>
<div
style={{
width: '15%',
height: '50px',
display: 'flex',
alignItems: 'center',
backgroundColor: '#990033',
color: '#fff',
padding: '10px',
marginRight: '10px'
}}
>
신용카드
</div>
<div
style={{
width: '15%',
height: '50px',
display: 'flex',
alignItems: 'center',
padding: '10px',
border: '1px solid #000',
marginRight: '10px'
}}
>
카카오페이
</div>
<div
style={{
width: '15%',
height: '50px',
display: 'flex',
alignItems: 'center',
padding: '10px',
border: '1px solid #000'
}}
>
계좌이체
</div>
</div>
<div
style={{
display: 'flex',
justifyContent: 'flex-start',
padding: '5px',
borderBottom: '1px solid #000'
}}
>
<div
style={{
width: '15%',
height: '50px',
display: 'flex',
justifyContent: 'center',
alignItems: 'center'
}}
>
결제 카드
</div>
<div
style={{
width: '15%',
height: '50px',
display: 'flex',
justifyContent: 'start',
alignItems: 'center',
marginRight: '10px'
}}
>
<select style={{ width: '400px',padding:'8px' }}>
<option>카드 선택</option>
</select>
</div>
<div
style={{
width: '15%',
height: '50px',
display: 'flex',
justifyContent: 'start',
alignItems: 'center',
marginRight: '10px'
}}
>
<select style={{ width: '400px',padding:'8px' }}>
<option>일시불</option>
</select>
</div>
</div>
<div
style={{
display: 'flex',
justifyContent: 'flex-start',
padding: '5px',
borderBottom: '1px solid #000',
backgroundColor: '#F2F2F2'
}}
>
<div
style={{
width: '15%',
height: '50px',
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
color: '#990033'
}}
>
총액
</div>
<div
style={{
width: '15%',
height: '50px',
display: 'flex',
justifyContent: 'start',
alignItems: 'center',
marginRight: '10px',
color: '#990033',
fontWeight: 'bold',
fontSize: '1.2rem'
}}
>
118,200 <span style={{ fontSize: '0.7rem' }}>KRW</span>
</div>
</div>
</div>
);
}

121
src/views/control/setting/steps/ReserveStep4.js

@ -0,0 +1,121 @@
import { Table } from 'reactstrap';
export default function ReserveStep4() {
return (
<div style={{ padding: '40px' }}>
<div
style={{
display: 'flex',
justifyContent: 'center',
fontSize: '1.5rem',
color: '#000',
fontWeight: 'bold',
marginBottom: '10px'
}}
>
항공교통 예약이 완료되었습니다.
</div>
<div
style={{
display: 'flex',
justifyContent: 'center',
backgroundColor: '#F2F2F2',
height: '70px',
alignItems: 'center',
fontSize: '1.2rem',
marginBottom: '10px'
}}
>
<div>
예약번호 :{' '}
<span style={{ color: '#990033', marginRight: '20px' }}>
452006915(Y08HR)
</span>
</div>
<div style={{ color: '#990033', marginRight: '20px' }}>|</div>
<div>
{' '}
예약일 :{' '}
<span style={{ color: '#990033', marginRight: '20px' }}>
2023.10.25()
</span>
</div>
</div>
<div style={{ fontSize: '1.2rem', fontWeight: 'bold' }}>항공 일정</div>
<Table bordered style={{ textAlign: 'center', marginBottom: '10px' }}>
<thead>
<tr>
<th>구간</th>
<th>편명</th>
<th>출발일시</th>
<th>도착일시</th>
<th>좌석수</th>
</tr>
</thead>
<tbody>
<tr>
<td>
{' '}
여정1
<br />
{'고양 킨텍스 -> 여의도 공원'}
</td>
<td>UAM123</td>
<td>2023.10.25() 08:40</td>
<td>2023.10.25() 10:45</td>
<td>1</td>
</tr>
<tr>
<td>
{' '}
여정1
<br />
{'여의도 공원 -> 고양 킨텍스'}
</td>
<td>UAM321</td>
<td>2023.10.28() 10:45</td>
<td>2023.10.28() 11:40</td>
<td>1</td>
</tr>
</tbody>
</Table>
<div style={{ fontSize: '1.2rem', fontWeight: 'bold' }}>예매자 정보</div>
<Table bordered style={{ textAlign: 'center', marginBottom: '10px' }}>
<thead>
<tr>
<th>연락처</th>
<th>이메일</th>
</tr>
</thead>
<tbody>
<tr>
<td>+82(대한민국) 010-8250-4456</td>
<td>kyw546@palnet.co.kr</td>
</tr>
</tbody>
</Table>
<div style={{ fontSize: '1.2rem', fontWeight: 'bold' }}>결제 내역</div>
<Table bordered style={{ textAlign: 'center', marginBottom: '10px' }}>
<thead>
<tr>
<th>결제수단</th>
<th>카드번호</th>
<th>할부개월</th>
<th>승인번호</th>
<th>결제금액</th>
<th>결제일</th>
</tr>
</thead>
<tbody>
<tr>
<td>신용카드</td>
<td>****_****_****_1234</td>
<td>일시불</td>
<td>123456789</td>
<td>118,200 KRW</td>
<td>2023.10.20 () 09:43 </td>
</tr>
</tbody>
</Table>
</div>
);
}

70
src/views/control/setting/steps/Step1.js

@ -0,0 +1,70 @@
import { XCircle, ArrowRight } from 'react-feather';
export default function Step1() {
return (
<div className='step-wrap'>
<div className='step-box'>
<div className='step-box-ti'>
<h5>출발지 선택</h5>
</div>
<div className='step-box-city'>
<ul className='step-box-city-list'>
<li className='step-city-ti'>아라뱃길</li>
<li>
<ul>
<li>드론시험 인증센터</li>
<li>계양 신도시</li>
</ul>
</li>
</ul>
<ul className='step-box-city-list'>
<li className='step-city-ti'>한강</li>
<li>
<ul>
<li>고양 킨텍스</li>
<li>김포공항</li>
<li>여의도 공원</li>
</ul>
</li>
</ul>
<ul className='step-box-city-list'>
<li className='step-city-ti'>탄천</li>
<li>
<ul>
<li>잠실한강공원</li>
<li>수서역</li>
</ul>
</li>
</ul>
</div>
</div>
<div className='step-box'>
<div className='step-box-ti'>
<h5>최근 조회하신 여정</h5>
</div>
<div className='search-box-city'>
<div className='search-city'>
<div>
<span>드론시험 인증센터</span>
<span className='arrow'><ArrowRight /></span>
<span>계양 신도시</span>
</div>
<div className='delete'>
<XCircle />
</div>
</div>
<div className='search-city'>
<div>
<span>드론시험 인증센터</span>
<span className='arrow'><ArrowRight /></span>
<span>계양 신도시</span>
</div>
<div className='delete'>
<XCircle />
</div>
</div>
</div>
</div>
</div>
);
}

41
src/views/control/setting/steps/Step2.js

@ -0,0 +1,41 @@
export default function Step2() {
return (
<div className='step-wrap'>
<div className='step-box'>
<div className='step-box-ti'>
<h5>도착지 선택</h5>
</div>
<div className='step-box-city'>
<ul className='step-box-city-list'>
<li className='step-city-ti'>아라뱃길</li>
<li>
<ul>
<li>드론시험 인증센터</li>
<li>계양 신도시</li>
</ul>
</li>
</ul>
<ul className='step-box-city-list'>
<li className='step-city-ti'>한강</li>
<li>
<ul>
<li>고양 킨텍스</li>
<li>김포공항</li>
<li>여의도 공원</li>
</ul>
</li>
</ul>
<ul className='step-box-city-list'>
<li className='step-city-ti'>탄천</li>
<li>
<ul>
<li>잠실한강공원</li>
<li>수서역</li>
</ul>
</li>
</ul>
</div>
</div>
</div>
);
}

32
src/views/control/setting/steps/Step3.js

@ -0,0 +1,32 @@
import '@styles/react/libs/flatpickr/flatpickr.scss';
import Flatpickr from 'react-flatpickr';
import { Button } from 'reactstrap';
export default function Step3() {
return (
<div className='step-wrap'>
<div className='step-box'>
<div className='step-box-ti'>
<h5>탑승일 선택</h5>
<Button size='sm'>초기화</Button>
</div>
<div className='calendar'>
<Flatpickr
// value={['2023-10-10', '2023-10-10']}
// className='hidden-input'
id='searchDate'
options={{
inline: true,
mode: 'range',
showMonths: 2,
wrap: true
}}
>
<input type='text' data-input style={{ display: 'none' }} />
</Flatpickr>
</div>
</div>
</div>
);
}

43
src/views/control/setting/steps/Step4.js

@ -0,0 +1,43 @@
import NumberInput from '@components/number-input'
import { Button, Label } from 'reactstrap'
export default function Step4({ setIsChoise }) {
return (
<div className='step-wrap'>
<div className='step-box'>
<div className='step-box-ti'>
<h5>탑승객 선택</h5>
</div>
<div className='passengers'>
<ul>
<li>
<div>
<h6>성인 ( 13 이상)</h6>
<div>
<NumberInput size='sm' id='min-max-number-input1' min={0} max={9} />
</div>
</div>
</li>
<li>
<div>
<h6>소아 ( 2 ~ 13 미만)</h6>
<div>
<NumberInput size='sm' id='min-max-number-input2' min={0} max={9} />
</div>
</div>
</li>
<li>
<div>
<h6>유아 ( 2 미만)</h6>
<div>
<NumberInput size='sm' id='min-max-number-input3' min={0} max={9} />
</div>
</div>
</li>
</ul>
</div>
</div>
<div className='finish-btn'><Button color='success' onClick={() => setIsChoise(true)}>선택 완료</Button></div>
</div>
);
}

19
src/views/control/setting/steps/index.js

@ -0,0 +1,19 @@
import Step1 from './Step1';
import Step2 from './Step2';
import Step3 from './Step3';
import Step4 from './Step4';
import ReserveStep1 from './ReserveStep1';
import ReserveStep2 from './ReserveStep2';
import ReserveStep3 from './ReserveStep3';
import ReserveStep4 from './ReserveStep4';
export {
Step1,
Step2,
Step3,
Step4,
ReserveStep1,
ReserveStep2,
ReserveStep3,
ReserveStep4
};

6
src/views/reservation/ReservationView.js

@ -0,0 +1,6 @@
import ControlReservation from '../control/setting/ControlReservation';
import '../../assets/css/custom.css';
export default function ReservationView() {
return <ControlReservation />;
}

12
test/pav-warning.js

@ -2,18 +2,20 @@ const { getConnection, writeData } = require('./pav-client');
const { getCoordsFormBetweenCoord, dumyData } = require('./pav-utils');
// const host = "192.168.0.24"
const host = 'localhost';
// const host = 'localhost';
// const host = '192.168.0.34';
// const port = 8082;
const host = '211.253.38.218';
const port = 8082;
// 기본정보
const prefix = 'PA';
const terminalId = 'SANDBOX-001';
const prefix = '';
const terminalId = '';
const pathSampleCoord = [
[37.5215, 126.605],
[37.5215, 126.61], //비정상, 날릴 것
// [37.5215, 126.6082], 계획서
// [37.5215, 126.61], //비정상, 날릴 것
[37.5215, 126.6082], //계획서
[37.521, 126.6082],
[37.521, 126.6057],
[37.5205, 126.6057],

Loading…
Cancel
Save