From dbfd0fd765886b4dae02192a5aaef141803d47cd Mon Sep 17 00:00:00 2001 From: Richard Park Date: Sat, 9 Nov 2019 21:56:11 +0900 Subject: [PATCH] initialized --- .editorconfig | 13 + .gitignore | 47 + .vscode/extensions.json | 11 + .vscode/launch.json | 7 + .vscode/settings.json | 14 + .vscode/tasks.json | 15 + README.md | 1 + angular.json | 1521 ++ config/enviroment.ts | 19 + config/main.webpack.config.ts | 111 + config/renderer.webpack.config.js | 18 + config/tsconfig.webpack.json | 6 + electron-builder.json | 40 + main/resources/image/128_128.png | Bin 0 -> 3840 bytes main/resources/image/16_16.png | Bin 0 -> 504 bytes main/resources/image/256_256.png | Bin 0 -> 7420 bytes main/resources/image/32_32.png | Bin 0 -> 897 bytes main/resources/image/48_48.png | Bin 0 -> 1392 bytes main/resources/image/64_64.png | Bin 0 -> 1966 bytes main/resources/image/ico_64_64.png | Bin 0 -> 3170 bytes main/resources/image/ico_64x64.ico | Bin 0 -> 119658 bytes main/resources/image/ico_64x64.png | Bin 0 -> 3170 bytes main/resources/image/ico_64x64_r.ico | Bin 0 -> 107599 bytes main/resources/image/ico_64x64_r.png | Bin 0 -> 1966 bytes main/resources/installer/woori.icns | Bin 0 -> 9859 bytes main/resources/installer/woori.ico | Bin 0 -> 32038 bytes main/resources/installer/woori_256x256.ico | Bin 0 -> 19986 bytes main/resources/installer/woori_256x256.png | Bin 0 -> 18495 bytes main/resources/linuxicon/256x256.png | Bin 0 -> 18495 bytes .../notification/image/btn_call_message.png | Bin 0 -> 1141 bytes .../notification/image/btn_call_receive.png | Bin 0 -> 842 bytes .../notification/image/btn_call_refuse.png | Bin 0 -> 643 bytes .../notification/image/btn_call_transfer.png | Bin 0 -> 1083 bytes .../notification/image/btn_close.png | Bin 0 -> 226 bytes .../notification/image/btn_close_gray.png | Bin 0 -> 3585 bytes .../notification/image/btn_noti_call.png | Bin 0 -> 5261 bytes .../notification/image/img_nophoto_50.png | Bin 0 -> 2348 bytes main/resources/notification/preload.js | 143 + .../notification/sound/messageAlarm.mp3 | Bin 0 -> 55968 bytes .../notification/styles/noti_messege.css | 130 + main/resources/notification/template.html | 50 + main/src/app/AppWindow.ts | 229 + main/src/crash/CrashWindow.ts | 0 main/src/crash/show-uncaught-exception.ts | 1 + main/src/global.d.ts | 18 + main/src/index.ts | 306 + main/src/lib/default-folder.ts | 37 + main/src/lib/file-util.ts | 222 + main/src/lib/idle-checker.ts | 72 + main/src/lib/storage.ts | 99 + main/src/lib/window-state.ts | 54 + main/src/util/now.ts | 4 + main/src/util/root.ts | 11 + main/tsconfig.main.json | 32 + package-lock.json | 16640 ++++++++++++++++ package.json | 116 + .../ucap-webmessenger-api-common/README.md | 24 + .../karma.conf.js | 32 + .../ng-package.json | 7 + .../ucap-webmessenger-api-common/package.json | 8 + .../src/lib/apis/file-profile-save.ts | 36 + .../src/lib/apis/file-talk-download.ts | 49 + .../src/lib/apis/file-talk-save.ts | 99 + .../src/lib/apis/file-talk-share.ts | 75 + .../src/lib/apis/mass-talk-download.ts | 56 + .../src/lib/apis/mass-talk-save.ts | 62 + .../src/lib/apis/trans-mass-talk-download.ts | 37 + .../src/lib/apis/trans-mass-talk-save.ts | 69 + .../src/lib/apis/translation-req.ts | 38 + .../src/lib/apis/translation-save.ts | 71 + .../src/lib/models/file-download-item.ts | 27 + .../src/lib/models/file-upload-item.ts | 41 + .../lib/services/common-api.service.spec.ts | 12 + .../src/lib/services/common-api.service.ts | 295 + .../src/lib/types/module-config.ts | 15 + .../src/lib/types/token.ts | 5 + .../src/lib/ucap-common-api.module.ts | 23 + .../src/public-api.ts | 23 + .../ucap-webmessenger-api-common/src/test.ts | 21 + .../tsconfig.lib.json | 26 + .../tsconfig.spec.json | 17 + .../ucap-webmessenger-api-common/tslint.json | 17 + .../ucap-webmessenger-api-external/README.md | 24 + .../karma.conf.js | 32 + .../ng-package.json | 7 + .../package.json | 8 + .../src/lib/apis/check-user-info-ex.ts | 39 + .../src/lib/apis/company-list.ts | 64 + .../src/lib/apis/token-update.ts | 43 + .../src/lib/apis/url-info.ts | 56 + .../src/lib/models/company.ts | 8 + .../lib/services/external-api.service.spec.ts | 12 + .../src/lib/services/external-api.service.ts | 92 + .../src/lib/types/module-config.ts | 8 + .../src/lib/types/token.ts | 5 + .../src/lib/ucap-external-api.module.ts | 23 + .../src/public-api.ts | 16 + .../src/test.ts | 21 + .../tsconfig.lib.json | 26 + .../tsconfig.spec.json | 17 + .../tslint.json | 17 + .../ucap-webmessenger-api-public/README.md | 24 + .../karma.conf.js | 32 + .../ng-package.json | 7 + .../ucap-webmessenger-api-public/package.json | 8 + .../src/lib/apis/update-info.ts | 40 + .../src/lib/apis/version-info2.ts | 73 + .../lib/services/public-api.service.spec.ts | 12 + .../src/lib/services/public-api.service.ts | 56 + .../src/lib/types/module-config.ts | 6 + .../src/lib/types/sync-mode.type.ts | 4 + .../src/lib/types/token.ts | 5 + .../src/lib/ucap-public-api.module.ts | 23 + .../src/public-api.ts | 13 + .../ucap-webmessenger-api-public/src/test.ts | 21 + .../tsconfig.lib.json | 26 + .../tsconfig.spec.json | 17 + .../ucap-webmessenger-api-public/tslint.json | 17 + projects/ucap-webmessenger-api/README.md | 24 + projects/ucap-webmessenger-api/karma.conf.js | 32 + .../ucap-webmessenger-api/ng-package.json | 7 + projects/ucap-webmessenger-api/package.json | 8 + .../ucap-webmessenger-api/src/lib/apis/api.ts | 19 + .../src/lib/types/status-code.type.ts | 4 + .../src/lib/utils/json.util.ts | 22 + .../src/lib/utils/parameter.util.ts | 67 + .../src/lib/utils/url.util.ts | 16 + .../ucap-webmessenger-api/src/public-api.ts | 11 + projects/ucap-webmessenger-api/src/test.ts | 21 + .../ucap-webmessenger-api/tsconfig.lib.json | 26 + .../ucap-webmessenger-api/tsconfig.spec.json | 17 + projects/ucap-webmessenger-api/tslint.json | 17 + projects/ucap-webmessenger-app/browserslist | 12 + .../e2e/protractor.conf.js | 32 + .../e2e/src/app.e2e-spec.ts | 23 + .../ucap-webmessenger-app/e2e/src/app.po.ts | 11 + .../ucap-webmessenger-app/e2e/tsconfig.json | 13 + projects/ucap-webmessenger-app/karma.conf.js | 32 + .../src/app/app-provider.module.ts | 31 + .../src/app/app-routing.module.ts | 35 + .../src/app/app-store.module.ts | 64 + .../src/app/app-translate.module.ts | 33 + .../src/app/app.component.html | 2 + .../src/app/app.component.scss | 4 + .../src/app/app.component.spec.ts | 35 + .../src/app/app.component.ts | 10 + .../src/app/app.module.ts | 118 + .../src/app/app.theme.scss | 126 + .../src/app/guards/auth.guard.ts | 41 + .../src/app/guards/index.ts | 3 + .../app/interceptors/loader.interceptor.ts | 34 + .../layouts/common/common.layout.module.ts | 28 + .../app/layouts/common/components/index.ts | 1 + .../dialogs/file-viewer.dialog.component.html | 11 + .../dialogs/file-viewer.dialog.component.scss | 0 .../file-viewer.dialog.component.spec.ts | 27 + .../dialogs/file-viewer.dialog.component.ts | 135 + .../src/app/layouts/common/dialogs/index.ts | 3 + .../app/layouts/messenger/components/index.ts | 15 + .../messenger/components/intro.component.html | 26 + .../messenger/components/intro.component.scss | 23 + .../components/intro.component.spec.ts | 24 + .../messenger/components/intro.component.ts | 14 + .../components/left-side.component.html | 96 + .../components/left-side.component.scss | 93 + .../components/left-side.component.spec.ts | 24 + .../components/left-side.component.ts | 243 + .../left-sidenav/call.component.html | 1 + .../left-sidenav/call.component.scss | 0 .../left-sidenav/call.component.spec.ts | 24 + .../components/left-sidenav/call.component.ts | 14 + .../left-sidenav/chat.component.html | 134 + .../left-sidenav/chat.component.scss | 84 + .../left-sidenav/chat.component.spec.ts | 24 + .../components/left-sidenav/chat.component.ts | 230 + .../left-sidenav/group.component.html | 189 + .../left-sidenav/group.component.scss | 39 + .../left-sidenav/group.component.spec.ts | 24 + .../left-sidenav/group.component.ts | 427 + .../components/left-sidenav/index.ts | 11 + .../left-sidenav/organization.component.html | 92 + .../left-sidenav/organization.component.scss | 120 + .../organization.component.spec.ts | 24 + .../left-sidenav/organization.component.ts | 290 + .../components/messages.component.html | 208 + .../components/messages.component.scss | 114 + .../components/messages.component.spec.ts | 24 + .../components/messages.component.ts | 893 + .../components/right-side.component.html | 3 + .../components/right-side.component.scss | 17 + .../components/right-side.component.spec.ts | 24 + .../components/right-side.component.ts | 14 + .../chat/create-chat.dialog.component.html | 174 + .../chat/create-chat.dialog.component.scss | 78 + .../chat/create-chat.dialog.component.spec.ts | 27 + .../chat/create-chat.dialog.component.ts | 468 + .../chat/edit-chat-room.dialog.component.html | 54 + .../chat/edit-chat-room.dialog.component.scss | 38 + .../edit-chat-room.dialog.component.spec.ts | 24 + .../chat/edit-chat-room.dialog.component.ts | 68 + .../layouts/messenger/dialogs/chat/index.ts | 4 + .../group/edit-group.dialog.component.html | 31 + .../group/edit-group.dialog.component.scss | 27 + .../group/edit-group.dialog.component.spec.ts | 24 + .../group/edit-group.dialog.component.ts | 45 + .../layouts/messenger/dialogs/group/index.ts | 4 + .../group/select-group.dialog.component.html | 84 + .../group/select-group.dialog.component.scss | 66 + .../select-group.dialog.component.spec.ts | 24 + .../group/select-group.dialog.component.ts | 124 + .../app/layouts/messenger/dialogs/index.ts | 4 + .../messenger/messenger.layout.module.ts | 89 + .../app/layouts/native/components/index.ts | 3 + .../native/components/top-bar.component.html | 54 + .../native/components/top-bar.component.scss | 92 + .../components/top-bar.component.spec.ts | 24 + .../native/components/top-bar.component.ts | 40 + .../layouts/native/native.layout.module.ts | 25 + .../account/account-routing.page.module.ts | 18 + .../app/pages/account/account.page.module.ts | 25 + .../src/app/pages/account/components/index.ts | 3 + .../components/login.page.component.html | 19 + .../components/login.page.component.scss | 14 + .../components/login.page.component.spec.ts | 12 + .../components/login.page.component.ts | 58 + .../app/pages/messenger/components/index.ts | 3 + .../components/main.page.component.html | 26 + .../components/main.page.component.scss | 29 + .../components/main.page.component.spec.ts | 12 + .../components/main.page.component.ts | 63 + .../messenger-routing.page.module.ts | 22 + .../pages/messenger/messenger.page.module.ts | 25 + .../app/pages/template/components/index.ts | 90 + .../components/template.page.component.html | 170 + .../components/template.page.component.scss | 4 + .../template.page.component.spec.ts | 27 + .../components/template.page.component.ts | 390 + .../template/template-routing.page.module.ts | 17 + .../pages/template/template.page.module.ts | 34 + .../src/app/resolvers/index.ts | 3 + .../src/app/resolvers/messenger.resolver.ts | 200 + .../src/app/services/app.service.ts | 44 + .../app/services/authentication.service.ts | 49 + .../src/app/services/index.ts | 11 + .../src/app/services/loader.service.ts | 18 + .../src/app/services/notification.service.ts | 454 + .../store/account/authentication/actions.ts | 102 + .../store/account/authentication/effects.ts | 288 + .../app/store/account/authentication/index.ts | 4 + .../store/account/authentication/reducers.ts | 13 + .../app/store/account/authentication/state.ts | 20 + .../src/app/store/account/index.ts | 40 + .../src/app/store/account/info/actions.ts | 8 + .../src/app/store/account/info/effects.ts | 29 + .../src/app/store/account/info/index.ts | 4 + .../src/app/store/account/info/reducers.ts | 4 + .../src/app/store/account/info/state.ts | 9 + .../src/app/store/index.ts | 74 + .../src/app/store/messenger/chat/actions.ts | 45 + .../src/app/store/messenger/chat/effects.ts | 99 + .../src/app/store/messenger/chat/index.ts | 4 + .../src/app/store/messenger/chat/reducers.ts | 53 + .../src/app/store/messenger/chat/state.ts | 27 + .../src/app/store/messenger/event/actions.ts | 193 + .../src/app/store/messenger/event/effects.ts | 591 + .../src/app/store/messenger/event/index.ts | 4 + .../src/app/store/messenger/event/reducers.ts | 113 + .../src/app/store/messenger/event/state.ts | 80 + .../src/app/store/messenger/index.ts | 89 + .../src/app/store/messenger/option/actions.ts | 38 + .../src/app/store/messenger/option/effects.ts | 19 + .../src/app/store/messenger/option/index.ts | 4 + .../app/store/messenger/option/reducers.ts | 25 + .../src/app/store/messenger/option/state.ts | 19 + .../src/app/store/messenger/query/actions.ts | 56 + .../src/app/store/messenger/query/effects.ts | 108 + .../src/app/store/messenger/query/index.ts | 4 + .../src/app/store/messenger/query/reducers.ts | 57 + .../src/app/store/messenger/query/state.ts | 50 + .../src/app/store/messenger/room/actions.ts | 165 + .../src/app/store/messenger/room/effects.ts | 353 + .../src/app/store/messenger/room/index.ts | 4 + .../src/app/store/messenger/room/reducers.ts | 71 + .../src/app/store/messenger/room/state.ts | 77 + .../src/app/store/messenger/status/actions.ts | 26 + .../src/app/store/messenger/status/effects.ts | 93 + .../src/app/store/messenger/status/index.ts | 4 + .../app/store/messenger/status/reducers.ts | 50 + .../src/app/store/messenger/status/state.ts | 52 + .../src/app/store/messenger/sync/actions.ts | 235 + .../src/app/store/messenger/sync/effects.ts | 775 + .../src/app/store/messenger/sync/index.ts | 4 + .../src/app/store/messenger/sync/reducers.ts | 287 + .../src/app/store/messenger/sync/state.ts | 199 + .../src/app/store/setting/company/actions.ts | 21 + .../src/app/store/setting/company/effects.ts | 41 + .../src/app/store/setting/company/index.ts | 4 + .../src/app/store/setting/company/reducers.ts | 13 + .../src/app/store/setting/company/state.ts | 19 + .../src/app/store/setting/index.ts | 49 + .../src/app/store/setting/init/actions.ts | 3 + .../src/app/store/setting/init/effects.ts | 6 + .../src/app/store/setting/init/index.ts | 4 + .../src/app/store/setting/init/reducers.ts | 4 + .../src/app/store/setting/init/state.ts | 10 + .../app/store/setting/version-info/actions.ts | 21 + .../app/store/setting/version-info/effects.ts | 49 + .../app/store/setting/version-info/index.ts | 4 + .../store/setting/version-info/reducers.ts | 23 + .../app/store/setting/version-info/state.ts | 49 + .../src/app/types/environment.type.ts | 7 + .../src/app/types/index.ts | 3 + .../src/app/types/login-info.type.ts | 12 + .../src/app/types/login-res-info.type.ts | 1 + .../src/app/types/userselect.dialog.type.ts | 12 + .../src/app/types/ver-info.type.ts | 1 + .../ucap-webmessenger-app/src/assets/.gitkeep | 0 .../src/assets/i18n/en.json | 1 + .../src/assets/i18n/ko.json | 1 + .../src/assets/images/bg_login.png | Bin 0 -> 278524 bytes .../src/assets/images/file/icon_talk_doc.png | Bin 0 -> 21753 bytes .../assets/images/file/icon_talk_doc_d.png | Bin 0 -> 21671 bytes .../src/assets/images/file/icon_talk_exe.png | Bin 0 -> 22012 bytes .../assets/images/file/icon_talk_exe_d.png | Bin 0 -> 21798 bytes .../src/assets/images/file/icon_talk_file.png | Bin 0 -> 21357 bytes .../assets/images/file/icon_talk_file_d.png | Bin 0 -> 21807 bytes .../src/assets/images/file/icon_talk_hwp.png | Bin 0 -> 21762 bytes .../assets/images/file/icon_talk_hwp_d.png | Bin 0 -> 21687 bytes .../src/assets/images/file/icon_talk_img.png | Bin 0 -> 21262 bytes .../assets/images/file/icon_talk_img_d.png | Bin 0 -> 21194 bytes .../src/assets/images/file/icon_talk_ppt.png | Bin 0 -> 21586 bytes .../assets/images/file/icon_talk_ppt_d.png | Bin 0 -> 21524 bytes .../assets/images/file/icon_talk_video.png | Bin 0 -> 1921 bytes .../assets/images/file/icon_talk_video_d.png | Bin 0 -> 20853 bytes .../src/assets/images/file/icon_talk_xls.png | Bin 0 -> 21681 bytes .../assets/images/file/icon_talk_xls_d.png | Bin 0 -> 21634 bytes .../src/assets/images/file/icon_talk_zip.png | Bin 0 -> 21425 bytes .../assets/images/file/icon_talk_zip_d.png | Bin 0 -> 21435 bytes .../icons/material/material-outline-icons.svg | 2037 ++ .../icons/material/material-outline-icons.ttf | Bin 0 -> 199416 bytes .../material/material-outline-icons.woff | Bin 0 -> 199496 bytes .../assets/images/icons/material/style.css | 3074 +++ .../src/assets/images/img_groupphoto_36.png | Bin 0 -> 1791 bytes .../src/assets/images/img_groupphoto_80.png | Bin 0 -> 5259 bytes .../src/assets/images/img_nophoto_30.png | Bin 0 -> 1331 bytes .../src/assets/images/img_nophoto_36.png | Bin 0 -> 1628 bytes .../src/assets/images/img_nophoto_50.png | Bin 0 -> 2348 bytes .../src/assets/images/img_nophoto_70.png | Bin 0 -> 3501 bytes .../src/assets/images/img_nophoto_88.png | Bin 0 -> 4573 bytes .../src/assets/images/logo/ico_64x64.png | Bin 0 -> 3170 bytes .../src/assets/scss/global/_default.scss | 152 + .../assets/scss/partials/_material-ui.scss | 0 .../src/assets/scss/ucap.scss | 11 + .../src/assets/sticker/sticker_cate00.png | Bin 0 -> 3571 bytes .../src/assets/sticker/sticker_cate00_f.png | Bin 0 -> 2980 bytes .../src/assets/sticker/sticker_cate01.png | Bin 0 -> 3845 bytes .../src/assets/sticker/sticker_cate01_f.png | Bin 0 -> 4476 bytes .../src/assets/sticker/sticker_cate02.png | Bin 0 -> 3967 bytes .../src/assets/sticker/sticker_cate02_f.png | Bin 0 -> 4605 bytes .../src/assets/sticker/sticker_cate03.png | Bin 0 -> 4095 bytes .../src/assets/sticker/sticker_cate03_f.png | Bin 0 -> 4616 bytes .../src/assets/sticker/sticker_cate04.png | Bin 0 -> 3757 bytes .../src/assets/sticker/sticker_cate04_f.png | Bin 0 -> 4488 bytes .../src/assets/sticker/sticker_cate05.png | Bin 0 -> 3572 bytes .../src/assets/sticker/sticker_cate05_f.png | Bin 0 -> 4453 bytes .../src/assets/sticker/sticker_default.png | Bin 0 -> 3714 bytes .../src/assets/sticker/sticker_s_01_01.png | Bin 0 -> 9022 bytes .../src/assets/sticker/sticker_s_01_02.png | Bin 0 -> 8914 bytes .../src/assets/sticker/sticker_s_01_03.png | Bin 0 -> 7871 bytes .../src/assets/sticker/sticker_s_01_04.png | Bin 0 -> 8502 bytes .../src/assets/sticker/sticker_s_01_05.png | Bin 0 -> 9143 bytes .../src/assets/sticker/sticker_s_01_06.png | Bin 0 -> 6780 bytes .../src/assets/sticker/sticker_s_01_07.png | Bin 0 -> 9044 bytes .../src/assets/sticker/sticker_s_01_08.png | Bin 0 -> 9976 bytes .../src/assets/sticker/sticker_s_02_01.png | Bin 0 -> 10607 bytes .../src/assets/sticker/sticker_s_02_02.png | Bin 0 -> 8720 bytes .../src/assets/sticker/sticker_s_02_03.png | Bin 0 -> 8912 bytes .../src/assets/sticker/sticker_s_02_04.png | Bin 0 -> 9452 bytes .../src/assets/sticker/sticker_s_02_05.png | Bin 0 -> 8937 bytes .../src/assets/sticker/sticker_s_02_06.png | Bin 0 -> 9359 bytes .../src/assets/sticker/sticker_s_02_07.png | Bin 0 -> 10473 bytes .../src/assets/sticker/sticker_s_02_08.png | Bin 0 -> 8947 bytes .../src/assets/sticker/sticker_s_03_01.png | Bin 0 -> 8673 bytes .../src/assets/sticker/sticker_s_03_02.png | Bin 0 -> 7426 bytes .../src/assets/sticker/sticker_s_03_03.png | Bin 0 -> 9353 bytes .../src/assets/sticker/sticker_s_03_04.png | Bin 0 -> 8551 bytes .../src/assets/sticker/sticker_s_03_05.png | Bin 0 -> 8099 bytes .../src/assets/sticker/sticker_s_03_06.png | Bin 0 -> 7951 bytes .../src/assets/sticker/sticker_s_03_07.png | Bin 0 -> 9823 bytes .../src/assets/sticker/sticker_s_03_08.png | Bin 0 -> 7768 bytes .../src/assets/sticker/sticker_s_04_01.png | Bin 0 -> 8327 bytes .../src/assets/sticker/sticker_s_04_02.png | Bin 0 -> 9044 bytes .../src/assets/sticker/sticker_s_04_03.png | Bin 0 -> 9914 bytes .../src/assets/sticker/sticker_s_04_04.png | Bin 0 -> 10070 bytes .../src/assets/sticker/sticker_s_04_05.png | Bin 0 -> 8643 bytes .../src/assets/sticker/sticker_s_04_06.png | Bin 0 -> 8801 bytes .../src/assets/sticker/sticker_s_04_07.png | Bin 0 -> 10379 bytes .../src/assets/sticker/sticker_s_04_08.png | Bin 0 -> 9193 bytes .../src/assets/sticker/sticker_s_05_01.png | Bin 0 -> 7758 bytes .../src/assets/sticker/sticker_s_05_02.png | Bin 0 -> 7690 bytes .../src/assets/sticker/sticker_s_05_03.png | Bin 0 -> 7459 bytes .../src/assets/sticker/sticker_s_05_04.png | Bin 0 -> 8482 bytes .../src/assets/sticker/sticker_s_05_05.png | Bin 0 -> 8226 bytes .../src/assets/sticker/sticker_s_05_06.png | Bin 0 -> 7916 bytes .../src/assets/sticker/sticker_s_05_07.png | Bin 0 -> 8576 bytes .../src/assets/sticker/sticker_s_05_08.png | Bin 0 -> 9448 bytes .../src/assets/sticker/sticker_s_05_09.png | Bin 0 -> 8213 bytes .../src/assets/sticker/sticker_s_05_10.png | Bin 0 -> 7150 bytes .../src/assets/sticker/sticker_s_05_11.png | Bin 0 -> 7993 bytes .../src/assets/sticker/sticker_s_05_12.png | Bin 0 -> 6866 bytes .../src/assets/sticker/sticker_s_05_13.png | Bin 0 -> 7110 bytes .../src/assets/sticker/sticker_s_05_14.png | Bin 0 -> 7973 bytes .../src/assets/sticker/sticker_s_05_15.png | Bin 0 -> 7227 bytes .../src/assets/sticker/sticker_s_05_16.png | Bin 0 -> 6808 bytes .../src/environments/environment.prod.ts | 3 + .../src/environments/environment.ts | 16 + .../src/environments/environment.type.ts | 485 + .../ucap-webmessenger-app/src/favicon.ico | Bin 0 -> 948 bytes projects/ucap-webmessenger-app/src/index.html | 14 + projects/ucap-webmessenger-app/src/main.ts | 15 + .../ucap-webmessenger-app/src/polyfills.ts | 63 + .../ucap-webmessenger-app/src/styles.scss | 6 + projects/ucap-webmessenger-app/src/test.ts | 20 + .../ucap-webmessenger-app/tsconfig.app.json | 14 + .../ucap-webmessenger-app/tsconfig.spec.json | 18 + projects/ucap-webmessenger-app/tslint.json | 17 + projects/ucap-webmessenger-core/README.md | 24 + projects/ucap-webmessenger-core/karma.conf.js | 32 + .../ucap-webmessenger-core/ng-package.json | 7 + projects/ucap-webmessenger-core/package.json | 4 + .../src/lib/types/app-type.type.ts | 3 + .../src/lib/types/call-alarm.type.ts | 5 + .../src/lib/types/call-forward.type.ts | 5 + .../src/lib/types/call-mode.type.ts | 5 + .../src/lib/types/caller-type.type.ts | 4 + .../src/lib/types/const.type.ts | 10 + .../src/lib/types/default-screen.type.ts | 4 + .../src/lib/types/device-devision.type.ts | 4 + .../src/lib/types/device-type.type.ts | 9 + .../types/file-transfer-permissions.type.ts | 7 + .../src/lib/types/locale-code.type.ts | 6 + .../src/lib/types/notification-method.type.ts | 5 + .../organization-chart-permissions.type.ts | 5 + .../src/lib/types/push-type.type.ts | 5 + .../src/lib/types/status-code.type.ts | 13 + .../src/lib/types/status-type.type.ts | 7 + .../lib/types/video-conference-type.type.ts | 4 + .../src/lib/utils/file.util.ts | 149 + .../src/lib/utils/mime.util.ts | 874 + .../src/lib/utils/string.util.ts | 1 + .../ucap-webmessenger-core/src/public-api.ts | 25 + projects/ucap-webmessenger-core/src/test.ts | 21 + .../ucap-webmessenger-core/tsconfig.lib.json | 26 + .../ucap-webmessenger-core/tsconfig.spec.json | 17 + projects/ucap-webmessenger-core/tslint.json | 17 + .../ucap-webmessenger-electron-core/README.md | 24 + .../karma.conf.js | 32 + .../ng-package.json | 7 + .../package.json | 8 + .../src/lib/types/channel.type.ts | 37 + .../src/public-api.ts | 5 + .../src/test.ts | 21 + .../tsconfig.lib.json | 26 + .../tsconfig.spec.json | 17 + .../tslint.json | 17 + .../README.md | 24 + .../karma.conf.js | 32 + .../ng-package.json | 7 + .../package.json | 5 + .../models/electron-notification-options.ts | 113 + .../src/lib/models/electron-notification.ts | 20 + .../services/electron-notification.service.ts | 455 + .../src/lib/types/channel.type.ts | 7 + .../src/lib/types/event.type.ts | 5 + .../src/lib/utils/animation-queue.ts | 42 + .../src/public-api.ts | 13 + .../src/test.ts | 21 + .../tsconfig.lib.json | 26 + .../tsconfig.spec.json | 17 + .../tslint.json | 17 + .../README.md | 24 + .../karma.conf.js | 32 + .../ng-package.json | 7 + .../package.json | 8 + .../services/browser-native.service.spec.ts | 3 + .../lib/services/browser-native.service.ts | 77 + .../src/lib/translate/browser-loader.ts | 27 + .../src/public-api.ts | 7 + .../src/test.ts | 21 + .../tsconfig.lib.json | 26 + .../tsconfig.spec.json | 17 + .../tslint.json | 17 + .../README.md | 24 + .../karma.conf.js | 32 + .../ng-package.json | 7 + .../package.json | 8 + .../services/electron-native.service.spec.ts | 3 + .../lib/services/electron-native.service.ts | 149 + .../src/lib/translate/electron-loader.ts | 26 + .../src/lib/types/channel.type.ts | 23 + .../src/public-api.ts | 9 + .../src/test.ts | 21 + .../tsconfig.lib.json | 26 + .../tsconfig.spec.json | 17 + .../tslint.json | 17 + projects/ucap-webmessenger-native/README.md | 24 + .../ucap-webmessenger-native/karma.conf.js | 32 + .../ucap-webmessenger-native/ng-package.json | 7 + .../ucap-webmessenger-native/package.json | 8 + .../src/lib/models/notification.ts | 8 + .../src/lib/services/native.service.ts | 24 + .../src/lib/types/token.ts | 7 + .../src/lib/types/window-idle.type.ts | 4 + .../src/lib/types/window-state.type.ts | 7 + .../src/lib/ucap-native.module.ts | 8 + .../src/public-api.ts | 13 + projects/ucap-webmessenger-native/src/test.ts | 21 + .../tsconfig.lib.json | 26 + .../tsconfig.spec.json | 17 + projects/ucap-webmessenger-native/tslint.json | 17 + projects/ucap-webmessenger-pi/README.md | 24 + projects/ucap-webmessenger-pi/karma.conf.js | 32 + projects/ucap-webmessenger-pi/ng-package.json | 7 + projects/ucap-webmessenger-pi/package.json | 8 + .../src/lib/apis/login2.ts | 43 + .../ucap-webmessenger-pi/src/lib/apis/pi.ts | 9 + .../src/lib/apis/privacy-total.ts | 27 + .../src/lib/apis/user-terms-action.ts | 37 + .../src/lib/services/pi.service.spec.ts | 12 + .../src/lib/services/pi.service.ts | 72 + .../src/lib/types/module-config.ts | 24 + .../src/lib/types/response-status.type.ts | 4 + .../src/lib/types/token.ts | 5 + .../src/lib/ucap-pi.module.ts | 23 + .../ucap-webmessenger-pi/src/public-api.ts | 16 + projects/ucap-webmessenger-pi/src/test.ts | 21 + .../ucap-webmessenger-pi/tsconfig.lib.json | 26 + .../ucap-webmessenger-pi/tsconfig.spec.json | 17 + projects/ucap-webmessenger-pi/tslint.json | 17 + .../README.md | 24 + .../karma.conf.js | 32 + .../ng-package.json | 7 + .../package.json | 8 + .../src/lib/models/user-info.ts | 51 + .../src/lib/protocols/fmc.ts | 16 + .../src/lib/protocols/login.ts | 199 + .../src/lib/protocols/logout-remote.ts | 53 + .../src/lib/protocols/logout.ts | 32 + .../authentication-protocol.service.spec.ts | 14 + .../authentication-protocol.service.ts | 110 + .../src/lib/types/role-code.ts | 8 + .../src/lib/types/service.ts | 12 + .../src/lib/types/sso-mode.ts | 6 + .../ucap-authentication-protocol.module.ts | 21 + .../src/public-api.ts | 18 + .../src/test.ts | 21 + .../tsconfig.lib.json | 26 + .../tsconfig.spec.json | 17 + .../tslint.json | 17 + .../README.md | 24 + .../karma.conf.js | 32 + .../ng-package.json | 7 + .../package.json | 8 + .../src/lib/protocols/add.ts | 55 + .../src/lib/protocols/del.ts | 55 + .../src/lib/protocols/update.ts | 65 + .../services/buddy-protocol.service.spec.ts | 12 + .../lib/services/buddy-protocol.service.ts | 113 + .../src/lib/types/service.ts | 7 + .../src/lib/ucap-buddy-protocol.module.ts | 19 + .../src/public-api.ts | 12 + .../src/test.ts | 21 + .../tsconfig.lib.json | 26 + .../tsconfig.spec.json | 17 + .../tslint.json | 17 + .../README.md | 24 + .../karma.conf.js | 32 + .../ng-package.json | 7 + .../package.json | 8 + .../src/lib/models/info.ts | 34 + .../src/lib/protocols/cancel.ts | 68 + .../src/lib/protocols/del.ts | 56 + .../event-json/character.event-json.ts | 9 + .../src/lib/protocols/event-json/codec.ts | 124 + .../lib/protocols/event-json/event-json.ts | 1 + .../protocols/event-json/exit.event-json.ts | 9 + .../protocols/event-json/file.event-json.ts | 52 + ...guide-for-room-timer-changed.event-json.ts | 17 + .../protocols/event-json/join.event-json.ts | 17 + .../protocols/event-json/link.event-json.ts | 9 + .../event-json/mass-text.event-json.ts | 33 + .../event-json/mass-translation.event-json.ts | 37 + .../notification-for-timer-room.event-json.ts | 9 + .../protocols/event-json/plan.event-json.ts | 30 + .../event-json/recalled-message.event-json.ts | 9 + .../event-json/rename-room.event-json.ts | 15 + .../event-json/sticker.event-json.ts | 19 + .../event-json/translation.event-json.ts | 27 + .../event-json/video-conference.event-json.ts | 32 + .../event-json/video-streamming.event-json.ts | 9 + .../src/lib/protocols/info.ts | 89 + .../src/lib/protocols/push.ts | 42 + .../src/lib/protocols/read.ts | 56 + .../src/lib/protocols/send.ts | 151 + .../services/event-protocol.service.spec.ts | 12 + .../lib/services/event-protocol.service.ts | 194 + .../src/lib/types/event.type.ts | 48 + .../src/lib/types/push-cl.type.ts | 9 + .../src/lib/types/push-status.type.ts | 7 + .../src/lib/types/service.ts | 39 + .../src/lib/ucap-event-protocol.module.ts | 19 + .../src/public-api.ts | 42 + .../src/test.ts | 21 + .../tsconfig.lib.json | 26 + .../tsconfig.spec.json | 17 + .../tslint.json | 17 + .../ucap-webmessenger-protocol-file/README.md | 24 + .../karma.conf.js | 32 + .../ng-package.json | 7 + .../package.json | 8 + .../src/lib/models/file-download-info.ts | 14 + .../src/lib/models/file-info.ts | 26 + .../src/lib/protocols/down-check.ts | 38 + .../src/lib/protocols/info.ts | 105 + .../services/file-protocol.service.spec.ts | 12 + .../src/lib/services/file-protocol.service.ts | 70 + .../src/lib/types/file.type.ts | 12 + .../src/lib/types/service.ts | 7 + .../src/lib/ucap-file-protocol.module.ts | 19 + .../src/public-api.ts | 16 + .../src/test.ts | 21 + .../tsconfig.lib.json | 26 + .../tsconfig.spec.json | 17 + .../tslint.json | 17 + .../ucap-webmessenger-protocol-fmc/README.md | 24 + .../karma.conf.js | 32 + .../ng-package.json | 7 + .../package.json | 8 + .../lib/services/fmc-protocol.service.spec.ts | 12 + .../src/lib/services/fmc-protocol.service.ts | 8 + .../src/lib/ucap-fmc-protocol.module.ts | 19 + .../src/public-api.ts | 7 + .../src/test.ts | 21 + .../tsconfig.lib.json | 26 + .../tsconfig.spec.json | 17 + .../tslint.json | 17 + .../README.md | 24 + .../karma.conf.js | 32 + .../ng-package.json | 7 + .../package.json | 8 + .../src/lib/protocols/add.ts | 57 + .../src/lib/protocols/del.ts | 51 + .../src/lib/protocols/update.ts | 117 + .../services/group-protocol.service.spec.ts | 12 + .../lib/services/group-protocol.service.ts | 125 + .../src/lib/types/service.ts | 9 + .../src/lib/ucap-group-protocol.module.ts | 19 + .../src/public-api.ts | 12 + .../src/test.ts | 21 + .../tsconfig.lib.json | 26 + .../tsconfig.spec.json | 17 + .../tslint.json | 17 + .../ucap-webmessenger-protocol-info/README.md | 24 + .../karma.conf.js | 32 + .../ng-package.json | 7 + .../package.json | 8 + .../src/lib/protocols/status.ts | 58 + .../src/lib/protocols/user-option.ts | 51 + .../src/lib/protocols/user.ts | 63 + .../services/info-protocol.service.spec.ts | 12 + .../src/lib/services/info-protocol.service.ts | 111 + .../src/lib/types/service.ts | 14 + .../src/lib/types/user-info-update.type.ts | 13 + .../src/lib/ucap-info-protocol.module.ts | 19 + .../src/public-api.ts | 14 + .../src/test.ts | 21 + .../tsconfig.lib.json | 26 + .../tsconfig.spec.json | 17 + .../tslint.json | 17 + .../README.md | 25 + .../karma.conf.js | 35 + .../ng-package.json | 7 + .../package.json | 8 + .../src/lib/protocols/conn.ts | 27 + .../services/inner-protocol.service.spec.ts | 12 + .../lib/services/inner-protocol.service.ts | 30 + .../src/lib/types/service.ts | 4 + .../src/lib/ucap-inner-protocol.module.ts | 19 + .../src/public-api.ts | 11 + .../src/test.ts | 21 + .../tsconfig.lib.json | 26 + .../tsconfig.spec.json | 17 + .../tslint.json | 7 + .../README.md | 24 + .../karma.conf.js | 32 + .../ng-package.json | 7 + .../package.json | 8 + .../src/lib/protocols/call-update.ts | 137 + .../src/lib/protocols/call-view.ts | 69 + .../src/lib/protocols/reg-update.ts | 153 + .../src/lib/protocols/reg-view.ts | 71 + .../src/lib/protocols/update.ts | 68 + .../src/lib/protocols/view.ts | 40 + .../services/option-protocol.service.spec.ts | 12 + .../lib/services/option-protocol.service.ts | 128 + .../src/lib/types/service.ts | 18 + .../src/lib/ucap-option-protocol.module.ts | 19 + .../src/public-api.ts | 16 + .../src/test.ts | 21 + .../tsconfig.lib.json | 26 + .../tsconfig.spec.json | 17 + .../tslint.json | 17 + .../ucap-webmessenger-protocol-ping/README.md | 24 + .../karma.conf.js | 32 + .../ng-package.json | 7 + .../package.json | 8 + .../src/lib/protocols/ping.ts | 35 + .../services/ping-protocol.service.spec.ts | 12 + .../src/lib/services/ping-protocol.service.ts | 29 + .../src/lib/types/service.ts | 4 + .../src/lib/ucap-ping-protocol.module.ts | 19 + .../src/public-api.ts | 11 + .../src/test.ts | 21 + .../tsconfig.lib.json | 26 + .../tsconfig.spec.json | 17 + .../tslint.json | 17 + .../README.md | 24 + .../karma.conf.js | 32 + .../ng-package.json | 7 + .../package.json | 8 + .../src/lib/models/dept-info.ts | 26 + .../src/lib/models/user-info-dn.ts | 52 + .../src/lib/models/user-info-f.ts | 63 + .../src/lib/models/user-info-ss.ts | 64 + .../src/lib/models/user-seq-info.ts | 10 + .../src/lib/protocols/auth.ts | 122 + .../src/lib/protocols/data-user-ext.ts | 55 + .../src/lib/protocols/data-user.ts | 90 + .../src/lib/protocols/dept-user.ts | 134 + .../src/lib/protocols/dept.ts | 72 + .../src/lib/protocols/user-dn.ts | 130 + .../src/lib/protocols/user-id.ts | 77 + .../src/lib/protocols/user-seq.ts | 159 + .../services/query-protocol.service.spec.ts | 12 + .../lib/services/query-protocol.service.ts | 253 + .../src/lib/types/dept-search.type.ts | 10 + .../src/lib/types/dept.type.ts | 8 + .../src/lib/types/service.ts | 37 + .../src/lib/types/user-dn-search.type.ts | 6 + .../src/lib/ucap-query-protocol.module.ts | 19 + .../src/public-api.ts | 27 + .../src/test.ts | 21 + .../tsconfig.lib.json | 26 + .../tsconfig.spec.json | 17 + .../tslint.json | 17 + .../ucap-webmessenger-protocol-room/README.md | 24 + .../karma.conf.js | 32 + .../ng-package.json | 7 + .../package.json | 8 + .../src/lib/models/room-info.ts | 31 + .../src/lib/models/user-info-short.ts | 32 + .../src/lib/models/user-info.ts | 65 + .../src/lib/protocols/exit.ts | 151 + .../src/lib/protocols/info.ts | 214 + .../src/lib/protocols/invite.ts | 56 + .../src/lib/protocols/open.ts | 225 + .../src/lib/protocols/update.ts | 175 + .../services/room-protocol.service.spec.ts | 12 + .../src/lib/services/room-protocol.service.ts | 332 + .../src/lib/types/employee.type.ts | 8 + .../src/lib/types/room.type.ts | 54 + .../src/lib/types/service.ts | 43 + .../src/lib/ucap-room-protocol.module.ts | 19 + .../src/public-api.ts | 21 + .../src/test.ts | 21 + .../tsconfig.lib.json | 26 + .../tsconfig.spec.json | 17 + .../tslint.json | 17 + .../README.md | 24 + .../karma.conf.js | 32 + .../ng-package.json | 7 + .../package.json | 8 + .../src/lib/protocols/password-set.ts | 55 + .../services/service-protocol.service.spec.ts | 12 + .../lib/services/service-protocol.service.ts | 36 + .../src/lib/types/service.ts | 25 + .../src/lib/ucap-service-protocol.module.ts | 19 + .../src/public-api.ts | 11 + .../src/test.ts | 21 + .../tsconfig.lib.json | 26 + .../tsconfig.spec.json | 17 + .../tslint.json | 17 + .../README.md | 24 + .../karma.conf.js | 32 + .../ng-package.json | 7 + .../package.json | 8 + .../src/lib/models/status-bulk-info.ts | 21 + .../src/lib/models/status-info.ts | 20 + .../src/lib/protocols/buddy.ts | 36 + .../src/lib/protocols/bulk-info.ts | 82 + .../src/lib/protocols/message-update.ts | 46 + .../src/lib/protocols/status.ts | 79 + .../src/lib/protocols/subscribe.ts | 92 + .../src/lib/protocols/unsubscribe.ts | 29 + .../services/status-protocol.service.spec.ts | 12 + .../lib/services/status-protocol.service.ts | 179 + .../src/lib/types/message-index.type.ts | 5 + .../src/lib/types/service.ts | 18 + .../src/lib/types/terminal-status.type.ts | 25 + .../src/lib/ucap-status-protocol.module.ts | 19 + .../src/public-api.ts | 20 + .../src/test.ts | 21 + .../tsconfig.lib.json | 26 + .../tsconfig.spec.json | 17 + .../tslint.json | 17 + .../ucap-webmessenger-protocol-sync/README.md | 24 + .../karma.conf.js | 32 + .../ng-package.json | 7 + .../package.json | 8 + .../src/lib/models/buddy-info.ts | 8 + .../src/lib/models/group-info.ts | 10 + .../src/lib/protocols/buddy.ts | 113 + .../src/lib/protocols/group.ts | 94 + .../src/lib/protocols/room.ts | 176 + .../services/sync-protocol.service.spec.ts | 12 + .../src/lib/services/sync-protocol.service.ts | 184 + .../src/lib/types/service.ts | 27 + .../src/lib/types/userInfo.ts | 63 + .../src/lib/ucap-sync-protocol.module.ts | 19 + .../src/public-api.ts | 17 + .../src/test.ts | 21 + .../tsconfig.lib.json | 26 + .../tsconfig.spec.json | 17 + .../tslint.json | 17 + .../ucap-webmessenger-protocol-ucti/README.md | 24 + .../karma.conf.js | 32 + .../ng-package.json | 7 + .../package.json | 8 + .../services/ucti-protocol.service.spec.ts | 12 + .../src/lib/services/ucti-protocol.service.ts | 8 + .../src/lib/ucap-ucti-protocol.module.ts | 19 + .../src/public-api.ts | 7 + .../src/test.ts | 21 + .../tsconfig.lib.json | 26 + .../tsconfig.spec.json | 17 + .../tslint.json | 17 + .../ucap-webmessenger-protocol-umg/README.md | 24 + .../karma.conf.js | 32 + .../ng-package.json | 7 + .../package.json | 8 + .../lib/services/umg-protocol.service.spec.ts | 12 + .../src/lib/services/umg-protocol.service.ts | 8 + .../src/lib/ucap-umg-protocol.module.ts | 19 + .../src/public-api.ts | 7 + .../src/test.ts | 21 + .../tsconfig.lib.json | 26 + .../tsconfig.spec.json | 17 + .../tslint.json | 17 + projects/ucap-webmessenger-protocol/README.md | 24 + .../ucap-webmessenger-protocol/karma.conf.js | 32 + .../ng-package.json | 7 + .../ucap-webmessenger-protocol/package.json | 8 + .../src/lib/protocols/packet.ts | 6 + .../src/lib/protocols/protocol.ts | 46 + .../src/lib/services/protocol.service.spec.ts | 12 + .../src/lib/services/protocol.service.ts | 346 + .../src/lib/types/module-config.ts | 12 + .../src/lib/types/packet-body-divider.ts | 4 + .../src/lib/types/packet-body-value.type.ts | 11 + .../src/lib/types/service.ts | 26 + .../src/lib/types/token.ts | 5 + .../src/lib/ucap-protocol.module.ts | 23 + .../src/public-api.ts | 15 + .../ucap-webmessenger-protocol/src/test.ts | 21 + .../tsconfig.lib.json | 26 + .../tsconfig.spec.json | 17 + .../ucap-webmessenger-protocol/tslint.json | 17 + .../ucap-webmessenger-ui-account/README.md | 24 + .../karma.conf.js | 32 + .../ng-package.json | 7 + .../ucap-webmessenger-ui-account/package.json | 8 + .../src/lib/components/login.component.html | 64 + .../src/lib/components/login.component.scss | 112 + .../lib/components/login.component.spec.ts | 24 + .../src/lib/components/login.component.ts | 73 + .../src/lib/services/account.service.spec.ts | 12 + .../src/lib/services/account.service.ts | 8 + .../src/lib/ucap-ui-account.module.ts | 45 + .../src/public-api.ts | 7 + .../ucap-webmessenger-ui-account/src/test.ts | 21 + .../tsconfig.lib.json | 26 + .../tsconfig.spec.json | 17 + .../ucap-webmessenger-ui-account/tslint.json | 17 + projects/ucap-webmessenger-ui-chat/README.md | 24 + .../ucap-webmessenger-ui-chat/karma.conf.js | 32 + .../ucap-webmessenger-ui-chat/ng-package.json | 7 + .../ucap-webmessenger-ui-chat/package.json | 8 + .../src/lib/components/form.component.html | 64 + .../src/lib/components/form.component.scss | 45 + .../src/lib/components/form.component.spec.ts | 24 + .../src/lib/components/form.component.ts | 70 + .../message-box/attach-file.component.html | 31 + .../message-box/attach-file.component.scss | 115 + .../message-box/attach-file.component.spec.ts | 28 + .../message-box/attach-file.component.ts | 29 + .../message-box/date-splitter.component.html | 5 + .../message-box/date-splitter.component.scss | 18 + .../date-splitter.component.spec.ts | 24 + .../message-box/date-splitter.component.ts | 24 + .../message-box/file.component.html | 37 + .../message-box/file.component.scss | 0 .../message-box/file.component.spec.ts | 24 + .../components/message-box/file.component.ts | 60 + .../message-box/image.component.html | 3 + .../message-box/image.component.scss | 3 + .../message-box/image.component.spec.ts | 24 + .../components/message-box/image.component.ts | 19 + .../message-box/information.component.html | 1 + .../message-box/information.component.scss | 0 .../message-box/information.component.spec.ts | 24 + .../message-box/information.component.ts | 106 + .../mass-translation.component.html | 0 .../mass-translation.component.scss | 0 .../mass-translation.component.spec.ts | 24 + .../message-box/mass-translation.component.ts | 12 + .../message-box/mass.component.html | 9 + .../message-box/mass.component.scss | 34 + .../message-box/mass.component.spec.ts | 24 + .../components/message-box/mass.component.ts | 48 + .../message-box/notice.component.html | 0 .../message-box/notice.component.scss | 0 .../message-box/notice.component.spec.ts | 24 + .../message-box/notice.component.ts | 12 + .../message-box/recall.component.html | 4 + .../message-box/recall.component.scss | 25 + .../message-box/recall.component.spec.ts | 24 + .../message-box/recall.component.ts | 12 + .../message-box/schedule.component.html | 16 + .../message-box/schedule.component.scss | 42 + .../message-box/schedule.component.spec.ts | 24 + .../message-box/schedule.component.ts | 14 + .../message-box/sticker.component.html | 14 + .../message-box/sticker.component.scss | 6 + .../message-box/sticker.component.spec.ts | 24 + .../message-box/sticker.component.ts | 28 + .../message-box/text.component.html | 3 + .../message-box/text.component.scss | 9 + .../message-box/text.component.spec.ts | 24 + .../components/message-box/text.component.ts | 17 + .../message-box/translation.component.html | 24 + .../message-box/translation.component.scss | 45 + .../message-box/translation.component.spec.ts | 24 + .../message-box/translation.component.ts | 16 + .../video-conference.component.html | 0 .../video-conference.component.scss | 0 .../video-conference.component.spec.ts | 24 + .../message-box/video-conference.component.ts | 12 + .../message-box/video.component.html | 35 + .../message-box/video.component.scss | 63 + .../message-box/video.component.spec.ts | 24 + .../components/message-box/video.component.ts | 29 + .../lib/components/messages.component.html | 163 + .../lib/components/messages.component.scss | 290 + .../lib/components/messages.component.spec.ts | 24 + .../src/lib/components/messages.component.ts | 174 + .../src/lib/models/file-info.json.ts | 20 + .../src/lib/models/mass-talk-info.json.ts | 10 + .../src/lib/models/sticker-info.json.ts | 5 + .../src/lib/ucap-ui-chat.module.ts | 82 + .../src/public-api.ts | 27 + .../ucap-webmessenger-ui-chat/src/test.ts | 21 + .../tsconfig.lib.json | 26 + .../tsconfig.spec.json | 17 + .../ucap-webmessenger-ui-chat/tslint.json | 17 + projects/ucap-webmessenger-ui-group/README.md | 24 + .../ucap-webmessenger-ui-group/karma.conf.js | 32 + .../ng-package.json | 7 + .../ucap-webmessenger-ui-group/package.json | 8 + .../components/expansion-panel.component.html | 80 + .../components/expansion-panel.component.scss | 66 + .../expansion-panel.component.spec.ts | 24 + .../components/expansion-panel.component.ts | 113 + .../expansion-panel-item.directive.ts | 7 + .../src/lib/ucap-ui-group.module.ts | 41 + .../src/public-api.ts | 9 + .../ucap-webmessenger-ui-group/src/test.ts | 21 + .../tsconfig.lib.json | 26 + .../tsconfig.spec.json | 17 + .../ucap-webmessenger-ui-group/tslint.json | 17 + .../ucap-webmessenger-ui-messenger/README.md | 24 + .../karma.conf.js | 32 + .../ng-package.json | 7 + .../package.json | 8 + .../src/lib/ucap-ui-messenger.module.ts | 20 + .../src/public-api.ts | 5 + .../src/test.ts | 21 + .../tsconfig.lib.json | 26 + .../tsconfig.spec.json | 17 + .../tslint.json | 17 + .../README.md | 24 + .../karma.conf.js | 32 + .../ng-package.json | 7 + .../package.json | 8 + .../components/tenant-search.component.html | 45 + .../components/tenant-search.component.scss | 56 + .../tenant-search.component.spec.ts | 24 + .../lib/components/tenant-search.component.ts | 36 + .../src/lib/components/tree.component.html | 38 + .../src/lib/components/tree.component.scss | 61 + .../src/lib/components/tree.component.spec.ts | 24 + .../src/lib/components/tree.component.ts | 141 + .../src/lib/ucap-ui-organization.module.ts | 42 + .../src/public-api.ts | 7 + .../src/test.ts | 21 + .../tsconfig.lib.json | 26 + .../tsconfig.spec.json | 17 + .../tslint.json | 17 + .../ucap-webmessenger-ui-profile/README.md | 24 + .../karma.conf.js | 32 + .../ng-package.json | 7 + .../ucap-webmessenger-ui-profile/package.json | 8 + .../lib/components/list-item.component.html | 21 + .../lib/components/list-item.component.scss | 46 + .../components/list-item.component.spec.ts | 24 + .../src/lib/components/list-item.component.ts | 14 + .../components/user-list-item.component.html | 47 + .../components/user-list-item.component.scss | 136 + .../user-list-item.component.spec.ts | 28 + .../components/user-list-item.component.ts | 101 + .../src/lib/types/presence-type.type.ts | 8 + .../src/lib/ucap-ui-profile.module.ts | 40 + .../src/public-api.ts | 10 + .../ucap-webmessenger-ui-profile/src/test.ts | 21 + .../tsconfig.lib.json | 26 + .../tsconfig.spec.json | 17 + .../ucap-webmessenger-ui-profile/tslint.json | 17 + projects/ucap-webmessenger-ui-room/README.md | 24 + .../ucap-webmessenger-ui-room/karma.conf.js | 32 + .../ucap-webmessenger-ui-room/ng-package.json | 7 + .../ucap-webmessenger-ui-room/package.json | 8 + .../lib/components/list-item.component.html | 59 + .../lib/components/list-item.component.scss | 187 + .../components/list-item.component.spec.ts | 24 + .../src/lib/components/list-item.component.ts | 130 + .../src/lib/ucap-ui-room.module.ts | 44 + .../src/public-api.ts | 7 + .../ucap-webmessenger-ui-room/src/test.ts | 21 + .../tsconfig.lib.json | 26 + .../tsconfig.spec.json | 17 + .../ucap-webmessenger-ui-room/tslint.json | 7 + projects/ucap-webmessenger-ui/README.md | 24 + projects/ucap-webmessenger-ui/karma.conf.js | 32 + projects/ucap-webmessenger-ui/ng-package.json | 8 + projects/ucap-webmessenger-ui/package.json | 8 + .../src/assets/scss/_ucap-ui.scss | 19 + .../src/assets/scss/file-icon/_fonts.scss | 27 + .../src/assets/scss/file-icon/_functions.scss | 14 + .../scss/file-icon/_generator-colors.scss | 5 + .../scss/file-icon/_generator-vars.scss | 41 + .../src/assets/scss/file-icon/_hardcoded.scss | 150 + .../src/assets/scss/file-icon/_icons.scss | 248 + .../src/assets/scss/file-icon/_loop.scss | 78 + .../src/assets/scss/file-icon/_mixin.scss | 43 + .../assets/scss/partials/_breakpoints.scss | 37 + .../src/assets/scss/partials/_dialogs.scss | 24 + .../src/assets/scss/partials/_forms.scss | 15 + .../src/assets/scss/partials/_general.scss | 70 + .../src/assets/scss/partials/_helpers.scss | 236 + .../src/assets/scss/partials/_icons.scss | 26 + .../src/assets/scss/partials/_list-item.scss | 27 + .../src/assets/scss/partials/_normalize.scss | 450 + .../src/assets/scss/partials/_presence.scss | 25 + .../src/assets/scss/partials/_scrollbars.scss | 22 + .../src/lib/animations/index.ts | 600 + .../file-upload-queue.component.html | 31 + .../file-upload-queue.component.scss | 4 + .../components/file-upload-queue.component.ts | 119 + .../lib/components/file-viewer.component.html | 40 + .../lib/components/file-viewer.component.scss | 4 + .../components/file-viewer.component.spec.ts | 27 + .../lib/components/file-viewer.component.ts | 58 + .../file-viewer/binary-viewer.component.html | 53 + .../file-viewer/binary-viewer.component.scss | 32 + .../binary-viewer.component.spec.ts | 27 + .../file-viewer/binary-viewer.component.ts | 36 + .../document-viewer.component.html | 18 + .../document-viewer.component.scss | 13 + .../document-viewer.component.spec.ts | 27 + .../file-viewer/document-viewer.component.ts | 34 + .../file-viewer/image-viewer.component.html | 65 + .../file-viewer/image-viewer.component.scss | 31 + .../image-viewer.component.spec.ts | 27 + .../file-viewer/image-viewer.component.ts | 37 + .../file-viewer/sound-viewer.component.html | 84 + .../file-viewer/sound-viewer.component.scss | 53 + .../sound-viewer.component.spec.ts | 27 + .../file-viewer/sound-viewer.component.ts | 99 + .../file-viewer/video-viewer.component.html | 84 + .../file-viewer/video-viewer.component.scss | 53 + .../video-viewer.component.spec.ts | 27 + .../file-viewer/video-viewer.component.ts | 99 + .../float-action-button.component.html | 23 + .../float-action-button.component.scss | 34 + .../float-action-button.component.spec.ts | 27 + .../float-action-button.component.ts | 57 + .../lib/dialogs/alert.dialog.component.html | 16 + .../lib/dialogs/alert.dialog.component.scss | 22 + .../dialogs/alert.dialog.component.spec.ts | 24 + .../src/lib/dialogs/alert.dialog.component.ts | 44 + .../lib/dialogs/confirm.dialog.component.html | 23 + .../lib/dialogs/confirm.dialog.component.scss | 25 + .../dialogs/confirm.dialog.component.spec.ts | 24 + .../lib/dialogs/confirm.dialog.component.ts | 51 + .../lib/directives/click-outside.directive.ts | 226 + .../directives/file-upload-for.directive.ts | 146 + .../src/lib/directives/image.directive.ts | 82 + .../src/lib/pipes/bytes.pipe.ts | 20 + .../src/lib/pipes/dates.pipe.spec.ts | 11 + .../src/lib/pipes/dates.pipe.ts | 38 + .../src/lib/pipes/linefeed.pipe.spec.ts | 11 + .../src/lib/pipes/linefeed.pipe.ts | 22 + .../src/lib/pipes/seconds-to-minutes.pipe.ts | 10 + .../lib/services/bottom-sheet.service.spec.ts | 12 + .../src/lib/services/bottom-sheet.service.ts | 39 + .../lib/services/clipboard.service.spec.ts | 12 + .../src/lib/services/clipboard.service.ts | 151 + .../src/lib/services/dialog.service.spec.ts | 12 + .../src/lib/services/dialog.service.ts | 38 + .../lib/services/snack-bar.service.spec.ts | 12 + .../src/lib/services/snack-bar.service.ts | 23 + .../src/lib/types/file-viewer.type.ts | 7 + .../src/lib/ucap-ui.module.ts | 102 + .../src/lib/utils/string.util.ts | 199 + .../ucap-webmessenger-ui/src/public-api.ts | 32 + projects/ucap-webmessenger-ui/src/test.ts | 21 + .../ucap-webmessenger-ui/tsconfig.lib.json | 26 + .../ucap-webmessenger-ui/tsconfig.spec.json | 17 + projects/ucap-webmessenger-ui/tslint.json | 7 + projects/ucap-webmessenger-util/README.md | 24 + projects/ucap-webmessenger-util/karma.conf.js | 32 + .../ucap-webmessenger-util/ng-package.json | 7 + projects/ucap-webmessenger-util/package.json | 8 + .../services/enviroment-util.service.spec.ts | 12 + .../lib/services/enviroment-util.service.ts | 215 + .../src/lib/ucap-util.module.ts | 19 + .../ucap-webmessenger-util/src/public-api.ts | 7 + projects/ucap-webmessenger-util/src/test.ts | 21 + .../ucap-webmessenger-util/tsconfig.lib.json | 26 + .../ucap-webmessenger-util/tsconfig.spec.json | 17 + projects/ucap-webmessenger-util/tslint.json | 17 + .../ucap-webmessenger-web-socket/README.md | 24 + .../karma.conf.js | 32 + .../ng-package.json | 7 + .../ucap-webmessenger-web-socket/package.json | 8 + .../src/lib/web-socket.ts | 139 + .../src/public-api.ts | 5 + .../ucap-webmessenger-web-socket/src/test.ts | 21 + .../tsconfig.lib.json | 26 + .../tsconfig.spec.json | 17 + .../ucap-webmessenger-web-socket/tslint.json | 17 + .../ucap-webmessenger-web-storage/README.md | 24 + .../karma.conf.js | 32 + .../ng-package.json | 7 + .../package.json | 8 + .../services/local-storage.service.spec.ts | 12 + .../src/lib/services/local-storage.service.ts | 11 + .../services/session-storage.service.spec.ts | 12 + .../lib/services/session-storage.service.ts | 11 + .../src/lib/services/storage.service.ts | 48 + .../src/lib/ucap-web-storage.module.ts | 20 + .../src/lib/utils/storage.util.ts | 91 + .../src/public-api.ts | 11 + .../ucap-webmessenger-web-storage/src/test.ts | 21 + .../tsconfig.lib.json | 26 + .../tsconfig.spec.json | 17 + .../ucap-webmessenger-web-storage/tslint.json | 17 + tsconfig.json | 141 + tslint.json | 80 + 1178 files changed, 68792 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 .vscode/extensions.json create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json create mode 100644 README.md create mode 100644 angular.json create mode 100644 config/enviroment.ts create mode 100644 config/main.webpack.config.ts create mode 100644 config/renderer.webpack.config.js create mode 100644 config/tsconfig.webpack.json create mode 100644 electron-builder.json create mode 100644 main/resources/image/128_128.png create mode 100644 main/resources/image/16_16.png create mode 100644 main/resources/image/256_256.png create mode 100644 main/resources/image/32_32.png create mode 100644 main/resources/image/48_48.png create mode 100644 main/resources/image/64_64.png create mode 100644 main/resources/image/ico_64_64.png create mode 100644 main/resources/image/ico_64x64.ico create mode 100644 main/resources/image/ico_64x64.png create mode 100644 main/resources/image/ico_64x64_r.ico create mode 100644 main/resources/image/ico_64x64_r.png create mode 100644 main/resources/installer/woori.icns create mode 100644 main/resources/installer/woori.ico create mode 100644 main/resources/installer/woori_256x256.ico create mode 100644 main/resources/installer/woori_256x256.png create mode 100644 main/resources/linuxicon/256x256.png create mode 100644 main/resources/notification/image/btn_call_message.png create mode 100644 main/resources/notification/image/btn_call_receive.png create mode 100644 main/resources/notification/image/btn_call_refuse.png create mode 100644 main/resources/notification/image/btn_call_transfer.png create mode 100644 main/resources/notification/image/btn_close.png create mode 100644 main/resources/notification/image/btn_close_gray.png create mode 100644 main/resources/notification/image/btn_noti_call.png create mode 100644 main/resources/notification/image/img_nophoto_50.png create mode 100644 main/resources/notification/preload.js create mode 100644 main/resources/notification/sound/messageAlarm.mp3 create mode 100644 main/resources/notification/styles/noti_messege.css create mode 100644 main/resources/notification/template.html create mode 100644 main/src/app/AppWindow.ts create mode 100644 main/src/crash/CrashWindow.ts create mode 100644 main/src/crash/show-uncaught-exception.ts create mode 100644 main/src/global.d.ts create mode 100644 main/src/index.ts create mode 100644 main/src/lib/default-folder.ts create mode 100644 main/src/lib/file-util.ts create mode 100644 main/src/lib/idle-checker.ts create mode 100644 main/src/lib/storage.ts create mode 100644 main/src/lib/window-state.ts create mode 100644 main/src/util/now.ts create mode 100644 main/src/util/root.ts create mode 100644 main/tsconfig.main.json create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 projects/ucap-webmessenger-api-common/README.md create mode 100644 projects/ucap-webmessenger-api-common/karma.conf.js create mode 100644 projects/ucap-webmessenger-api-common/ng-package.json create mode 100644 projects/ucap-webmessenger-api-common/package.json create mode 100644 projects/ucap-webmessenger-api-common/src/lib/apis/file-profile-save.ts create mode 100644 projects/ucap-webmessenger-api-common/src/lib/apis/file-talk-download.ts create mode 100644 projects/ucap-webmessenger-api-common/src/lib/apis/file-talk-save.ts create mode 100644 projects/ucap-webmessenger-api-common/src/lib/apis/file-talk-share.ts create mode 100644 projects/ucap-webmessenger-api-common/src/lib/apis/mass-talk-download.ts create mode 100644 projects/ucap-webmessenger-api-common/src/lib/apis/mass-talk-save.ts create mode 100644 projects/ucap-webmessenger-api-common/src/lib/apis/trans-mass-talk-download.ts create mode 100644 projects/ucap-webmessenger-api-common/src/lib/apis/trans-mass-talk-save.ts create mode 100644 projects/ucap-webmessenger-api-common/src/lib/apis/translation-req.ts create mode 100644 projects/ucap-webmessenger-api-common/src/lib/apis/translation-save.ts create mode 100644 projects/ucap-webmessenger-api-common/src/lib/models/file-download-item.ts create mode 100644 projects/ucap-webmessenger-api-common/src/lib/models/file-upload-item.ts create mode 100644 projects/ucap-webmessenger-api-common/src/lib/services/common-api.service.spec.ts create mode 100644 projects/ucap-webmessenger-api-common/src/lib/services/common-api.service.ts create mode 100644 projects/ucap-webmessenger-api-common/src/lib/types/module-config.ts create mode 100644 projects/ucap-webmessenger-api-common/src/lib/types/token.ts create mode 100644 projects/ucap-webmessenger-api-common/src/lib/ucap-common-api.module.ts create mode 100644 projects/ucap-webmessenger-api-common/src/public-api.ts create mode 100644 projects/ucap-webmessenger-api-common/src/test.ts create mode 100644 projects/ucap-webmessenger-api-common/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-api-common/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-api-common/tslint.json create mode 100644 projects/ucap-webmessenger-api-external/README.md create mode 100644 projects/ucap-webmessenger-api-external/karma.conf.js create mode 100644 projects/ucap-webmessenger-api-external/ng-package.json create mode 100644 projects/ucap-webmessenger-api-external/package.json create mode 100644 projects/ucap-webmessenger-api-external/src/lib/apis/check-user-info-ex.ts create mode 100644 projects/ucap-webmessenger-api-external/src/lib/apis/company-list.ts create mode 100644 projects/ucap-webmessenger-api-external/src/lib/apis/token-update.ts create mode 100644 projects/ucap-webmessenger-api-external/src/lib/apis/url-info.ts create mode 100644 projects/ucap-webmessenger-api-external/src/lib/models/company.ts create mode 100644 projects/ucap-webmessenger-api-external/src/lib/services/external-api.service.spec.ts create mode 100644 projects/ucap-webmessenger-api-external/src/lib/services/external-api.service.ts create mode 100644 projects/ucap-webmessenger-api-external/src/lib/types/module-config.ts create mode 100644 projects/ucap-webmessenger-api-external/src/lib/types/token.ts create mode 100644 projects/ucap-webmessenger-api-external/src/lib/ucap-external-api.module.ts create mode 100644 projects/ucap-webmessenger-api-external/src/public-api.ts create mode 100644 projects/ucap-webmessenger-api-external/src/test.ts create mode 100644 projects/ucap-webmessenger-api-external/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-api-external/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-api-external/tslint.json create mode 100644 projects/ucap-webmessenger-api-public/README.md create mode 100644 projects/ucap-webmessenger-api-public/karma.conf.js create mode 100644 projects/ucap-webmessenger-api-public/ng-package.json create mode 100644 projects/ucap-webmessenger-api-public/package.json create mode 100644 projects/ucap-webmessenger-api-public/src/lib/apis/update-info.ts create mode 100644 projects/ucap-webmessenger-api-public/src/lib/apis/version-info2.ts create mode 100644 projects/ucap-webmessenger-api-public/src/lib/services/public-api.service.spec.ts create mode 100644 projects/ucap-webmessenger-api-public/src/lib/services/public-api.service.ts create mode 100644 projects/ucap-webmessenger-api-public/src/lib/types/module-config.ts create mode 100644 projects/ucap-webmessenger-api-public/src/lib/types/sync-mode.type.ts create mode 100644 projects/ucap-webmessenger-api-public/src/lib/types/token.ts create mode 100644 projects/ucap-webmessenger-api-public/src/lib/ucap-public-api.module.ts create mode 100644 projects/ucap-webmessenger-api-public/src/public-api.ts create mode 100644 projects/ucap-webmessenger-api-public/src/test.ts create mode 100644 projects/ucap-webmessenger-api-public/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-api-public/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-api-public/tslint.json create mode 100644 projects/ucap-webmessenger-api/README.md create mode 100644 projects/ucap-webmessenger-api/karma.conf.js create mode 100644 projects/ucap-webmessenger-api/ng-package.json create mode 100644 projects/ucap-webmessenger-api/package.json create mode 100644 projects/ucap-webmessenger-api/src/lib/apis/api.ts create mode 100644 projects/ucap-webmessenger-api/src/lib/types/status-code.type.ts create mode 100644 projects/ucap-webmessenger-api/src/lib/utils/json.util.ts create mode 100644 projects/ucap-webmessenger-api/src/lib/utils/parameter.util.ts create mode 100644 projects/ucap-webmessenger-api/src/lib/utils/url.util.ts create mode 100644 projects/ucap-webmessenger-api/src/public-api.ts create mode 100644 projects/ucap-webmessenger-api/src/test.ts create mode 100644 projects/ucap-webmessenger-api/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-api/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-api/tslint.json create mode 100644 projects/ucap-webmessenger-app/browserslist create mode 100644 projects/ucap-webmessenger-app/e2e/protractor.conf.js create mode 100644 projects/ucap-webmessenger-app/e2e/src/app.e2e-spec.ts create mode 100644 projects/ucap-webmessenger-app/e2e/src/app.po.ts create mode 100644 projects/ucap-webmessenger-app/e2e/tsconfig.json create mode 100644 projects/ucap-webmessenger-app/karma.conf.js create mode 100644 projects/ucap-webmessenger-app/src/app/app-provider.module.ts create mode 100644 projects/ucap-webmessenger-app/src/app/app-routing.module.ts create mode 100644 projects/ucap-webmessenger-app/src/app/app-store.module.ts create mode 100644 projects/ucap-webmessenger-app/src/app/app-translate.module.ts create mode 100644 projects/ucap-webmessenger-app/src/app/app.component.html create mode 100644 projects/ucap-webmessenger-app/src/app/app.component.scss create mode 100644 projects/ucap-webmessenger-app/src/app/app.component.spec.ts create mode 100644 projects/ucap-webmessenger-app/src/app/app.component.ts create mode 100644 projects/ucap-webmessenger-app/src/app/app.module.ts create mode 100644 projects/ucap-webmessenger-app/src/app/app.theme.scss create mode 100644 projects/ucap-webmessenger-app/src/app/guards/auth.guard.ts create mode 100644 projects/ucap-webmessenger-app/src/app/guards/index.ts create mode 100644 projects/ucap-webmessenger-app/src/app/interceptors/loader.interceptor.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/common/common.layout.module.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/common/components/index.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/common/dialogs/file-viewer.dialog.component.html create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/common/dialogs/file-viewer.dialog.component.scss create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/common/dialogs/file-viewer.dialog.component.spec.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/common/dialogs/file-viewer.dialog.component.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/common/dialogs/index.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/components/index.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/components/intro.component.html create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/components/intro.component.scss create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/components/intro.component.spec.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/components/intro.component.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-side.component.html create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-side.component.scss create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-side.component.spec.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-side.component.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/call.component.html create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/call.component.scss create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/call.component.spec.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/call.component.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/chat.component.html create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/chat.component.scss create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/chat.component.spec.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/chat.component.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/group.component.html create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/group.component.scss create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/group.component.spec.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/group.component.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/index.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/organization.component.html create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/organization.component.scss create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/organization.component.spec.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/organization.component.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.html create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.scss create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.spec.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-side.component.html create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-side.component.scss create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-side.component.spec.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-side.component.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/create-chat.dialog.component.html create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/create-chat.dialog.component.scss create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/create-chat.dialog.component.spec.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/create-chat.dialog.component.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/edit-chat-room.dialog.component.html create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/edit-chat-room.dialog.component.scss create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/edit-chat-room.dialog.component.spec.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/edit-chat-room.dialog.component.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/index.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/group/edit-group.dialog.component.html create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/group/edit-group.dialog.component.scss create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/group/edit-group.dialog.component.spec.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/group/edit-group.dialog.component.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/group/index.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/group/select-group.dialog.component.html create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/group/select-group.dialog.component.scss create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/group/select-group.dialog.component.spec.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/group/select-group.dialog.component.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/index.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/messenger/messenger.layout.module.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/native/components/index.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/native/components/top-bar.component.html create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/native/components/top-bar.component.scss create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/native/components/top-bar.component.spec.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/native/components/top-bar.component.ts create mode 100644 projects/ucap-webmessenger-app/src/app/layouts/native/native.layout.module.ts create mode 100644 projects/ucap-webmessenger-app/src/app/pages/account/account-routing.page.module.ts create mode 100644 projects/ucap-webmessenger-app/src/app/pages/account/account.page.module.ts create mode 100644 projects/ucap-webmessenger-app/src/app/pages/account/components/index.ts create mode 100644 projects/ucap-webmessenger-app/src/app/pages/account/components/login.page.component.html create mode 100644 projects/ucap-webmessenger-app/src/app/pages/account/components/login.page.component.scss create mode 100644 projects/ucap-webmessenger-app/src/app/pages/account/components/login.page.component.spec.ts create mode 100644 projects/ucap-webmessenger-app/src/app/pages/account/components/login.page.component.ts create mode 100644 projects/ucap-webmessenger-app/src/app/pages/messenger/components/index.ts create mode 100644 projects/ucap-webmessenger-app/src/app/pages/messenger/components/main.page.component.html create mode 100644 projects/ucap-webmessenger-app/src/app/pages/messenger/components/main.page.component.scss create mode 100644 projects/ucap-webmessenger-app/src/app/pages/messenger/components/main.page.component.spec.ts create mode 100644 projects/ucap-webmessenger-app/src/app/pages/messenger/components/main.page.component.ts create mode 100644 projects/ucap-webmessenger-app/src/app/pages/messenger/messenger-routing.page.module.ts create mode 100644 projects/ucap-webmessenger-app/src/app/pages/messenger/messenger.page.module.ts create mode 100644 projects/ucap-webmessenger-app/src/app/pages/template/components/index.ts create mode 100644 projects/ucap-webmessenger-app/src/app/pages/template/components/template.page.component.html create mode 100644 projects/ucap-webmessenger-app/src/app/pages/template/components/template.page.component.scss create mode 100644 projects/ucap-webmessenger-app/src/app/pages/template/components/template.page.component.spec.ts create mode 100644 projects/ucap-webmessenger-app/src/app/pages/template/components/template.page.component.ts create mode 100644 projects/ucap-webmessenger-app/src/app/pages/template/template-routing.page.module.ts create mode 100644 projects/ucap-webmessenger-app/src/app/pages/template/template.page.module.ts create mode 100644 projects/ucap-webmessenger-app/src/app/resolvers/index.ts create mode 100644 projects/ucap-webmessenger-app/src/app/resolvers/messenger.resolver.ts create mode 100644 projects/ucap-webmessenger-app/src/app/services/app.service.ts create mode 100644 projects/ucap-webmessenger-app/src/app/services/authentication.service.ts create mode 100644 projects/ucap-webmessenger-app/src/app/services/index.ts create mode 100644 projects/ucap-webmessenger-app/src/app/services/loader.service.ts create mode 100644 projects/ucap-webmessenger-app/src/app/services/notification.service.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/account/authentication/actions.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/account/authentication/effects.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/account/authentication/index.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/account/authentication/reducers.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/account/authentication/state.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/account/index.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/account/info/actions.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/account/info/effects.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/account/info/index.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/account/info/reducers.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/account/info/state.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/index.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/messenger/chat/actions.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/messenger/chat/effects.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/messenger/chat/index.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/messenger/chat/reducers.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/messenger/chat/state.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/messenger/event/actions.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/messenger/event/effects.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/messenger/event/index.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/messenger/event/reducers.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/messenger/event/state.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/messenger/index.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/messenger/option/actions.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/messenger/option/effects.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/messenger/option/index.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/messenger/option/reducers.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/messenger/option/state.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/messenger/query/actions.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/messenger/query/effects.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/messenger/query/index.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/messenger/query/reducers.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/messenger/query/state.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/messenger/room/actions.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/messenger/room/effects.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/messenger/room/index.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/messenger/room/reducers.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/messenger/room/state.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/messenger/status/actions.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/messenger/status/effects.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/messenger/status/index.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/messenger/status/reducers.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/messenger/status/state.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/messenger/sync/actions.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/messenger/sync/effects.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/messenger/sync/index.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/messenger/sync/reducers.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/messenger/sync/state.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/setting/company/actions.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/setting/company/effects.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/setting/company/index.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/setting/company/reducers.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/setting/company/state.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/setting/index.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/setting/init/actions.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/setting/init/effects.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/setting/init/index.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/setting/init/reducers.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/setting/init/state.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/setting/version-info/actions.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/setting/version-info/effects.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/setting/version-info/index.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/setting/version-info/reducers.ts create mode 100644 projects/ucap-webmessenger-app/src/app/store/setting/version-info/state.ts create mode 100644 projects/ucap-webmessenger-app/src/app/types/environment.type.ts create mode 100644 projects/ucap-webmessenger-app/src/app/types/index.ts create mode 100644 projects/ucap-webmessenger-app/src/app/types/login-info.type.ts create mode 100644 projects/ucap-webmessenger-app/src/app/types/login-res-info.type.ts create mode 100644 projects/ucap-webmessenger-app/src/app/types/userselect.dialog.type.ts create mode 100644 projects/ucap-webmessenger-app/src/app/types/ver-info.type.ts create mode 100644 projects/ucap-webmessenger-app/src/assets/.gitkeep create mode 100644 projects/ucap-webmessenger-app/src/assets/i18n/en.json create mode 100644 projects/ucap-webmessenger-app/src/assets/i18n/ko.json create mode 100644 projects/ucap-webmessenger-app/src/assets/images/bg_login.png create mode 100644 projects/ucap-webmessenger-app/src/assets/images/file/icon_talk_doc.png create mode 100644 projects/ucap-webmessenger-app/src/assets/images/file/icon_talk_doc_d.png create mode 100644 projects/ucap-webmessenger-app/src/assets/images/file/icon_talk_exe.png create mode 100644 projects/ucap-webmessenger-app/src/assets/images/file/icon_talk_exe_d.png create mode 100644 projects/ucap-webmessenger-app/src/assets/images/file/icon_talk_file.png create mode 100644 projects/ucap-webmessenger-app/src/assets/images/file/icon_talk_file_d.png create mode 100644 projects/ucap-webmessenger-app/src/assets/images/file/icon_talk_hwp.png create mode 100644 projects/ucap-webmessenger-app/src/assets/images/file/icon_talk_hwp_d.png create mode 100644 projects/ucap-webmessenger-app/src/assets/images/file/icon_talk_img.png create mode 100644 projects/ucap-webmessenger-app/src/assets/images/file/icon_talk_img_d.png create mode 100644 projects/ucap-webmessenger-app/src/assets/images/file/icon_talk_ppt.png create mode 100644 projects/ucap-webmessenger-app/src/assets/images/file/icon_talk_ppt_d.png create mode 100644 projects/ucap-webmessenger-app/src/assets/images/file/icon_talk_video.png create mode 100644 projects/ucap-webmessenger-app/src/assets/images/file/icon_talk_video_d.png create mode 100644 projects/ucap-webmessenger-app/src/assets/images/file/icon_talk_xls.png create mode 100644 projects/ucap-webmessenger-app/src/assets/images/file/icon_talk_xls_d.png create mode 100644 projects/ucap-webmessenger-app/src/assets/images/file/icon_talk_zip.png create mode 100644 projects/ucap-webmessenger-app/src/assets/images/file/icon_talk_zip_d.png create mode 100644 projects/ucap-webmessenger-app/src/assets/images/icons/material/material-outline-icons.svg create mode 100644 projects/ucap-webmessenger-app/src/assets/images/icons/material/material-outline-icons.ttf create mode 100644 projects/ucap-webmessenger-app/src/assets/images/icons/material/material-outline-icons.woff create mode 100644 projects/ucap-webmessenger-app/src/assets/images/icons/material/style.css create mode 100644 projects/ucap-webmessenger-app/src/assets/images/img_groupphoto_36.png create mode 100644 projects/ucap-webmessenger-app/src/assets/images/img_groupphoto_80.png create mode 100644 projects/ucap-webmessenger-app/src/assets/images/img_nophoto_30.png create mode 100644 projects/ucap-webmessenger-app/src/assets/images/img_nophoto_36.png create mode 100644 projects/ucap-webmessenger-app/src/assets/images/img_nophoto_50.png create mode 100644 projects/ucap-webmessenger-app/src/assets/images/img_nophoto_70.png create mode 100644 projects/ucap-webmessenger-app/src/assets/images/img_nophoto_88.png create mode 100644 projects/ucap-webmessenger-app/src/assets/images/logo/ico_64x64.png create mode 100644 projects/ucap-webmessenger-app/src/assets/scss/global/_default.scss create mode 100644 projects/ucap-webmessenger-app/src/assets/scss/partials/_material-ui.scss create mode 100644 projects/ucap-webmessenger-app/src/assets/scss/ucap.scss create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_cate00.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_cate00_f.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_cate01.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_cate01_f.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_cate02.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_cate02_f.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_cate03.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_cate03_f.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_cate04.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_cate04_f.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_cate05.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_cate05_f.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_default.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_01_01.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_01_02.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_01_03.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_01_04.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_01_05.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_01_06.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_01_07.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_01_08.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_02_01.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_02_02.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_02_03.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_02_04.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_02_05.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_02_06.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_02_07.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_02_08.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_03_01.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_03_02.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_03_03.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_03_04.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_03_05.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_03_06.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_03_07.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_03_08.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_04_01.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_04_02.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_04_03.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_04_04.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_04_05.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_04_06.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_04_07.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_04_08.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_05_01.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_05_02.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_05_03.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_05_04.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_05_05.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_05_06.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_05_07.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_05_08.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_05_09.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_05_10.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_05_11.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_05_12.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_05_13.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_05_14.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_05_15.png create mode 100644 projects/ucap-webmessenger-app/src/assets/sticker/sticker_s_05_16.png create mode 100644 projects/ucap-webmessenger-app/src/environments/environment.prod.ts create mode 100644 projects/ucap-webmessenger-app/src/environments/environment.ts create mode 100644 projects/ucap-webmessenger-app/src/environments/environment.type.ts create mode 100644 projects/ucap-webmessenger-app/src/favicon.ico create mode 100644 projects/ucap-webmessenger-app/src/index.html create mode 100644 projects/ucap-webmessenger-app/src/main.ts create mode 100644 projects/ucap-webmessenger-app/src/polyfills.ts create mode 100644 projects/ucap-webmessenger-app/src/styles.scss create mode 100644 projects/ucap-webmessenger-app/src/test.ts create mode 100644 projects/ucap-webmessenger-app/tsconfig.app.json create mode 100644 projects/ucap-webmessenger-app/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-app/tslint.json create mode 100644 projects/ucap-webmessenger-core/README.md create mode 100644 projects/ucap-webmessenger-core/karma.conf.js create mode 100644 projects/ucap-webmessenger-core/ng-package.json create mode 100644 projects/ucap-webmessenger-core/package.json create mode 100644 projects/ucap-webmessenger-core/src/lib/types/app-type.type.ts create mode 100644 projects/ucap-webmessenger-core/src/lib/types/call-alarm.type.ts create mode 100644 projects/ucap-webmessenger-core/src/lib/types/call-forward.type.ts create mode 100644 projects/ucap-webmessenger-core/src/lib/types/call-mode.type.ts create mode 100644 projects/ucap-webmessenger-core/src/lib/types/caller-type.type.ts create mode 100644 projects/ucap-webmessenger-core/src/lib/types/const.type.ts create mode 100644 projects/ucap-webmessenger-core/src/lib/types/default-screen.type.ts create mode 100644 projects/ucap-webmessenger-core/src/lib/types/device-devision.type.ts create mode 100644 projects/ucap-webmessenger-core/src/lib/types/device-type.type.ts create mode 100644 projects/ucap-webmessenger-core/src/lib/types/file-transfer-permissions.type.ts create mode 100644 projects/ucap-webmessenger-core/src/lib/types/locale-code.type.ts create mode 100644 projects/ucap-webmessenger-core/src/lib/types/notification-method.type.ts create mode 100644 projects/ucap-webmessenger-core/src/lib/types/organization-chart-permissions.type.ts create mode 100644 projects/ucap-webmessenger-core/src/lib/types/push-type.type.ts create mode 100644 projects/ucap-webmessenger-core/src/lib/types/status-code.type.ts create mode 100644 projects/ucap-webmessenger-core/src/lib/types/status-type.type.ts create mode 100644 projects/ucap-webmessenger-core/src/lib/types/video-conference-type.type.ts create mode 100644 projects/ucap-webmessenger-core/src/lib/utils/file.util.ts create mode 100644 projects/ucap-webmessenger-core/src/lib/utils/mime.util.ts create mode 100644 projects/ucap-webmessenger-core/src/lib/utils/string.util.ts create mode 100644 projects/ucap-webmessenger-core/src/public-api.ts create mode 100644 projects/ucap-webmessenger-core/src/test.ts create mode 100644 projects/ucap-webmessenger-core/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-core/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-core/tslint.json create mode 100644 projects/ucap-webmessenger-electron-core/README.md create mode 100644 projects/ucap-webmessenger-electron-core/karma.conf.js create mode 100644 projects/ucap-webmessenger-electron-core/ng-package.json create mode 100644 projects/ucap-webmessenger-electron-core/package.json create mode 100644 projects/ucap-webmessenger-electron-core/src/lib/types/channel.type.ts create mode 100644 projects/ucap-webmessenger-electron-core/src/public-api.ts create mode 100644 projects/ucap-webmessenger-electron-core/src/test.ts create mode 100644 projects/ucap-webmessenger-electron-core/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-electron-core/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-electron-core/tslint.json create mode 100644 projects/ucap-webmessenger-electron-notification/README.md create mode 100644 projects/ucap-webmessenger-electron-notification/karma.conf.js create mode 100644 projects/ucap-webmessenger-electron-notification/ng-package.json create mode 100644 projects/ucap-webmessenger-electron-notification/package.json create mode 100644 projects/ucap-webmessenger-electron-notification/src/lib/models/electron-notification-options.ts create mode 100644 projects/ucap-webmessenger-electron-notification/src/lib/models/electron-notification.ts create mode 100644 projects/ucap-webmessenger-electron-notification/src/lib/services/electron-notification.service.ts create mode 100644 projects/ucap-webmessenger-electron-notification/src/lib/types/channel.type.ts create mode 100644 projects/ucap-webmessenger-electron-notification/src/lib/types/event.type.ts create mode 100644 projects/ucap-webmessenger-electron-notification/src/lib/utils/animation-queue.ts create mode 100644 projects/ucap-webmessenger-electron-notification/src/public-api.ts create mode 100644 projects/ucap-webmessenger-electron-notification/src/test.ts create mode 100644 projects/ucap-webmessenger-electron-notification/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-electron-notification/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-electron-notification/tslint.json create mode 100644 projects/ucap-webmessenger-native-browser/README.md create mode 100644 projects/ucap-webmessenger-native-browser/karma.conf.js create mode 100644 projects/ucap-webmessenger-native-browser/ng-package.json create mode 100644 projects/ucap-webmessenger-native-browser/package.json create mode 100644 projects/ucap-webmessenger-native-browser/src/lib/services/browser-native.service.spec.ts create mode 100644 projects/ucap-webmessenger-native-browser/src/lib/services/browser-native.service.ts create mode 100644 projects/ucap-webmessenger-native-browser/src/lib/translate/browser-loader.ts create mode 100644 projects/ucap-webmessenger-native-browser/src/public-api.ts create mode 100644 projects/ucap-webmessenger-native-browser/src/test.ts create mode 100644 projects/ucap-webmessenger-native-browser/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-native-browser/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-native-browser/tslint.json create mode 100644 projects/ucap-webmessenger-native-electron/README.md create mode 100644 projects/ucap-webmessenger-native-electron/karma.conf.js create mode 100644 projects/ucap-webmessenger-native-electron/ng-package.json create mode 100644 projects/ucap-webmessenger-native-electron/package.json create mode 100644 projects/ucap-webmessenger-native-electron/src/lib/services/electron-native.service.spec.ts create mode 100644 projects/ucap-webmessenger-native-electron/src/lib/services/electron-native.service.ts create mode 100644 projects/ucap-webmessenger-native-electron/src/lib/translate/electron-loader.ts create mode 100644 projects/ucap-webmessenger-native-electron/src/lib/types/channel.type.ts create mode 100644 projects/ucap-webmessenger-native-electron/src/public-api.ts create mode 100644 projects/ucap-webmessenger-native-electron/src/test.ts create mode 100644 projects/ucap-webmessenger-native-electron/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-native-electron/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-native-electron/tslint.json create mode 100644 projects/ucap-webmessenger-native/README.md create mode 100644 projects/ucap-webmessenger-native/karma.conf.js create mode 100644 projects/ucap-webmessenger-native/ng-package.json create mode 100644 projects/ucap-webmessenger-native/package.json create mode 100644 projects/ucap-webmessenger-native/src/lib/models/notification.ts create mode 100644 projects/ucap-webmessenger-native/src/lib/services/native.service.ts create mode 100644 projects/ucap-webmessenger-native/src/lib/types/token.ts create mode 100644 projects/ucap-webmessenger-native/src/lib/types/window-idle.type.ts create mode 100644 projects/ucap-webmessenger-native/src/lib/types/window-state.type.ts create mode 100644 projects/ucap-webmessenger-native/src/lib/ucap-native.module.ts create mode 100644 projects/ucap-webmessenger-native/src/public-api.ts create mode 100644 projects/ucap-webmessenger-native/src/test.ts create mode 100644 projects/ucap-webmessenger-native/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-native/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-native/tslint.json create mode 100644 projects/ucap-webmessenger-pi/README.md create mode 100644 projects/ucap-webmessenger-pi/karma.conf.js create mode 100644 projects/ucap-webmessenger-pi/ng-package.json create mode 100644 projects/ucap-webmessenger-pi/package.json create mode 100644 projects/ucap-webmessenger-pi/src/lib/apis/login2.ts create mode 100644 projects/ucap-webmessenger-pi/src/lib/apis/pi.ts create mode 100644 projects/ucap-webmessenger-pi/src/lib/apis/privacy-total.ts create mode 100644 projects/ucap-webmessenger-pi/src/lib/apis/user-terms-action.ts create mode 100644 projects/ucap-webmessenger-pi/src/lib/services/pi.service.spec.ts create mode 100644 projects/ucap-webmessenger-pi/src/lib/services/pi.service.ts create mode 100644 projects/ucap-webmessenger-pi/src/lib/types/module-config.ts create mode 100644 projects/ucap-webmessenger-pi/src/lib/types/response-status.type.ts create mode 100644 projects/ucap-webmessenger-pi/src/lib/types/token.ts create mode 100644 projects/ucap-webmessenger-pi/src/lib/ucap-pi.module.ts create mode 100644 projects/ucap-webmessenger-pi/src/public-api.ts create mode 100644 projects/ucap-webmessenger-pi/src/test.ts create mode 100644 projects/ucap-webmessenger-pi/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-pi/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-pi/tslint.json create mode 100644 projects/ucap-webmessenger-protocol-authentication/README.md create mode 100644 projects/ucap-webmessenger-protocol-authentication/karma.conf.js create mode 100644 projects/ucap-webmessenger-protocol-authentication/ng-package.json create mode 100644 projects/ucap-webmessenger-protocol-authentication/package.json create mode 100644 projects/ucap-webmessenger-protocol-authentication/src/lib/models/user-info.ts create mode 100644 projects/ucap-webmessenger-protocol-authentication/src/lib/protocols/fmc.ts create mode 100644 projects/ucap-webmessenger-protocol-authentication/src/lib/protocols/login.ts create mode 100644 projects/ucap-webmessenger-protocol-authentication/src/lib/protocols/logout-remote.ts create mode 100644 projects/ucap-webmessenger-protocol-authentication/src/lib/protocols/logout.ts create mode 100644 projects/ucap-webmessenger-protocol-authentication/src/lib/services/authentication-protocol.service.spec.ts create mode 100644 projects/ucap-webmessenger-protocol-authentication/src/lib/services/authentication-protocol.service.ts create mode 100644 projects/ucap-webmessenger-protocol-authentication/src/lib/types/role-code.ts create mode 100644 projects/ucap-webmessenger-protocol-authentication/src/lib/types/service.ts create mode 100644 projects/ucap-webmessenger-protocol-authentication/src/lib/types/sso-mode.ts create mode 100644 projects/ucap-webmessenger-protocol-authentication/src/lib/ucap-authentication-protocol.module.ts create mode 100644 projects/ucap-webmessenger-protocol-authentication/src/public-api.ts create mode 100644 projects/ucap-webmessenger-protocol-authentication/src/test.ts create mode 100644 projects/ucap-webmessenger-protocol-authentication/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-protocol-authentication/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-protocol-authentication/tslint.json create mode 100644 projects/ucap-webmessenger-protocol-buddy/README.md create mode 100644 projects/ucap-webmessenger-protocol-buddy/karma.conf.js create mode 100644 projects/ucap-webmessenger-protocol-buddy/ng-package.json create mode 100644 projects/ucap-webmessenger-protocol-buddy/package.json create mode 100644 projects/ucap-webmessenger-protocol-buddy/src/lib/protocols/add.ts create mode 100644 projects/ucap-webmessenger-protocol-buddy/src/lib/protocols/del.ts create mode 100644 projects/ucap-webmessenger-protocol-buddy/src/lib/protocols/update.ts create mode 100644 projects/ucap-webmessenger-protocol-buddy/src/lib/services/buddy-protocol.service.spec.ts create mode 100644 projects/ucap-webmessenger-protocol-buddy/src/lib/services/buddy-protocol.service.ts create mode 100644 projects/ucap-webmessenger-protocol-buddy/src/lib/types/service.ts create mode 100644 projects/ucap-webmessenger-protocol-buddy/src/lib/ucap-buddy-protocol.module.ts create mode 100644 projects/ucap-webmessenger-protocol-buddy/src/public-api.ts create mode 100644 projects/ucap-webmessenger-protocol-buddy/src/test.ts create mode 100644 projects/ucap-webmessenger-protocol-buddy/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-protocol-buddy/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-protocol-buddy/tslint.json create mode 100644 projects/ucap-webmessenger-protocol-event/README.md create mode 100644 projects/ucap-webmessenger-protocol-event/karma.conf.js create mode 100644 projects/ucap-webmessenger-protocol-event/ng-package.json create mode 100644 projects/ucap-webmessenger-protocol-event/package.json create mode 100644 projects/ucap-webmessenger-protocol-event/src/lib/models/info.ts create mode 100644 projects/ucap-webmessenger-protocol-event/src/lib/protocols/cancel.ts create mode 100644 projects/ucap-webmessenger-protocol-event/src/lib/protocols/del.ts create mode 100644 projects/ucap-webmessenger-protocol-event/src/lib/protocols/event-json/character.event-json.ts create mode 100644 projects/ucap-webmessenger-protocol-event/src/lib/protocols/event-json/codec.ts create mode 100644 projects/ucap-webmessenger-protocol-event/src/lib/protocols/event-json/event-json.ts create mode 100644 projects/ucap-webmessenger-protocol-event/src/lib/protocols/event-json/exit.event-json.ts create mode 100644 projects/ucap-webmessenger-protocol-event/src/lib/protocols/event-json/file.event-json.ts create mode 100644 projects/ucap-webmessenger-protocol-event/src/lib/protocols/event-json/guide-for-room-timer-changed.event-json.ts create mode 100644 projects/ucap-webmessenger-protocol-event/src/lib/protocols/event-json/join.event-json.ts create mode 100644 projects/ucap-webmessenger-protocol-event/src/lib/protocols/event-json/link.event-json.ts create mode 100644 projects/ucap-webmessenger-protocol-event/src/lib/protocols/event-json/mass-text.event-json.ts create mode 100644 projects/ucap-webmessenger-protocol-event/src/lib/protocols/event-json/mass-translation.event-json.ts create mode 100644 projects/ucap-webmessenger-protocol-event/src/lib/protocols/event-json/notification-for-timer-room.event-json.ts create mode 100644 projects/ucap-webmessenger-protocol-event/src/lib/protocols/event-json/plan.event-json.ts create mode 100644 projects/ucap-webmessenger-protocol-event/src/lib/protocols/event-json/recalled-message.event-json.ts create mode 100644 projects/ucap-webmessenger-protocol-event/src/lib/protocols/event-json/rename-room.event-json.ts create mode 100644 projects/ucap-webmessenger-protocol-event/src/lib/protocols/event-json/sticker.event-json.ts create mode 100644 projects/ucap-webmessenger-protocol-event/src/lib/protocols/event-json/translation.event-json.ts create mode 100644 projects/ucap-webmessenger-protocol-event/src/lib/protocols/event-json/video-conference.event-json.ts create mode 100644 projects/ucap-webmessenger-protocol-event/src/lib/protocols/event-json/video-streamming.event-json.ts create mode 100644 projects/ucap-webmessenger-protocol-event/src/lib/protocols/info.ts create mode 100644 projects/ucap-webmessenger-protocol-event/src/lib/protocols/push.ts create mode 100644 projects/ucap-webmessenger-protocol-event/src/lib/protocols/read.ts create mode 100644 projects/ucap-webmessenger-protocol-event/src/lib/protocols/send.ts create mode 100644 projects/ucap-webmessenger-protocol-event/src/lib/services/event-protocol.service.spec.ts create mode 100644 projects/ucap-webmessenger-protocol-event/src/lib/services/event-protocol.service.ts create mode 100644 projects/ucap-webmessenger-protocol-event/src/lib/types/event.type.ts create mode 100644 projects/ucap-webmessenger-protocol-event/src/lib/types/push-cl.type.ts create mode 100644 projects/ucap-webmessenger-protocol-event/src/lib/types/push-status.type.ts create mode 100644 projects/ucap-webmessenger-protocol-event/src/lib/types/service.ts create mode 100644 projects/ucap-webmessenger-protocol-event/src/lib/ucap-event-protocol.module.ts create mode 100644 projects/ucap-webmessenger-protocol-event/src/public-api.ts create mode 100644 projects/ucap-webmessenger-protocol-event/src/test.ts create mode 100644 projects/ucap-webmessenger-protocol-event/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-protocol-event/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-protocol-event/tslint.json create mode 100644 projects/ucap-webmessenger-protocol-file/README.md create mode 100644 projects/ucap-webmessenger-protocol-file/karma.conf.js create mode 100644 projects/ucap-webmessenger-protocol-file/ng-package.json create mode 100644 projects/ucap-webmessenger-protocol-file/package.json create mode 100644 projects/ucap-webmessenger-protocol-file/src/lib/models/file-download-info.ts create mode 100644 projects/ucap-webmessenger-protocol-file/src/lib/models/file-info.ts create mode 100644 projects/ucap-webmessenger-protocol-file/src/lib/protocols/down-check.ts create mode 100644 projects/ucap-webmessenger-protocol-file/src/lib/protocols/info.ts create mode 100644 projects/ucap-webmessenger-protocol-file/src/lib/services/file-protocol.service.spec.ts create mode 100644 projects/ucap-webmessenger-protocol-file/src/lib/services/file-protocol.service.ts create mode 100644 projects/ucap-webmessenger-protocol-file/src/lib/types/file.type.ts create mode 100644 projects/ucap-webmessenger-protocol-file/src/lib/types/service.ts create mode 100644 projects/ucap-webmessenger-protocol-file/src/lib/ucap-file-protocol.module.ts create mode 100644 projects/ucap-webmessenger-protocol-file/src/public-api.ts create mode 100644 projects/ucap-webmessenger-protocol-file/src/test.ts create mode 100644 projects/ucap-webmessenger-protocol-file/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-protocol-file/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-protocol-file/tslint.json create mode 100644 projects/ucap-webmessenger-protocol-fmc/README.md create mode 100644 projects/ucap-webmessenger-protocol-fmc/karma.conf.js create mode 100644 projects/ucap-webmessenger-protocol-fmc/ng-package.json create mode 100644 projects/ucap-webmessenger-protocol-fmc/package.json create mode 100644 projects/ucap-webmessenger-protocol-fmc/src/lib/services/fmc-protocol.service.spec.ts create mode 100644 projects/ucap-webmessenger-protocol-fmc/src/lib/services/fmc-protocol.service.ts create mode 100644 projects/ucap-webmessenger-protocol-fmc/src/lib/ucap-fmc-protocol.module.ts create mode 100644 projects/ucap-webmessenger-protocol-fmc/src/public-api.ts create mode 100644 projects/ucap-webmessenger-protocol-fmc/src/test.ts create mode 100644 projects/ucap-webmessenger-protocol-fmc/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-protocol-fmc/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-protocol-fmc/tslint.json create mode 100644 projects/ucap-webmessenger-protocol-group/README.md create mode 100644 projects/ucap-webmessenger-protocol-group/karma.conf.js create mode 100644 projects/ucap-webmessenger-protocol-group/ng-package.json create mode 100644 projects/ucap-webmessenger-protocol-group/package.json create mode 100644 projects/ucap-webmessenger-protocol-group/src/lib/protocols/add.ts create mode 100644 projects/ucap-webmessenger-protocol-group/src/lib/protocols/del.ts create mode 100644 projects/ucap-webmessenger-protocol-group/src/lib/protocols/update.ts create mode 100644 projects/ucap-webmessenger-protocol-group/src/lib/services/group-protocol.service.spec.ts create mode 100644 projects/ucap-webmessenger-protocol-group/src/lib/services/group-protocol.service.ts create mode 100644 projects/ucap-webmessenger-protocol-group/src/lib/types/service.ts create mode 100644 projects/ucap-webmessenger-protocol-group/src/lib/ucap-group-protocol.module.ts create mode 100644 projects/ucap-webmessenger-protocol-group/src/public-api.ts create mode 100644 projects/ucap-webmessenger-protocol-group/src/test.ts create mode 100644 projects/ucap-webmessenger-protocol-group/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-protocol-group/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-protocol-group/tslint.json create mode 100644 projects/ucap-webmessenger-protocol-info/README.md create mode 100644 projects/ucap-webmessenger-protocol-info/karma.conf.js create mode 100644 projects/ucap-webmessenger-protocol-info/ng-package.json create mode 100644 projects/ucap-webmessenger-protocol-info/package.json create mode 100644 projects/ucap-webmessenger-protocol-info/src/lib/protocols/status.ts create mode 100644 projects/ucap-webmessenger-protocol-info/src/lib/protocols/user-option.ts create mode 100644 projects/ucap-webmessenger-protocol-info/src/lib/protocols/user.ts create mode 100644 projects/ucap-webmessenger-protocol-info/src/lib/services/info-protocol.service.spec.ts create mode 100644 projects/ucap-webmessenger-protocol-info/src/lib/services/info-protocol.service.ts create mode 100644 projects/ucap-webmessenger-protocol-info/src/lib/types/service.ts create mode 100644 projects/ucap-webmessenger-protocol-info/src/lib/types/user-info-update.type.ts create mode 100644 projects/ucap-webmessenger-protocol-info/src/lib/ucap-info-protocol.module.ts create mode 100644 projects/ucap-webmessenger-protocol-info/src/public-api.ts create mode 100644 projects/ucap-webmessenger-protocol-info/src/test.ts create mode 100644 projects/ucap-webmessenger-protocol-info/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-protocol-info/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-protocol-info/tslint.json create mode 100644 projects/ucap-webmessenger-protocol-inner/README.md create mode 100644 projects/ucap-webmessenger-protocol-inner/karma.conf.js create mode 100644 projects/ucap-webmessenger-protocol-inner/ng-package.json create mode 100644 projects/ucap-webmessenger-protocol-inner/package.json create mode 100644 projects/ucap-webmessenger-protocol-inner/src/lib/protocols/conn.ts create mode 100644 projects/ucap-webmessenger-protocol-inner/src/lib/services/inner-protocol.service.spec.ts create mode 100644 projects/ucap-webmessenger-protocol-inner/src/lib/services/inner-protocol.service.ts create mode 100644 projects/ucap-webmessenger-protocol-inner/src/lib/types/service.ts create mode 100644 projects/ucap-webmessenger-protocol-inner/src/lib/ucap-inner-protocol.module.ts create mode 100644 projects/ucap-webmessenger-protocol-inner/src/public-api.ts create mode 100644 projects/ucap-webmessenger-protocol-inner/src/test.ts create mode 100644 projects/ucap-webmessenger-protocol-inner/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-protocol-inner/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-protocol-inner/tslint.json create mode 100644 projects/ucap-webmessenger-protocol-option/README.md create mode 100644 projects/ucap-webmessenger-protocol-option/karma.conf.js create mode 100644 projects/ucap-webmessenger-protocol-option/ng-package.json create mode 100644 projects/ucap-webmessenger-protocol-option/package.json create mode 100644 projects/ucap-webmessenger-protocol-option/src/lib/protocols/call-update.ts create mode 100644 projects/ucap-webmessenger-protocol-option/src/lib/protocols/call-view.ts create mode 100644 projects/ucap-webmessenger-protocol-option/src/lib/protocols/reg-update.ts create mode 100644 projects/ucap-webmessenger-protocol-option/src/lib/protocols/reg-view.ts create mode 100644 projects/ucap-webmessenger-protocol-option/src/lib/protocols/update.ts create mode 100644 projects/ucap-webmessenger-protocol-option/src/lib/protocols/view.ts create mode 100644 projects/ucap-webmessenger-protocol-option/src/lib/services/option-protocol.service.spec.ts create mode 100644 projects/ucap-webmessenger-protocol-option/src/lib/services/option-protocol.service.ts create mode 100644 projects/ucap-webmessenger-protocol-option/src/lib/types/service.ts create mode 100644 projects/ucap-webmessenger-protocol-option/src/lib/ucap-option-protocol.module.ts create mode 100644 projects/ucap-webmessenger-protocol-option/src/public-api.ts create mode 100644 projects/ucap-webmessenger-protocol-option/src/test.ts create mode 100644 projects/ucap-webmessenger-protocol-option/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-protocol-option/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-protocol-option/tslint.json create mode 100644 projects/ucap-webmessenger-protocol-ping/README.md create mode 100644 projects/ucap-webmessenger-protocol-ping/karma.conf.js create mode 100644 projects/ucap-webmessenger-protocol-ping/ng-package.json create mode 100644 projects/ucap-webmessenger-protocol-ping/package.json create mode 100644 projects/ucap-webmessenger-protocol-ping/src/lib/protocols/ping.ts create mode 100644 projects/ucap-webmessenger-protocol-ping/src/lib/services/ping-protocol.service.spec.ts create mode 100644 projects/ucap-webmessenger-protocol-ping/src/lib/services/ping-protocol.service.ts create mode 100644 projects/ucap-webmessenger-protocol-ping/src/lib/types/service.ts create mode 100644 projects/ucap-webmessenger-protocol-ping/src/lib/ucap-ping-protocol.module.ts create mode 100644 projects/ucap-webmessenger-protocol-ping/src/public-api.ts create mode 100644 projects/ucap-webmessenger-protocol-ping/src/test.ts create mode 100644 projects/ucap-webmessenger-protocol-ping/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-protocol-ping/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-protocol-ping/tslint.json create mode 100644 projects/ucap-webmessenger-protocol-query/README.md create mode 100644 projects/ucap-webmessenger-protocol-query/karma.conf.js create mode 100644 projects/ucap-webmessenger-protocol-query/ng-package.json create mode 100644 projects/ucap-webmessenger-protocol-query/package.json create mode 100644 projects/ucap-webmessenger-protocol-query/src/lib/models/dept-info.ts create mode 100644 projects/ucap-webmessenger-protocol-query/src/lib/models/user-info-dn.ts create mode 100644 projects/ucap-webmessenger-protocol-query/src/lib/models/user-info-f.ts create mode 100644 projects/ucap-webmessenger-protocol-query/src/lib/models/user-info-ss.ts create mode 100644 projects/ucap-webmessenger-protocol-query/src/lib/models/user-seq-info.ts create mode 100644 projects/ucap-webmessenger-protocol-query/src/lib/protocols/auth.ts create mode 100644 projects/ucap-webmessenger-protocol-query/src/lib/protocols/data-user-ext.ts create mode 100644 projects/ucap-webmessenger-protocol-query/src/lib/protocols/data-user.ts create mode 100644 projects/ucap-webmessenger-protocol-query/src/lib/protocols/dept-user.ts create mode 100644 projects/ucap-webmessenger-protocol-query/src/lib/protocols/dept.ts create mode 100644 projects/ucap-webmessenger-protocol-query/src/lib/protocols/user-dn.ts create mode 100644 projects/ucap-webmessenger-protocol-query/src/lib/protocols/user-id.ts create mode 100644 projects/ucap-webmessenger-protocol-query/src/lib/protocols/user-seq.ts create mode 100644 projects/ucap-webmessenger-protocol-query/src/lib/services/query-protocol.service.spec.ts create mode 100644 projects/ucap-webmessenger-protocol-query/src/lib/services/query-protocol.service.ts create mode 100644 projects/ucap-webmessenger-protocol-query/src/lib/types/dept-search.type.ts create mode 100644 projects/ucap-webmessenger-protocol-query/src/lib/types/dept.type.ts create mode 100644 projects/ucap-webmessenger-protocol-query/src/lib/types/service.ts create mode 100644 projects/ucap-webmessenger-protocol-query/src/lib/types/user-dn-search.type.ts create mode 100644 projects/ucap-webmessenger-protocol-query/src/lib/ucap-query-protocol.module.ts create mode 100644 projects/ucap-webmessenger-protocol-query/src/public-api.ts create mode 100644 projects/ucap-webmessenger-protocol-query/src/test.ts create mode 100644 projects/ucap-webmessenger-protocol-query/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-protocol-query/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-protocol-query/tslint.json create mode 100644 projects/ucap-webmessenger-protocol-room/README.md create mode 100644 projects/ucap-webmessenger-protocol-room/karma.conf.js create mode 100644 projects/ucap-webmessenger-protocol-room/ng-package.json create mode 100644 projects/ucap-webmessenger-protocol-room/package.json create mode 100644 projects/ucap-webmessenger-protocol-room/src/lib/models/room-info.ts create mode 100644 projects/ucap-webmessenger-protocol-room/src/lib/models/user-info-short.ts create mode 100644 projects/ucap-webmessenger-protocol-room/src/lib/models/user-info.ts create mode 100644 projects/ucap-webmessenger-protocol-room/src/lib/protocols/exit.ts create mode 100644 projects/ucap-webmessenger-protocol-room/src/lib/protocols/info.ts create mode 100644 projects/ucap-webmessenger-protocol-room/src/lib/protocols/invite.ts create mode 100644 projects/ucap-webmessenger-protocol-room/src/lib/protocols/open.ts create mode 100644 projects/ucap-webmessenger-protocol-room/src/lib/protocols/update.ts create mode 100644 projects/ucap-webmessenger-protocol-room/src/lib/services/room-protocol.service.spec.ts create mode 100644 projects/ucap-webmessenger-protocol-room/src/lib/services/room-protocol.service.ts create mode 100644 projects/ucap-webmessenger-protocol-room/src/lib/types/employee.type.ts create mode 100644 projects/ucap-webmessenger-protocol-room/src/lib/types/room.type.ts create mode 100644 projects/ucap-webmessenger-protocol-room/src/lib/types/service.ts create mode 100644 projects/ucap-webmessenger-protocol-room/src/lib/ucap-room-protocol.module.ts create mode 100644 projects/ucap-webmessenger-protocol-room/src/public-api.ts create mode 100644 projects/ucap-webmessenger-protocol-room/src/test.ts create mode 100644 projects/ucap-webmessenger-protocol-room/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-protocol-room/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-protocol-room/tslint.json create mode 100644 projects/ucap-webmessenger-protocol-service/README.md create mode 100644 projects/ucap-webmessenger-protocol-service/karma.conf.js create mode 100644 projects/ucap-webmessenger-protocol-service/ng-package.json create mode 100644 projects/ucap-webmessenger-protocol-service/package.json create mode 100644 projects/ucap-webmessenger-protocol-service/src/lib/protocols/password-set.ts create mode 100644 projects/ucap-webmessenger-protocol-service/src/lib/services/service-protocol.service.spec.ts create mode 100644 projects/ucap-webmessenger-protocol-service/src/lib/services/service-protocol.service.ts create mode 100644 projects/ucap-webmessenger-protocol-service/src/lib/types/service.ts create mode 100644 projects/ucap-webmessenger-protocol-service/src/lib/ucap-service-protocol.module.ts create mode 100644 projects/ucap-webmessenger-protocol-service/src/public-api.ts create mode 100644 projects/ucap-webmessenger-protocol-service/src/test.ts create mode 100644 projects/ucap-webmessenger-protocol-service/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-protocol-service/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-protocol-service/tslint.json create mode 100644 projects/ucap-webmessenger-protocol-status/README.md create mode 100644 projects/ucap-webmessenger-protocol-status/karma.conf.js create mode 100644 projects/ucap-webmessenger-protocol-status/ng-package.json create mode 100644 projects/ucap-webmessenger-protocol-status/package.json create mode 100644 projects/ucap-webmessenger-protocol-status/src/lib/models/status-bulk-info.ts create mode 100644 projects/ucap-webmessenger-protocol-status/src/lib/models/status-info.ts create mode 100644 projects/ucap-webmessenger-protocol-status/src/lib/protocols/buddy.ts create mode 100644 projects/ucap-webmessenger-protocol-status/src/lib/protocols/bulk-info.ts create mode 100644 projects/ucap-webmessenger-protocol-status/src/lib/protocols/message-update.ts create mode 100644 projects/ucap-webmessenger-protocol-status/src/lib/protocols/status.ts create mode 100644 projects/ucap-webmessenger-protocol-status/src/lib/protocols/subscribe.ts create mode 100644 projects/ucap-webmessenger-protocol-status/src/lib/protocols/unsubscribe.ts create mode 100644 projects/ucap-webmessenger-protocol-status/src/lib/services/status-protocol.service.spec.ts create mode 100644 projects/ucap-webmessenger-protocol-status/src/lib/services/status-protocol.service.ts create mode 100644 projects/ucap-webmessenger-protocol-status/src/lib/types/message-index.type.ts create mode 100644 projects/ucap-webmessenger-protocol-status/src/lib/types/service.ts create mode 100644 projects/ucap-webmessenger-protocol-status/src/lib/types/terminal-status.type.ts create mode 100644 projects/ucap-webmessenger-protocol-status/src/lib/ucap-status-protocol.module.ts create mode 100644 projects/ucap-webmessenger-protocol-status/src/public-api.ts create mode 100644 projects/ucap-webmessenger-protocol-status/src/test.ts create mode 100644 projects/ucap-webmessenger-protocol-status/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-protocol-status/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-protocol-status/tslint.json create mode 100644 projects/ucap-webmessenger-protocol-sync/README.md create mode 100644 projects/ucap-webmessenger-protocol-sync/karma.conf.js create mode 100644 projects/ucap-webmessenger-protocol-sync/ng-package.json create mode 100644 projects/ucap-webmessenger-protocol-sync/package.json create mode 100644 projects/ucap-webmessenger-protocol-sync/src/lib/models/buddy-info.ts create mode 100644 projects/ucap-webmessenger-protocol-sync/src/lib/models/group-info.ts create mode 100644 projects/ucap-webmessenger-protocol-sync/src/lib/protocols/buddy.ts create mode 100644 projects/ucap-webmessenger-protocol-sync/src/lib/protocols/group.ts create mode 100644 projects/ucap-webmessenger-protocol-sync/src/lib/protocols/room.ts create mode 100644 projects/ucap-webmessenger-protocol-sync/src/lib/services/sync-protocol.service.spec.ts create mode 100644 projects/ucap-webmessenger-protocol-sync/src/lib/services/sync-protocol.service.ts create mode 100644 projects/ucap-webmessenger-protocol-sync/src/lib/types/service.ts create mode 100644 projects/ucap-webmessenger-protocol-sync/src/lib/types/userInfo.ts create mode 100644 projects/ucap-webmessenger-protocol-sync/src/lib/ucap-sync-protocol.module.ts create mode 100644 projects/ucap-webmessenger-protocol-sync/src/public-api.ts create mode 100644 projects/ucap-webmessenger-protocol-sync/src/test.ts create mode 100644 projects/ucap-webmessenger-protocol-sync/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-protocol-sync/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-protocol-sync/tslint.json create mode 100644 projects/ucap-webmessenger-protocol-ucti/README.md create mode 100644 projects/ucap-webmessenger-protocol-ucti/karma.conf.js create mode 100644 projects/ucap-webmessenger-protocol-ucti/ng-package.json create mode 100644 projects/ucap-webmessenger-protocol-ucti/package.json create mode 100644 projects/ucap-webmessenger-protocol-ucti/src/lib/services/ucti-protocol.service.spec.ts create mode 100644 projects/ucap-webmessenger-protocol-ucti/src/lib/services/ucti-protocol.service.ts create mode 100644 projects/ucap-webmessenger-protocol-ucti/src/lib/ucap-ucti-protocol.module.ts create mode 100644 projects/ucap-webmessenger-protocol-ucti/src/public-api.ts create mode 100644 projects/ucap-webmessenger-protocol-ucti/src/test.ts create mode 100644 projects/ucap-webmessenger-protocol-ucti/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-protocol-ucti/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-protocol-ucti/tslint.json create mode 100644 projects/ucap-webmessenger-protocol-umg/README.md create mode 100644 projects/ucap-webmessenger-protocol-umg/karma.conf.js create mode 100644 projects/ucap-webmessenger-protocol-umg/ng-package.json create mode 100644 projects/ucap-webmessenger-protocol-umg/package.json create mode 100644 projects/ucap-webmessenger-protocol-umg/src/lib/services/umg-protocol.service.spec.ts create mode 100644 projects/ucap-webmessenger-protocol-umg/src/lib/services/umg-protocol.service.ts create mode 100644 projects/ucap-webmessenger-protocol-umg/src/lib/ucap-umg-protocol.module.ts create mode 100644 projects/ucap-webmessenger-protocol-umg/src/public-api.ts create mode 100644 projects/ucap-webmessenger-protocol-umg/src/test.ts create mode 100644 projects/ucap-webmessenger-protocol-umg/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-protocol-umg/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-protocol-umg/tslint.json create mode 100644 projects/ucap-webmessenger-protocol/README.md create mode 100644 projects/ucap-webmessenger-protocol/karma.conf.js create mode 100644 projects/ucap-webmessenger-protocol/ng-package.json create mode 100644 projects/ucap-webmessenger-protocol/package.json create mode 100644 projects/ucap-webmessenger-protocol/src/lib/protocols/packet.ts create mode 100644 projects/ucap-webmessenger-protocol/src/lib/protocols/protocol.ts create mode 100644 projects/ucap-webmessenger-protocol/src/lib/services/protocol.service.spec.ts create mode 100644 projects/ucap-webmessenger-protocol/src/lib/services/protocol.service.ts create mode 100644 projects/ucap-webmessenger-protocol/src/lib/types/module-config.ts create mode 100644 projects/ucap-webmessenger-protocol/src/lib/types/packet-body-divider.ts create mode 100644 projects/ucap-webmessenger-protocol/src/lib/types/packet-body-value.type.ts create mode 100644 projects/ucap-webmessenger-protocol/src/lib/types/service.ts create mode 100644 projects/ucap-webmessenger-protocol/src/lib/types/token.ts create mode 100644 projects/ucap-webmessenger-protocol/src/lib/ucap-protocol.module.ts create mode 100644 projects/ucap-webmessenger-protocol/src/public-api.ts create mode 100644 projects/ucap-webmessenger-protocol/src/test.ts create mode 100644 projects/ucap-webmessenger-protocol/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-protocol/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-protocol/tslint.json create mode 100644 projects/ucap-webmessenger-ui-account/README.md create mode 100644 projects/ucap-webmessenger-ui-account/karma.conf.js create mode 100644 projects/ucap-webmessenger-ui-account/ng-package.json create mode 100644 projects/ucap-webmessenger-ui-account/package.json create mode 100644 projects/ucap-webmessenger-ui-account/src/lib/components/login.component.html create mode 100644 projects/ucap-webmessenger-ui-account/src/lib/components/login.component.scss create mode 100644 projects/ucap-webmessenger-ui-account/src/lib/components/login.component.spec.ts create mode 100644 projects/ucap-webmessenger-ui-account/src/lib/components/login.component.ts create mode 100644 projects/ucap-webmessenger-ui-account/src/lib/services/account.service.spec.ts create mode 100644 projects/ucap-webmessenger-ui-account/src/lib/services/account.service.ts create mode 100644 projects/ucap-webmessenger-ui-account/src/lib/ucap-ui-account.module.ts create mode 100644 projects/ucap-webmessenger-ui-account/src/public-api.ts create mode 100644 projects/ucap-webmessenger-ui-account/src/test.ts create mode 100644 projects/ucap-webmessenger-ui-account/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-ui-account/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-ui-account/tslint.json create mode 100644 projects/ucap-webmessenger-ui-chat/README.md create mode 100644 projects/ucap-webmessenger-ui-chat/karma.conf.js create mode 100644 projects/ucap-webmessenger-ui-chat/ng-package.json create mode 100644 projects/ucap-webmessenger-ui-chat/package.json create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/form.component.html create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/form.component.scss create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/form.component.spec.ts create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/form.component.ts create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/attach-file.component.html create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/attach-file.component.scss create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/attach-file.component.spec.ts create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/attach-file.component.ts create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/date-splitter.component.html create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/date-splitter.component.scss create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/date-splitter.component.spec.ts create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/date-splitter.component.ts create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/file.component.html create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/file.component.scss create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/file.component.spec.ts create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/file.component.ts create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/image.component.html create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/image.component.scss create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/image.component.spec.ts create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/image.component.ts create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/information.component.html create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/information.component.scss create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/information.component.spec.ts create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/information.component.ts create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/mass-translation.component.html create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/mass-translation.component.scss create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/mass-translation.component.spec.ts create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/mass-translation.component.ts create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/mass.component.html create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/mass.component.scss create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/mass.component.spec.ts create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/mass.component.ts create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/notice.component.html create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/notice.component.scss create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/notice.component.spec.ts create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/notice.component.ts create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/recall.component.html create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/recall.component.scss create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/recall.component.spec.ts create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/recall.component.ts create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/schedule.component.html create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/schedule.component.scss create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/schedule.component.spec.ts create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/schedule.component.ts create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/sticker.component.html create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/sticker.component.scss create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/sticker.component.spec.ts create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/sticker.component.ts create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/text.component.html create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/text.component.scss create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/text.component.spec.ts create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/text.component.ts create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/translation.component.html create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/translation.component.scss create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/translation.component.spec.ts create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/translation.component.ts create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/video-conference.component.html create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/video-conference.component.scss create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/video-conference.component.spec.ts create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/video-conference.component.ts create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/video.component.html create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/video.component.scss create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/video.component.spec.ts create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/message-box/video.component.ts create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/messages.component.html create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/messages.component.scss create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/messages.component.spec.ts create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/components/messages.component.ts create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/models/file-info.json.ts create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/models/mass-talk-info.json.ts create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/models/sticker-info.json.ts create mode 100644 projects/ucap-webmessenger-ui-chat/src/lib/ucap-ui-chat.module.ts create mode 100644 projects/ucap-webmessenger-ui-chat/src/public-api.ts create mode 100644 projects/ucap-webmessenger-ui-chat/src/test.ts create mode 100644 projects/ucap-webmessenger-ui-chat/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-ui-chat/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-ui-chat/tslint.json create mode 100644 projects/ucap-webmessenger-ui-group/README.md create mode 100644 projects/ucap-webmessenger-ui-group/karma.conf.js create mode 100644 projects/ucap-webmessenger-ui-group/ng-package.json create mode 100644 projects/ucap-webmessenger-ui-group/package.json create mode 100644 projects/ucap-webmessenger-ui-group/src/lib/components/expansion-panel.component.html create mode 100644 projects/ucap-webmessenger-ui-group/src/lib/components/expansion-panel.component.scss create mode 100644 projects/ucap-webmessenger-ui-group/src/lib/components/expansion-panel.component.spec.ts create mode 100644 projects/ucap-webmessenger-ui-group/src/lib/components/expansion-panel.component.ts create mode 100644 projects/ucap-webmessenger-ui-group/src/lib/directives/expansion-panel-item.directive.ts create mode 100644 projects/ucap-webmessenger-ui-group/src/lib/ucap-ui-group.module.ts create mode 100644 projects/ucap-webmessenger-ui-group/src/public-api.ts create mode 100644 projects/ucap-webmessenger-ui-group/src/test.ts create mode 100644 projects/ucap-webmessenger-ui-group/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-ui-group/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-ui-group/tslint.json create mode 100644 projects/ucap-webmessenger-ui-messenger/README.md create mode 100644 projects/ucap-webmessenger-ui-messenger/karma.conf.js create mode 100644 projects/ucap-webmessenger-ui-messenger/ng-package.json create mode 100644 projects/ucap-webmessenger-ui-messenger/package.json create mode 100644 projects/ucap-webmessenger-ui-messenger/src/lib/ucap-ui-messenger.module.ts create mode 100644 projects/ucap-webmessenger-ui-messenger/src/public-api.ts create mode 100644 projects/ucap-webmessenger-ui-messenger/src/test.ts create mode 100644 projects/ucap-webmessenger-ui-messenger/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-ui-messenger/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-ui-messenger/tslint.json create mode 100644 projects/ucap-webmessenger-ui-organization/README.md create mode 100644 projects/ucap-webmessenger-ui-organization/karma.conf.js create mode 100644 projects/ucap-webmessenger-ui-organization/ng-package.json create mode 100644 projects/ucap-webmessenger-ui-organization/package.json create mode 100644 projects/ucap-webmessenger-ui-organization/src/lib/components/tenant-search.component.html create mode 100644 projects/ucap-webmessenger-ui-organization/src/lib/components/tenant-search.component.scss create mode 100644 projects/ucap-webmessenger-ui-organization/src/lib/components/tenant-search.component.spec.ts create mode 100644 projects/ucap-webmessenger-ui-organization/src/lib/components/tenant-search.component.ts create mode 100644 projects/ucap-webmessenger-ui-organization/src/lib/components/tree.component.html create mode 100644 projects/ucap-webmessenger-ui-organization/src/lib/components/tree.component.scss create mode 100644 projects/ucap-webmessenger-ui-organization/src/lib/components/tree.component.spec.ts create mode 100644 projects/ucap-webmessenger-ui-organization/src/lib/components/tree.component.ts create mode 100644 projects/ucap-webmessenger-ui-organization/src/lib/ucap-ui-organization.module.ts create mode 100644 projects/ucap-webmessenger-ui-organization/src/public-api.ts create mode 100644 projects/ucap-webmessenger-ui-organization/src/test.ts create mode 100644 projects/ucap-webmessenger-ui-organization/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-ui-organization/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-ui-organization/tslint.json create mode 100644 projects/ucap-webmessenger-ui-profile/README.md create mode 100644 projects/ucap-webmessenger-ui-profile/karma.conf.js create mode 100644 projects/ucap-webmessenger-ui-profile/ng-package.json create mode 100644 projects/ucap-webmessenger-ui-profile/package.json create mode 100644 projects/ucap-webmessenger-ui-profile/src/lib/components/list-item.component.html create mode 100644 projects/ucap-webmessenger-ui-profile/src/lib/components/list-item.component.scss create mode 100644 projects/ucap-webmessenger-ui-profile/src/lib/components/list-item.component.spec.ts create mode 100644 projects/ucap-webmessenger-ui-profile/src/lib/components/list-item.component.ts create mode 100644 projects/ucap-webmessenger-ui-profile/src/lib/components/user-list-item.component.html create mode 100644 projects/ucap-webmessenger-ui-profile/src/lib/components/user-list-item.component.scss create mode 100644 projects/ucap-webmessenger-ui-profile/src/lib/components/user-list-item.component.spec.ts create mode 100644 projects/ucap-webmessenger-ui-profile/src/lib/components/user-list-item.component.ts create mode 100644 projects/ucap-webmessenger-ui-profile/src/lib/types/presence-type.type.ts create mode 100644 projects/ucap-webmessenger-ui-profile/src/lib/ucap-ui-profile.module.ts create mode 100644 projects/ucap-webmessenger-ui-profile/src/public-api.ts create mode 100644 projects/ucap-webmessenger-ui-profile/src/test.ts create mode 100644 projects/ucap-webmessenger-ui-profile/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-ui-profile/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-ui-profile/tslint.json create mode 100644 projects/ucap-webmessenger-ui-room/README.md create mode 100644 projects/ucap-webmessenger-ui-room/karma.conf.js create mode 100644 projects/ucap-webmessenger-ui-room/ng-package.json create mode 100644 projects/ucap-webmessenger-ui-room/package.json create mode 100644 projects/ucap-webmessenger-ui-room/src/lib/components/list-item.component.html create mode 100644 projects/ucap-webmessenger-ui-room/src/lib/components/list-item.component.scss create mode 100644 projects/ucap-webmessenger-ui-room/src/lib/components/list-item.component.spec.ts create mode 100644 projects/ucap-webmessenger-ui-room/src/lib/components/list-item.component.ts create mode 100644 projects/ucap-webmessenger-ui-room/src/lib/ucap-ui-room.module.ts create mode 100644 projects/ucap-webmessenger-ui-room/src/public-api.ts create mode 100644 projects/ucap-webmessenger-ui-room/src/test.ts create mode 100644 projects/ucap-webmessenger-ui-room/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-ui-room/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-ui-room/tslint.json create mode 100644 projects/ucap-webmessenger-ui/README.md create mode 100644 projects/ucap-webmessenger-ui/karma.conf.js create mode 100644 projects/ucap-webmessenger-ui/ng-package.json create mode 100644 projects/ucap-webmessenger-ui/package.json create mode 100644 projects/ucap-webmessenger-ui/src/assets/scss/_ucap-ui.scss create mode 100644 projects/ucap-webmessenger-ui/src/assets/scss/file-icon/_fonts.scss create mode 100644 projects/ucap-webmessenger-ui/src/assets/scss/file-icon/_functions.scss create mode 100644 projects/ucap-webmessenger-ui/src/assets/scss/file-icon/_generator-colors.scss create mode 100644 projects/ucap-webmessenger-ui/src/assets/scss/file-icon/_generator-vars.scss create mode 100644 projects/ucap-webmessenger-ui/src/assets/scss/file-icon/_hardcoded.scss create mode 100644 projects/ucap-webmessenger-ui/src/assets/scss/file-icon/_icons.scss create mode 100644 projects/ucap-webmessenger-ui/src/assets/scss/file-icon/_loop.scss create mode 100644 projects/ucap-webmessenger-ui/src/assets/scss/file-icon/_mixin.scss create mode 100644 projects/ucap-webmessenger-ui/src/assets/scss/partials/_breakpoints.scss create mode 100644 projects/ucap-webmessenger-ui/src/assets/scss/partials/_dialogs.scss create mode 100644 projects/ucap-webmessenger-ui/src/assets/scss/partials/_forms.scss create mode 100644 projects/ucap-webmessenger-ui/src/assets/scss/partials/_general.scss create mode 100644 projects/ucap-webmessenger-ui/src/assets/scss/partials/_helpers.scss create mode 100644 projects/ucap-webmessenger-ui/src/assets/scss/partials/_icons.scss create mode 100644 projects/ucap-webmessenger-ui/src/assets/scss/partials/_list-item.scss create mode 100644 projects/ucap-webmessenger-ui/src/assets/scss/partials/_normalize.scss create mode 100644 projects/ucap-webmessenger-ui/src/assets/scss/partials/_presence.scss create mode 100644 projects/ucap-webmessenger-ui/src/assets/scss/partials/_scrollbars.scss create mode 100644 projects/ucap-webmessenger-ui/src/lib/animations/index.ts create mode 100644 projects/ucap-webmessenger-ui/src/lib/components/file-upload-queue.component.html create mode 100644 projects/ucap-webmessenger-ui/src/lib/components/file-upload-queue.component.scss create mode 100644 projects/ucap-webmessenger-ui/src/lib/components/file-upload-queue.component.ts create mode 100644 projects/ucap-webmessenger-ui/src/lib/components/file-viewer.component.html create mode 100644 projects/ucap-webmessenger-ui/src/lib/components/file-viewer.component.scss create mode 100644 projects/ucap-webmessenger-ui/src/lib/components/file-viewer.component.spec.ts create mode 100644 projects/ucap-webmessenger-ui/src/lib/components/file-viewer.component.ts create mode 100644 projects/ucap-webmessenger-ui/src/lib/components/file-viewer/binary-viewer.component.html create mode 100644 projects/ucap-webmessenger-ui/src/lib/components/file-viewer/binary-viewer.component.scss create mode 100644 projects/ucap-webmessenger-ui/src/lib/components/file-viewer/binary-viewer.component.spec.ts create mode 100644 projects/ucap-webmessenger-ui/src/lib/components/file-viewer/binary-viewer.component.ts create mode 100644 projects/ucap-webmessenger-ui/src/lib/components/file-viewer/document-viewer.component.html create mode 100644 projects/ucap-webmessenger-ui/src/lib/components/file-viewer/document-viewer.component.scss create mode 100644 projects/ucap-webmessenger-ui/src/lib/components/file-viewer/document-viewer.component.spec.ts create mode 100644 projects/ucap-webmessenger-ui/src/lib/components/file-viewer/document-viewer.component.ts create mode 100644 projects/ucap-webmessenger-ui/src/lib/components/file-viewer/image-viewer.component.html create mode 100644 projects/ucap-webmessenger-ui/src/lib/components/file-viewer/image-viewer.component.scss create mode 100644 projects/ucap-webmessenger-ui/src/lib/components/file-viewer/image-viewer.component.spec.ts create mode 100644 projects/ucap-webmessenger-ui/src/lib/components/file-viewer/image-viewer.component.ts create mode 100644 projects/ucap-webmessenger-ui/src/lib/components/file-viewer/sound-viewer.component.html create mode 100644 projects/ucap-webmessenger-ui/src/lib/components/file-viewer/sound-viewer.component.scss create mode 100644 projects/ucap-webmessenger-ui/src/lib/components/file-viewer/sound-viewer.component.spec.ts create mode 100644 projects/ucap-webmessenger-ui/src/lib/components/file-viewer/sound-viewer.component.ts create mode 100644 projects/ucap-webmessenger-ui/src/lib/components/file-viewer/video-viewer.component.html create mode 100644 projects/ucap-webmessenger-ui/src/lib/components/file-viewer/video-viewer.component.scss create mode 100644 projects/ucap-webmessenger-ui/src/lib/components/file-viewer/video-viewer.component.spec.ts create mode 100644 projects/ucap-webmessenger-ui/src/lib/components/file-viewer/video-viewer.component.ts create mode 100644 projects/ucap-webmessenger-ui/src/lib/components/float-action-button.component.html create mode 100644 projects/ucap-webmessenger-ui/src/lib/components/float-action-button.component.scss create mode 100644 projects/ucap-webmessenger-ui/src/lib/components/float-action-button.component.spec.ts create mode 100644 projects/ucap-webmessenger-ui/src/lib/components/float-action-button.component.ts create mode 100644 projects/ucap-webmessenger-ui/src/lib/dialogs/alert.dialog.component.html create mode 100644 projects/ucap-webmessenger-ui/src/lib/dialogs/alert.dialog.component.scss create mode 100644 projects/ucap-webmessenger-ui/src/lib/dialogs/alert.dialog.component.spec.ts create mode 100644 projects/ucap-webmessenger-ui/src/lib/dialogs/alert.dialog.component.ts create mode 100644 projects/ucap-webmessenger-ui/src/lib/dialogs/confirm.dialog.component.html create mode 100644 projects/ucap-webmessenger-ui/src/lib/dialogs/confirm.dialog.component.scss create mode 100644 projects/ucap-webmessenger-ui/src/lib/dialogs/confirm.dialog.component.spec.ts create mode 100644 projects/ucap-webmessenger-ui/src/lib/dialogs/confirm.dialog.component.ts create mode 100644 projects/ucap-webmessenger-ui/src/lib/directives/click-outside.directive.ts create mode 100644 projects/ucap-webmessenger-ui/src/lib/directives/file-upload-for.directive.ts create mode 100644 projects/ucap-webmessenger-ui/src/lib/directives/image.directive.ts create mode 100644 projects/ucap-webmessenger-ui/src/lib/pipes/bytes.pipe.ts create mode 100644 projects/ucap-webmessenger-ui/src/lib/pipes/dates.pipe.spec.ts create mode 100644 projects/ucap-webmessenger-ui/src/lib/pipes/dates.pipe.ts create mode 100644 projects/ucap-webmessenger-ui/src/lib/pipes/linefeed.pipe.spec.ts create mode 100644 projects/ucap-webmessenger-ui/src/lib/pipes/linefeed.pipe.ts create mode 100644 projects/ucap-webmessenger-ui/src/lib/pipes/seconds-to-minutes.pipe.ts create mode 100644 projects/ucap-webmessenger-ui/src/lib/services/bottom-sheet.service.spec.ts create mode 100644 projects/ucap-webmessenger-ui/src/lib/services/bottom-sheet.service.ts create mode 100644 projects/ucap-webmessenger-ui/src/lib/services/clipboard.service.spec.ts create mode 100644 projects/ucap-webmessenger-ui/src/lib/services/clipboard.service.ts create mode 100644 projects/ucap-webmessenger-ui/src/lib/services/dialog.service.spec.ts create mode 100644 projects/ucap-webmessenger-ui/src/lib/services/dialog.service.ts create mode 100644 projects/ucap-webmessenger-ui/src/lib/services/snack-bar.service.spec.ts create mode 100644 projects/ucap-webmessenger-ui/src/lib/services/snack-bar.service.ts create mode 100644 projects/ucap-webmessenger-ui/src/lib/types/file-viewer.type.ts create mode 100644 projects/ucap-webmessenger-ui/src/lib/ucap-ui.module.ts create mode 100644 projects/ucap-webmessenger-ui/src/lib/utils/string.util.ts create mode 100644 projects/ucap-webmessenger-ui/src/public-api.ts create mode 100644 projects/ucap-webmessenger-ui/src/test.ts create mode 100644 projects/ucap-webmessenger-ui/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-ui/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-ui/tslint.json create mode 100644 projects/ucap-webmessenger-util/README.md create mode 100644 projects/ucap-webmessenger-util/karma.conf.js create mode 100644 projects/ucap-webmessenger-util/ng-package.json create mode 100644 projects/ucap-webmessenger-util/package.json create mode 100644 projects/ucap-webmessenger-util/src/lib/services/enviroment-util.service.spec.ts create mode 100644 projects/ucap-webmessenger-util/src/lib/services/enviroment-util.service.ts create mode 100644 projects/ucap-webmessenger-util/src/lib/ucap-util.module.ts create mode 100644 projects/ucap-webmessenger-util/src/public-api.ts create mode 100644 projects/ucap-webmessenger-util/src/test.ts create mode 100644 projects/ucap-webmessenger-util/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-util/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-util/tslint.json create mode 100644 projects/ucap-webmessenger-web-socket/README.md create mode 100644 projects/ucap-webmessenger-web-socket/karma.conf.js create mode 100644 projects/ucap-webmessenger-web-socket/ng-package.json create mode 100644 projects/ucap-webmessenger-web-socket/package.json create mode 100644 projects/ucap-webmessenger-web-socket/src/lib/web-socket.ts create mode 100644 projects/ucap-webmessenger-web-socket/src/public-api.ts create mode 100644 projects/ucap-webmessenger-web-socket/src/test.ts create mode 100644 projects/ucap-webmessenger-web-socket/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-web-socket/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-web-socket/tslint.json create mode 100644 projects/ucap-webmessenger-web-storage/README.md create mode 100644 projects/ucap-webmessenger-web-storage/karma.conf.js create mode 100644 projects/ucap-webmessenger-web-storage/ng-package.json create mode 100644 projects/ucap-webmessenger-web-storage/package.json create mode 100644 projects/ucap-webmessenger-web-storage/src/lib/services/local-storage.service.spec.ts create mode 100644 projects/ucap-webmessenger-web-storage/src/lib/services/local-storage.service.ts create mode 100644 projects/ucap-webmessenger-web-storage/src/lib/services/session-storage.service.spec.ts create mode 100644 projects/ucap-webmessenger-web-storage/src/lib/services/session-storage.service.ts create mode 100644 projects/ucap-webmessenger-web-storage/src/lib/services/storage.service.ts create mode 100644 projects/ucap-webmessenger-web-storage/src/lib/ucap-web-storage.module.ts create mode 100644 projects/ucap-webmessenger-web-storage/src/lib/utils/storage.util.ts create mode 100644 projects/ucap-webmessenger-web-storage/src/public-api.ts create mode 100644 projects/ucap-webmessenger-web-storage/src/test.ts create mode 100644 projects/ucap-webmessenger-web-storage/tsconfig.lib.json create mode 100644 projects/ucap-webmessenger-web-storage/tsconfig.spec.json create mode 100644 projects/ucap-webmessenger-web-storage/tslint.json create mode 100644 tsconfig.json create mode 100644 tslint.json diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..e89330a --- /dev/null +++ b/.editorconfig @@ -0,0 +1,13 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d4a1da7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,47 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc +# Only exists if Bazel was run +/bazel-out + +# dependencies +/node_modules + +# profiling files +chrome-profiler-events*.json +speed-measure-plugin*.json + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings +/.awcache + +# System Files +.DS_Store +Thumbs.db diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..2af701e --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,11 @@ +{ + "recommendations": [ + "Angular.ng-template", + "msjsdiag.debugger-for-chrome", + "eamodio.gitlens", + "esbenp.prettier-vscode", + "ms-vscode.vscode-typescript-tslint-plugin", + "VisualStudioExptTeam.vscodeintellicode", + "nkokhelox.svg-font-previewer" + ] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..8eabdb1 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,7 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..df8e24a --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,14 @@ +{ + "editor.tabSize": 2, + "editor.insertSpaces": true, + "editor.formatOnSave": true, + "editor.formatOnPaste": true, + "editor.autoClosingBrackets": "languageDefined", + "editor.trimAutoWhitespace": true, + "files.trimTrailingWhitespace": true, + "files.trimFinalNewlines": true, + "go.testFlags": ["-v"], + "go.testTimeout": "100s", + "prettier.singleQuote": true, + "debug.node.autoAttach": "on" +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..78ac87d --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,15 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "type": "npm", + "script": "build:main:dev", + "group": { + "kind": "build", + "isDefault": true + } + } + ] +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..ea786ff --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +readme \ No newline at end of file diff --git a/angular.json b/angular.json new file mode 100644 index 0000000..e493b62 --- /dev/null +++ b/angular.json @@ -0,0 +1,1521 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "ucap-webmessenger-app": { + "projectType": "application", + "schematics": { + "@schematics/angular:component": { + "style": "scss" + } + }, + "root": "projects/ucap-webmessenger-app", + "sourceRoot": "projects/ucap-webmessenger-app/src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular-builders/custom-webpack:browser", + "options": { + "outputPath": "dist/ucap-webmessenger-app", + "index": "projects/ucap-webmessenger-app/src/index.html", + "main": "projects/ucap-webmessenger-app/src/main.ts", + "polyfills": "projects/ucap-webmessenger-app/src/polyfills.ts", + "tsConfig": "projects/ucap-webmessenger-app/tsconfig.app.json", + "aot": false, + "assets": [ + "projects/ucap-webmessenger-app/src/favicon.ico", + "projects/ucap-webmessenger-app/src/assets" + ], + "styles": ["projects/ucap-webmessenger-app/src/styles.scss"], + "scripts": [], + "customWebpackConfig": { + "path": "./config/renderer.webpack.config.js", + "mergeStrategies": { "externals": "replace" } + } + }, + "configurations": { + "production": { + "fileReplacements": [ + { + "replace": "projects/ucap-webmessenger-app/src/environments/environment.ts", + "with": "projects/ucap-webmessenger-app/src/environments/environment.prod.ts" + } + ], + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "extractCss": true, + "namedChunks": false, + "aot": true, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true, + "budgets": [ + { + "type": "initial", + "maximumWarning": "2mb", + "maximumError": "5mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "6kb", + "maximumError": "10kb" + } + ] + } + } + }, + "serve": { + "builder": "@angular-builders/custom-webpack:dev-server", + "options": { + "browserTarget": "ucap-webmessenger-app:build" + }, + "configurations": { + "production": { + "browserTarget": "ucap-webmessenger-app:build:production" + } + } + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "ucap-webmessenger-app:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-app/src/test.ts", + "polyfills": "projects/ucap-webmessenger-app/src/polyfills.ts", + "tsConfig": "projects/ucap-webmessenger-app/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-app/karma.conf.js", + "assets": [ + "projects/ucap-webmessenger-app/src/favicon.ico", + "projects/ucap-webmessenger-app/src/assets" + ], + "styles": ["projects/ucap-webmessenger-app/src/styles.scss"], + "scripts": [] + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-app/tsconfig.app.json", + "projects/ucap-webmessenger-app/tsconfig.spec.json", + "projects/ucap-webmessenger-app/e2e/tsconfig.json" + ], + "exclude": ["**/node_modules/**"] + } + }, + "e2e": { + "builder": "@angular-devkit/build-angular:protractor", + "options": { + "protractorConfig": "projects/ucap-webmessenger-app/e2e/protractor.conf.js", + "devServerTarget": "ucap-webmessenger-app:serve" + }, + "configurations": { + "production": { + "devServerTarget": "ucap-webmessenger-app:serve:production" + } + } + } + } + }, + + "ucap-webmessenger-core": { + "projectType": "library", + "root": "projects/ucap-webmessenger-core", + "sourceRoot": "projects/ucap-webmessenger-core/src", + "prefix": "ucap-core", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-core/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-core/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-core/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-core/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-core/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-core/tsconfig.lib.json", + "projects/ucap-webmessenger-core/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-api-common": { + "projectType": "library", + "root": "projects/ucap-webmessenger-api-common", + "sourceRoot": "projects/ucap-webmessenger-api-common/src", + "prefix": "ucap-api-common", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-api-common/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-api-common/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-api-common/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-api-common/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-api-common/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-api-common/tsconfig.lib.json", + "projects/ucap-webmessenger-api-common/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-api-public": { + "projectType": "library", + "root": "projects/ucap-webmessenger-api-public", + "sourceRoot": "projects/ucap-webmessenger-api-public/src", + "prefix": "ucap-api-public", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-api-public/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-api-public/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-api-public/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-api-public/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-api-public/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-api-public/tsconfig.lib.json", + "projects/ucap-webmessenger-api-public/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-api-external": { + "projectType": "library", + "root": "projects/ucap-webmessenger-api-external", + "sourceRoot": "projects/ucap-webmessenger-api-external/src", + "prefix": "ucap-api-external", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-api-external/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-api-external/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-api-external/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-api-external/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-api-external/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-api-external/tsconfig.lib.json", + "projects/ucap-webmessenger-api-external/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-api": { + "projectType": "library", + "root": "projects/ucap-webmessenger-api", + "sourceRoot": "projects/ucap-webmessenger-api/src", + "prefix": "ucap-api", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-api/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-api/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-api/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-api/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-api/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-api/tsconfig.lib.json", + "projects/ucap-webmessenger-api/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-pi": { + "projectType": "library", + "root": "projects/ucap-webmessenger-pi", + "sourceRoot": "projects/ucap-webmessenger-pi/src", + "prefix": "ucap-pi", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-pi/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-pi/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-pi/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-pi/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-pi/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-pi/tsconfig.lib.json", + "projects/ucap-webmessenger-pi/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-ui": { + "projectType": "library", + "schematics": { + "@schematics/angular:component": { + "style": "scss" + } + }, + "root": "projects/ucap-webmessenger-ui", + "sourceRoot": "projects/ucap-webmessenger-ui/src", + "prefix": "ucap-ui", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-ui/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-ui/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-ui/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-ui/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-ui/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-ui/tsconfig.lib.json", + "projects/ucap-webmessenger-ui/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-ui-account": { + "projectType": "library", + "schematics": { + "@schematics/angular:component": { + "style": "scss" + } + }, + "root": "projects/ucap-webmessenger-ui-account", + "sourceRoot": "projects/ucap-webmessenger-ui-account/src", + "prefix": "ucap-account", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-ui-account/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-ui-account/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-ui-account/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-ui-account/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-ui-account/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-ui-account/tsconfig.lib.json", + "projects/ucap-webmessenger-ui-account/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-ui-chat": { + "projectType": "library", + "schematics": { + "@schematics/angular:component": { + "style": "scss" + } + }, + "root": "projects/ucap-webmessenger-ui-chat", + "sourceRoot": "projects/ucap-webmessenger-ui-chat/src", + "prefix": "ucap-chat", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-ui-chat/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-ui-chat/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-ui-chat/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-ui-chat/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-ui-chat/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-ui-chat/tsconfig.lib.json", + "projects/ucap-webmessenger-ui-chat/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-ui-room": { + "projectType": "library", + "schematics": { + "@schematics/angular:component": { + "style": "scss" + } + }, + "root": "projects/ucap-webmessenger-ui-room", + "sourceRoot": "projects/ucap-webmessenger-ui-room/src", + "prefix": "ucap-room", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-ui-room/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-ui-room/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-ui-room/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-ui-room/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-ui-room/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-ui-room/tsconfig.lib.json", + "projects/ucap-webmessenger-ui-room/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-ui-messenger": { + "projectType": "library", + "schematics": { + "@schematics/angular:component": { + "style": "scss" + } + }, + "root": "projects/ucap-webmessenger-ui-messenger", + "sourceRoot": "projects/ucap-webmessenger-ui-messenger/src", + "prefix": "ucap-messenger", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-ui-messenger/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-ui-messenger/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-ui-messenger/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-ui-messenger/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-ui-messenger/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-ui-messenger/tsconfig.lib.json", + "projects/ucap-webmessenger-ui-messenger/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-ui-organization": { + "projectType": "library", + "schematics": { + "@schematics/angular:component": { + "style": "scss" + } + }, + "root": "projects/ucap-webmessenger-ui-organization", + "sourceRoot": "projects/ucap-webmessenger-ui-organization/src", + "prefix": "ucap-organization", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-ui-organization/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-ui-organization/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-ui-organization/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-ui-organization/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-ui-organization/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-ui-organization/tsconfig.lib.json", + "projects/ucap-webmessenger-ui-organization/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-ui-profile": { + "projectType": "library", + "schematics": { + "@schematics/angular:component": { + "style": "scss" + } + }, + "root": "projects/ucap-webmessenger-ui-profile", + "sourceRoot": "projects/ucap-webmessenger-ui-profile/src", + "prefix": "ucap-profile", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-ui-profile/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-ui-profile/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-ui-profile/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-ui-profile/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-ui-profile/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-ui-profile/tsconfig.lib.json", + "projects/ucap-webmessenger-ui-profile/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-protocol": { + "projectType": "library", + "root": "projects/ucap-webmessenger-protocol", + "sourceRoot": "projects/ucap-webmessenger-protocol/src", + "prefix": "ucap-protocol", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-protocol/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-protocol/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-protocol/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-protocol/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-protocol/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-protocol/tsconfig.lib.json", + "projects/ucap-webmessenger-protocol/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-protocol-sync": { + "projectType": "library", + "root": "projects/ucap-webmessenger-protocol-sync", + "sourceRoot": "projects/ucap-webmessenger-protocol-sync/src", + "prefix": "ucap-protocol-sync", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-protocol-sync/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-protocol-sync/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-protocol-sync/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-protocol-sync/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-protocol-sync/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-protocol-sync/tsconfig.lib.json", + "projects/ucap-webmessenger-protocol-sync/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-protocol-buddy": { + "projectType": "library", + "root": "projects/ucap-webmessenger-protocol-buddy", + "sourceRoot": "projects/ucap-webmessenger-protocol-buddy/src", + "prefix": "ucap-protocol-buddy", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-protocol-buddy/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-protocol-buddy/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-protocol-buddy/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-protocol-buddy/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-protocol-buddy/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-protocol-buddy/tsconfig.lib.json", + "projects/ucap-webmessenger-protocol-buddy/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-protocol-group": { + "projectType": "library", + "root": "projects/ucap-webmessenger-protocol-group", + "sourceRoot": "projects/ucap-webmessenger-protocol-group/src", + "prefix": "ucap-protocol-group", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-protocol-group/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-protocol-group/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-protocol-group/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-protocol-group/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-protocol-group/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-protocol-group/tsconfig.lib.json", + "projects/ucap-webmessenger-protocol-group/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-protocol-info": { + "projectType": "library", + "root": "projects/ucap-webmessenger-protocol-info", + "sourceRoot": "projects/ucap-webmessenger-protocol-info/src", + "prefix": "ucap-protocol-info", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-protocol-info/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-protocol-info/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-protocol-info/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-protocol-info/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-protocol-info/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-protocol-info/tsconfig.lib.json", + "projects/ucap-webmessenger-protocol-info/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-protocol-option": { + "projectType": "library", + "root": "projects/ucap-webmessenger-protocol-option", + "sourceRoot": "projects/ucap-webmessenger-protocol-option/src", + "prefix": "ucap-protocol-option", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-protocol-option/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-protocol-option/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-protocol-option/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-protocol-option/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-protocol-option/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-protocol-option/tsconfig.lib.json", + "projects/ucap-webmessenger-protocol-option/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-protocol-query": { + "projectType": "library", + "root": "projects/ucap-webmessenger-protocol-query", + "sourceRoot": "projects/ucap-webmessenger-protocol-query/src", + "prefix": "ucap-protocol-query", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-protocol-query/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-protocol-query/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-protocol-query/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-protocol-query/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-protocol-query/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-protocol-query/tsconfig.lib.json", + "projects/ucap-webmessenger-protocol-query/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-protocol-service": { + "projectType": "library", + "root": "projects/ucap-webmessenger-protocol-service", + "sourceRoot": "projects/ucap-webmessenger-protocol-service/src", + "prefix": "ucap-protocol-service", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-protocol-service/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-protocol-service/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-protocol-service/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-protocol-service/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-protocol-service/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-protocol-service/tsconfig.lib.json", + "projects/ucap-webmessenger-protocol-service/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-protocol-authentication": { + "projectType": "library", + "root": "projects/ucap-webmessenger-protocol-authentication", + "sourceRoot": "projects/ucap-webmessenger-protocol-authentication/src", + "prefix": "ucap-protocol-authentication", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-protocol-authentication/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-protocol-authentication/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-protocol-authentication/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-protocol-authentication/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-protocol-authentication/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-protocol-authentication/tsconfig.lib.json", + "projects/ucap-webmessenger-protocol-authentication/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-protocol-status": { + "projectType": "library", + "root": "projects/ucap-webmessenger-protocol-status", + "sourceRoot": "projects/ucap-webmessenger-protocol-status/src", + "prefix": "ucap-protocol-status", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-protocol-status/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-protocol-status/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-protocol-status/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-protocol-status/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-protocol-status/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-protocol-status/tsconfig.lib.json", + "projects/ucap-webmessenger-protocol-status/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-protocol-room": { + "projectType": "library", + "root": "projects/ucap-webmessenger-protocol-room", + "sourceRoot": "projects/ucap-webmessenger-protocol-room/src", + "prefix": "ucap-protocol-room", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-protocol-room/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-protocol-room/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-protocol-room/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-protocol-room/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-protocol-room/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-protocol-room/tsconfig.lib.json", + "projects/ucap-webmessenger-protocol-room/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-protocol-event": { + "projectType": "library", + "root": "projects/ucap-webmessenger-protocol-event", + "sourceRoot": "projects/ucap-webmessenger-protocol-event/src", + "prefix": "ucap-protocol-event", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-protocol-event/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-protocol-event/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-protocol-event/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-protocol-event/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-protocol-event/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-protocol-event/tsconfig.lib.json", + "projects/ucap-webmessenger-protocol-event/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-protocol-ucti": { + "projectType": "library", + "root": "projects/ucap-webmessenger-protocol-ucti", + "sourceRoot": "projects/ucap-webmessenger-protocol-ucti/src", + "prefix": "ucap-protocol-ucti", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-protocol-ucti/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-protocol-ucti/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-protocol-ucti/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-protocol-ucti/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-protocol-ucti/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-protocol-ucti/tsconfig.lib.json", + "projects/ucap-webmessenger-protocol-ucti/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-protocol-fmc": { + "projectType": "library", + "root": "projects/ucap-webmessenger-protocol-fmc", + "sourceRoot": "projects/ucap-webmessenger-protocol-fmc/src", + "prefix": "ucap-protocol-fmc", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-protocol-fmc/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-protocol-fmc/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-protocol-fmc/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-protocol-fmc/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-protocol-fmc/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-protocol-fmc/tsconfig.lib.json", + "projects/ucap-webmessenger-protocol-fmc/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-protocol-umg": { + "projectType": "library", + "root": "projects/ucap-webmessenger-protocol-umg", + "sourceRoot": "projects/ucap-webmessenger-protocol-umg/src", + "prefix": "ucap-protocol-umg", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-protocol-umg/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-protocol-umg/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-protocol-umg/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-protocol-umg/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-protocol-umg/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-protocol-umg/tsconfig.lib.json", + "projects/ucap-webmessenger-protocol-umg/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-protocol-file": { + "projectType": "library", + "root": "projects/ucap-webmessenger-protocol-file", + "sourceRoot": "projects/ucap-webmessenger-protocol-file/src", + "prefix": "ucap-protocol-file", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-protocol-file/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-protocol-file/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-protocol-file/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-protocol-file/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-protocol-file/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-protocol-file/tsconfig.lib.json", + "projects/ucap-webmessenger-protocol-file/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-protocol-ping": { + "projectType": "library", + "root": "projects/ucap-webmessenger-protocol-ping", + "sourceRoot": "projects/ucap-webmessenger-protocol-ping/src", + "prefix": "ucap-protocol-ping", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-protocol-ping/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-protocol-ping/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-protocol-ping/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-protocol-ping/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-protocol-ping/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-protocol-ping/tsconfig.lib.json", + "projects/ucap-webmessenger-protocol-ping/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-web-storage": { + "projectType": "library", + "root": "projects/ucap-webmessenger-web-storage", + "sourceRoot": "projects/ucap-webmessenger-web-storage/src", + "prefix": "ucap-web-storage", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-web-storage/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-web-storage/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-web-storage/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-web-storage/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-web-storage/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-web-storage/tsconfig.lib.json", + "projects/ucap-webmessenger-web-storage/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-native": { + "projectType": "library", + "root": "projects/ucap-webmessenger-native", + "sourceRoot": "projects/ucap-webmessenger-native/src", + "prefix": "ucap-native", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-native/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-native/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-native/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-native/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-native/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-native/tsconfig.lib.json", + "projects/ucap-webmessenger-native/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-native-electron": { + "projectType": "library", + "root": "projects/ucap-webmessenger-native-electron", + "sourceRoot": "projects/ucap-webmessenger-native-electron/src", + "prefix": "ucap-native-electron", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-native-electron/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-native-electron/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-native-electron/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-native-electron/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-native-electron/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-native-electron/tsconfig.lib.json", + "projects/ucap-webmessenger-native-electron/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-web-socket": { + "projectType": "library", + "root": "projects/ucap-webmessenger-web-socket", + "sourceRoot": "projects/ucap-webmessenger-web-socket/src", + "prefix": "ucap-web-socket", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-web-socket/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-web-socket/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-web-socket/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-web-socket/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-web-socket/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-web-socket/tsconfig.lib.json", + "projects/ucap-webmessenger-web-socket/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-util": { + "projectType": "library", + "root": "projects/ucap-webmessenger-util", + "sourceRoot": "projects/ucap-webmessenger-util/src", + "prefix": "ucap-util", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-util/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-util/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-util/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-util/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-util/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-util/tsconfig.lib.json", + "projects/ucap-webmessenger-util/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-protocol-inner": { + "projectType": "library", + "root": "projects/ucap-webmessenger-protocol-inner", + "sourceRoot": "projects/ucap-webmessenger-protocol-inner/src", + "prefix": "ucap-protocol-inner", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-protocol-inner/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-protocol-inner/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-protocol-inner/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-protocol-inner/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-protocol-inner/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-protocol-inner/tsconfig.lib.json", + "projects/ucap-webmessenger-protocol-inner/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-ui-group": { + "projectType": "library", + "root": "projects/ucap-webmessenger-ui-group", + "sourceRoot": "projects/ucap-webmessenger-ui-group/src", + "prefix": "ucap-group", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-ui-group/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-ui-group/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-ui-group/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-ui-group/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-ui-group/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-ui-group/tsconfig.lib.json", + "projects/ucap-webmessenger-ui-group/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-util-translate": { + "projectType": "library", + "root": "projects/ucap-webmessenger-util-translate", + "sourceRoot": "projects/ucap-webmessenger-util-translate/src", + "prefix": "ucap-util-translate", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-util-translate/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-util-translate/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-util-translate/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-util-translate/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-util-translate/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-util-translate/tsconfig.lib.json", + "projects/ucap-webmessenger-util-translate/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-native-browser": { + "projectType": "library", + "root": "projects/ucap-webmessenger-native-browser", + "sourceRoot": "projects/ucap-webmessenger-native-browser/src", + "prefix": "ucap-native-browser", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-native-browser/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-native-browser/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-native-browser/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-native-browser/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-native-browser/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-native-browser/tsconfig.lib.json", + "projects/ucap-webmessenger-native-browser/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-electron-notification": { + "projectType": "library", + "root": "projects/ucap-webmessenger-electron-notification", + "sourceRoot": "projects/ucap-webmessenger-electron-notification/src", + "prefix": "ucap-electron-notification", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-electron-notification/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-electron-notification/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-electron-notification/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-electron-notification/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-electron-notification/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-electron-notification/tsconfig.lib.json", + "projects/ucap-webmessenger-electron-notification/tsconfig.spec.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + } + } + }, + "ucap-webmessenger-electron-core": { + "projectType": "library", + "root": "projects/ucap-webmessenger-electron-core", + "sourceRoot": "projects/ucap-webmessenger-electron-core/src", + "prefix": "ucap-electron-core", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-electron-core/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-electron-core/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-electron-core/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-electron-core/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-electron-core/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-electron-core/tsconfig.lib.json", + "projects/ucap-webmessenger-electron-core/tsconfig.spec.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + } + } + } + }, + "defaultProject": "ucap-webmessenger-app" +} diff --git a/config/enviroment.ts b/config/enviroment.ts new file mode 100644 index 0000000..6ce87ed --- /dev/null +++ b/config/enviroment.ts @@ -0,0 +1,19 @@ +import * as fs from 'fs'; +import * as Path from 'path'; + +const projectRoot = Path.dirname(__dirname); +const channel = process.env.NODE_ENV; + +const s = JSON.stringify; + +export function getEnviroments() { + return { + __DARWIN__: process.platform === 'darwin', + __WIN32__: process.platform === 'win32', + __LINUX__: process.platform === 'linux', + __DEV__: channel === 'development', + 'process.platform': s(process.platform), + 'process.env.NODE_ENV': s(process.env.NODE_ENV || 'development'), + 'process.env.TEST_ENV': s(process.env.TEST_ENV) + }; +} diff --git a/config/main.webpack.config.ts b/config/main.webpack.config.ts new file mode 100644 index 0000000..aad0c9b --- /dev/null +++ b/config/main.webpack.config.ts @@ -0,0 +1,111 @@ +import * as path from 'path'; +import { CleanWebpackPlugin } from 'clean-webpack-plugin'; +import * as CopyWebpackPlugin from 'copy-webpack-plugin'; +import * as webpack from 'webpack'; +import * as nodeExternals from 'webpack-node-externals'; +import { getEnviroments } from './enviroment'; + +const enviroments = getEnviroments(); + +export const externals = [nodeExternals()]; +// if (enviroments.__DEV__) { +// externals.push('devtron'); +// } + +const outputDir = 'dist/main'; + +const mainConfig: webpack.Configuration = { + entry: { main: path.resolve(__dirname, '..', 'main/src/index') }, + target: 'electron-main', + mode: enviroments.__DEV__ ? 'development' : 'production', + devtool: 'source-map', + optimization: { + noEmitOnErrors: true + }, + externals, + output: { + filename: '[name].js', + path: path.resolve(__dirname, '..', outputDir) + }, + module: { + rules: [ + { + test: /\.tsx?$/, + include: [ + path.resolve(__dirname, '..', 'main/src'), + path.resolve(__dirname, '..', 'projects') + ], + use: [ + { + loader: 'awesome-typescript-loader', + options: { + useCache: true, + configFileName: path.resolve( + __dirname, + '..', + 'main/tsconfig.main.json' + ) + } + } + ], + exclude: /node_modules/ + }, + { + test: /\.node$/, + loader: 'awesome-node-loader', + options: { + name: '[name].[ext]' + } + } + ] + }, + plugins: [ + new CleanWebpackPlugin({ verbose: false }), + // This saves us a bunch of bytes by pruning locales (which we don't use) + // from moment. + new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/), + new webpack.DefinePlugin( + Object.assign({}, enviroments, { + __PROCESS_KIND__: JSON.stringify('main') + }) + ), + new CopyWebpackPlugin([ + { + from: 'main/resources/**/*', + to: path.resolve(__dirname, '..', 'dist') + } + ]) + ], + resolve: { + extensions: ['.js', '.ts'], + alias: { + '@ucap-webmessenger/electron-core': path.resolve( + __dirname, + '..', + 'projects/ucap-webmessenger-electron-core/src/public-api' + ), + '@ucap-webmessenger/electron-notification': path.resolve( + __dirname, + '..', + 'projects/ucap-webmessenger-electron-notification/src/public-api' + ), + '@ucap-webmessenger/native': path.resolve( + __dirname, + '..', + 'projects/ucap-webmessenger-native/src/public-api' + ), + '@ucap-webmessenger/native-electron': path.resolve( + __dirname, + '..', + 'projects/ucap-webmessenger-native-electron/src/public-api' + ) + }, + modules: [path.resolve(__dirname, '..', 'node_modules/')] + }, + node: { + __dirname: false, + __filename: false + } +}; + +export default [mainConfig]; diff --git a/config/renderer.webpack.config.js b/config/renderer.webpack.config.js new file mode 100644 index 0000000..7d76c60 --- /dev/null +++ b/config/renderer.webpack.config.js @@ -0,0 +1,18 @@ +const path = require('path'); + +module.exports = (config, options) => { + const PRODUCTION = process.env.NODE_ENV === 'production'; + + config.target = 'electron-renderer'; + + config.resolve.alias = { + ...config.resolve.alias, + '@ucap-webmessenger-scss/ui': path.resolve( + __dirname, + '..', + 'projects/ucap-webmessenger-ui/src/assets/scss' + ) + }; + + return config; +}; diff --git a/config/tsconfig.webpack.json b/config/tsconfig.webpack.json new file mode 100644 index 0000000..0e7afc6 --- /dev/null +++ b/config/tsconfig.webpack.json @@ -0,0 +1,6 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "module": "commonjs" + } +} diff --git a/electron-builder.json b/electron-builder.json new file mode 100644 index 0000000..d2cced2 --- /dev/null +++ b/electron-builder.json @@ -0,0 +1,40 @@ +{ + "productName": "WooriTalk", + "appId": "lgcns.ucap.messenger", + "asar": true, + "protocols": { + "name": "WooriTalk", + "schemes": ["WooriTalk"] + }, + "publish": { + "provider": "generic", + "url": "http://localhost:8099/client-updates/" + }, + "mac": { + "target": ["default"], + "icon": "./resources/installer/woori.icns" + }, + "dmg": { + "title": "WooriTalk", + "icon": "./resources/installer/woori.icns" + }, + "win": { + "target": ["zip", "nsis"], + "icon": "./resources/installer/woori_256x256.ico" + }, + "linux": { + "target": ["AppImage", "deb", "rpm", "zip", "tar.gz"], + "icon": "./resources/linuxicon" + }, + "nsis": { + "oneClick": false, + "allowToChangeInstallationDirectory": true, + "perMachine": true, + "differentialPackage": true + }, + "directories": { + "buildResources": "resources/installer/", + "output": "dist-electron/", + "app": "." + } +} diff --git a/main/resources/image/128_128.png b/main/resources/image/128_128.png new file mode 100644 index 0000000000000000000000000000000000000000..197dd6fd0641e12e46b108ba6737adb324b3c417 GIT binary patch literal 3840 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%0Ag$SRYDjnsn|G zW;NJX|1+Vf9h}w0ATh)R(o~owfUsBv=n;SlnlSsZw6IxT2UY76{+KXx5RD8`L54>F zsvSZk2fDI4#6djbmV@;24#QKv0}py5J34rO%AEN!$i=)EY5gDYND~MentU;#0WCzf?9Y;c3tg;HK*t}p8O=Nss^iF1I*j%k? zhiO)P`}(@*2%`_F3BgQY;dR32b1vXSg{EGaS_>>ILNbU!Qdk6#K@5_@B7h8HkQ5dH zWDtX-um~W77$k*702#y}DJ%leU&mw+hg4`H0nA@U={d+H0d~K@0_?Wd{BL-h41)Q; zL7X#%f1jTL;9dF|A1$=>P|~!pNlVq_`b+@$2R9Mwkj=NK*8l(j07*qoM6N<$f?S)U AX8-^I literal 0 HcmV?d00001 diff --git a/main/resources/image/ico_64_64.png b/main/resources/image/ico_64_64.png new file mode 100644 index 0000000000000000000000000000000000000000..adbc1dd4f3a8d392d5bef410f26d22b5c9bbc9ff GIT binary patch literal 3170 zcmV-o44w0dP);r;h4gr#?9FhZ4<(O1qDt`dto+`s3M;FQ=xy3*ZIbv~f4ylTiR0Zsc zQ&NhQ*<4xxfo9M5_51Zq&#IBNjp(YMx@Xb6{=VPZ{rWj-n_H<=N~0Txus7to!zfUAY&j9OUAsC)CzTmJ8v;U1Oli>h=gYTjB9V(x&9 z+Z{`QXnF#2iJ%Gi_WeZ-cm}e(mfz6trDDDs2N@*f!f3xCgk=04avfwWcLV_do|dhbT_G(Yj^**BfuLGarN90O$OQ=WD-QoZ94$~ z{|QZ=CO-N3f41DzzmIF&{K-4I7niucZ3F;3wLU?OU-`>|>ZJDRkJ82(ra{8wmJ%R= z?h6t=`S~|$`tQ$FC$@>xgRq9<#wE_S6Cj;-!NbSL&VF`(*G+!C#?*Q17wa;_Ku@U`YbFl?LviS`rp`AvZ*Ko@^p zT*`y^o+ZAB^`0l+ssG+8i1Fv2CORJiw*ix zdt|U+n*H@jt|c1A1Gh85yr>sv|p-dUxT*@$Vp!;G_{7Qb4T?83a!srfp2}TQw1Y`b6*!t z2jc5`Y^=bovjPWz1H2AEMhs&bLBeb8x32+~IM>kUpz$2~Qo%NVjy(ZQ0`RLjHzb?{ z=biAg20?Oq_NgI&Sf^?UxCGyCZ2FutgPZ{#h~~}MvH%x-6nz&Y39vCtEQyaI(0G8~ ziF2M!fEQa9AZinB^iks!?N#K?oF(MXR zsvDHbdpFd2#0lpY6-#K;Xz7_!XaQNs zD*`XN>IFV{p-CvIWf1TZ1Z0fK+wN!5uOlU9E?-9iF@k_JF>{a6Sit#kJ8Q8q_-If` zZ&8~7m^Q4U58w&B9|-rsv3t=c@s$K76oJIZlMVq62xuLxGdl2>v=yuYU$#g~fMC1= z0v4h9MG}E)E`fwK5>c0Rtbm)XCV?1<6~U03wq*jwxtCYh40xT-Eh0dG4<;Wj8l{Z+@i)yaYP~-V`!GmBf2PAmI?e4?(pgp%=ir ze9^q`Xj6}P0$xa93)Ue(2R$Y6ttcc2cuGIW7z6V)rneC}2(=5~56Q^sbm(YHAORW3DSnkGTv+9lP654(ANuc$MR3A_s|2gqqm6yxo!#!twvtTHfxRIcW0BWA#KR_sd7fJjefNSv4Q1e{@O+N&$P2V@#4}mlC zJL@d%y#~cmNjajtkcgbbgG@dofJCeUOA@gv0SicI@{6cDluo(kHc~!h(^@~s8p4D+ z`oTYpPx#f^_Y=^3BBD;lJ#`}CsUd0~lEM{wwe}s+KER9l2V&}5vRNdllSIbw4zc8d z&<)l=MA8rAK>}Zhd!=v=LVjRK&;*uh7ExJ!%MKPW=2tCnB9*171Fau{5d0{>AEEZ+ z)V!;~cLyN>i6GRx?{3R|*6Ou83n?!oIsxzr5RpI}(BMT#K*TL7kM5*{YM}mGU^y+| zbH1GsQhrt1i&i54fHr$yjR5?y1kxS)ewckfuFxaeC-a`WI~$+A8wNcVS#h{P9E3zc zKp=%7$tvl(Lg`Za83|y~l=VZgT%acM`zi(!M&iEu07X2(A4YN?gz4{#(ey*Vk9dyi zghsI45m$qciUrUGJV}L2p)ZQQE}vg(0-*hjUrt9M0bEJxA}7rC!|?qdK;vl$!PE2y z==-pMBq(+}1AA4YLQ;}>Jh*_1HGwXuN=lc}&+@+d3YstJYBpcqo+AOv_;xC+^?lU~ z0!Cq1!_fQ@nm)kqhxCJhxZi=uYhnbg!PgcLMtY`L7Ee!do_drC)N&@TOZnbJm;gz` z91kIo00-uO9Hu{-q~AmH5P~0wcRqN#aju;60S0a;@h#vPfxH83PBdKEjvdrDQ|J70 z2EYeh(EbT%|1BN#!XFrfbc(-kq%l*F1eO39t|W7=8hP!he*@=p5RhW@lwIL_IQn=nrrb9}Ow@!d=#mIDc3 zTXPZPTy?6eOu&rKb9h)6FZ}FKH2t^7S*?9W{B~0vL2`AqvR1%&1?!5!w%tYMU0?d{ z_;4?>m8V~~Lk_X9fFrhJkPinVTKmLqN}`#ult1xsrJ$pJw29yI=oJyYO60}vJXq9y zdC#E38*hS;i1Q=;x|d^hdLQA*tD+k2(HY<(H%09mBlB2grB|~B_2;ja^zLchCg~n+ z7eK`M(SG&g6MZU)Ko1M2`489L8R9}&ZTud8V2(ey7c7BC=B*Rs7uWm#hL6khh)G*V=yu8H#q784xO@!}`hf|3 z82OK1cg*ULsqWU#-!~QP);};&LxO%}hV_AYUTC*Xo+rN~)ot%1GZqQuho-o4ymt5D zj;|n@-nh7tG`DjPP1O*=CFNyEYNv>(0lqtr%{2&+`oT%FZFS?XkJRn^OIub()4Z91 zE>*8or`2vhIN5**#s~fAtRdshgC)IL%00w(2_aza@p1F>{79b-dO>yCqq9xOsC#%? z+bak#2b4HA2Qz*Mux8(G%oFr~m)}07*qo IM6N<$g0NBY1^@s6 literal 0 HcmV?d00001 diff --git a/main/resources/image/ico_64x64.ico b/main/resources/image/ico_64x64.ico new file mode 100644 index 0000000000000000000000000000000000000000..d62de46c2302e77036aa78dcf5e0ab010ad689b1 GIT binary patch literal 119658 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 G$o~U|r++&D literal 0 HcmV?d00001 diff --git a/main/resources/image/ico_64x64.png b/main/resources/image/ico_64x64.png new file mode 100644 index 0000000000000000000000000000000000000000..adbc1dd4f3a8d392d5bef410f26d22b5c9bbc9ff GIT binary patch literal 3170 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 IM6N<$g0NBY1^@s6 literal 0 HcmV?d00001 diff --git a/main/resources/image/ico_64x64_r.ico b/main/resources/image/ico_64x64_r.ico new file mode 100644 index 0000000000000000000000000000000000000000..94ece2ba84eeba718b699cd599e0a518443e73e3 GIT binary patch literal 107599 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 literal 0 HcmV?d00001 diff --git a/main/resources/image/ico_64x64_r.png b/main/resources/image/ico_64x64_r.png new file mode 100644 index 0000000000000000000000000000000000000000..caa67f2c45c7ca5566a0a69ed0385b34c88a77cc GIT binary patch literal 1966 zcmV;f2T}NmP)Sd}2neKY^hpYIGa(_;S*&PgW!{r#SE&%5u<%ZycL zXD2jB1+W%CA^;ckOf&(=1+WXi31Y|zuob|@9!lB}wgK2g0!#;xDbE<6J7$mo=KzfF z;Y1DLJPDuz;407fo;w;zfKG{nkQCN0Fn0!v05XU{Qdk6#K@5_@B7h8HkQ5dHWDtX- zum~W77$k*702#y}DQr!7xyL(4**53>WW)u!W95N79Ll|eEvd0sH>n?vmRi5?@^? z!`lb1u={*n?NQhG7zZ!iLWG|SHcyXX?UpAU$huj_zdt&_4W|l~tQ{Zh*=^(rW_N*) zjutTTgwon3+`w5H@QDMPA(x>TUp`iZ8b?d z8*7|d_Y%T=)r-^QlDiG9tUaW!gbw&Lvyg351_rQgebW=9T_|JirAZ20D5+&_vUW@# zH`XSX5Xj-m|&Cw3C6N2!!hHRvtdWn&0Mz*FekBjo<$&$SZwT+KiP2tXSL?=Z1>AaT{ z#=*`8F@4_&{9K2#_GMIVa43KzG<`-qBq!s|EynIbrqq2-c>`e5<~NwU;D? zvhC;yUwnJ%HgiJ2hU2X7LR0Xl3yhBNVI)r$RHOI$WBmC&^M{~D^%xB;?QB>SXPFbG zy9*$}BnP-V+Of~JS#c~t!k{1zc5G;<7ltd;m3-M41>PDL4rhB?MlQBFtMS%c|CPzH8Ckpu1sN7MDQ`lENZ@ z3}TQJFT4OohruJ+H!<%(zDW%z}dmh7&Qi?0!&T}<=Ynv?*SSC`nlO-?$~|??-OR9GQwp?`LJ0>fUzw zI55nYzgC!45~?d)t9-zpJ^Pmu%YG>2_sNZ2CBzWS8U+e&X@jK<7{ZR9iup4OlA{nO z_;MqB21Hp+R2Y6H;Y_Jk0M1d+2={Nu6U-9e_cCn&R2%exvd{Ht%0Ag$SRYDjnsn|G zW;NJX|1+Vf9h}w0ATh)R(o~owfUsBv=n;SlnlSsZw6IxT2UY76{+KXx5RD8`L54>F zsvSZk2fDI4#6djbmV@;24#QKv0}py5J34rO%AEN!$i=)EY5gDYND~MentU;#0WCzf?9Y;c3tg;HK*t}p8O=Nss^iF1I*j%k? zhiO)P`}(@*2%`_F3BgQY;dR32b1vXSg{EGaS_>>ILNbU!Qdk6#K@5_@B7h8HkQ5dH zWDtX-um~W77$k*702#y}DJ%leU&mw+hg4`H0nA@U={d+H0d~K@0_?Wd{BL-h41)Q; zL7X#%f1jTL;9dF|A1$=>P|~!pNlVq_`b+@$2R9Mwkj=NK*8l(j07*qoM6N<$f?S)U AX8-^I literal 0 HcmV?d00001 diff --git a/main/resources/installer/woori.icns b/main/resources/installer/woori.icns new file mode 100644 index 0000000000000000000000000000000000000000..aa6a8e78d4aa4f2d59c075cac145b4738086f412 GIT binary patch literal 9859 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 CRP9y( literal 0 HcmV?d00001 diff --git a/main/resources/installer/woori.ico b/main/resources/installer/woori.ico new file mode 100644 index 0000000000000000000000000000000000000000..d997cca0b8158e167ce3a9bc43ce13ba0b925503 GIT binary patch literal 32038 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 literal 0 HcmV?d00001 diff --git a/main/resources/installer/woori_256x256.png b/main/resources/installer/woori_256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..73418fbe181c7a10d6c1fd1e2c4d04c65b89a997 GIT binary patch literal 18495 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

ld>m&_g#KI!4_7L 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 nsKfw(HilfuqEFqOGAz3ORm9?xfqrB}~ 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

ld>m&_g#KI!4_7L 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 Hu0mjfe?TgS literal 0 HcmV?d00001 diff --git a/main/resources/notification/image/btn_call_receive.png b/main/resources/notification/image/btn_call_receive.png new file mode 100644 index 0000000000000000000000000000000000000000..7f60010eea4bded45df1556fc125e3783a1bca95 GIT binary patch literal 842 zcmeAS@N?(olHy`uVBq!ia0vp^IzSx7!3HD`|KD<#fq_}j)5S3)qw(zw>keT@nfCoM zT6PYu9|I#Iez;AvQ158E5y3UBX?fF(L*fw;9rHLAwQ8(b5%I(&;GxZiEmw}cR!RQA zsI|!K(PGPu0q+AgZAvVfbNXFM*=FIQ^8f3-(#q27X3jlxrjDcOLL8Ug-qO1j*MC^> z&S0(iK54%&IhKPiH`mDbiE9Xl6kl3ISv`u2i zBgM(0*ALioKHc5;HTQ&NSN4OS(|(_SHs>Ueb$r^cweyVswP!!5p0=xTj&Wom?;n8* z`QU%j7T1@pDUD&i-f-FQ>G}qJ%k)i?(jM>Nx9Oac%c8gY-Hgf!Y6T2$*z4R*^)qd6 zocWf+M)m2}hclowDPX7Hyx!^=>f@pzJ&_1>b zt{8Sb#`{WNyBi!65`AXdH~1cyoi=y*Orc~;);XP;{O<2|SjxmQU+Z1DdxC&j3g3n2 zmkO^Pm?8U4;Dh?IJhlRsibOZvIZoBHw`{+)^l}(e`yG?x=dMr74r8j837f>OC%a9` zVhNMRgFQDrHW}nB^ND6kZu-V_+UIzt+2jK{z49@7=d=r&3o@+|&z*a?@P*Qc6FRZU zl8p11w>P|9S8rjYm#uf@jF6ec&a!ote-1}Vm)#0#R>=6uZV{+q(m(n8ln;F@-+IC5 z><;cXTP{yswOHC+tvXWg+4ocG-!7Ra>DMYFQ@P(Zh42c!P2CysLZ>=%6W)>*dE<23L!IM;m{#_5CIN>h^`HTNd{zeKSgyetbS|S~shD_03l@eo8VO zx(E0caI7(X{+vxY&6Q)mU;WOA74qw1?nFhuNqszbT?p^1Z<}ItI`+PaP}z_VL2AqP zUWqcdOWQQvYo*T3B*E&J(i^AmL!r#7S8ny&0+c_uX?j%lYM^@mr0U3(A(K`WZJmDi z?%gE)$1~=93(}lAfA5wv4^@J0dM^!0zj^wY_1tT_^7N+$&3wC5p(nec-aL_ISNEC+ Rn!r55;OXk;vd$@?2>=Xmi>v?u literal 0 HcmV?d00001 diff --git a/main/resources/notification/image/btn_call_refuse.png b/main/resources/notification/image/btn_call_refuse.png new file mode 100644 index 0000000000000000000000000000000000000000..674a5843ccbad6ee666124a957c0a34d77378e32 GIT binary patch literal 643 zcmV-}0(||6P)1wg9t({zh#*)fTBwBvw6L%a62U59BZA}?#6r;0!bbfAqTqs&G%jF@vgtXPJ3s&TPC0A%s{|8nMdPo_mz*wGP+= zYy&m{tAUlkXW$j^0(b&E16sL-z8~FJdVN{V-r5Wt0fvFyz>=p zj#bEp&w0rts|dY$7&s5CFL|~HxDG4_uEfep4T+PsM5VZvDI54;B6Epn!jQX=@=6Ks z$Q0?6FBQ*+m1BDy;hu_uf7r&*Dep3#@2w;JF>&vwt;1ElRmR1PP2+9sMoM@(a{VcA z061MkHgFr*3rt1se+3p|FQh3nsd6Tqj~i>YPp z4R8?HV%zGp4TWwI%DQUn?jW!cxKlMRqB~csm3^>sq0uN;`_nVQUq`~;NZ1<*dm~|Q zB>(;5rA|r@ zy_imDUcd`p=1Fl@=QUD;YDBWDB3TU1jx~P!uvllWwRbaa=Nwo+*qk|Qt-a>IF5mk0 z{&NTf0s${kS~=m9@5ghdCIj<<-+@0|jfQtEW`d*ciSo2H(F^B z0vBYYr+}#?i+vUN5a^Qcdc`*bpSx}_1#59de@StPwKO>*#fDORko<8hgpCl7GoYmN#;eUX4 zjqkgFZJvMTLnj`W*bW)U8JQH582CHDB$MEm%=Evsd+9JmI&Ee|?H zm?|rL1$fIPSaVB)=%!J&TW034ELE2b?36F}8@!&i#080DdpZRp`)CDl$tauSNG4kg zq~Tek6r1uSIf9X;e;#-f_{-C-UlM^2J8}G9MqZO%Pl*L2%gw!DZ8Sf*TJ% z)%v)m=7xJ&t3*!s63+~en|oQUCw4?@ zV!I`%Y(sFi^z}wTL+~E(l{O-4l}Nc>^IOurtk#p@UIzElqRrh)MW*S%Cqji-)=dl|=Zd%2fNsXnDta4+)+?qy2Lx|d3+ z;9e5k%Lk0OmvJ1o&u=f|IClQ_vL)S1rBwU5mrAJ~rIg#f92gid%UaI8jN`by+)JfY za4&;8HrEy9W;i0>iaUAEi(WgWp5O|aT{{eg{g*wbuKJEYj002ovPDHLkV1gq~ B1m6Gv literal 0 HcmV?d00001 diff --git a/main/resources/notification/image/btn_close.png b/main/resources/notification/image/btn_close.png new file mode 100644 index 0000000000000000000000000000000000000000..2cdaee376e12bfa7cfa4fb5503443e4375940d30 GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`D?MEtLo9liPQ1u@D1gVcpX>c; zOBqM^i-9tp?iU5;9M*SKYFu)}{ZhDLfS32Vm$lpf*eYFed6H8u7IS%DU3D(ww*#yh z%?@Y3@%?jR)qjw3zF4R|{J_N>nvPRqggv?39jADxYd(yd;JK~1K&?ZlRqnvDChdd% zlR5vKsp^sapx5Oq{H4{lJ1N-lYT4KFeJp&hQ(C7AiMm8gzqC!eQ+)^jgSaB;H@Y$p ZnC;`@zn$8mHyh|^22WQ%mvv4FO#t50SStVk literal 0 HcmV?d00001 diff --git a/main/resources/notification/image/btn_close_gray.png b/main/resources/notification/image/btn_close_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..0ce0aba0c472a7ebac3374d27f50c11740698963 GIT binary patch literal 3585 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 literal 0 HcmV?d00001 diff --git a/main/resources/notification/image/img_nophoto_50.png b/main/resources/notification/image/img_nophoto_50.png new file mode 100644 index 0000000000000000000000000000000000000000..029f81bd7f46182fbe5f0dc4f865706b7f82b210 GIT binary patch literal 2348 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 H9R>aeXv1{C literal 0 HcmV?d00001 diff --git a/main/resources/notification/styles/noti_messege.css b/main/resources/notification/styles/noti_messege.css new file mode 100644 index 0000000..d2dc233 --- /dev/null +++ b/main/resources/notification/styles/noti_messege.css @@ -0,0 +1,130 @@ +html { + height: 100%; + overflow-y: scroll; +} +body { + position: relative; + width: 100%; + height: 100%; + padding: 0; + margin: 0; + color: #333; + font-family: '나눔고딕', Malgun Gothic, '맑은고딕', Arial, Dotum, '돋움', + Gulim, '굴림'; + font-size: 12px; + line-height: 18px !important; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +body * { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +ul, +ol { + list-style: none; + margin: 0; + padding: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +img { + border: none; +} +a:link, +a:visited, +a:hover, +a:active { + text-decoration: none; +} + +.noti_messege { + width: 340px; + height: 100px; + border: 1px solid #666; + background-color: #fff; + box-shadow: 0px 0px 3px 0px #e7e7e7; +} +.info { + position: relative; + width: 100%; + height: 100%; + box-sizing: border-box; + padding: 16px 14px; + color: #fff; +} +.btn_close { + position: absolute; + z-index: 1; + right: 6px; + top: 6px; + width: 20px; + height: 20px; + background: url(../image/btn_close_gray.png) no-repeat 50% 50%; +} +.btn_close:hover { + opacity: 0.7; +} +.photo { + position: relative; + top: 0px; + right: 0; + bottom: 0; + left: 0; + margin: 4px 0; + width: 54px; + height: 54px; + border-radius: 50%; + background: #5bc1ff url(../image/img_nophoto_50.png) no-repeat 50% 50%; + border: 2px solid #ddd; +} +.info .profile { + position: absolute; + width: 60px; + text-align: center; +} +.photo img { + overflow: hidden; + width: 50px; + height: 50px; + border-radius: 50px; +} +.noti_messege .info .profile + div { + padding-left: 70px; + position: relative; + line-height: 180%; + height: 100%; +} +.sender { + font-size: 14px; + font-weight: bold; + margin-bottom: 4px; + color: #333; + width: 94%; +} +.sender .name { + color: #2e7fb5; +} +.message { + color: #666; +} +.ellipsis { + display: block; + text-overflow: ellipsis; + white-space: nowrap; + word-wrap: normal; + overflow: hidden; +} +.ellipsis_row2 { + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + word-wrap: break-word; + line-height: 1.6em; + height: 3.2em; +} diff --git a/main/resources/notification/template.html b/main/resources/notification/template.html new file mode 100644 index 0000000..f1a0760 --- /dev/null +++ b/main/resources/notification/template.html @@ -0,0 +1,50 @@ + + + + [개발]M Messenger - 메시지 알림 + + + + + + + +

+
+ +
+
+ + +
+
+
+
    +
  • + 김 수안무 거북이와 두루미님이 메시지를 + 보냈습니다. +
  • +
  • + 홍길동 대리(솔루션사업팀)홍길동 대리(솔루션사업팀)홍길동 + 대리(솔루션사업팀)홍길동 대리(솔루션사업팀) +
  • +
+
+
+
+ + diff --git a/main/src/app/AppWindow.ts b/main/src/app/AppWindow.ts new file mode 100644 index 0000000..e39874c --- /dev/null +++ b/main/src/app/AppWindow.ts @@ -0,0 +1,229 @@ +import * as path from 'path'; +import * as url from 'url'; + +import { app, BrowserWindow, screen, ipcMain, IpcMainEvent } from 'electron'; +import windowStateKeeper from 'electron-window-state'; +import { EventEmitter } from 'events'; + +import { now } from '../util/now'; +import { registerWindowStateChangedEvents } from '../lib/window-state'; +import { + ElectronAppChannel, + ElectronBrowserWindowChannel, + ElectronWebContentsChannel +} from '@ucap-webmessenger/electron-core'; + +export class AppWindow { + private window: BrowserWindow | null = null; + + private eventEmitter = new EventEmitter(); + + // tslint:disable-next-line: variable-name + private _loadTime: number | null = null; + // tslint:disable-next-line: variable-name + private _rendererReadyTime: number | null = null; + + private minWidth = 960; + private minHeight = 660; + + public constructor() { + const savedWindowState = windowStateKeeper({ + defaultWidth: this.minWidth, + defaultHeight: this.minHeight + }); + + const windowOptions: Electron.BrowserWindowConstructorOptions = { + x: savedWindowState.x, + y: savedWindowState.y, + width: savedWindowState.width, + height: savedWindowState.height, + minWidth: this.minWidth, + minHeight: this.minHeight, + center: true, + // This fixes subpixel aliasing on Windows + // See https://github.com/atom/atom/commit/683bef5b9d133cb194b476938c77cc07fd05b972 + backgroundColor: '#fff', + webPreferences: { + // Disable auxclick event + // See https://developers.google.com/web/updates/2016/10/auxclick + disableBlinkFeatures: 'Auxclick', + // Enable, among other things, the ResizeObserver + experimentalFeatures: true, + nodeIntegration: true + }, + acceptFirstMouse: true, + icon: path.join(__dirname, 'resources/image', 'ico_64_64.png') + }; + + if (__DARWIN__) { + windowOptions.titleBarStyle = 'hidden'; + } else if (__WIN32__) { + windowOptions.frame = false; + } else if (__LINUX__) { + windowOptions.icon = path.join(__dirname, 'static', 'icon-logo.png'); + } + + this.window = new BrowserWindow(windowOptions); + savedWindowState.manage(this.window); + + let quitting = false; + app.on(ElectronAppChannel.BeforeQuit, () => { + quitting = true; + }); + + ipcMain.on(ElectronAppChannel.WillQuit, (event: IpcMainEvent) => { + quitting = true; + event.returnValue = true; + }); + + // on macOS, when the user closes the window we really just hide it. This + // lets us activate quickly and keep all our interesting logic in the + // renderer. + if (__DARWIN__) { + this.window.on(ElectronBrowserWindowChannel.Close, e => { + if (!quitting) { + e.preventDefault(); + } + }); + } + + if (__WIN32__) { + // workaround for known issue with fullscreen-ing the app and restoring + // is that some Chromium API reports the incorrect bounds, so that it + // will leave a small space at the top of the screen on every other + // maximize + // + // adapted from https://github.com/electron/electron/issues/12971#issuecomment-403956396 + // + // can be tidied up once https://github.com/electron/electron/issues/12971 + // has been confirmed as resolved + this.window.once(ElectronBrowserWindowChannel.ReadyToShow, () => { + this.window.on(ElectronBrowserWindowChannel.Unmaximize, () => { + setTimeout(() => { + const bounds = this.window.getBounds(); + bounds.width += 1; + this.window.setBounds(bounds); + bounds.width -= 1; + this.window.setBounds(bounds); + }, 5); + }); + }); + } + } + + public load(): void { + let startLoad = 0; + + this.window.webContents.once( + ElectronWebContentsChannel.DidStartLoading, + () => { + this._rendererReadyTime = null; + this._loadTime = null; + + startLoad = now(); + } + ); + + this.window.webContents.once( + ElectronWebContentsChannel.DidFinishLoad, + () => { + this.window.webContents.setVisualZoomLevelLimits(1, 1); + + if (process.env.NODE_ENV === 'development') { + this.window.webContents.openDevTools(); + } + + this._loadTime = now() - startLoad; + } + ); + + this.window.webContents.on(ElectronWebContentsChannel.DidFailLoad, () => { + this.window.webContents.openDevTools(); + this.window.show(); + }); + + registerWindowStateChangedEvents(this.window); + + if (__DEV__) { + this.window.loadURL('http://localhost:4200'); + } else { + this.window.loadURL( + url.format({ + pathname: path.join( + __dirname, + '..', + 'ucap-webmessenger-app/index.html' + ), + protocol: 'file:', + slashes: true + }) + ); + } + } + + /** Is the page loaded and has the renderer signalled it's ready? */ + private get rendererLoaded(): boolean { + return !!this.loadTime && !!this.rendererReadyTime; + } + + public onClose(fn: () => void) { + this.window.on(ElectronBrowserWindowChannel.Closed, fn); + } + + /** + * Register a function to call when the window is done loading. At that point + * the page has loaded and the renderer has signalled that it is ready. + */ + public onDidLoad(fn: () => void): EventEmitter { + return this.eventEmitter.on('did-load', fn); + } + + public isMinimized() { + return this.window.isMinimized(); + } + + /** Is the window currently visible? */ + public isVisible() { + return this.window.isVisible(); + } + + public restore() { + this.window.restore(); + } + + public focus() { + this.window.focus(); + } + + /** Show the window. */ + public show() { + this.window.show(); + } + + /** + * Get the time (in milliseconds) spent loading the page. + * + * This will be `null` until `onDidLoad` is called. + */ + public get loadTime(): number | null { + return this._loadTime; + } + + /** + * Get the time (in milliseconds) elapsed from the renderer being loaded to it + * signaling it was ready. + * + * This will be `null` until `onDidLoad` is called. + */ + public get rendererReadyTime(): number | null { + return this._rendererReadyTime; + } + + public destroy() { + this.window.destroy(); + } + + public get browserWindow(): BrowserWindow | null { + return this.window; + } +} diff --git a/main/src/crash/CrashWindow.ts b/main/src/crash/CrashWindow.ts new file mode 100644 index 0000000..e69de29 diff --git a/main/src/crash/show-uncaught-exception.ts b/main/src/crash/show-uncaught-exception.ts new file mode 100644 index 0000000..d0e778a --- /dev/null +++ b/main/src/crash/show-uncaught-exception.ts @@ -0,0 +1 @@ +export function showUncaughtException(isLaunchError: boolean, error: Error) {} diff --git a/main/src/global.d.ts b/main/src/global.d.ts new file mode 100644 index 0000000..5210c20 --- /dev/null +++ b/main/src/global.d.ts @@ -0,0 +1,18 @@ +/* eslint-disable @typescript-eslint/interface-name-prefix */ +/** Is the app running in dev mode? */ +declare const __DEV__: boolean; + +/** Is the app being built to run on Darwin? */ +declare const __DARWIN__: boolean; + +/** Is the app being built to run on Win32? */ +declare const __WIN32__: boolean; + +/** Is the app being built to run on Linux? */ +declare const __LINUX__: boolean; + +/** + * The currently executing process kind, this is specific to desktop + * and identifies the processes that we have. + */ +declare const __PROCESS_KIND__: 'main' | 'ui'; diff --git a/main/src/index.ts b/main/src/index.ts new file mode 100644 index 0000000..ed9548b --- /dev/null +++ b/main/src/index.ts @@ -0,0 +1,306 @@ +import { app, ipcMain, IpcMainEvent, remote } from 'electron'; +import * as path from 'path'; +import * as url from 'url'; +import * as fse from 'fs-extra'; +import * as fs from 'fs'; + +import { AppWindow } from './app/AppWindow'; +import { now } from './util/now'; +import { showUncaughtException } from './crash/show-uncaught-exception'; + +import { + UpdaterChannel, + FileChannel, + IdleStateChannel, + NotificationChannel +} from '@ucap-webmessenger/native-electron'; +import { ElectronNotificationService } from '@ucap-webmessenger/electron-notification'; + +import { root } from './util/root'; +import { DefaultFolder } from './lib/default-folder'; +import { FileUtil } from './lib/file-util'; + +import { IdleChecker } from './lib/idle-checker'; +import { NotificationRequest } from '@ucap-webmessenger/native'; +import { ElectronAppChannel } from '@ucap-webmessenger/electron-core'; + +let appWindow: AppWindow | null = null; + +const launchTime = now(); +let readyTime: number | null = null; + +type OnDidLoadFn = (window: AppWindow) => void; +let onDidLoadFns: Array | null = []; + +let preventQuit = false; + +let notificationService: ElectronNotificationService | null; + +function handleUncaughtException(error: Error) { + preventQuit = true; + + // If we haven't got a window we'll assume it's because + // we've just launched and haven't created it yet. + // It could also be because we're encountering an unhandled + // exception on shutdown but that's less likely and since + // this only affects the presentation of the crash dialog + // it's a safe assumption to make. + const isLaunchError = appWindow === null; + + if (appWindow) { + appWindow.destroy(); + appWindow = null; + } + + showUncaughtException(isLaunchError, error); +} + +function getUptimeInSeconds() { + return (now() - launchTime) / 1000; +} + +process.on('uncaughtException', (error: Error) => { + // error = withSourceMappedStack(error); + // reportError(error, getExtraErrorContext()); + handleUncaughtException(error); +}); + +let isDuplicateInstance = false; +const gotSingleInstanceLock = app.requestSingleInstanceLock(); +isDuplicateInstance = !gotSingleInstanceLock; +let idle: IdleChecker | null; + +app.on(ElectronAppChannel.SecondInstance, (event, args, workingDirectory) => { + // Someone tried to run a second instance, we should focus our window. + if (appWindow) { + if (appWindow.isMinimized()) { + appWindow.restore(); + } + + if (!appWindow.isVisible()) { + appWindow.show(); + } + + appWindow.focus(); + } +}); + +if (isDuplicateInstance) { + app.quit(); +} + +function createWindow() { + const window = new AppWindow(); + + if (__DEV__) { + // const { + // default: installExtension, + // REDUX_DEVTOOLS + // } = require('electron-devtools-installer'); + + import('electron-debug').then(ed => { + ed.default({ showDevTools: true }); + }); + + import('electron-devtools-installer').then(edi => { + const ChromeLens = { + id: 'idikgljglpfilbhaboonnpnnincjhjkd', + electron: '>=1.2.1' + }; + + const extensions = [edi.REDUX_DEVTOOLS, ChromeLens]; + + for (const extension of extensions) { + try { + edi.default(extension); + } catch (e) { + console.log(e); + } + } + }); + } + + window.onClose(() => { + appWindow = null; + if (!__DARWIN__ && !preventQuit) { + app.quit(); + } + }); + + window.onDidLoad(() => { + window.show(); + + const fns = onDidLoadFns; + onDidLoadFns = null; + for (const fn of fns) { + fn(window); + } + }); + + window.load(); + + appWindow = window; +} + +// This method will be called when Electron has finished +// initialization and is ready to create browser windows. +// Some APIs can only be used after this event occurs. +app.on(ElectronAppChannel.Ready, () => { + if (isDuplicateInstance) { + return; + } + + readyTime = now() - launchTime; + + createWindow(); + + notificationService = new ElectronNotificationService({ + width: 340, + height: 100, + padding: 10, + borderRadius: 0, + // appIcon: iconPath, + displayTime: 5000, + defaultStyleContainer: {}, + defaultStyleAppIcon: { display: 'none' }, + defaultStyleImage: {}, + defaultStyleClose: {}, + defaultStyleText: {} + }); + + notificationService.options.defaultWindow.webPreferences.preload = path.join( + __dirname, + 'resources/notification/preload.js' + ); + + notificationService.templatePath = path.join( + __dirname, + 'resources/notification/template.html' + ); + + ipcMain.on('uncaught-exception', (event: IpcMainEvent, error: Error) => { + handleUncaughtException(error); + }); + + ipcMain.on( + 'send-error-report', + ( + event: IpcMainEvent, + { error, extra }: { error: Error; extra: { [key: string]: string } } + ) => {} + ); +}); + +// Quit when all windows are closed. +app.on(ElectronAppChannel.WindowAllClosed, () => { + // On OS X it is common for applications and their menu bar + // to stay active until the user quits explicitly with Cmd + Q + if (process.platform !== 'darwin') { + app.quit(); + } +}); + +app.on(ElectronAppChannel.Activate, () => { + onDidLoad(window => { + window.show(); + }); +}); + +function onDidLoad(fn: OnDidLoadFn) { + if (onDidLoadFns) { + onDidLoadFns.push(fn); + } else { + if (appWindow) { + fn(appWindow); + } + } +} + +ipcMain.on(UpdaterChannel.Check, (event: IpcMainEvent, ...args: any[]) => { + event.returnValue = false; +}); + +ipcMain.on(FileChannel.ReadFile, (event: IpcMainEvent, ...args: any[]) => { + try { + fse.readFile(root(args[0]), (err, data) => { + if (!!err) { + event.returnValue = null; + } else { + event.returnValue = new Blob([data]); + } + }); + } catch (error) { + event.returnValue = null; + } +}); + +ipcMain.on( + FileChannel.SaveFile, + async (event: IpcMainEvent, ...args: any[]) => { + try { + const buffer: Buffer = args[0]; + const fileName: string = args[1]; + let savePath: string = path.join( + !!args[2] ? args[2] : DefaultFolder.downloads(), + fileName + ); + savePath = await FileUtil.uniqueFileName(savePath); + + fse.writeFile(savePath, buffer, err => { + if (!err) { + event.returnValue = savePath; + } else { + event.returnValue = undefined; + } + }); + } catch (error) { + event.returnValue = undefined; + } + } +); + +ipcMain.on( + IdleStateChannel.StartCheck, + (event: IpcMainEvent, ...args: any[]) => { + if (!!idle) { + idle.destoryChecker(); + idle = null; + } + idle = new IdleChecker(appWindow.browserWindow); // default 10min + idle.startChecker(); + } +); + +ipcMain.on( + NotificationChannel.Notify, + (event: IpcMainEvent, ...args: any[]) => { + const noti: NotificationRequest = args[0]; + + notificationService.notify({ + title: noti.title, + text: noti.contents, + image: + noti.image || + path.join(__dirname, 'resources/notification/image/img_nophoto_50.png'), + sound: noti.useSound + ? path.join( + 'file://', + __dirname, + 'resources/notification/sound/messageAlarm.mp3' + ) + : '', + onClick: () => { + console.log('onClick'); + } + }); + + console.log('Channel.notify', noti); + } +); + +ipcMain.on( + NotificationChannel.CloseAllNotify, + (event: IpcMainEvent, ...args: any[]) => { + console.log('Channel.closeAllNotify', args); + } +); diff --git a/main/src/lib/default-folder.ts b/main/src/lib/default-folder.ts new file mode 100644 index 0000000..c8076e6 --- /dev/null +++ b/main/src/lib/default-folder.ts @@ -0,0 +1,37 @@ +import * as os from 'os'; +import { execSync } from 'child_process'; +import * as fse from 'fs-extra'; + +export class DefaultFolder { + static downloads(): string { + switch (os.platform()) { + case 'win32': + return `${process.env.USERPROFILE}/Downloads`; + case 'darwin': + return `${process.env.HOME}/Downloads`; + case 'linux': { + let dir: Buffer; + try { + dir = execSync('xdg-user-dir DOWNLOAD', { stdio: [0, 3, 3] }); + } catch (_) {} + + if (dir) { + return dir.toString('utf-8'); + } + + let stat: fse.Stats; + const homeDownloads = `${process.env.HOME}/Downloads`; + try { + stat = fse.statSync(homeDownloads); + } catch (_) {} + if (stat) { + return homeDownloads; + } + return '/tmp/'; + } + + default: + break; + } + } +} diff --git a/main/src/lib/file-util.ts b/main/src/lib/file-util.ts new file mode 100644 index 0000000..d4108a7 --- /dev/null +++ b/main/src/lib/file-util.ts @@ -0,0 +1,222 @@ +import * as path from 'path'; +import * as fse from 'fs-extra'; + +/** + * + * separator + * If the specified filename exists, the separator will be added before the incremental value such as: file{separator}2.jpg + * The default value is '-'. + * + * mode + * The mode allows you to specify which characters to use to generate the incremental value (the string after the separator) + * The default value is 'numeric'. + * 'numeric' Using the following characters: 1234567890 + * 'alpha' Using the following characters: abcdefghijklmnopqrstuvwxyz + * 'ALPHA' Using the following characters: ABCDEFGHIJKLMNOPQRSTUVWXYZ + * 'alphanumeric' Using the following characters: 0123456789abcdefghijklmnopqrstuvwxyz + * 'ALPHANUMERIC' Using the following characters: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ + * 'charset' You must specify the characters you wish to use in the charset option + * + * paddingCharacter && paddingSize + * If you wish to left-pad the incremental values with a character, use this option. Here's an example : + * var uniquefilename = require('uniquefilename'); + * options = {mode: 'alpha', paddingCharacter: '0', paddingSize: 3}; + * uniquefilename.get('/path/to/dir/file.jpg', options, function(filename) { + * // filename might be "/path/to/dir/file.jpg", + * // "/path/to/dir/file-002.jpg", "/path/to/dir/file-045.jpg", etc... + * // depending on the files that exist on your filesystem + * }); + * + * alwaysAppend + * If alwaysAppend is true filenames will include the separator and attachment from the first request. + * So instead of file.jpg, file-2.jpg you'd get file-1.jpg, file-2.jpg. + */ +export interface UniqueFileNameOption { + separator?: string; + mode?: + | 'numeric' + | 'alpha' + | 'ALPHA' + | 'alphanumeric' + | 'ALPHANUMERIC' + | 'charset'; + paddingCharacter?: string; + paddingSize?: number; + alwaysAppend?: boolean; + charset?: string; +} + +const charsets = { + alpha: 'abcdefghijklmnopqrstuvwxyz', + alphanumeric: '0123456789abcdefghijklmnopqrstuvwxyz', + ALPHA: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', + ALPHANUMERIC: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' +}; + +interface UniqueFile { + dir?: string; + ext?: string; + base?: string; + increment?: number; +} + +export class FileUtil { + static blobToBuffer(blob: Blob): Promise { + if (typeof Blob === 'undefined' || !(blob instanceof Blob)) { + throw new Error('first argument must be a Blob'); + } + + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onloadend = () => { + resolve(Buffer.from(reader.result as ArrayBuffer)); + }; + reader.onerror = () => { + reader.abort(); + reject(reader.error); + }; + reader.readAsArrayBuffer(blob); + }); + } + + static uniqueFileName( + filePath: string, + options?: UniqueFileNameOption + ): Promise { + return new Promise((resolve, reject) => { + const dir = path.dirname(filePath); + const ext = path.extname(filePath); + const base = path.basename(filePath, ext); + + const uniqueFile: UniqueFile = { + dir, + ext, + base + }; + + options = options || {}; + options.separator = options.separator || '-'; + options.mode = options.mode || 'numeric'; + + if ('numeric' !== options.mode) { + if (charsets[options.mode]) { + options.charset = charsets[options.mode]; + options.mode = 'charset'; + } else if ( + 'charset' !== options.mode || + ('charset' === options.mode && !options.charset) + ) { + options.mode = 'numeric'; + } + } + + if (options.paddingSize && !options.paddingCharacter) { + options.paddingCharacter = '0'; + } + + FileUtil.uniqueFileNameProcess( + uniqueFile, + options, + (fileName: string) => { + resolve(fileName); + } + ); + }); + } + + private static uniqueFileNameProcess( + uniqueFile: UniqueFile, + options: UniqueFileNameOption, + callback: (fileName: string) => void + ) { + let fileName: string; + let append = ''; + + if (options.alwaysAppend && !uniqueFile.increment) { + uniqueFile.increment = 1; + } + + if (uniqueFile.increment) { + if ('numeric' === options.mode) { + append = '' + uniqueFile.increment; + } else { + append = FileUtil.numberToString(uniqueFile.increment, options.charset); + } + + if (options.paddingSize) { + while (append.length < options.paddingSize) { + append = options.paddingCharacter + append; + } + } + + append = options.separator + append; + } + + fileName = path.join( + uniqueFile.dir, + uniqueFile.base + append + uniqueFile.ext + ); + if (fse.existsSync(fileName)) { + if (uniqueFile.increment) { + uniqueFile.increment += 1; + } else { + uniqueFile.increment = 'numeric' === options.mode ? 2 : 1; + } + return FileUtil.uniqueFileNameProcess(uniqueFile, options, callback); + } else { + return callback(fileName); + } + } + + private static numberToString(nbr: number, charset: string) { + const charsetLen = charset.length; + let strLen = 0; + let strThisLen = 0; + let tmp: number; + + for (let maxpower = 20; maxpower >= 0; maxpower--) { + const maxvalue = FileUtil.sumOfPowerFromOne(charsetLen, maxpower); + + if (maxvalue < nbr) { + strLen = maxpower + 1; + strThisLen = maxvalue + Math.pow(charsetLen, maxpower + 1) - maxvalue; + + break; + } + } + + if (0 === strLen) { + return null; + } + + let str = ''; + while (--strLen >= 0) { + if (strLen === 0) { + str += charset.charAt(nbr - 1); + break; + } + + strThisLen = Math.pow(charsetLen, strLen); + const initial = FileUtil.sumOfPowerFromOne(charsetLen, strLen - 1); + + for (tmp = charsetLen; tmp >= 1; tmp--) { + if (initial + tmp * strThisLen < nbr) { + break; + } + } + + nbr -= tmp * strThisLen; + str += charset.charAt(tmp - 1); + } + + return str; + } + + private static sumOfPowerFromOne(base: number, maxpower: number) { + let value = 0; + for (let tmp = maxpower; tmp >= 1; tmp--) { + value += Math.pow(base, tmp); + } + return value; + } +} diff --git a/main/src/lib/idle-checker.ts b/main/src/lib/idle-checker.ts new file mode 100644 index 0000000..fe8761c --- /dev/null +++ b/main/src/lib/idle-checker.ts @@ -0,0 +1,72 @@ +import { powerMonitor, BrowserWindow } from 'electron'; +import { IdleStateChannel } from '@ucap-webmessenger/native-electron'; +import { setInterval } from 'timers'; + +export enum IdleType { + ACTIVE = 'ACT', + IDLE = 'IDLE' +} + +export class IdleChecker { + private limitSec: number; + private intervalObject: any; + private status: IdleType; + private window: BrowserWindow | null; + + public constructor(window: BrowserWindow, limitedMin?: number) { + limitedMin = limitedMin || 10; + + this.limitSec = limitedMin * 60; + this.intervalObject = null; + this.status = IdleType.ACTIVE; + this.window = window; + } + + private doCheckIdle(): void { + const idle: number = powerMonitor.getSystemIdleTime(); + if (idle > this.limitSec) { + if (this.status === IdleType.ACTIVE) { + this.status = IdleType.IDLE; + // TODO :: USER_STATUS change away + this.window.webContents.send(IdleStateChannel.Changed, this.status); + } + } else { + if (this.status === IdleType.IDLE) { + this.status = IdleType.ACTIVE; + // TODO :: USER_STATUS chage online + this.window.webContents.send(IdleStateChannel.Changed, this.status); + } + } + } + + public resetIdleTime(limitedMin: number): void { + limitedMin = limitedMin || 10; + + if (!!this.intervalObject) { + clearInterval(this.intervalObject); + } + this.limitSec = limitedMin * 60; + + // storage.setIdleTimeLimit(limitedMin); + // global.opt_idleTimeLimit = limitedMin; + + this.startChecker(); + console.log('RESET IDLE TIMER in ' + limitedMin + 'm'); + } + + public startChecker() { + console.log('Idle Checker Start'); + if (!this.intervalObject) { + this.intervalObject = setInterval(() => { + this.doCheckIdle(); + }, 1000); + } + } + + public destoryChecker() { + console.log('Idle Checker Destory'); + if (!!this.intervalObject) { + clearInterval(this.intervalObject); + } + } +} diff --git a/main/src/lib/storage.ts b/main/src/lib/storage.ts new file mode 100644 index 0000000..860d086 --- /dev/null +++ b/main/src/lib/storage.ts @@ -0,0 +1,99 @@ +import Store from 'electron-store'; + +const STORE_KEY_AUTORUN = 'options.autoRun'; +const STORE_KEY_AUTOLOGIN = 'options.autoLogin'; +const STORE_KEY_STARTUPHIDEWINDOW = 'options.startupHideWindow'; +const STORE_KEY_LOGINCOMPANY = 'login.loginCompany'; +const STORE_KEY_LOGINID = 'login.loginId'; +const STORE_KEY_LOGINPW = 'login.loginPw'; + +export class Storage extends Store { + constructor() { + super({ + schema: { + options: { + type: 'object', + properties: { + autoRun: { + type: 'boolean' + }, + autoLogin: { + type: 'boolean' + }, + startupHideWindow: { + type: 'boolean' + } + }, + default: { + autoRun: false, + autoLogin: false, + startupHideWindow: false + } + }, + login: { + type: 'object', + properties: { + loginCompany: { + type: 'string' + }, + loginId: { + type: 'string' + }, + loginPw: { + type: 'string' + } + }, + default: { + loginCompany: '', + loginId: '', + loginPw: '' + } + } + }, + encryptionKey: 'ucap', + fileExtension: 'dat' + }); + } + + get autoRun(): boolean { + return this.get(STORE_KEY_AUTORUN, false); + } + set autoRun(autoRun: boolean) { + this.set(STORE_KEY_AUTORUN, autoRun); + } + + get autoLogin(): boolean { + return this.get(STORE_KEY_AUTOLOGIN, false); + } + set autoLogin(autoLogin: boolean) { + this.set(STORE_KEY_AUTOLOGIN, autoLogin); + } + + get startupHideWindow(): boolean { + return this.get(STORE_KEY_STARTUPHIDEWINDOW, false); + } + set startupHideWindow(startupHideWindow: boolean) { + this.set(STORE_KEY_STARTUPHIDEWINDOW, startupHideWindow); + } + + get loginCompany(): string { + return this.get(STORE_KEY_LOGINCOMPANY, false); + } + set loginCompany(loginCompany: string) { + this.set(STORE_KEY_LOGINCOMPANY, loginCompany); + } + + get loginId(): string { + return this.get(STORE_KEY_LOGINID, false); + } + set loginId(loginId: string) { + this.set(STORE_KEY_LOGINID, loginId); + } + + get loginPw(): string { + return this.get(STORE_KEY_LOGINPW, false); + } + set loginPw(loginPw: string) { + this.set(STORE_KEY_LOGINPW, loginPw); + } +} diff --git a/main/src/lib/window-state.ts b/main/src/lib/window-state.ts new file mode 100644 index 0000000..2354250 --- /dev/null +++ b/main/src/lib/window-state.ts @@ -0,0 +1,54 @@ +import { BrowserWindow } from 'electron'; +import { WindowState } from '@ucap-webmessenger/native'; +import { WindowStateChannel } from '@ucap-webmessenger/native-electron'; +import { ElectronBrowserWindowChannel } from '@ucap-webmessenger/electron-core'; + +export function getWindowState(window: Electron.BrowserWindow): WindowState { + if (window.isFullScreen()) { + return WindowState.FullScreen; + } else if (window.isMaximized()) { + return WindowState.Maximized; + } else if (window.isMinimized()) { + return WindowState.Minimized; + } else if (!window.isVisible()) { + return WindowState.Hidden; + } else { + return WindowState.Normal; + } +} + +export function registerWindowStateChangedEvents(window: BrowserWindow) { + window.on(ElectronBrowserWindowChannel.EnterFullScreen, () => + sendWindowStateEvent(window, WindowState.FullScreen) + ); + + window.on(ElectronBrowserWindowChannel.LeaveFullScreen, () => + sendWindowStateEvent(window, WindowState.Normal) + ); + + window.on(ElectronBrowserWindowChannel.Maximize, () => + sendWindowStateEvent(window, WindowState.Maximized) + ); + window.on(ElectronBrowserWindowChannel.Minimize, () => + sendWindowStateEvent(window, WindowState.Minimized) + ); + window.on(ElectronBrowserWindowChannel.Unmaximize, () => + sendWindowStateEvent(window, WindowState.Normal) + ); + window.on(ElectronBrowserWindowChannel.Restore, () => + sendWindowStateEvent(window, WindowState.Normal) + ); + window.on(ElectronBrowserWindowChannel.Hide, () => + sendWindowStateEvent(window, WindowState.Hidden) + ); + window.on(ElectronBrowserWindowChannel.Show, () => { + // because the app can be maximized before being closed - which will restore it + // maximized on the next launch - this function should inspect the current state + // rather than always assume it is a 'normal' launch + sendWindowStateEvent(window, getWindowState(window)); + }); +} + +function sendWindowStateEvent(window: BrowserWindow, windowState: WindowState) { + window.webContents.send(WindowStateChannel.Changed, windowState); +} diff --git a/main/src/util/now.ts b/main/src/util/now.ts new file mode 100644 index 0000000..c09aae8 --- /dev/null +++ b/main/src/util/now.ts @@ -0,0 +1,4 @@ +export function now(): number { + const time = process.hrtime(); + return time[0] * 1000 + time[1] / 1000000; +} diff --git a/main/src/util/root.ts b/main/src/util/root.ts new file mode 100644 index 0000000..c039f38 --- /dev/null +++ b/main/src/util/root.ts @@ -0,0 +1,11 @@ +import * as path from 'path'; + +// tslint:disable-next-line: variable-name +const _root = __DEV__ + ? path.resolve(__dirname, '..', '..') + : path.resolve(__dirname); + +export function root(...paths: string[]) { + const args = Array.prototype.slice.call(paths, 0); + return path.join.apply(path, [_root].concat(args)); +} diff --git a/main/tsconfig.main.json b/main/tsconfig.main.json new file mode 100644 index 0000000..39a7730 --- /dev/null +++ b/main/tsconfig.main.json @@ -0,0 +1,32 @@ +{ + "compilerOptions": { + "baseUrl": "./", + "outDir": "../dist/main", + "sourceMap": true, + "declaration": false, + "module": "commonjs", + "moduleResolution": "node", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "esModuleInterop": true, + "target": "es5", + "types": ["node"], + "lib": ["es2017", "es2016", "es2015", "dom"], + "paths": { + "@ucap-webmessenger/electron-core": [ + "../projects/ucap-webmessenger-electron-core/src/public-api" + ], + "@ucap-webmessenger/electron-notification": [ + "../projects/ucap-webmessenger-electron-notification/src/public-api" + ], + "@ucap-webmessenger/native": [ + "../projects/ucap-webmessenger-native/src/public-api" + ], + "@ucap-webmessenger/native-electron": [ + "../projects/ucap-webmessenger-native-electron/src/public-api" + ] + } + }, + + "exclude": ["../node_modules", "**/*.spec.ts"] +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..53a0907 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,16640 @@ +{ + "name": "ucap-webmessenger", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "7zip": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/7zip/-/7zip-0.0.6.tgz", + "integrity": "sha1-nK+xca+CMpSQNTtIFvAzR6oVCjA=", + "dev": true + }, + "7zip-bin": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.0.3.tgz", + "integrity": "sha512-GLyWIFBbGvpKPGo55JyRZAo4lVbnBiD52cKlw/0Vt+wnmKvWJkpZvsjVoaIolyBXDeAQKSicRtqFNPem9w0WYA==", + "dev": true + }, + "@angular-builders/custom-webpack": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@angular-builders/custom-webpack/-/custom-webpack-8.2.0.tgz", + "integrity": "sha512-6654RfyqhTGhCI0edC9YU/iMn1UJnzX01bxYJbDWFgvReCqXdlgy+Fe9tp1MeqKweX6BQ1d0gRroR/WjY1aX0A==", + "dev": true, + "requires": { + "lodash": "^4.17.10", + "webpack-merge": "^4.2.1" + } + }, + "@angular-devkit/architect": { + "version": "0.803.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.803.14.tgz", + "integrity": "sha512-CPDDNTpM/9XWCFxCRL1/mYB54ivZcmWaVSjUgN2zcHWBc0gW3lrJrmmb+cJ1KSlOI7hoZaMTV1gWoX2QXd4JrA==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.3.14", + "rxjs": "6.4.0" + }, + "dependencies": { + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@angular-devkit/build-angular": { + "version": "0.803.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.803.14.tgz", + "integrity": "sha512-AtrhLDcy5DHi5zWiahEmvbD6THkJkWv27TySTfpZlmMjpRJHNqK7uQiKR1iWSqo4VNpimFle3fwkfjQYHlEKqA==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.803.14", + "@angular-devkit/build-optimizer": "0.803.14", + "@angular-devkit/build-webpack": "0.803.14", + "@angular-devkit/core": "8.3.14", + "@babel/core": "7.5.5", + "@babel/preset-env": "7.5.5", + "@ngtools/webpack": "8.3.14", + "ajv": "6.10.2", + "autoprefixer": "9.6.1", + "browserslist": "4.6.6", + "cacache": "12.0.2", + "caniuse-lite": "1.0.30000989", + "circular-dependency-plugin": "5.2.0", + "clean-css": "4.2.1", + "copy-webpack-plugin": "5.0.4", + "core-js": "3.2.1", + "file-loader": "4.2.0", + "find-cache-dir": "3.0.0", + "glob": "7.1.4", + "istanbul-instrumenter-loader": "3.0.1", + "jest-worker": "24.9.0", + "karma-source-map-support": "1.4.0", + "less": "3.9.0", + "less-loader": "5.0.0", + "license-webpack-plugin": "2.1.2", + "loader-utils": "1.2.3", + "mini-css-extract-plugin": "0.8.0", + "minimatch": "3.0.4", + "open": "6.4.0", + "parse5": "4.0.0", + "postcss": "7.0.17", + "postcss-import": "12.0.1", + "postcss-loader": "3.0.0", + "raw-loader": "3.1.0", + "regenerator-runtime": "0.13.3", + "rxjs": "6.4.0", + "sass": "1.22.9", + "sass-loader": "7.2.0", + "semver": "6.3.0", + "source-map": "0.7.3", + "source-map-loader": "0.2.4", + "source-map-support": "0.5.13", + "speed-measure-webpack-plugin": "1.3.1", + "style-loader": "1.0.0", + "stylus": "0.54.5", + "stylus-loader": "3.0.2", + "terser": "4.3.8", + "terser-webpack-plugin": "1.4.1", + "tree-kill": "1.2.1", + "webpack": "4.39.2", + "webpack-dev-middleware": "3.7.0", + "webpack-dev-server": "3.8.0", + "webpack-merge": "4.2.1", + "webpack-sources": "1.4.3", + "webpack-subresource-integrity": "1.1.0-rc.6", + "worker-plugin": "3.2.0" + }, + "dependencies": { + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "terser": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.3.8.tgz", + "integrity": "sha512-otmIRlRVmLChAWsnSFNO0Bfk6YySuBp6G9qrHiJwlLDd4mxe2ta4sjI7TzIR+W1nBMjilzrMcPOz9pSusgx3hQ==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "webpack-merge": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.1.tgz", + "integrity": "sha512-4p8WQyS98bUJcCvFMbdGZyZmsKuWjWVnVHnAS3FFg0HDaRVrPbkivx2RYCre8UiemD67RsiFFLfn4JhLAin8Vw==", + "dev": true, + "requires": { + "lodash": "^4.17.5" + } + } + } + }, + "@angular-devkit/build-ng-packagr": { + "version": "0.803.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-ng-packagr/-/build-ng-packagr-0.803.14.tgz", + "integrity": "sha512-qIYLEOxL8kOmOVjisN0rSMGeN7D2TYc90k73LnXUtT8WL4a+bd6r8PNGrH9hrF8ABZ01oJ4PQi8kuE4Jm7+ptA==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.803.14", + "rxjs": "6.4.0" + }, + "dependencies": { + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@angular-devkit/build-optimizer": { + "version": "0.803.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.803.14.tgz", + "integrity": "sha512-f1RYhO0swLfoLvCj/fUrDWm4vzVSnffcCc4C4PHnqoOGBRQpmIzG7G54Pm8YK677slioToYZQ68s3/zVtsQNWg==", + "dev": true, + "requires": { + "loader-utils": "1.2.3", + "source-map": "0.7.3", + "tslib": "1.10.0", + "typescript": "3.5.3", + "webpack-sources": "1.4.3" + } + }, + "@angular-devkit/build-webpack": { + "version": "0.803.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.803.14.tgz", + "integrity": "sha512-hvxAyJzDCaIISATHcu0+rAAj7ZcmX7VREX6J3FUMYDxhdjKqe45Q5J6Oy/Df2ZSV3YxwySZVcIhrBstm+0LC7Q==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.803.14", + "@angular-devkit/core": "8.3.14", + "rxjs": "6.4.0" + }, + "dependencies": { + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@angular-devkit/core": { + "version": "8.3.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.3.14.tgz", + "integrity": "sha512-+IYLbtCxwIpaieRj0wurEXBzZ/fDSdWbyrCfajzDerzsxqghNcafAXSazHXWwISqtbr/pAOuqUNR+mEk2XBz3Q==", + "dev": true, + "requires": { + "ajv": "6.10.2", + "fast-json-stable-stringify": "2.0.0", + "magic-string": "0.25.3", + "rxjs": "6.4.0", + "source-map": "0.7.3" + }, + "dependencies": { + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@angular-devkit/schematics": { + "version": "8.3.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-8.3.14.tgz", + "integrity": "sha512-5gPmTBN85a2gTxz/FsM5fO9Bxw4KG6uJNLMDAWfPG8vvSQEl7J64ujyqxPz39TernQTEKeuhRC4I5H1aaW9I/Q==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.3.14", + "rxjs": "6.4.0" + }, + "dependencies": { + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@angular/animations": { + "version": "8.2.12", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-8.2.12.tgz", + "integrity": "sha512-QVtZUw5J9c0RcDaJntIoeWVk/q9dhjDFxh+yw/uPl9Z4upWASdsOpZU2lfjqyU0myfg8dnQyZa1+Ce7n/DaClQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/cdk": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-8.2.3.tgz", + "integrity": "sha512-ZwO5Sn720RA2YvBqud0JAHkZXjmjxM0yNzCO8RVtRE9i8Gl26Wk0j0nQeJkVm4zwv2QO8MwbKUKGTMt8evsokA==", + "dev": true, + "requires": { + "parse5": "^5.0.0", + "tslib": "^1.7.1" + }, + "dependencies": { + "parse5": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", + "dev": true, + "optional": true + } + } + }, + "@angular/cli": { + "version": "8.3.14", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-8.3.14.tgz", + "integrity": "sha512-cOP2UvnnYocx1U1aiNkuLCcBxSktIXkadzrY7UlWJtQiCPGWm3Y87BfrQXub9Nsh79iyV8k8uKZKEax2ayESSg==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.803.14", + "@angular-devkit/core": "8.3.14", + "@angular-devkit/schematics": "8.3.14", + "@schematics/angular": "8.3.14", + "@schematics/update": "0.803.14", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.1", + "debug": "^4.1.1", + "ini": "1.3.5", + "inquirer": "6.5.1", + "npm-package-arg": "6.1.0", + "npm-pick-manifest": "3.0.2", + "open": "6.4.0", + "pacote": "9.5.5", + "read-package-tree": "5.3.1", + "rimraf": "3.0.0", + "semver": "6.3.0", + "symbol-observable": "1.2.0", + "universal-analytics": "^0.4.20", + "uuid": "^3.3.2" + }, + "dependencies": { + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "rimraf": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz", + "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "@angular/common": { + "version": "8.2.12", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-8.2.12.tgz", + "integrity": "sha512-BNz1lo+PP+lwIX3sErRGBRnkMzT5yT8CJ5o/M29AanCdcx9dpoJG2WKgpIgw8UBcj9QlP0CkSmzPtUNtcNMthA==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/compiler": { + "version": "8.2.12", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-8.2.12.tgz", + "integrity": "sha512-V5mDWioGmSZ4cJJ2THo8qHYKwj3sUI7dpJ0oab2Al0FQAN8JCimWO6AQKRtjmnr78ZkMy9Xe/KK6ebl40ewL5Q==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/compiler-cli": { + "version": "8.2.12", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-8.2.12.tgz", + "integrity": "sha512-OrNnkJ7OrpbcOtB4TWFBF6D3dtEfUuOQgfc3HBjizZuL8EuX0pU5dv4VTvLTRkmyUT/7fmmWdkEXJL+UQtXqPg==", + "dev": true, + "requires": { + "canonical-path": "1.0.0", + "chokidar": "^2.1.1", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.7.2", + "magic-string": "^0.25.0", + "minimist": "^1.2.0", + "reflect-metadata": "^0.1.2", + "source-map": "^0.6.1", + "tslib": "^1.9.0", + "yargs": "13.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "yargs": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.1.0.tgz", + "integrity": "sha512-1UhJbXfzHiPqkfXNHYhiz79qM/kZqjTE8yGlEjZa85Q+3+OwcV6NRkV7XOV1W2Eom2bzILeUn55pQYffjVOLAg==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.0.0" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "@angular/core": { + "version": "8.2.12", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-8.2.12.tgz", + "integrity": "sha512-wEFwhHCuuXynXAMeA1G+0KIYY0jqXYs7I8p+GO+ufKoUmzWHFTvtMJ6nvKgy+LmZTByO2gf9oVAAlRodNb8ttQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/flex-layout": { + "version": "8.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@angular/flex-layout/-/flex-layout-8.0.0-beta.27.tgz", + "integrity": "sha512-qmpvQPesU4ZQ56IscwgmVRpK2UnyV+gwvXUql7TMv0QV215hLcHczjGsrKkLfW2By5E7XEyDat9br72uVXcPMw==", + "dev": true, + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/forms": { + "version": "8.2.12", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-8.2.12.tgz", + "integrity": "sha512-y1UObndCGbTYwLSzUWzCiX7th+mb4n712asApooGmfmIQmgTyHbKxYUJ9Ep1pgd0pqLBBnK249MQLH15NDpbyQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/language-service": { + "version": "8.2.12", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-8.2.12.tgz", + "integrity": "sha512-uXGVSC4ugkyBt7pYdI8qaKNV0TIxfjSWb3dWNuhD6b9riPtaa+xJFQrfMu7OX/tVX642aFxca4jkUHBLCyWptA==", + "dev": true + }, + "@angular/material": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-8.2.3.tgz", + "integrity": "sha512-SOczkIaqes+r+9XF/UUiokidfFKBpHkOPIaFK857sFD0FBNPvPEpOr5oHKCG3feERRwAFqHS7Wo2ohVEWypb5A==", + "dev": true, + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/material-moment-adapter": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/@angular/material-moment-adapter/-/material-moment-adapter-8.2.3.tgz", + "integrity": "sha512-x0WE9MyQajqzGPYKm8eHcDmWWlwiobOX9rZ+V5uqY80fsvm2czk6TYnc1drFYcPAHIaIcx7je7NYOULPF1rTpw==", + "dev": true, + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/platform-browser": { + "version": "8.2.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-8.2.12.tgz", + "integrity": "sha512-VBvMjmFJapZ2pFlmxZiHtfPwbHp79RRi5mrdMhETjKMaLaC2tAR/99ijCpx2urDMqb/VDm7YHOtoLEpBFVDulg==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/platform-browser-dynamic": { + "version": "8.2.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-8.2.12.tgz", + "integrity": "sha512-O4krb+9tj028JOQHPgLk/87lyUlHt8dpNxzuYCT0G6kEmknjpyZBaxhvDPygGjGHXV3LDqlYVH+bh8ygJUhwmw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/router": { + "version": "8.2.12", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-8.2.12.tgz", + "integrity": "sha512-mq1FethFpYosSVzChstMpxZlL+oUFeaA+FrzZQL7zJP/mm61yFkkhoYGVG6pG0NWSzpJE4NY6YvGCvHgN4ZECw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/core": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.5.tgz", + "integrity": "sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helpers": "^7.5.5", + "@babel/parser": "^7.5.5", + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5", + "convert-source-map": "^1.1.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "json5": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", + "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.0.tgz", + "integrity": "sha512-Ms8Mo7YBdMMn1BYuNtKuP/z0TgEIhbcyB8HVR6PPNYp4P61lMsABiS4A3VG1qznjXVCf3r+fVHhm4efTYVsySA==", + "dev": true, + "requires": { + "@babel/types": "^7.6.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", + "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", + "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-call-delegate": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz", + "integrity": "sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.4.4", + "@babel/traverse": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/helper-define-map": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz", + "integrity": "sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/types": "^7.5.5", + "lodash": "^4.17.13" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz", + "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz", + "integrity": "sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz", + "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==", + "dev": true, + "requires": { + "@babel/types": "^7.5.5" + } + }, + "@babel/helper-module-imports": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", + "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz", + "integrity": "sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/template": "^7.4.4", + "@babel/types": "^7.5.5", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", + "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", + "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.5.5.tgz", + "integrity": "sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==", + "dev": true, + "requires": { + "lodash": "^4.17.13" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz", + "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-wrap-function": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz", + "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.5.5", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" + } + }, + "@babel/helper-simple-access": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", + "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", + "dev": true, + "requires": { + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/helper-wrap-function": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz", + "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.2.0" + } + }, + "@babel/helpers": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.6.2.tgz", + "integrity": "sha512-3/bAUL8zZxYs1cdX2ilEE0WobqbCmKWr/889lf2SS0PpDcpEIY8pb1CCyz0pEcX3pEb+MCbks1jIokz2xLtGTA==", + "dev": true, + "requires": { + "@babel/template": "^7.6.0", + "@babel/traverse": "^7.6.2", + "@babel/types": "^7.6.0" + }, + "dependencies": { + "@babel/generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.4.tgz", + "integrity": "sha512-jsBuXkFoZxk0yWLyGI9llT9oiQ2FeTASmRFE32U+aaDTfoE92t78eroO7PTpU/OrYq38hlcDM6vbfLDaOLy+7w==", + "dev": true, + "requires": { + "@babel/types": "^7.6.3", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz", + "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.4.tgz", + "integrity": "sha512-D8RHPW5qd0Vbyo3qb+YjO5nvUVRTXFLQ/FsDxJU2Nqz4uB5EnUN0ZQSEYpvTIbRuttig1XbHWU5oMeQwQSAA+A==", + "dev": true + }, + "@babel/traverse": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.3.tgz", + "integrity": "sha512-unn7P4LGsijIxaAJo/wpoU11zN+2IaClkQAxcJWBNCMS6cmVh802IyLHNkAjQ0iYnRS3nnxk5O3fuXW28IMxTw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.6.3", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.6.3", + "@babel/types": "^7.6.3", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/types": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz", + "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.0.tgz", + "integrity": "sha512-+o2q111WEx4srBs7L9eJmcwi655eD8sXniLqMB93TBK9GrNzGrxDWSjiqz2hLU0Ha8MTXFIP0yd9fNdP+m43ZQ==", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz", + "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0", + "@babel/plugin-syntax-async-generators": "^7.2.0" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz", + "integrity": "sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", + "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-json-strings": "^7.2.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz", + "integrity": "sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.6.2.tgz", + "integrity": "sha512-NxHETdmpeSCtiatMRYWVJo7266rrvAC3DTeG5exQBIH/fMIUK7ejDNznBbn3HQl/o9peymRRg7Yqkx6PdUXmMw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.6.0" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz", + "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz", + "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz", + "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", + "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", + "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz", + "integrity": "sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz", + "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.3.tgz", + "integrity": "sha512-7hvrg75dubcO3ZI2rjYTzUrEuh1E9IyDEhhB6qfcooxhDA33xx2MasuLVgdxzcP6R/lipAC6n9ub9maNW6RKdw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "lodash": "^4.17.13" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz", + "integrity": "sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-define-map": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.5.5", + "@babel/helper-split-export-declaration": "^7.4.4", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz", + "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz", + "integrity": "sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.6.2.tgz", + "integrity": "sha512-KGKT9aqKV+9YMZSkowzYoYEiHqgaDhGmPNZlZxX6UeHC4z30nC1J9IrZuGqbYFB1jaIGdv91ujpze0exiVK8bA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.6.0" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz", + "integrity": "sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz", + "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz", + "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz", + "integrity": "sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz", + "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz", + "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz", + "integrity": "sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.6.0.tgz", + "integrity": "sha512-Ma93Ix95PNSEngqomy5LSBMAQvYKVe3dy+JlVJSHEXZR5ASL9lQBedMiCyVtmTLraIDVRE3ZjTZvmXXD2Ozw3g==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz", + "integrity": "sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz", + "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.3.tgz", + "integrity": "sha512-jTkk7/uE6H2s5w6VlMHeWuH+Pcy2lmdwFoeWCVnvIrDUnB5gQqTVI8WfmEAhF2CDEarGrknZcmSFg1+bkfCoSw==", + "dev": true, + "requires": { + "regexpu-core": "^4.6.0" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz", + "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz", + "integrity": "sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.5.5" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz", + "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==", + "dev": true, + "requires": { + "@babel/helper-call-delegate": "^7.4.4", + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz", + "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz", + "integrity": "sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.0" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz", + "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", + "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.6.2.tgz", + "integrity": "sha512-DpSvPFryKdK1x+EDJYCy28nmAaIMdxmhot62jAXF/o99iA33Zj2Lmcp3vDmz+MUh0LNYVPvfj5iC3feb3/+PFg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz", + "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz", + "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz", + "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.6.2.tgz", + "integrity": "sha512-orZI6cWlR3nk2YmYdb0gImrgCUwb5cBUwjf6Ks6dvNVvXERkwtJWOQaEOjPiu0Gu1Tq6Yq/hruCZZOOi9F34Dw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.6.0" + } + }, + "@babel/preset-env": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.5.5.tgz", + "integrity": "sha512-GMZQka/+INwsMz1A5UEql8tG015h5j/qjptpKY2gJ7giy8ohzU710YciJB5rcKsWGWHiW3RUnHib0E5/m3Tp3A==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-async-generator-functions": "^7.2.0", + "@babel/plugin-proposal-dynamic-import": "^7.5.0", + "@babel/plugin-proposal-json-strings": "^7.2.0", + "@babel/plugin-proposal-object-rest-spread": "^7.5.5", + "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-syntax-async-generators": "^7.2.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0", + "@babel/plugin-syntax-json-strings": "^7.2.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", + "@babel/plugin-transform-arrow-functions": "^7.2.0", + "@babel/plugin-transform-async-to-generator": "^7.5.0", + "@babel/plugin-transform-block-scoped-functions": "^7.2.0", + "@babel/plugin-transform-block-scoping": "^7.5.5", + "@babel/plugin-transform-classes": "^7.5.5", + "@babel/plugin-transform-computed-properties": "^7.2.0", + "@babel/plugin-transform-destructuring": "^7.5.0", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/plugin-transform-duplicate-keys": "^7.5.0", + "@babel/plugin-transform-exponentiation-operator": "^7.2.0", + "@babel/plugin-transform-for-of": "^7.4.4", + "@babel/plugin-transform-function-name": "^7.4.4", + "@babel/plugin-transform-literals": "^7.2.0", + "@babel/plugin-transform-member-expression-literals": "^7.2.0", + "@babel/plugin-transform-modules-amd": "^7.5.0", + "@babel/plugin-transform-modules-commonjs": "^7.5.0", + "@babel/plugin-transform-modules-systemjs": "^7.5.0", + "@babel/plugin-transform-modules-umd": "^7.2.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.5", + "@babel/plugin-transform-new-target": "^7.4.4", + "@babel/plugin-transform-object-super": "^7.5.5", + "@babel/plugin-transform-parameters": "^7.4.4", + "@babel/plugin-transform-property-literals": "^7.2.0", + "@babel/plugin-transform-regenerator": "^7.4.5", + "@babel/plugin-transform-reserved-words": "^7.2.0", + "@babel/plugin-transform-shorthand-properties": "^7.2.0", + "@babel/plugin-transform-spread": "^7.2.0", + "@babel/plugin-transform-sticky-regex": "^7.2.0", + "@babel/plugin-transform-template-literals": "^7.4.4", + "@babel/plugin-transform-typeof-symbol": "^7.2.0", + "@babel/plugin-transform-unicode-regex": "^7.4.4", + "@babel/types": "^7.5.5", + "browserslist": "^4.6.0", + "core-js-compat": "^3.1.1", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "semver": "^5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@babel/template": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz", + "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.0" + } + }, + "@babel/traverse": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.0.tgz", + "integrity": "sha512-93t52SaOBgml/xY74lsmt7xOR4ufYvhb5c5qiM6lu4J/dWGMAfAh6eKw4PjLes6DI6nQgearoxnFJk60YchpvQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.6.0", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz", + "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "@develar/schema-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.1.0.tgz", + "integrity": "sha512-qjCqB4ctMig9Gz5bd6lkdFr3bO6arOdQqptdBSpF1ZpCnjofieCciEzkoS9ujY9cMGyllYSCSmBJ3x9OKHXzoA==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + }, + "@hapi/address": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.1.tgz", + "integrity": "sha512-DYuHzu978pP1XW1GD3HGvLnAFjbQTIgc2+V153FGkbS2pgo9haigCdwBnUDrbhaOkgiJlbZvoEqDrcxSLHpiWA==", + "dev": true + }, + "@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", + "dev": true + }, + "@hapi/hoek": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.2.4.tgz", + "integrity": "sha512-Ze5SDNt325yZvNO7s5C4fXDscjJ6dcqLFXJQ/M7dZRQCewuDj2iDUuBi6jLQt+APbW9RjjVEvLr35FXuOEqjow==", + "dev": true + }, + "@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "dev": true, + "requires": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "@hapi/topo": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.3.tgz", + "integrity": "sha512-JmS9/vQK6dcUYn7wc2YZTqzIKubAQcJKu2KCKAru6es482U5RT5fP1EXCPtlXpiK7PR0On/kpQKI4fRKkzpZBQ==", + "dev": true, + "requires": { + "@hapi/hoek": "8.x.x" + } + }, + "@ngrx/effects": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@ngrx/effects/-/effects-8.4.0.tgz", + "integrity": "sha512-LQv+NIYkFehXMSBMT9xL04RvmDmbzSbCbSCXbNSH2hN216TqX83L29u5T4I06oGhzQ3xN+SSQXGWQiZYJvKuEA==", + "dev": true + }, + "@ngrx/entity": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@ngrx/entity/-/entity-8.4.0.tgz", + "integrity": "sha512-oJYBW9w0YXODeGpp03bvnAShHbwF+44OyPd1zURnYDtpd1r6W8qWIDr77aYViic5YTzISURiZ9rxE2n8pkNvqw==", + "dev": true + }, + "@ngrx/router-store": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@ngrx/router-store/-/router-store-8.4.0.tgz", + "integrity": "sha512-VTs8O4mAzxbZDtPYaiBG7FV+k4UY5iaIRK7RMvaeBrWMMqD1St63qX1oF6s79R1qAV/fQ1svJNytsArLAI2sXw==", + "dev": true + }, + "@ngrx/store": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@ngrx/store/-/store-8.4.0.tgz", + "integrity": "sha512-Z8+2hfGcynGrzJuU7ixxYxOI6M2E0H8Omni1u01h55vvaZeoTO8bRt6OWqbjxxEsSKQmBBZ1XyOuuZXSWjxvYw==", + "dev": true + }, + "@ngrx/store-devtools": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@ngrx/store-devtools/-/store-devtools-8.4.0.tgz", + "integrity": "sha512-622z0CNdmfmPy17LFcewf/7xU2quhun+G+D7FdF58DlwZDFPJp0UotER1HW+ApGmI8h6hjeQs/7flzX0H12sIg==", + "dev": true + }, + "@ngtools/webpack": { + "version": "8.3.14", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-8.3.14.tgz", + "integrity": "sha512-eIU3W3T4YxiExkS/c09FkqQpnKeIuUFFnxyfdG40zospt28B6V5ZaEVw2z5+2CjxJlDUTUYZlhPiV9Rwadp3jg==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.3.14", + "enhanced-resolve": "4.1.0", + "rxjs": "6.4.0", + "tree-kill": "1.2.1", + "webpack-sources": "1.4.3" + }, + "dependencies": { + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@ngx-translate/core": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-11.0.1.tgz", + "integrity": "sha512-nBCa1ZD9fAUY/3eskP3Lql2fNg8OMrYIej1/5GRsfcutx9tG/5fZLCv9m6UCw1aS+u4uK/vXjv1ctG/FdMvaWg==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "@schematics/angular": { + "version": "8.3.14", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-8.3.14.tgz", + "integrity": "sha512-1XXBh9+lowvltRlcCjDJa4GEr5Xq+uNJcxULHBaNY7YfQSwZ5KuyhTBWjCdKmMaTOV3pEcIHwyuNh26mpn98Bw==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.3.14", + "@angular-devkit/schematics": "8.3.14" + } + }, + "@schematics/update": { + "version": "0.803.14", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.803.14.tgz", + "integrity": "sha512-1erj7oaR2vKXo1DLE0s4BbbouBmgeAHEkPHQM7FPtyroZ18kytlT+qjTbsSnlRCwcFsjxmRkbRjXaXDz7ttsYQ==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.3.14", + "@angular-devkit/schematics": "8.3.14", + "@yarnpkg/lockfile": "1.1.0", + "ini": "1.3.5", + "pacote": "9.5.5", + "rxjs": "6.4.0", + "semver": "6.3.0", + "semver-intersect": "1.4.0" + }, + "dependencies": { + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "@types/anymatch": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", + "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==", + "dev": true + }, + "@types/copy-webpack-plugin": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/copy-webpack-plugin/-/copy-webpack-plugin-5.0.0.tgz", + "integrity": "sha512-yQHocgdgES7W5Q2UyxJ5cj/E6MrV1zq3MZ8jdApS9NJKqax+rux9IE3QAbBmNCGbgivEsejrkIq3Rm76JLubkg==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*", + "@types/webpack": "*" + } + }, + "@types/crypto-js": { + "version": "3.1.43", + "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-3.1.43.tgz", + "integrity": "sha512-EHe/YKctU3IYNBsDmSOPX/7jLHPRlx8WaiDKSY9JCTnJ8XJeM4c0ZJvx+9Gxmr2s2ihI92R+3U/gNL1sq5oRuQ==", + "dev": true + }, + "@types/debug": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz", + "integrity": "sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ==", + "dev": true + }, + "@types/detect-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/detect-browser/-/detect-browser-4.0.0.tgz", + "integrity": "sha512-c2cAqR4G5QL2aPDgzpsk8ck/R+w7djxpe05Z8XYg1Ahfe/Bekb+06PG9zw64T6I1oNWDVM+IAsSbyASVydAdRw==", + "dev": true, + "requires": { + "detect-browser": "*" + } + }, + "@types/electron-debug": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/electron-debug/-/electron-debug-2.1.0.tgz", + "integrity": "sha512-/bvdTUd2OF0LZuVp/qPZYhyraBkFBkULhk665ine71zIi2QywzirS+5rxt/n9Bj5RWqO6TYZKslFc+Vy+chggQ==", + "dev": true, + "requires": { + "electron-debug": "*" + } + }, + "@types/electron-devtools-installer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@types/electron-devtools-installer/-/electron-devtools-installer-2.2.0.tgz", + "integrity": "sha512-HJNxpaOXuykCK4rQ6FOMxAA0NLFYsf7FiPFGmab0iQmtVBHSAfxzy3MRFpLTTDDWbV0yD2YsHOQvdu8yCqtCfw==", + "dev": true + }, + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "dev": true + }, + "@types/extract-text-webpack-plugin": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.4.tgz", + "integrity": "sha512-rQv2FShQnpsCnZAHEqmvTECvFmqSL6xTJttf+hMJvNoEIUZLjeLygIbrBimj9R4kwwc0AhU+JBJVz5/qcd5hmg==", + "dev": true, + "requires": { + "@types/webpack": "*" + } + }, + "@types/file-saver": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-2.0.1.tgz", + "integrity": "sha512-g1QUuhYVVAamfCifK7oB7G3aIl4BbOyzDOqVyUfEr4tfBKrXfeH+M+Tg7HKCXSrbzxYdhyCP7z9WbKo0R2hBCw==", + "dev": true + }, + "@types/filesize": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/filesize/-/filesize-4.2.0.tgz", + "integrity": "sha512-cGnXW1YH24LI6iCWFjaJ9nVX/WX3d1XzIjJuniZWMD+hpGBWDECCeh8H4MwTg17IMKRU1pfjwfI8crok7b2fEA==", + "dev": true + }, + "@types/fs-extra": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.0.0.tgz", + "integrity": "sha512-bCtL5v9zdbQW86yexOlXWTEGvLNqWxMFyi7gQA7Gcthbezr2cPSOb8SkESVKA937QD5cIwOFLDFt0MQoXOEr9Q==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "dev": true, + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/jasmine": { + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.3.16.tgz", + "integrity": "sha512-Nveep4zKGby8uIvG2AEUyYOwZS8uVeHK9TgbuWYSawUDDdIgfhCKz28QzamTo//Jk7Ztt9PO3f+vzlB6a4GV1Q==", + "dev": true + }, + "@types/jasminewd2": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.6.tgz", + "integrity": "sha512-2ZOKrxb8bKRmP/po5ObYnRDgFE4i+lQiEB27bAMmtMWLgJSqlIDqlLx6S0IRorpOmOPRQ6O80NujTmQAtBkeNw==", + "dev": true, + "requires": { + "@types/jasmine": "*" + } + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/node": { + "version": "10.14.22", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.22.tgz", + "integrity": "sha512-9taxKC944BqoTVjE+UT3pQH0nHZlTvITwfsOZqyc+R3sfJuxaTtxWjfn1K2UlxyPcKHf0rnaXcVFrS9F9vf0bw==", + "dev": true + }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, + "@types/q": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", + "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", + "dev": true + }, + "@types/resolve": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", + "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/selenium-webdriver": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.16.tgz", + "integrity": "sha512-lMC2G0ItF2xv4UCiwbJGbnJlIuUixHrioOhNGHSCsYCJ8l4t9hMCUimCytvFv7qy6AfSzRxhRHoGa+UqaqwyeA==", + "dev": true + }, + "@types/semver": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-6.0.2.tgz", + "integrity": "sha512-G1Ggy7/9Nsa1Jt2yiBR2riEuyK2DFNnqow6R7cromXPMNynackRY1vqFTLz/gwnef1LHokbXThcPhqMRjUbkpQ==", + "dev": true + }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "dev": true + }, + "@types/tapable": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.4.tgz", + "integrity": "sha512-78AdXtlhpCHT0K3EytMpn4JNxaf5tbqbLcbIRoQIHzpTIyjpxLQKRoxU55ujBXAtg3Nl2h/XWvfDa9dsMOd0pQ==", + "dev": true + }, + "@types/uglify-js": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.0.4.tgz", + "integrity": "sha512-SudIN9TRJ+v8g5pTG8RRCqfqTMNqgWCKKd3vtynhGzkIIjxaicNAMuY5TRadJ6tzDu3Dotf3ngaMILtmOdmWEQ==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@types/webpack": { + "version": "4.39.5", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.39.5.tgz", + "integrity": "sha512-9twG6D97ao13MBLvigwfBJe6rxtb04UY3TcYHBYkW5sXZjUrNhqIRxLYg74VzK/YAE8xlVhOyd+3Whr7E5RrBA==", + "dev": true, + "requires": { + "@types/anymatch": "*", + "@types/node": "*", + "@types/tapable": "*", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@types/webpack-merge": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/webpack-merge/-/webpack-merge-4.1.5.tgz", + "integrity": "sha512-cbDo592ljSHeaVe5Q39JKN6Z4vMhmo4+C3JbksOIg+kjhKQYN2keGN7dvr/i18+dughij98Qrsfn1mU9NgVoCA==", + "dev": true, + "requires": { + "@types/webpack": "*" + } + }, + "@types/webpack-node-externals": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@types/webpack-node-externals/-/webpack-node-externals-1.6.3.tgz", + "integrity": "sha512-sIYCMSV4Z1FbxqSKKvhmEnjd1UoZnTBT0VIhoZ0iT8gck7FB1MzJ1eH+yFyOgY65WU4LJBTxj3ySMKKfzfEiCw==", + "dev": true, + "requires": { + "@types/webpack": "*" + } + }, + "@types/webpack-sources": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.5.tgz", + "integrity": "sha512-zfvjpp7jiafSmrzJ2/i3LqOyTYTuJ7u1KOXlKgDlvsj9Rr0x7ZiYu5lZbXwobL7lmsRNtPXlBfmaUD8eU2Hu8w==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "accessibility-developer-tools": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/accessibility-developer-tools/-/accessibility-developer-tools-2.12.0.tgz", + "integrity": "sha1-PaDM6dbsY3OWS4TzXbfPw996tRQ=", + "dev": true + }, + "acorn": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", + "dev": true + }, + "adm-zip": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.13.tgz", + "integrity": "sha512-fERNJX8sOXfel6qCBCMPvZLzENBEhZTzKqg6vrOW5pvoEaQuJhRU4ndTAh6lHOxn1I6jnz2NHra56ZODM751uw==", + "dev": true + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "dev": true + }, + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "agentkeepalive": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", + "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", + "dev": true, + "requires": { + "humanize-ms": "^1.2.1" + } + }, + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "dev": true, + "requires": { + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + }, + "ansi-escapes": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.2.1.tgz", + "integrity": "sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q==", + "dev": true, + "requires": { + "type-fest": "^0.5.2" + } + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.0.tgz", + "integrity": "sha512-Ozz7l4ixzI7Oxj2+cw+p0tVUt27BpaJ+1+q1TCeANWxHpvyn2+Un+YamBdfKu0uh8xLodGhoa1v7595NhKDAuA==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "app-builder-bin": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-3.4.3.tgz", + "integrity": "sha512-qMhayIwi3juerQEVJMQ76trObEbfQT0nhUdxZz9a26/3NLT3pE6awmQ8S1cEnrGugaaM5gYqR8OElcDezfmEsg==", + "dev": true + }, + "app-builder-lib": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-21.2.0.tgz", + "integrity": "sha512-aOX/nv77/Bti6NymJDg7p9T067xD8m1ipIEJR7B4Mm1GsJWpMm9PZdXtCRiMNRjHtQS5KIljT0g17781y6qn5A==", + "dev": true, + "requires": { + "7zip-bin": "~5.0.3", + "@develar/schema-utils": "~2.1.0", + "async-exit-hook": "^2.0.1", + "bluebird-lst": "^1.0.9", + "builder-util": "21.2.0", + "builder-util-runtime": "8.3.0", + "chromium-pickle-js": "^0.2.0", + "debug": "^4.1.1", + "ejs": "^2.6.2", + "electron-publish": "21.2.0", + "fs-extra": "^8.1.0", + "hosted-git-info": "^2.7.1", + "is-ci": "^2.0.0", + "isbinaryfile": "^4.0.2", + "js-yaml": "^3.13.1", + "lazy-val": "^1.0.4", + "minimatch": "^3.0.4", + "normalize-package-data": "^2.5.0", + "read-config-file": "5.0.0", + "sanitize-filename": "^1.6.2", + "semver": "^6.3.0", + "temp-file": "^3.3.4" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } + } + }, + "app-root-path": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.2.1.tgz", + "integrity": "sha512-91IFKeKk7FjfmezPKkwtaRvSpnUc4gDwPAjA1YZ9Gn0q0PPeW+vbeUsZuyDwjI7+QTHhcLen2v25fi/AmhvbJA==", + "dev": true + }, + "append-transform": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "dev": true, + "requires": { + "default-require-extensions": "^2.0.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "aria-query": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", + "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", + "dev": true, + "requires": { + "ast-types-flow": "0.0.7", + "commander": "^2.11.0" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", + "dev": true + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "async-exit-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", + "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", + "dev": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.1.tgz", + "integrity": "sha512-aVo5WxR3VyvyJxcJC3h4FKfwCQvQWb1tSI5VHNibddCVWrcD1NvlxEweg3TSgiPztMnWfjpy2FURKA2kvDE+Tw==", + "dev": true, + "requires": { + "browserslist": "^4.6.3", + "caniuse-lite": "^1.0.30000980", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.17", + "postcss-value-parser": "^4.0.0" + } + }, + "awesome-node-loader": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/awesome-node-loader/-/awesome-node-loader-1.1.1.tgz", + "integrity": "sha1-pAK38J9yzRx7GmXnUYAjby9UONk=", + "dev": true, + "requires": { + "loader-utils": "^1.1.0" + } + }, + "awesome-typescript-loader": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/awesome-typescript-loader/-/awesome-typescript-loader-5.2.1.tgz", + "integrity": "sha512-slv66OAJB8orL+UUaTI3pKlLorwIvS4ARZzYR9iJJyGsEgOqueMfOMdKySWzZ73vIkEe3fcwFgsKMg4d8zyb1g==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "enhanced-resolve": "^4.0.0", + "loader-utils": "^1.1.0", + "lodash": "^4.17.5", + "micromatch": "^3.1.9", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.3", + "webpack-log": "^1.2.0" + }, + "dependencies": { + "webpack-log": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-1.2.0.tgz", + "integrity": "sha512-U9AnICnu50HXtiqiDxuli5gLB5PGBo7VvcHx36jRZHwK4vzOYLbImqT4lwWwoMHdQWwEKw736fCHEekokTEKHA==", + "dev": true, + "requires": { + "chalk": "^2.1.0", + "log-symbols": "^2.1.0", + "loglevelnext": "^1.0.1", + "uuid": "^3.1.0" + } + } + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true + }, + "axobject-query": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz", + "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==", + "dev": true, + "requires": { + "ast-types-flow": "0.0.7" + } + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", + "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "core-js": { + "version": "2.6.10", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.10.tgz", + "integrity": "sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + } + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + }, + "dependencies": { + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + } + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true + }, + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "dev": true, + "requires": { + "callsite": "1.0.0" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", + "dev": true + }, + "blob": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", + "dev": true + }, + "blocking-proxy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", + "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "bluebird": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", + "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", + "dev": true + }, + "bluebird-lst": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", + "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==", + "dev": true, + "requires": { + "bluebird": "^3.5.5" + } + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "boxen": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-3.2.0.tgz", + "integrity": "sha512-cU4J/+NodM3IHdSL2yN8bqYqnmlBTidDR4RC7nJs61ZmtGz8VZzM3HLQX0zY5mrSmPtR3xWwsq2jOUQqFZN8+A==", + "dev": true, + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^2.4.2", + "cli-boxes": "^2.2.0", + "string-width": "^3.0.0", + "term-size": "^1.2.0", + "type-fest": "^0.3.0", + "widest-line": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "dev": true + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.6.tgz", + "integrity": "sha512-D2Nk3W9JL9Fp/gIcWei8LrERCS+eXu9AM5cfXA8WEZ84lFks+ARnZ0q/R69m2SV3Wjma83QDDPxsNKXUwdIsyA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000984", + "electron-to-chromium": "^1.3.191", + "node-releases": "^1.1.25" + } + }, + "browserstack": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.3.tgz", + "integrity": "sha512-AO+mECXsW4QcqC9bxwM29O7qWa7bJT94uBFzeb5brylIQwawuEziwq20dPYbins95GlWzOawgyDNdjYAo32EKg==", + "dev": true, + "requires": { + "https-proxy-agent": "^2.2.1" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builder-util": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-21.2.0.tgz", + "integrity": "sha512-Nd6CUb6YgDY8EXAXEIegx+1kzKqyFQ5ZM5BoYkeunAlwz/zDJoH1UCyULjoS5wQe5czNClFQy07zz2bzYD0Z4A==", + "dev": true, + "requires": { + "7zip-bin": "~5.0.3", + "@types/debug": "^4.1.4", + "app-builder-bin": "3.4.3", + "bluebird-lst": "^1.0.9", + "builder-util-runtime": "8.3.0", + "chalk": "^2.4.2", + "debug": "^4.1.1", + "fs-extra": "^8.1.0", + "is-ci": "^2.0.0", + "js-yaml": "^3.13.1", + "source-map-support": "^0.5.13", + "stat-mode": "^0.3.0", + "temp-file": "^3.3.4" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } + } + }, + "builder-util-runtime": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.3.0.tgz", + "integrity": "sha512-CSOdsYqf4RXIHh1HANPbrZHlZ9JQJXSuDDloblZPcWQVN62inyYoTQuSmY3KrgefME2Sv3Kn2MxHvbGQHRf8Iw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "sax": "^1.2.4" + }, + "dependencies": { + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + } + } + }, + "builtin-modules": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", + "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cacache": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.2.tgz", + "integrity": "sha512-ifKgxH2CKhJEg6tNdAwziu6Q33EvuG26tYcda6PT3WKisZcYDXsnEdnRv67Po3yCzFfaSoMjGZzJyD2c3DT1dg==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "http-cache-semantics": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz", + "integrity": "sha512-TcIMG3qeVLgDr1TEd2XvHaTnMPwYQUQMIBLy+5pLSDKYFc7UIqj39w8EGzZkaxoLv/l2K8HaI0t5AVA+YYgUew==", + "dev": true + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + }, + "normalize-url": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.3.0.tgz", + "integrity": "sha512-0NLtR71o4k6GLP+mr6Ty34c5GA6CMoEsncKJxvQd8NzPxaHRJNnb5gZE8R1XF4CPIS7QPHLJ74IFszwtNVAHVQ==", + "dev": true + } + } + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + } + } + }, + "caniuse-lite": { + "version": "1.0.30000989", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz", + "integrity": "sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw==", + "dev": true + }, + "canonical-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz", + "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chokidar": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.1.0.tgz", + "integrity": "sha512-6vZfo+7W0EOlbSo0nhVKMz4yyssrwiPbBZ8wj1lq8/+l4ZhGZ2U4Md7PspvmijXp1a26D3B7AHEBmIB7aVtaOQ==", + "dev": true, + "requires": { + "anymatch": "^3.1.0", + "braces": "^3.0.2", + "fsevents": "^2.0.6", + "glob-parent": "^5.0.0", + "is-binary-path": "^2.1.0", + "is-glob": "^4.0.1", + "normalize-path": "^3.0.0", + "readdirp": "^3.1.1" + }, + "dependencies": { + "glob-parent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.0.0.tgz", + "integrity": "sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "chownr": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz", + "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "chromium-pickle-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=", + "dev": true + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "circular-dependency-plugin": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.0.tgz", + "integrity": "sha512-7p4Kn/gffhQaavNfyDFg7LS5S/UT1JAjyGd4UqR2+jzoYF02eDkj0Ec3+48TsIa4zghjLY87nQHIh/ecK9qLdw==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-css": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", + "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "clean-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-MciirUH5r+cYLGCOL5JX/ZLzOZbVr1ot3Fw+KcvbhUb6PM+yycqd9ZhIlcigQ5gl+XhppNmw3bEFuaaMNyLj3A==", + "dev": true, + "requires": { + "@types/webpack": "^4.4.31", + "del": "^4.1.1" + } + }, + "cli-boxes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz", + "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "codelyzer": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-5.1.0.tgz", + "integrity": "sha512-QiyY2/oDQnYx4mAVEDqr+z9MwrOto18tQFjExiuRChXCy0yvngS5fQpWIxvAGpbOmZFiR1PRTRLbEI71u10maA==", + "dev": true, + "requires": { + "app-root-path": "^2.2.1", + "aria-query": "^3.0.0", + "axobject-query": "^2.0.2", + "css-selector-tokenizer": "^0.7.1", + "cssauron": "^1.4.0", + "damerau-levenshtein": "^1.0.4", + "semver-dsl": "^1.0.1", + "source-map": "^0.5.7", + "sprintf-js": "^1.1.2" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true + } + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "compare-versions": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.5.1.tgz", + "integrity": "sha512-9fGPIB7C6AyM18CJJBHt5EnCZDG3oiTJYy0NjfIAGjKpzv0tkxWko7TNQHF5ymqm7IH03tqmeuBxtvD+Izh6mg==", + "dev": true + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, + "compressible": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", + "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", + "dev": true, + "requires": { + "mime-db": ">= 1.40.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "concurrently": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-4.1.2.tgz", + "integrity": "sha512-Kim9SFrNr2jd8/0yNYqDTFALzUX1tvimmwFWxmp/D4mRI+kbqIIwE2RkBDrxS2ic25O1UgQMI5AtBqdtX3ynYg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "date-fns": "^1.30.1", + "lodash": "^4.17.15", + "read-pkg": "^4.0.1", + "rxjs": "^6.5.2", + "spawn-command": "^0.0.2-1", + "supports-color": "^4.5.0", + "tree-kill": "^1.2.1", + "yargs": "^12.0.5" + }, + "dependencies": { + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "^2.0.0" + } + } + } + }, + "conf": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conf/-/conf-5.0.0.tgz", + "integrity": "sha512-lRNyt+iRD4plYaOSVTxu1zPWpaH0EOxgFIR1l3mpC/DGZ7XzhoGFMKmbl54LAgXcSu6knqWgOwdINkqm58N85A==", + "dev": true, + "requires": { + "ajv": "^6.10.0", + "dot-prop": "^5.0.0", + "env-paths": "^2.2.0", + "json-schema-typed": "^7.0.0", + "make-dir": "^3.0.0", + "pkg-up": "^3.0.1", + "write-file-atomic": "^3.0.0" + }, + "dependencies": { + "dot-prop": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.1.1.tgz", + "integrity": "sha512-QCHI6Lkf+9fJMpwfAFsTvbiSh6ujoPmhCLiDvD/n4dGtLvHfhuBwPdN6z2x4YSOwwtTcLoO/LP70xELWGF/JVA==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, + "make-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", + "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "write-file-atomic": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.1.tgz", + "integrity": "sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + } + } + }, + "configstore": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-4.0.0.tgz", + "integrity": "sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ==", + "dev": true, + "requires": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "dependencies": { + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-webpack-plugin": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.0.4.tgz", + "integrity": "sha512-YBuYGpSzoCHSSDGyHy6VJ7SHojKp6WHT4D7ItcQFNAYx2hrwkMe56e97xfVR0/ovDuMTrMffXUiltvQljtAGeg==", + "dev": true, + "requires": { + "cacache": "^11.3.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.7.0", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "cacache": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz", + "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + } + } + }, + "core-js": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.2.1.tgz", + "integrity": "sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw==", + "dev": true + }, + "core-js-compat": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.3.3.tgz", + "integrity": "sha512-GNZkENsx5pMnS7Inwv7ZO/s3B68a9WU5kIjxqrD/tkNR8mtfXJRk8fAKRlbvWZSGPc59/TkiOBDYl5Cb65pTVA==", + "dev": true, + "requires": { + "browserslist": "^4.7.1", + "semver": "^6.3.0" + }, + "dependencies": { + "browserslist": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.1.tgz", + "integrity": "sha512-QtULFqKIAtiyNx7NhZ/p4rB8m3xDozVo/pi5VgTlADLF2tNigz/QH+v0m5qhn7XfHT7u+607NcCNOnC0HZAlMg==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000999", + "electron-to-chromium": "^1.3.284", + "node-releases": "^1.1.36" + } + }, + "caniuse-lite": { + "version": "1.0.30001002", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001002.tgz", + "integrity": "sha512-pRuxPE8wdrWmVPKcDmJJiGBxr6lFJq4ivdSeo9FTmGj5Rb8NX3Mby2pARG57MXF15hYAhZ0nHV5XxT2ig4bz3g==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.295", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.295.tgz", + "integrity": "sha512-KxlGE9GcZTv7xGwYJGMEABHJq2JuTMNF7jD8NwHk6sBY226mW+Dyp9kZmA2Od9tKHMCS7ltPnqFg+zq3jTWN7Q==", + "dev": true + }, + "node-releases": { + "version": "1.1.38", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.38.tgz", + "integrity": "sha512-/5NZAaOyTj134Oy5Cp/J8mso8OD/D9CSuL+6TOXXsTKO8yjc5e4up75SRPCganCjwFKMj2jbp5tR0dViVdox7g==", + "dev": true, + "requires": { + "semver": "^6.3.0" + } + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-env": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.2.1.tgz", + "integrity": "sha512-1yHhtcfAd1r4nwQgknowuUNfIT9E8dOMMspC36g45dN+iD1blloi7xp8X/xAIDnjHWyt1uQ8PHk2fkNaym7soQ==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.5" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "cross-unzip": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/cross-unzip/-/cross-unzip-0.0.2.tgz", + "integrity": "sha1-UYO8R6CVWb78+YzEZXlkmZNZNy8=", + "dev": true + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "crypto-js": { + "version": "3.1.9-1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.9-1.tgz", + "integrity": "sha1-/aGedh/Ad+Af+/3G6f38WeiAbNg=", + "dev": true + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true + }, + "css-parse": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz", + "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=", + "dev": true + }, + "css-selector-tokenizer": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", + "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", + "dev": true, + "requires": { + "cssesc": "^0.1.0", + "fastparse": "^1.1.1", + "regexpu-core": "^1.0.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + }, + "regexpu-core": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", + "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "dev": true, + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + } + } + } + }, + "cssauron": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", + "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", + "dev": true, + "requires": { + "through": "X.X.X" + } + }, + "cssesc": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", + "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", + "dev": true + }, + "cuint": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", + "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=", + "dev": true + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "damerau-levenshtein": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.5.tgz", + "integrity": "sha512-CBCRqFnpu715iPmw1KrdOrzRqbdFwQTwAWyyyYS42+iAgHCuXZ+/TdMgQkUENPomxEz9z1BEzuQU2Xw0kUuAgA==", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "date-fns": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", + "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", + "dev": true + }, + "date-format": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", + "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", + "dev": true + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "debuglog": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.0.tgz", + "integrity": "sha512-ZbfWJq/wN1Z273o7mUSjILYqehAktR2NVoSrOukDkU9kg2v/Uv89yU4Cvz8seJeAmtN5oqiefKq8FPuXOboqLw==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "deep-freeze-strict": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-freeze-strict/-/deep-freeze-strict-1.1.1.tgz", + "integrity": "sha1-d9BYPKJKab5LvZrC+uQV1VUj5bA=", + "dev": true + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + }, + "default-require-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", + "dev": true, + "requires": { + "strip-bom": "^3.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "defer-to-connect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.0.2.tgz", + "integrity": "sha512-k09hcQcTDY+cwgiwa6PYKLm3jlagNzQ+RSvhjzESOGOx+MNOuXkxTfEvPrO1IOQ81tArCFYQgi631clB70RpQw==", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "dependency-graph": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.7.2.tgz", + "integrity": "sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ==", + "dev": true + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-browser": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/detect-browser/-/detect-browser-4.7.0.tgz", + "integrity": "sha512-x+7zkRxwEiQ8qLKKfln9pTa4n87fbPHVpHyImmpEQn5lAmKurWBVbg0tb99ruAHqSA0ejrXMp0MahKEulE7LqA==", + "dev": true + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true + }, + "devtron": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/devtron/-/devtron-1.4.0.tgz", + "integrity": "sha1-tedIvW6Vu+cL/MaKrm/mlhGUQeE=", + "dev": true, + "requires": { + "accessibility-developer-tools": "^2.11.0", + "highlight.js": "^9.3.0", + "humanize-plus": "^1.8.1" + } + }, + "dezalgo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "dev": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + } + }, + "dmg-builder": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-21.2.0.tgz", + "integrity": "sha512-9cJEclnGy7EyKFCoHDYDf54pub/t92CQapyiUxU0w9Bj2vUvfoDagP1PMiX4XD5rPp96141h9A+QN0OB4VgvQg==", + "dev": true, + "requires": { + "app-builder-lib": "~21.2.0", + "bluebird-lst": "^1.0.9", + "builder-util": "~21.2.0", + "fs-extra": "^8.1.0", + "iconv-lite": "^0.5.0", + "js-yaml": "^3.13.1", + "sanitize-filename": "^1.6.2" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "iconv-lite": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.0.tgz", + "integrity": "sha512-NnEhI9hIEKHOzJ4f697DMz9IQEXr/MMJ5w64vN2/4Ai+wRnvV7SBrL0KLoRlwaKVghOc7LQ5YkPLuX146b6Ydw==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "requires": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "dotenv": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.1.0.tgz", + "integrity": "sha512-GUE3gqcDCaMltj2++g6bRQ5rBJWtkWTmqmD0fo1RnnMuUqHNCt2oTPeDnS9n6fKYvlhn7AeBkb38lymBtWBQdA==", + "dev": true + }, + "dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "dev": true + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "easy-stack": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/easy-stack/-/easy-stack-1.0.0.tgz", + "integrity": "sha1-EskbMIWjfwuqM26UhurEv5Tj54g=", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "ejs": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.1.tgz", + "integrity": "sha512-kS/gEPzZs3Y1rRsbGX4UOSjtP/CeJP0CxSNZHYxGfVM/VgLcv0ZqM7C45YyTj2DI2g7+P9Dd24C+IMIg6D0nYQ==", + "dev": true + }, + "electron": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/electron/-/electron-6.1.2.tgz", + "integrity": "sha512-zVste1obJC645RrU4PP+CqU8Yq33h8fzS7zx3tWbiNnyRzp6m7O2bpgKLJBRZ/4BPRsNCqSSXm4vimyGPUXVaw==", + "dev": true, + "requires": { + "@types/node": "^10.12.18", + "electron-download": "^4.1.0", + "extract-zip": "^1.0.3" + } + }, + "electron-builder": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-21.2.0.tgz", + "integrity": "sha512-x8EXrqFbAb2L3N22YlGar3dGh8vwptbB3ovo3OF6K7NTpcsmM2zEoJv7GhFyX73rNzSG2HaWpXwGAtOp2JWiEw==", + "dev": true, + "requires": { + "app-builder-lib": "21.2.0", + "bluebird-lst": "^1.0.9", + "builder-util": "21.2.0", + "builder-util-runtime": "8.3.0", + "chalk": "^2.4.2", + "dmg-builder": "21.2.0", + "fs-extra": "^8.1.0", + "is-ci": "^2.0.0", + "lazy-val": "^1.0.4", + "read-config-file": "5.0.0", + "sanitize-filename": "^1.6.2", + "update-notifier": "^3.0.1", + "yargs": "^13.3.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "electron-debug": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/electron-debug/-/electron-debug-3.0.1.tgz", + "integrity": "sha512-fo3mtDM4Bxxm3DW1I+XcJKfQlUlns4QGWyWGs8OrXK1bBZ2X9HeqYMntYBx78MYRcGY5S/ualuG4GhCnPlaZEA==", + "dev": true, + "requires": { + "electron-is-dev": "^1.1.0", + "electron-localshortcut": "^3.1.0" + } + }, + "electron-devtools-installer": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/electron-devtools-installer/-/electron-devtools-installer-2.2.4.tgz", + "integrity": "sha512-b5kcM3hmUqn64+RUcHjjr8ZMpHS2WJ5YO0pnG9+P/RTdx46of/JrEjuciHWux6pE+On6ynWhHJF53j/EDJN0PA==", + "dev": true, + "requires": { + "7zip": "0.0.6", + "cross-unzip": "0.0.2", + "rimraf": "^2.5.2", + "semver": "^5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "electron-download": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-4.1.1.tgz", + "integrity": "sha512-FjEWG9Jb/ppK/2zToP+U5dds114fM1ZOJqMAR4aXXL5CvyPE9fiqBK/9YcwC9poIFQTEJk/EM/zyRwziziRZrg==", + "dev": true, + "requires": { + "debug": "^3.0.0", + "env-paths": "^1.0.0", + "fs-extra": "^4.0.1", + "minimist": "^1.2.0", + "nugget": "^2.0.1", + "path-exists": "^3.0.0", + "rc": "^1.2.1", + "semver": "^5.4.1", + "sumchecker": "^2.0.2" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "env-paths": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-1.0.0.tgz", + "integrity": "sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA=", + "dev": true + }, + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "electron-is-accelerator": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/electron-is-accelerator/-/electron-is-accelerator-0.1.2.tgz", + "integrity": "sha1-UJ5RDCala1Xhf4Y6SwThEYRqsns=", + "dev": true + }, + "electron-is-dev": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-1.1.0.tgz", + "integrity": "sha512-Z1qA/1oHNowGtSBIcWk0pcLEqYT/j+13xUw/MYOrBUOL4X7VN0i0KCTf5SqyvMPmW5pSPKbo28wkxMxzZ20YnQ==", + "dev": true + }, + "electron-localshortcut": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/electron-localshortcut/-/electron-localshortcut-3.1.0.tgz", + "integrity": "sha512-MgL/j5jdjW7iA0R6cI7S045B0GlKXWM1FjjujVPjlrmyXRa6yH0bGSaIAfxXAF9tpJm3pLEiQzerYHkRh9JG/A==", + "dev": true, + "requires": { + "debug": "^2.6.8", + "electron-is-accelerator": "^0.1.0", + "keyboardevent-from-electron-accelerator": "^1.1.0", + "keyboardevents-areequal": "^0.2.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "electron-log": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-3.0.8.tgz", + "integrity": "sha512-B9+eJ8z3UbDnWEz+G33SIJvEDeKLznHEV4sCu6bR31KuOdp3dYN046QBWbLNsvKU+lzFI6eOi+xNCpNHZvatiw==", + "dev": true + }, + "electron-publish": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-21.2.0.tgz", + "integrity": "sha512-mWavuoWJe87iaeKd0I24dNWIaR+0yRzshjNVqGyK019H766fsPWl3caQJnVKFaEyrZRP397v4JZVG0e7s16AxA==", + "dev": true, + "requires": { + "bluebird-lst": "^1.0.9", + "builder-util": "~21.2.0", + "builder-util-runtime": "8.3.0", + "chalk": "^2.4.2", + "fs-extra": "^8.1.0", + "lazy-val": "^1.0.4", + "mime": "^2.4.4" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + } + } + }, + "electron-reload": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/electron-reload/-/electron-reload-1.5.0.tgz", + "integrity": "sha512-L9X6LzsL3Bt2j0eJ4/MBrI9Vt902KvVUtBB7J4qrL1A9sXqC2fE0lpvUAlOThpJYh6zWO1l86U/YiEN9bDURHw==", + "dev": true, + "requires": { + "chokidar": "^3.0.2" + } + }, + "electron-store": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/electron-store/-/electron-store-4.0.0.tgz", + "integrity": "sha512-qgkDetwB9bz+ZA7mNCQGm6zLJOMT4yBkTZ7f16M9iS0GcI/bOeOeFkLkIaJddTtPca7MOiaUM1imMjFqUfQgSA==", + "dev": true, + "requires": { + "conf": "^5.0.0", + "type-fest": "^0.5.2" + } + }, + "electron-to-chromium": { + "version": "1.3.261", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.261.tgz", + "integrity": "sha512-nA9xFj1SgHXlW/6T4+udW2u/Ic/bne25UoFsddoNM7Ut2bgNGLLQUhLhk+vQlbKh9WiRgDDlHaC36Oy7AgRR9w==", + "dev": true + }, + "electron-updater": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-4.1.2.tgz", + "integrity": "sha512-4Sk8IW0LfOilDz+WAB/gEDmX7+FUFRbKHGN1zGjehPilnd6H9cmjgBHK6Xzq/FLq/uOHGJ6GX/9tsF+jr7CvnA==", + "dev": true, + "requires": { + "@types/semver": "^6.0.1", + "builder-util-runtime": "8.3.0", + "fs-extra": "^8.1.0", + "js-yaml": "^3.13.1", + "lazy-val": "^1.0.4", + "lodash.isequal": "^4.5.0", + "pako": "^1.0.10", + "semver": "^6.2.0" + } + }, + "electron-window-state": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/electron-window-state/-/electron-window-state-5.0.3.tgz", + "integrity": "sha512-1mNTwCfkolXl3kMf50yW3vE2lZj0y92P/HYWFBrb+v2S/pCka5mdwN3cagKm458A7NjndSwijynXgcLWRodsVg==", + "dev": true, + "requires": { + "jsonfile": "^4.0.0", + "mkdirp": "^0.5.1" + } + }, + "elliptic": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.1.tgz", + "integrity": "sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "dev": true, + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "engine.io": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", + "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.0", + "ws": "~3.3.1" + }, + "dependencies": { + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + } + } + }, + "engine.io-client": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", + "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.1", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~3.3.1", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + } + } + }, + "engine.io-parser": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", + "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "env-paths": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", + "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==", + "dev": true + }, + "err-code": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", + "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.14.2.tgz", + "integrity": "sha512-DgoQmbpFNOofkjJtKwr87Ma5EW4Dc8fWhD0R+ndq7Oc456ivUfGOOP6oAZTTKl5/CcNMP+EN+e3/iUzgE0veZg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.0", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-inspect": "^1.6.0", + "object-keys": "^1.1.1", + "string.prototype.trimleft": "^2.0.0", + "string.prototype.trimright": "^2.0.0" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.51", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.51.tgz", + "integrity": "sha512-oRpWzM2WcLHVKpnrcyB7OW8j/s67Ba04JCm0WnNv3RiABSvs7mrQlutB8DBv793gKcp0XENR8Il8WxGTlZ73gQ==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.1", + "next-tick": "^1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + } + }, + "es6-symbol": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.2.tgz", + "integrity": "sha512-/ZypxQsArlv+KHpGvng52/Iz8by3EQPxhmbuz8yFG89N/caTFBSbcXONDw0aMjy827gQg26XAjP4uXFvnfINmQ==", + "dev": true, + "requires": { + "d": "^1.0.1", + "es5-ext": "^0.10.51" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "event-pubsub": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/event-pubsub/-/event-pubsub-4.3.0.tgz", + "integrity": "sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==", + "dev": true + }, + "eventemitter3": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", + "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==", + "dev": true + }, + "events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", + "dev": true + }, + "eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "dev": true, + "requires": { + "original": "^1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extract-zip": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", + "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", + "dev": true, + "requires": { + "concat-stream": "1.6.2", + "debug": "2.6.9", + "mkdirp": "0.5.1", + "yauzl": "2.4.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "dev": true + }, + "figures": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", + "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-loader": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.2.0.tgz", + "integrity": "sha512-+xZnaK5R8kBJrHK0/6HRlrKNamvVS5rjyuju+rnyxRGuwUJwpAMsVzUl5dz6rK8brkzjV6JpcFNjp6NqV0g1OQ==", + "dev": true, + "requires": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.5.0.tgz", + "integrity": "sha512-32ISrwW2scPXHUSusP8qMg5dLUawKkyV+/qIEV9JdXKx+rsM6mi8vZY8khg2M69Qom16rtroWXD3Ybtiws38gQ==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "file-saver": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.2.tgz", + "integrity": "sha512-Wz3c3XQ5xroCxd1G8b7yL0Ehkf0TC9oYC6buPFkNnU9EnaPlifeAFCyCh+iewXTyFRcg0a6j3J7FmJsIhlhBdw==", + "dev": true + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } + }, + "filesize": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-4.2.0.tgz", + "integrity": "sha512-bdS2UP98MZzLyTZzhuSH5ctAWyDt81n5xMti9BSdmgPXjjENLDz5Bmbk2R7ATVw/HRysZzWA2JIPgcSAOimWpw==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.0.0.tgz", + "integrity": "sha512-t7ulV1fmbxh5G9l/492O1p5+EBbr3uwpt6odhFTMc+nWyhmbloe+ja9BZ8pIBtqFWhOmCWVjx+pTW4zDkFoclw==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.0", + "pkg-dir": "^4.1.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "make-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", + "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + } + } + }, + "find-parent-dir": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.0.tgz", + "integrity": "sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ=", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "flatted": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", + "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "follow-redirects": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.9.0.tgz", + "integrity": "sha512-CRcPzsSIbXyVDl0QI01muNDu69S8trU4jArW9LpOt2WtC6LyUJetcIrmfHsRBx7/Jb6GHJUiuqyYxPooFfNt6A==", + "dev": true, + "requires": { + "debug": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-access": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", + "dev": true, + "requires": { + "null-check": "^1.0.0" + } + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "dev": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.0.7.tgz", + "integrity": "sha512-a7YT0SV3RB+DjYcppwVDLtn13UQnmg0SWZS7ezZD0UjnLwXmy8Zm21GMVGLaFGimIqcvyMQaOJBrop8MyOp1kQ==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "genfun": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", + "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "^1.3.4" + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + }, + "dependencies": { + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } + } + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", + "dev": true + }, + "hammerjs": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", + "integrity": "sha1-BO93hiz/K7edMPdpIJWTAiK/YPE=", + "dev": true + }, + "handle-thing": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", + "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", + "dev": true + }, + "handlebars": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.2.0.tgz", + "integrity": "sha512-Kb4xn5Qh1cxAKvQnzNWZ512DhABzyFNmsaJf3OAkWNa4NkaqWcNI8Tao8Tasi0/F4JD9oyG0YxuFyvyR57d+Gw==", + "dev": true, + "requires": { + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "dev": true, + "requires": { + "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "dev": true + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "highlight.js": { + "version": "9.15.10", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.15.10.tgz", + "integrity": "sha512-RoV7OkQm0T3os3Dd2VHLNMoaoDVx77Wygln3n9l5YV172XonWG6rgQD3XnF/BuFFZw9A0TJgmMSO8FEWQgvcXw==", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.4.tgz", + "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==", + "dev": true + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", + "dev": true + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", + "dev": true + }, + "http-proxy": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", + "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "dev": true, + "requires": { + "agent-base": "4", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "https-proxy-agent": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz", + "integrity": "sha512-c8Ndjc9Bkpfx/vCJueCPy0jlP4ccCCSNDp8xwCZzPjKJUm+B+u9WX2x98Qx4n1PiMNTWo3D7KK5ifNV/yJyRzg==", + "dev": true, + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "dev": true, + "requires": { + "ms": "^2.0.0" + } + }, + "humanize-plus": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/humanize-plus/-/humanize-plus-1.8.2.tgz", + "integrity": "sha1-pls0RZrWNnrbs3B6gqPJ+RYWcDA=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "ignore-walk": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "injection-js": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/injection-js/-/injection-js-2.2.2.tgz", + "integrity": "sha512-9K4fW2NNPG3JCvORx5G/T6q/PZYIr43RFgxBvtk3OV4omh5iqvpK4cChuBfhgPnRbXSgZRfuROh0XG5KNA8Xlg==", + "dev": true + }, + "inquirer": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.1.tgz", + "integrity": "sha512-uxNHBeQhRXIoHWTSNYUFhQVrHYFThIt6IVo2fFmSe8aBwdR3/w6b58hJpiL/fMukFkvGzjg+hSxFtwvVmKZmXw==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^2.4.2", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^4.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.1.0.tgz", + "integrity": "sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^5.2.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "dev": true + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", + "dev": true + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + }, + "dependencies": { + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + } + } + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", + "dev": true + }, + "is-npm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-3.0.0.tgz", + "integrity": "sha512-wsigDr1Kkschp2opC4G3yA6r9EgVA6NjRpWzIi9axXqeIaAATPRJc4uLujXe3Nd9uO8KoDyA4MD6aZSeXTADhA==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-reference": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.1.3.tgz", + "integrity": "sha512-W1iHHv/oyBb2pPxkBxtaewxa1BC58Pn5J0hogyCdefwUIvb6R+TGbAcIa4qPNYLqLhb3EnOgUf2MQkkF76BcKw==", + "dev": true, + "requires": { + "@types/estree": "0.0.39" + } + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isbinaryfile": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.2.tgz", + "integrity": "sha512-C3FSxJdNrEr2F4z6uFtNzECDM5hXk+46fxaa+cwBe5/XrWSmzdG8DDgyjfX6/NRdBB21q2JXuRAzPCUs+fclnQ==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-api": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-2.1.6.tgz", + "integrity": "sha512-x0Eicp6KsShG1k1rMgBAi/1GgY7kFGEBwQpw3PXGEmu+rBcBNhqU8g2DgY9mlepAsLPzrzrbqSgCGANnki4POA==", + "dev": true, + "requires": { + "async": "^2.6.2", + "compare-versions": "^3.4.0", + "fileset": "^2.0.3", + "istanbul-lib-coverage": "^2.0.5", + "istanbul-lib-hook": "^2.0.7", + "istanbul-lib-instrument": "^3.3.0", + "istanbul-lib-report": "^2.0.8", + "istanbul-lib-source-maps": "^3.0.6", + "istanbul-reports": "^2.2.4", + "js-yaml": "^3.13.1", + "make-dir": "^2.1.0", + "minimatch": "^3.0.4", + "once": "^1.4.0" + }, + "dependencies": { + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "dev": true, + "requires": { + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" + } + } + } + }, + "istanbul-instrumenter-loader": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz", + "integrity": "sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w==", + "dev": true, + "requires": { + "convert-source-map": "^1.5.0", + "istanbul-lib-instrument": "^1.7.3", + "loader-utils": "^1.1.0", + "schema-utils": "^0.3.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "requires": { + "ajv": "^5.0.0" + } + } + } + }, + "istanbul-lib-coverage": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", + "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", + "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", + "dev": true, + "requires": { + "append-transform": "^1.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", + "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", + "dev": true, + "requires": { + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.1", + "semver": "^5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "dependencies": { + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", + "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", + "dev": true, + "requires": { + "handlebars": "^4.1.2" + } + }, + "jasmine": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", + "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", + "dev": true, + "requires": { + "exit": "^0.1.2", + "glob": "^7.0.6", + "jasmine-core": "~2.8.0" + }, + "dependencies": { + "jasmine-core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", + "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", + "dev": true + } + } + }, + "jasmine-core": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.4.0.tgz", + "integrity": "sha512-HU/YxV4i6GcmiH4duATwAbJQMlE0MsDIR5XmSVxURxKHn3aGAdbY1/ZJFmVRbKtnLwIxxMJD7gYaPsypcbYimg==", + "dev": true + }, + "jasmine-spec-reporter": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz", + "integrity": "sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg==", + "dev": true, + "requires": { + "colors": "1.1.2" + } + }, + "jasminewd2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", + "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", + "dev": true + }, + "jest-worker": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", + "dev": true + }, + "js-message": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/js-message/-/js-message-1.0.5.tgz", + "integrity": "sha1-IwDSSxrwjondCVvBpMnJz8uJLRU=", + "dev": true + }, + "js-queue": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/js-queue/-/js-queue-2.0.0.tgz", + "integrity": "sha1-NiITz4YPRo8BJfxslqvBdCUx+Ug=", + "dev": true, + "requires": { + "easy-stack": "^1.0.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-schema-typed": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.1.tgz", + "integrity": "sha512-IqUK+Cqc8/MqHsCvv1TMccbKdBzoATOLHXZAF5UDu70/CCxo648cHUig24hc+XTK53TyeNk1UeVTlc2Haovtsw==", + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "~0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jszip": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.2.tgz", + "integrity": "sha512-NmKajvAFQpbg3taXQXr/ccS2wcucR1AZ+NtyWp2Nq7HHVsXhcJFR8p0Baf32C2yVvBylFWVeKf+WI2AnvlPhpA==", + "dev": true, + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + } + }, + "karma": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/karma/-/karma-4.1.0.tgz", + "integrity": "sha512-xckiDqyNi512U4dXGOOSyLKPwek6X/vUizSy2f3geYevbLj+UIdvNwbn7IwfUIL2g1GXEPWt/87qFD1fBbl/Uw==", + "dev": true, + "requires": { + "bluebird": "^3.3.0", + "body-parser": "^1.16.1", + "braces": "^2.3.2", + "chokidar": "^2.0.3", + "colors": "^1.1.0", + "connect": "^3.6.0", + "core-js": "^2.2.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.0", + "flatted": "^2.0.0", + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "http-proxy": "^1.13.0", + "isbinaryfile": "^3.0.0", + "lodash": "^4.17.11", + "log4js": "^4.0.0", + "mime": "^2.3.1", + "minimatch": "^3.0.2", + "optimist": "^0.6.1", + "qjobs": "^1.1.4", + "range-parser": "^1.2.0", + "rimraf": "^2.6.0", + "safe-buffer": "^5.0.1", + "socket.io": "2.1.1", + "source-map": "^0.6.1", + "tmp": "0.0.33", + "useragent": "2.3.0" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "core-js": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", + "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", + "dev": true + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "isbinaryfile": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "dev": true, + "requires": { + "buffer-alloc": "^1.2.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "karma-chrome-launcher": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", + "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", + "dev": true, + "requires": { + "fs-access": "^1.0.0", + "which": "^1.2.1" + } + }, + "karma-coverage-istanbul-reporter": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.0.6.tgz", + "integrity": "sha512-WFh77RI8bMIKdOvI/1/IBmgnM+Q7NOLhnwG91QJrM8lW+CIXCjTzhhUsT/svLvAkLmR10uWY4RyYbHMLkTglvg==", + "dev": true, + "requires": { + "istanbul-api": "^2.1.6", + "minimatch": "^3.0.4" + } + }, + "karma-jasmine": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-2.0.1.tgz", + "integrity": "sha512-iuC0hmr9b+SNn1DaUD2QEYtUxkS1J+bSJSn7ejdEexs7P8EYvA1CWkEdrDQ+8jVH3AgWlCNwjYsT1chjcNW9lA==", + "dev": true, + "requires": { + "jasmine-core": "^3.3" + } + }, + "karma-jasmine-html-reporter": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.4.2.tgz", + "integrity": "sha512-7g0gPj8+9JepCNJR9WjDyQ2RkZ375jpdurYQyAYv8PorUCadepl8vrD6LmMqOGcM17cnrynBawQYZHaumgDjBw==", + "dev": true + }, + "karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", + "dev": true, + "requires": { + "source-map-support": "^0.5.5" + } + }, + "keyboardevent-from-electron-accelerator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keyboardevent-from-electron-accelerator/-/keyboardevent-from-electron-accelerator-1.1.0.tgz", + "integrity": "sha512-VDC4vKWGrR3VgIKCE4CsXnvObGgP8C2idnTKEMUkuEuvDGE1GEBX9FtNdJzrD00iQlhI3xFxRaeItsUmlERVng==", + "dev": true + }, + "keyboardevents-areequal": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/keyboardevents-areequal/-/keyboardevents-areequal-0.2.2.tgz", + "integrity": "sha512-Nv+Kr33T0mEjxR500q+I6IWisOQ0lK1GGOncV0kWE6n4KFmpcu7RUX5/2B0EUtX51Cb0HjZ9VJsSY3u4cBa0kw==", + "dev": true + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "requires": { + "json-buffer": "3.0.0" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dev": true, + "requires": { + "package-json": "^6.3.0" + } + }, + "lazy-val": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.4.tgz", + "integrity": "sha512-u93kb2fPbIrfzBuLjZE+w+fJbUUMhNDXxNmMfaqNgpfQf1CO5ZSe2LfsnBqVAk7i/2NF48OSoRj+Xe2VT+lE8Q==", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "less": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/less/-/less-3.9.0.tgz", + "integrity": "sha512-31CmtPEZraNUtuUREYjSqRkeETFdyEHSEPAGq4erDlUXtda7pzNmctdljdIagSb589d/qXGWiiP31R5JVf+v0w==", + "dev": true, + "requires": { + "clone": "^2.1.2", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "mime": "^1.4.1", + "mkdirp": "^0.5.0", + "promise": "^7.1.1", + "request": "^2.83.0", + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "less-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-5.0.0.tgz", + "integrity": "sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "loader-utils": "^1.1.0", + "pify": "^4.0.1" + } + }, + "less-plugin-npm-import": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/less-plugin-npm-import/-/less-plugin-npm-import-2.1.0.tgz", + "integrity": "sha1-gj5phskzGKmBccqFiEi2vq1Vvz4=", + "dev": true, + "requires": { + "promise": "~7.0.1", + "resolve": "~1.1.6" + }, + "dependencies": { + "promise": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.0.4.tgz", + "integrity": "sha1-Nj6EpMNsg1a4kP7WLJHOhdAu1Tk=", + "dev": true, + "requires": { + "asap": "~2.0.3" + } + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "license-webpack-plugin": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.1.2.tgz", + "integrity": "sha512-7poZHRla+ae0eEButlwMrPpkXyhNVBf2EHePYWT0jyLnI6311/OXJkTI2sOIRungRpQgU2oDMpro5bSFPT5F0A==", + "dev": true, + "requires": { + "@types/webpack-sources": "^0.1.5", + "webpack-sources": "^1.2.0" + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "requires": { + "immediate": "~3.0.5" + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.endswith": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.endswith/-/lodash.endswith-4.2.1.tgz", + "integrity": "sha1-/tWawXOO0+I27dcGTsRWRIs3vAk=", + "dev": true + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", + "dev": true + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", + "dev": true + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "log4js": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.5.1.tgz", + "integrity": "sha512-EEEgFcE9bLgaYUKuozyFfytQM2wDHtXn4tAN41pkaxpNjAykv11GVdeI4tHtmPWW4Xrgh9R/2d7XYghDVjbKKw==", + "dev": true, + "requires": { + "date-format": "^2.0.0", + "debug": "^4.1.1", + "flatted": "^2.0.0", + "rfdc": "^1.1.4", + "streamroller": "^1.0.6" + } + }, + "loglevel": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.4.tgz", + "integrity": "sha512-p0b6mOGKcGa+7nnmKbpzR6qloPbrgLcnio++E+14Vo/XffOGwZtRpUhr8dTH/x2oCMmEoIU0Zwm3ZauhvYD17g==", + "dev": true + }, + "loglevelnext": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/loglevelnext/-/loglevelnext-1.0.5.tgz", + "integrity": "sha512-V/73qkPuJmx4BcBF19xPBr+0ZRVBhc4POxvZTZdMeXpJ4NItXSJ/MSwuFT0kQJlCbXvdlZoQQ/418bS1y9Jh6A==", + "dev": true, + "requires": { + "es6-symbol": "^3.1.1", + "object.assign": "^4.1.0" + } + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "magic-string": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz", + "integrity": "sha512-6QK0OpF/phMz0Q2AxILkX2mFhi7m+WMwTRg0LQKq/WBB0cDP4rYH3Wp4/d3OTXlrPLVJT/RFqj8tFeAR4nk8AA==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "dev": true + }, + "make-fetch-happen": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.1.tgz", + "integrity": "sha512-b4dfaMvUDR67zxUq1+GN7Ke9rH5WvGRmoHuMH7l+gmUCR2tCXFP6mpeJ9Dp+jB6z8mShRopSf1vLRBhRs8Cu5w==", + "dev": true, + "requires": { + "agentkeepalive": "^3.4.1", + "cacache": "^12.0.0", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^4.0.0", + "ssri": "^6.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "https-proxy-agent": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.3.tgz", + "integrity": "sha512-Ytgnz23gm2DVftnzqRRz2dOXZbGd2uiajSw/95bPp6v53zPRspQjLm/AfBgqbJ2qfeRXWIOMVLpp86+/5yX39Q==", + "dev": true, + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + } + } + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "dev": true + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "dev": true + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "dev": true, + "requires": { + "mime-db": "1.40.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true + }, + "mini-css-extract-plugin": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.0.tgz", + "integrity": "sha512-MNpRGbNA52q6U92i0qbVpQNsgk7LExy41MdAlG84FeytfDOtRIf/mCHdEgG8rpTKOaNKiqUnZdlptF469hxqOw==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "dev": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==", + "dev": true + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "ng-packagr": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-5.5.1.tgz", + "integrity": "sha512-GT6QK5WAirQwALdeJPiXdgRd5PzRqcknb/C/G+cCDEbUFri4oGVmns2Nl4I0FGg/cRn6nXTxRiUunOSqZ3Lehw==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "autoprefixer": "^9.6.0", + "browserslist": "^4.0.0", + "chalk": "^2.3.1", + "chokidar": "^3.0.0", + "clean-css": "^4.1.11", + "commander": "^3.0.0", + "fs-extra": "^8.0.0", + "glob": "^7.1.2", + "injection-js": "^2.2.1", + "less": "^3.8.0", + "less-plugin-npm-import": "^2.1.0", + "node-sass-tilde-importer": "^1.0.0", + "postcss": "^7.0.0", + "postcss-url": "^8.0.0", + "read-pkg-up": "^5.0.0", + "rimraf": "^3.0.0", + "rollup": "^1.12.1", + "rollup-plugin-commonjs": "^10.0.0", + "rollup-plugin-json": "^4.0.0", + "rollup-plugin-node-resolve": "^5.0.0", + "rollup-plugin-sourcemaps": "^0.4.2", + "rxjs": "^6.0.0", + "sass": "^1.17.3", + "stylus": "^0.54.5", + "terser": "^4.1.2", + "update-notifier": "^3.0.0" + }, + "dependencies": { + "commander": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.1.tgz", + "integrity": "sha512-UNgvDd+csKdc9GD4zjtkHKQbT8Aspt2jCBqNSPp53vAS0L1tS9sXB2TCEOPHJ7kt9bN/niWkYj8T3RQSoMXdSQ==", + "dev": true + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + } + }, + "read-pkg-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-5.0.0.tgz", + "integrity": "sha512-XBQjqOBtTzyol2CpsQOw8LHV0XbDZVG7xMMjmXAJomlVY03WOBRmYgDJETlvcg0H63AJvPRwT7GFi5rvOzUOKg==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^5.0.0" + } + }, + "rimraf": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz", + "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "ngrx-store-freeze": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/ngrx-store-freeze/-/ngrx-store-freeze-0.2.4.tgz", + "integrity": "sha512-90awpbbMa/x2H81eWWYniyli3LJ1PZU/FaztL10d9Rp/4kw2+97pqyLjdxSPxcOv9St//m9kfuWZ7gyoVDjgcg==", + "dev": true, + "requires": { + "deep-freeze-strict": "^1.1.1" + } + }, + "ngx-logger": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/ngx-logger/-/ngx-logger-4.0.5.tgz", + "integrity": "sha512-RUvu6TeDga+nUFGMwGiUn+GTCwpshfF4rsfS02i8euGXE9Lq9PPPzHg10sgonPCYBYj4GAx+bdPRv8BQpRyldQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0", + "vlq": "^1.0.0" + } + }, + "ngx-perfect-scrollbar": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/ngx-perfect-scrollbar/-/ngx-perfect-scrollbar-8.0.0.tgz", + "integrity": "sha512-IXoFbULQnxyJj0gdCcKCLE/6OW9HCP9KARzMCKS1kNxTuzG4DghjM2AaCBRM5/sFwdbn6rqOKMCINtHA8W8YCA==", + "dev": true, + "requires": { + "perfect-scrollbar": "^1.4.0", + "resize-observer-polyfill": "^1.5.0" + } + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-fetch-npm": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz", + "integrity": "sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw==", + "dev": true, + "requires": { + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" + } + }, + "node-forge": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", + "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", + "dev": true + }, + "node-ipc": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/node-ipc/-/node-ipc-9.1.1.tgz", + "integrity": "sha512-FAyICv0sIRJxVp3GW5fzgaf9jwwRQxAKDJlmNFUL5hOy+W4X/I5AypyHoq0DXXbo9o/gt79gj++4cMr4jVWE/w==", + "dev": true, + "requires": { + "event-pubsub": "4.3.0", + "js-message": "1.0.5", + "js-queue": "2.0.0" + } + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "node-releases": { + "version": "1.1.32", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.32.tgz", + "integrity": "sha512-VhVknkitq8dqtWoluagsGPn3dxTvN9fwgR59fV3D7sLBHe0JfDramsMI8n8mY//ccq/Kkrf8ZRHRpsyVZ3qw1A==", + "dev": true, + "requires": { + "semver": "^5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "node-sass-tilde-importer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/node-sass-tilde-importer/-/node-sass-tilde-importer-1.0.2.tgz", + "integrity": "sha512-Swcmr38Y7uB78itQeBm3mThjxBy9/Ah/ykPIaURY/L6Nec9AyRoL/jJ7ECfMR+oZeCTVQNxVMu/aHU+TLRVbdg==", + "dev": true, + "requires": { + "find-parent-dir": "^0.3.0" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, + "npm-bundled": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", + "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", + "dev": true + }, + "npm-package-arg": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz", + "integrity": "sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.6.0", + "osenv": "^0.1.5", + "semver": "^5.5.0", + "validate-npm-package-name": "^3.0.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "npm-packlist": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.6.tgz", + "integrity": "sha512-u65uQdb+qwtGvEJh/DgQgW1Xg7sqeNbmxYyrvlNznaVTjV3E5P6F/EFjM+BVHXl7JJlsdG8A64M0XI8FI/IOlg==", + "dev": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz", + "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "npm-registry-fetch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.2.tgz", + "integrity": "sha512-Z0IFtPEozNdeZRPh3aHHxdG+ZRpzcbQaJLthsm3VhNf6DScicTFRHZzK82u8RsJUsUHkX+QH/zcB/5pmd20H4A==", + "dev": true, + "requires": { + "JSONStream": "^1.3.4", + "bluebird": "^3.5.1", + "figgy-pudding": "^3.4.1", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "npm-package-arg": "^6.1.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + } + } + }, + "npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "dependencies": { + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "nugget": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nugget/-/nugget-2.0.1.tgz", + "integrity": "sha1-IBCVpIfhrTYIGzQy+jytpPjQcbA=", + "dev": true, + "requires": { + "debug": "^2.1.3", + "minimist": "^1.1.0", + "pretty-bytes": "^1.0.2", + "progress-stream": "^1.1.0", + "request": "^2.45.0", + "single-line-log": "^1.1.2", + "throttleit": "0.0.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "null-check": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", + "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", + "dev": true + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", + "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", + "dev": true + }, + "object-is": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", + "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + } + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "requires": { + "retry": "^0.12.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dev": true, + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + } + }, + "pacote": { + "version": "9.5.5", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.5.tgz", + "integrity": "sha512-jAEP+Nqj4kyMWyNpfTU/Whx1jA7jEc5cCOlurm0/0oL+v8TAp1QSsK83N7bYe+2bEdFzMAtPG5TBebjzzGV0cA==", + "dev": true, + "requires": { + "bluebird": "^3.5.3", + "cacache": "^12.0.2", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.1.0", + "glob": "^7.1.3", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "minimatch": "^3.0.4", + "minipass": "^2.3.5", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "normalize-package-data": "^2.4.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.1.12", + "npm-pick-manifest": "^2.2.3", + "npm-registry-fetch": "^4.0.0", + "osenv": "^0.1.5", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "protoduck": "^5.0.1", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.2", + "semver": "^5.6.0", + "ssri": "^6.0.1", + "tar": "^4.4.8", + "unique-filename": "^1.1.1", + "which": "^1.3.1" + }, + "dependencies": { + "npm-pick-manifest": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz", + "integrity": "sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "pako": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", + "dev": true + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "parallel-webpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/parallel-webpack/-/parallel-webpack-2.4.0.tgz", + "integrity": "sha512-vJ/TKfPcjayaw+ABcHHUoykxQMA1NtqqYIWnk9wi9n6/DEQfQ8oGmruPpSgz5LdpA/qBkKIfVe6nEmA6TPJazg==", + "dev": true, + "requires": { + "ajv": "^4.9.2", + "bluebird": "^3.0.6", + "chalk": "^1.1.1", + "interpret": "^1.0.1", + "lodash.assign": "^4.0.8", + "lodash.endswith": "^4.0.1", + "lodash.flatten": "^4.2.0", + "minimist": "^1.2.0", + "node-ipc": "^9.1.0", + "pluralize": "^1.2.1", + "supports-color": "^3.1.2", + "worker-farm": "^1.3.1" + }, + "dependencies": { + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "requires": { + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" + } + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "parse-asn1": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", + "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "perfect-scrollbar": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-1.4.0.tgz", + "integrity": "sha512-/2Sk/khljhdrsamjJYS5NjrH+GKEHEwh7zFSiYyxROyYKagkE4kSn2zDQDRTOMo8mpT2jikxx6yI1dG7lNP/hw==", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "picomatch": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.0.7.tgz", + "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==", + "dev": true + }, + "pidtree": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.0.tgz", + "integrity": "sha512-9CT4NFlDcosssyg8KVFltgokyKZIFjoBxw8CTGy+5F38Y1eQWrt8tRayiUOXE+zVKQnYu5BR8JjCtvK3BcnBhg==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "pluralize": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", + "dev": true + }, + "portfinder": { + "version": "1.0.25", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", + "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==", + "dev": true, + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.1" + }, + "dependencies": { + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-import": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz", + "integrity": "sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==", + "dev": true, + "requires": { + "postcss": "^7.0.1", + "postcss-value-parser": "^3.2.3", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-load-config": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", + "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + } + }, + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + } + }, + "postcss-url": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-8.0.0.tgz", + "integrity": "sha512-E2cbOQ5aii2zNHh8F6fk1cxls7QVFZjLPSrqvmiza8OuXLzIpErij8BDS5Y3STPfJgpIMNCPEr8JlKQWEoozUw==", + "dev": true, + "requires": { + "mime": "^2.3.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.0", + "postcss": "^7.0.2", + "xxhashjs": "^0.2.1" + }, + "dependencies": { + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + } + } + }, + "postcss-value-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", + "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "pretty-bytes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", + "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1", + "meow": "^3.1.0" + } + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "progress-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/progress-stream/-/progress-stream-1.2.0.tgz", + "integrity": "sha1-LNPP6jO6OonJwSHsM0er6asSX3c=", + "dev": true, + "requires": { + "speedometer": "~0.1.2", + "through2": "~0.2.3" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "through2": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.2.3.tgz", + "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=", + "dev": true, + "requires": { + "readable-stream": "~1.1.9", + "xtend": "~2.1.1" + } + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "dev": true, + "requires": { + "object-keys": "~0.4.0" + } + } + } + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "optional": true, + "requires": { + "asap": "~2.0.3" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "promise-retry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", + "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", + "dev": true, + "requires": { + "err-code": "^1.0.0", + "retry": "^0.10.0" + }, + "dependencies": { + "retry": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", + "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", + "dev": true + } + } + }, + "protoduck": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", + "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", + "dev": true, + "requires": { + "genfun": "^5.0.0" + } + }, + "protractor": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.2.tgz", + "integrity": "sha512-zlIj64Cr6IOWP7RwxVeD8O4UskLYPoyIcg0HboWJL9T79F1F0VWtKkGTr/9GN6BKL+/Q/GmM7C9kFVCfDbP5sA==", + "dev": true, + "requires": { + "@types/q": "^0.0.32", + "@types/selenium-webdriver": "^3.0.0", + "blocking-proxy": "^1.0.0", + "browserstack": "^1.5.1", + "chalk": "^1.1.3", + "glob": "^7.0.3", + "jasmine": "2.8.0", + "jasminewd2": "^2.1.0", + "optimist": "~0.6.0", + "q": "1.4.1", + "saucelabs": "^1.5.0", + "selenium-webdriver": "3.6.0", + "source-map-support": "~0.4.0", + "webdriver-js-extender": "2.1.0", + "webdriver-manager": "^12.0.6" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + } + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "webdriver-manager": { + "version": "12.1.7", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.7.tgz", + "integrity": "sha512-XINj6b8CYuUYC93SG3xPkxlyUc3IJbD6Vvo75CVGuG9uzsefDzWQrhz0Lq8vbPxtb4d63CZdYophF8k8Or/YiA==", + "dev": true, + "requires": { + "adm-zip": "^0.4.9", + "chalk": "^1.1.1", + "del": "^2.2.0", + "glob": "^7.0.3", + "ini": "^1.3.4", + "minimist": "^1.2.0", + "q": "^1.4.1", + "request": "^2.87.0", + "rimraf": "^2.5.2", + "semver": "^5.3.0", + "xml2js": "^0.4.17" + } + } + } + }, + "proxy-addr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", + "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.0" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz", + "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", + "dev": true + }, + "qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", + "dev": true + }, + "queueing-subject": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/queueing-subject/-/queueing-subject-0.3.4.tgz", + "integrity": "sha512-sdpymi9eq80oZyg74NrIGr1GHKIDRmBLZp+xqOct8Do5KpKalPsSz9NxApZb0S2j+EEDMzDlosBN5NJGFLmS7A==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + } + } + }, + "raw-loader": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-3.1.0.tgz", + "integrity": "sha512-lzUVMuJ06HF4rYveaz9Tv0WRlUMxJ0Y1hgSkkgg+50iEdaI0TthyEDe08KIHb0XsF6rn8WYTqPCaGTZg3sX+qA==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^2.0.1" + }, + "dependencies": { + "schema-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.5.0.tgz", + "integrity": "sha512-32ISrwW2scPXHUSusP8qMg5dLUawKkyV+/qIEV9JdXKx+rsM6mi8vZY8khg2M69Qom16rtroWXD3Ybtiws38gQ==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "requires": { + "pify": "^2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "read-config-file": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-5.0.0.tgz", + "integrity": "sha512-jIKUu+C84bfnKxyJ5j30CxCqgXWYjZLXuVE/NYlMEpeni+dhESgAeZOZd0JZbg1xTkMmnCdxksDoarkOyfEsOg==", + "dev": true, + "requires": { + "dotenv": "^8.0.0", + "dotenv-expand": "^5.1.0", + "fs-extra": "^8.1.0", + "js-yaml": "^3.13.1", + "json5": "^2.1.0", + "lazy-val": "^1.0.4" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "json5": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", + "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "read-package-json": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.0.tgz", + "integrity": "sha512-KLhu8M1ZZNkMcrq1+0UJbR8Dii8KZUqB0Sha4mOx/bknfKI/fyrQVrG/YIt2UOtG667sD8+ee4EXMM91W9dC+A==", + "dev": true, + "requires": { + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "json-parse-better-errors": "^1.0.1", + "normalize-package-data": "^2.0.0", + "slash": "^1.0.0" + } + }, + "read-package-tree": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.3.1.tgz", + "integrity": "sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw==", + "dev": true, + "requires": { + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "util-promisify": "^2.1.0" + } + }, + "read-pkg": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", + "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", + "dev": true, + "requires": { + "normalize-package-data": "^2.3.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdir-scoped-modules": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", + "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", + "dev": true, + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "readdirp": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.1.2.tgz", + "integrity": "sha512-8rhl0xs2cxfVsqzreYCvs8EwBfn/DhVdqtoLmw19uI3SC5avYX9teCurlErfpPXGmYtMHReGaP2RsLnFvz/lnw==", + "dev": true, + "requires": { + "picomatch": "^2.0.4" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "dev": true + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", + "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", + "dev": true + }, + "regenerator-transform": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", + "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", + "dev": true, + "requires": { + "private": "^0.1.6" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexp.prototype.flags": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz", + "integrity": "sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2" + } + }, + "regexpu-core": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", + "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.1.0", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" + } + }, + "registry-auth-token": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.0.0.tgz", + "integrity": "sha512-lpQkHxd9UL6tb3k/aHAVfnVtn+Bcs9ob5InuFLLEDqSqeq+AljB8GZW9xY0x7F+xYwEcjKe07nyoxzEYz6yvkw==", + "dev": true, + "requires": { + "rc": "^1.2.8", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, + "regjsgen": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", + "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==", + "dev": true + }, + "regjsparser": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", + "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", + "dev": true + }, + "resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "dependencies": { + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + } + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + }, + "rfdc": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", + "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rollup": { + "version": "1.21.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.21.4.tgz", + "integrity": "sha512-Pl512XVCmVzgcBz5h/3Li4oTaoDcmpuFZ+kdhS/wLreALz//WuDAMfomD3QEYl84NkDu6Z6wV9twlcREb4qQsw==", + "dev": true, + "requires": { + "@types/estree": "0.0.39", + "@types/node": "^12.7.5", + "acorn": "^7.0.0" + }, + "dependencies": { + "@types/node": { + "version": "12.11.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.11.6.tgz", + "integrity": "sha512-4uPUyY1Aofo1YzoypalYHNd2SnKYxH2b6LzXwpryZCJKA2XlagZSynXx5C8sfPH0r1cSltUpaVHV2q5sYXschQ==", + "dev": true + }, + "acorn": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.0.0.tgz", + "integrity": "sha512-PaF/MduxijYYt7unVGRuds1vBC9bFxbNf+VWqhOClfdgy7RlVkQqt610ig1/yxTgsDIfW1cWDel5EBbOy3jdtQ==", + "dev": true + } + } + }, + "rollup-plugin-commonjs": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.1.0.tgz", + "integrity": "sha512-jlXbjZSQg8EIeAAvepNwhJj++qJWNJw1Cl0YnOqKtP5Djx+fFGkp3WRh+W0ASCaFG5w1jhmzDxgu3SJuVxPF4Q==", + "dev": true, + "requires": { + "estree-walker": "^0.6.1", + "is-reference": "^1.1.2", + "magic-string": "^0.25.2", + "resolve": "^1.11.0", + "rollup-pluginutils": "^2.8.1" + } + }, + "rollup-plugin-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-json/-/rollup-plugin-json-4.0.0.tgz", + "integrity": "sha512-hgb8N7Cgfw5SZAkb3jf0QXii6QX/FOkiIq2M7BAQIEydjHvTyxXHQiIzZaTFgx1GK0cRCHOCBHIyEkkLdWKxow==", + "dev": true, + "requires": { + "rollup-pluginutils": "^2.5.0" + } + }, + "rollup-plugin-node-resolve": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.2.0.tgz", + "integrity": "sha512-jUlyaDXts7TW2CqQ4GaO5VJ4PwwaV8VUGA7+km3n6k6xtOEacf61u0VXwN80phY/evMcaS+9eIeJ9MOyDxt5Zw==", + "dev": true, + "requires": { + "@types/resolve": "0.0.8", + "builtin-modules": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.11.1", + "rollup-pluginutils": "^2.8.1" + } + }, + "rollup-plugin-sourcemaps": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-sourcemaps/-/rollup-plugin-sourcemaps-0.4.2.tgz", + "integrity": "sha1-YhJaqUCHqt97g+9N+vYptHMTXoc=", + "dev": true, + "requires": { + "rollup-pluginutils": "^2.0.1", + "source-map-resolve": "^0.5.0" + } + }, + "rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "requires": { + "estree-walker": "^0.6.1" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", + "dev": true + }, + "rxjs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", + "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sanitize-filename": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "dev": true, + "requires": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "sass": { + "version": "1.22.9", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.22.9.tgz", + "integrity": "sha512-FzU1X2V8DlnqabrL4u7OBwD2vcOzNMongEJEx3xMEhWY/v26FFR3aG0hyeu2T965sfR0E9ufJwmG+Qjz78vFPQ==", + "dev": true, + "requires": { + "chokidar": ">=2.0.0 <4.0.0" + } + }, + "sass-loader": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.2.0.tgz", + "integrity": "sha512-h8yUWaWtsbuIiOCgR9fd9c2lRXZ2uG+h8Dzg/AGNj+Hg/3TO8+BBAW9mEP+mh8ei+qBKqSJ0F1FLlYjNBc61OA==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "loader-utils": "^1.0.1", + "neo-async": "^2.5.0", + "pify": "^4.0.1", + "semver": "^5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "saucelabs": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", + "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", + "dev": true, + "requires": { + "https-proxy-agent": "^2.2.1" + } + }, + "sax": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", + "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selenium-webdriver": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", + "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", + "dev": true, + "requires": { + "jszip": "^3.1.3", + "rimraf": "^2.5.4", + "tmp": "0.0.30", + "xml2js": "^0.4.17" + }, + "dependencies": { + "tmp": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + } + } + }, + "selfsigned": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", + "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", + "dev": true, + "requires": { + "node-forge": "0.9.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, + "requires": { + "semver": "^5.0.3" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "semver-dsl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", + "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", + "dev": true, + "requires": { + "semver": "^5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "semver-intersect": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.4.0.tgz", + "integrity": "sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ==", + "dev": true, + "requires": { + "semver": "^5.0.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", + "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==", + "dev": true + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "single-line-log": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/single-line-log/-/single-line-log-1.1.2.tgz", + "integrity": "sha1-wvg/Jzo+GhbtsJlWYdoO1e8DM2Q=", + "dev": true, + "requires": { + "string-width": "^1.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "smart-buffer": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.0.2.tgz", + "integrity": "sha512-JDhEpTKzXusOqXZ0BUIdH+CjFdO/CR3tLlf5CN34IypI+xMmXW1uB16OOY8z3cICbJlDAVJzNbwBhNO0wt9OAw==", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "socket.io": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", + "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", + "dev": true, + "requires": { + "debug": "~3.1.0", + "engine.io": "~3.2.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.1.1", + "socket.io-parser": "~3.2.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "socket.io-adapter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", + "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=", + "dev": true + }, + "socket.io-client": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", + "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", + "dev": true, + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "engine.io-client": "~3.2.0", + "has-binary2": "~1.0.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "~3.2.0", + "to-array": "0.1.4" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "socket.io-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", + "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "dev": true, + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" + } + }, + "sockjs-client": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", + "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", + "dev": true, + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + } + } + }, + "socks": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.2.tgz", + "integrity": "sha512-pCpjxQgOByDHLlNqlnh/mNSAxIUkyBBuwwhTcV+enZGbDaClPvHdvm6uvOwZfFJkam7cGhBNbb4JxiP8UZkRvQ==", + "dev": true, + "requires": { + "ip": "^1.1.5", + "smart-buffer": "4.0.2" + } + }, + "socks-proxy-agent": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", + "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", + "dev": true, + "requires": { + "agent-base": "~4.2.1", + "socks": "~2.3.2" + }, + "dependencies": { + "agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + }, + "source-map-loader": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.4.tgz", + "integrity": "sha512-OU6UJUty+i2JDpTItnizPrlpOIBLmQbWMuBg9q5bVtnHACqw1tn9nNwqJLbv0/00JjnJb/Ee5g5WS5vrRv7zIQ==", + "dev": true, + "requires": { + "async": "^2.5.0", + "loader-utils": "^1.1.0" + }, + "dependencies": { + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + } + } + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz", + "integrity": "sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg==", + "dev": true + }, + "spawn-command": { + "version": "0.0.2-1", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", + "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=", + "dev": true + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "spdy": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", + "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "speed-measure-webpack-plugin": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.3.1.tgz", + "integrity": "sha512-qVIkJvbtS9j/UeZumbdfz0vg+QfG/zxonAjzefZrqzkr7xOncLVXkeGbTpzd1gjCBM4PmVNkWlkeTVhgskAGSQ==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "speedometer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-0.1.4.tgz", + "integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0=", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "stat-mode": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.3.0.tgz", + "integrity": "sha512-QjMLR0A3WwFY2aZdV0okfFEJB5TRjkggXZjxP3A1RsWsNHNu3YPv8btmtc6iCFZ0Rul3FE93OYogvhOUClU+ng==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "streamroller": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.6.tgz", + "integrity": "sha512-3QC47Mhv3/aZNFpDDVO44qQb9gwB9QggMEE0sQmkTAwBVYdBRWISdsywlkfm5II1Q5y/pmrHflti/IgmIzdDBg==", + "dev": true, + "requires": { + "async": "^2.6.2", + "date-format": "^2.0.0", + "debug": "^3.2.6", + "fs-extra": "^7.0.1", + "lodash": "^4.17.14" + }, + "dependencies": { + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } + } + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string.prototype.padend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz", + "integrity": "sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.4.3", + "function-bind": "^1.0.2" + } + }, + "string.prototype.trimleft": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", + "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", + "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "style-loader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.0.0.tgz", + "integrity": "sha512-B0dOCFwv7/eY31a5PCieNwMgMhVGFe9w+rh7s/Bx8kfFkrth9zfTZquoYvdw8URgiqxObQKcpW51Ugz1HjfdZw==", + "dev": true, + "requires": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.0.1" + }, + "dependencies": { + "schema-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.5.0.tgz", + "integrity": "sha512-32ISrwW2scPXHUSusP8qMg5dLUawKkyV+/qIEV9JdXKx+rsM6mi8vZY8khg2M69Qom16rtroWXD3Ybtiws38gQ==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "stylus": { + "version": "0.54.5", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz", + "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=", + "dev": true, + "requires": { + "css-parse": "1.7.x", + "debug": "*", + "glob": "7.0.x", + "mkdirp": "0.5.x", + "sax": "0.5.x", + "source-map": "0.1.x" + }, + "dependencies": { + "glob": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", + "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "stylus-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz", + "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "lodash.clonedeep": "^4.5.0", + "when": "~3.6.x" + } + }, + "sumchecker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-2.0.2.tgz", + "integrity": "sha1-D0LBDl0F2l1C7qPlbDOZo31sWz4=", + "dev": true, + "requires": { + "debug": "^2.2.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "dev": true + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "temp-file": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.3.4.tgz", + "integrity": "sha512-qSZ5W5q54iyGnP8cNl49RE0jTJc5CrzNocux5APD5yIxcgonoMuMSbsZfaZy8rTGCYo0Xz6ySVv3adagZ8gffg==", + "dev": true, + "requires": { + "async-exit-hook": "^2.0.1", + "fs-extra": "^8.1.0" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } + } + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, + "requires": { + "execa": "^0.7.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "terser": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.1.4.tgz", + "integrity": "sha512-+ZwXJvdSwbd60jG0Illav0F06GDJF0R4ydZ21Q3wGAFKoBGyJGo34F63vzJHgvYxc1ukOtIjvwEvl9MkjzM6Pg==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz", + "integrity": "sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.7.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "throttleit": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz", + "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "tree-kill": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.1.tgz", + "integrity": "sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==", + "dev": true + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=", + "dev": true, + "requires": { + "utf8-byte-length": "^1.0.1" + } + }, + "ts-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", + "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "dev": true, + "requires": { + "arrify": "^1.0.0", + "buffer-from": "^1.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" + } + }, + "tsickle": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.37.0.tgz", + "integrity": "sha512-ufUZqLUNqh+kOfr52N/hJ5JbiDO32/CO7ZCteZBX9HA2kiejwEgDaJeJe1GAj2TIu683IgTA/LPKvlns6Liw0w==", + "dev": true, + "requires": { + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map": "^0.7.3" + } + }, + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + }, + "tslint": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.15.0.tgz", + "integrity": "sha512-6bIEujKR21/3nyeoX2uBnE8s+tMXCQXhqMmaIPJpHmXJoBJPTLcI7/VHRtUwMhnLVdwLqqY3zmd8Dxqa5CVdJA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.22.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^3.2.0", + "glob": "^7.1.1", + "js-yaml": "^3.13.0", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.29.0" + }, + "dependencies": { + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/type/-/type-1.0.3.tgz", + "integrity": "sha512-51IMtNfVcee8+9GJvj0spSuFcZHe9vSib6Xtgsny1Km9ugyz2mbS08I3rsUIRYgJohFRFU1160sgRodYz378Hg==", + "dev": true + }, + "type-fest": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz", + "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typescript": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.3.tgz", + "integrity": "sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g==", + "dev": true + }, + "uglify-js": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", + "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", + "dev": true, + "optional": true, + "requires": { + "commander": "~2.20.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", + "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", + "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "^1.0.0" + } + }, + "universal-analytics": { + "version": "0.4.20", + "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.20.tgz", + "integrity": "sha512-gE91dtMvNkjO+kWsPstHRtSwHXz0l2axqptGYp5ceg4MsuurloM0PU3pdOfpb5zBXUvyjT4PwhWK2m39uczZuw==", + "dev": true, + "requires": { + "debug": "^3.0.0", + "request": "^2.88.0", + "uuid": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "update-notifier": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-3.0.1.tgz", + "integrity": "sha512-grrmrB6Zb8DUiyDIaeRTBCkgISYUgETNe7NglEbVsrLWXeESnlCSP50WfRSj/GmzMPl6Uchj24S/p80nP/ZQrQ==", + "dev": true, + "requires": { + "boxen": "^3.0.0", + "chalk": "^2.0.1", + "configstore": "^4.0.0", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.1.0", + "is-npm": "^3.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-parse": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "requires": { + "prepend-http": "^2.0.0" + }, + "dependencies": { + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + } + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "useragent": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", + "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", + "dev": true, + "requires": { + "lru-cache": "4.1.x", + "tmp": "0.0.x" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "utf8-byte-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", + "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util-promisify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/util-promisify/-/util-promisify-2.1.0.tgz", + "integrity": "sha1-PCI2R2xNMsX/PEcAKt18E7moKlM=", + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", + "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "dev": true, + "requires": { + "builtins": "^1.0.3" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vlq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", + "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", + "dev": true + }, + "vm-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", + "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", + "dev": true + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, + "wait-on": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-3.3.0.tgz", + "integrity": "sha512-97dEuUapx4+Y12aknWZn7D25kkjMk16PbWoYzpSdA8bYpVfS6hpl2a2pOWZ3c+Tyt3/i4/pglyZctG3J4V1hWQ==", + "dev": true, + "requires": { + "@hapi/joi": "^15.0.3", + "core-js": "^2.6.5", + "minimist": "^1.2.0", + "request": "^2.88.0", + "rx": "^4.1.0" + }, + "dependencies": { + "core-js": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", + "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", + "dev": true + } + } + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "webdriver-js-extender": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", + "integrity": "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==", + "dev": true, + "requires": { + "@types/selenium-webdriver": "^3.0.0", + "selenium-webdriver": "^3.0.1" + } + }, + "webpack": { + "version": "4.39.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.39.2.tgz", + "integrity": "sha512-AKgTfz3xPSsEibH00JfZ9sHXGUwIQ6eZ9tLN8+VLzachk1Cw2LVmy+4R7ZiwTa9cZZ15tzySjeMui/UnSCAZhA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.2.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.1", + "watchpack": "^1.6.0", + "webpack-sources": "^1.4.1" + } + }, + "webpack-cli": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.9.tgz", + "integrity": "sha512-xwnSxWl8nZtBl/AFJCOn9pG7s5CYUYdZxmmukv+fAHLcBIHM36dImfpQg3WfShZXeArkWlf6QRw24Klcsv8a5A==", + "dev": true, + "requires": { + "chalk": "2.4.2", + "cross-spawn": "6.0.5", + "enhanced-resolve": "4.1.0", + "findup-sync": "3.0.0", + "global-modules": "2.0.0", + "import-local": "2.0.0", + "interpret": "1.2.0", + "loader-utils": "1.2.3", + "supports-color": "6.1.0", + "v8-compile-cache": "2.0.3", + "yargs": "13.2.4" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", + "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.0" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "webpack-core": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", + "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", + "dev": true, + "requires": { + "source-list-map": "~0.1.7", + "source-map": "~0.4.1" + }, + "dependencies": { + "source-list-map": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", + "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", + "dev": true + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "webpack-dev-middleware": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.0.tgz", + "integrity": "sha512-qvDesR1QZRIAZHOE3iQ4CXLZZSQ1lAUsSpnQmlB1PBfoN/xdRjmge3Dok0W4IdaVLJOGJy3sGI4sZHwjRU0PCA==", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.2", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + } + } + }, + "webpack-dev-server": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.8.0.tgz", + "integrity": "sha512-Hs8K9yI6pyMvGkaPTeTonhD6JXVsigXDApYk9JLW4M7viVBspQvb1WdAcWxqtmttxNW4zf2UFLsLNe0y87pIGQ==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.6", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.2.1", + "http-proxy-middleware": "^0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.0", + "killable": "^1.0.1", + "loglevel": "^1.6.3", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.21", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.4", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "0.3.19", + "sockjs-client": "1.3.0", + "spdy": "^4.0.1", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.0", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "12.0.5" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, + "webpack-node-externals": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-1.7.2.tgz", + "integrity": "sha512-ajerHZ+BJKeCLviLUUmnyd5B4RavLF76uv3cs6KNuO8W+HuQaEs0y0L7o40NQxdPy5w0pcv8Ew7yPUAQG0UdCg==", + "dev": true + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "webpack-subresource-integrity": { + "version": "1.1.0-rc.6", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.1.0-rc.6.tgz", + "integrity": "sha512-Az7y8xTniNhaA0620AV1KPwWOqawurVVDzQSpPAeR5RwNbL91GoBSJAAo9cfd+GiFHwsS5bbHepBw1e6Hzxy4w==", + "dev": true, + "requires": { + "webpack-core": "^0.6.8" + } + }, + "websocket-driver": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", + "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.4.0 <0.4.11", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "dev": true + }, + "when": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz", + "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "dev": true, + "requires": { + "string-width": "^2.1.1" + } + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "worker-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/worker-plugin/-/worker-plugin-3.2.0.tgz", + "integrity": "sha512-W5nRkw7+HlbsEt3qRP6MczwDDISjiRj2GYt9+bpe8A2La00TmJdwzG5bpdMXhRt1qcWmwAvl1TiKaHRa+XDS9Q==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true + }, + "xml2js": { + "version": "0.4.22", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.22.tgz", + "integrity": "sha512-MWTbxAQqclRSTnehWWe5nMKzI3VmJ8ltiJEco8akcC6j3miOhjjfzKum5sId+CWhfxdOs/1xauYr8/ZDBtQiRw==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "util.promisify": "~1.0.0", + "xmlbuilder": "~11.0.0" + }, + "dependencies": { + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + } + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "xxhashjs": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", + "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", + "dev": true, + "requires": { + "cuint": "^0.2.2" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yauzl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", + "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", + "dev": true, + "requires": { + "fd-slicer": "~1.0.1" + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + }, + "yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "dev": true + }, + "zone.js": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.9.1.tgz", + "integrity": "sha512-GkPiJL8jifSrKReKaTZ5jkhrMEgXbXYC+IPo1iquBjayRa0q86w3Dipjn8b415jpitMExe9lV8iTsv8tk3DGag==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..2253cb4 --- /dev/null +++ b/package.json @@ -0,0 +1,116 @@ +{ + "name": "ucap-webmessenger", + "version": "0.0.0", + "scripts": { + "ng": "ng", + "start": "npm-run-all -p start:renderer start:main", + "start:main": "wait-on http-get://localhost:4200/ && npm run build:main:dev && electron --nolazy --inspect-brk=9229 .", + "start:renderer": "ng serve", + "start:web": "cross-env UCAP_ENV=WEB ng serve", + "start:production": "npm run build:renderer && npm run build:main:prod && electron --nolazy --inspect-brk=9229 .", + "build:renderer": "cross-env NODE_ENV=production ng build --base-href ./", + "build:main:dev": "cross-env NODE_ENV=development TS_NODE_PROJECT='./config/tsconfig.webpack.json' parallel-webpack --config=config/main.webpack.config.ts", + "build:main:prod": "cross-env NODE_ENV=production TS_NODE_PROJECT='./config/tsconfig.webpack.json' NODE_OPTIONS='--max_old_space_size=4096' parallel-webpack --config=config/main.webpack.config.ts", + "test": "ng test", + "lint": "ng lint", + "e2e": "ng e2e" + }, + "private": true, + "dependencies": { + "tslib": "^1.10.0" + }, + "devDependencies": { + "@angular-builders/custom-webpack": "^8.2.0", + "@angular-devkit/build-angular": "~0.803.14", + "@angular-devkit/build-ng-packagr": "~0.803.14", + "@angular/animations": "^8.2.12", + "@angular/cdk": "^8.2.3", + "@angular/cli": "~8.3.14", + "@angular/common": "~8.2.12", + "@angular/compiler": "~8.2.12", + "@angular/compiler-cli": "~8.2.12", + "@angular/core": "~8.2.12", + "@angular/flex-layout": "^8.0.0-beta.27", + "@angular/forms": "~8.2.12", + "@angular/language-service": "~8.2.12", + "@angular/material": "^8.2.3", + "@angular/material-moment-adapter": "^8.2.3", + "@angular/platform-browser": "~8.2.12", + "@angular/platform-browser-dynamic": "~8.2.12", + "@angular/router": "~8.2.12", + "@ngrx/effects": "^8.4.0", + "@ngrx/entity": "^8.4.0", + "@ngrx/router-store": "^8.4.0", + "@ngrx/store": "^8.4.0", + "@ngrx/store-devtools": "^8.4.0", + "@ngx-translate/core": "^11.0.1", + "@types/copy-webpack-plugin": "^5.0.0", + "@types/crypto-js": "^3.1.43", + "@types/detect-browser": "^4.0.0", + "@types/electron-debug": "^2.1.0", + "@types/electron-devtools-installer": "^2.2.0", + "@types/extract-text-webpack-plugin": "^3.0.4", + "@types/fs-extra": "^8.0.0", + "@types/file-saver": "^2.0.1", + "@types/filesize": "^4.1.0", + "@types/jasmine": "~3.3.8", + "@types/jasminewd2": "~2.0.3", + "@types/node": "^10.14.22", + "@types/semver": "^6.0.2", + "@types/webpack": "^4.39.5", + "@types/webpack-merge": "^4.1.5", + "@types/webpack-node-externals": "^1.6.3", + "awesome-node-loader": "^1.1.1", + "awesome-typescript-loader": "^5.2.1", + "clean-webpack-plugin": "^3.0.0", + "copy-webpack-plugin": "^5.0.4", + "codelyzer": "^5.0.0", + "concurrently": "^4.1.2", + "crypto-js": "^3.1.9-1", + "cross-env": "^5.2.1", + "detect-browser": "^4.6.0", + "devtron": "^1.4.0", + "electron": "^6.1.2", + "electron-builder": "^21.2.0", + "electron-debug": "^3.0.1", + "electron-devtools-installer": "^2.2.4", + "electron-log": "^3.0.8", + "electron-reload": "^1.5.0", + "electron-store": "^4.0.0", + "electron-updater": "^4.1.2", + "electron-window-state": "^5.0.3", + "file-saver": "^2.0.2", + "fs-extra": "^8.1.0", + "filesize": "^4.1.2", + "hammerjs": "^2.0.8", + "jasmine-core": "~3.4.0", + "jasmine-spec-reporter": "~4.2.1", + "karma": "~4.1.0", + "karma-chrome-launcher": "~2.2.0", + "karma-coverage-istanbul-reporter": "~2.0.1", + "karma-jasmine": "~2.0.1", + "karma-jasmine-html-reporter": "^1.4.0", + "moment": "^2.24.0", + "ng-packagr": "^5.4.0", + "ngrx-store-freeze": "^0.2.4", + "ngx-logger": "^4.0.5", + "ngx-perfect-scrollbar": "^8.0.0", + "npm-run-all": "^4.1.5", + "parallel-webpack": "^2.4.0", + "protractor": "~5.4.0", + "queueing-subject": "^0.3.4", + "rxjs": "^6.5.2", + "semver": "^6.3.0", + "ts-node": "~7.0.0", + "tsickle": "^0.37.0", + "tslib": "^1.10.0", + "tslint": "~5.15.0", + "typescript": "~3.5.3", + "wait-on": "^3.3.0", + "webpack": "4.39.2", + "webpack-cli": "^3.3.7", + "webpack-node-externals": "^1.7.2", + "zone.js": "~0.9.1" + }, + "main": "./dist/main/main.js" +} diff --git a/projects/ucap-webmessenger-api-common/README.md b/projects/ucap-webmessenger-api-common/README.md new file mode 100644 index 0000000..a01a565 --- /dev/null +++ b/projects/ucap-webmessenger-api-common/README.md @@ -0,0 +1,24 @@ +# UcapWebmessengerApiCommon + +This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.2.4. + +## Code scaffolding + +Run `ng generate component component-name --project ucap-webmessenger-api-common` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project ucap-webmessenger-api-common`. +> Note: Don't forget to add `--project ucap-webmessenger-api-common` or else it will be added to the default project in your `angular.json` file. + +## Build + +Run `ng build ucap-webmessenger-api-common` to build the project. The build artifacts will be stored in the `dist/` directory. + +## Publishing + +After building your library with `ng build ucap-webmessenger-api-common`, go to the dist folder `cd dist/ucap-webmessenger-api-common` and run `npm publish`. + +## Running unit tests + +Run `ng test ucap-webmessenger-api-common` to execute the unit tests via [Karma](https://karma-runner.github.io). + +## Further help + +To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). diff --git a/projects/ucap-webmessenger-api-common/karma.conf.js b/projects/ucap-webmessenger-api-common/karma.conf.js new file mode 100644 index 0000000..17c6fbb --- /dev/null +++ b/projects/ucap-webmessenger-api-common/karma.conf.js @@ -0,0 +1,32 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage-istanbul-reporter'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + coverageIstanbulReporter: { + dir: require('path').join(__dirname, '../../coverage/ucap-webmessenger-api-common'), + reports: ['html', 'lcovonly', 'text-summary'], + fixWebpackSourcePaths: true + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false, + restartOnFileChange: true + }); +}; diff --git a/projects/ucap-webmessenger-api-common/ng-package.json b/projects/ucap-webmessenger-api-common/ng-package.json new file mode 100644 index 0000000..ac20a11 --- /dev/null +++ b/projects/ucap-webmessenger-api-common/ng-package.json @@ -0,0 +1,7 @@ +{ + "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../../dist/ucap-webmessenger-api-common", + "lib": { + "entryFile": "src/public-api.ts" + } +} \ No newline at end of file diff --git a/projects/ucap-webmessenger-api-common/package.json b/projects/ucap-webmessenger-api-common/package.json new file mode 100644 index 0000000..1cdc4b6 --- /dev/null +++ b/projects/ucap-webmessenger-api-common/package.json @@ -0,0 +1,8 @@ +{ + "name": "@ucap-webmessenger/api-common", + "version": "0.0.1", + "peerDependencies": { + "@angular/common": "^8.2.4", + "@angular/core": "^8.2.4" + } +} diff --git a/projects/ucap-webmessenger-api-common/src/lib/apis/file-profile-save.ts b/projects/ucap-webmessenger-api-common/src/lib/apis/file-profile-save.ts new file mode 100644 index 0000000..e385af6 --- /dev/null +++ b/projects/ucap-webmessenger-api-common/src/lib/apis/file-profile-save.ts @@ -0,0 +1,36 @@ +import { DeviceType } from '@ucap-webmessenger/core'; +import { + APIRequest, + APIResponse, + APIEncoder, + APIDecoder, + ParameterUtil +} from '@ucap-webmessenger/api'; + +export interface FileProfileSaveRequest extends APIRequest { + userSeq: number; + deviceType: DeviceType; + token: string; + file?: File; + intro?: string; + initProfileImage?: boolean; +} + +export interface FileProfileSaveResponse extends APIResponse { + ProfileURL?: string; + ProfileSubDir?: string; +} + +const fileProfileEncodeMap = {}; + +export const encodeFileProfileSave: APIEncoder = ( + req: FileProfileSaveRequest +) => { + return ParameterUtil.encode(fileProfileEncodeMap, req); +}; + +export const decodeFileProfileSave: APIDecoder = ( + res: any +) => { + return {} as FileProfileSaveResponse; +}; diff --git a/projects/ucap-webmessenger-api-common/src/lib/apis/file-talk-download.ts b/projects/ucap-webmessenger-api-common/src/lib/apis/file-talk-download.ts new file mode 100644 index 0000000..30b7b79 --- /dev/null +++ b/projects/ucap-webmessenger-api-common/src/lib/apis/file-talk-download.ts @@ -0,0 +1,49 @@ +import { DeviceType } from '@ucap-webmessenger/core'; +import { + APIRequest, + APIEncoder, + ParameterUtil, + APIFormDataEncoder +} from '@ucap-webmessenger/api'; +import { FileDownloadItem } from '../models/file-download-item'; + +export interface FileTalkDownloadRequest extends APIRequest { + userSeq: number; + deviceType: DeviceType; + token: string; + attachmentsSeq?: number; + fileDownloadItem?: FileDownloadItem; +} + +const fileTalkDownloadEncodeMap = { + userSeq: 'p_user_seq', + deviceType: 'p_device_type', + token: 'p_token', + attachmentsSeq: 'p_att_seq' +}; + +export const encodeFileTalkDownload: APIEncoder = ( + req: FileTalkDownloadRequest +) => { + const extraParams: any = {}; + + extraParams.userSeq = String(req.userSeq); + extraParams.attachmentsSeq = String(req.attachmentsSeq); + + return ParameterUtil.encode(fileTalkDownloadEncodeMap, req, extraParams); +}; + +export const encodeFormDataFileTalkDownload: APIFormDataEncoder< + FileTalkDownloadRequest +> = (req: FileTalkDownloadRequest) => { + const extraParams: any = {}; + + extraParams.userSeq = String(req.userSeq); + extraParams.attachmentsSeq = String(req.attachmentsSeq); + + return ParameterUtil.encodeFormData( + fileTalkDownloadEncodeMap, + req, + extraParams + ); +}; diff --git a/projects/ucap-webmessenger-api-common/src/lib/apis/file-talk-save.ts b/projects/ucap-webmessenger-api-common/src/lib/apis/file-talk-save.ts new file mode 100644 index 0000000..aff689f --- /dev/null +++ b/projects/ucap-webmessenger-api-common/src/lib/apis/file-talk-save.ts @@ -0,0 +1,99 @@ +import { DeviceType } from '@ucap-webmessenger/core'; +import { + APIRequest, + APIResponse, + APIEncoder, + APIDecoder, + ParameterUtil, + StatusCode, + JsonAnalization, + APIFormDataEncoder +} from '@ucap-webmessenger/api'; +import { FileUploadItem } from '../models/file-upload-item'; + +export interface FileTalkSaveRequest extends APIRequest { + userSeq: number; + deviceType: DeviceType; + token: string; + file: File; + fileName?: string; + fileUploadItem: FileUploadItem; + thumb?: File; + voice?: boolean; + voiceTime?: string; + roomSeq?: string; + type?: string; +} + +export interface FileTalkSaveResponse extends APIResponse { + roomSeq?: string; + fileName?: string; + fileExt?: string; + fileType?: string; + thumbnailUrl?: string; + attachmentSeq?: string; + attachmentSize?: string; + attachmentRegDate?: string; + imageWidth?: string; + imageHeight?: string; + companyCode?: string; + voiceTime?: string; + synapKey?: string; + returnJson?: any; +} + +const fileTalkSaveEncodeMap = { + userSeq: 'p_user_seq', + deviceType: 'p_device_type', + token: 'p_token', + file: 'file', + fileName: 'p_file_name', + thumb: 'thumb', + voice: 'p_voice', + voiceTime: 'p_voice_time', + roomSeq: 'p_room_id', + type: 'p_type' +}; + +export const encodeFileTalkSave: APIFormDataEncoder = ( + req: FileTalkSaveRequest +) => { + const extraParams: any = {}; + + extraParams.userSeq = String(req.userSeq); + if (!!req.voice) { + extraParams.voice = req.voice ? 'Y' : 'N'; + } + + return ParameterUtil.encodeFormData(fileTalkSaveEncodeMap, req, extraParams); +}; + +export const decodeFileTalkSave: APIDecoder = ( + res: any +) => { + try { + const json = JsonAnalization.receiveAnalization(res); + return { + statusCode: json.StatusCode, + roomSeq: json.RoomID, + fileName: json.FileName, + fileExt: json.FileExt, + fileType: json.FileType, + thumbnailUrl: json.ThumbURL, + attachmentSeq: json.AttSEQ, + attachmentSize: json.AttSize, + attachmentRegDate: json.AttRegDate, + imageWidth: json.ImageWidth, + imageHeight: json.ImageHeight, + companyCode: json.CompanyCode, + voiceTime: json.VoiceTime, + synapKey: json.SynapKey, + returnJson: res + } as FileTalkSaveResponse; + } catch (e) { + return { + statusCode: StatusCode.Fail, + errorMessage: e + } as FileTalkSaveResponse; + } +}; diff --git a/projects/ucap-webmessenger-api-common/src/lib/apis/file-talk-share.ts b/projects/ucap-webmessenger-api-common/src/lib/apis/file-talk-share.ts new file mode 100644 index 0000000..7ea214a --- /dev/null +++ b/projects/ucap-webmessenger-api-common/src/lib/apis/file-talk-share.ts @@ -0,0 +1,75 @@ +import { DeviceType } from '@ucap-webmessenger/core'; +import { + APIRequest, + APIResponse, + APIEncoder, + APIDecoder, + ParameterUtil, + JsonAnalization, + StatusCode +} from '@ucap-webmessenger/api'; + +export interface FileTalkShareRequest extends APIRequest { + userSeq: number; + deviceType: DeviceType; + token: string; + attachmentsSeq?: string; + roomSeq?: string; + synapKey?: string; +} + +export interface FileTalkShareResponse extends APIResponse { + roomSeq?: string; + fileName?: string; + fileExt?: string; + fileType?: string; + thumbnailUrl?: string; + attachmentSeq?: string; + attachmentSize?: string; + attachmentRegDate?: string; + companyCode?: string; + synapKey?: string; + returnJson?: any; +} + +const fileTalkShareEncodeMap = { + userSeq: 'p_user_seq', + deviceType: 'p_device_type', + token: 'p_token', + attachmentsSeq: 'p_att_seq', + roomSeq: 'p_room_id', + synapKey: 'p_synap_key' +}; + +export const encodeFileTalkShare: APIEncoder = ( + req: FileTalkShareRequest +) => { + return ParameterUtil.encode(fileTalkShareEncodeMap, req); +}; + +export const decodeFileTalkShare: APIDecoder = ( + res: any +) => { + try { + const json = JsonAnalization.receiveAnalization(res); + return { + statusCode: json.StatusCode, + roomSeq: json.RoomID, + fileName: json.FileName, + fileExt: json.FileExt, + fileType: json.FileType, + thumbnailUrl: json.ThumbURL, + attachmentSeq: json.AttSEQ, + attachmentSize: json.AttSize, + attachmentRegDate: json.AttRegDate, + companyCode: json.CompanyCode, + synapKey: json.SynapKey, + returnJson: res + } as FileTalkShareResponse; + } catch (e) { + return { + statusCode: StatusCode.Fail, + errorMessage: e + } as FileTalkShareResponse; + } +}; diff --git a/projects/ucap-webmessenger-api-common/src/lib/apis/mass-talk-download.ts b/projects/ucap-webmessenger-api-common/src/lib/apis/mass-talk-download.ts new file mode 100644 index 0000000..66dfc34 --- /dev/null +++ b/projects/ucap-webmessenger-api-common/src/lib/apis/mass-talk-download.ts @@ -0,0 +1,56 @@ +import { DeviceType } from '@ucap-webmessenger/core'; +import { + APIRequest, + APIResponse, + APIEncoder, + APIDecoder, + ParameterUtil, + JsonAnalization, + StatusCode +} from '@ucap-webmessenger/api'; + +export interface MassTalkDownloadRequest extends APIRequest { + userSeq: number; + deviceType: DeviceType; + token: string; + eventMassSeq?: number; +} + +export interface MassTalkDownloadResponse extends APIResponse { + content?: string; + userName?: string; + regDate?: string; +} + +const massTalkDownloadEncodeMap = { + userSeq: 'p_user_seq', + deviceType: 'p_device_type', + token: 'p_token', + eventMassSeq: 'p_event_mass_seq' +}; + +export const encodeMassTalkDownload: APIEncoder = ( + req: MassTalkDownloadRequest +) => { + return ParameterUtil.encode(massTalkDownloadEncodeMap, req); +}; + +export const decodeMassTalkDownload: APIDecoder = ( + res: any +) => { + try { + const json = JsonAnalization.receiveAnalization(res); + return { + statusCode: json.StatusCode, + errorMessage: json.ErrorMessage, + content: json.Content, + userName: json.UserName, + regDate: json.RegDate + } as MassTalkDownloadResponse; + } catch (e) { + return { + statusCode: StatusCode.Fail, + errorMessage: e + } as MassTalkDownloadResponse; + } +}; diff --git a/projects/ucap-webmessenger-api-common/src/lib/apis/mass-talk-save.ts b/projects/ucap-webmessenger-api-common/src/lib/apis/mass-talk-save.ts new file mode 100644 index 0000000..7f4fc84 --- /dev/null +++ b/projects/ucap-webmessenger-api-common/src/lib/apis/mass-talk-save.ts @@ -0,0 +1,62 @@ +import { DeviceType } from '@ucap-webmessenger/core'; +import { + APIRequest, + APIResponse, + APIEncoder, + APIDecoder, + ParameterUtil, + StatusCode, + JsonAnalization +} from '@ucap-webmessenger/api'; + +export interface MassTalkSaveRequest extends APIRequest { + userSeq: number; + deviceType: DeviceType; + token: string; + content?: string; + roomSeq?: string; +} + +export interface MassTalkSaveResponse extends APIResponse { + eventMassSeq?: string; + roomSeq?: string; + regDate?: string; + content?: string; + returnJson?: any; +} + +const massTalkSaveEncodeMap = { + userSeq: 'p_user_seq', + deviceType: 'p_device_type', + token: 'p_token', + content: 'p_content', + roomSeq: 'p_room_id' +}; + +export const encodeMassTalkSave: APIEncoder = ( + req: MassTalkSaveRequest +) => { + return ParameterUtil.encode(massTalkSaveEncodeMap, req); +}; + +export const decodeMassTalkSave: APIDecoder = ( + res: any +) => { + try { + const json = JsonAnalization.receiveAnalization(res); + return { + statusCode: json.StatusCode, + errorMessage: json.ErrorMessage, + content: json.Content, + eventMassSeq: json.EventMassSeq, + regDate: json.RegDate, + roomSeq: json.RoomID, + returnJson: res + } as MassTalkSaveResponse; + } catch (e) { + return { + statusCode: StatusCode.Fail, + errorMessage: e + } as MassTalkSaveResponse; + } +}; diff --git a/projects/ucap-webmessenger-api-common/src/lib/apis/trans-mass-talk-download.ts b/projects/ucap-webmessenger-api-common/src/lib/apis/trans-mass-talk-download.ts new file mode 100644 index 0000000..6790736 --- /dev/null +++ b/projects/ucap-webmessenger-api-common/src/lib/apis/trans-mass-talk-download.ts @@ -0,0 +1,37 @@ +import { DeviceType } from '@ucap-webmessenger/core'; +import { + APIRequest, + APIResponse, + APIEncoder, + APIDecoder, + ParameterUtil +} from '@ucap-webmessenger/api'; + +export interface TransMassTalkDownloadRequest extends APIRequest { + userSeq: number; + deviceType: DeviceType; + token: string; + eventTransSeq?: string; +} + +export interface TransMassTalkDownloadResponse extends APIResponse { + Original?: string; + Translation?: string; + Locale?: string; + UserName?: string; + RegDate?: string; +} + +const transMassTalkDownloadEncodeMap = {}; + +export const encodeTransMassTalkDownload: APIEncoder< + TransMassTalkDownloadRequest +> = (req: TransMassTalkDownloadRequest) => { + return ParameterUtil.encode(transMassTalkDownloadEncodeMap, req); +}; + +export const decodeTransMassTalkDownload: APIDecoder< + TransMassTalkDownloadResponse +> = (res: any) => { + return {} as TransMassTalkDownloadResponse; +}; diff --git a/projects/ucap-webmessenger-api-common/src/lib/apis/trans-mass-talk-save.ts b/projects/ucap-webmessenger-api-common/src/lib/apis/trans-mass-talk-save.ts new file mode 100644 index 0000000..396a0a4 --- /dev/null +++ b/projects/ucap-webmessenger-api-common/src/lib/apis/trans-mass-talk-save.ts @@ -0,0 +1,69 @@ +import { DeviceType } from '@ucap-webmessenger/core'; +import { + APIRequest, + APIResponse, + APIEncoder, + APIDecoder, + ParameterUtil, + JsonAnalization, + StatusCode +} from '@ucap-webmessenger/api'; + +export interface TransMassTalkSaveRequest extends APIRequest { + userSeq: number; + deviceType: DeviceType; + token: string; + original?: string; + translation?: string; + roomSeq?: string; + locale: string; +} + +export interface TransMassTalkSaveResponse extends APIResponse { + roomSeq?: string; + registrationDate?: string; + translationSeq?: string; + locale?: string; + original?: string; + translation?: string; + returnJson?: any; +} + +const transMassTalkSaveEncodeMap = { + userSeq: 'p_user_seq', + deviceType: 'p_device_type', + token: 'p_token', + original: 'p_original', + translation: 'p_translation', + roomSeq: 'p_room_id', + locale: 'p_locale' +}; + +export const encodeTransMassTalkSave: APIEncoder = ( + req: TransMassTalkSaveRequest +) => { + return ParameterUtil.encode(transMassTalkSaveEncodeMap, req); +}; + +export const decodeTransMassTalkSave: APIDecoder = ( + res: any +) => { + try { + const json = JsonAnalization.receiveAnalization(res); + return { + statusCode: json.StatusCode, + translationSeq: json.EventTransSEQ, + roomSeq: json.RoomID, + registrationDate: json.RegDate, + locale: json.Locale, + original: json.Original, + translation: json.Translation, + returnJson: res + } as TransMassTalkSaveResponse; + } catch (e) { + return { + statusCode: StatusCode.Fail, + errorMessage: e + } as TransMassTalkSaveResponse; + } +}; diff --git a/projects/ucap-webmessenger-api-common/src/lib/apis/translation-req.ts b/projects/ucap-webmessenger-api-common/src/lib/apis/translation-req.ts new file mode 100644 index 0000000..6cbcc92 --- /dev/null +++ b/projects/ucap-webmessenger-api-common/src/lib/apis/translation-req.ts @@ -0,0 +1,38 @@ +import { DeviceType } from '@ucap-webmessenger/core'; +import { + APIRequest, + APIResponse, + APIEncoder, + APIDecoder, + ParameterUtil +} from '@ucap-webmessenger/api'; + +export interface TranslationReqRequest extends APIRequest { + userSeq: number; + deviceType: DeviceType; + token: string; + original: string; + srcLocale: string; + destLocale: string; +} + +export interface TranslationReqResponse extends APIResponse { + SrcLocale?: string; + DestLocale?: string; + Original?: string; + Translation?: string; +} + +const translationReqEncodeMap = {}; + +export const encodeTranslationReq: APIEncoder = ( + req: TranslationReqRequest +) => { + return ParameterUtil.encode(translationReqEncodeMap, req); +}; + +export const decodeTranslationReq: APIDecoder = ( + res: any +) => { + return {} as TranslationReqResponse; +}; diff --git a/projects/ucap-webmessenger-api-common/src/lib/apis/translation-save.ts b/projects/ucap-webmessenger-api-common/src/lib/apis/translation-save.ts new file mode 100644 index 0000000..3c4f5bd --- /dev/null +++ b/projects/ucap-webmessenger-api-common/src/lib/apis/translation-save.ts @@ -0,0 +1,71 @@ +import { DeviceType } from '@ucap-webmessenger/core'; +import { + APIRequest, + APIResponse, + APIEncoder, + APIDecoder, + ParameterUtil, + JsonAnalization, + StatusCode +} from '@ucap-webmessenger/api'; + +export interface TranslationSaveRequest extends APIRequest { + userSeq: number; + deviceType: DeviceType; + token: string; + roomSeq?: string; + original?: string; + srcLocale: string; + destLocale: string; +} + +export interface TranslationSaveResponse extends APIResponse { + translationSeq?: string; + roomSeq?: string; + registrationDate?: string; + srcLocale?: string; + destLocale?: string; + original?: string; + translation?: string; + returnJson?: any; +} + +const translationSaveEncodeMap = { + userSeq: 'p_user_seq', + deviceType: 'p_device_type', + token: 'p_token', + roomSeq: 'p_room_id', + original: 'p_original', + srcLocale: 'p_src_locale', + destLocale: 'p_dest_locale' +}; + +export const encodeTranslationSave: APIEncoder = ( + req: TranslationSaveRequest +) => { + return ParameterUtil.encode(translationSaveEncodeMap, req); +}; + +export const decodeTranslationSave: APIDecoder = ( + res: any +) => { + try { + const json = JsonAnalization.receiveAnalization(res); + return { + statusCode: json.StatusCode, + translationSeq: json.EventTransSEQ, + roomSeq: json.RoomID, + registrationDate: json.RegDate, + srcLocale: json.SrcLocale, + destLocale: json.DestLocale, + original: json.Original, + translation: json.Translation, + returnJson: res + } as TranslationSaveResponse; + } catch (e) { + return { + statusCode: StatusCode.Fail, + errorMessage: e + } as TranslationSaveResponse; + } +}; diff --git a/projects/ucap-webmessenger-api-common/src/lib/models/file-download-item.ts b/projects/ucap-webmessenger-api-common/src/lib/models/file-download-item.ts new file mode 100644 index 0000000..8f4dc8c --- /dev/null +++ b/projects/ucap-webmessenger-api-common/src/lib/models/file-download-item.ts @@ -0,0 +1,27 @@ +import { Observable, Subject } from 'rxjs'; +import { share } from 'rxjs/operators'; + +export class FileDownloadItem { + downloadTime: number; + downloadingProgress$: Observable; + + private downloadingProgress: Subject; + private downloadStartTime: number; + + constructor() {} + + downloadStart(): Subject { + this.downloadStartTime = new Date().getTime(); + this.downloadingProgress = new Subject(); + this.downloadingProgress$ = this.downloadingProgress + .asObservable() + .pipe(share()); + return this.downloadingProgress; + } + + downloadComplete() { + const endTime = new Date().getTime(); + this.downloadTime = endTime - this.downloadStartTime; + this.downloadingProgress.complete(); + } +} diff --git a/projects/ucap-webmessenger-api-common/src/lib/models/file-upload-item.ts b/projects/ucap-webmessenger-api-common/src/lib/models/file-upload-item.ts new file mode 100644 index 0000000..53ac2ee --- /dev/null +++ b/projects/ucap-webmessenger-api-common/src/lib/models/file-upload-item.ts @@ -0,0 +1,41 @@ +import { Observable, Subject } from 'rxjs'; +import { share } from 'rxjs/operators'; + +export class FileUploadItem { + file: File; + uploadTime: number; + uploadingProgress$: Observable; + + private uploadingProgress: Subject; + private uploadStartTime: number; + + private constructor(file: File) { + this.file = file; + } + + static fromFiles(files: FileList): FileUploadItem[] { + const fileItems: FileUploadItem[] = []; + + // tslint:disable-next-line: prefer-for-of + for (let i = 0; i < files.length; i++) { + fileItems.push(new FileUploadItem(files[i])); + } + + return fileItems; + } + + uploadStart(): Subject { + this.uploadStartTime = new Date().getTime(); + this.uploadingProgress = new Subject(); + this.uploadingProgress$ = this.uploadingProgress + .asObservable() + .pipe(share()); + return this.uploadingProgress; + } + + uploadComplete() { + const endTime = new Date().getTime(); + this.uploadTime = endTime - this.uploadStartTime; + this.uploadingProgress.complete(); + } +} diff --git a/projects/ucap-webmessenger-api-common/src/lib/services/common-api.service.spec.ts b/projects/ucap-webmessenger-api-common/src/lib/services/common-api.service.spec.ts new file mode 100644 index 0000000..b229df4 --- /dev/null +++ b/projects/ucap-webmessenger-api-common/src/lib/services/common-api.service.spec.ts @@ -0,0 +1,12 @@ +import { TestBed } from '@angular/core/testing'; + +import { CommonApiService } from './common-api.service'; + +describe('CommonApiService', () => { + beforeEach(() => TestBed.configureTestingModule({})); + + it('should be created', () => { + const service: CommonApiService = TestBed.get(CommonApiService); + expect(service).toBeTruthy(); + }); +}); diff --git a/projects/ucap-webmessenger-api-common/src/lib/services/common-api.service.ts b/projects/ucap-webmessenger-api-common/src/lib/services/common-api.service.ts new file mode 100644 index 0000000..f67b1c9 --- /dev/null +++ b/projects/ucap-webmessenger-api-common/src/lib/services/common-api.service.ts @@ -0,0 +1,295 @@ +import { Injectable, Inject } from '@angular/core'; +import { + HttpClient, + HttpEventType, + HttpResponse, + HttpRequest +} from '@angular/common/http'; + +import { Observable, Subject } from 'rxjs'; +import { map, filter } from 'rxjs/operators'; + +import { _MODULE_CONFIG } from '../types/token'; +import { ModuleConfig } from '../types/module-config'; +import { + FileProfileSaveRequest, + FileProfileSaveResponse, + encodeFileProfileSave, + decodeFileProfileSave +} from '../apis/file-profile-save'; +import { + FileTalkDownloadRequest, + encodeFileTalkDownload, + encodeFormDataFileTalkDownload +} from '../apis/file-talk-download'; +import { + FileTalkSaveRequest, + FileTalkSaveResponse, + encodeFileTalkSave, + decodeFileTalkSave +} from '../apis/file-talk-save'; +import { + FileTalkShareRequest, + FileTalkShareResponse, + encodeFileTalkShare, + decodeFileTalkShare +} from '../apis/file-talk-share'; +import { + MassTalkDownloadRequest, + MassTalkDownloadResponse, + encodeMassTalkDownload, + decodeMassTalkDownload +} from '../apis/mass-talk-download'; +import { + MassTalkSaveRequest, + MassTalkSaveResponse, + encodeMassTalkSave, + decodeMassTalkSave +} from '../apis/mass-talk-save'; +import { + TransMassTalkDownloadRequest, + TransMassTalkDownloadResponse, + encodeTransMassTalkDownload, + decodeTransMassTalkDownload +} from '../apis/trans-mass-talk-download'; +import { + TransMassTalkSaveRequest, + TransMassTalkSaveResponse, + encodeTransMassTalkSave, + decodeTransMassTalkSave +} from '../apis/trans-mass-talk-save'; +import { + TranslationReqRequest, + TranslationReqResponse, + encodeTranslationReq, + decodeTranslationReq +} from '../apis/translation-req'; +import { + TranslationSaveRequest, + TranslationSaveResponse, + encodeTranslationSave, + decodeTranslationSave +} from '../apis/translation-save'; + +@Injectable({ + providedIn: 'root' +}) +export class CommonApiService { + constructor( + @Inject(_MODULE_CONFIG) private moduleConfig: ModuleConfig, + private httpClient: HttpClient + ) {} + + public fileProfileSave( + req: FileProfileSaveRequest, + fileProfileSaveUrl?: string + ): Observable { + return this.httpClient + .post( + !!fileProfileSaveUrl + ? fileProfileSaveUrl + : this.moduleConfig.urls.fileProfileSave, + {}, + { + params: encodeFileProfileSave(req) + } + ) + .pipe(map(res => decodeFileProfileSave(res))); + } + + public urlForFileTalkDownload( + req: FileTalkDownloadRequest, + fileTalkDownloadUrl?: string + ): string { + const httpReq = new HttpRequest( + 'GET', + !!fileTalkDownloadUrl + ? fileTalkDownloadUrl + : this.moduleConfig.urls.fileTalkDownload, + {}, + { + params: encodeFileTalkDownload(req) + } + ); + + return httpReq.urlWithParams; + } + + public fileTalkDownload( + req: FileTalkDownloadRequest, + fileTalkDownloadUrl?: string + ): Observable { + const httpReq = new HttpRequest( + 'POST', + !!fileTalkDownloadUrl + ? fileTalkDownloadUrl + : this.moduleConfig.urls.fileTalkDownload, + encodeFormDataFileTalkDownload(req), + { reportProgress: true, responseType: 'blob' } + ); + + let progress: Subject; + if (!!req.fileDownloadItem) { + progress = req.fileDownloadItem.downloadStart(); + } + + return this.httpClient.request(httpReq).pipe( + filter(event => { + if (event instanceof HttpResponse) { + return true; + } else if (HttpEventType.DownloadProgress === event.type) { + if (!!progress) { + progress.next(Math.round((100 * event.loaded) / event.total)); + } + } + return false; + }), + map((event: HttpResponse) => { + if (!!progress) { + req.fileDownloadItem.downloadComplete(); + } + return event.body; + }) + ); + } + + public fileTalkSave( + req: FileTalkSaveRequest, + fileTalkSaveUrl?: string + ): Observable { + const httpReq = new HttpRequest( + 'POST', + !!fileTalkSaveUrl ? fileTalkSaveUrl : this.moduleConfig.urls.fileTalkSave, + encodeFileTalkSave(req), + { reportProgress: true, responseType: 'text' as 'json' } + ); + + const progress = req.fileUploadItem.uploadStart(); + + return this.httpClient.request(httpReq).pipe( + filter(event => { + if (event instanceof HttpResponse) { + return true; + } else if (HttpEventType.UploadProgress === event.type) { + progress.next(Math.round((100 * event.loaded) / event.total)); + } + return false; + }), + map((event: HttpResponse) => { + req.fileUploadItem.uploadComplete(); + return decodeFileTalkSave(event.body); + }) + ); + } + + public acceptableExtensionForFileTalk(extensions: string[]): boolean { + for (const extension of extensions) { + if ( + -1 === this.moduleConfig.acceptableFileExtensions.indexOf(extension.toLowerCase()) + ) { + return false; + } + } + return true; + } + + public fileTalkShare( + req: FileTalkShareRequest + ): Observable { + return this.httpClient + .post( + this.moduleConfig.urls.fileTalkShare, + {}, + { + params: encodeFileTalkShare(req) + } + ) + .pipe(map(res => decodeFileTalkShare(res))); + } + + public massTalkDownload( + req: MassTalkDownloadRequest + ): Observable { + return this.httpClient + .post( + this.moduleConfig.urls.massTalkDownload, + {}, + { + params: encodeMassTalkDownload(req), + responseType: 'text' as 'json' + } + ) + .pipe(map(res => decodeMassTalkDownload(res))); + } + + public massTalkSave( + req: MassTalkSaveRequest + ): Observable { + return this.httpClient + .post( + this.moduleConfig.urls.massTalkSave, + {}, + { + params: encodeMassTalkSave(req), + responseType: 'text' as 'json' + } + ) + .pipe(map(res => decodeMassTalkSave(res))); + } + + public transMassTalkDownload( + req: TransMassTalkDownloadRequest + ): Observable { + return this.httpClient + .post( + this.moduleConfig.urls.transMassTalkDownload, + {}, + { + params: encodeTransMassTalkDownload(req) + } + ) + .pipe(map(res => decodeTransMassTalkDownload(res))); + } + + public transMassTalkSave( + req: TransMassTalkSaveRequest + ): Observable { + return this.httpClient + .post( + this.moduleConfig.urls.transMassTalkSave, + {}, + { + params: encodeTransMassTalkSave(req) + } + ) + .pipe(map(res => decodeTransMassTalkSave(res))); + } + + public translationReq( + req: TranslationReqRequest + ): Observable { + return this.httpClient + .post( + this.moduleConfig.urls.translationReq, + {}, + { + params: encodeTranslationReq(req) + } + ) + .pipe(map(res => decodeTranslationReq(res))); + } + + public translationSave( + req: TranslationSaveRequest + ): Observable { + return this.httpClient + .post( + this.moduleConfig.urls.translationSave, + {}, + { + params: encodeTranslationSave(req) + } + ) + .pipe(map(res => decodeTranslationSave(res))); + } +} diff --git a/projects/ucap-webmessenger-api-common/src/lib/types/module-config.ts b/projects/ucap-webmessenger-api-common/src/lib/types/module-config.ts new file mode 100644 index 0000000..8728921 --- /dev/null +++ b/projects/ucap-webmessenger-api-common/src/lib/types/module-config.ts @@ -0,0 +1,15 @@ +export interface ModuleConfig { + urls: { + fileProfileSave: string; + fileTalkDownload: string; + fileTalkSave: string; + fileTalkShare: string; + massTalkDownload: string; + massTalkSave: string; + transMassTalkDownload: string; + transMassTalkSave: string; + translationReq: string; + translationSave: string; + }; + acceptableFileExtensions: string[]; +} diff --git a/projects/ucap-webmessenger-api-common/src/lib/types/token.ts b/projects/ucap-webmessenger-api-common/src/lib/types/token.ts new file mode 100644 index 0000000..ca491bd --- /dev/null +++ b/projects/ucap-webmessenger-api-common/src/lib/types/token.ts @@ -0,0 +1,5 @@ +import { InjectionToken } from '@angular/core'; + +export const _MODULE_CONFIG = new InjectionToken( + '@ucap-webmessenger/api-common config of module' +); diff --git a/projects/ucap-webmessenger-api-common/src/lib/ucap-common-api.module.ts b/projects/ucap-webmessenger-api-common/src/lib/ucap-common-api.module.ts new file mode 100644 index 0000000..3e3baff --- /dev/null +++ b/projects/ucap-webmessenger-api-common/src/lib/ucap-common-api.module.ts @@ -0,0 +1,23 @@ +import { NgModule, ModuleWithProviders } from '@angular/core'; +import { _MODULE_CONFIG } from './types/token'; + +import { CommonApiService } from './services/common-api.service'; +import { ModuleConfig } from './types/module-config'; + +const SERVICES = [CommonApiService]; + +@NgModule({ + declarations: [], + imports: [], + exports: [] +}) +export class UCapCommonApiModule { + public static forRoot( + config: ModuleConfig + ): ModuleWithProviders { + return { + ngModule: UCapCommonApiModule, + providers: [{ provide: _MODULE_CONFIG, useValue: config }, ...SERVICES] + }; + } +} diff --git a/projects/ucap-webmessenger-api-common/src/public-api.ts b/projects/ucap-webmessenger-api-common/src/public-api.ts new file mode 100644 index 0000000..0a47d28 --- /dev/null +++ b/projects/ucap-webmessenger-api-common/src/public-api.ts @@ -0,0 +1,23 @@ +/* + * Public API Surface of ucap-webmessenger-api-common + */ + +export * from './lib/types/module-config'; + +export * from './lib/apis/file-profile-save'; +export * from './lib/apis/file-talk-download'; +export * from './lib/apis/file-talk-save'; +export * from './lib/apis/file-talk-share'; +export * from './lib/apis/mass-talk-download'; +export * from './lib/apis/mass-talk-save'; +export * from './lib/apis/trans-mass-talk-download'; +export * from './lib/apis/trans-mass-talk-save'; +export * from './lib/apis/translation-req'; +export * from './lib/apis/translation-save'; + +export * from './lib/models/file-download-item'; +export * from './lib/models/file-upload-item'; + +export * from './lib/services/common-api.service'; + +export * from './lib/ucap-common-api.module'; diff --git a/projects/ucap-webmessenger-api-common/src/test.ts b/projects/ucap-webmessenger-api-common/src/test.ts new file mode 100644 index 0000000..978c64f --- /dev/null +++ b/projects/ucap-webmessenger-api-common/src/test.ts @@ -0,0 +1,21 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/dist/zone'; +import 'zone.js/dist/zone-testing'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +declare const require: any; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() +); +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); diff --git a/projects/ucap-webmessenger-api-common/tsconfig.lib.json b/projects/ucap-webmessenger-api-common/tsconfig.lib.json new file mode 100644 index 0000000..bd23948 --- /dev/null +++ b/projects/ucap-webmessenger-api-common/tsconfig.lib.json @@ -0,0 +1,26 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/lib", + "target": "es2015", + "declaration": true, + "inlineSources": true, + "types": [], + "lib": [ + "dom", + "es2018" + ] + }, + "angularCompilerOptions": { + "annotateForClosureCompiler": true, + "skipTemplateCodegen": true, + "strictMetadataEmit": true, + "fullTemplateTypeCheck": true, + "strictInjectionParameters": true, + "enableResourceInlining": true + }, + "exclude": [ + "src/test.ts", + "**/*.spec.ts" + ] +} diff --git a/projects/ucap-webmessenger-api-common/tsconfig.spec.json b/projects/ucap-webmessenger-api-common/tsconfig.spec.json new file mode 100644 index 0000000..16da33d --- /dev/null +++ b/projects/ucap-webmessenger-api-common/tsconfig.spec.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/spec", + "types": [ + "jasmine", + "node" + ] + }, + "files": [ + "src/test.ts" + ], + "include": [ + "**/*.spec.ts", + "**/*.d.ts" + ] +} diff --git a/projects/ucap-webmessenger-api-common/tslint.json b/projects/ucap-webmessenger-api-common/tslint.json new file mode 100644 index 0000000..78122a8 --- /dev/null +++ b/projects/ucap-webmessenger-api-common/tslint.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tslint.json", + "rules": { + "directive-selector": [ + true, + "attribute", + "ucapApiCommon", + "camelCase" + ], + "component-selector": [ + true, + "element", + "ucap-api-common", + "kebab-case" + ] + } +} diff --git a/projects/ucap-webmessenger-api-external/README.md b/projects/ucap-webmessenger-api-external/README.md new file mode 100644 index 0000000..b42ab63 --- /dev/null +++ b/projects/ucap-webmessenger-api-external/README.md @@ -0,0 +1,24 @@ +# UcapWebmessengerApiExternal + +This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.2.4. + +## Code scaffolding + +Run `ng generate component component-name --project ucap-webmessenger-api-external` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project ucap-webmessenger-api-external`. +> Note: Don't forget to add `--project ucap-webmessenger-api-external` or else it will be added to the default project in your `angular.json` file. + +## Build + +Run `ng build ucap-webmessenger-api-external` to build the project. The build artifacts will be stored in the `dist/` directory. + +## Publishing + +After building your library with `ng build ucap-webmessenger-api-external`, go to the dist folder `cd dist/ucap-webmessenger-api-external` and run `npm publish`. + +## Running unit tests + +Run `ng test ucap-webmessenger-api-external` to execute the unit tests via [Karma](https://karma-runner.github.io). + +## Further help + +To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). diff --git a/projects/ucap-webmessenger-api-external/karma.conf.js b/projects/ucap-webmessenger-api-external/karma.conf.js new file mode 100644 index 0000000..0ab2363 --- /dev/null +++ b/projects/ucap-webmessenger-api-external/karma.conf.js @@ -0,0 +1,32 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage-istanbul-reporter'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + coverageIstanbulReporter: { + dir: require('path').join(__dirname, '../../coverage/ucap-webmessenger-api-external'), + reports: ['html', 'lcovonly', 'text-summary'], + fixWebpackSourcePaths: true + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false, + restartOnFileChange: true + }); +}; diff --git a/projects/ucap-webmessenger-api-external/ng-package.json b/projects/ucap-webmessenger-api-external/ng-package.json new file mode 100644 index 0000000..a356309 --- /dev/null +++ b/projects/ucap-webmessenger-api-external/ng-package.json @@ -0,0 +1,7 @@ +{ + "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../../dist/ucap-webmessenger-api-external", + "lib": { + "entryFile": "src/public-api.ts" + } +} \ No newline at end of file diff --git a/projects/ucap-webmessenger-api-external/package.json b/projects/ucap-webmessenger-api-external/package.json new file mode 100644 index 0000000..67da022 --- /dev/null +++ b/projects/ucap-webmessenger-api-external/package.json @@ -0,0 +1,8 @@ +{ + "name": "@ucap-webmessenger/api-external", + "version": "0.0.1", + "peerDependencies": { + "@angular/common": "^8.2.4", + "@angular/core": "^8.2.4" + } +} diff --git a/projects/ucap-webmessenger-api-external/src/lib/apis/check-user-info-ex.ts b/projects/ucap-webmessenger-api-external/src/lib/apis/check-user-info-ex.ts new file mode 100644 index 0000000..fea972d --- /dev/null +++ b/projects/ucap-webmessenger-api-external/src/lib/apis/check-user-info-ex.ts @@ -0,0 +1,39 @@ +import { + APIRequest, + APIResponse, + APIEncoder, + APIDecoder, + ParameterUtil +} from '@ucap-webmessenger/api'; + +export interface CheckUserInfoExRequest extends APIRequest { + userId: string; + companyCode: string; + userSession: string; +} + +export interface CheckUserInfoExResponse extends APIResponse { + userId?: string; +} + +const checkUserInfoExEncodeMap = { + userId: 'p_user_id', + companyCode: 'p_comp_code', + userSession: 'p_user_session' +}; + +export const encodeCheckUserInfoEx: APIEncoder = ( + req: CheckUserInfoExRequest +) => { + return ParameterUtil.encode(checkUserInfoExEncodeMap, req); +}; + +export const decodeCheckUserInfoEx: APIDecoder = ( + res: any +) => { + return { + statusCode: res.StatusCode, + errorMessage: res.ErrorMessage, + userId: res.UserID + } as CheckUserInfoExResponse; +}; diff --git a/projects/ucap-webmessenger-api-external/src/lib/apis/company-list.ts b/projects/ucap-webmessenger-api-external/src/lib/apis/company-list.ts new file mode 100644 index 0000000..626e40b --- /dev/null +++ b/projects/ucap-webmessenger-api-external/src/lib/apis/company-list.ts @@ -0,0 +1,64 @@ +import { AppType, DeviceType } from '@ucap-webmessenger/core'; +import { + APIRequest, + APIResponse, + APIEncoder, + APIDecoder, + ParameterUtil +} from '@ucap-webmessenger/api'; +import { Company } from '../models/company'; + +export interface CompanyListRequest extends APIRequest { + userSeq?: number; + appType?: AppType; + deviceType?: DeviceType; + token?: string; + companyGroupCode: string; +} + +export interface CompanyListResponse extends APIResponse { + companyList?: Company[]; +} + +const companyListEncodeMap = { + userSeq: 'p_user_seq', + appType: 'p_app_type', + deviceType: 'p_device_type', + token: 'p_token', + companyGroupCode: 'p_comp_group_code' +}; + +export const encodeCompanyList: APIEncoder = ( + req: CompanyListRequest +) => { + const extraParams: any = {}; + + extraParams.userSeq = String(req.userSeq); + + return ParameterUtil.encode(companyListEncodeMap, req, extraParams); +}; + +export const decodeCompanyList: APIDecoder = ( + res: any +) => { + let companyList: Company[] | undefined; + if (!!res.CompanyList) { + companyList = []; + for (const company of res.CompanyList) { + companyList.push({ + companyCode: company.COMPANY_CODE, + companyName: company.COMPANY_NAME, + companyDomain: company.COMPANY_DOMAIN, + companyConfAuthYn: company.COMPANY_CONF_AUTH, + ucapUseYn: company.UCAP_USE_YN, + companyTimerChatAuthYn: company.COMPANY_TIMER_CHAT_AUTH + }); + } + } + + return { + statusCode: res.StatusCode, + errorMessage: res.ErrorMessage, + companyList + } as CompanyListResponse; +}; diff --git a/projects/ucap-webmessenger-api-external/src/lib/apis/token-update.ts b/projects/ucap-webmessenger-api-external/src/lib/apis/token-update.ts new file mode 100644 index 0000000..4bce81e --- /dev/null +++ b/projects/ucap-webmessenger-api-external/src/lib/apis/token-update.ts @@ -0,0 +1,43 @@ +import { DeviceType, PushType } from '@ucap-webmessenger/core'; +import { + APIRequest, + APIResponse, + APIEncoder, + APIDecoder, + ParameterUtil +} from '@ucap-webmessenger/api'; + +export interface TokenUpdateRequest extends APIRequest { + userSeq: number; + deviceType: DeviceType; + token: string; + mobilePid?: string; + pushType?: PushType; +} + +// tslint:disable-next-line: no-empty-interface +export interface TokenUpdateResponse extends APIResponse {} + +const tokenUpdateEncodeMap = { + userSeq: 'p_user_seq', + deviceType: 'p_device_type', + token: 'p_token', + mobilePid: 'p_mobile_pid', + pushType: 'p_push_type' +}; + +export const encodeTokenUpdate: APIEncoder = ( + req: TokenUpdateRequest +) => { + const extraParams: any = {}; + + extraParams.userSeq = String(req.userSeq); + + return ParameterUtil.encode(tokenUpdateEncodeMap, req, extraParams); +}; + +export const decodeTokenUpdate: APIDecoder = ( + res: any +) => { + return {} as TokenUpdateResponse; +}; diff --git a/projects/ucap-webmessenger-api-external/src/lib/apis/url-info.ts b/projects/ucap-webmessenger-api-external/src/lib/apis/url-info.ts new file mode 100644 index 0000000..55b0555 --- /dev/null +++ b/projects/ucap-webmessenger-api-external/src/lib/apis/url-info.ts @@ -0,0 +1,56 @@ +import { DeviceType } from '@ucap-webmessenger/core'; +import { + APIRequest, + APIResponse, + APIEncoder, + APIDecoder, + ParameterUtil +} from '@ucap-webmessenger/api'; + +export interface UrlInfoRequest extends APIRequest { + deviceType: DeviceType; +} + +export interface UrlInfoResponse extends APIResponse { + portCheckUrl?: string; + messageUrl?: string; + messageUrl2?: string; + passwordUrl?: string; + planUrl?: string; + planUrl2?: string; + vocUrl?: string; + confUrl?: string; + uprApiUrl?: string; + uprSvcUrl?: string; + uprDownloadUrl?: string; + synapViewUrl?: string; +} + +const urlInfoEncodeMap = { + deviceType: 'p_device_type' +}; + +export const encodeUrlInfo: APIEncoder = ( + req: UrlInfoRequest +) => { + return ParameterUtil.encode(urlInfoEncodeMap, req); +}; + +export const decodeUrlInfo: APIDecoder = (res: any) => { + return { + statusCode: res.StatusCode, + errorMessage: res.ErrorMessage, + portCheckUrl: res.PortCheckURL, + messageUrl: res.MsgURL, + messageUrl2: res.MsgURL2, + passwordUrl: res.PasswordURL, + planUrl: res.PlanURL, + planUrl2: res.PlanURL2, + vocUrl: res.VocURL, + confUrl: res.ConfURL, + uprApiUrl: res.UprApiURL, + uprSvcUrl: res.UprSvcURL, + uprDownloadUrl: res.UprDownloadURL, + synapViewUrl: res.SynapViewURL + } as UrlInfoResponse; +}; diff --git a/projects/ucap-webmessenger-api-external/src/lib/models/company.ts b/projects/ucap-webmessenger-api-external/src/lib/models/company.ts new file mode 100644 index 0000000..fcc5e93 --- /dev/null +++ b/projects/ucap-webmessenger-api-external/src/lib/models/company.ts @@ -0,0 +1,8 @@ +export interface Company { + companyCode?: string; + companyName?: string; + companyDomain?: string; + companyConfAuthYn?: string; + ucapUseYn?: string; + companyTimerChatAuthYn?: string; +} diff --git a/projects/ucap-webmessenger-api-external/src/lib/services/external-api.service.spec.ts b/projects/ucap-webmessenger-api-external/src/lib/services/external-api.service.spec.ts new file mode 100644 index 0000000..3cd4cdf --- /dev/null +++ b/projects/ucap-webmessenger-api-external/src/lib/services/external-api.service.spec.ts @@ -0,0 +1,12 @@ +import { TestBed } from '@angular/core/testing'; + +import { ExternalApiService } from './external-api.service'; + +describe('ExternalApiService', () => { + beforeEach(() => TestBed.configureTestingModule({})); + + it('should be created', () => { + const service: ExternalApiService = TestBed.get(ExternalApiService); + expect(service).toBeTruthy(); + }); +}); diff --git a/projects/ucap-webmessenger-api-external/src/lib/services/external-api.service.ts b/projects/ucap-webmessenger-api-external/src/lib/services/external-api.service.ts new file mode 100644 index 0000000..a4730ad --- /dev/null +++ b/projects/ucap-webmessenger-api-external/src/lib/services/external-api.service.ts @@ -0,0 +1,92 @@ +import { Injectable, Inject } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; + +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; + +import { _MODULE_CONFIG } from '../types/token'; +import { ModuleConfig } from '../types/module-config'; +import { + CheckUserInfoExRequest, + CheckUserInfoExResponse, + encodeCheckUserInfoEx, + decodeCheckUserInfoEx +} from '../apis/check-user-info-ex'; +import { + CompanyListRequest, + CompanyListResponse, + encodeCompanyList, + decodeCompanyList +} from '../apis/company-list'; +import { + TokenUpdateRequest, + TokenUpdateResponse, + encodeTokenUpdate, + decodeTokenUpdate +} from '../apis/token-update'; +import { + UrlInfoResponse, + UrlInfoRequest, + encodeUrlInfo, + decodeUrlInfo +} from '../apis/url-info'; + +@Injectable({ + providedIn: 'root' +}) +export class ExternalApiService { + constructor( + @Inject(_MODULE_CONFIG) private moduleConfig: ModuleConfig, + private httpClient: HttpClient + ) {} + + public checkUserInfoEx( + req: CheckUserInfoExRequest + ): Observable { + return this.httpClient + .post( + this.moduleConfig.urls.checkUserInfoEx, + {}, + { + params: encodeCheckUserInfoEx(req) + } + ) + .pipe(map(res => decodeCheckUserInfoEx(res))); + } + + public companyList(req: CompanyListRequest): Observable { + return this.httpClient + .post( + this.moduleConfig.urls.companyList, + {}, + { + params: encodeCompanyList(req) + } + ) + .pipe(map(res => decodeCompanyList(res))); + } + + public tokenUpdate(req: TokenUpdateRequest): Observable { + return this.httpClient + .post( + this.moduleConfig.urls.tokenUpdate, + {}, + { + params: encodeTokenUpdate(req) + } + ) + .pipe(map(res => decodeTokenUpdate(res))); + } + + public urlInfo(req: UrlInfoRequest): Observable { + return this.httpClient + .post( + this.moduleConfig.urls.urlInfo, + {}, + { + params: encodeUrlInfo(req) + } + ) + .pipe(map(res => decodeUrlInfo(res))); + } +} diff --git a/projects/ucap-webmessenger-api-external/src/lib/types/module-config.ts b/projects/ucap-webmessenger-api-external/src/lib/types/module-config.ts new file mode 100644 index 0000000..6b3b036 --- /dev/null +++ b/projects/ucap-webmessenger-api-external/src/lib/types/module-config.ts @@ -0,0 +1,8 @@ +export interface ModuleConfig { + urls: { + checkUserInfoEx: string; + companyList: string; + tokenUpdate: string; + urlInfo: string; + }; +} diff --git a/projects/ucap-webmessenger-api-external/src/lib/types/token.ts b/projects/ucap-webmessenger-api-external/src/lib/types/token.ts new file mode 100644 index 0000000..5b5041b --- /dev/null +++ b/projects/ucap-webmessenger-api-external/src/lib/types/token.ts @@ -0,0 +1,5 @@ +import { InjectionToken } from '@angular/core'; + +export const _MODULE_CONFIG = new InjectionToken( + '@ucap-webmessenger/api-external config of module' +); diff --git a/projects/ucap-webmessenger-api-external/src/lib/ucap-external-api.module.ts b/projects/ucap-webmessenger-api-external/src/lib/ucap-external-api.module.ts new file mode 100644 index 0000000..c21dada --- /dev/null +++ b/projects/ucap-webmessenger-api-external/src/lib/ucap-external-api.module.ts @@ -0,0 +1,23 @@ +import { NgModule, ModuleWithProviders } from '@angular/core'; +import { _MODULE_CONFIG } from './types/token'; + +import { ExternalApiService } from './services/external-api.service'; +import { ModuleConfig } from './types/module-config'; + +const SERVICES = [ExternalApiService]; + +@NgModule({ + declarations: [], + imports: [], + exports: [] +}) +export class UCapExternalApiModule { + public static forRoot( + config: ModuleConfig + ): ModuleWithProviders { + return { + ngModule: UCapExternalApiModule, + providers: [{ provide: _MODULE_CONFIG, useValue: config }, ...SERVICES] + }; + } +} diff --git a/projects/ucap-webmessenger-api-external/src/public-api.ts b/projects/ucap-webmessenger-api-external/src/public-api.ts new file mode 100644 index 0000000..b9a5d5a --- /dev/null +++ b/projects/ucap-webmessenger-api-external/src/public-api.ts @@ -0,0 +1,16 @@ +/* + * Public API Surface of ucap-webmessenger-api-public + */ + +export * from './lib/types/module-config'; + +export * from './lib/models/company'; + +export * from './lib/apis/check-user-info-ex'; +export * from './lib/apis/company-list'; +export * from './lib/apis/token-update'; +export * from './lib/apis/url-info'; + +export * from './lib/services/external-api.service'; + +export * from './lib/ucap-external-api.module'; diff --git a/projects/ucap-webmessenger-api-external/src/test.ts b/projects/ucap-webmessenger-api-external/src/test.ts new file mode 100644 index 0000000..978c64f --- /dev/null +++ b/projects/ucap-webmessenger-api-external/src/test.ts @@ -0,0 +1,21 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/dist/zone'; +import 'zone.js/dist/zone-testing'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +declare const require: any; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() +); +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); diff --git a/projects/ucap-webmessenger-api-external/tsconfig.lib.json b/projects/ucap-webmessenger-api-external/tsconfig.lib.json new file mode 100644 index 0000000..bd23948 --- /dev/null +++ b/projects/ucap-webmessenger-api-external/tsconfig.lib.json @@ -0,0 +1,26 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/lib", + "target": "es2015", + "declaration": true, + "inlineSources": true, + "types": [], + "lib": [ + "dom", + "es2018" + ] + }, + "angularCompilerOptions": { + "annotateForClosureCompiler": true, + "skipTemplateCodegen": true, + "strictMetadataEmit": true, + "fullTemplateTypeCheck": true, + "strictInjectionParameters": true, + "enableResourceInlining": true + }, + "exclude": [ + "src/test.ts", + "**/*.spec.ts" + ] +} diff --git a/projects/ucap-webmessenger-api-external/tsconfig.spec.json b/projects/ucap-webmessenger-api-external/tsconfig.spec.json new file mode 100644 index 0000000..16da33d --- /dev/null +++ b/projects/ucap-webmessenger-api-external/tsconfig.spec.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/spec", + "types": [ + "jasmine", + "node" + ] + }, + "files": [ + "src/test.ts" + ], + "include": [ + "**/*.spec.ts", + "**/*.d.ts" + ] +} diff --git a/projects/ucap-webmessenger-api-external/tslint.json b/projects/ucap-webmessenger-api-external/tslint.json new file mode 100644 index 0000000..736e706 --- /dev/null +++ b/projects/ucap-webmessenger-api-external/tslint.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tslint.json", + "rules": { + "directive-selector": [ + true, + "attribute", + "ucapApiExternal", + "camelCase" + ], + "component-selector": [ + true, + "element", + "ucap-api-external", + "kebab-case" + ] + } +} diff --git a/projects/ucap-webmessenger-api-public/README.md b/projects/ucap-webmessenger-api-public/README.md new file mode 100644 index 0000000..74befe5 --- /dev/null +++ b/projects/ucap-webmessenger-api-public/README.md @@ -0,0 +1,24 @@ +# UcapWebmessengerApiPublic + +This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.2.4. + +## Code scaffolding + +Run `ng generate component component-name --project ucap-webmessenger-api-public` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project ucap-webmessenger-api-public`. +> Note: Don't forget to add `--project ucap-webmessenger-api-public` or else it will be added to the default project in your `angular.json` file. + +## Build + +Run `ng build ucap-webmessenger-api-public` to build the project. The build artifacts will be stored in the `dist/` directory. + +## Publishing + +After building your library with `ng build ucap-webmessenger-api-public`, go to the dist folder `cd dist/ucap-webmessenger-api-public` and run `npm publish`. + +## Running unit tests + +Run `ng test ucap-webmessenger-api-public` to execute the unit tests via [Karma](https://karma-runner.github.io). + +## Further help + +To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). diff --git a/projects/ucap-webmessenger-api-public/karma.conf.js b/projects/ucap-webmessenger-api-public/karma.conf.js new file mode 100644 index 0000000..2623a34 --- /dev/null +++ b/projects/ucap-webmessenger-api-public/karma.conf.js @@ -0,0 +1,32 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage-istanbul-reporter'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + coverageIstanbulReporter: { + dir: require('path').join(__dirname, '../../coverage/ucap-webmessenger-api-public'), + reports: ['html', 'lcovonly', 'text-summary'], + fixWebpackSourcePaths: true + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false, + restartOnFileChange: true + }); +}; diff --git a/projects/ucap-webmessenger-api-public/ng-package.json b/projects/ucap-webmessenger-api-public/ng-package.json new file mode 100644 index 0000000..1d9c0df --- /dev/null +++ b/projects/ucap-webmessenger-api-public/ng-package.json @@ -0,0 +1,7 @@ +{ + "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../../dist/ucap-webmessenger-api-public", + "lib": { + "entryFile": "src/public-api.ts" + } +} \ No newline at end of file diff --git a/projects/ucap-webmessenger-api-public/package.json b/projects/ucap-webmessenger-api-public/package.json new file mode 100644 index 0000000..8e5f98b --- /dev/null +++ b/projects/ucap-webmessenger-api-public/package.json @@ -0,0 +1,8 @@ +{ + "name": "@ucap-webmessenger/api-public", + "version": "0.0.1", + "peerDependencies": { + "@angular/common": "^8.2.4", + "@angular/core": "^8.2.4" + } +} diff --git a/projects/ucap-webmessenger-api-public/src/lib/apis/update-info.ts b/projects/ucap-webmessenger-api-public/src/lib/apis/update-info.ts new file mode 100644 index 0000000..37bd0a9 --- /dev/null +++ b/projects/ucap-webmessenger-api-public/src/lib/apis/update-info.ts @@ -0,0 +1,40 @@ +import { DeviceType } from '@ucap-webmessenger/core'; +import { + APIRequest, + APIResponse, + APIEncoder, + APIDecoder, + ParameterUtil +} from '@ucap-webmessenger/api'; + +export interface UpdateInfoRequest extends APIRequest { + deviceType: DeviceType; +} + +export interface UpdateInfoResponse extends APIResponse { + appVersion?: string; + installUrl?: string; + launcherAppVersion?: string; + launcherInstallUrl?: string; +} + +const updateInfoEncodeMap = { + deviceType: 'p_device_type' +}; + +export const encodeUpdateInfo: APIEncoder = ( + req: UpdateInfoRequest +) => { + return ParameterUtil.encode(updateInfoEncodeMap, req); +}; + +export const decodeUpdateInfo: APIDecoder = (res: any) => { + return { + statusCode: res.StatusCode, + errorMessage: res.ErrorMessage, + appVersion: res.AppVer, + installUrl: res.InstallURL, + launcherAppVersion: res.LauncherAppVer, + launcherInstallUrl: res.LauncherInstallURL + } as UpdateInfoResponse; +}; diff --git a/projects/ucap-webmessenger-api-public/src/lib/apis/version-info2.ts b/projects/ucap-webmessenger-api-public/src/lib/apis/version-info2.ts new file mode 100644 index 0000000..d5c0e31 --- /dev/null +++ b/projects/ucap-webmessenger-api-public/src/lib/apis/version-info2.ts @@ -0,0 +1,73 @@ +import { DeviceType } from '@ucap-webmessenger/core'; +import { + APIRequest, + APIResponse, + APIEncoder, + APIDecoder, + ParameterUtil +} from '@ucap-webmessenger/api'; +import { SyncMode } from '../types/sync-mode.type'; + +export interface VersionInfo2Request extends APIRequest { + userSeq?: number; + deviceType: DeviceType; + token?: string; + companyGroupType: string; + companyCode: string; + loginId: string; +} + +export interface VersionInfo2Response extends APIResponse { + protocolCode?: number; + syncMode?: SyncMode; + appVersion?: string; + installUrl?: string; + serverIp?: string; + uploadUrl?: string; + downloadUrl?: string; + profileUploadUrl?: string; + profileRoot?: string; + fileTerm?: number; + fileAllowSize?: number; + authIp?: boolean; + launcherAppVersion?: string; + launcherInstallUrl?: string; +} + +const versionInfo2EncodeMap = { + userSeq: 'p_user_seq', + deviceType: 'p_device_type', + token: 'p_token', + companyGroupType: 'p_comp_group_type', + companyCode: 'p_comp_code', + loginId: 'p_login_id' +}; + +export const encodeVersionInfo2: APIEncoder = ( + req: VersionInfo2Request +) => { + return ParameterUtil.encode(versionInfo2EncodeMap, req); +}; + +export const decodeVersionInfo2: APIDecoder = ( + res: any +) => { + return { + statusCode: res.StatusCode, + errorMessage: res.ErrorMessage, + appVersion: res.AppVer, + authIp: res.AuthIP === 'Y' ? true : false, + downloadUrl: res.DownloadURL, + fileAllowSize: Number(res.FileAllowSize), + fileTerm: Number(res.FileTerm), + installUrl: res.InstallURL, + launcherAppVersion: res.LauncherAppVer, + launcherInstallUrl: res.LauncherInstallURL, + profileRoot: res.ProfileRoot, + profileUploadUrl: res.ProfileUploadURL, + protocolCode: Number(res.ProtocolCD), + serverIp: res.ServerIP, + syncMode: res.SyncMode as SyncMode, + uploadUrl: res.UploadURL + } as VersionInfo2Response; +}; diff --git a/projects/ucap-webmessenger-api-public/src/lib/services/public-api.service.spec.ts b/projects/ucap-webmessenger-api-public/src/lib/services/public-api.service.spec.ts new file mode 100644 index 0000000..06dc832 --- /dev/null +++ b/projects/ucap-webmessenger-api-public/src/lib/services/public-api.service.spec.ts @@ -0,0 +1,12 @@ +import { TestBed } from '@angular/core/testing'; + +import { PublicApiService } from './public-api.service'; + +describe('PublicApiService', () => { + beforeEach(() => TestBed.configureTestingModule({})); + + it('should be created', () => { + const service: PublicApiService = TestBed.get(PublicApiService); + expect(service).toBeTruthy(); + }); +}); diff --git a/projects/ucap-webmessenger-api-public/src/lib/services/public-api.service.ts b/projects/ucap-webmessenger-api-public/src/lib/services/public-api.service.ts new file mode 100644 index 0000000..d3dd1f9 --- /dev/null +++ b/projects/ucap-webmessenger-api-public/src/lib/services/public-api.service.ts @@ -0,0 +1,56 @@ +import { Injectable, Inject } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; + +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; + +import { _MODULE_CONFIG } from '../types/token'; +import { + VersionInfo2Request, + VersionInfo2Response, + encodeVersionInfo2, + decodeVersionInfo2 +} from '../apis/version-info2'; +import { + UpdateInfoRequest, + UpdateInfoResponse, + encodeUpdateInfo, + decodeUpdateInfo +} from '../apis/update-info'; +import { ModuleConfig } from '../types/module-config'; + +@Injectable({ + providedIn: 'root' +}) +export class PublicApiService { + constructor( + @Inject(_MODULE_CONFIG) private moduleConfig: ModuleConfig, + private httpClient: HttpClient + ) {} + + public versionInfo2( + req: VersionInfo2Request + ): Observable { + return this.httpClient + .post( + this.moduleConfig.urls.versionInfo2, + {}, + { + params: encodeVersionInfo2(req) + } + ) + .pipe(map((res: any) => decodeVersionInfo2(res))); + } + + public updateInfo(req: UpdateInfoRequest): Observable { + return this.httpClient + .post( + this.moduleConfig.urls.updateInfo, + {}, + { + params: encodeUpdateInfo(req) + } + ) + .pipe(map(res => decodeUpdateInfo(res))); + } +} diff --git a/projects/ucap-webmessenger-api-public/src/lib/types/module-config.ts b/projects/ucap-webmessenger-api-public/src/lib/types/module-config.ts new file mode 100644 index 0000000..4ed6691 --- /dev/null +++ b/projects/ucap-webmessenger-api-public/src/lib/types/module-config.ts @@ -0,0 +1,6 @@ +export interface ModuleConfig { + urls: { + versionInfo2: string; + updateInfo: string; + }; +} diff --git a/projects/ucap-webmessenger-api-public/src/lib/types/sync-mode.type.ts b/projects/ucap-webmessenger-api-public/src/lib/types/sync-mode.type.ts new file mode 100644 index 0000000..856a7a2 --- /dev/null +++ b/projects/ucap-webmessenger-api-public/src/lib/types/sync-mode.type.ts @@ -0,0 +1,4 @@ +export enum SyncMode { + BC = 'BC', + SC = 'SC' +} diff --git a/projects/ucap-webmessenger-api-public/src/lib/types/token.ts b/projects/ucap-webmessenger-api-public/src/lib/types/token.ts new file mode 100644 index 0000000..a3431c2 --- /dev/null +++ b/projects/ucap-webmessenger-api-public/src/lib/types/token.ts @@ -0,0 +1,5 @@ +import { InjectionToken } from '@angular/core'; + +export const _MODULE_CONFIG = new InjectionToken( + '@ucap-webmessenger/api-public config of module' +); diff --git a/projects/ucap-webmessenger-api-public/src/lib/ucap-public-api.module.ts b/projects/ucap-webmessenger-api-public/src/lib/ucap-public-api.module.ts new file mode 100644 index 0000000..3424d78 --- /dev/null +++ b/projects/ucap-webmessenger-api-public/src/lib/ucap-public-api.module.ts @@ -0,0 +1,23 @@ +import { NgModule, ModuleWithProviders } from '@angular/core'; +import { _MODULE_CONFIG } from './types/token'; + +import { PublicApiService } from './services/public-api.service'; +import { ModuleConfig } from './types/module-config'; + +const SERVICES = [PublicApiService]; + +@NgModule({ + declarations: [], + imports: [], + exports: [] +}) +export class UCapPublicApiModule { + public static forRoot( + config: ModuleConfig + ): ModuleWithProviders { + return { + ngModule: UCapPublicApiModule, + providers: [{ provide: _MODULE_CONFIG, useValue: config }, ...SERVICES] + }; + } +} diff --git a/projects/ucap-webmessenger-api-public/src/public-api.ts b/projects/ucap-webmessenger-api-public/src/public-api.ts new file mode 100644 index 0000000..eb7db5e --- /dev/null +++ b/projects/ucap-webmessenger-api-public/src/public-api.ts @@ -0,0 +1,13 @@ +/* + * Public API Surface of ucap-webmessenger-api-public + */ + +export * from './lib/apis/update-info'; +export * from './lib/apis/version-info2'; + +export * from './lib/services/public-api.service'; + +export * from './lib/types/module-config'; +export * from './lib/types/sync-mode.type'; + +export * from './lib/ucap-public-api.module'; diff --git a/projects/ucap-webmessenger-api-public/src/test.ts b/projects/ucap-webmessenger-api-public/src/test.ts new file mode 100644 index 0000000..978c64f --- /dev/null +++ b/projects/ucap-webmessenger-api-public/src/test.ts @@ -0,0 +1,21 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/dist/zone'; +import 'zone.js/dist/zone-testing'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +declare const require: any; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() +); +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); diff --git a/projects/ucap-webmessenger-api-public/tsconfig.lib.json b/projects/ucap-webmessenger-api-public/tsconfig.lib.json new file mode 100644 index 0000000..bd23948 --- /dev/null +++ b/projects/ucap-webmessenger-api-public/tsconfig.lib.json @@ -0,0 +1,26 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/lib", + "target": "es2015", + "declaration": true, + "inlineSources": true, + "types": [], + "lib": [ + "dom", + "es2018" + ] + }, + "angularCompilerOptions": { + "annotateForClosureCompiler": true, + "skipTemplateCodegen": true, + "strictMetadataEmit": true, + "fullTemplateTypeCheck": true, + "strictInjectionParameters": true, + "enableResourceInlining": true + }, + "exclude": [ + "src/test.ts", + "**/*.spec.ts" + ] +} diff --git a/projects/ucap-webmessenger-api-public/tsconfig.spec.json b/projects/ucap-webmessenger-api-public/tsconfig.spec.json new file mode 100644 index 0000000..16da33d --- /dev/null +++ b/projects/ucap-webmessenger-api-public/tsconfig.spec.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/spec", + "types": [ + "jasmine", + "node" + ] + }, + "files": [ + "src/test.ts" + ], + "include": [ + "**/*.spec.ts", + "**/*.d.ts" + ] +} diff --git a/projects/ucap-webmessenger-api-public/tslint.json b/projects/ucap-webmessenger-api-public/tslint.json new file mode 100644 index 0000000..3fa42f2 --- /dev/null +++ b/projects/ucap-webmessenger-api-public/tslint.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tslint.json", + "rules": { + "directive-selector": [ + true, + "attribute", + "ucapApiPublic", + "camelCase" + ], + "component-selector": [ + true, + "element", + "ucap-api-public", + "kebab-case" + ] + } +} diff --git a/projects/ucap-webmessenger-api/README.md b/projects/ucap-webmessenger-api/README.md new file mode 100644 index 0000000..6f5aab3 --- /dev/null +++ b/projects/ucap-webmessenger-api/README.md @@ -0,0 +1,24 @@ +# UcapWebmessengerApi + +This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.2.4. + +## Code scaffolding + +Run `ng generate component component-name --project ucap-webmessenger-api` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project ucap-webmessenger-api`. +> Note: Don't forget to add `--project ucap-webmessenger-api` or else it will be added to the default project in your `angular.json` file. + +## Build + +Run `ng build ucap-webmessenger-api` to build the project. The build artifacts will be stored in the `dist/` directory. + +## Publishing + +After building your library with `ng build ucap-webmessenger-api`, go to the dist folder `cd dist/ucap-webmessenger-api` and run `npm publish`. + +## Running unit tests + +Run `ng test ucap-webmessenger-api` to execute the unit tests via [Karma](https://karma-runner.github.io). + +## Further help + +To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). diff --git a/projects/ucap-webmessenger-api/karma.conf.js b/projects/ucap-webmessenger-api/karma.conf.js new file mode 100644 index 0000000..2835029 --- /dev/null +++ b/projects/ucap-webmessenger-api/karma.conf.js @@ -0,0 +1,32 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage-istanbul-reporter'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + coverageIstanbulReporter: { + dir: require('path').join(__dirname, '../../coverage/ucap-webmessenger-api'), + reports: ['html', 'lcovonly', 'text-summary'], + fixWebpackSourcePaths: true + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false, + restartOnFileChange: true + }); +}; diff --git a/projects/ucap-webmessenger-api/ng-package.json b/projects/ucap-webmessenger-api/ng-package.json new file mode 100644 index 0000000..9c943c6 --- /dev/null +++ b/projects/ucap-webmessenger-api/ng-package.json @@ -0,0 +1,7 @@ +{ + "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../../dist/ucap-webmessenger-api", + "lib": { + "entryFile": "src/public-api.ts" + } +} \ No newline at end of file diff --git a/projects/ucap-webmessenger-api/package.json b/projects/ucap-webmessenger-api/package.json new file mode 100644 index 0000000..0ae09c6 --- /dev/null +++ b/projects/ucap-webmessenger-api/package.json @@ -0,0 +1,8 @@ +{ + "name": "@ucap-webmessenger/api", + "version": "0.0.1", + "peerDependencies": { + "@angular/common": "^8.2.4", + "@angular/core": "^8.2.4" + } +} diff --git a/projects/ucap-webmessenger-api/src/lib/apis/api.ts b/projects/ucap-webmessenger-api/src/lib/apis/api.ts new file mode 100644 index 0000000..b4b9b04 --- /dev/null +++ b/projects/ucap-webmessenger-api/src/lib/apis/api.ts @@ -0,0 +1,19 @@ +import { HttpParams } from '@angular/common/http'; + +import { StatusCode } from '../types/status-code.type'; + +export interface APIRequest { + _id?: string; +} + +export interface APIResponse { + _id?: string; + statusCode: StatusCode; + errorMessage: string; +} + +export type APIEncoder = (req: REQ) => HttpParams; + +export type APIFormDataEncoder = (req: REQ) => FormData; + +export type APIDecoder = (res: any) => RES; diff --git a/projects/ucap-webmessenger-api/src/lib/types/status-code.type.ts b/projects/ucap-webmessenger-api/src/lib/types/status-code.type.ts new file mode 100644 index 0000000..89d7a3f --- /dev/null +++ b/projects/ucap-webmessenger-api/src/lib/types/status-code.type.ts @@ -0,0 +1,4 @@ +export enum StatusCode { + Success = '200', + Fail = '500' +} diff --git a/projects/ucap-webmessenger-api/src/lib/utils/json.util.ts b/projects/ucap-webmessenger-api/src/lib/utils/json.util.ts new file mode 100644 index 0000000..d59f754 --- /dev/null +++ b/projects/ucap-webmessenger-api/src/lib/utils/json.util.ts @@ -0,0 +1,22 @@ +export class JsonAnalization { + /** + * Raw string Analization for JSON string. + * @description Editing with string.util.ts + */ + public static receiveAnalization(jsonStr: string): any { + const startJson = jsonStr.indexOf('{'); + const endJson = jsonStr.lastIndexOf('}'); + + if (startJson >= 0 && startJson < endJson) { + jsonStr = jsonStr + .substring(startJson, endJson + 1) + .replace(/\n"/gi, '"') + .replace(/\n}/gi, '}') + .replace(/\n/gi, '\\n'); + + return JSON.parse(jsonStr); + } else { + throw new Error('Invalid Json String'); + } + } +} diff --git a/projects/ucap-webmessenger-api/src/lib/utils/parameter.util.ts b/projects/ucap-webmessenger-api/src/lib/utils/parameter.util.ts new file mode 100644 index 0000000..0ae9a17 --- /dev/null +++ b/projects/ucap-webmessenger-api/src/lib/utils/parameter.util.ts @@ -0,0 +1,67 @@ +import { HttpParams } from '@angular/common/http'; + +export type Parameter = HttpParams | null; + +export class ParameterUtil { + public static encode( + parameterMap: {}, + param: {}, + extraParam?: {} + ): Parameter { + let parameter: HttpParams = new HttpParams(); + + Object.keys(parameterMap).map(key => { + if (!param.hasOwnProperty(key)) { + return; + } + + let v: any; + if (!!extraParam && !!extraParam[key]) { + v = extraParam[key]; + } else if (!!param[key]) { + v = param[key]; + } + + if (!!v) { + if (parameter.has(parameterMap[key])) { + parameter = parameter.append(parameterMap[key], v); + } else { + parameter = parameter.set(parameterMap[key], v); + } + } + }); + + return parameter; + } + + public static encodeFormData( + parameterMap: {}, + param: {}, + extraParam?: {} + ): FormData { + const formData: FormData = new FormData(); + + Object.keys(parameterMap).map(key => { + if (!param.hasOwnProperty(key)) { + return; + } + + let v: any; + if (!!extraParam && !!extraParam[key]) { + v = extraParam[key]; + } else if (!!param[key]) { + v = param[key]; + } + + if (!!v) { + if (v instanceof File) { + formData.append(parameterMap[key], v, v.name); + } else { + formData.append(parameterMap[key], v); + } + } + }); + + return formData; + } +} diff --git a/projects/ucap-webmessenger-api/src/lib/utils/url.util.ts b/projects/ucap-webmessenger-api/src/lib/utils/url.util.ts new file mode 100644 index 0000000..0579615 --- /dev/null +++ b/projects/ucap-webmessenger-api/src/lib/utils/url.util.ts @@ -0,0 +1,16 @@ +import { Parameter } from './parameter.util'; +import { HttpParams } from '@angular/common/http'; + +export class UrlUtil { + public static format(href: string, param: Parameter): string { + const params = param.toString(); + + if (params.length === 0) { + return href; + } else { + const qIdx = href.indexOf('?'); + const sep: string = qIdx === -1 ? '?' : qIdx < href.length - 1 ? '&' : ''; + return href + sep + params; + } + } +} diff --git a/projects/ucap-webmessenger-api/src/public-api.ts b/projects/ucap-webmessenger-api/src/public-api.ts new file mode 100644 index 0000000..6669470 --- /dev/null +++ b/projects/ucap-webmessenger-api/src/public-api.ts @@ -0,0 +1,11 @@ +/* + * Public API Surface of ucap-webmessenger-api + */ + +export * from './lib/apis/api'; + +export * from './lib/types/status-code.type'; + +export * from './lib/utils/json.util'; +export * from './lib/utils/parameter.util'; +export * from './lib/utils/url.util'; diff --git a/projects/ucap-webmessenger-api/src/test.ts b/projects/ucap-webmessenger-api/src/test.ts new file mode 100644 index 0000000..978c64f --- /dev/null +++ b/projects/ucap-webmessenger-api/src/test.ts @@ -0,0 +1,21 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/dist/zone'; +import 'zone.js/dist/zone-testing'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +declare const require: any; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() +); +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); diff --git a/projects/ucap-webmessenger-api/tsconfig.lib.json b/projects/ucap-webmessenger-api/tsconfig.lib.json new file mode 100644 index 0000000..bd23948 --- /dev/null +++ b/projects/ucap-webmessenger-api/tsconfig.lib.json @@ -0,0 +1,26 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/lib", + "target": "es2015", + "declaration": true, + "inlineSources": true, + "types": [], + "lib": [ + "dom", + "es2018" + ] + }, + "angularCompilerOptions": { + "annotateForClosureCompiler": true, + "skipTemplateCodegen": true, + "strictMetadataEmit": true, + "fullTemplateTypeCheck": true, + "strictInjectionParameters": true, + "enableResourceInlining": true + }, + "exclude": [ + "src/test.ts", + "**/*.spec.ts" + ] +} diff --git a/projects/ucap-webmessenger-api/tsconfig.spec.json b/projects/ucap-webmessenger-api/tsconfig.spec.json new file mode 100644 index 0000000..16da33d --- /dev/null +++ b/projects/ucap-webmessenger-api/tsconfig.spec.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/spec", + "types": [ + "jasmine", + "node" + ] + }, + "files": [ + "src/test.ts" + ], + "include": [ + "**/*.spec.ts", + "**/*.d.ts" + ] +} diff --git a/projects/ucap-webmessenger-api/tslint.json b/projects/ucap-webmessenger-api/tslint.json new file mode 100644 index 0000000..2fa7f59 --- /dev/null +++ b/projects/ucap-webmessenger-api/tslint.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tslint.json", + "rules": { + "directive-selector": [ + true, + "attribute", + "ucapApi", + "camelCase" + ], + "component-selector": [ + true, + "element", + "ucap-api", + "kebab-case" + ] + } +} diff --git a/projects/ucap-webmessenger-app/browserslist b/projects/ucap-webmessenger-app/browserslist new file mode 100644 index 0000000..8084853 --- /dev/null +++ b/projects/ucap-webmessenger-app/browserslist @@ -0,0 +1,12 @@ +# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. +# For additional information regarding the format and rule options, please see: +# https://github.com/browserslist/browserslist#queries + +# You can see what browsers were selected by your queries by running: +# npx browserslist + +> 0.5% +last 2 versions +Firefox ESR +not dead +not IE 9-11 # For IE 9-11 support, remove 'not'. \ No newline at end of file diff --git a/projects/ucap-webmessenger-app/e2e/protractor.conf.js b/projects/ucap-webmessenger-app/e2e/protractor.conf.js new file mode 100644 index 0000000..73e4e68 --- /dev/null +++ b/projects/ucap-webmessenger-app/e2e/protractor.conf.js @@ -0,0 +1,32 @@ +// @ts-check +// Protractor configuration file, see link for more information +// https://github.com/angular/protractor/blob/master/lib/config.ts + +const { SpecReporter } = require('jasmine-spec-reporter'); + +/** + * @type { import("protractor").Config } + */ +exports.config = { + allScriptsTimeout: 11000, + specs: [ + './src/**/*.e2e-spec.ts' + ], + capabilities: { + 'browserName': 'chrome' + }, + directConnect: true, + baseUrl: 'http://localhost:4200/', + framework: 'jasmine', + jasmineNodeOpts: { + showColors: true, + defaultTimeoutInterval: 30000, + print: function() {} + }, + onPrepare() { + require('ts-node').register({ + project: require('path').join(__dirname, './tsconfig.json') + }); + jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); + } +}; \ No newline at end of file diff --git a/projects/ucap-webmessenger-app/e2e/src/app.e2e-spec.ts b/projects/ucap-webmessenger-app/e2e/src/app.e2e-spec.ts new file mode 100644 index 0000000..b87fce7 --- /dev/null +++ b/projects/ucap-webmessenger-app/e2e/src/app.e2e-spec.ts @@ -0,0 +1,23 @@ +import { AppPage } from './app.po'; +import { browser, logging } from 'protractor'; + +describe('workspace-project App', () => { + let page: AppPage; + + beforeEach(() => { + page = new AppPage(); + }); + + it('should display welcome message', () => { + page.navigateTo(); + expect(page.getTitleText()).toEqual('ucap-webmessenger-app app is running!'); + }); + + afterEach(async () => { + // Assert that there are no errors emitted from the browser + const logs = await browser.manage().logs().get(logging.Type.BROWSER); + expect(logs).not.toContain(jasmine.objectContaining({ + level: logging.Level.SEVERE, + } as logging.Entry)); + }); +}); diff --git a/projects/ucap-webmessenger-app/e2e/src/app.po.ts b/projects/ucap-webmessenger-app/e2e/src/app.po.ts new file mode 100644 index 0000000..b8498c2 --- /dev/null +++ b/projects/ucap-webmessenger-app/e2e/src/app.po.ts @@ -0,0 +1,11 @@ +import { browser, by, element } from 'protractor'; + +export class AppPage { + navigateTo() { + return browser.get(browser.baseUrl) as Promise; + } + + getTitleText() { + return element(by.css('app-root .content span')).getText() as Promise; + } +} diff --git a/projects/ucap-webmessenger-app/e2e/tsconfig.json b/projects/ucap-webmessenger-app/e2e/tsconfig.json new file mode 100644 index 0000000..bc240fb --- /dev/null +++ b/projects/ucap-webmessenger-app/e2e/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "outDir": "../../../out-tsc/e2e", + "module": "commonjs", + "target": "es5", + "types": [ + "jasmine", + "jasminewd2", + "node" + ] + } +} diff --git a/projects/ucap-webmessenger-app/karma.conf.js b/projects/ucap-webmessenger-app/karma.conf.js new file mode 100644 index 0000000..74065c1 --- /dev/null +++ b/projects/ucap-webmessenger-app/karma.conf.js @@ -0,0 +1,32 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage-istanbul-reporter'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + coverageIstanbulReporter: { + dir: require('path').join(__dirname, '../../coverage/ucap-webmessenger-app'), + reports: ['html', 'lcovonly', 'text-summary'], + fixWebpackSourcePaths: true + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false, + restartOnFileChange: true + }); +}; diff --git a/projects/ucap-webmessenger-app/src/app/app-provider.module.ts b/projects/ucap-webmessenger-app/src/app/app-provider.module.ts new file mode 100644 index 0000000..05b2801 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/app-provider.module.ts @@ -0,0 +1,31 @@ +import { NgModule, APP_INITIALIZER } from '@angular/core'; + +import { UCAP_NATIVE_SERVICE } from '@ucap-webmessenger/native'; +import { ElectronNativeService } from '@ucap-webmessenger/native-electron'; + +import { RESOLVERS } from './resolvers'; +import { SERVICES } from './services'; +import { AppService } from './services/app.service'; + +export function initializeApp(appService: AppService) { + return (): Promise => { + return appService.postInit(); + }; +} + +@NgModule({ + imports: [], + exports: [], + providers: [ + ...SERVICES, + ...RESOLVERS, + { + provide: APP_INITIALIZER, + useFactory: initializeApp, + deps: [AppService], + multi: true + }, + { provide: UCAP_NATIVE_SERVICE, useClass: ElectronNativeService } + ] +}) +export class AppProviderModule {} diff --git a/projects/ucap-webmessenger-app/src/app/app-routing.module.ts b/projects/ucap-webmessenger-app/src/app/app-routing.module.ts new file mode 100644 index 0000000..6b51755 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/app-routing.module.ts @@ -0,0 +1,35 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; +import { AppAuthGuard } from './guards/auth.guard'; + +const routes: Routes = [ + { path: '', redirectTo: '/messenger', pathMatch: 'full' }, + { + path: 'messenger', + loadChildren: () => + import('./pages/messenger/messenger.page.module').then( + m => m.AppMessengerPageModule + ), + canActivate: [AppAuthGuard] + }, + { + path: 'account', + loadChildren: () => + import('./pages/account/account.page.module').then( + m => m.AppAccountPageModule + ) + }, + { + path: 'template', + loadChildren: () => + import('./pages/template/template.page.module').then( + m => m.AppTemplatePageModule + ) + } +]; + +@NgModule({ + imports: [RouterModule.forRoot(routes, { enableTracing: false })], + exports: [RouterModule] +}) +export class AppRoutingModule {} diff --git a/projects/ucap-webmessenger-app/src/app/app-store.module.ts b/projects/ucap-webmessenger-app/src/app/app-store.module.ts new file mode 100644 index 0000000..5c69901 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/app-store.module.ts @@ -0,0 +1,64 @@ +import { NgModule } from '@angular/core'; + +import { StoreModule } from '@ngrx/store'; +import { EffectsModule } from '@ngrx/effects'; +import { StoreRouterConnectingModule, RouterState } from '@ngrx/router-store'; +import { StoreDevtoolsModule } from '@ngrx/store-devtools'; + +import { ROOT_REDUCERS, metaReducers, effects } from './store'; + +@NgModule({ + imports: [ + /** + * StoreModule.forRoot is imported once in the root module, accepting a reducer + * function or object map of reducer functions. If passed an object of + * reducers, combineReducers will be run creating your application + * meta-reducer. This returns all providers for an @ngrx/store + * based application. + */ + StoreModule.forRoot(ROOT_REDUCERS, { + metaReducers, + runtimeChecks: { + strictStateImmutability: true, + strictActionImmutability: true, + strictStateSerializability: true, + strictActionSerializability: true + } + }), + + /** + * @ngrx/router-store keeps router state up-to-date in the store. + */ + StoreRouterConnectingModule.forRoot({ + routerState: RouterState.Minimal + }), + + /** + * Store devtools instrument the store retaining past versions of state + * and recalculating new states. This enables powerful time-travel + * debugging. + * + * To use the debugger, install the Redux Devtools extension for either + * Chrome or Firefox + * + * See: https://github.com/zalmoxisus/redux-devtools-extension + */ + StoreDevtoolsModule.instrument({ + name: 'NgRx Book Store App' + + // In a production build you would want to disable the Store Devtools + // logOnly: environment.production, + }), + + /** + * EffectsModule.forRoot() is imported once in the root module and + * sets up the effects class to be initialized immediately when the + * application starts. + * + * See: https://ngrx.io/guide/effects#registering-root-effects + */ + EffectsModule.forRoot([...effects]) + ], + exports: [] +}) +export class AppStoreModule {} diff --git a/projects/ucap-webmessenger-app/src/app/app-translate.module.ts b/projects/ucap-webmessenger-app/src/app/app-translate.module.ts new file mode 100644 index 0000000..5faaf63 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/app-translate.module.ts @@ -0,0 +1,33 @@ +import { NgModule } from '@angular/core'; + +import { TranslateModule, TranslateLoader } from '@ngx-translate/core'; + +import { UCAP_NATIVE_SERVICE, NativeService } from '@ucap-webmessenger/native'; + +export async function createTranslateLoader(nativeService: NativeService) { + // tslint:disable-next-line: variable-name + let _TranslateLoader; + _TranslateLoader = await import('@ucap-webmessenger/native-browser').then( + m => m.TranslateBrowserLoader + ); + _TranslateLoader = await import('@ucap-webmessenger/native-electron').then( + m => m.TranslateElectronLoader + ); + + // return new TranslateBrowserLoader(nativeService, './assets/i18n/', '.json'); + return new _TranslateLoader(nativeService, './assets/i18n/', '.json'); +} + +@NgModule({ + imports: [ + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: createTranslateLoader, + deps: [UCAP_NATIVE_SERVICE] + } + }) + ], + exports: [] +}) +export class AppTranslateModule {} diff --git a/projects/ucap-webmessenger-app/src/app/app.component.html b/projects/ucap-webmessenger-app/src/app/app.component.html new file mode 100644 index 0000000..ee5b4b5 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/app.component.html @@ -0,0 +1,2 @@ + + diff --git a/projects/ucap-webmessenger-app/src/app/app.component.scss b/projects/ucap-webmessenger-app/src/app/app.component.scss new file mode 100644 index 0000000..63fb393 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/app.component.scss @@ -0,0 +1,4 @@ +:host { + width: 100%; + height: auto !important; +} diff --git a/projects/ucap-webmessenger-app/src/app/app.component.spec.ts b/projects/ucap-webmessenger-app/src/app/app.component.spec.ts new file mode 100644 index 0000000..8f5623d --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/app.component.spec.ts @@ -0,0 +1,35 @@ +import { TestBed, async } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; +import { AppComponent } from './app.component'; + +describe('AppComponent', () => { + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + RouterTestingModule + ], + declarations: [ + AppComponent + ], + }).compileComponents(); + })); + + it('should create the app', () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.debugElement.componentInstance; + expect(app).toBeTruthy(); + }); + + it(`should have as title 'ucap-webmessenger-app'`, () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.debugElement.componentInstance; + expect(app.title).toEqual('ucap-webmessenger-app'); + }); + + it('should render title', () => { + const fixture = TestBed.createComponent(AppComponent); + fixture.detectChanges(); + const compiled = fixture.debugElement.nativeElement; + expect(compiled.querySelector('.content span').textContent).toContain('ucap-webmessenger-app app is running!'); + }); +}); diff --git a/projects/ucap-webmessenger-app/src/app/app.component.ts b/projects/ucap-webmessenger-app/src/app/app.component.ts new file mode 100644 index 0000000..5447618 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/app.component.ts @@ -0,0 +1,10 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html', + styleUrls: ['./app.component.scss'] +}) +export class AppComponent { + title = 'ucap-webmessenger-app'; +} diff --git a/projects/ucap-webmessenger-app/src/app/app.module.ts b/projects/ucap-webmessenger-app/src/app/app.module.ts new file mode 100644 index 0000000..2e3bc2e --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/app.module.ts @@ -0,0 +1,118 @@ +import { NgModule } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { HttpClientModule } from '@angular/common/http'; + +import { MatProgressBarModule } from '@angular/material/progress-bar'; + +import { PerfectScrollbarModule } from 'ngx-perfect-scrollbar'; + +import { UCapCommonApiModule } from '@ucap-webmessenger/api-common'; +import { UCapExternalApiModule } from '@ucap-webmessenger/api-external'; +import { UCapPublicApiModule } from '@ucap-webmessenger/api-public'; + +import { UCapPiModule } from '@ucap-webmessenger/pi'; + +import { UCapProtocolModule } from '@ucap-webmessenger/protocol'; +import { UCapAuthenticationProtocolModule } from '@ucap-webmessenger/protocol-authentication'; +import { UCapEventProtocolModule } from '@ucap-webmessenger/protocol-event'; +import { UCapGroupProtocolModule } from '@ucap-webmessenger/protocol-group'; +import { UCapInfoProtocolModule } from '@ucap-webmessenger/protocol-info'; +import { UCapInnerProtocolModule } from '@ucap-webmessenger/protocol-inner'; +import { UCapOptionProtocolModule } from '@ucap-webmessenger/protocol-option'; +import { UCapRoomProtocolModule } from '@ucap-webmessenger/protocol-room'; +import { UCapServiceProtocolModule } from '@ucap-webmessenger/protocol-service'; +import { UCapStatusProtocolModule } from '@ucap-webmessenger/protocol-status'; +import { UCapSyncProtocolModule } from '@ucap-webmessenger/protocol-sync'; + +import { UCapUiModule } from '@ucap-webmessenger/ui'; +import { UCapUiAccountModule } from '@ucap-webmessenger/ui-account'; + +import { UCapWebStorageModule } from '@ucap-webmessenger/web-storage'; + +import { UCapUtilModule } from '@ucap-webmessenger/util'; + +import { LoggerModule, NgxLoggerLevel } from 'ngx-logger'; + +import { environment } from '../environments/environment'; + +import { AppProviderModule } from './app-provider.module'; +import { AppRoutingModule } from './app-routing.module'; +import { AppStoreModule } from './app-store.module'; +import { AppTranslateModule } from './app-translate.module'; + +import { AppComponent } from './app.component'; + +import { GUARDS } from './guards'; +import { AppMessengerLayoutModule } from './layouts/messenger/messenger.layout.module'; +import { AppNativeLayoutModule } from './layouts/native/native.layout.module'; + +@NgModule({ + imports: [ + BrowserModule, + BrowserAnimationsModule, + + HttpClientModule, + + MatProgressBarModule, + + PerfectScrollbarModule, + + UCapCommonApiModule.forRoot({ + urls: environment.urls.apiCommon, + acceptableFileExtensions: + environment.modules.event.acceptableFileExtensions + }), + + UCapPublicApiModule.forRoot({ + urls: environment.urls.apiPublic + }), + UCapExternalApiModule.forRoot({ + urls: environment.urls.apiExternal + }), + + UCapPiModule.forRoot({ + urls: environment.urls.pi + }), + + UCapProtocolModule.forRoot({ + urls: environment.urls.protocol, + reconnect: environment.protocol.reconnect, + requestId: environment.protocol.requestId + }), + UCapAuthenticationProtocolModule.forRoot(), + UCapEventProtocolModule.forRoot(), + UCapGroupProtocolModule.forRoot(), + UCapInfoProtocolModule.forRoot(), + UCapInnerProtocolModule.forRoot(), + UCapOptionProtocolModule.forRoot(), + UCapRoomProtocolModule.forRoot(), + UCapServiceProtocolModule.forRoot(), + UCapStatusProtocolModule.forRoot(), + UCapSyncProtocolModule.forRoot(), + + UCapUiModule.forRoot(), + UCapUiAccountModule.forRoot(), + + UCapWebStorageModule.forRoot(), + + UCapUtilModule.forRoot(), + + AppProviderModule, + AppRoutingModule, + AppStoreModule, + AppTranslateModule, + + AppMessengerLayoutModule, + AppNativeLayoutModule, + + LoggerModule.forRoot({ + level: NgxLoggerLevel.DEBUG + }) + ], + providers: [...GUARDS], + declarations: [AppComponent], + bootstrap: [AppComponent], + entryComponents: [] +}) +export class AppModule {} diff --git a/projects/ucap-webmessenger-app/src/app/app.theme.scss b/projects/ucap-webmessenger-app/src/app/app.theme.scss new file mode 100644 index 0000000..e636333 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/app.theme.scss @@ -0,0 +1,126 @@ +// ----------------------------------------------------------------------------------------------------- +// @ Typography +// ----------------------------------------------------------------------------------------------------- + +// Angular Material typography +// $input: mat-typography-level(16px, 1.125, 400) // line-height must be unitless !!! +$typography: mat-typography-config( + $font-family: + '나눔고딕, Malgun Gothic, 맑은고딕, Arial, Muli, Helvetica Neue, Arial, sans-serif', + $title: mat-typography-level(20px, 32px, 600), + $body-2: mat-typography-level(14px, 24px, 600), + $button: mat-typography-level(14px, 14px, 600), + $input: mat-typography-level(16px, 1.125, 400) +); + +// Setup the typography +@include angular-material-typography($typography); + +@mixin components-theme($theme) { +} + +// ----------------------------------------------------------------------------------------------------- +// @ Define the default theme +// ----------------------------------------------------------------------------------------------------- + +// Define the primary, accent and warn palettes +$default-primary-palette: mat-palette($mat-indigo); +$default-accent-palette: mat-palette($mat-light-blue, 600, 400, 700); +$default-warn-palette: mat-palette($mat-red); + +// Create the Material theme object +$theme: mat-light-theme( + $default-primary-palette, + $default-accent-palette, + $default-warn-palette +); + +// Add ".theme-default" class to the body to activate this theme. +// Class name must start with "theme-" !!! +/*body.theme-default { + // Create an Angular Material theme from the $theme map + @include angular-material-theme($theme); + + // Apply the theme to the user components + @include components-theme($theme); + @include ucap-material-theme($theme); +}*/ + +// ----------------------------------------------------------------------------------------------------- +// @ Define a blue-gray dark theme +// ----------------------------------------------------------------------------------------------------- + +// Define the primary, accent and warn palettes +$blue-gray-dark-theme-primary-palette: mat-palette($mat-blue); +$blue-gray-dark-theme-accent-palette: mat-palette($mat-blue-gray); +$blue-gray-dark-theme-warn-palette: mat-palette($mat-red); + +// Create the Material theme object +$blue-gray-dark-theme: mat-dark-theme( + $blue-gray-dark-theme-primary-palette, + $blue-gray-dark-theme-accent-palette, + $blue-gray-dark-theme-warn-palette +); + +// Add ".theme-blue-gray-dark" class to the body to activate this theme. +// Class name must start with "theme-" !!! +body.theme-blue-gray-dark { + // Generate the Angular Material theme + @include angular-material-theme($blue-gray-dark-theme); + + // Apply the theme to the user components + @include components-theme($blue-gray-dark-theme); +} + +// ----------------------------------------------------------------------------------------------------- +// @ Define a pink dark theme +// ----------------------------------------------------------------------------------------------------- + +// Define the primary, accent and warn palettes +$pink-dark-theme-primary-palette: mat-palette($mat-pink); +$pink-dark-theme-accent-palette: mat-palette($mat-pink); +$pink-dark-theme-warn-palette: mat-palette($mat-red); + +// Create the Material theme object +$pink-dark-theme: mat-dark-theme( + $pink-dark-theme-primary-palette, + $pink-dark-theme-accent-palette, + $pink-dark-theme-warn-palette +); + +// Add ".theme-pink-dark" class to the body to activate this theme. +// Class name must start with "theme-" !!! +body.theme-pink-dark { + // Generate the Angular Material theme + @include angular-material-theme($pink-dark-theme); + + // Apply the theme to the user components + @include components-theme($pink-dark-theme); +} + +// ----------------------------------------------------------------------------------------------------- +// @ Define a pink light theme --LG RED 변경 예정(샘플링) +// ----------------------------------------------------------------------------------------------------- + +// Define the primary, accent and warn palettes +$pink-light-theme-primary-palette: mat-palette($mat-grey,800); +$pink-light-theme-accent-palette: mat-palette($lg-red, 400); +$pink-light-theme-warn-palette: mat-palette($mat-red); + +// Create the Material theme object +$pink-light-theme: mat-light-theme( + $pink-light-theme-primary-palette, + $pink-light-theme-accent-palette, + $pink-light-theme-warn-palette +); + +// Add ".theme-pink-dark" class to the body to activate this theme. +// Class name must start with "theme-" !!! +body.theme-default { + // Generate the Angular Material theme + @include angular-material-theme($pink-light-theme); + + // Apply the theme to the user components + @include components-theme($pink-light-theme); + @include ucap-material-theme($pink-light-theme); +} diff --git a/projects/ucap-webmessenger-app/src/app/guards/auth.guard.ts b/projects/ucap-webmessenger-app/src/app/guards/auth.guard.ts new file mode 100644 index 0000000..4b22c67 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/guards/auth.guard.ts @@ -0,0 +1,41 @@ +import { Injectable } from '@angular/core'; +import { + CanActivate, + ActivatedRouteSnapshot, + RouterStateSnapshot, + UrlTree, + Router +} from '@angular/router'; +import { Store, select } from '@ngrx/store'; +import { Observable } from 'rxjs'; +import { map, take } from 'rxjs/operators'; + +import { AppAuthenticationService } from '../services/authentication.service'; + +@Injectable({ + providedIn: 'root' +}) +export class AppAuthGuard implements CanActivate { + constructor( + private router: Router, + private appAuthenticationService: AppAuthenticationService + ) {} + + canActivate( + route: ActivatedRouteSnapshot, + state: RouterStateSnapshot + ): + | boolean + | UrlTree + | Observable + | Promise { + return new Promise((resolve, reject) => { + if (this.appAuthenticationService.authenticated()) { + resolve(true); + } else { + this.router.navigateByUrl('/account/login'); + resolve(false); + } + }); + } +} diff --git a/projects/ucap-webmessenger-app/src/app/guards/index.ts b/projects/ucap-webmessenger-app/src/app/guards/index.ts new file mode 100644 index 0000000..960876f --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/guards/index.ts @@ -0,0 +1,3 @@ +import { AppAuthGuard } from './auth.guard'; + +export const GUARDS = [AppAuthGuard]; diff --git a/projects/ucap-webmessenger-app/src/app/interceptors/loader.interceptor.ts b/projects/ucap-webmessenger-app/src/app/interceptors/loader.interceptor.ts new file mode 100644 index 0000000..9f9688f --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/interceptors/loader.interceptor.ts @@ -0,0 +1,34 @@ +import { Injectable, Injector } from '@angular/core'; +import { + HttpEvent, + HttpRequest, + HttpHandler, + HttpInterceptor +} from '@angular/common/http'; +import { Observable } from 'rxjs'; +import { finalize, delay } from 'rxjs/operators'; +import { AppLoaderService } from '../services/loader.service'; + +@Injectable() +export class AppLoaderInterceptor implements HttpInterceptor { + constructor(private injector: Injector) {} + + intercept( + req: HttpRequest, + next: HttpHandler + ): Observable> { + if (!req.url.includes('albums')) { + return next.handle(req); + } + console.warn('LoaderInterceptor'); + + const appLoaderService = this.injector.get(AppLoaderService); + + appLoaderService.show(); + + return next.handle(req).pipe( + delay(3000), + finalize(() => appLoaderService.hide()) + ); + } +} diff --git a/projects/ucap-webmessenger-app/src/app/layouts/common/common.layout.module.ts b/projects/ucap-webmessenger-app/src/app/layouts/common/common.layout.module.ts new file mode 100644 index 0000000..3aafbce --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/common/common.layout.module.ts @@ -0,0 +1,28 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +import { FlexLayoutModule } from '@angular/flex-layout'; + +import { MatIconModule } from '@angular/material/icon'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { MatToolbarModule } from '@angular/material/toolbar'; + +import { UCapUiModule } from '@ucap-webmessenger/ui'; + +import { COMPONENTS } from './components'; +import { DIALOGS } from './dialogs'; + +@NgModule({ + imports: [ + CommonModule, + FlexLayoutModule, + MatIconModule, + MatProgressBarModule, + MatToolbarModule, + UCapUiModule + ], + exports: [...COMPONENTS, ...DIALOGS], + declarations: [...COMPONENTS, ...DIALOGS], + entryComponents: [...DIALOGS] +}) +export class AppCommonLayoutModule {} diff --git a/projects/ucap-webmessenger-app/src/app/layouts/common/components/index.ts b/projects/ucap-webmessenger-app/src/app/layouts/common/components/index.ts new file mode 100644 index 0000000..c2ef00c --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/common/components/index.ts @@ -0,0 +1 @@ +export const COMPONENTS = []; diff --git a/projects/ucap-webmessenger-app/src/app/layouts/common/dialogs/file-viewer.dialog.component.html b/projects/ucap-webmessenger-app/src/app/layouts/common/dialogs/file-viewer.dialog.component.html new file mode 100644 index 0000000..343050b --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/common/dialogs/file-viewer.dialog.component.html @@ -0,0 +1,11 @@ + + diff --git a/projects/ucap-webmessenger-app/src/app/layouts/common/dialogs/file-viewer.dialog.component.scss b/projects/ucap-webmessenger-app/src/app/layouts/common/dialogs/file-viewer.dialog.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/projects/ucap-webmessenger-app/src/app/layouts/common/dialogs/file-viewer.dialog.component.spec.ts b/projects/ucap-webmessenger-app/src/app/layouts/common/dialogs/file-viewer.dialog.component.spec.ts new file mode 100644 index 0000000..b7c7d5b --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/common/dialogs/file-viewer.dialog.component.spec.ts @@ -0,0 +1,27 @@ +/* tslint:disable:no-unused-variable */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { DebugElement } from '@angular/core'; + +import { FileViewerDialogComponent } from './file-viewer.dialog.component'; + +describe('FileViewerDialogComponent', () => { + let component: FileViewerDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [FileViewerDialogComponent] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FileViewerDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/projects/ucap-webmessenger-app/src/app/layouts/common/dialogs/file-viewer.dialog.component.ts b/projects/ucap-webmessenger-app/src/app/layouts/common/dialogs/file-viewer.dialog.component.ts new file mode 100644 index 0000000..d084019 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/common/dialogs/file-viewer.dialog.component.ts @@ -0,0 +1,135 @@ +import { + Component, + OnInit, + OnDestroy, + Inject, + EventEmitter +} from '@angular/core'; + +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material'; +import { NGXLogger } from 'ngx-logger'; +import { FileEventJson } from '@ucap-webmessenger/protocol-event'; +import { DeviceType, FileUtil, MimeUtil } from '@ucap-webmessenger/core'; +import { NativeService, UCAP_NATIVE_SERVICE } from '@ucap-webmessenger/native'; +import { take, map, finalize, tap } from 'rxjs/operators'; +import { SnackBarService } from '@ucap-webmessenger/ui'; +import { + FileDownloadItem, + CommonApiService +} from '@ucap-webmessenger/api-common'; + +export interface FileViewerDialogData { + fileInfo: FileEventJson; + downloadUrl: string; + userSeq: number; + deviceType: DeviceType; + token: string; +} + +export interface FileViewerDialogResult {} + +@Component({ + selector: 'app-layout-common-file-viewer', + templateUrl: './file-viewer.dialog.component.html', + styleUrls: ['./file-viewer.dialog.component.scss'] +}) +export class FileViewerDialogComponent implements OnInit, OnDestroy { + fileInfo: FileEventJson; + downloadUrl: string; + userSeq: number; + deviceType: DeviceType; + token: string; + + fileDownloadItem: FileDownloadItem; + + fileDownloadUrl: string; + + constructor( + public dialogRef: MatDialogRef< + FileViewerDialogData, + FileViewerDialogResult + >, + @Inject(MAT_DIALOG_DATA) public data: FileViewerDialogData, + @Inject(UCAP_NATIVE_SERVICE) private nativeService: NativeService, + private snackBarService: SnackBarService, + private commonApiService: CommonApiService, + private logger: NGXLogger + ) { + this.fileInfo = data.fileInfo; + this.downloadUrl = data.downloadUrl; + this.userSeq = data.userSeq; + this.deviceType = data.deviceType; + this.token = data.token; + + this.fileDownloadUrl = this.commonApiService.urlForFileTalkDownload( + { + userSeq: this.userSeq, + deviceType: this.deviceType, + token: this.token, + attachmentsSeq: this.fileInfo.attachmentSeq + }, + this.downloadUrl + ); + } + + ngOnInit() {} + + ngOnDestroy(): void {} + + onDownload(): void { + this.fileDownloadItem = new FileDownloadItem(); + this.commonApiService + .fileTalkDownload( + { + userSeq: this.userSeq, + deviceType: this.deviceType, + token: this.token, + attachmentsSeq: this.fileInfo.attachmentSeq, + fileDownloadItem: this.fileDownloadItem + }, + this.downloadUrl + ) + .pipe( + take(1), + map(async rawBlob => { + const blob = rawBlob.slice( + 0, + rawBlob.size, + MimeUtil.getMimeFromExtension(this.fileInfo.fileExt) + ); + + FileUtil.fromBlobToBuffer(blob) + .then(buffer => { + this.nativeService + .saveFile(buffer, this.fileInfo.fileName) + .pipe(take(1)) + .subscribe(result => { + if (!!result) { + this.snackBarService.open( + `파일이 경로[${result}]에 저장되었습니다.`, + '', + { + duration: 3000, + verticalPosition: 'bottom' + } + ); + } else { + this.snackBarService.open('파일 저장에 실패하였습니다.'); + } + }); + }) + .catch(reason => { + this.logger.error('download', reason); + }); + }), + finalize(() => { + this.fileDownloadItem = undefined; + }) + ) + .subscribe(); + } + + onClosedViewer(): void { + this.dialogRef.close(); + } +} diff --git a/projects/ucap-webmessenger-app/src/app/layouts/common/dialogs/index.ts b/projects/ucap-webmessenger-app/src/app/layouts/common/dialogs/index.ts new file mode 100644 index 0000000..ca3fe9a --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/common/dialogs/index.ts @@ -0,0 +1,3 @@ +import { FileViewerDialogComponent } from './file-viewer.dialog.component'; + +export const DIALOGS = [FileViewerDialogComponent]; diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/index.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/index.ts new file mode 100644 index 0000000..7348ada --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/index.ts @@ -0,0 +1,15 @@ +import { IntroComponent } from './intro.component'; +import { LeftSideComponent } from './left-side.component'; +import { MessagesComponent } from './messages.component'; +import { RightSideComponent } from './right-side.component'; + +import { LEFT_SIDENAV_COMPONENTS } from './left-sidenav'; + +export const COMPONENTS = [ + IntroComponent, + LeftSideComponent, + MessagesComponent, + RightSideComponent, + + ...LEFT_SIDENAV_COMPONENTS +]; diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/intro.component.html b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/intro.component.html new file mode 100644 index 0000000..a52b69e --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/intro.component.html @@ -0,0 +1,26 @@ +
+ + + + M Messenger + + + + Select a contact to start a chat! + +
diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/intro.component.scss b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/intro.component.scss new file mode 100644 index 0000000..1f38634 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/intro.component.scss @@ -0,0 +1,23 @@ +:host { + display: flex; + height: 100%; + flex: 1; + + .big-circle { + border-radius: 50%; + width: 240px; + height: 240px; + line-height: 240px; + text-align: center; + border: 1px solid; + } + + .app-title { + font-weight: 600; + font-size: 32px; + } + + .secondary-text { + font-size: 16px; + } +} diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/intro.component.spec.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/intro.component.spec.ts new file mode 100644 index 0000000..cd8f885 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/intro.component.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { IntroComponent } from './intro.component'; + +describe('App::Layout::Messenger::IntroComponent', () => { + let component: IntroComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [IntroComponent] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(IntroComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/intro.component.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/intro.component.ts new file mode 100644 index 0000000..6dae294 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/intro.component.ts @@ -0,0 +1,14 @@ +import { Component, OnInit } from '@angular/core'; +import { ucapAnimations } from '@ucap-webmessenger/ui'; + +@Component({ + selector: 'app-layout-messenger-intro', + templateUrl: './intro.component.html', + styleUrls: ['./intro.component.scss'], + animations: ucapAnimations +}) +export class IntroComponent implements OnInit { + constructor() {} + + ngOnInit() {} +} diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-side.component.html b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-side.component.html new file mode 100644 index 0000000..77e14cd --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-side.component.html @@ -0,0 +1,96 @@ +
+ + + + +
+ + + + +
+
+ +
+ + + +
+ + + + +
+
+ +
+ + + +
+ + + + + + + + +
+
+ +
+ + + +
+ + + + +
+
+ +
+
+ +
diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-side.component.scss b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-side.component.scss new file mode 100644 index 0000000..8f5727c --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-side.component.scss @@ -0,0 +1,93 @@ +::ng-deep .mat-tab-label, +::ng-deep .mat-tab-label-active { + min-width: 0 !important; +} + +::ng-deep .mat-tab-body-wrapper, +::ng-deep .mat-tab-body { + height: 100%; + width: 100%; +} +::ng-deep .mat-tab-header { + border-bottom: none !important; +} +.container { + display: flex; + height: 100%; +} + +.mat-tab-group { + display: flex; + width: 100%; + flex-direction: row; +} +::ng-deep .organization-side { + flex-direction: column; + height: 100%; +} +::ng-deep .global-menu { + border-right: 2px solid #4f4f4f; + .mat-tab-label-container { + background-color: #4f4f4f; + .mat-tab-list { + .mat-tab-labels { + flex-flow: column; + height: 280px; + padding-top:10px; + .mat-tab-label { + height: 80px; + padding:0 16px; + } + } + .mat-ink-bar { + background-color: none; + height: 0; + } + } + } +} +.left-group-side { + position: relative; + height: 100%; +} + +::ng-deep .mat-tab-label { + .mat-tab-label-content { + .icon-item { + background: var(--white); + border-radius: 4px; + display: inline-flex; + width: 36px; + height: 36px; + border-radius: 50%; + justify-content: center; + align-items: center; + transform: scale(0.9); + transition: transform .3s cubic-bezier(.4,0,0,1); + + svg { + width: 24px; + height: 24px; + stroke: #ffffff; + stroke-width: 1.5; + stroke-linecap: square; + stroke-linejoin: miter; + fill: none; + color: #2329d6; + } + } + } + &[aria-selected='true'] { + opacity: 1; + .mat-tab-label-content { + .icon-item { + background: #ef4c73; + transform: scale(1.0); + /*svg { + stroke: #ef4c73; + fill: #ef4c73; + }*/ + } + } + } +} diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-side.component.spec.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-side.component.spec.ts new file mode 100644 index 0000000..56df6e9 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-side.component.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { LeftSideComponent } from './left-side.component'; + +describe('App::Layout::Messenger::LeftSideComponent', () => { + let component: LeftSideComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [LeftSideComponent] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(LeftSideComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-side.component.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-side.component.ts new file mode 100644 index 0000000..5a330e1 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-side.component.ts @@ -0,0 +1,243 @@ +import { UserSelectDialogType } from './../../../types/userselect.dialog.type'; +import { Component, OnInit } from '@angular/core'; +import { NGXLogger } from 'ngx-logger'; +import { ucapAnimations, DialogService } from '@ucap-webmessenger/ui'; +import { + CreateChatDialogComponent, + CreateChatDialogData, + CreateChatDialogResult +} from '@app/layouts/messenger/dialogs/chat/create-chat.dialog.component'; +import { Observable } from 'rxjs'; +import { Store, select } from '@ngrx/store'; + +import * as AppStore from '@app/store'; +import * as ChatStore from '@app/store/messenger/chat'; +import * as SyncStore from '@app/store/messenger/sync'; +import { UserInfo } from '@ucap-webmessenger/protocol-sync'; +import { + UserInfoSS, + UserInfoF, + UserInfoDN +} from '@ucap-webmessenger/protocol-query'; +import { MatTabChangeEvent, MatTabGroup } from '@angular/material'; + +export enum MainMenu { + Group = 'GROUP', + Chat = 'CAHT', + Organization = 'ORGANIZATION', + Call = 'CALL', + Conversation = 'CONVERSATION' +} + +@Component({ + selector: 'app-layout-messenger-left-side', + templateUrl: './left-side.component.html', + styleUrls: ['./left-side.component.scss'], + animations: ucapAnimations +}) +export class LeftSideComponent implements OnInit { + badgeChatUnReadCount$: Observable; + + /** 조직도에서 부서원 선택 */ + selectedUserList: (UserInfo | UserInfoSS | UserInfoF | UserInfoDN)[] = []; + + /** FAB */ + fabButtonShow = true; + fabButtons: { icon: string; tooltip?: string; divisionType?: string }[]; + + MainMenu = MainMenu; + + constructor( + private store: Store, + private dialogService: DialogService, + private logger: NGXLogger + ) {} + + ngOnInit() { + this.badgeChatUnReadCount$ = this.store.pipe( + select(AppStore.MessengerSelector.SyncSelector.selectChatUnreadCount) + ); + + this.setFabInitial(MainMenu.Group); + } + + async onClickNewChat(type: string = 'NORMAL') { + const result = await this.dialogService.open< + CreateChatDialogComponent, + CreateChatDialogData, + CreateChatDialogResult + >(CreateChatDialogComponent, { + width: '600px', + data: { + type: UserSelectDialogType.NewChat, + title: type === 'TIMER' ? 'New Timer Chat' : 'New Chat' + } + }); + + if (!!result && !!result.choice && result.choice) { + if (!!result.selectedUserList && result.selectedUserList.length > 0) { + const userSeqs: number[] = []; + result.selectedUserList.map(user => userSeqs.push(user.seq)); + + if (type === 'NORMAL') { + this.store.dispatch(ChatStore.openRoom({ userSeqList: userSeqs })); + } else if (type === 'TIMER') { + this.store.dispatch( + ChatStore.openRoom({ userSeqList: userSeqs, isTimeRoom: true }) + ); + } + } + } + } + + async onClickNewGroupAndMember() { + const result = await this.dialogService.open< + CreateChatDialogComponent, + CreateChatDialogData, + CreateChatDialogResult + >(CreateChatDialogComponent, { + width: '600px', + data: { + type: UserSelectDialogType.NewGroup, + title: 'New Group' + } + }); + + if (!!result && !!result.choice && result.choice) { + if ( + !!result.selectedUserList && + result.selectedUserList.length > 0 && + result.groupName.trim().length > 0 + ) { + const userSeqs: number[] = []; + result.selectedUserList.map(user => userSeqs.push(user.seq)); + + this.store.dispatch( + SyncStore.createGroupAndBuddy({ + groupName: result.groupName, + trgtUserSeq: userSeqs + }) + ); + } + } + } + + onSelectedTabChange(event: MatTabChangeEvent) { + this.setFabInitial(event.tab.ariaLabel); + } + setFabInitial(type: string) { + switch (type) { + case MainMenu.Group: + { + this.fabButtonShow = true; + this.fabButtons = [ + { + icon: 'add', + tooltip: 'New Group Add', + divisionType: 'GROUP_NEW_ADD' + } + ]; + } + break; + case MainMenu.Chat: + { + this.fabButtonShow = true; + this.fabButtons = [ + { + icon: 'timer', + tooltip: 'New Timer Chat', + divisionType: 'CHAT_NEW_TIMER_ADD' + }, + { + icon: 'chat', + tooltip: 'New Chat', + divisionType: 'CAHT_NEW_ADD' + } + ]; + } + break; + // case MainMenu.Organization: + // { + + // } + // break; + // case MainMenu.Call: + // { + + // } + // break; + + default: { + this.fabButtonShow = false; + } + } + } + + onCheckAllUser(params: { + isChecked: boolean; + userInfos: (UserInfo | UserInfoSS | UserInfoF | UserInfoDN)[]; + }) { + params.userInfos.forEach(userInfo => { + if (params.isChecked) { + if ( + this.selectedUserList.filter(user => user.seq === userInfo.seq) + .length === 0 + ) { + this.selectedUserList = [...this.selectedUserList, userInfo]; + } + } else { + this.selectedUserList = this.selectedUserList.filter( + user => user.seq !== userInfo.seq + ); + } + }); + } + + /** 조직도>부서원 :: 리스트의 checkbox 의 이벤트를 받아 선택된 유저리스트를 수집. */ + onCheckUser(params: { + isChecked: boolean; + userInfo: UserInfo | UserInfoSS | UserInfoF | UserInfoDN; + }) { + if (params.isChecked) { + if ( + params.userInfo && + this.selectedUserList.filter(user => user.seq === params.userInfo.seq) + .length === 0 + ) { + this.selectedUserList = [...this.selectedUserList, params.userInfo]; + } + } else { + this.selectedUserList = this.selectedUserList.filter( + user => user.seq !== params.userInfo.seq + ); + } + } + + /** FAB */ + onClickFab(params: { btn: any }) { + const btn = params.btn as { + icon: string; + tooltip?: string; + divisionType?: string; + }; + + switch (btn.divisionType) { + case 'GROUP_NEW_ADD': + { + this.onClickNewGroupAndMember(); + } + break; + + case 'CAHT_NEW_ADD': + { + this.onClickNewChat('NORMAL'); + } + break; + case 'CHAT_NEW_TIMER_ADD': + { + this.onClickNewChat('TIMER'); + } + break; + } + } +} diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/call.component.html b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/call.component.html new file mode 100644 index 0000000..6968d57 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/call.component.html @@ -0,0 +1 @@ +Call diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/call.component.scss b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/call.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/call.component.spec.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/call.component.spec.ts new file mode 100644 index 0000000..1345ade --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/call.component.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CallComponent } from './call.component'; + +describe('Chat::LeftSidenav::CallComponent', () => { + let component: CallComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [CallComponent] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CallComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/call.component.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/call.component.ts new file mode 100644 index 0000000..a5f771c --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/call.component.ts @@ -0,0 +1,14 @@ +import { Component, OnInit } from '@angular/core'; +import { ucapAnimations } from '@ucap-webmessenger/ui'; + +@Component({ + selector: 'app-layout-chat-left-sidenav-call', + templateUrl: './call.component.html', + styleUrls: ['./call.component.scss'], + animations: ucapAnimations +}) +export class CallComponent implements OnInit { + constructor() {} + + ngOnInit() {} +} diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/chat.component.html b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/chat.component.html new file mode 100644 index 0000000..e240d96 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/chat.component.html @@ -0,0 +1,134 @@ +
+
+

대화

+
+ +
+
+ +
+
+ + + + + +
+ + +
+ + + + + + + diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/chat.component.scss b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/chat.component.scss new file mode 100644 index 0000000..295d507 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/chat.component.scss @@ -0,0 +1,84 @@ +.current-head { + display: flex; + justify-content: center; + padding: 0 10px; + height: 70px; + background: #352a37; + background: -webkit-linear-gradient(to right, #352a37, #f15f79); + background: linear-gradient(to right, #352a37, #ef4c73); + h3 { + display: inline-flex; + padding-left: 10px; + align-items: center; + color:#ffffff; + } + .btn-box { + height: 100%; + margin-left: auto; + display: inline-flex; + align-items: center; + } +} + +.list-search { + display: flex; + flex-direction: row; + height: 60px; + align-items: center; + padding: 0; + font-size: 14px; + background-color:#f9f9f9; + border-bottom: 1px solid #dddddd; + .searchbox { + width: 100%; + height: 100%; + } +} +::ng-deep .searchbox { + .mat-form-field { + display: block; + .mat-form-field-wrapper { + padding: 0; + padding-bottom: 0 !important; + height: 100%; + .mat-form-field-flex { + height: 59px; + padding: 0 20px; + align-items: center; + .mat-form-field-infix { + width: 100%; + font-size: 14px; + border: none; + } + .mat-form-field-suffix { + .mat-icon { + line-height: 24px; + } + } + } + } + } + .mat-form-field-appearance-legacy { + .mat-form-field-wrapper { + padding: 0; + } + .mat-form-field-underline { + bottom: 0; + background-color: unset !important; + } + } +} + +.app-layout-chat-left-sidenav-chat-header { + width: 100%; + height: 50px; +} + +.app-layout-chat-left-sidenav-chat-list { + height: calc(100% - 130px); +} + +.app-layout-chat-left-sidenav-chat-list-viewport { + width: 100%; + height: 100%; +} diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/chat.component.spec.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/chat.component.spec.ts new file mode 100644 index 0000000..74d4ee8 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/chat.component.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ChatComponent } from './chat.component'; + +describe('Chat::LeftSidenav::ChatComponent', () => { + let component: ChatComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ChatComponent] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ChatComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/chat.component.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/chat.component.ts new file mode 100644 index 0000000..f4b171e --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/chat.component.ts @@ -0,0 +1,230 @@ +import { exit } from './../../../../store/messenger/room/actions'; +import { Component, OnInit, OnDestroy, ViewChild } from '@angular/core'; +import { ucapAnimations } from '@ucap-webmessenger/ui'; +import { NGXLogger } from 'ngx-logger'; +import { Store, select } from '@ngrx/store'; +import { Subscription, combineLatest, Observable } from 'rxjs'; +import { + RoomInfo, + UserInfoShort, + UserInfo as RoomUserInfo +} from '@ucap-webmessenger/protocol-room'; +import * as AppStore from '@app/store'; +import * as ChatStore from '@app/store/messenger/chat'; +import * as RoomStore from '@app/store/messenger/room'; +import { tap, debounceTime, delay } from 'rxjs/operators'; +import { + RoomUserDetailData, + RoomUserData +} from '@ucap-webmessenger/protocol-sync'; +import { VersionInfo2Response } from '@ucap-webmessenger/api-public'; +import { SessionStorageService } from '@ucap-webmessenger/web-storage'; +import { KEY_VER_INFO } from '@app/types/ver-info.type'; +import { LoginResponse } from '@ucap-webmessenger/protocol-authentication'; +import { MatMenuTrigger } from '@angular/material'; +import { FormGroup, FormBuilder } from '@angular/forms'; + +@Component({ + selector: 'app-layout-chat-left-sidenav-chat', + templateUrl: './chat.component.html', + styleUrls: ['./chat.component.scss'], + animations: ucapAnimations +}) +export class ChatComponent implements OnInit, OnDestroy { + @ViewChild('chatContextMenuTrigger', { static: true }) + chatContextMenuTrigger: MatMenuTrigger; + chatContextMenuPosition = { x: '0px', y: '0px' }; + + roomList: RoomInfo[]; + roomUserList: RoomUserDetailData[]; + roomUserShortList: RoomUserData[]; + sessionVerinfo: VersionInfo2Response; + + loginRes: LoginResponse; + loginResSubscription: Subscription; + roomSubscription: Subscription; + + isSearch = false; + searchRoomList: RoomInfo[] = []; + fgSearch: FormGroup; + recommendedWordList: string[]; + filteredRecommendedWordList: string[]; + + constructor( + private store: Store, + private formBuilder: FormBuilder, + private logger: NGXLogger, + private sessionStorageService: SessionStorageService + ) { + this.sessionVerinfo = this.sessionStorageService.get( + KEY_VER_INFO + ); + this.recommendedWordList = []; + } + + ngOnInit() { + this.fgSearch = this.formBuilder.group({ + searchInput: null + }); + + this.fgSearch + .get('searchInput') + .valueChanges.pipe(debounceTime(100)) + .subscribe(value => { + if (value !== null && value.length > 0) { + this.filteredRecommendedWordList = this.recommendedWordList.filter( + v => { + return v.includes(value); + } + ); + } else { + this.filteredRecommendedWordList = []; + } + }); + + this.roomSubscription = combineLatest([ + this.store.pipe( + select(AppStore.MessengerSelector.SyncSelector.selectAllRoom) + ), + this.store.pipe( + select(AppStore.MessengerSelector.SyncSelector.selectAllRoomUser) + ), + this.store.pipe( + select(AppStore.MessengerSelector.SyncSelector.selectAllRoomUserShort) + ) + ]) + .pipe( + tap(([room, roomUser, roomUserShort]) => { + this.roomList = room; + this.searchRoomList = room; + this.roomUserList = roomUser; + this.roomUserShortList = roomUserShort; + + const recommendedWordList = []; + for (const r of room) { + if (!!r.roomName && '' !== r.roomName.trim()) { + recommendedWordList.push(r.roomName); + } + } + for (const ru of roomUser) { + for (const u of ru.userInfos) { + if (u.seq !== this.loginRes.userSeq) { + if (!!u.name && '' !== u.name.trim()) { + recommendedWordList.push(u.name); + } + } + } + } + for (const ru of roomUserShort) { + for (const u of ru.userInfos) { + if (u.seq !== this.loginRes.userSeq) { + if (!!u.name && '' !== u.name.trim()) { + recommendedWordList.push(u.name); + } + } + } + } + + this.recommendedWordList = [...recommendedWordList]; + }) + ) + .subscribe(); + + this.loginResSubscription = this.store + .pipe( + select(AppStore.AccountSelector.AuthenticationSelector.loginRes), + tap(loginRes => { + this.loginRes = loginRes; + }) + ) + .subscribe(); + } + + ngOnDestroy(): void { + if (!!this.roomSubscription) { + this.roomSubscription.unsubscribe(); + } + if (!!this.loginResSubscription) { + this.loginResSubscription.unsubscribe(); + } + } + + onClickSearchCancel() { + this.isSearch = false; + this.searchRoomList = []; + this.filteredRecommendedWordList = []; + } + + onKeyDownEnter(event: KeyboardEvent, search: string) { + event.preventDefault(); + event.stopPropagation(); + + if (search.trim().length > 1) { + this.isSearch = true; + this.searchRoomList = this.roomList.filter(room => { + if (room.roomName.indexOf(search) >= 0) { + return true; + } else if ( + this.getRoomUserList(room).filter(user => + user.seq !== this.loginRes.userSeq + ? user.name.indexOf(search) >= 0 + : false + ).length > 0 + ) { + return true; + } else { + return false; + } + }); + } else { + this.isSearch = false; + this.searchRoomList = []; + } + setTimeout(() => (this.filteredRecommendedWordList = []), 200); + } + + onContextMenuChat(event: MouseEvent, roomInfo: RoomInfo) { + event.preventDefault(); + event.stopPropagation(); + + this.chatContextMenuPosition.x = event.clientX + 'px'; + this.chatContextMenuPosition.y = event.clientY + 'px'; + this.chatContextMenuTrigger.menu.focusFirstItem('mouse'); + this.chatContextMenuTrigger.menuData = { roomInfo }; + this.chatContextMenuTrigger.openMenu(); + } + + onSelectedRoom(roomInfo: RoomInfo) { + this.store.dispatch(ChatStore.selectedRoom({ roomSeq: roomInfo.roomSeq })); + } + onClickToggleAlarm(roomInfo: RoomInfo) { + this.store.dispatch(RoomStore.updateOnlyAlarm({ roomInfo })); + } + onClickExit(roomInfo: RoomInfo) { + this.store.dispatch( + RoomStore.exit({ + roomSeq: roomInfo.roomSeq + }) + ); + } + + getRoomUserList(roomInfo: RoomInfo): (RoomUserInfo | UserInfoShort)[] { + if (!!this.roomUserList && 0 < this.roomUserList.length) { + const i = this.roomUserList.findIndex( + value => roomInfo.roomSeq === value.roomSeq + ); + if (-1 < i) { + return this.roomUserList[i].userInfos; + } + } + + if (!!this.roomUserShortList && 0 < this.roomUserShortList.length) { + const i = this.roomUserShortList.findIndex( + value => roomInfo.roomSeq === value.roomSeq + ); + if (-1 < i) { + return this.roomUserShortList[i].userInfos; + } + } + } +} diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/group.component.html b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/group.component.html new file mode 100644 index 0000000..6cb7776 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/group.component.html @@ -0,0 +1,189 @@ +
+
+

그룹

+
+ +
+
+ + + + + + + + + +
+
+ + + + +
+
+
+ +
+
+ 검색결과({{ searchUserInfos.length }}명) +
+ + +
+ +
+ + + + + + + + + + + + + +
+ + + + + + + + + + diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/group.component.scss b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/group.component.scss new file mode 100644 index 0000000..966be1f --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/group.component.scss @@ -0,0 +1,39 @@ +@charset 'utf-8'; +.current-head { + display: flex; + justify-content: center; + padding: 0 10px; + height: 70px; + background-color: #eeeeee; + background: #f15f79; + background: -webkit-linear-gradient(to right, #352a37, #f15f79); + background: linear-gradient(to right, #352a37, #ef4c73); + color:#ffffff; + h3 { + display: inline-flex; + padding-left: 10px; + align-items: center; + } + .btn-box { + height: 100%; + margin-left: auto; + display: inline-flex; + align-items: center; + svg{ + stroke:#333333; + } + } +} +.search-result { + height: calc(100% - 130px); + overflow: auto; + .result-num { + padding: 10px; + display: flex; + height: 40px; + } +} +::ng-deep .mat-tab-body-content { + height: 100%; + overflow: unset; +} diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/group.component.spec.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/group.component.spec.ts new file mode 100644 index 0000000..12e9946 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/group.component.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { GroupComponent } from './group.component'; + +describe('Chat::LeftSidenav::GroupComponent', () => { + let component: GroupComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [GroupComponent] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(GroupComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/group.component.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/group.component.ts new file mode 100644 index 0000000..9f300c1 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/group.component.ts @@ -0,0 +1,427 @@ +import { MatMenuTrigger } from '@angular/material'; +import { + Component, + OnInit, + ViewChild, + OnDestroy, + EventEmitter, + Output +} from '@angular/core'; + +import { Observable, combineLatest, Subscription, of } from 'rxjs'; +import { map, tap, catchError, exhaustMap } from 'rxjs/operators'; +import { Store, select } from '@ngrx/store'; + +import * as AppStore from '@app/store'; +import * as ChatStore from '@app/store/messenger/chat'; +import * as SyncStore from '@app/store/messenger/sync'; +import * as StatusStore from '@app/store/messenger/status'; + +import { NGXLogger } from 'ngx-logger'; +import { Company } from '@ucap-webmessenger/api-external'; +import { SessionStorageService } from '@ucap-webmessenger/web-storage'; +import { VersionInfo2Response } from '@ucap-webmessenger/api-public'; +import { LoginInfo, KEY_LOGIN_INFO, UserSelectDialogType } from '@app/types'; +import { KEY_VER_INFO } from '@app/types/ver-info.type'; +import { ExpansionPanelComponent as GroupExpansionPanelComponent } from '@ucap-webmessenger/ui-group'; + +import { LoginResponse } from '@ucap-webmessenger/protocol-authentication'; +import { UserInfo, GroupDetailData } from '@ucap-webmessenger/protocol-sync'; +import { StatusProtocolService } from '@ucap-webmessenger/protocol-status'; +import { + DeptSearchType, + UserInfoSS, + UserInfoF, + UserInfoDN, + QueryProtocolService, + SSVC_TYPE_QUERY_DEPT_USER_DATA, + SSVC_TYPE_QUERY_DEPT_USER_RES, + DeptUserData +} from '@ucap-webmessenger/protocol-query'; + +import { + ucapAnimations, + DialogService, + ConfirmDialogData, + ConfirmDialogComponent, + ConfirmDialogResult +} from '@ucap-webmessenger/ui'; +import { + CreateChatDialogComponent, + CreateChatDialogData, + CreateChatDialogResult +} from './../../dialogs/chat/create-chat.dialog.component'; +import { + EditGroupDialogComponent, + EditGroupDialogData, + EditGroupDialogResult +} from '@app/layouts/messenger/dialogs/group/edit-group.dialog.component'; + +@Component({ + selector: 'app-layout-chat-left-sidenav-group', + templateUrl: './group.component.html', + styleUrls: ['./group.component.scss'], + animations: ucapAnimations +}) +export class GroupComponent implements OnInit, OnDestroy { + @Output() + newGroupAndMember = new EventEmitter(); + + @ViewChild('groupExpansionPanel', { static: true }) + groupExpansionPanel: GroupExpansionPanelComponent; + + @ViewChild('profileContextMenuTrigger', { static: true }) + profileContextMenuTrigger: MatMenuTrigger; + profileContextMenuPosition = { x: '0px', y: '0px' }; + + @ViewChild('groupContextMenuTrigger', { static: true }) + groupContextMenuTrigger: MatMenuTrigger; + groupContextMenuPosition = { x: '0px', y: '0px' }; + + groupBuddyList$: Observable< + { group: GroupDetailData; buddyList: UserInfo[] }[] + >; + favoritBuddyList$: Observable; + companyList$: Observable; + companyCode: string; + + loginRes: LoginResponse; + loginResSubscription: Subscription; + + sessionVerinfo: VersionInfo2Response; + + isShowSearch = false; + searchProcessing = false; + searchUserInfos: UserInfoSS[] = []; + + constructor( + private store: Store, + private sessionStorageService: SessionStorageService, + private dialogService: DialogService, + private queryProtocolService: QueryProtocolService, + private statusProtocolService: StatusProtocolService, + private logger: NGXLogger + ) {} + + ngOnInit() { + this.sessionVerinfo = this.sessionStorageService.get( + KEY_VER_INFO + ); + const loginInfo = this.sessionStorageService.get(KEY_LOGIN_INFO); + this.companyCode = loginInfo.companyCode; + + this.loginResSubscription = this.store + .pipe( + select(AppStore.AccountSelector.AuthenticationSelector.loginRes), + tap(loginRes => { + this.loginRes = loginRes; + }) + ) + .subscribe(); + + this.companyList$ = this.store.pipe( + select(AppStore.SettingSelector.CompanySelector.companyList) + ); + + this.groupBuddyList$ = combineLatest([ + this.store.pipe( + select(AppStore.MessengerSelector.SyncSelector.selectAllBuddy2) + ), + this.store.pipe( + select(AppStore.MessengerSelector.SyncSelector.selectAllGroup2) + ) + ]).pipe( + map(([buddyList, groupList]) => { + const groupBuddyList: { + group: GroupDetailData; + buddyList: UserInfo[]; + }[] = []; + for (const group of groupList) { + groupBuddyList.push({ + group, + buddyList: buddyList.filter(buddy => { + return group.userSeqs.indexOf(buddy.seq) > -1; + }) + }); + } + + return groupBuddyList; + }) + ); + + this.favoritBuddyList$ = this.store + .pipe(select(AppStore.MessengerSelector.SyncSelector.selectAllBuddy2)) + .pipe( + map(buddyInfoList => { + return buddyInfoList + .filter(buddy => buddy.isFavorit) + .sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0)); + }) + ); + } + + ngOnDestroy(): void { + this.logger.debug('ngOnDestroy'); + if (!!this.loginResSubscription) { + this.loginResSubscription.unsubscribe(); + } + } + + async onClickGroupMenu(menuType: string) { + this.logger.debug('menuType', menuType); + switch (menuType) { + case 'GROUP_NEW': + { + this.newGroupAndMember.emit(); + } + break; + case 'GROUP_EXPAND_MORE': + { + this.groupExpansionPanel.expandMore(); + } + break; + case 'GROUP_EXPAND_LESS': + { + this.groupExpansionPanel.expandLess(); + } + break; + case 'GROUP_SAVE': + break; + case 'GROUP_RESTORE': + break; + + default: + break; + } + } + + onSelectBuddy(buddy: UserInfo) { + this.logger.debug('onSelectBuddy', buddy); + if (buddy.seq === this.loginRes.userSeq) { + this.store.dispatch( + ChatStore.openRoom({ userSeqList: [this.loginRes.talkWithMeBotSeq] }) + ); + } else { + this.store.dispatch(ChatStore.openRoom({ userSeqList: [buddy.seq] })); + } + } + + getStatusBulkInfo(buddy: UserInfo) { + return this.store.pipe( + select( + AppStore.MessengerSelector.StatusSelector.selectEntitiesStatusBulkInfo + ), + map(statusBulkInfo => + !!statusBulkInfo ? statusBulkInfo[buddy.seq] : undefined + ) + ); + } + + /** 유저검색 */ + onKeyDownEnterOrganizationTenantSearch(params: { + companyCode: string; + searchWord: string; + }) { + if (params.searchWord.trim().length > 1) { + this.isShowSearch = true; + this.searchProcessing = true; + + const searchUserInfos: UserInfoSS[] = []; + this.queryProtocolService + .deptUser({ + divCd: 'GRP', + companyCode: params.companyCode, + searchRange: DeptSearchType.All, + search: params.searchWord, + senderCompanyCode: params.companyCode, + senderEmployeeType: this.loginRes.userInfo.employeeType + }) + .pipe( + map(res => { + switch (res.SSVC_TYPE) { + case SSVC_TYPE_QUERY_DEPT_USER_DATA: + searchUserInfos.push(...(res as DeptUserData).userInfos); + break; + case SSVC_TYPE_QUERY_DEPT_USER_RES: + { + // 검색 결과 처리. + this.searchUserInfos = searchUserInfos; + this.searchProcessing = false; + + // 검색 결과에 따른 프레즌스 조회. + const userSeqList: number[] = []; + this.searchUserInfos.map(user => userSeqList.push(user.seq)); + if (userSeqList.length > 0) { + this.store.dispatch( + StatusStore.bulkInfo({ + divCd: 'groupSrch', + userSeqs: userSeqList + }) + ); + } + } + break; + } + }), + catchError(error => { + this.searchProcessing = false; + return of(this.logger.error(error)); + }) + ) + .subscribe(); + } + } + /** 검색 취소 */ + onClickCancel() { + this.isShowSearch = false; + this.searchUserInfos = []; + } + + getShowContextMenu(userInfo: UserInfo | UserInfoF) { + if (userInfo.seq === this.loginRes.userSeq) { + return false; + } else { + return true; + } + } + onClickProfileContextMenu(menuType: string, userInfo: UserInfo | UserInfoF) { + this.logger.debug( + 'onClickProfileContextMenu', + 'menuType', + menuType, + 'userInfo', + userInfo + ); + switch (menuType) { + case 'REGISTER_FAVORITE': + this.store.dispatch( + SyncStore.updateBuddy({ + seq: userInfo.seq, + isFavorit: !userInfo.isFavorit + }) + ); + break; + } + } + + onContextMenuProfile( + event: MouseEvent, + userInfo: UserInfo | UserInfoSS | UserInfoF | UserInfoDN + ) { + event.preventDefault(); + event.stopPropagation(); + + this.profileContextMenuPosition.x = event.clientX + 'px'; + this.profileContextMenuPosition.y = event.clientY + 'px'; + this.profileContextMenuTrigger.menu.focusFirstItem('mouse'); + this.profileContextMenuTrigger.menuData = { userInfo }; + this.profileContextMenuTrigger.openMenu(); + } + + async onClickGroupContextMenu(menuType: string, group: GroupDetailData) { + this.logger.debug( + 'onClickGroupContextMenu', + 'menuType', + menuType, + 'group', + group + ); + switch (menuType) { + case 'CHAT': + this.store.dispatch( + ChatStore.openRoom({ userSeqList: group.userSeqs }) + ); + break; + case 'SEND_NOTE': + break; + case 'RENAME': + { + const result = await this.dialogService.open< + EditGroupDialogComponent, + EditGroupDialogData, + EditGroupDialogResult + >(EditGroupDialogComponent, { + data: { + title: 'Group Name Edit', + group + } + }); + + if (!!result && !!result.choice && result.choice) { + if (!!result.groupName && result.groupName.trim().length > 0) { + this.store.dispatch( + SyncStore.updateGroup({ + groupSeq: result.group.seq, + groupName: result.groupName, + userSeqs: result.group.userSeqs + }) + ); + } + } + } + break; + case 'EDIT_MEMBER': + { + const result = await this.dialogService.open< + CreateChatDialogComponent, + CreateChatDialogData, + CreateChatDialogResult + >(CreateChatDialogComponent, { + width: '600px', + data: { + type: UserSelectDialogType.EditMember, + title: 'Group Member Edit', + group + } + }); + + if (!!result && !!result.choice && result.choice) { + if (!!result.oldGroup) { + const userSeqs: number[] = []; + result.selectedUserList.map(user => userSeqs.push(user.seq)); + + this.store.dispatch( + SyncStore.updateGroupMember({ + oldGroup: group, + trgtUserSeq: userSeqs + }) + ); + } + } + } + break; + case 'DELETE': + { + const result = await this.dialogService.open< + ConfirmDialogComponent, + ConfirmDialogData, + ConfirmDialogResult + >(ConfirmDialogComponent, { + width: '360px', + data: { + title: 'Delete group', + html: `그룹(${group.name})을 삭제하시겠습니까?
그룹 멤버는 해당 그룹에서만 삭제됩니다.` + } + }); + + if (!!result && !!result.choice && result.choice) { + this.store.dispatch(SyncStore.delGroup({ group })); + } + } + break; + default: + break; + } + } + + onMoreGroup(params: { event: MouseEvent; group: GroupDetailData }) { + params.event.preventDefault(); + params.event.stopPropagation(); + + this.groupContextMenuPosition.x = params.event.clientX + 'px'; + this.groupContextMenuPosition.y = params.event.clientY + 'px'; + this.groupContextMenuTrigger.menu.focusFirstItem('mouse'); + this.groupContextMenuTrigger.menuData = { group: params.group }; + this.groupContextMenuTrigger.openMenu(); + } +} diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/index.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/index.ts new file mode 100644 index 0000000..e957286 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/index.ts @@ -0,0 +1,11 @@ +import { CallComponent } from './call.component'; +import { ChatComponent } from './chat.component'; +import { GroupComponent } from './group.component'; +import { OrganizationComponent } from './organization.component'; + +export const LEFT_SIDENAV_COMPONENTS = [ + CallComponent, + ChatComponent, + GroupComponent, + OrganizationComponent +]; diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/organization.component.html b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/organization.component.html new file mode 100644 index 0000000..9481b09 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/organization.component.html @@ -0,0 +1,92 @@ +
+
+ +
+
+
+
+ {{ getSelectedDepartmentName() }} +
+
+ + +
+
+
+ +
+
+ + + Loading... + + + +
+
+
+ + +
    +
  • + +
  • +
  • + +
  • +
  • + +
  • +
+
+
diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/organization.component.scss b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/organization.component.scss new file mode 100644 index 0000000..500d4c3 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/organization.component.scss @@ -0,0 +1,120 @@ +@charset 'utf-8'; + +@mixin ellipsis($row) { + overflow: hidden; + text-overflow: ellipsis; + @if $row == 1 { + display: block; + white-space: nowrap; + word-wrap: normal; + } @else if $row >= 2 { + display: -webkit-box; + -webkit-line-clamp: $row; + -webkit-box-orient: vertical; + word-wrap: break-word; + } +} + + +.oraganization-tab { + height: 100%; + flex-direction: inherit; + display: flex; + .oraganization-tab-tree { + height:40%; + overflow-y: auto; + } +} + +//팝업에 있는 조직도 +.mat-card-content{ + .mat-tab-body-content{ + .oraganization-box{ + .oraganization-tab { + height: 80%; + flex-direction: row; + } + } + } +} + +.select-list{ + height:60%; + border-top:1px solid #dddddd; + .select-dept{ + padding:0 20px; + height:40px; + line-height:40px; + display:flex; + background-color: #f9f9f9; + dt{ + + } + dd{ + margin-left:auto; + } + } + .search-list{ + height: calc(100% - 40px); + overflow: auto; + .list-item{ + height:70px; + } + } +} +.btn-box{ + padding:10px; + button{ + width:100%; + @include ellipsis(1); + } + ul{ + display:flex; + flex-flow: row; + align-content: space-between; + margin-top:4px; + li{ + display:inline-flex; + align-items: center; + flex-grow: 1; + width:33%; + margin-right: 4px; + &:last-child{ + margin-right: 0; + } + button{ + text-align:center; + width:100%; + height:100%; + padding: 0 6px; + } + } + } + } + + +.dialog-org { + .oraganization-tab { + width: 100%; + height:380px; + border-bottom: 1px solid #dddddd; + position: relative; + .oraganization-tab-tree { + display: inline-flex; + width: 50%; + height:100%; + border-right: 1px solid #dddddd; + overflow: auto; + } + .select-list { + display: inline-flex; + flex-direction: column; + width: 50%; + height:100%; + overflow: auto; + .search-list { + overflow: auto; + } + } + } +} \ No newline at end of file diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/organization.component.spec.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/organization.component.spec.ts new file mode 100644 index 0000000..01b3330 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/organization.component.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { OrganizationComponent } from './organization.component'; + +describe('Chat::LeftSidenav::OrganizationComponent', () => { + let component: OrganizationComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [OrganizationComponent] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OrganizationComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/organization.component.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/organization.component.ts new file mode 100644 index 0000000..e3fa938 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/organization.component.ts @@ -0,0 +1,290 @@ +import { + Component, + OnInit, + OnDestroy, + Output, + EventEmitter, + Input +} from '@angular/core'; +import { ucapAnimations, DialogService } from '@ucap-webmessenger/ui'; +import { Observable, Subscription } from 'rxjs'; +import { + DeptInfo, + QueryProtocolService, + DeptSearchType, + UserInfoSS, + DeptUserResponse, + UserInfoF, + UserInfoDN +} from '@ucap-webmessenger/protocol-query'; +import { UserInfo, GroupDetailData } from '@ucap-webmessenger/protocol-sync'; +import { Store, select } from '@ngrx/store'; +import { NGXLogger } from 'ngx-logger'; + +import * as AppStore from '@app/store'; +import * as QueryStore from '@app/store/messenger/query'; +import * as SyncStore from '@app/store/messenger/sync'; +import * as ChatStore from '@app/store/messenger/chat'; +import { SessionStorageService } from '@ucap-webmessenger/web-storage'; +import { LoginInfo, KEY_LOGIN_INFO } from '@app/types'; +import { take, map, tap, delay } from 'rxjs/operators'; +import { VersionInfo2Response } from '@ucap-webmessenger/api-public'; +import { KEY_VER_INFO } from '@app/types/ver-info.type'; +import { + SelectGroupDialogComponent, + SelectGroupDialogData, + SelectGroupDialogResult +} from '../../dialogs/group/select-group.dialog.component'; +import { LoginResponse } from '@ucap-webmessenger/protocol-authentication'; + +@Component({ + selector: 'app-layout-chat-left-sidenav-organization', + templateUrl: './organization.component.html', + styleUrls: ['./organization.component.scss'], + animations: ucapAnimations +}) +export class OrganizationComponent implements OnInit, OnDestroy { + @Input() + /** 사용자 선택용으로 사용시 true 로 유입 */ + isUserSelect = false; + @Input() + /** 선택된 사용자의 리스트 */ + selectedUserList?: (UserInfo | UserInfoSS | UserInfoF | UserInfoDN)[] = []; + + @Output() + checkUser = new EventEmitter<{ + isChecked: boolean; + userInfo: UserInfo | UserInfoSS | UserInfoF | UserInfoDN; + }>(); + @Output() + checkAllUser = new EventEmitter<{ + isChecked: boolean; + userInfos: (UserInfo | UserInfoSS | UserInfoF | UserInfoDN)[]; + }>(); + + departmentInfoList$: Observable; + selectedDepartmentUserInfoList$: Observable; + selectedDepartmentUserInfoList: UserInfoSS[] = []; + selectedDepartmentUserInfoListSubscription: Subscription; + selectedDepartmentStatus$: Observable; + selectedDepartmentProcessing = false; + selectedDepartmentProcessingSubscription: Subscription; + selectedDepartmentName: string; + + loginInfo: LoginInfo; + loginRes: LoginResponse; + sessionVerinfo: VersionInfo2Response; + + constructor( + private store: Store, + private sessionStorageService: SessionStorageService, + private dialogService: DialogService, + private logger: NGXLogger + ) { + this.loginInfo = this.sessionStorageService.get(KEY_LOGIN_INFO); + this.sessionVerinfo = this.sessionStorageService.get( + KEY_VER_INFO + ); + } + + ngOnInit() { + this.departmentInfoList$ = this.store.pipe( + select(AppStore.MessengerSelector.QuerySelector.departmentInfoList) + ); + + this.selectedDepartmentProcessingSubscription = this.store + .pipe( + delay(0), + select( + AppStore.MessengerSelector.QuerySelector.selectedDepartmentProcessing + ), + tap(processing => { + this.selectedDepartmentProcessing = processing; + }) + ) + .subscribe(); + + this.selectedDepartmentUserInfoListSubscription = this.store + .pipe( + select( + AppStore.MessengerSelector.QuerySelector + .selectedDepartmentUserInfoList + ), + map(list => { + this.selectedDepartmentUserInfoList = list; + }) + ) + .subscribe(); + + this.selectedDepartmentStatus$ = this.store.pipe( + select(AppStore.MessengerSelector.QuerySelector.selectedDepartmentStatus) + ); + + this.store + .pipe( + take(1), + select(AppStore.AccountSelector.AuthenticationSelector.loginRes), + map(loginRes => { + this.store.dispatch( + QueryStore.deptUser({ + divCd: 'ORG', + companyCode: this.loginInfo.companyCode, + seq: loginRes.departmentCode, + search: '', + searchRange: DeptSearchType.All, + senderCompanyCode: this.loginInfo.companyCode, + senderEmployeeType: loginRes.userInfo.employeeType + }) + ); + return loginRes; + }), + map(loginRes => { + this.loginRes = loginRes; + this.selectedDepartmentName = loginRes.userInfo.deptName; + }) + ) + .subscribe(); + } + + ngOnDestroy(): void { + if (!!this.selectedDepartmentUserInfoListSubscription) { + this.selectedDepartmentUserInfoListSubscription.unsubscribe(); + } + if (!!this.selectedDepartmentProcessingSubscription) { + this.selectedDepartmentProcessingSubscription.unsubscribe(); + } + } + + onSelectedOrganization(deptInfo: DeptInfo) { + this.store + .pipe( + take(1), + select(AppStore.AccountSelector.AuthenticationSelector.loginRes), + map(loginRes => { + this.store.dispatch( + QueryStore.deptUser({ + divCd: 'ORG', + companyCode: this.loginInfo.companyCode, + seq: deptInfo.seq, + search: '', + searchRange: DeptSearchType.All, + senderCompanyCode: this.loginInfo.companyCode, + senderEmployeeType: loginRes.userInfo.employeeType + }) + ); + }), + map(() => { + this.selectedDepartmentName = deptInfo.name; + }) + ) + .subscribe(); + } + + getSelectedDepartmentName() { + if (!!this.selectedDepartmentProcessing) { + return '부서조회중..'; + } + + if (!!this.selectedDepartmentName) { + return this.selectedDepartmentName; + } else { + return '조회중..'; + } + } + + /** 전체 체크여부 */ + getCheckedAllUser() { + if ( + !this.selectedDepartmentUserInfoList || + this.selectedDepartmentUserInfoList.length === 0 || + this.selectedDepartmentUserInfoList.filter( + item => + !( + this.selectedUserList.filter(user => user.seq === item.seq).length > + 0 + ) + ).length > 0 + ) { + return false; + } else { + return true; + } + } + /** 리스트 checkable 할 경우 checkbox 의 isChecked 를 관장하며 리스트의 전체선택 여부를 판단한다. */ + getCheckedUser(userInfo: UserInfo | UserInfoSS | UserInfoF | UserInfoDN) { + if (!!this.selectedUserList && this.selectedUserList.length > 0) { + return ( + this.selectedUserList.filter(item => item.seq === userInfo.seq).length > + 0 + ); + } + return false; + } + + /** 전체선택 이벤트 */ + onCheckAllUser(value: boolean) { + this.checkAllUser.emit({ + isChecked: value, + userInfos: this.selectedDepartmentUserInfoList + }); + } + + /** 리스트가 checkable 할 경우 checkbox 의 change 이벤트를 상위 컴포넌트로 전달한다. */ + onCheckUser(params: { + isChecked: boolean; + userInfo: UserInfo | UserInfoSS | UserInfoF | UserInfoDN; + }) { + this.checkUser.emit(params); + } + + onClickShowSelectedUserList() { + this.logger.debug('onClickShowSelectedUserList', this.selectedUserList); + } + + async onClickAddGroup() { + this.logger.debug('onClickAddGroup', this.selectedUserList); + + const result = await this.dialogService.open< + SelectGroupDialogComponent, + SelectGroupDialogData, + SelectGroupDialogResult + >(SelectGroupDialogComponent, { + width: '600px', + data: { + title: 'Group Select' + } + }); + + if (!!result && !!result.choice && result.choice) { + if (!!result.group) { + const oldGroup: GroupDetailData = result.group; + const trgtUserSeq: number[] = []; + result.group.userSeqs.map(seq => trgtUserSeq.push(seq)); + this.selectedUserList + .filter(v => result.group.userSeqs.indexOf(v.seq) < 0) + .forEach(user => { + trgtUserSeq.push(user.seq); + }); + + this.store.dispatch( + SyncStore.updateGroupMember({ + oldGroup, + trgtUserSeq + }) + ); + + this.selectedUserList = []; + } + } + } + onClickChatOpen() { + if (!!this.selectedUserList && this.selectedUserList.length > 0) { + const seq: number[] = []; + this.selectedUserList.map(user => seq.push(user.seq)); + this.store.dispatch(ChatStore.openRoom({ userSeqList: seq })); + } + } + onClickConference() { + this.logger.debug('onClickConference', this.selectedUserList); + } +} diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.html b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.html new file mode 100644 index 0000000..2689442 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.html @@ -0,0 +1,208 @@ + +
+ + +
+
+ + + + +
+
+

+ {{ getRoomName() }} +

+ +
+ {{ getConvertTimer(roomInfo.timeRoomInterval) }} 비밀 대화방입니다. +
+ +
+
+ + + + + + + + + +
+
+
+ + + +
+ + + + + + +
+ +
+
+ + + +
+ + + +
+ +
+ + +
+ + + + + + + + + + + diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.scss b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.scss new file mode 100644 index 0000000..e8dada5 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.scss @@ -0,0 +1,114 @@ +@charset 'utf-s'; +:host { + display: flex; + width: 100%; + height: 100%; +} +@mixin ellipsis($row) { + overflow: hidden; + text-overflow: ellipsis; + @if $row == 1 { + display: block; + white-space: nowrap; + word-wrap: normal; + } @else if $row >= 2 { + display: -webkit-box; + -webkit-line-clamp: $row; + -webkit-box-orient: vertical; + word-wrap: break-word; + } +} +.container { + position: relative; + width: 100%; +} +.chat-toolbar { + width: 100%; + height: 80px; + min-height: 70px; + align-items: center; + background-color: #ffffff !important; + border-bottom: 1px solid #dddddd; + box-shadow: 0 3px 6px rgba(0,0,0,.16); + .chat-header { + width: 100%; + align-items: center; + display: flex; + justify-content: space-between; + .profile-img { + margin-right: 16px; + .responsive-chats-button { + display: none; + &:last-child { + display: block; + padding: 0; + width: 40px; + height: 40px; + border-radius: 50%; + background-color: #604850; + color: #efefef; + font-size: 16px; + line-height: 40px; + } + } + } + .room-info { + display: flex; + flex-flow: column; + overflow: hidden; + .room-name { + font-size: 16px; + line-height: normal; + @include ellipsis(1); + } + .room-type { + font-size: 14px; + line-height: normal; + margin-top: 6px; + height: 20px; + span { + border-radius: 10px; + padding: 1px 10px; + margin-right: 6px; + font-size: 13px; + } + } + } + .room-option { + margin-left: auto; + } + } +} +.chat-content { + position: relative; + background: transparent; + overflow: auto; + -webkit-overflow-scrolling: touch; + + .file-drop-zone-container { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: transparent; + + .file-drop-zone { + position: absolute; + background-color: rgb(180, 180, 180); + + top: calc(100% - 200px); + left: 20%; + width: 60%; + height: 200px; + } + } +} + +::ng-deep .chat-snackbar-class { + .mat-simple-snackbar { + span { + @include ellipsis(1); + } + } +} diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.spec.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.spec.ts new file mode 100644 index 0000000..cf72b7b --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { MessagesComponent } from './messages.component'; + +describe('App::Layout::Messenger::MessagesComponent', () => { + let component: MessagesComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [MessagesComponent] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MessagesComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.ts new file mode 100644 index 0000000..13066a1 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.ts @@ -0,0 +1,893 @@ +import { + Component, + OnInit, + OnDestroy, + ViewChild, + ElementRef, + AfterViewInit +} from '@angular/core'; +import { + ucapAnimations, + SnackBarService, + ClipboardService, + DialogService, + ConfirmDialogComponent, + ConfirmDialogData, + ConfirmDialogResult, + AlertDialogComponent, + AlertDialogData, + AlertDialogResult, + FileUploadQueueComponent, + StringUtil +} from '@ucap-webmessenger/ui'; +import { Store, select } from '@ngrx/store'; +import { NGXLogger } from 'ngx-logger'; +import { Observable, Subscription, forkJoin, of } from 'rxjs'; +import { + Info, + EventType, + isRecalled, + isCopyable, + isRecallable, + InfoResponse, + EventJson, + FileEventJson +} from '@ucap-webmessenger/protocol-event'; + +import * as AppStore from '@app/store'; +import * as EventStore from '@app/store/messenger/event'; +import * as ChatStore from '@app/store/messenger/chat'; +import * as RoomStore from '@app/store/messenger/room'; +import { LoginResponse } from '@ucap-webmessenger/protocol-authentication'; +import { SessionStorageService } from '@ucap-webmessenger/web-storage'; +import { + EnvironmentsInfo, + KEY_ENVIRONMENTS_INFO, + UserSelectDialogType +} from '@app/types'; +import { RoomInfo, UserInfo, RoomType } from '@ucap-webmessenger/protocol-room'; +import { tap, take, map, catchError } from 'rxjs/operators'; +import { + FileInfo, + FormComponent as UCapUiChatFormComponent +} from '@ucap-webmessenger/ui-chat'; +import { KEY_VER_INFO } from '@app/types/ver-info.type'; +import { VersionInfo2Response } from '@ucap-webmessenger/api-public'; +import { + MatMenuTrigger, + MatSnackBarRef, + SimpleSnackBar +} from '@angular/material'; +import { + CommonApiService, + FileUploadItem, + FileTalkSaveRequest, + FileTalkSaveResponse +} from '@ucap-webmessenger/api-common'; +import { + CreateChatDialogComponent, + CreateChatDialogData, + CreateChatDialogResult +} from '../dialogs/chat/create-chat.dialog.component'; +import { + FileViewerDialogComponent, + FileViewerDialogData, + FileViewerDialogResult +} from '@app/layouts/common/dialogs/file-viewer.dialog.component'; +import { CONST, FileUtil } from '@ucap-webmessenger/core'; +import { PerfectScrollbarComponent } from 'ngx-perfect-scrollbar'; +import { StatusCode } from '@ucap-webmessenger/api'; +import { + EditChatRoomDialogComponent, + EditChatRoomDialogResult, + EditChatRoomDialogData +} from '../dialogs/chat/edit-chat-room.dialog.component'; + +@Component({ + selector: 'app-layout-messenger-messages', + templateUrl: './messages.component.html', + styleUrls: ['./messages.component.scss'], + animations: ucapAnimations +}) +export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit { + @ViewChild('messageBoxContainer', { static: true }) + private messageBoxContainer: ElementRef; + + @ViewChild('chatForm', { static: false }) + private chatForm: UCapUiChatFormComponent; + + @ViewChild('messageContextMenuTrigger', { static: true }) + messageContextMenuTrigger: MatMenuTrigger; + messageContextMenuPosition = { x: '0px', y: '0px' }; + + @ViewChild('psChatContent', { static: true }) + psChatContent: PerfectScrollbarComponent; + + @ViewChild('fileUploadQueue', { static: true }) + fileUploadQueue: FileUploadQueueComponent; + + environmentsInfo: EnvironmentsInfo; + + loginRes: LoginResponse; + loginResSubscription: Subscription; + eventList: Info[]; + eventListNew: Info[]; + eventListSubscription: Subscription; + baseEventSeq = 0; + roomInfo: RoomInfo; + roomInfoSubscription: Subscription; + userInfoList: UserInfo[]; + userInfoListSubscription: Subscription; + eventListProcessing$: Observable; + eventInfoStatus$: Observable; + sessionVerInfo: VersionInfo2Response; + + eventRemain$: Observable; + eventRemain = false; // 이전대화가 남아 있는지 여부 + eventMorePosition = 0; // 이전대화를 불러올 경우 현재 스크롤 포지션 유지를 위한 값. 0 이면 초기로딩. + scrollUpinit = false; // ps 에서 초기 로딩시 scroll reach start 이벤트 발생 버그를 우회하기 위한 init 값으로 scrollUp 에 의해 true 로 된다. + + isRecalledMessage = isRecalled; + isCopyableMessage = isCopyable; + isRecallableMessage = isRecallable; + + /** Timer 대화방의 대화 삭제를 위한 interval */ + interval: any; + + snackBarPreviewEvent: MatSnackBarRef; + + constructor( + private store: Store, + private sessionStorageService: SessionStorageService, + private commonApiService: CommonApiService, + private clipboardService: ClipboardService, + private dialogService: DialogService, + private snackBarService: SnackBarService, + private logger: NGXLogger + ) { + this.sessionVerInfo = this.sessionStorageService.get( + KEY_VER_INFO + ); + + this.environmentsInfo = this.sessionStorageService.get( + KEY_ENVIRONMENTS_INFO + ); + } + + setEventMoreInit() { + // 방정보가 바뀌면 이전대화 보기 관련 값들을 초기화 한다. + this.scrollUpinit = false; + this.eventMorePosition = 0; + } + + ngOnInit() { + this.loginResSubscription = this.store + .pipe( + select(AppStore.AccountSelector.AuthenticationSelector.loginRes), + tap(loginRes => { + this.loginRes = loginRes; + }) + ) + .subscribe(); + + this.roomInfoSubscription = this.store + .pipe( + select(AppStore.MessengerSelector.RoomSelector.roomInfo), + tap(roomInfo => { + this.roomInfo = roomInfo; + + this.setEventMoreInit(); + }) + ) + .subscribe(); + + this.userInfoListSubscription = this.store + .pipe( + select(AppStore.MessengerSelector.RoomSelector.selectUserinfolist), + tap(userInfoList => { + this.userInfoList = userInfoList; + }) + ) + .subscribe(); + + this.eventListProcessing$ = this.store.pipe( + select(AppStore.MessengerSelector.EventSelector.infoListProcessing) + ); + + this.eventRemain$ = this.store.pipe( + select(AppStore.MessengerSelector.EventSelector.remainInfo), + tap(remainInfo => { + this.eventRemain = remainInfo; + }) + ); + + this.eventListSubscription = this.store + .pipe( + select(AppStore.MessengerSelector.EventSelector.selectAllInfoList), + tap(infoList => { + if (!!this.eventList && this.eventList.length > 0) { + this.eventListNew = infoList.filter(info => { + if (info.seq <= this.eventList[this.eventList.length - 1].seq) { + return false; + } + return true; + }); + } + this.eventList = infoList; + + if (!!infoList && infoList.length > 0) { + this.baseEventSeq = infoList[0].seq; + this.readyToReply(); + } + }) + ) + .subscribe(); + + this.eventInfoStatus$ = this.store.pipe( + select(AppStore.MessengerSelector.EventSelector.infoStatus) + ); + + this.interval = setInterval(() => { + if (!!this.roomInfo && !!this.roomInfo.isTimeRoom) { + this.store.dispatch(EventStore.infoIntervalClear({})); + } + }, 1000); + } + + ngOnDestroy(): void { + if (!!this.loginResSubscription) { + this.loginResSubscription.unsubscribe(); + } + if (!!this.roomInfoSubscription) { + this.roomInfoSubscription.unsubscribe(); + } + if (!!this.userInfoListSubscription) { + this.userInfoListSubscription.unsubscribe(); + } + if (!!this.eventListSubscription) { + this.eventListSubscription.unsubscribe(); + } + + clearInterval(this.interval); + } + + ngAfterViewInit(): void { + // this.readyToReply(); + } + + getRoomName() { + if (!this.roomInfo || !this.userInfoList) { + return '대화방명을 가져오고 있습니다..'; + } + + switch (this.roomInfo.roomType) { + case RoomType.Mytalk: + return 'MyTalk'; + case RoomType.Bot: + case RoomType.Allim: + return this.userInfoList + .filter(user => user.seq !== this.loginRes.userSeq) + .map(user => user.name); + } + + if (!!this.roomInfo.roomName && '' !== this.roomInfo.roomName.trim()) { + return this.roomInfo.roomName; + } else { + return this.userInfoList + .filter(user => { + if (this.roomInfo.roomType === RoomType.Single) { + return user.seq !== this.loginRes.userSeq; + } else { + return true; + } + }) + .sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0)) + .map(user => user.name) + .join(','); + } + } + + /** 대화전송 가능한 방인지 판단 */ + getEnableSend() { + if (!this.roomInfo) { + return false; + } + + if ( + this.roomInfo.roomType === RoomType.Bot || + this.roomInfo.roomType === RoomType.Allim || + this.roomInfo.roomType === RoomType.Link + ) { + return false; + } + + return true; + } + + getConvertTimer(timerInterval: number, unit: number = 1) { + if (timerInterval >= 0 && timerInterval < 60 * unit) { + return Math.floor((timerInterval / 1) * unit) + ' 초'; + } else if (timerInterval >= 60 * unit && timerInterval < 3600 * unit) { + return Math.floor(((timerInterval / 1) * unit) / 60) + ' 분'; + } else if (timerInterval >= 3600 * unit && timerInterval <= 86400 * unit) { + return Math.floor(((timerInterval / 1) * unit) / 60 / 60) + ' 시간'; + } else { + return ''; + } + } + + readyToReply(): void { + setTimeout(() => { + this.focusReplyInput(); + this.scrollToBottom(); + }); + } + + focusReplyInput(): void { + setTimeout(() => { + if (!!this.chatForm) { + this.chatForm.focus(); + } + }); + } + + /** Scroll Handler */ + scrollToBottom(speed?: number): void { + if (this.eventMorePosition > 0) { + if (this.psChatContent.directiveRef) { + this.psChatContent.directiveRef.update(); + + setTimeout(() => { + this.psChatContent.directiveRef.scrollToTop( + this.psChatContent.directiveRef.elementRef.nativeElement + .scrollHeight - this.eventMorePosition, + speed + ); + + this.eventMorePosition = 0; + }); + } + } else if (this.scrollUpinit) { + if (!!this.eventListNew && this.eventListNew.length > 0) { + let message = ''; + const info = this.eventListNew[this.eventListNew.length - 1]; + const senderUser = this.userInfoList.filter( + user => user.seq === info.senderSeq + ); + if (!!senderUser && senderUser.length > 0) { + message += `${senderUser[0].name} : `; + } + message += StringUtil.convertFinalEventMessage( + info.type, + info.sentMessageJson || info.sentMessage + ); + + this.snackBarPreviewEvent = this.snackBarService.open(message, 'GO', { + // duration: 3000, + verticalPosition: 'bottom', + horizontalPosition: 'center', + panelClass: ['chat-snackbar-class'] + }); + this.snackBarPreviewEvent.onAction().subscribe(() => { + this.setEventMoreInit(); + this.scrollToBottom(); + this.snackBarPreviewEvent.dismiss(); + }); + } + } else { + speed = speed || 0; + if (this.psChatContent.directiveRef) { + this.psChatContent.directiveRef.update(); + + setTimeout(() => { + this.psChatContent.directiveRef.scrollToBottom(0, speed); + }); + } + } + } + onScrollup(event: any) { + this.scrollUpinit = true; + } + onScrollReachStart(event: any) { + this.onMoreEvent(this.baseEventSeq); + } + onScrollReachEnd(event: any) { + this.setEventMoreInit(); + if (!!this.snackBarPreviewEvent) { + this.snackBarPreviewEvent.dismiss(); + } + } + + /** More Event */ + onMoreEvent(seq: number) { + if (this.scrollUpinit && this.eventRemain) { + this.eventMorePosition = this.psChatContent.directiveRef.elementRef.nativeElement.scrollHeight; + + this.store.dispatch( + EventStore.info({ + roomSeq: this.roomInfo.roomSeq, + baseSeq: seq, + requestCount: CONST.EVENT_INFO_READ_COUNT + }) + ); + } + } + + async onSendMessage(message: string) { + this.setEventMoreInit(); + + if (!message || message.trim().length === 0) { + const result = await this.dialogService.open< + AlertDialogComponent, + AlertDialogData, + AlertDialogResult + >(AlertDialogComponent, { + width: '360px', + data: { + title: 'Alert', + message: `대화내용을 입력해주세요.` + } + }); + return; + } + + if (message.trim().length > CONST.MASSTEXT_LEN) { + // MASS TEXT + this.store.dispatch( + EventStore.sendMass({ + senderSeq: this.loginRes.userSeq, + req: { + roomSeq: this.roomInfo.roomSeq, + eventType: EventType.MassText, + // sentMessage: message.replace(/\n/gi, '\r\n') + sentMessage: message + } + }) + ); + } else { + this.store.dispatch( + EventStore.send({ + senderSeq: this.loginRes.userSeq, + req: { + roomSeq: this.roomInfo.roomSeq, + eventType: EventType.Character, + sentMessage: message + } + }) + ); + } + } + + onClickReceiveAlarm() { + this.store.dispatch(RoomStore.updateOnlyAlarm({ roomInfo: this.roomInfo })); + } + + /** MassText Detail View */ + onMassDetail(value: number) { + this.store.dispatch( + ChatStore.selectedMassDetail({ + massEventSeq: value + }) + ); + } + + async onFileViewer(fileInfo: FileEventJson) { + this.logger.debug('onFileViewer', fileInfo); + const result = await this.dialogService.open< + FileViewerDialogComponent, + FileViewerDialogData, + FileViewerDialogResult + >(FileViewerDialogComponent, { + position: { + top: '30px' + }, + maxWidth: '100vw', + maxHeight: '100vh', + height: 'calc(100% - 30px)', + width: '100%', + hasBackdrop: false, + panelClass: 'app-dialog-full', + data: { + fileInfo, + downloadUrl: this.sessionVerInfo.downloadUrl, + deviceType: this.environmentsInfo.deviceType, + token: this.loginRes.tokenString, + userSeq: this.loginRes.userSeq + } + }); + } + + /** File Save, Save As */ + onSave(value: { fileInfo: FileInfo; type: string }) { + this.logger.debug('fileSave', value); + } + + onFileDragEnter(items: DataTransferItemList) { + this.logger.debug('onFileDragEnter', items); + } + + onFileDragOver() { + this.logger.debug('onFileDragOver'); + } + + onFileDragLeave() { + this.logger.debug('onFileDragLeave'); + } + + async onFileSelected(fileUploadItems: FileUploadItem[]) { + this.logger.debug('onFileSelected', fileUploadItems); + + const info = { + senderSeq: this.loginRes.userSeq, + roomSeq: this.roomInfo.roomSeq + }; + + const allObservables: Observable[] = []; + + for (const fileUploadItem of fileUploadItems) { + let thumbnail: File; + if ( + -1 !== + [ + '3gp', + 'avi', + 'm4v', + 'mkv', + 'mov', + 'mp4', + 'mpeg', + 'mpg', + 'rv', + 'ts', + 'webm', + 'wmv' + ].indexOf(FileUtil.getExtension(fileUploadItem.file.name)) + ) { + thumbnail = await FileUtil.thumbnail(fileUploadItem.file); + this.logger.debug('thumbnail', thumbnail); + } + + const req: FileTalkSaveRequest = { + userSeq: this.loginRes.userSeq, + deviceType: this.environmentsInfo.deviceType, + token: this.loginRes.tokenString, + roomSeq: this.roomInfo.roomSeq, + file: fileUploadItem.file, + fileName: fileUploadItem.file.name, + thumb: thumbnail, + fileUploadItem + }; + + allObservables.push( + this.commonApiService + .fileTalkSave(req, this.sessionVerInfo.uploadUrl) + .pipe( + map(res => { + if (!res) { + return; + } + if (StatusCode.Success === res.statusCode) { + return res; + } else { + throw res; + } + }) + ) + ); + } + + forkJoin(allObservables) + .pipe(take(1)) + .subscribe( + resList => { + for (const res of resList) { + this.store.dispatch( + EventStore.send({ + senderSeq: info.senderSeq, + req: { + roomSeq: info.roomSeq, + eventType: EventType.File, + sentMessage: res.returnJson + } + }) + ); + } + }, + error => { + this.logger.debug('onFileSelected error', error); + }, + () => { + this.fileUploadQueue.onUploadComplete(); + } + ); + } + + onContextMenuMessage(params: { + event: MouseEvent; + message: Info; + }) { + params.event.preventDefault(); + params.event.stopPropagation(); + + this.messageContextMenuPosition.x = params.event.clientX + 'px'; + this.messageContextMenuPosition.y = params.event.clientY + 'px'; + this.messageContextMenuTrigger.menu.focusFirstItem('mouse'); + this.messageContextMenuTrigger.menuData = { + message: params.message, + loginRes: this.loginRes + }; + this.messageContextMenuTrigger.openMenu(); + } + + async onClickMessageContextMenu(menuType: string, message: Info) { + switch (menuType) { + case 'COPY': + { + switch (message.type) { + case EventType.Character: + { + if ( + this.clipboardService.copyFromContent( + (message as Info).sentMessage + ) + ) { + this.snackBarService.open('클립보드에 복사되었습니다.', '', { + duration: 3000, + verticalPosition: 'top', + horizontalPosition: 'center' + }); + } + } + break; + case EventType.MassText: + { + this.commonApiService + .massTalkDownload({ + userSeq: this.loginRes.userSeq, + deviceType: this.environmentsInfo.deviceType, + token: this.loginRes.tokenString, + eventMassSeq: message.seq + }) + .pipe(take(1)) + .subscribe(res => { + if (this.clipboardService.copyFromContent(res.content)) { + this.snackBarService.open( + '클립보드에 복사되었습니다.', + '', + { + duration: 3000, + verticalPosition: 'top', + horizontalPosition: 'center' + } + ); + } + }); + } + break; + + default: + break; + } + } + break; + case 'REPLAY': + { + const result = await this.dialogService.open< + CreateChatDialogComponent, + CreateChatDialogData, + CreateChatDialogResult + >(CreateChatDialogComponent, { + width: '600px', + data: { + type: UserSelectDialogType.MessageForward, + title: 'MessageForward', + ignoreRoom: [this.roomInfo] + } + }); + + if (!!result && !!result.choice && result.choice) { + const userSeqs: number[] = []; + let roomSeq = ''; + if ( + !!result.selectedUserList && + result.selectedUserList.length > 0 + ) { + result.selectedUserList.map(user => userSeqs.push(user.seq)); + } + + if (!!result.selectedRoom) { + roomSeq = result.selectedRoom.roomSeq; + } + + if (userSeqs.length > 0 || roomSeq.trim().length > 0) { + this.store.dispatch( + EventStore.forward({ + senderSeq: this.loginRes.userSeq, + req: { + roomSeq: '-999', + eventType: message.type, + sentMessage: message.sentMessage + }, + trgtUserSeqs: userSeqs, + trgtRoomSeq: roomSeq + }) + ); + } + } + } + break; + case 'REPLAY_TO_ME': + { + if (this.loginRes.talkWithMeBotSeq > -1) { + this.store.dispatch( + EventStore.forward({ + senderSeq: this.loginRes.userSeq, + req: { + roomSeq: '-999', + eventType: message.type, + sentMessage: message.sentMessage + }, + trgtUserSeqs: [this.loginRes.talkWithMeBotSeq] + }) + ); + } + } + break; + case 'DELETE': + { + const result = await this.dialogService.open< + ConfirmDialogComponent, + ConfirmDialogData, + ConfirmDialogResult + >(ConfirmDialogComponent, { + width: '220px', + data: { + title: 'Delete', + html: `선택한 메시지를 삭제하시겠습니까?
삭제된 메시지는 내 대화방에서만 적용되며 상대방의 대화방에서는 삭제되지 않습니다.` + } + }); + + if (!!result && !!result.choice && result.choice) { + this.store.dispatch( + EventStore.del({ + roomSeq: this.roomInfo.roomSeq, + eventSeq: message.seq + }) + ); + } + } + break; + case 'RECALL': + { + const result = await this.dialogService.open< + ConfirmDialogComponent, + ConfirmDialogData, + ConfirmDialogResult + >(ConfirmDialogComponent, { + width: '220px', + data: { + title: 'ReCall', + html: `해당 대화를 회수하시겠습니까?
상대방 대화창에서도 회수됩니다.` + } + }); + + if (!!result && !!result.choice && result.choice) { + this.store.dispatch( + EventStore.cancel({ + roomSeq: this.roomInfo.roomSeq, + eventSeq: message.seq, + deviceType: this.environmentsInfo.deviceType + }) + ); + } + } + break; + default: + break; + } + } + + async onClickContextMenu(menuType: string) { + switch (menuType) { + case 'ADD_MEMBER': + { + const result = await this.dialogService.open< + CreateChatDialogComponent, + CreateChatDialogData, + CreateChatDialogResult + >(CreateChatDialogComponent, { + width: '600px', + data: { + type: UserSelectDialogType.EditChatMember, + title: 'Edit Chat Member', + curRoomUser: this.userInfoList.filter( + user => user.seq !== this.loginRes.userSeq + ) + } + }); + + if (!!result && !!result.choice && result.choice) { + const userSeqs: number[] = []; + if ( + !!result.selectedUserList && + result.selectedUserList.length > 0 + ) { + result.selectedUserList.map(user => { + userSeqs.push(user.seq); + }); + } + + if (userSeqs.length > 0) { + // include me + userSeqs.push(this.loginRes.userSeq); + + this.store.dispatch( + RoomStore.inviteOrOpen({ + req: { + divCd: 'Invite', + userSeqs + } + }) + ); + } + } + } + break; + case 'EDIT_ROOM': + { + const result = await this.dialogService.open< + EditChatRoomDialogComponent, + EditChatRoomDialogData, + EditChatRoomDialogResult + >(EditChatRoomDialogComponent, { + width: '600px', + data: { + title: 'Edit Chat Room', + roomInfo: this.roomInfo + } + }); + + if (!!result && !!result.choice && result.choice) { + const roomName: string = result.roomName; + const roomNameChangeTarget: string = result.roomNameChangeTarget; + const timeRoomInterval: number = result.timeRoomInterval; + const roomInfo: RoomInfo = result.roomInfo; + + // 방제목 업데이트. + this.store.dispatch( + RoomStore.update({ + req: { + roomSeq: roomInfo.roomSeq, + roomName, + receiveAlarm: roomInfo.receiveAlarm, + syncAll: + roomNameChangeTarget.toUpperCase() === 'ALL' ? true : false + } + }) + ); + + if ( + roomInfo.isTimeRoom && + timeRoomInterval > 0 && + roomInfo.timeRoomInterval !== timeRoomInterval + ) { + this.store.dispatch( + RoomStore.updateTimeRoomInterval({ + roomSeq: roomInfo.roomSeq, + timerInterval: timeRoomInterval + }) + ); + } + } + } + break; + case 'CLOSE_ROOM': + { + this.store.dispatch(ChatStore.clearSelectedRoom()); + } + break; + default: + break; + } + } +} diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-side.component.html b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-side.component.html new file mode 100644 index 0000000..0e320a3 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-side.component.html @@ -0,0 +1,3 @@ +
+
+
diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-side.component.scss b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-side.component.scss new file mode 100644 index 0000000..2f45a14 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-side.component.scss @@ -0,0 +1,17 @@ +$right-color:#686566; +.right{ + height:100%; + flex-direction: row-reverse; + border-left:1px solid #dddddd; + .slide-menu{ + width:70px; + height:100%; + display:inline-flex; + background-color:$right-color; + background-color:#7a7a7a; + } + .slide-box{ + display:inline-flex; + height:100%; + } +} diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-side.component.spec.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-side.component.spec.ts new file mode 100644 index 0000000..45fc2bf --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-side.component.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { RightSideComponent } from './right-side.component'; + +describe('App::Layout::Messenger::RightSideComponent', () => { + let component: RightSideComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [RightSideComponent] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(RightSideComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-side.component.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-side.component.ts new file mode 100644 index 0000000..1212642 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-side.component.ts @@ -0,0 +1,14 @@ +import { Component, OnInit } from '@angular/core'; +import { ucapAnimations } from '@ucap-webmessenger/ui'; + +@Component({ + selector: 'app-layout-messenger-right-side', + templateUrl: './right-side.component.html', + styleUrls: ['./right-side.component.scss'], + animations: ucapAnimations +}) +export class RightSideComponent implements OnInit { + constructor() {} + + ngOnInit() {} +} diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/create-chat.dialog.component.html b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/create-chat.dialog.component.html new file mode 100644 index 0000000..23a40c6 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/create-chat.dialog.component.html @@ -0,0 +1,174 @@ + + + {{ data.title }} + + +
+
+ + + {{ input.value?.length || 0 }}/20 + +
+
+
+
+ + + + group + +
+
+ +
+
+ + + + +
+
+
+ +
+
+ 검색결과 + ({{ searchUserInfos.length }}명) +
+ + +
+
+
+ + + device_hub + +
+ + +
+
+ + + chat + +
+ + + +
+
+
+
+
+ + + {{ userInfo.name }} + clear + + +
+ {{ selectedUserList.length }}명 +
+
+ + + + +
diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/create-chat.dialog.component.scss b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/create-chat.dialog.component.scss new file mode 100644 index 0000000..711b0d9 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/create-chat.dialog.component.scss @@ -0,0 +1,78 @@ +::ng-deep .mat-card-header-tex { + margin: 0; +} + +//조직도 레이아웃 변경 +::ng-deep .dialog-org { + .oraganization-tab { + width: 100%; + height:380px; + border-bottom: 1px solid #dddddd; + position: relative; + .oraganization-tab-tree { + display: inline-flex; + width: 50%; + height:100% !important; + border-right: 1px solid #dddddd; + overflow: auto; + } + .select-list { + display: inline-flex; + flex-direction: column; + width: 50%; + height:100% !important; + overflow: auto; + .search-list { + overflow: auto; + height: calc(100% - 40px); + } + } + } +} + +.list-chip { + height: 100px; + width: 100%; + padding:10px; + border:1px solid #dddddd; + overflow: auto; + background-color:#f9f9f9; +} +.mat-chip.mat-standard-chip .mat-chip-remove{ + line-height: 24px; +} +.confirm-card { + min-width: 500px; + .mat-card-header { + margin-bottom: 10px; + .mat-card-header-text { + .mat-card-title { + margin: 0 -16px; + } + } + } + .mat-card-content { + .content-box { + flex-direction: column; + flex-flow: column; + } + } + .button-farm { + text-align: right; + .mat-primary { + margin-left: 4px; + } + } +} +::ng-deep .mat-dialog-container .mat-tab-body-wrapper { + height: 380px; +} +.list-panel{ + overflow: auto; + height: calc(100% - 60px); + .group-expansion{ + .list-item{ + height:70px; + } + } +} diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/create-chat.dialog.component.spec.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/create-chat.dialog.component.spec.ts new file mode 100644 index 0000000..7a0f299 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/create-chat.dialog.component.spec.ts @@ -0,0 +1,27 @@ +/* tslint:disable:no-unused-variable */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { DebugElement } from '@angular/core'; + +import { CreateChatDialogComponent } from './create-chat.dialog.component'; + +describe('CreateChatDialogComponent', () => { + let component: CreateChatDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [CreateChatDialogComponent] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CreateChatDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/create-chat.dialog.component.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/create-chat.dialog.component.ts new file mode 100644 index 0000000..0881d26 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/create-chat.dialog.component.ts @@ -0,0 +1,468 @@ +import { UserSelectDialogType } from './../../../../types/userselect.dialog.type'; +import { + Component, + OnInit, + OnDestroy, + Inject, + EventEmitter +} from '@angular/core'; +import { FormGroup, FormBuilder, Validators } from '@angular/forms'; +import { + MatDialogRef, + MAT_DIALOG_DATA, + MatTabChangeEvent +} from '@angular/material'; +import { NGXLogger } from 'ngx-logger'; +import { Observable, combineLatest, Subscription, of } from 'rxjs'; +import { map, tap, catchError } from 'rxjs/operators'; + +import { Store, select } from '@ngrx/store'; +import * as AppStore from '@app/store'; +import * as QueryStore from '@app/store/messenger/query'; +import * as StatusStore from '@app/store/messenger/status'; + +import { SessionStorageService } from '@ucap-webmessenger/web-storage'; +import { Company } from '@ucap-webmessenger/api-external'; +import { VersionInfo2Response } from '@ucap-webmessenger/api-public'; +import { LoginInfo, KEY_LOGIN_INFO } from '@app/types'; +import { KEY_VER_INFO } from '@app/types/ver-info.type'; +import { LoginResponse } from '@ucap-webmessenger/protocol-authentication'; +import { + UserInfo, + GroupDetailData, + RoomUserDetailData, + RoomUserData +} from '@ucap-webmessenger/protocol-sync'; +import { + DeptSearchType, + UserInfoSS, + UserInfoF, + UserInfoDN, + QueryProtocolService, + SSVC_TYPE_QUERY_DEPT_USER_DATA, + DeptUserData, + SSVC_TYPE_QUERY_DEPT_USER_RES +} from '@ucap-webmessenger/protocol-query'; +import { + RoomInfo, + UserInfoShort, + UserInfo as RoomUserInfo +} from '@ucap-webmessenger/protocol-room'; + +export interface CreateChatDialogData { + type?: string; + title: string; + /** CASE :: EditMember */ + group?: GroupDetailData; + /** CASE :: EventForward */ + ignoreRoom?: RoomInfo[]; + /** CASE :: EditCharMember */ + curRoomUser?: ( + | UserInfo + | UserInfoSS + | UserInfoF + | UserInfoDN + | RoomUserInfo)[]; +} + +export interface CreateChatDialogResult { + choice: boolean; + selectedUserList?: ( + | UserInfo + | UserInfoSS + | UserInfoF + | UserInfoDN + | RoomUserInfo)[]; + selectedRoom?: RoomInfo; + groupName?: string; + oldGroup?: GroupDetailData; +} + +@Component({ + selector: 'app-layout-messenger-create-chat', + templateUrl: './create-chat.dialog.component.html', + styleUrls: ['./create-chat.dialog.component.scss'] +}) +export class CreateChatDialogComponent implements OnInit, OnDestroy { + constructor( + public dialogRef: MatDialogRef< + CreateChatDialogData, + CreateChatDialogResult + >, + @Inject(MAT_DIALOG_DATA) public data: CreateChatDialogData, + private store: Store, + private sessionStorageService: SessionStorageService, + private queryProtocolService: QueryProtocolService, + private formBuilder: FormBuilder, + private logger: NGXLogger + ) { + this.sessionVerinfo = this.sessionStorageService.get( + KEY_VER_INFO + ); + } + + UserSelectDialogType = UserSelectDialogType; + + loginRes: LoginResponse; + loginResSubscription: Subscription; + sessionVerinfo: VersionInfo2Response; + + // 검색 + isShowSearch = false; + searchProcessing = false; + searchUserInfos: UserInfoSS[] = []; + + // 그룹 + companyList$: Observable; + companyCode: string; + groupBuddyList$: Observable< + { group: GroupDetailData; buddyList: UserInfo[] }[] + >; + favoritBuddyList$: Observable; + + // 대화방 + roomList: RoomInfo[]; + roomUserList: RoomUserDetailData[]; + roomUserShortList: RoomUserData[]; + roomSubscription: Subscription; + + // 수집 데이터 + selectedUserList: ( + | UserInfo + | UserInfoSS + | UserInfoF + | UserInfoDN + | RoomUserInfo)[] = []; + isShowSelectedUserList = true; + selectedRoom: RoomInfo; + + inputForm: FormGroup; + + ngOnInit() { + const loginInfo = this.sessionStorageService.get(KEY_LOGIN_INFO); + this.companyCode = loginInfo.companyCode; + + this.companyList$ = this.store.pipe( + select(AppStore.SettingSelector.CompanySelector.companyList) + ); + + this.loginResSubscription = this.store + .pipe( + select(AppStore.AccountSelector.AuthenticationSelector.loginRes), + tap(loginRes => { + this.loginRes = loginRes; + }) + ) + .subscribe(); + + this.groupBuddyList$ = combineLatest([ + this.store.pipe( + select(AppStore.MessengerSelector.SyncSelector.selectAllBuddy2) + ), + this.store.pipe( + select(AppStore.MessengerSelector.SyncSelector.selectAllGroup2) + ) + ]).pipe( + map(([buddyList, groupList]) => { + const groupBuddyList: { + group: GroupDetailData; + buddyList: UserInfo[]; + }[] = []; + for (const group of groupList) { + const data = { + group, + buddyList: buddyList.filter(buddy => { + return group.userSeqs.indexOf(buddy.seq) > -1; + }) + }; + groupBuddyList.push(data); + + /** 그룹 멤버 변경일 경우 그룹원을 기본 셀렉트 한다. */ + if ( + this.data.type === UserSelectDialogType.EditMember && + !!this.data.group && + this.data.group.seq === group.seq + ) { + this.selectedUserList = [...data.buddyList]; + } + } + return groupBuddyList; + }) + ); + + this.favoritBuddyList$ = this.store + .pipe(select(AppStore.MessengerSelector.SyncSelector.selectAllBuddy2)) + .pipe( + map(buddyInfoList => { + return buddyInfoList + .filter(buddy => buddy.isFavorit) + .sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0)); + }) + ); + + this.roomSubscription = combineLatest([ + this.store.pipe( + select(AppStore.MessengerSelector.SyncSelector.selectAllRoom) + ), + this.store.pipe( + select(AppStore.MessengerSelector.SyncSelector.selectAllRoomUser) + ), + this.store.pipe( + select(AppStore.MessengerSelector.SyncSelector.selectAllRoomUserShort) + ) + ]) + .pipe( + tap(([room, roomUser, roomUserShort]) => { + this.roomList = room; + this.roomUserList = roomUser; + this.roomUserShortList = roomUserShort; + }) + ) + .subscribe(); + + this.inputForm = this.formBuilder.group({ + groupName: ['', [Validators.required]] + }); + + if (this.data.type === UserSelectDialogType.EditChatMember) { + this.selectedUserList = this.data.curRoomUser; + } + } + + ngOnDestroy(): void { + if (!!this.roomSubscription) { + this.roomSubscription.unsubscribe(); + } + if (!!this.loginResSubscription) { + this.loginResSubscription.unsubscribe(); + } + } + + getRoomUserList(roomInfo: RoomInfo): RoomUserInfo[] | UserInfoShort[] { + if (!!this.roomUserList && 0 < this.roomUserList.length) { + const i = this.roomUserList.findIndex( + value => roomInfo.roomSeq === value.roomSeq + ); + if (-1 < i) { + return this.roomUserList[i].userInfos; + } + } + + if (!!this.roomUserShortList && 0 < this.roomUserShortList.length) { + const i = this.roomUserShortList.findIndex( + value => roomInfo.roomSeq === value.roomSeq + ); + if (-1 < i) { + return this.roomUserShortList[i].userInfos; + } + } + } + + getChipsRemoveYn(userInfo: UserInfo | UserInfoSS | UserInfoF | UserInfoDN) { + if ( + this.data.type === UserSelectDialogType.EditChatMember && + !!this.data.curRoomUser && + this.data.curRoomUser.length > 0 + ) { + return !( + this.data.curRoomUser.filter(user => user.seq === userInfo.seq).length > + 0 + ); + } else { + return true; + } + } + + onSelectedTabChange(tabChangeEvent: MatTabChangeEvent): void { + if (tabChangeEvent.index === 2) { + this.selectedUserList = []; + this.isShowSelectedUserList = false; + } else { + this.selectedRoom = null; + this.isShowSelectedUserList = true; + } + } + + /** 유저검색 */ + onKeyDownEnterOrganizationTenantSearch(params: { + companyCode: string; + searchWord: string; + }) { + if (params.searchWord.trim().length > 1) { + this.isShowSearch = true; + this.searchProcessing = true; + + const searchUserInfos: UserInfoSS[] = []; + this.queryProtocolService + .deptUser({ + divCd: 'GRP', + companyCode: params.companyCode, + searchRange: DeptSearchType.All, + search: params.searchWord, + senderCompanyCode: params.companyCode, + senderEmployeeType: this.loginRes.userInfo.employeeType + }) + .pipe( + map(res => { + switch (res.SSVC_TYPE) { + case SSVC_TYPE_QUERY_DEPT_USER_DATA: + searchUserInfos.push(...(res as DeptUserData).userInfos); + break; + case SSVC_TYPE_QUERY_DEPT_USER_RES: + { + // 검색 결과 처리. + this.searchUserInfos = searchUserInfos; + this.searchProcessing = false; + + // 검색 결과에 따른 프레즌스 조회. + const userSeqList: number[] = []; + this.searchUserInfos.map(user => userSeqList.push(user.seq)); + if (userSeqList.length > 0) { + this.store.dispatch( + StatusStore.bulkInfo({ + divCd: 'groupSrch', + userSeqs: userSeqList + }) + ); + } + } + break; + } + }), + catchError(error => { + this.searchProcessing = false; + return of(this.logger.error(error)); + }) + ) + .subscribe(); + } + } + /** 검색 취소 */ + onClickCancel() { + this.isShowSearch = false; + this.searchUserInfos = []; + } + + /** 동료그룹 :: 그룹의 checkbox 의 이벤트를 받아 선택된 유저리스트를 수집. */ + onCheckGroup(params: { + isChecked: boolean; + groupBuddyList: { group: GroupDetailData; buddyList: UserInfo[] }; + }) { + if (params.isChecked) { + params.groupBuddyList.buddyList.forEach(item => { + if ( + this.selectedUserList.filter(user => user.seq === item.seq).length === + 0 + ) { + this.selectedUserList = [...this.selectedUserList, item]; + } + }); + } else { + this.selectedUserList = this.selectedUserList.filter( + item => + params.groupBuddyList.buddyList.filter(del => del.seq === item.seq) + .length === 0 + ); + } + } + + onCheckAllUser(params: { + isChecked: boolean; + userInfos: (UserInfo | UserInfoSS | UserInfoF | UserInfoDN)[]; + }) { + params.userInfos.forEach(userInfo => { + if (params.isChecked) { + if ( + this.selectedUserList.filter(user => user.seq === userInfo.seq) + .length === 0 + ) { + this.selectedUserList = [...this.selectedUserList, userInfo]; + } + } else { + this.selectedUserList = this.selectedUserList.filter( + user => user.seq !== userInfo.seq + ); + } + }); + } + + /** 동료그룹>부서원, 조직도>부서원 :: 리스트의 checkbox 의 이벤트를 받아 선택된 유저리스트를 수집. */ + onCheckUser(params: { + isChecked: boolean; + userInfo: UserInfo | UserInfoSS | UserInfoF | UserInfoDN; + }) { + if (params.isChecked) { + if ( + this.selectedUserList.filter(user => user.seq === params.userInfo.seq) + .length === 0 && + params.userInfo + ) { + this.selectedUserList = [...this.selectedUserList, params.userInfo]; + } + } else { + this.selectedUserList = this.selectedUserList.filter( + item => item.seq !== params.userInfo.seq + ); + } + } + + /** 대화방 > 대화방 선택 :: 해당 팝업에서는 대화방을 중복 선택하지 않는다 */ + onCheckRoom(params: { isChecked: boolean; roomInfo: RoomInfo }) { + if (params.isChecked) { + this.selectedRoom = params.roomInfo; + } else { + this.selectedRoom = null; + } + } + + /** 그룹>부서원 리스트의 ischecked 를 판단. */ + getCheckedUser(userInfo: UserInfo | UserInfoSS | UserInfoF | UserInfoDN) { + if (!!this.selectedUserList && this.selectedUserList.length > 0) { + return ( + this.selectedUserList.filter(item => item.seq === userInfo.seq).length > + 0 + ); + } + return false; + } + + getCheckableRoom(roomInfo: RoomInfo) { + if (!!this.data.ignoreRoom && this.data.ignoreRoom.length > 0) { + return !( + this.data.ignoreRoom.filter(room => room.roomSeq === roomInfo.roomSeq) + .length > 0 + ); + } + return true; + } + getCheckedRoom(roomInfo: RoomInfo) { + if (!!this.selectedRoom) { + return this.selectedRoom.roomSeq === roomInfo.roomSeq; + } + return false; + } + + /** 선택된 사용자 취소 */ + onClickDeleteUser(userInfo: UserInfo | UserInfoSS | UserInfoF | UserInfoDN) { + this.selectedUserList = this.selectedUserList.filter( + item => item.seq !== userInfo.seq + ); + } + + /** 팝업의 선택 이벤트 전달. */ + onClickChoice(choice: boolean): void { + this.dialogRef.close({ + choice, + selectedUserList: this.selectedUserList, + selectedRoom: this.selectedRoom, + groupName: + this.data.type === UserSelectDialogType.NewGroup + ? this.inputForm.get('groupName').value + : '', + oldGroup: + this.data.type === UserSelectDialogType.EditMember + ? this.data.group + : undefined + }); + } +} diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/edit-chat-room.dialog.component.html b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/edit-chat-room.dialog.component.html new file mode 100644 index 0000000..6b205e6 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/edit-chat-room.dialog.component.html @@ -0,0 +1,54 @@ + + + {{ data.title }} + + +
+
+ + + {{ input.value?.length || 0 }}/20 + +
+
+ 변경 대상자 + + + 전체 + +
+
+ + Setting Timer + + + {{ timer.text }} + + + +
+
+
+ + + + +
diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/edit-chat-room.dialog.component.scss b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/edit-chat-room.dialog.component.scss new file mode 100644 index 0000000..038addf --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/edit-chat-room.dialog.component.scss @@ -0,0 +1,38 @@ +::ng-deep .mat-card-header-tex { + margin: 0; +} +.confirm-card { + min-width: 500px; + .mat-card-header { + margin-bottom: 20px; + .mat-card-header-text { + .mat-card-title { + margin: 0 -16px; + } + } + } + .button-farm { + text-align: right; + .mat-primary { + margin-left: 4px; + } + } +} + +form { + div { + padding-bottom: 5px; + height: 65px; + + &.targetSelect { + line-height: 65px; + + mat-radio-button { + padding-left: 10px; + } + } + } + .mat-form-field { + width: 100%; + } +} diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/edit-chat-room.dialog.component.spec.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/edit-chat-room.dialog.component.spec.ts new file mode 100644 index 0000000..3a65174 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/edit-chat-room.dialog.component.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { EditChatRoomDialogComponent } from './edit-chat-room.dialog.component'; + +describe('app::layouts::messenger::EditChatRoomDialogComponent', () => { + let component: EditChatRoomDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [EditChatRoomDialogComponent] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(EditChatRoomDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/edit-chat-room.dialog.component.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/edit-chat-room.dialog.component.ts new file mode 100644 index 0000000..afb68ca --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/edit-chat-room.dialog.component.ts @@ -0,0 +1,68 @@ +import { RoomInfo } from '@ucap-webmessenger/protocol-room'; +import { Component, OnInit, Inject } from '@angular/core'; +import { FormGroup, FormBuilder } from '@angular/forms'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material'; + +export interface EditChatRoomDialogData { + title: string; + roomInfo: RoomInfo; +} + +export interface EditChatRoomDialogResult { + choice: boolean; + roomName?: string; + roomNameChangeTarget?: string; + timeRoomInterval?: number; + roomInfo: RoomInfo; +} + +@Component({ + selector: 'app-layout-messenger-edit-chat-room', + templateUrl: './edit-chat-room.dialog.component.html', + styleUrls: ['./edit-chat-room.dialog.component.scss'] +}) +export class EditChatRoomDialogComponent implements OnInit { + roomName: string; + inputForm: FormGroup; + + timerArray: { value: number; text: string }[] = [ + { value: 5, text: '5 초' }, + { value: 10, text: '10 초' }, + { value: 30, text: '30 초' }, + { value: 60, text: '1 분' }, + { value: 300, text: '5 분' }, + { value: 600, text: '10 분' }, + { value: 1800, text: '30 분' }, + { value: 3600, text: '1 시간' }, + { value: 21600, text: '6 시간' }, + { value: 43200, text: '12 시간' }, + { value: 86400, text: '24 시간' } + ]; + + constructor( + public dialogRef: MatDialogRef< + EditChatRoomDialogData, + EditChatRoomDialogResult + >, + @Inject(MAT_DIALOG_DATA) public data: EditChatRoomDialogData, + private formBuilder: FormBuilder + ) {} + + ngOnInit(): void { + this.inputForm = this.formBuilder.group({ + roomName: [this.data.roomInfo.roomName], + changeTarget: ['me'], + timerInterval: [this.data.roomInfo.timeRoomInterval] + }); + } + + onClickChoice(choice: boolean): void { + this.dialogRef.close({ + choice, + roomName: this.inputForm.get('roomName').value, + roomNameChangeTarget: this.inputForm.get('changeTarget').value, + timeRoomInterval: this.inputForm.get('timerInterval').value, + roomInfo: this.data.roomInfo + }); + } +} diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/index.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/index.ts new file mode 100644 index 0000000..a0e680b --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/index.ts @@ -0,0 +1,4 @@ +import { CreateChatDialogComponent } from './create-chat.dialog.component'; +import { EditChatRoomDialogComponent } from './edit-chat-room.dialog.component'; + +export const DIALOGS = [CreateChatDialogComponent, EditChatRoomDialogComponent]; diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/group/edit-group.dialog.component.html b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/group/edit-group.dialog.component.html new file mode 100644 index 0000000..06db2dd --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/group/edit-group.dialog.component.html @@ -0,0 +1,31 @@ + + + {{ data.title }} + + +
+ + + {{ input.value?.length || 0 }}/20 + +
+
+ + + + +
diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/group/edit-group.dialog.component.scss b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/group/edit-group.dialog.component.scss new file mode 100644 index 0000000..d6fb4a0 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/group/edit-group.dialog.component.scss @@ -0,0 +1,27 @@ +::ng-deep .mat-card-header-tex{ + margin:0; +} +.confirm-card{ + min-width:500px; + .mat-card-header{ + margin-bottom:20px; + .mat-card-header-text{ + .mat-card-title{ + margin:0 -16px; + } + } + } + .button-farm { + text-align:right; + .mat-primary{ + margin-left:4px; + } + } +} + +form{ +.mat-form-field{ + width:100%; + } +} + diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/group/edit-group.dialog.component.spec.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/group/edit-group.dialog.component.spec.ts new file mode 100644 index 0000000..e279601 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/group/edit-group.dialog.component.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { EditGroupDialogComponent } from './edit-group.dialog.component'; + +describe('app::layouts::messenger::EditGroupDialogComponent', () => { + let component: EditGroupDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [EditGroupDialogComponent] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(EditGroupDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/group/edit-group.dialog.component.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/group/edit-group.dialog.component.ts new file mode 100644 index 0000000..a5636b3 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/group/edit-group.dialog.component.ts @@ -0,0 +1,45 @@ +import { Component, OnInit, Inject } from '@angular/core'; +import { FormGroup, FormBuilder, Validators } from '@angular/forms'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material'; +import { GroupDetailData } from '@ucap-webmessenger/protocol-sync'; + +export interface EditGroupDialogData { + title: string; + group: GroupDetailData; +} + +export interface EditGroupDialogResult { + choice: boolean; + groupName: string; + group: GroupDetailData; +} + +@Component({ + selector: 'app-layout-messenger-edit-group', + templateUrl: './edit-group.dialog.component.html', + styleUrls: ['./edit-group.dialog.component.scss'] +}) +export class EditGroupDialogComponent implements OnInit { + groupName: string; + inputForm: FormGroup; + + constructor( + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: EditGroupDialogData, + private formBuilder: FormBuilder + ) {} + + ngOnInit(): void { + this.inputForm = this.formBuilder.group({ + groupName: [this.data.group.name, [Validators.required]] + }); + } + + onClickChoice(choice: boolean): void { + this.dialogRef.close({ + choice, + groupName: this.inputForm.get('groupName').value, + group: this.data.group + }); + } +} diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/group/index.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/group/index.ts new file mode 100644 index 0000000..8236d01 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/group/index.ts @@ -0,0 +1,4 @@ +import { SelectGroupDialogComponent } from './select-group.dialog.component'; +import { EditGroupDialogComponent } from './edit-group.dialog.component'; + +export const DIALOGS = [SelectGroupDialogComponent, EditGroupDialogComponent]; diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/group/select-group.dialog.component.html b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/group/select-group.dialog.component.html new file mode 100644 index 0000000..afc155e --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/group/select-group.dialog.component.html @@ -0,0 +1,84 @@ + + + {{ data.title }} + + +
+ +
+ + + + + + {{ inputGroupName.value?.length || 0 }}/20 + + +
+ + + +
+ +
+
+ + + {{ groupBuddy.group.name }} + + + +
+ + + + +
diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/group/select-group.dialog.component.scss b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/group/select-group.dialog.component.scss new file mode 100644 index 0000000..502b0d8 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/group/select-group.dialog.component.scss @@ -0,0 +1,66 @@ +::ng-deep .mat-card-header-tex{ + margin:0; +} +.mat-form-field{ + width:100%; + padding:10px; +} +.confirm-card{ + min-width:500px; + .mat-card-content{ + + } + .button-farm { + text-align:right; + .mat-primary{ + margin-left:4px; + } + } +} + +.add-row{ + margin-bottom:10px; + .mat-mini-fab{ + .mat-icon{ + width:40px; + height:40px; + line-height: 40px; + } + .mat-fab__label{ + color:#212121; + margin-left:10px; + } + } + +} + +.mat-selection-list{ + border-top:1px solid #999999; +} + .mat-list-item { + border-bottom:1px solid #dddddd; + } + +.input-groupname-box{ + display:flex; + flex-flow: column; + margin-bottom: 10px; + border-radius: 4px; + /*border:1px solid #dddddd; + box-shadow: 0 1px 1px 0 rgba(60,64,67,.08), 0 1px 3px 1px rgba(60,64,67,.16);*/ + + .btn-box{ + margin-top:10px; + flex-flow:row; + height:40px; + margin-left:auto; + padding:0 10px; + button{ + margin-left:4px; + } + } +} + +::ng-deep .mat-mini-fab .mat-button-wrapper{ + padding:0; +} \ No newline at end of file diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/group/select-group.dialog.component.spec.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/group/select-group.dialog.component.spec.ts new file mode 100644 index 0000000..17d5c4a --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/group/select-group.dialog.component.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SelectGroupDialogComponent } from './select-group.dialog.component'; + +describe('app::layouts::messenger::SelectGroupDialogComponent', () => { + let component: SelectGroupDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [SelectGroupDialogComponent] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SelectGroupDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/group/select-group.dialog.component.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/group/select-group.dialog.component.ts new file mode 100644 index 0000000..8b7248c --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/group/select-group.dialog.component.ts @@ -0,0 +1,124 @@ +import { Component, OnInit, Inject, ViewChild } from '@angular/core'; +import { + MatDialogRef, + MAT_DIALOG_DATA, + MatSelectionList, + MatSelectionListChange +} from '@angular/material'; +import { Observable, combineLatest } from 'rxjs'; +import { Store, select } from '@ngrx/store'; +import { map } from 'rxjs/operators'; + +import * as AppStore from '@app/store'; +import * as SyncStore from '@app/store/messenger/sync'; + +import { + DialogService, + ConfirmDialogComponent, + ConfirmDialogData, + ConfirmDialogResult +} from '@ucap-webmessenger/ui'; +import { GroupDetailData, UserInfo } from '@ucap-webmessenger/protocol-sync'; + +export interface SelectGroupDialogData { + title: string; +} + +export interface SelectGroupDialogResult { + choice: boolean; + group?: GroupDetailData; +} + +@Component({ + selector: 'app-layout-messenger-select-group', + templateUrl: './select-group.dialog.component.html', + styleUrls: ['./select-group.dialog.component.scss'] +}) +export class SelectGroupDialogComponent implements OnInit { + constructor( + public dialogRef: MatDialogRef< + SelectGroupDialogData, + SelectGroupDialogResult + >, + @Inject(MAT_DIALOG_DATA) public data: SelectGroupDialogData, + private store: Store, + private dialogService: DialogService + ) {} + + @ViewChild('groups', { static: true }) groups: MatSelectionList; + groupBuddyList$: Observable< + { group: GroupDetailData; buddyList: UserInfo[] }[] + >; + selectedGroup: GroupDetailData; + isShowAddGroupField = false; + + ngOnInit(): void { + this.groups.selectionChange.subscribe((s: MatSelectionListChange) => { + this.groups.deselectAll(); + s.option.selected = true; + this.selectedGroup = s.option.value as GroupDetailData; + }); + + this.groupBuddyList$ = combineLatest([ + this.store.pipe( + select(AppStore.MessengerSelector.SyncSelector.selectAllBuddy2) + ), + this.store.pipe( + select(AppStore.MessengerSelector.SyncSelector.selectAllGroup2) + ) + ]).pipe( + map(([buddyList, groupList]) => { + const groupBuddyList: { + group: GroupDetailData; + buddyList: UserInfo[]; + }[] = []; + for (const group of groupList) { + groupBuddyList.push({ + group, + buddyList: buddyList.filter(buddy => { + return group.userSeqs.indexOf(buddy.seq) > -1; + }) + }); + } + + return groupBuddyList; + }) + ); + } + + async onClickAddGroup(groupName: string) { + const result = await this.dialogService.open< + ConfirmDialogComponent, + ConfirmDialogData, + ConfirmDialogResult + >(ConfirmDialogComponent, { + width: '300px', + data: { + title: 'Add group', + html: `그룹(${groupName})을 추가하시겠습니까?` + } + }); + + if (!!result && !!result.choice && result.choice) { + if (groupName.trim().length > 0) { + this.store.dispatch( + SyncStore.createGroup({ + groupName: groupName.trim() + }) + ); + + this.onClickAddGroupCancel(); + } + } + } + onClickAddGroupCancel() { + this.isShowAddGroupField = false; + } + + onClickChoice(choice: boolean): void { + this.dialogRef.close({ + choice, + group: this.selectedGroup + }); + } +} diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/index.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/index.ts new file mode 100644 index 0000000..ebf476a --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/index.ts @@ -0,0 +1,4 @@ +import { DIALOGS as CHAT_DIALOGS } from './chat'; +import { DIALOGS as GROUP_DIALOGS } from './group'; + +export const DIALOGS = [...CHAT_DIALOGS, ...GROUP_DIALOGS]; diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/messenger.layout.module.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/messenger.layout.module.ts new file mode 100644 index 0000000..f6daeba --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/messenger.layout.module.ts @@ -0,0 +1,89 @@ +import { MatSelectModule } from '@angular/material/select'; +import { MatRadioModule } from '@angular/material/radio'; +import { MatButtonToggleModule } from '@angular/material/button-toggle'; +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { ReactiveFormsModule } from '@angular/forms'; + +import { FlexLayoutModule } from '@angular/flex-layout'; + +import { ScrollingModule } from '@angular/cdk/scrolling'; + +import { MatAutocompleteModule } from '@angular/material/autocomplete'; +import { MatBadgeModule } from '@angular/material/badge'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatIconModule } from '@angular/material/icon'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { MatTabsModule } from '@angular/material/tabs'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatCheckboxModule } from '@angular/material'; +import { MatListModule } from '@angular/material/list'; +import { MatChipsModule } from '@angular/material/chips'; + +import { DragDropModule } from '@angular/cdk/drag-drop'; +import { OverlayModule } from '@angular/cdk/overlay'; + +import { PerfectScrollbarModule } from 'ngx-perfect-scrollbar'; + +import { UCapUiModule } from '@ucap-webmessenger/ui'; +import { UCapUiChatModule } from '@ucap-webmessenger/ui-chat'; +import { UCapUiRoomModule } from '@ucap-webmessenger/ui-room'; +import { UCapUiProfileModule } from '@ucap-webmessenger/ui-profile'; +import { UCapUiGroupModule } from '@ucap-webmessenger/ui-group'; +import { UCapUiOrganizationModule } from '@ucap-webmessenger/ui-organization'; + +import { AppCommonLayoutModule } from '@app/layouts/common/common.layout.module'; + +import { COMPONENTS } from './components'; +import { DIALOGS } from './dialogs'; + +@NgModule({ + imports: [ + CommonModule, + FlexLayoutModule, + DragDropModule, + ReactiveFormsModule, + OverlayModule, + ScrollingModule, + + MatAutocompleteModule, + MatFormFieldModule, + MatInputModule, + MatBadgeModule, + MatButtonModule, + MatCardModule, + MatDialogModule, + MatDividerModule, + MatIconModule, + MatMenuModule, + MatListModule, + MatProgressBarModule, + MatTabsModule, + MatToolbarModule, + MatChipsModule, + MatCheckboxModule, + MatRadioModule, + MatSelectModule, + + PerfectScrollbarModule, + + UCapUiModule, + UCapUiChatModule, + UCapUiRoomModule, + UCapUiProfileModule, + UCapUiGroupModule, + UCapUiOrganizationModule, + + AppCommonLayoutModule + ], + exports: [...COMPONENTS, ...DIALOGS], + declarations: [...COMPONENTS, ...DIALOGS], + entryComponents: [...DIALOGS] +}) +export class AppMessengerLayoutModule {} diff --git a/projects/ucap-webmessenger-app/src/app/layouts/native/components/index.ts b/projects/ucap-webmessenger-app/src/app/layouts/native/components/index.ts new file mode 100644 index 0000000..e7c2618 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/native/components/index.ts @@ -0,0 +1,3 @@ +import { TopBarComponent } from './top-bar.component'; + +export const COMPONENTS = [TopBarComponent]; diff --git a/projects/ucap-webmessenger-app/src/app/layouts/native/components/top-bar.component.html b/projects/ucap-webmessenger-app/src/app/layouts/native/components/top-bar.component.html new file mode 100644 index 0000000..9dc1c69 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/native/components/top-bar.component.html @@ -0,0 +1,54 @@ + + +
UCAP M Messenger
+
+
+ + + +
+
diff --git a/projects/ucap-webmessenger-app/src/app/layouts/native/components/top-bar.component.scss b/projects/ucap-webmessenger-app/src/app/layouts/native/components/top-bar.component.scss new file mode 100644 index 0000000..b266e78 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/native/components/top-bar.component.scss @@ -0,0 +1,92 @@ +:host { + .app-layout-native-title-bar { + -webkit-user-select: none; + -webkit-app-region: drag; + + position: fixed; + right: 0; + top: 0; + display: flex; + padding: 0 10px; + cursor: pointer; + background: #4f4f4f; + height: 30px; + color:#ffffff; + //background: rgba(37, 27, 30, 0.9); + //border-bottom: 1px solid #d5dadb; + + .app-layout-native-title-bar-logo { + width: 16px; + height: 16px; + } + + .app-layout-native-title-bar-title { + padding-left: 8px; + font-size: 12px; + } + + .app-layout-native-title-bar-spacer { + flex: 1 1 auto; + } + + .app-layout-native-title-bar-actions { + position: relative; + + .button { + -webkit-app-region: no-drag; + outline: 0; + cursor: pointer; + border: none; + height: 30px; + min-width: 30px; + max-width: 30px; + padding: 5px; + line-height: 10px; + border-radius: 0; + background: transparent; + transition: background 0.2s linear, color 0.2s linear; + text-align: center; + font-size: 10px; + vertical-align: middle; + margin-left:6px; + transform: translateY(-2px); + .mat-icon { + //transform: translateY(-2px); + width: 16px; + height: 16px; + min-height:16px; + min-width:16px; + font-size: 16px; + } + + &.app-layout-native-title-bar-close, + &.app-layout-native-title-bar-maximize, + &.app-layout-native-title-bar-minimize { + color: darken(white, 20%); + font-weight: lighter; + } + + // &.app-layout-native-title-bar-minimize .mat-icon { + // transform: translateY(-43%); + // } + + &:hover { + &.app-layout-native-title-bar-close { + background: darken(#000000, 10%); + color: darken(white, 0); + } + + &.app-layout-native-title-bar-minimize { + background: darken(#000000, 10%); + color: darken(white,0); + } + + &.app-layout-native-title-bar-maximize { + background: darken(#000000, 10%); + color: darken(white, 0); + } + } + } + } + } +} diff --git a/projects/ucap-webmessenger-app/src/app/layouts/native/components/top-bar.component.spec.ts b/projects/ucap-webmessenger-app/src/app/layouts/native/components/top-bar.component.spec.ts new file mode 100644 index 0000000..9a37a79 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/native/components/top-bar.component.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TopBarComponent } from './top-bar.component'; + +describe('App::Layout::Messenger::TopBarComponent', () => { + let component: TopBarComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [TopBarComponent] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TopBarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/projects/ucap-webmessenger-app/src/app/layouts/native/components/top-bar.component.ts b/projects/ucap-webmessenger-app/src/app/layouts/native/components/top-bar.component.ts new file mode 100644 index 0000000..447bcb8 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/native/components/top-bar.component.ts @@ -0,0 +1,40 @@ +import { Component, OnInit, Inject, OnDestroy } from '@angular/core'; +import { + UCAP_NATIVE_SERVICE, + NativeService, + WindowState +} from '@ucap-webmessenger/native'; +import { Observable } from 'rxjs'; + +@Component({ + selector: 'app-layout-native-top-bar', + templateUrl: './top-bar.component.html', + styleUrls: ['./top-bar.component.scss'] +}) +export class TopBarComponent implements OnInit, OnDestroy { + windowStateChanged$: Observable; + + WindowState = WindowState; + + constructor( + @Inject(UCAP_NATIVE_SERVICE) private nativeService: NativeService + ) {} + + ngOnInit() { + this.windowStateChanged$ = this.nativeService.windowStateChanged(); + } + + ngOnDestroy(): void {} + + onClickClose() { + this.nativeService.windowClose(); + } + + onClickMinimize() { + this.nativeService.windowMinimize(); + } + + onClickMaxmize() { + this.nativeService.windowMaximize(); + } +} diff --git a/projects/ucap-webmessenger-app/src/app/layouts/native/native.layout.module.ts b/projects/ucap-webmessenger-app/src/app/layouts/native/native.layout.module.ts new file mode 100644 index 0000000..7248ea8 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/native/native.layout.module.ts @@ -0,0 +1,25 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +import { FlexLayoutModule } from '@angular/flex-layout'; + +import { MatIconModule } from '@angular/material/icon'; +import { MatToolbarModule } from '@angular/material/toolbar'; + +import { UCapUiModule } from '@ucap-webmessenger/ui'; + +import { COMPONENTS } from './components'; + +@NgModule({ + imports: [ + CommonModule, + FlexLayoutModule, + MatIconModule, + MatToolbarModule, + UCapUiModule + ], + exports: [...COMPONENTS], + declarations: [...COMPONENTS], + entryComponents: [] +}) +export class AppNativeLayoutModule {} diff --git a/projects/ucap-webmessenger-app/src/app/pages/account/account-routing.page.module.ts b/projects/ucap-webmessenger-app/src/app/pages/account/account-routing.page.module.ts new file mode 100644 index 0000000..e1d9ad7 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/pages/account/account-routing.page.module.ts @@ -0,0 +1,18 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +import { LoginPageComponent } from './components/login.page.component'; + +const routes: Routes = [ + { path: '', redirectTo: '/account/login', pathMatch: 'full' }, + { + path: 'login', + component: LoginPageComponent + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class AppAccountRoutingPageModule {} diff --git a/projects/ucap-webmessenger-app/src/app/pages/account/account.page.module.ts b/projects/ucap-webmessenger-app/src/app/pages/account/account.page.module.ts new file mode 100644 index 0000000..7c6c770 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/pages/account/account.page.module.ts @@ -0,0 +1,25 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +import { FlexLayoutModule } from '@angular/flex-layout'; + +import { MatButtonModule } from '@angular/material/button'; + +import { UCapUiAccountModule } from '@ucap-webmessenger/ui-account'; + +import { AppAccountRoutingPageModule } from './account-routing.page.module'; + +import { COMPONENTS } from './components'; + +@NgModule({ + imports: [ + CommonModule, + FlexLayoutModule, + MatButtonModule, + UCapUiAccountModule, + AppAccountRoutingPageModule + ], + declarations: [...COMPONENTS], + entryComponents: [] +}) +export class AppAccountPageModule {} diff --git a/projects/ucap-webmessenger-app/src/app/pages/account/components/index.ts b/projects/ucap-webmessenger-app/src/app/pages/account/components/index.ts new file mode 100644 index 0000000..add2c23 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/pages/account/components/index.ts @@ -0,0 +1,3 @@ +import { LoginPageComponent } from './login.page.component'; + +export const COMPONENTS = [LoginPageComponent]; diff --git a/projects/ucap-webmessenger-app/src/app/pages/account/components/login.page.component.html b/projects/ucap-webmessenger-app/src/app/pages/account/components/login.page.component.html new file mode 100644 index 0000000..9c4e1c3 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/pages/account/components/login.page.component.html @@ -0,0 +1,19 @@ + diff --git a/projects/ucap-webmessenger-app/src/app/pages/account/components/login.page.component.scss b/projects/ucap-webmessenger-app/src/app/pages/account/components/login.page.component.scss new file mode 100644 index 0000000..89cce1c --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/pages/account/components/login.page.component.scss @@ -0,0 +1,14 @@ +.login { + width: 100%; + background-size: cover; + height: 100%; + background: #eaeff1; + background: -webkit-linear-gradient(to top, #93a3af, #eaeff1); + background: linear-gradient(to top, #93a3af, #eaeff1); + + .login-wrapper { + flex: 1 0 auto; + background: url(/assets/images/bg_login.png)no-repeat 50% bottom; + background-size: 100% auto; + } +} diff --git a/projects/ucap-webmessenger-app/src/app/pages/account/components/login.page.component.spec.ts b/projects/ucap-webmessenger-app/src/app/pages/account/components/login.page.component.spec.ts new file mode 100644 index 0000000..b619869 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/pages/account/components/login.page.component.spec.ts @@ -0,0 +1,12 @@ +import { TestBed, async } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; +import { LoginPageComponent } from './login.page.component'; + +describe('LoginPageComponent', () => { + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [RouterTestingModule], + declarations: [LoginPageComponent] + }).compileComponents(); + })); +}); diff --git a/projects/ucap-webmessenger-app/src/app/pages/account/components/login.page.component.ts b/projects/ucap-webmessenger-app/src/app/pages/account/components/login.page.component.ts new file mode 100644 index 0000000..ac5f6ef --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/pages/account/components/login.page.component.ts @@ -0,0 +1,58 @@ +import { Component, OnInit } from '@angular/core'; + +import { Store, select } from '@ngrx/store'; + +import { Company } from '@ucap-webmessenger/api-external'; + +import * as AppStore from '@app/store'; +import * as AuthenticationStore from '@app/store/account/authentication'; +import * as CompanyStore from '@app/store/setting/company'; +import { Observable } from 'rxjs'; +import { Router } from '@angular/router'; + +@Component({ + selector: 'app-page-account-login', + templateUrl: './login.page.component.html', + styleUrls: ['./login.page.component.scss'] +}) +export class LoginPageComponent implements OnInit { + companyList$: Observable; + + constructor(private store: Store, private router: Router) {} + + ngOnInit(): void { + this.store.dispatch( + CompanyStore.companyList({ + companyGroupCode: 'LG' + }) + ); + + this.companyList$ = this.store.pipe( + select(AppStore.SettingSelector.CompanySelector.companyList) + ); + } + + onLogin(value: { + companyCode: string; + loginId: string; + loginPw: string; + rememberMe: boolean; + notValid: () => void; + }) { + this.store.dispatch( + AuthenticationStore.webLogin({ + loginInfo: { + companyCode: value.companyCode, + companyGroupType: 'C', + loginId: value.loginId, + loginPw: value.loginPw + }, + rememberMe: value.rememberMe + }) + ); + } + + onClickTemplate() { + this.router.navigate(['/template']); + } +} diff --git a/projects/ucap-webmessenger-app/src/app/pages/messenger/components/index.ts b/projects/ucap-webmessenger-app/src/app/pages/messenger/components/index.ts new file mode 100644 index 0000000..f9feba8 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/pages/messenger/components/index.ts @@ -0,0 +1,3 @@ +import { MainPageComponent } from './main.page.component'; + +export const COMPONENTS = [MainPageComponent]; diff --git a/projects/ucap-webmessenger-app/src/app/pages/messenger/components/main.page.component.html b/projects/ucap-webmessenger-app/src/app/pages/messenger/components/main.page.component.html new file mode 100644 index 0000000..5937aba --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/pages/messenger/components/main.page.component.html @@ -0,0 +1,26 @@ +
+
+ +
+ +
+ + + +
+ +

Auto-resizing sidenav

+
+
+ + +
diff --git a/projects/ucap-webmessenger-app/src/app/pages/messenger/components/main.page.component.scss b/projects/ucap-webmessenger-app/src/app/pages/messenger/components/main.page.component.scss new file mode 100644 index 0000000..1da00d2 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/pages/messenger/components/main.page.component.scss @@ -0,0 +1,29 @@ +.container { + height: 100%; + display: flex; + flex-flow: row; + padding-top: 30px; + border:3px solid #4f4f4f; + border-top:none; + + .left-side { + width: 380px; + height: 100%; + flex: 0 0 auto; + position: relative; + } + .contents { + flex: 1 1 auto; + min-width: 400px; + height: 100%; + + .messages { + width: 100%; + height: 100%; + } + } + .right-side { + height: 100%; + flex: 0 0 auto; + } +} diff --git a/projects/ucap-webmessenger-app/src/app/pages/messenger/components/main.page.component.spec.ts b/projects/ucap-webmessenger-app/src/app/pages/messenger/components/main.page.component.spec.ts new file mode 100644 index 0000000..6275956 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/pages/messenger/components/main.page.component.spec.ts @@ -0,0 +1,12 @@ +import { TestBed, async } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; +import { MainPageComponent } from './main.page.component'; + +describe('MainPageComponent', () => { + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [RouterTestingModule], + declarations: [MainPageComponent] + }).compileComponents(); + })); +}); diff --git a/projects/ucap-webmessenger-app/src/app/pages/messenger/components/main.page.component.ts b/projects/ucap-webmessenger-app/src/app/pages/messenger/components/main.page.component.ts new file mode 100644 index 0000000..4f88b72 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/pages/messenger/components/main.page.component.ts @@ -0,0 +1,63 @@ +import { map, tap } from 'rxjs/operators'; +import { Component, OnInit, Inject, OnDestroy } from '@angular/core'; + +import { Store, select } from '@ngrx/store'; + +import * as AppSotre from '@app/store'; +import { Observable, Subscription } from 'rxjs'; +import { + WindowIdle, + UCAP_NATIVE_SERVICE, + NativeService +} from '@ucap-webmessenger/native'; +import { StatusProtocolService } from '@ucap-webmessenger/protocol-status'; +import { StatusType, StatusCode } from '@ucap-webmessenger/core'; + +@Component({ + selector: 'app-page-messenger-main', + templateUrl: './main.page.component.html', + styleUrls: ['./main.page.component.scss'] +}) +export class MainPageComponent implements OnInit { + selectedChat$: Observable; + idleStateChangedSubscription: Subscription; + + constructor( + @Inject(UCAP_NATIVE_SERVICE) private nativeService: NativeService, + private store: Store, + private statusProtocolService: StatusProtocolService + ) {} + + ngOnInit(): void { + this.selectedChat$ = this.store.pipe( + select(AppSotre.MessengerSelector.ChatSelector.selectedRoom) + ); + + this.idleStateChangedSubscription = this.nativeService + .idleStateChanged() + .subscribe(action => { + console.log(action); + let statusType: StatusCode; + + if (action === 'IDLE') { + // away + statusType = StatusCode.Away; + } else { + // online + statusType = StatusCode.OnLine; + } + + this.statusProtocolService.status({ + statusDivisionType: StatusType.Messenger, + statusType, + statusMessage: '' + }); + }); + } + + OnDestroy(): void { + if (!!this.idleStateChangedSubscription) { + this.idleStateChangedSubscription.unsubscribe(); + } + } +} diff --git a/projects/ucap-webmessenger-app/src/app/pages/messenger/messenger-routing.page.module.ts b/projects/ucap-webmessenger-app/src/app/pages/messenger/messenger-routing.page.module.ts new file mode 100644 index 0000000..511bb95 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/pages/messenger/messenger-routing.page.module.ts @@ -0,0 +1,22 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +import { MainPageComponent } from './components/main.page.component'; +import { AppMessengerResolver } from '@app/resolvers/messenger.resolver'; + +const routes: Routes = [ + { path: '', redirectTo: 'main', pathMatch: 'full' }, + { + path: 'main', + component: MainPageComponent, + resolve: { + protocol: AppMessengerResolver + } + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class AppMessengerRoutingPageModule {} diff --git a/projects/ucap-webmessenger-app/src/app/pages/messenger/messenger.page.module.ts b/projects/ucap-webmessenger-app/src/app/pages/messenger/messenger.page.module.ts new file mode 100644 index 0000000..e788e7e --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/pages/messenger/messenger.page.module.ts @@ -0,0 +1,25 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +import { FlexLayoutModule } from '@angular/flex-layout'; + +import { MatSidenavModule } from '@angular/material/sidenav'; + +import { AppMessengerLayoutModule } from '@app/layouts/messenger/messenger.layout.module'; + +import { AppMessengerRoutingPageModule } from './messenger-routing.page.module'; + +import { COMPONENTS } from './components'; + +@NgModule({ + imports: [ + CommonModule, + FlexLayoutModule, + MatSidenavModule, + AppMessengerLayoutModule, + AppMessengerRoutingPageModule + ], + declarations: [...COMPONENTS], + entryComponents: [] +}) +export class AppMessengerPageModule {} diff --git a/projects/ucap-webmessenger-app/src/app/pages/template/components/index.ts b/projects/ucap-webmessenger-app/src/app/pages/template/components/index.ts new file mode 100644 index 0000000..66d4a5f --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/pages/template/components/index.ts @@ -0,0 +1,90 @@ +import { TemplatePageComponent } from './template.page.component'; + +export const COMPONENTS = [TemplatePageComponent]; + +import { A11yModule } from '@angular/cdk/a11y'; +import { DragDropModule } from '@angular/cdk/drag-drop'; +import { PortalModule } from '@angular/cdk/portal'; +import { ScrollingModule } from '@angular/cdk/scrolling'; +import { CdkStepperModule } from '@angular/cdk/stepper'; +import { CdkTableModule } from '@angular/cdk/table'; +import { CdkTreeModule } from '@angular/cdk/tree'; +import { MatAutocompleteModule } from '@angular/material/autocomplete'; +import { MatBadgeModule } from '@angular/material/badge'; +import { MatBottomSheetModule } from '@angular/material/bottom-sheet'; +import { MatButtonModule } from '@angular/material/button'; +import { MatButtonToggleModule } from '@angular/material/button-toggle'; +import { MatCardModule } from '@angular/material/card'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatChipsModule } from '@angular/material/chips'; +import { MatStepperModule } from '@angular/material/stepper'; +import { MatDatepickerModule } from '@angular/material/datepicker'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatExpansionModule } from '@angular/material/expansion'; +import { MatGridListModule } from '@angular/material/grid-list'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatListModule } from '@angular/material/list'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatNativeDateModule, MatRippleModule } from '@angular/material/core'; +import { MatPaginatorModule } from '@angular/material/paginator'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { MatRadioModule } from '@angular/material/radio'; +import { MatSelectModule } from '@angular/material/select'; +import { MatSidenavModule } from '@angular/material/sidenav'; +import { MatSliderModule } from '@angular/material/slider'; +import { MatSlideToggleModule } from '@angular/material/slide-toggle'; +import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatSortModule } from '@angular/material/sort'; +import { MatTableModule } from '@angular/material/table'; +import { MatTabsModule } from '@angular/material/tabs'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { MatTreeModule } from '@angular/material/tree'; + +export const MET_MODULES = [ + A11yModule, + CdkStepperModule, + CdkTableModule, + CdkTreeModule, + DragDropModule, + MatAutocompleteModule, + MatBadgeModule, + MatBottomSheetModule, + MatButtonModule, + MatButtonToggleModule, + MatCardModule, + MatCheckboxModule, + MatChipsModule, + MatStepperModule, + MatDatepickerModule, + MatDialogModule, + MatDividerModule, + MatExpansionModule, + MatGridListModule, + MatIconModule, + MatInputModule, + MatListModule, + MatMenuModule, + MatNativeDateModule, + MatPaginatorModule, + MatProgressBarModule, + MatProgressSpinnerModule, + MatRadioModule, + MatRippleModule, + MatSelectModule, + MatSidenavModule, + MatSliderModule, + MatSlideToggleModule, + MatSnackBarModule, + MatSortModule, + MatTableModule, + MatTabsModule, + MatToolbarModule, + MatTooltipModule, + MatTreeModule, + PortalModule, + ScrollingModule +]; diff --git a/projects/ucap-webmessenger-app/src/app/pages/template/components/template.page.component.html b/projects/ucap-webmessenger-app/src/app/pages/template/components/template.page.component.html new file mode 100644 index 0000000..b0b630a --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/pages/template/components/template.page.component.html @@ -0,0 +1,170 @@ +
+ + +

User-list-item

+
+ + + + + + +
+

Organization

+
+
+
+ Tenant Search +
+
+ + +
+
+
+

Chat

+
+ + +
+ +
diff --git a/projects/ucap-webmessenger-app/src/app/pages/template/components/template.page.component.scss b/projects/ucap-webmessenger-app/src/app/pages/template/components/template.page.component.scss new file mode 100644 index 0000000..2454c59 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/pages/template/components/template.page.component.scss @@ -0,0 +1,4 @@ +div.template { + height: 100%; + overflow-y: auto; +} diff --git a/projects/ucap-webmessenger-app/src/app/pages/template/components/template.page.component.spec.ts b/projects/ucap-webmessenger-app/src/app/pages/template/components/template.page.component.spec.ts new file mode 100644 index 0000000..137ae2a --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/pages/template/components/template.page.component.spec.ts @@ -0,0 +1,27 @@ +/* tslint:disable:no-unused-variable */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { DebugElement } from '@angular/core'; + +import { TemplatePageComponent } from './template.page.component'; + +describe('TemplatePageComponent', () => { + let component: TemplatePageComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [TemplatePageComponent] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TemplatePageComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/projects/ucap-webmessenger-app/src/app/pages/template/components/template.page.component.ts b/projects/ucap-webmessenger-app/src/app/pages/template/components/template.page.component.ts new file mode 100644 index 0000000..56854de --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/pages/template/components/template.page.component.ts @@ -0,0 +1,390 @@ +import { Component, OnInit } from '@angular/core'; +import { UserInfo } from '@ucap-webmessenger/protocol-sync'; +import { + EmployeeType, + RoomInfo, + RoomType +} from '@ucap-webmessenger/protocol-room'; +import { RoleCode } from '@ucap-webmessenger/protocol-authentication'; +import { + StatusBulkInfo, + TerminalStatusInfo, + TerminalStatusNumber +} from '@ucap-webmessenger/protocol-status'; +import { Router } from '@angular/router'; +import { Company } from '@ucap-webmessenger/api-external'; +import { EventType, Info, EventJson } from '@ucap-webmessenger/protocol-event'; +import { VersionInfo2Response } from '@ucap-webmessenger/api-public'; +import { StatusCode as ApiStatusCode } from '@ucap-webmessenger/api'; +import { StatusCode } from '@ucap-webmessenger/core'; + +@Component({ + selector: 'app-template.page', + templateUrl: './template.page.component.html', + styleUrls: ['./template.page.component.scss'] +}) +export class TemplatePageComponent implements OnInit { + profileImageRoot = 'http://27.122.224.170:8011/ProfileImage'; + + userInfo: UserInfo = buddyData; + + presence: StatusBulkInfo = status; + + companyList: Company[] = companyList; + + companyCode: string = 'GUC006'; + + roomInfo: RoomInfo = roomInfo; + + sessionVerinfo: VersionInfo2Response; + + constructor(private router: Router) {} + + ngOnInit() { + this.sessionVerinfo = { + statusCode: ApiStatusCode.Success, + errorMessage: '', + profileRoot: this.profileImageRoot + }; + } + + onClickLogin() { + this.router.navigate(['/account/login']); + } +} + +export const status: StatusBulkInfo = { + // 사용자SEQ + userSeq: 15, + // 상태코드(PC) + pcStatus: StatusCode.Away, + // 상태코드(통화) + phoneStatus: StatusCode.Offline, + // 상태코드(모바일) + mobileStatus: StatusCode.OnLine, + // 상태코드(PC화상) + conferenceStatus: StatusCode.Offline, + // 상태메시지 + statusMessage: '다른용무중', + // 상태코드(Mobile화상) + mobileConferenceStatus: StatusCode.Offline, + // 상태코드(iMessenger) + imessengerStatus: StatusCode.Offline, + // 단말상태정보(s) + terminalStatus: TerminalStatusInfo.Idle, + // 단말상태번호(n) + terminalStatusNumber: TerminalStatusNumber.Idle +}; +export const buddyData: UserInfo = { + seq: 15, + name: '채희중', + profileImageFile: '/2017/08/09/PF_15_174154508.jpeg', + grade: '책임', + intro: '프로필정보 변경됨.', + companyCode: 'GUC006', + hpNumber: '01089339833', + lineNumber: '01089339833', + email: 'hjchae72@lgcns.com', + isMobile: false, + deptName: 'UCAP TEAM', + isFavorit: false, + isBuddy: true, + isActive: true, + roleCd: RoleCode.CompanyExcludeSync, + employeeNum: ' ', + madn: '0033', + hardSadn: ' ', + fmcSadn: '0033', + nameEn: 'HUI JOONG CHAE', + nameCn: ' ', + gradeEn: 'Business Engineering', + gradeCn: ' ', + deptNameEn: ' ', + deptNameCn: ' ', + isPrivacyAgree: true, + isValidLogin: true, + employeeType: EmployeeType.Regular, + nickName: '채책임(닉)' +}; + +const roomInfo: RoomInfo = { + roomSeq: '2530', + roomType: RoomType.Single, + roomName: ' ', + finalEventType: EventType.Character, + finalEventMessage: '비밀 대화방입니다', + finalEventDate: '2019-09-30 13:57:06', + joinUserCount: 2, + noReadCnt: 0, + receiveAlarm: true, + isJoinRoom: true, + expiredFileStdSeq: 0, + isTimeRoom: true, + timeRoomInterval: 5 +}; + +const companyList: Company[] = [ + { + companyCode: 'GUC002', + companyName: 'LG Electronics.', + companyDomain: 'lge.com', + companyConfAuthYn: 'N', + ucapUseYn: 'Y', + companyTimerChatAuthYn: 'Y' + }, + { + companyCode: 'GUC040', + companyName: 'LGE한국영업협력사', + companyDomain: 'lgepartner.com', + companyConfAuthYn: 'Y', + ucapUseYn: 'Y', + companyTimerChatAuthYn: 'Y' + }, + { + companyCode: 'GUC021', + companyName: 'LG이노텍', + companyDomain: 'lginnotek.com', + companyConfAuthYn: 'N', + ucapUseYn: 'Y', + companyTimerChatAuthYn: 'Y' + }, + { + companyCode: 'GUC036', + companyName: '하이프라자', + companyDomain: 'hiplaza.co.kr', + companyConfAuthYn: 'Y', + ucapUseYn: 'Y', + companyTimerChatAuthYn: 'Y' + }, + { + companyCode: 'GUC006', + companyName: 'LG CNS', + companyDomain: 'lgcns.com', + companyConfAuthYn: 'Y', + ucapUseYn: 'Y', + companyTimerChatAuthYn: 'Y' + }, + { + companyCode: 'GUC041', + companyName: 'LGEIL', + companyDomain: 'lgeil.com', + companyConfAuthYn: 'Y', + ucapUseYn: 'Y', + companyTimerChatAuthYn: 'Y' + }, + { + companyCode: 'GUC100', + companyName: 'LG UCAP', + companyDomain: 'lgucap.com', + companyConfAuthYn: 'Y', + ucapUseYn: 'Y', + companyTimerChatAuthYn: 'Y' + }, + { + companyCode: 'GUCIM', + companyName: '아메사용회사', + companyDomain: 'test.com', + companyConfAuthYn: 'N', + ucapUseYn: 'N', + companyTimerChatAuthYn: 'Y' + }, + { + companyCode: 'GUC005', + companyName: 'LG화학', + companyDomain: 'lgchem.com', + companyConfAuthYn: 'N', + ucapUseYn: 'Y', + companyTimerChatAuthYn: 'Y' + }, + { + companyCode: 'GSGAL', + companyName: 'GS칼텍스', + companyDomain: 'gscaltex.com', + companyConfAuthYn: 'N', + ucapUseYn: 'Y', + companyTimerChatAuthYn: 'Y' + }, + { + companyCode: 'GUC001', + companyName: 'LG U+', + companyDomain: 'lguplus.com', + companyConfAuthYn: 'N', + ucapUseYn: 'Y', + companyTimerChatAuthYn: 'Y' + }, + { + companyCode: 'GUC007', + companyName: 'LG Display', + companyDomain: 'lgdisplay.com', + companyConfAuthYn: 'N', + ucapUseYn: 'Y', + companyTimerChatAuthYn: 'N' + }, + { + companyCode: 'GUC011', + companyName: 'LG인화원', + companyDomain: 'lgacademy.com', + companyConfAuthYn: 'N', + ucapUseYn: 'Y', + companyTimerChatAuthYn: 'Y' + }, + { + companyCode: 'GUC013', + companyName: 'LG MMA', + companyDomain: 'lgmma.com', + companyConfAuthYn: 'N', + ucapUseYn: 'Y', + companyTimerChatAuthYn: 'Y' + }, + { + companyCode: 'GUC015', + companyName: '(주)LG', + companyDomain: 'lg.com', + companyConfAuthYn: 'N', + ucapUseYn: 'Y', + companyTimerChatAuthYn: 'Y' + }, + { + companyCode: 'GUC016', + companyName: 'LGERI', + companyDomain: 'lgeri.com', + companyConfAuthYn: 'N', + ucapUseYn: 'Y', + companyTimerChatAuthYn: 'Y' + }, + { + companyCode: 'GUC024', + companyName: 'LG Hausys', + companyDomain: 'lghausys.com', + companyConfAuthYn: 'N', + ucapUseYn: 'Y', + companyTimerChatAuthYn: 'Y' + }, + { + companyCode: 'GUC028', + companyName: 'LG상사', + companyDomain: 'lgi.co.kr', + companyConfAuthYn: 'N', + ucapUseYn: 'Y', + companyTimerChatAuthYn: 'Y' + }, + { + companyCode: 'GUC032', + companyName: '코리아일레콤', + companyDomain: 'koreaelecom.com', + companyConfAuthYn: 'N', + ucapUseYn: 'Y', + companyTimerChatAuthYn: 'Y' + }, + { + companyCode: 'GUC035', + companyName: 'HLDS', + companyDomain: 'hlds.co.kr', + companyConfAuthYn: 'N', + ucapUseYn: 'Y', + companyTimerChatAuthYn: 'Y' + }, + { + companyCode: 'GUC038', + companyName: 'BizTech Partners', + companyDomain: 'GUC018', + companyConfAuthYn: 'N', + ucapUseYn: 'Y', + companyTimerChatAuthYn: 'Y' + }, + { + companyCode: 'GUC042', + companyName: 'Japan R&D Lab', + companyDomain: 'lgjlab.com', + companyConfAuthYn: 'N', + ucapUseYn: 'Y', + companyTimerChatAuthYn: 'Y' + } +]; + +const eventInfo: Info[] = [ + { + seq: 6, + type: EventType.Character, + senderSeq: 504688, + sendDate: '2019-10-08 14:28:43', + sentMessage: '테스트1111', + receiverCount: 2 + }, + { + seq: 20, + type: EventType.File, + senderSeq: 509747, + sendDate: '2019-10-15 17:18:49', + sentMessage: + '{\r\n"StatusCode":"200",\r\n"ErrorMessage":"",\r\n"RoomID":"0",\r\n"FileName":"1.jpg",\r\n"FileExt":"jpg",\r\n"FileType":"I",\r\n"ThumbURL":"http://27.122.224.170:8011/WebFile/GUC006/2019/10/15/MA_509747_17184948.jpg.thumb.jpg",\r\n"AttSEQ":"2964",\r\n"AttSize":"879394",\r\n"AttRegDate":"2019-10-15 17:18:49",\r\n"ImageWidth":"320",\r\n"ImageHeight":"240",\r\n"CompanyCode":"GUC006",\r\n"VoiceTime":"",\r\n"SynappKey":""\r\n}', + receiverCount: 2 + }, + { + seq: 21, + type: EventType.File, + senderSeq: 509747, + sendDate: '2019-10-15 17:20:24', + sentMessage: + '{\r\n"StatusCode":"200",\r\n"ErrorMessage":"",\r\n"RoomID":"0",\r\n"FileName":"dummy_더미.txt",\r\n"FileExt":"txt",\r\n"FileType":"F",\r\n"ThumbURL":"",\r\n"AttSEQ":"2965",\r\n"AttSize":"1736",\r\n"AttRegDate":"2019-10-15 17:20:23",\r\n"ImageWidth":"320",\r\n"ImageHeight":"320",\r\n"CompanyCode":"GUC006",\r\n"VoiceTime":"",\r\n"SynappKey":""\r\n}', + receiverCount: 2 + }, + { + seq: 22, + type: EventType.File, + senderSeq: 509747, + sendDate: '2019-10-15 17:21:10', + sentMessage: + '{\r\n"StatusCode":"200",\r\n"ErrorMessage":"",\r\n"RoomID":"0",\r\n"FileName":"The_Power_of_Teamwork_-_Funny_Animation.mp4",\r\n"FileExt":"mp4",\r\n"FileType":"V",\r\n"ThumbURL":"",\r\n"AttSEQ":"2966",\r\n"AttSize":"4476141",\r\n"AttRegDate":"2019-10-15 17:21:10",\r\n"ImageWidth":"320",\r\n"ImageHeight":"320",\r\n"CompanyCode":"GUC006",\r\n"VoiceTime":"",\r\n"SynappKey":""\r\n}', + receiverCount: 2 + }, + { + seq: 3, + type: EventType.MassText, + senderSeq: 10642, + sendDate: '2019-09-19 09:46:24', + sentMessage: + '{"StatusCode":"200","ErrorMessage":"","EventMassSeq":"1011","RoomID":"2479","RegDate":"","Content":"RequestMassEventSendRequestMassEventSendRequestMassEventSendRequestMassEventSendRequestMassEventSendRequestMassEventSendRequestMassEventSendRequestMassEventSendRequestMassEventSendRequestMassEventSendRequestMassEventSendRequestMassEventSendRequestMassEventSendRequestMassEventSendRequestMassEventSend"}', + receiverCount: 2 + }, + { + seq: 1, + type: EventType.Join, + senderSeq: 509747, + sendDate: '2019-10-15 17:23:26', + sentMessage: '이진호2,T10112,T10222,이진호', + receiverCount: 4 + }, + { + seq: 4, + type: EventType.Exit, + senderSeq: 509747, + sendDate: '2019-10-15 17:24:15', + sentMessage: '이진호2', + receiverCount: 3 + }, + { + seq: 19, + type: EventType.RecalledMessage, + senderSeq: 509747, + sendDate: '2019-10-15 16:36:47', + sentMessage: 'aaaaaa', + receiverCount: 2 + }, + { + seq: 25, + type: EventType.RenameRoom, + senderSeq: 509747, + sendDate: '2019-10-15 17:25:55', + sentMessage: '이진호2,이진호,이진호2 바꿔', + receiverCount: 2 + }, + { + receiverCount: 2, + sendDate: '2019-10-15 17:28:13', + senderSeq: 509747, + sentMessage: '509747,43200', + seq: 5, + type: EventType.GuideForRoomTimerChanged + } +]; diff --git a/projects/ucap-webmessenger-app/src/app/pages/template/template-routing.page.module.ts b/projects/ucap-webmessenger-app/src/app/pages/template/template-routing.page.module.ts new file mode 100644 index 0000000..9066485 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/pages/template/template-routing.page.module.ts @@ -0,0 +1,17 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; +import { TemplatePageComponent } from './components/template.page.component'; + +const routes: Routes = [ + { path: '', redirectTo: '/template/page', pathMatch: 'full' }, + { + path: 'page', + component: TemplatePageComponent + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class AppTemplateRoutingPageModule {} diff --git a/projects/ucap-webmessenger-app/src/app/pages/template/template.page.module.ts b/projects/ucap-webmessenger-app/src/app/pages/template/template.page.module.ts new file mode 100644 index 0000000..7c8af44 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/pages/template/template.page.module.ts @@ -0,0 +1,34 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +import { FlexLayoutModule } from '@angular/flex-layout'; + +import { MatButtonModule } from '@angular/material/button'; + +import { UCapUiChatModule } from '@ucap-webmessenger/ui-chat'; +import { UCapUiRoomModule } from '@ucap-webmessenger/ui-room'; +import { UCapUiGroupModule } from '@ucap-webmessenger/ui-group'; +import { UCapUiOrganizationModule } from '@ucap-webmessenger/ui-organization'; +import { UCapUiProfileModule } from '@ucap-webmessenger/ui-profile'; + +import { AppTemplateRoutingPageModule } from './template-routing.page.module'; + +import { COMPONENTS, MET_MODULES } from './components'; + +@NgModule({ + imports: [ + ...MET_MODULES, + CommonModule, + FlexLayoutModule, + MatButtonModule, + UCapUiChatModule, + UCapUiRoomModule, + UCapUiGroupModule, + UCapUiOrganizationModule, + UCapUiProfileModule, + AppTemplateRoutingPageModule + ], + declarations: [...COMPONENTS], + entryComponents: [] +}) +export class AppTemplatePageModule {} diff --git a/projects/ucap-webmessenger-app/src/app/resolvers/index.ts b/projects/ucap-webmessenger-app/src/app/resolvers/index.ts new file mode 100644 index 0000000..9b95c26 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/resolvers/index.ts @@ -0,0 +1,3 @@ +import { AppMessengerResolver } from './messenger.resolver'; + +export const RESOLVERS = [AppMessengerResolver]; diff --git a/projects/ucap-webmessenger-app/src/app/resolvers/messenger.resolver.ts b/projects/ucap-webmessenger-app/src/app/resolvers/messenger.resolver.ts new file mode 100644 index 0000000..7673716 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/resolvers/messenger.resolver.ts @@ -0,0 +1,200 @@ +import { Injectable } from '@angular/core'; +import { + Resolve, + ActivatedRouteSnapshot, + RouterStateSnapshot +} from '@angular/router'; +import { Observable, throwError, forkJoin } from 'rxjs'; +import { + map, + tap, + catchError, + take, + switchMap, + withLatestFrom +} from 'rxjs/operators'; + +import { Store, select } from '@ngrx/store'; + +import { ProtocolService } from '@ucap-webmessenger/protocol'; +import { SessionStorageService } from '@ucap-webmessenger/web-storage'; +import { + PublicApiService, + VersionInfo2Response +} from '@ucap-webmessenger/api-public'; + +import { + LoginInfo, + KEY_LOGIN_INFO, + EnvironmentsInfo, + KEY_ENVIRONMENTS_INFO +} from '@app/types'; +import { InnerProtocolService } from '@ucap-webmessenger/protocol-inner'; +import { + AuthenticationProtocolService, + SSOMode, + LoginResponse +} from '@ucap-webmessenger/protocol-authentication'; + +import * as AuthenticationStore from '@app/store/account/authentication'; +import { NGXLogger } from 'ngx-logger'; +import { QueryProtocolService } from '@ucap-webmessenger/protocol-query'; +import { OptionProtocolService } from '@ucap-webmessenger/protocol-option'; + +import * as AppStore from '@app/store'; +import * as CompanyStore from '@app/store/setting/company'; +import * as VersionInfoStore from '@app/store/setting/version-info'; +import * as OptionStore from '@app/store/messenger/option'; +import * as QueryStore from '@app/store/messenger/query'; +import * as SyncStore from '@app/store/messenger/sync'; +import { KEY_VER_INFO } from '@app/types/ver-info.type'; +import { KEY_LOGIN_RES_INFO } from '@app/types/login-res-info.type'; + +@Injectable() +export class AppMessengerResolver implements Resolve { + constructor( + private store: Store, + private sessionStorageService: SessionStorageService, + private publicApiService: PublicApiService, + private protocolService: ProtocolService, + private queryProtocolService: QueryProtocolService, + private optionProtocolService: OptionProtocolService, + private authenticationProtocolService: AuthenticationProtocolService, + private innerProtocolService: InnerProtocolService, + private logger: NGXLogger + ) {} + + resolve( + activatedRouteSnapshot: ActivatedRouteSnapshot, + routerStateSnapshot: RouterStateSnapshot + ): void | Observable | Promise { + return new Promise((resolve, reject) => { + let loginRes: LoginResponse; + + const loginInfo = this.sessionStorageService.get( + KEY_LOGIN_INFO + ); + const environmentsInfo = this.sessionStorageService.get( + KEY_ENVIRONMENTS_INFO + ); + + this.publicApiService + .versionInfo2({ + deviceType: environmentsInfo.deviceType, + companyGroupType: loginInfo.companyGroupType, + companyCode: loginInfo.companyCode, + loginId: loginInfo.loginId + }) + .pipe( + take(1), + tap(res => { + this.sessionStorageService.set( + KEY_VER_INFO, + res + ); + this.store.dispatch(VersionInfoStore.versionInfo2Success({ res })); + }), + switchMap(res => { + return this.protocolService.connect(res.serverIp); + }), + switchMap(() => this.innerProtocolService.conn({})), + switchMap(res => { + return this.authenticationProtocolService.login({ + loginId: loginInfo.loginId, + loginPw: loginInfo.loginPw, + deviceType: environmentsInfo.deviceType, + deviceId: ' ', + token: '', + localeCode: loginInfo.localeCode, + pushId: ' ', + companyCode: loginInfo.companyCode, + passwordEncodingType: 1, + clientVersion: '', + reconnect: false, + ip: 'localhost', + hostName: '', + ssoMode: SSOMode.AUTH, + userSpecificInformation: 'PRO_000482', + productId: 'PRO_000482', + productName: 'EZMessenger' + }); + }), + switchMap(res => { + loginRes = res; + + this.sessionStorageService.set(KEY_LOGIN_RES_INFO, { + ...loginRes + }); + + return forkJoin([ + this.queryProtocolService.auth({ + deviceType: environmentsInfo.deviceType + }), + this.optionProtocolService.regView({}) + ]); + }), + map(([authRes, regViewRes]) => { + this.store.dispatch( + OptionStore.regViewSuccess({ res: regViewRes }) + ); + this.store.dispatch(QueryStore.authSuccess({ res: authRes })); + + this.store.dispatch( + CompanyStore.companyList({ + companyGroupCode: 'LG' + }) + ); + + // this.store.dispatch(AuthenticationStore.postLogin({ loginRes })); + }), + withLatestFrom( + this.store.pipe( + select( + AppStore.MessengerSelector.SyncSelector.selectBuddy2SyncDate + ) + ), + this.store.pipe( + select( + AppStore.MessengerSelector.SyncSelector.selectGroup2SyncDate + ) + ), + this.store.pipe( + select(AppStore.MessengerSelector.SyncSelector.selectRoomSyncDate) + ) + ), + map(([_, buddy2SyncDate, group2SyncDate, roomSyncDate]) => { + this.store.dispatch(SyncStore.buddy2({ syncDate: buddy2SyncDate })); + this.store.dispatch(SyncStore.group2({ syncDate: group2SyncDate })); + this.store.dispatch( + SyncStore.room({ + syncDate: roomSyncDate, + localeCode: loginInfo.localeCode + }) + ); + this.store.dispatch( + QueryStore.dept({ + divCd: 'ORG', + companyCode: loginInfo.companyCode + }) + ); + }), + catchError(err => { + return throwError(err); + }) + ) + .subscribe( + () => { + this.store.dispatch( + AuthenticationStore.loginSuccess({ + loginRes + }) + ); + resolve(); + }, + err => { + reject(err); + } + ); + }); + } +} diff --git a/projects/ucap-webmessenger-app/src/app/services/app.service.ts b/projects/ucap-webmessenger-app/src/app/services/app.service.ts new file mode 100644 index 0000000..7e9f0a7 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/services/app.service.ts @@ -0,0 +1,44 @@ +import { Injectable } from '@angular/core'; +import { AppNotificationService } from './notification.service'; +import { SessionStorageService } from '@ucap-webmessenger/web-storage'; +import { EnviromentUtilService } from '@ucap-webmessenger/util'; +import { DeviceType } from '@ucap-webmessenger/core'; +import { EnvironmentsInfo, KEY_ENVIRONMENTS_INFO } from '@app/types'; + +@Injectable() +export class AppService { + constructor( + private enviromentUtilService: EnviromentUtilService, + private sessionStorageService: SessionStorageService, + private appNotificationService: AppNotificationService + ) {} + + public postInit(): Promise { + return new Promise((resolve, reject) => { + try { + let deviceType: DeviceType; + if (this.enviromentUtilService.nodeWebkit()) { + deviceType = DeviceType.PC; + } else if (this.enviromentUtilService.android()) { + deviceType = DeviceType.Android; + } else if (this.enviromentUtilService.ios()) { + deviceType = DeviceType.iOS; + } else { + deviceType = DeviceType.Web; + } + + this.sessionStorageService.set( + KEY_ENVIRONMENTS_INFO, + { + deviceType + } + ); + + this.appNotificationService.subscribe(); + resolve(); + } catch (error) { + reject(); + } + }); + } +} diff --git a/projects/ucap-webmessenger-app/src/app/services/authentication.service.ts b/projects/ucap-webmessenger-app/src/app/services/authentication.service.ts new file mode 100644 index 0000000..07d9aff --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/services/authentication.service.ts @@ -0,0 +1,49 @@ +import { Injectable } from '@angular/core'; + +import CryptoJS from 'crypto-js'; + +import { + SessionStorageService, + LocalStorageService +} from '@ucap-webmessenger/web-storage'; +import { LocaleCode } from '@ucap-webmessenger/core'; +import { LoginInfo, KEY_LOGIN_INFO } from '../types'; + +@Injectable({ + providedIn: 'root' +}) +export class AppAuthenticationService { + showLoader = false; + + constructor( + private sessionStorageService: SessionStorageService, + private localStorageService: LocalStorageService + ) {} + + authenticated(): boolean { + const loginInfo = this.sessionStorageService.get(KEY_LOGIN_INFO); + return null !== loginInfo && !!loginInfo.loginId; + } + + login(loginInfo: LoginInfo, rememberMe: boolean) { + loginInfo = { ...loginInfo, localeCode: LocaleCode.Korean }; + + this.sessionStorageService.set(KEY_LOGIN_INFO, { + ...loginInfo, + loginPw: CryptoJS.enc.Hex.stringify(CryptoJS.SHA256(loginInfo.loginPw)) + }); + + if (rememberMe) { + this.localStorageService.set(KEY_LOGIN_INFO, { + ...loginInfo, + loginPw: undefined + }); + } else { + this.localStorageService.remove(KEY_LOGIN_INFO); + } + } + + logout() { + this.sessionStorageService.remove(KEY_LOGIN_INFO); + } +} diff --git a/projects/ucap-webmessenger-app/src/app/services/index.ts b/projects/ucap-webmessenger-app/src/app/services/index.ts new file mode 100644 index 0000000..d8399af --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/services/index.ts @@ -0,0 +1,11 @@ +import { AppService } from './app.service'; +import { AppAuthenticationService } from './authentication.service'; +import { AppLoaderService } from './loader.service'; +import { AppNotificationService } from './notification.service'; + +export const SERVICES = [ + AppService, + AppAuthenticationService, + AppLoaderService, + AppNotificationService +]; diff --git a/projects/ucap-webmessenger-app/src/app/services/loader.service.ts b/projects/ucap-webmessenger-app/src/app/services/loader.service.ts new file mode 100644 index 0000000..58399d2 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/services/loader.service.ts @@ -0,0 +1,18 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root' +}) +export class AppLoaderService { + showLoader = false; + + constructor() {} + + show() { + this.showLoader = true; + } + + hide() { + this.showLoader = false; + } +} diff --git a/projects/ucap-webmessenger-app/src/app/services/notification.service.ts b/projects/ucap-webmessenger-app/src/app/services/notification.service.ts new file mode 100644 index 0000000..a3a3cb3 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/services/notification.service.ts @@ -0,0 +1,454 @@ +import { delGroupSuccess, buddy2 } from './../store/messenger/sync/actions'; +import { Injectable, Inject } from '@angular/core'; + +import { tap, withLatestFrom } from 'rxjs/operators'; + +import { Store, select } from '@ngrx/store'; + +import { + SSVC_TYPE_LOGOUT_RES, + SSVC_TYPE_LOGOUT_REMOTE_NOTI, + AuthenticationProtocolService, + LogoutResponse, + LogoutRemoteNotification +} from '@ucap-webmessenger/protocol-authentication'; + +import { NGXLogger } from 'ngx-logger'; +import { + EventProtocolService, + SSVC_TYPE_EVENT_SEND_NOTI, + SendNotification, + SSVC_TYPE_EVENT_READ_NOTI, + SSVC_TYPE_EVENT_CANCEL_NOTI, + SSVC_TYPE_EVENT_DEL_RES, + SSVC_TYPE_EVENT_SEND_RES, + SSVC_TYPE_EVENT_READ_RES +} from '@ucap-webmessenger/protocol-event'; +import { + InfoProtocolService, + SSVC_TYPE_INFO_USER_NOTI, + UserNotification +} from '@ucap-webmessenger/protocol-info'; +import { + RoomProtocolService, + SSVC_TYPE_ROOM_INVITE_NOTI, + SSVC_TYPE_ROOM_EXIT_NOTI, + SSVC_TYPE_ROOM_EXIT_FORCING_NOTI, + SSVC_TYPE_ROOM_FONT_UPD_NOTI, + InviteNotification, + UpdateNotification as RoomUpdateNotification, + SSVC_TYPE_ROOM_UPD_RES +} from '@ucap-webmessenger/protocol-room'; +import { + StatusProtocolService, + SSVC_TYPE_STATUS_NOTI, + StatusNotification +} from '@ucap-webmessenger/protocol-status'; +import { + ReadNotification, + CancelNotification, + DelNotification +} from '@ucap-webmessenger/protocol-event'; +import { + ExitNotification, + ExitForcingNotification, + UpdateFontNotification +} from '@ucap-webmessenger/protocol-room'; +import { + GroupProtocolService, + SSVC_TYPE_GROUP_UPD_RES2, + UpdateNotification as GroupUpdateNotification, + SSVC_TYPE_GROUP_ADD_RES, + AddNotification as GroupAddNotification, + SSVC_TYPE_GROUP_DEL_RES, + DelNotification as GroupDelNotification +} from '@ucap-webmessenger/protocol-group'; +import { + BuddyProtocolService, + SSVC_TYPE_BUDDY_UPD_RES, + UpdateNotification as BuddyUpdateNotification, + SSVC_TYPE_BUDDY_ADD_RES, + AddNotification as BuddyAddNotification, + SSVC_TYPE_BUDDY_DEL_RES, + DelNotification as BuddyDelNotification +} from '@ucap-webmessenger/protocol-buddy'; + +import * as AuthenticationStore from '@app/store/account/authentication'; +import * as InfoStore from '@app/store/account/info'; +import * as EventStore from '@app/store/messenger/event'; +import * as SyncStore from '@app/store/messenger/sync'; +import * as RoomStore from '@app/store/messenger/room'; +import * as StatusStore from '@app/store/messenger/status'; +import { + NotificationRequest, + NativeService, + UCAP_NATIVE_SERVICE +} from '@ucap-webmessenger/native'; +import { StringUtil } from '@ucap-webmessenger/ui'; + +@Injectable() +export class AppNotificationService { + constructor( + private authenticationProtocolService: AuthenticationProtocolService, + private eventProtocolService: EventProtocolService, + private infoProtocolService: InfoProtocolService, + private roomProtocolService: RoomProtocolService, + private groupProtocolService: GroupProtocolService, + private buddyProtocolService: BuddyProtocolService, + private statusProtocolService: StatusProtocolService, + @Inject(UCAP_NATIVE_SERVICE) private nativeService: NativeService, + private store: Store, + private logger: NGXLogger + ) {} + + public subscribe(): void { + this.authenticationProtocolService.logoutNotification$ + .pipe( + tap(notiOrRes => { + switch (notiOrRes.SSVC_TYPE) { + case SSVC_TYPE_LOGOUT_RES: + { + const res = notiOrRes as LogoutResponse; + this.logger.debug( + 'Notification::authenticationProtocolService::LogoutResponse', + res + ); + } + break; + case SSVC_TYPE_LOGOUT_REMOTE_NOTI: + { + const noti = notiOrRes as LogoutRemoteNotification; + this.logger.debug( + 'Notification::authenticationProtocolService::LogoutRemoteNotification', + noti + ); + } + break; + default: + break; + } + this.store.dispatch(AuthenticationStore.logout()); + }) + ) + .subscribe(); + + this.eventProtocolService.notification$ + .pipe( + tap(notiOrRes => { + switch (notiOrRes.SSVC_TYPE) { + case SSVC_TYPE_EVENT_SEND_RES: + case SSVC_TYPE_EVENT_SEND_NOTI: + { + const noti = notiOrRes as SendNotification; + this.logger.debug( + 'Notification::eventProtocolService::SendNotification', + noti + ); + + this.store.dispatch( + EventStore.sendNotification({ + noti + }) + ); + + // notification.. + if (notiOrRes.SSVC_TYPE === SSVC_TYPE_EVENT_SEND_NOTI) { + const notiReq: NotificationRequest = { + roomSeq: noti.roomSeq, + title: '메세지가 도착했습니다.', + contents: StringUtil.convertFinalEventMessage( + noti.eventType, + noti.message + ), + image: '', + useSound: true, + interval: 0 + }; + this.nativeService.notify(notiReq); + } + } + break; + case SSVC_TYPE_EVENT_READ_RES: + case SSVC_TYPE_EVENT_READ_NOTI: + { + // 대화방 unread count 처리. + const noti = notiOrRes as ReadNotification; + this.logger.debug( + 'Notification::eventProtocolService::ReadNotification', + noti + ); + this.store.dispatch(EventStore.readNotification(noti)); + } + break; + case SSVC_TYPE_EVENT_CANCEL_NOTI: + { + const noti = notiOrRes as CancelNotification; + this.logger.debug( + 'Notification::eventProtocolService::CancelNotification', + noti + ); + this.store.dispatch( + EventStore.cancelNotification({ + noti + }) + ); + } + break; + case SSVC_TYPE_EVENT_DEL_RES: + { + const noti = notiOrRes as DelNotification; + this.logger.debug( + 'Notification::eventProtocolService::DelNotification', + noti + ); + this.store.dispatch( + EventStore.delNotification({ + noti + }) + ); + } + break; + default: + break; + } + }) + ) + .subscribe(); + this.infoProtocolService.notification$ + .pipe( + tap(notiOrRes => { + switch (notiOrRes.SSVC_TYPE) { + case SSVC_TYPE_INFO_USER_NOTI: + { + const noti = notiOrRes as UserNotification; + this.logger.debug( + 'Notification::infoProtocolService::UserNotification', + noti + ); + this.store.dispatch( + InfoStore.userNotification({ + noti + }) + ); + } + break; + default: + break; + } + }) + ) + .subscribe(); + this.groupProtocolService.notification$ + .pipe( + withLatestFrom( + this.store.pipe( + select( + (state: any) => state.messenger.sync.group2.syncDate as string + ) + ) + ), + tap(([notiOrRes, syncDate]) => { + switch (notiOrRes.SSVC_TYPE) { + case SSVC_TYPE_GROUP_UPD_RES2: + { + const noti = notiOrRes as GroupUpdateNotification; + this.logger.debug( + 'Notification::groupProtocolService::GroupUpdateNotification', + noti + ); + this.store.dispatch( + SyncStore.group2({ + syncDate + }) + ); + } + break; + case SSVC_TYPE_GROUP_ADD_RES: + { + const noti = notiOrRes as GroupAddNotification; + this.logger.debug( + 'Notification::groupProtocolService::GroupAddNotification', + noti + ); + this.store.dispatch(SyncStore.createGroupSuccess(noti)); + } + break; + case SSVC_TYPE_GROUP_DEL_RES: + { + const noti = notiOrRes as GroupDelNotification; + this.logger.debug( + 'Notification::groupProtocolService::GroupDelNotification', + noti + ); + this.store.dispatch(SyncStore.delGroupSuccess(noti)); + } + break; + + default: + break; + } + }) + ) + .subscribe(); + this.buddyProtocolService.notification$ + .pipe( + withLatestFrom( + this.store.pipe( + select( + (state: any) => state.messenger.sync.buddy2.syncDate as string + ) + ) + ), + tap(([notiOrRes, syncDate]) => { + switch (notiOrRes.SSVC_TYPE) { + case SSVC_TYPE_BUDDY_UPD_RES: + { + const noti = notiOrRes as BuddyUpdateNotification; + this.logger.debug( + 'Notification::groupProtocolService::BuddyUpdateNotification', + noti + ); + this.store.dispatch(SyncStore.updateBuddySuccess(noti)); + } + break; + case SSVC_TYPE_BUDDY_ADD_RES: + { + const noti = notiOrRes as BuddyAddNotification; + this.logger.debug( + 'Notification::groupProtocolService::BuddyAddNotification', + noti + ); + this.store.dispatch(SyncStore.buddy2({ syncDate })); + } + break; + case SSVC_TYPE_BUDDY_DEL_RES: + { + const noti = notiOrRes as BuddyDelNotification; + this.logger.debug( + 'Notification::groupProtocolService::BuddyDelNotification', + noti + ); + this.store.dispatch(SyncStore.delBuddySuccess(noti)); + } + break; + + default: + break; + } + }) + ) + .subscribe(); + this.roomProtocolService.notification$ + .pipe( + tap(notiOrRes => { + switch (notiOrRes.SSVC_TYPE) { + case SSVC_TYPE_ROOM_UPD_RES: + { + const noti = notiOrRes as RoomUpdateNotification; + this.logger.debug( + 'Notification::roomProtocolService::RoomUpdateNotification', + noti + ); + this.store.dispatch( + RoomStore.updateSuccess({ + res: { + roomSeq: noti.roomSeq, + roomName: + noti.roomName.trim().length === 0 + ? ' ' + : noti.roomName.trim(), + receiveAlarm: noti.receiveAlarm, + syncAll: false + } + }) + ); + } + break; + case SSVC_TYPE_ROOM_INVITE_NOTI: + { + const noti = notiOrRes as InviteNotification; + this.logger.debug( + 'Notification::roomProtocolService::InviteNotification', + noti + ); + this.store.dispatch( + RoomStore.inviteNotification({ + noti + }) + ); + } + break; + case SSVC_TYPE_ROOM_EXIT_NOTI: + { + const noti = notiOrRes as ExitNotification; + this.logger.debug( + 'Notification::roomProtocolService::ExitNotification', + noti + ); + this.store.dispatch( + RoomStore.exitNotification({ + noti + }) + ); + } + break; + case SSVC_TYPE_ROOM_EXIT_FORCING_NOTI: + { + const noti = notiOrRes as ExitForcingNotification; + this.logger.debug( + 'Notification::roomProtocolService::ExitForcingNotification', + noti + ); + this.store.dispatch( + RoomStore.exitForcingNotification({ + noti + }) + ); + } + break; + case SSVC_TYPE_ROOM_FONT_UPD_NOTI: + { + const noti = notiOrRes as UpdateFontNotification; + this.logger.debug( + 'Notification::roomProtocolService::UpdateFontNotification', + noti + ); + this.store.dispatch( + RoomStore.updateFontNotification({ + noti + }) + ); + } + break; + default: + break; + } + }) + ) + .subscribe(); + this.statusProtocolService.notification$ + .pipe( + tap(notiOrRes => { + switch (notiOrRes.SSVC_TYPE) { + case SSVC_TYPE_STATUS_NOTI: + { + const noti = notiOrRes as StatusNotification; + this.logger.debug( + 'Notification::statusProtocolService::StatusNotification', + noti + ); + this.store.dispatch( + StatusStore.statusNotification({ + noti + }) + ); + } + break; + default: + break; + } + }) + ) + .subscribe(); + } +} diff --git a/projects/ucap-webmessenger-app/src/app/store/account/authentication/actions.ts b/projects/ucap-webmessenger-app/src/app/store/account/authentication/actions.ts new file mode 100644 index 0000000..45f9034 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/store/account/authentication/actions.ts @@ -0,0 +1,102 @@ +import { createAction, props } from '@ngrx/store'; + +import { Login2Response } from '@ucap-webmessenger/pi'; +import { LoginResponse } from '@ucap-webmessenger/protocol-authentication'; + +import { LoginInfo } from '@app/types'; +import { + UserPasswordSetRequest, + UserPasswordSetResponse +} from '@ucap-webmessenger/protocol-service'; + +export const webLogin = createAction( + '[Account::Authentication] Web Login', + props<{ + loginInfo: LoginInfo; + rememberMe: boolean; + }>() +); + +export const webLoginSuccess = createAction( + '[Account::Authentication] Web Login Success', + props<{ + loginInfo: LoginInfo; + rememberMe: boolean; + login2Response: Login2Response; + }>() +); + +export const webLoginFailure = createAction( + '[Account::Authentication] Web Login Failure', + props<{ error: any }>() +); + +export const loginSuccess = createAction( + '[Account::Authentication] Login Success', + props<{ + loginRes: LoginResponse; + }>() +); + +export const loginFailure = createAction( + '[Account::Authentication] Login Failure', + props<{ error: any }>() +); + +export const loginRedirect = createAction( + '[Account::Authentication] Login Redirect' +); + +export const logout = createAction('[Account::Authentication] Logout'); + +export const logoutConfirmation = createAction( + '[Account::Authentication] Logout Confirmation' +); + +export const logoutConfirmationDismiss = createAction( + '[Account::Authentication] Logout Confirmation Dismiss' +); + +export const postLogin = createAction( + '[Account::Authentication] Post Login', + props<{ + loginRes: LoginResponse; + }>() +); + +export const privacyAgree = createAction( + '[Account::Authentication] Privacy Agree', + props<{ + loginRes: LoginResponse; + }>() +); + +export const privacyAgreeSuccess = createAction( + '[Account::Authentication] Privacy Agree Success' +); + +export const privacyAgreeFailure = createAction( + '[Account::Authentication] Privacy Agree Failure', + props<{ error: any }>() +); + +export const privacyDisagree = createAction( + '[Account::Authentication] Privacy Disagree' +); + +export const changePassword = createAction( + '[Account::Authentication] Change Password', + props<{ req: UserPasswordSetRequest }>() +); + +export const changePasswordSuccess = createAction( + '[Account::Authentication] Change Password Success', + props<{ + res: UserPasswordSetResponse; + }>() +); + +export const changePasswordFailure = createAction( + '[Account::Authentication] Change Password Failure', + props<{ error: any }>() +); diff --git a/projects/ucap-webmessenger-app/src/app/store/account/authentication/effects.ts b/projects/ucap-webmessenger-app/src/app/store/account/authentication/effects.ts new file mode 100644 index 0000000..b245c1d --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/store/account/authentication/effects.ts @@ -0,0 +1,288 @@ +import { Injectable, Inject } from '@angular/core'; +import { Router } from '@angular/router'; + +import { of } from 'rxjs'; +import { catchError, exhaustMap, map, tap, switchMap } from 'rxjs/operators'; + +import { Actions, ofType, createEffect } from '@ngrx/effects'; + +import { + PiService, + Login2Response, + UserTermsActionResponse +} from '@ucap-webmessenger/pi'; +import { NativeService, UCAP_NATIVE_SERVICE } from '@ucap-webmessenger/native'; +import { + DialogService, + ConfirmDialogComponent, + ConfirmDialogData, + ConfirmDialogResult +} from '@ucap-webmessenger/ui'; + +import { + loginRedirect, + logout, + logoutConfirmation, + logoutConfirmationDismiss, + webLogin, + webLoginSuccess, + webLoginFailure, + postLogin, + privacyAgree, + privacyDisagree, + privacyAgreeFailure, + privacyAgreeSuccess, + changePassword, + changePasswordFailure, + changePasswordSuccess +} from './actions'; +import { + LoginInfo, + KEY_LOGIN_INFO, + EnvironmentsInfo, + KEY_ENVIRONMENTS_INFO +} from '@app/types'; +import { AppAuthenticationService } from '@app/services/authentication.service'; +import { NGXLogger } from 'ngx-logger'; +import { Store } from '@ngrx/store'; +import { SessionStorageService } from '@ucap-webmessenger/web-storage'; +import { + ServiceProtocolService, + UserPasswordSetResponse +} from '@ucap-webmessenger/protocol-service'; + +@Injectable() +export class Effects { + webLogin$ = createEffect(() => + this.actions$.pipe( + ofType(webLogin), + map(action => action), + exhaustMap((params: { loginInfo: LoginInfo; rememberMe: boolean }) => + this.piService + .login2({ + loginId: params.loginInfo.loginId, + loginPw: params.loginInfo.loginPw, + companyCode: params.loginInfo.companyCode + }) + .pipe( + map((res: Login2Response) => { + if ('success' !== res.status.toLowerCase()) { + return webLoginFailure({ error: 'Failed' }); + } else { + return webLoginSuccess({ + loginInfo: params.loginInfo, + rememberMe: params.rememberMe, + login2Response: res + }); + } + }), + catchError(error => of(webLoginFailure({ error }))) + ) + ) + ) + ); + + webLoginSuccess$ = createEffect( + () => + this.actions$.pipe( + ofType(webLoginSuccess), + switchMap(params => + this.nativeService.checkForUpdates().pipe( + map((update: boolean) => { + if (!update) { + this.appAuthenticationService.login( + params.loginInfo, + params.rememberMe + ); + this.router.navigate(['/messenger']); + } + }), + catchError(error => of(error)) + ) + ) + ), + { dispatch: false } + ); + + loginRedirect$ = createEffect( + () => + this.actions$.pipe( + ofType(loginRedirect), + tap(authed => { + this.router.navigate(['/account/login']); + }) + ), + { dispatch: false } + ); + + logout$ = createEffect(() => + this.actions$.pipe( + ofType(logout), + map(action => action), + map(() => { + this.appAuthenticationService.logout(); + return loginRedirect(); + }) + ) + ); + + logoutConfirmation$ = createEffect(() => + this.actions$.pipe( + ofType(logoutConfirmation), + exhaustMap(async () => { + const result = await this.dialogService.open< + ConfirmDialogComponent, + ConfirmDialogData, + ConfirmDialogResult + >(ConfirmDialogComponent, { + width: '220px', + data: { + title: 'Logout', + message: 'Logout ?' + } + }); + + return result.choice; + }), + map(result => (result ? logout() : logoutConfirmationDismiss())) + ) + ); + + postLogin$ = createEffect( + () => + this.actions$.pipe( + ofType(postLogin), + map(action => action.loginRes), + tap(async loginRes => { + const loginInfo = this.sessionStorageService.get( + KEY_LOGIN_INFO + ); + const environmentsInfo = this.sessionStorageService.get< + EnvironmentsInfo + >(KEY_ENVIRONMENTS_INFO); + + if (!loginRes.privateInformationAgree) { + const privacyTotalUrl = this.piService.privacyTotalUrl({ + companyCode: loginInfo.companyCode, + userSeq: loginRes.userSeq, + token: loginRes.tokenString, + deviceType: environmentsInfo.deviceType, + localeCode: loginInfo.localeCode, + textOnly: 'true' + }); + + const result = await this.dialogService.open< + ConfirmDialogComponent, + ConfirmDialogData, + ConfirmDialogResult + >(ConfirmDialogComponent, { + width: '100%', + height: '500px', + disableClose: true, + data: { + title: '개인정보 동의' + // html: `